diff options
Diffstat (limited to 'engines/tsage')
88 files changed, 42489 insertions, 5707 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 new file mode 100644 index 0000000000..130cf557b2 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_logic.cpp @@ -0,0 +1,1548 @@ +/* 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_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" +#include "tsage/staticres.h" + +namespace TsAGE { + +namespace BlueForce { + +void BlueForceGame::start() { + // Start the game + g_globals->_sceneManager.changeScene(20); +} + +Scene *BlueForceGame::createScene(int sceneNumber) { + switch (sceneNumber) { + /* Scene Group #0 */ + case 20: + // Tsunami Title Screen + return new Scene20(); + case 50: + // Map screen + return new Scene50(); + case 60: + // Motorcycle + return new Scene60(); + /* Scene Group #1 */ + case 100: + // Tsnunami Title Screen #2 + return new Scene100(); + case 109: + // Introduction - Bar Room + return new Scene109(); + case 110: + // Introduction - Outside the bar + return new Scene110(); + case 114: + // Outside Tony's Bar + return new Scene114(); + case 115: + // Inside Tony's Bar + return new Scene115(); + case 125: + // Intro - Chase in the city + return new Scene125(); + case 140: + // Intro - Burglar near the House + return new Scene140(); + case 150: + // Intro - Burglar inside the house + return new Scene150(); + case 160: + // Intro - Burial + return new Scene160(); + case 180: + // Front of Home + return new Scene180(); + 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: + // Intro - Graduation Article + return new Scene265(); + case 270: + // Living Room & Kitchen + return new Scene270(); + case 271: + // Living Room & Kitchen #2 + return new Scene271(); + case 280: + // Bedroom Flashback cut-scene + return new Scene280(); + 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: + // 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: + // 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: + // 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: + // Decking + return new Scene690(); + case 710: + // Beach + return new Scene710(); + case 800: + // Jamison & Ryan + return new Scene800(); + case 810: + // Lyle's Office + return new Scene810(); + case 820: + // Microfiche Reader + return new Scene820(); + case 830: + // Outside Boat Rentals + return new Scene830(); + case 840: + // Boat Rentals + return new Scene840(); + case 850: + // Boat Leaving/Entering Marina + return new Scene850(); + case 860: + // Boat Entering Cove + return new Scene860(); + case 870: + // Cove Beach + return new Scene870(); + case 880: + // Beach Path + return new Scene880(); + case 900: + // Outside the Warehouse + return new Scene900(); + case 910: + // Inside the Warehouse + return new Scene910(); + case 920: + // Inside the 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: + // Jail ending animation + return new Scene940(); + default: + error("Unknown scene number - %d", sceneNumber); + break; + } +} + +/** + * Returns true if it is currently okay to restore a game + */ +bool BlueForceGame::canLoadGameStateCurrently() { + return true; +} + +/** + * Returns true if it is currently okay to save the game + */ +bool BlueForceGame::canSaveGameStateCurrently() { + return true; +} + +void BlueForceGame::rightClick() { + RightClickDialog *dlg = new RightClickDialog(); + dlg->execute(); + 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() { + _inUse = false; + clear(); +} + +void AObjectArray::clear() { + for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) + _objList[i] = NULL; +} + +void AObjectArray::synchronize(Serializer &s) { + EventHandler::synchronize(s); + for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) + SYNC_POINTER(_objList[i]); +} + +void AObjectArray::process(Event &event) { + if (_inUse) + error("Array error"); + _inUse = true; + + for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) { + if (_objList[i]) + _objList[i]->process(event); + } + + _inUse = false; +} + +void AObjectArray::dispatch() { + if (_inUse) + error("Array error"); + _inUse = true; + + for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) { + if (_objList[i]) + _objList[i]->dispatch(); + } + + _inUse = false; +} + +int AObjectArray::getNewIndex() { + for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) { + if (!_objList[i]) + return i; + } + error("AObjectArray too full."); +} + +void AObjectArray::add(EventHandler *obj) { + int idx = getNewIndex(); + _objList[idx] = obj; +} + +void AObjectArray::remove(EventHandler *obj) { + for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) { + if (_objList[i] == obj) { + _objList[i] = NULL; + return; + } + } +} + +/*--------------------------------------------------------------------------*/ + +Timer::Timer() { + _endFrame = 0; + _endHandler = NULL; + _tickAction = NULL; +} + +void Timer::remove() { + _endFrame = 0; + _endHandler = NULL; + + ((Scene100 *)BF_GLOBALS._sceneManager._scene)->removeTimer(this); +} + +void Timer::synchronize(Serializer &s) { + EventHandler::synchronize(s); + SYNC_POINTER(_tickAction); + SYNC_POINTER(_endHandler); + s.syncAsUint32LE(_endFrame); +} + +void Timer::signal() { + assert(_endHandler); + EventHandler *item = _endHandler; + remove(); + item->signal(); +} + +void Timer::dispatch() { + if (_tickAction) + _tickAction->dispatch(); + + if (_endFrame) { + uint32 frameNumber = BF_GLOBALS._events.getFrameNumber(); + if (frameNumber > _endFrame) + // Timer has expired + signal(); + } +} + +void Timer::set(uint32 delay, EventHandler *endHandler) { + assert(delay != 0); + + _endFrame = BF_GLOBALS._sceneHandler->getFrameDifference() + delay; + _endHandler = endHandler; + + ((SceneExt *)BF_GLOBALS._sceneManager._scene)->addTimer(this); +} + +/*--------------------------------------------------------------------------*/ + +TimerExt::TimerExt(): Timer() { + _action = NULL; +} + +void TimerExt::set(uint32 delay, EventHandler *endHandler, Action *newAction) { + _newAction = newAction; + Timer::set(delay, endHandler); +} + +void TimerExt::synchronize(Serializer &s) { + EventHandler::synchronize(s); + SYNC_POINTER(_action); +} + +void TimerExt::remove() { + _action = NULL; + Timer::remove(); +} + +void TimerExt::signal() { + 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(endHandler); + if (!endHandler->_action) + endHandler->setAction(newAction); +} + +/*--------------------------------------------------------------------------*/ + +void SceneItemType2::startMove(SceneObject *sceneObj, va_list va) { +} + +/*--------------------------------------------------------------------------*/ + +void NamedObject::postInit(SceneObjectList *OwnerList) { + _lookLineNum = _talkLineNum = _useLineNum = -1; + SceneObject::postInit(); +} + +void NamedObject::synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsSint16LE(_resNum); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_talkLineNum); + s.syncAsSint16LE(_useLineNum); +} + +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; + _useLineNum = useLineNum; + + switch (mode) { + case 2: + g_globals->_sceneItems.push_front(this); + break; + case 4: + g_globals->_sceneItems.addBefore(item, this); + break; + case 5: + g_globals->_sceneItems.addAfter(item, this); + break; + default: + g_globals->_sceneItems.push_back(this); + break; + } +} + +void NamedObject::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) { + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; +} + +/*--------------------------------------------------------------------------*/ + +CountdownObject::CountdownObject(): NamedObject() { + _countDown = 0; +} + +void CountdownObject::synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsSint16LE(_countDown); +} + +void CountdownObject::dispatch() { + int frameNum = _frame; + SceneObject::dispatch(); + + if ((frameNum != _frame) && (_countDown > 0)) { + if (--_countDown == 0) { + animate(ANIM_MODE_NONE, 0); + _frame = 1; + } + } +} + +void CountdownObject::fixCountdown(int mode, ...) { + if (mode == 8) { + va_list va; + va_start(va, mode); + + _countDown = va_arg(va, int); + animate(ANIM_MODE_8, _countDown, NULL); + va_end(va); + } +} + +/*--------------------------------------------------------------------------*/ + +FollowerObject::FollowerObject(): NamedObject() { + _object = NULL; +} + +void FollowerObject::synchronize(Serializer &s) { + NamedObject::synchronize(s); + SYNC_POINTER(_object); +} + +void FollowerObject::remove() { + NamedObject::remove(); + _object = NULL; +} + +void FollowerObject::dispatch() { + SceneObject::dispatch(); + assert(_object); + + if ((_object->_flags & OBJFLAG_HIDE) || ((_object->_visage != 307) && + ((_object->_visage != 308) || (_object->_strip != 1)))) { + hide(); + } else if ((_object->_visage != 308) || (_object->_strip != 1)) { + show(); + setStrip(_object->_strip); + setPosition(_object->_position, _object->_yDiff); + } +} + +void FollowerObject::reposition() { + assert(_object); + setStrip(_object->_strip); + setPosition(_object->_position, _object->_yDiff); + NamedObject::reposition(); +} + +void FollowerObject::setup(SceneObject *object, int visage, int frameNum, int yDiff) { + SceneObject::postInit(); + _object = object; + _yDiff = yDiff; + setVisage(visage); + setFrame(frameNum); + + dispatch(); +} + +/*--------------------------------------------------------------------------*/ + +FocusObject::FocusObject(): NamedObject() { + _img = surfaceFromRes(1, 5, 7); +} + +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._dayNumber) { + // Blank out the bottom portion of the screen + BF_GLOBALS._interfaceY = UI_INTERFACE_Y; + + Rect r(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT); + BF_GLOBALS.gfxManager().getSurface().fillRect(r, 0); + } +} + +void SceneExt::remove() { + T2_GLOBALS._uiElements.hide(); + T2_GLOBALS._uiElements.resetClear(); + + // Below code originally in Blue Force Scene::remove(). Placed here to avoid contaminating + // core class with Blue Force specific code + if (_action) { + if (_action->_endHandler) + _action->_endHandler = NULL; + _action->remove(); + } + + _focusObject = NULL; +} + +void SceneExt::process(Event &event) { + _objArray2.process(event); + if (!event.handled) + Scene::process(event); +} + +void SceneExt::dispatch() { + _timerList.dispatch(); + + if (_field37A) { + if ((--_field37A == 0) && BF_GLOBALS._dayNumber) { + if (T2_GLOBALS._uiElements._active && BF_GLOBALS._player._enabled) { + T2_GLOBALS._uiElements.show(); + } + + _field37A = 0; + } + } + + Scene::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 && T2_GLOBALS._uiElements._active) + T2_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 && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.show(); + } +} + +void SceneExt::clearScreen() { + BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0); +} + +/*--------------------------------------------------------------------------*/ + +PalettedScene::PalettedScene(): SceneExt() { + _field794 = 0; +} + +void PalettedScene::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field794); +} + +void PalettedScene::postInit(SceneObjectList *OwnerList) { + _field794 = 0; + _palette._field412 = 1; + SceneExt::postInit(OwnerList); +} + +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._sceneManager._hasPalette = true; + } + + BF_GLOBALS._scenePalette._field412 = 0; +} + +PaletteFader *PalettedScene::addFader(const byte *arrBufferRGB, int step, Action *action) { + _field794 = 1; + return BF_GLOBALS._scenePalette.addFader(arrBufferRGB, 1, step, action); +} + +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::transition(const byte *arrBufferRGB, int percent, int paletteNum, Action *action, int fromColor1, int fromColor2, int toColor1, int toColor2, bool flag) { + byte tmpPalette[768]; + + _palette.loadPalette(paletteNum); + _palette.loadPalette(2); + if (flag) { + 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]; + } + } + + for (int i = toColor1; i <= toColor2; i++) { + tmpPalette[i * 3] = _palette._palette[i * 3] - ((_palette._palette[i * 3] - arrBufferRGB[i * 3]) * (100 - percent)) / 100; + tmpPalette[i * 3 + 1] = _palette._palette[i * 3 + 1] - ((_palette._palette[i * 3 + 1] - arrBufferRGB[i * 3 + 1]) * (100 - percent)) / 100; + tmpPalette[i * 3 + 2] = _palette._palette[i * 3 + 2] - ((_palette._palette[i * 3 + 2] - arrBufferRGB[i * 3 + 2]) * (100 - percent)) / 100; + } + + BF_GLOBALS._scenePalette.addFader((const byte *)tmpPalette, 256, 100, action); +} + + +/*--------------------------------------------------------------------------*/ + +void SceneHandlerExt::postInit(SceneObjectList *OwnerList) { + SceneHandler::postInit(OwnerList); + + // Load the low end palette data + BF_GLOBALS._scenePalette.loadPalette(2); + BF_GLOBALS._scenePalette.refresh(); +} + +void SceneHandlerExt::process(Event &event) { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + if (scene && scene->_focusObject) + scene->_focusObject->process(event); + + if (T2_GLOBALS._uiElements._active) { + T2_GLOBALS._uiElements.process(event); + if (event.handled) + return; + } + + // 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; + } + + // If the user clicks the button whislt the introduction is active, prompt for playing the game + if ((BF_GLOBALS._dayNumber == 0) && (event.eventType == EVENT_BUTTON_DOWN)) { + // Prompt user for whether to start play or watch introduction + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._events.setCursor(CURSOR_WALK); + + if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { + // Start the game + BF_GLOBALS._dayNumber = 1; + BF_GLOBALS._sceneManager.changeScene(190); + } else { + BF_GLOBALS._player.disableControl(); + } + + event.handled = true; + } + + SceneHandler::process(event); +} + +void SceneHandlerExt::playerAction(Event &event) { + if (BF_GLOBALS._events.getCursor() == INV_DOG_WHISTLE) { + SceneItem::display2(1, 6); + event.handled = true; + } +} + +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(): + _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(&_none); + _itemList.push_back(&_colt45); + _itemList.push_back(&_ammoClip); + _itemList.push_back(&_spareClip); + _itemList.push_back(&_handcuffs); + _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(&_cobbRap); + _itemList.push_back(&_bullet22); + _itemList.push_back(&_autoRifle); + _itemList.push_back(&_wig); + _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(&_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(&_bug2); + _itemList.push_back(&_rentalCoupon); + _itemList.push_back(&_nickel); + _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(&_dmvPrintout); + _itemList.push_back(&_fishingNet); + _itemList.push_back(&_id); + _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); + + // Set up the select item handler method + T2_GLOBALS._onSelectItem = SelectItem; +} + +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 + T2_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; + } +} + +/** + * When an inventory item is selected, check if it's the gun belt, since that has a specific dialog + */ +bool BlueForceInvObjectList::SelectItem(int objectNumber) { + if (objectNumber == INV_AMMO_BELT) { + AmmoBeltDialog *dlg = new AmmoBeltDialog(); + dlg->execute(); + delete dlg; + + return true; + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +NamedHotspot::NamedHotspot() : SceneHotspot() { + _resNum = 0; + _lookLineNum = _useLineNum = _talkLineNum = -1; +} + +bool NamedHotspot::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_WALK: + // Nothing + return false; + case CURSOR_LOOK: + if (_lookLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _lookLineNum); + return true; + case CURSOR_USE: + if (_useLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _useLineNum); + return true; + case CURSOR_TALK: + if (_talkLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _talkLineNum); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) { + setBounds(ys, xe, ye, xs); + _resNum = resnum; + _lookLineNum = lookLineNum; + _useLineNum = useLineNum; + _talkLineNum = -1; + g_globals->_sceneItems.addItems(this, NULL); +} + +void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { + setBounds(bounds); + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + switch (mode) { + case 2: + g_globals->_sceneItems.push_front(this); + break; + case 4: + g_globals->_sceneItems.addBefore(item, this); + break; + case 5: + g_globals->_sceneItems.addAfter(item, this); + break; + default: + g_globals->_sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) { + _sceneRegionId = sceneRegionId; + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + // Handle adding hotspot to scene items list as necessary + switch (mode) { + case 2: + GLOBALS._sceneItems.push_front(this); + break; + case 3: + break; + default: + GLOBALS._sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::synchronize(Serializer &s) { + SceneHotspot::synchronize(s); + s.syncAsSint16LE(_resNum); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_useLineNum); + + if (g_vm->getGameID() == GType_BlueForce) + s.syncAsSint16LE(_talkLineNum); +} + +/*--------------------------------------------------------------------------*/ + +void SceneMessage::remove() { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + if (scene->_focusObject == this) + scene->_focusObject = NULL; + + Action::remove(); +} + +void SceneMessage::signal() { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_focusObject = this; + BF_GLOBALS._events.setCursor(CURSOR_WALK); + draw(); + setDelay(180); + break; + case 1: + clear(); + remove(); + break; + default: + break; + } +} + +void SceneMessage::process(Event &event) { + if ((event.eventType == EVENT_BUTTON_DOWN) || + ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_RETURN))) { + signal(); + } +} + + +void SceneMessage::draw() { + GfxSurface &surface = BF_GLOBALS._screenSurface; + + // Clear the game area + surface.fillRect(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 0); + + // Disable scene fade in + BF_GLOBALS._paneRefreshFlag[0] = 0; + + // Set up the font + GfxFont &font = BF_GLOBALS._gfxManagerInstance._font; + BF_GLOBALS._scenePalette.setEntry(font._colors.foreground, 255, 255, 255); + BF_GLOBALS._scenePalette.setPalette(font._colors.foreground, 1); + + // Write out the message + Rect textRect(0, UI_INTERFACE_Y / 2 - (font.getHeight() / 2), SCREEN_WIDTH, + UI_INTERFACE_Y / 2 + (font.getHeight() / 2)); + BF_GLOBALS._gfxManagerInstance._font.writeLines(_message.c_str(), textRect, ALIGN_CENTER); + + // TODO: Ideally, saving and loading should be disabled here until the message display is complete +} + +void SceneMessage::clear() { + // Fade out the text display + static const uint32 black = 0; + BF_GLOBALS._scenePalette.fade((const byte *)&black, false, 100); + + // Refresh the background + BF_GLOBALS._paneRefreshFlag[0] = 0; + + // Set up to fade in the game scene + g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + g_globals->_sceneManager._hasPalette = true; +} + +IntroSceneText::IntroSceneText(): SceneText() { + _action = NULL; + _frameNumber = 0; + _diff = 0; +} + +void IntroSceneText::setup(const Common::String &msg, Action *action) { + _frameNumber = BF_GLOBALS._events.getFrameNumber(); + _diff = 180; + _action = action; + _fontNumber = 4; + _width = 300; + _textMode = ALIGN_CENTER; + _color1 = BF_GLOBALS._scenePalette._colors.background; + _color2 = _color3 = 0; + + SceneText::setup(msg); + + // Center the text on-screen + reposition(); + _bounds.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2); + + // Set the new position + _position.x = _bounds.left; + _position.y = _bounds.top; +} + +void IntroSceneText::synchronize(Serializer &s) { + SceneText::synchronize(s); + SYNC_POINTER(_action); + s.syncAsUint32LE(_frameNumber); + s.syncAsSint16LE(_diff); +} + +void IntroSceneText::dispatch() { + if (_diff) { + uint32 frameNumber = BF_GLOBALS._events.getFrameNumber(); + if (_frameNumber < frameNumber) { + _diff -= frameNumber - _frameNumber; + _frameNumber = frameNumber; + + if (_diff <= 0) { + // Time has expired, so remove the text and signal the designated action + remove(); + if (_action) + _action->signal(); + } + } + } +} + +} // End of namespace BlueForce + +} // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h new file mode 100644 index 0000000000..1b161bce06 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_logic.h @@ -0,0 +1,394 @@ +/* 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_LOGIC_H +#define TSAGE_BLUEFORCE_LOGIC_H + +#include "common/scummsys.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" + +namespace TsAGE { + +namespace BlueForce { + +using namespace TsAGE; + +#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); + virtual bool canSaveGameStateCurrently(); + virtual bool canLoadGameStateCurrently(); +}; + +#define OBJ_ARRAY_SIZE 10 +class AObjectArray: public EventHandler { +public: + EventHandler *_objList[OBJ_ARRAY_SIZE]; + bool _inUse; + int getNewIndex(); +public: + AObjectArray(); + void clear(); + + virtual Common::String getClassName() { return "AObjectArray"; } + virtual void synchronize(Serializer &s); + virtual void process(Event &event); + virtual void dispatch(); + + void add(EventHandler *obj); + void remove(EventHandler *obj); +}; + +class Timer: public EventHandler { +public: + Action *_tickAction; + EventHandler *_endHandler; + uint32 _endFrame; +public: + Timer(); + void set(uint32 delay, EventHandler *endHandler); + + virtual Common::String getClassName() { return "Timer"; } + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void signal(); + virtual void dispatch(); +}; + +class TimerExt: public Timer { +public: + Action *_newAction; +public: + TimerExt(); + 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(); +}; + + +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: + virtual void startMove(SceneObject *sceneObj, va_list va); +}; + +class NamedObject: public SceneObject { +public: + int _resNum; + int _lookLineNum, _talkLineNum, _useLineNum; + + 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 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 { +public: + int _countDown; + CountdownObject(); + void fixCountdown(int mode, ...); + + virtual Common::String getClassName() { return "CountdownObject"; } + virtual void synchronize(Serializer &s); + virtual void dispatch(); +}; + +class FollowerObject: public NamedObject { +public: + SceneObject *_object; + FollowerObject(); + + virtual Common::String getClassName() { return "FollowerObject"; } + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void dispatch(); + virtual void reposition(); + + 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 *_focusObject; + Visage _cursorVisage; + + Rect _v51C34; +public: + SceneExt(); + + virtual Common::String getClassName() { return "SceneExt"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void loadScene(int sceneNum); + virtual void checkGun(); + + void addTimer(EventHandler *timer) { _timerList.add(timer); } + void removeTimer(EventHandler *timer) { _timerList.remove(timer); } + bool display(CursorType action); + void fadeOut(); + void gunDisplay(); + void clearScreen(); +}; + +class PalettedScene: public SceneExt { +public: + ScenePalette _palette; + int _field794; +public: + 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 transition(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); + + virtual void playerAction(Event &event); + virtual void processEnd(Event &event); +}; + +class BlueForceInvObjectList : public InvObjectList { +private: + static bool SelectItem(int objectNumber); +public: + InvObject _none; + InvObject _colt45; + InvObject _ammoClip; + InvObject _spareClip; + InvObject _handcuffs; + InvObject _greensGun; + InvObject _ticketBook; + InvObject _mirandaCard; + InvObject _forestRap; + InvObject _greenId; + InvObject _baseballCard; + InvObject _bookingGreen; + InvObject _flare; + InvObject _cobbRap; + InvObject _bullet22; + InvObject _autoRifle; + InvObject _wig; + 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 _dFloppy; + InvObject _blankDisk; + InvObject _stick; + InvObject _crate1; + InvObject _crate2; + InvObject _shoebox; + InvObject _badge; + InvObject _bug2; + InvObject _rentalCoupon; + InvObject _nickel; + InvObject _lyleCard; + InvObject _carterNote; + InvObject _mugshot; + InvObject _clipping; + InvObject _microfilm; + InvObject _waveKeys; + InvObject _rentalKeys; + InvObject _napkin; + InvObject _dmvPrintout; + InvObject _fishingNet; + InvObject _id; + 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"; } +}; + +class NamedHotspot : public SceneHotspot { +public: + int _resNum, _lookLineNum, _useLineNum, _talkLineNum; + NamedHotspot(); + + + virtual bool startAction(CursorType action, Event &event); + virtual Common::String getClassName() { return "NamedHotspot"; } + virtual void synchronize(Serializer &s); + virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum); + virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item); + virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode); +}; + +class NamedHotspotExt : public NamedHotspot { +public: + int _flag; + NamedHotspotExt() { _flag = 0; } + + virtual Common::String getClassName() { return "NamedHotspot"; } + virtual void synchronize(Serializer &s) { + NamedHotspot::synchronize(s); + s.syncAsSint16LE(_flag); + } +}; + +class SceneMessage: public Action { +private: + Common::String _message; + + void draw(); + void clear(); +public: + void setup(const Common::String &msg) { _message = msg; } + + virtual Common::String getClassName() { return "SceneMessage"; } + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); +}; + +class IntroSceneText: public SceneText { +public: + Action *_action; + uint32 _frameNumber; + int _diff; +public: + IntroSceneText(); + void setup(const Common::String &msg, Action *action); + + virtual Common::String getClassName() { return "BFIntroText"; } + virtual void synchronize(Serializer &s); + virtual void dispatch(); +}; + +} // End of namespace BlueForce + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes0.cpp b/engines/tsage/blue_force/blueforce_scenes0.cpp new file mode 100644 index 0000000000..bb283d051e --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes0.cpp @@ -0,0 +1,1136 @@ +/* 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_scenes0.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 20 - Tsunami Title Screen + * + *--------------------------------------------------------------------------*/ + +void Scene20::Action1::signal() { + Scene20 *scene = (Scene20 *)BF_GLOBALS._sceneManager._scene; + static byte black[3] = { 0, 0, 0 }; + + switch (_actionIndex++) { + case 0: + setDelay(2); + break; + case 1: + _sound.play(1); + BF_GLOBALS._scenePalette.addRotation(64, 127, -1, 1, this); + break; + case 2: + scene->_object1.setVisage(22); + scene->_object1._strip = 1; + scene->_object1._frame = 1; + scene->_object1.changeZoom(100); + + scene->_object2.setVisage(22); + scene->_object2._strip = 2; + scene->_object2._frame = 1; + scene->_object2.changeZoom(100); + + scene->_object3.setVisage(22); + scene->_object3._strip = 3; + scene->_object3._frame = 1; + scene->_object3.changeZoom(100); + + scene->_object4.setVisage(22); + scene->_object4._strip = 4; + scene->_object4._frame = 1; + scene->_object4.changeZoom(100); + + scene->_object5.setVisage(22); + scene->_object5._strip = 5; + scene->_object5._frame = 1; + scene->_object5.changeZoom(100); + + scene->_object6.setVisage(22); + scene->_object6._strip = 6; + scene->_object6._frame = 1; + scene->_object6.changeZoom(100); + + scene->_object7.setVisage(22); + scene->_object7._strip = 7; + scene->_object7._frame = 1; + scene->_object7.changeZoom(100); + + scene->_object8.setVisage(22); + scene->_object8._strip = 8; + scene->_object8._frame = 1; + scene->_object8.changeZoom(100); + + setDelay(1); + break; + case 3: + BF_GLOBALS._scenePalette.addFader(scene->_scenePalette._palette, 256, 8, this); + break; + case 4: + setDelay(60); + break; + case 5: + scene->_object2.animate(ANIM_MODE_5, NULL); + scene->_object3.animate(ANIM_MODE_5, NULL); + scene->_object4.animate(ANIM_MODE_5, NULL); + scene->_object5.animate(ANIM_MODE_5, NULL); + scene->_object6.animate(ANIM_MODE_5, NULL); + scene->_object7.animate(ANIM_MODE_5, this); + break; + case 6: + setDelay(120); + break; + case 7: + BF_GLOBALS._scenePalette.addFader(black, 1, 5, this); + break; + case 8: + BF_GLOBALS._sceneManager.changeScene(100); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene20::postInit(SceneObjectList *OwnerList) { + loadScene(20); + Scene::postInit(); + setZoomPercents(60, 85, 200, 100); + BF_GLOBALS._interfaceY = SCREEN_HEIGHT; + + _scenePalette.loadPalette(1); + _scenePalette.loadPalette(22); + + _object1.postInit(); + _object1.setVisage(21); + _object1._strip = 1; + _object1._frame = 1; + _object1.animate(ANIM_MODE_NONE, NULL); + _object1.setPosition(Common::Point(62, 85)); + _object1.changeZoom(100); + + _object2.postInit(); + _object2.setVisage(21); + _object2._strip = 2; + _object2._frame = 1; + _object2.animate(ANIM_MODE_NONE, NULL); + _object2.setPosition(Common::Point(27, 94)); + _object2.changeZoom(100); + + _object3.postInit(); + _object3.setVisage(21); + _object3._strip = 2; + _object3._frame = 2; + _object3.animate(ANIM_MODE_NONE, NULL); + _object3.setPosition(Common::Point(68, 94)); + _object3.changeZoom(100); + + _object4.postInit(); + _object4.setVisage(21); + _object4._strip = 2; + _object4._frame = 3; + _object4.animate(ANIM_MODE_NONE, NULL); + _object4.setPosition(Common::Point(110, 94)); + _object4.changeZoom(100); + + _object5.postInit(); + _object5.setVisage(21); + _object5._strip = 2; + _object5._frame = 4; + _object5.animate(ANIM_MODE_NONE, NULL); + _object5.setPosition(Common::Point(154, 94)); + _object5.changeZoom(100); + + _object6.postInit(); + _object6.setVisage(21); + _object6._strip = 2; + _object6._frame = 5; + _object6.animate(ANIM_MODE_NONE, NULL); + _object6.setPosition(Common::Point(199, 94)); + _object6.changeZoom(100); + + _object7.postInit(); + _object7.setVisage(21); + _object7._strip = 2; + _object7._frame = 6; + _object7.animate(ANIM_MODE_NONE, NULL); + _object7.setPosition(Common::Point(244, 94)); + _object7.changeZoom(100); + + _object8.postInit(); + _object8.setVisage(21); + _object8._strip = 2; + _object8._frame = 7; + _object8.animate(ANIM_MODE_NONE, NULL); + _object8.setPosition(Common::Point(286, 94)); + _object8.changeZoom(100); + + setAction(&_action1); + BF_GLOBALS._dialogCenter.y = 165; +} + +/*-------------------------------------------------------------------------- + * Scene 50 - Map Screen + * + *--------------------------------------------------------------------------*/ + +Scene50::Tooltip::Tooltip(): SavedObject() { + _newSceneNumber = _locationId = 0; +} + +void Scene50::Tooltip::synchronize(Serializer &s) { + SavedObject::synchronize(s); + _bounds.synchronize(s); + s.syncString(_msg); +} + +void Scene50::Tooltip2::signal() { + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: { + Common::Point pt(410, 181); + NpcMover *mover = new NpcMover(); + ((SceneObject *)_owner)->addMover(mover, &pt, this); + break; + } + case 2: + _owner->remove(); + break; + default: + break; + } +} + +void Scene50::Tooltip2::dispatch() { + Action::dispatch(); + SceneObject *owner = (SceneObject *)_owner; + + if ((_actionIndex == 2) && (owner->_percent < 100)) { + owner->changeZoom(owner->_percent + 1); + } +} + +void Scene50::Tooltip::set(const Rect &bounds, int v60, const Common::String &msg, int v62) { + _bounds = bounds; + _newSceneNumber = v60; + _msg = msg; + _locationId = v62; +} + +void Scene50::Tooltip::update() { + // Set up the text object for the scene with the appropriate settings + Scene50 *scene = (Scene50 *)BF_GLOBALS._sceneManager._scene; + scene->_text._fontNumber = 10; + scene->_text._color1 = BF_GLOBALS._scenePalette._colors.foreground; + scene->_text._color2 = BF_GLOBALS._scenePalette._colors.background; + scene->_text.setup(_msg); + + int yp = (scene->_text._textSurface.getBounds().height() == 0) ? _bounds.bottom : _bounds.top; + scene->_text.setPosition(Common::Point(_bounds.left, yp)); +} + +void Scene50::Tooltip::highlight(bool btnDown) { + Scene50 *scene = (Scene50 *)BF_GLOBALS._sceneManager._scene; + + scene->_field382 = _newSceneNumber; + if ((scene->_field380 != 0) || (scene->_field380 != _newSceneNumber)) + update(); + + if (btnDown) { + if ((BF_GLOBALS._bookmark == bCalledToDrunkStop) && BF_GLOBALS.getFlag(beenToJRDay2)) + scene->_sceneNumber = 600; + else if (BF_GLOBALS._bookmark == bBookedGreen) + scene->_sceneNumber = 410; + else { + BF_GLOBALS._driveToScene = _newSceneNumber; + + switch (BF_GLOBALS._driveFromScene) { + case 330: + case 340: + case 342: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._mapLocationId = _locationId; + + if (BF_GLOBALS._driveToScene != 330) { + scene->_sceneNumber = 330; + } else { + 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._driveFromScene == 410) ? fSearchedTruck : didDrunk)) { + BF_GLOBALS._mapLocationId = _locationId; + BF_GLOBALS._player.disableControl(); + scene->_sceneNumber = _newSceneNumber; + } else { + BF_GLOBALS._deathReason = 4; + BF_GLOBALS._sceneManager.changeScene(666); + return; + } + break; + + case 300: + if (_locationId == 1) { + BF_GLOBALS._driveToScene = 300; + _newSceneNumber = 300; + } + // Deliberate fall through to default + default: + BF_GLOBALS._mapLocationId = _locationId; + BF_GLOBALS._player.disableControl(); + scene->_sceneNumber = _newSceneNumber; + break; + } + } + + // Signal the scene to change to the new scene + scene->_sceneMode = 1; + scene->signal(); + } +} + +/*--------------------------------------------------------------------------*/ + +Scene50::Scene50(): SceneExt() { + _field382 = 0; + _field380 = 0; +} + +void Scene50::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + + BF_GLOBALS._interfaceY = 200; + T2_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.disableControl(); + + BF_GLOBALS._scrollFollower = NULL; + _text._color1 = 19; + _text._color2 = 9; + _text._color3 = 9; + _text._width = 75; + _text._fontNumber = 4; + _text._textMode = ALIGN_LEFT; + _text.fixPriority(256); + + // Set all the hotspots + _location3.set(Rect(10, 92, 24, 105), 180, GRANDMA_FRANNIE, 4); + _location2.set(Rect(443, 149, 508, 178), 330, MARINA, 2); + _location1.set(Rect(573, 103, 604, 130), 190, POLICE_DEPARTMENT, 1); + _location4.set(Rect(313, 21, 325, 33), 114, TONYS_BAR, 8); + _location8.set(Rect(69, 79, 82, 88), 580, CHILD_PROTECTIVE_SERVICES, 256); + _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._bookmark == bInspectionDone) || (BF_GLOBALS._bookmark == bCalledToDrunkStop) ? 551 : 550, + BIKINI_HUT, 16); + + _item.setBounds(Rect(0, 0, SCREEN_WIDTH * 2, SCREEN_HEIGHT)); + BF_GLOBALS._sceneItems.push_back(&_item); + + // Find the location to start at + int selectedTooltip = BF_GLOBALS._mapLocationId; + Tooltip *tooltip = NULL; + int xp = 0; + + switch (selectedTooltip) { + case 1: + tooltip = &_location1; + xp = 588; + break; + case 2: + tooltip = &_location2; + xp = 475; + break; + case 4: + tooltip = &_location3; + xp = 17; + break; + case 8: + tooltip = &_location4; + xp = 319; + break; + case 32: + tooltip = &_location5; + xp = 392; + break; + case 64: + tooltip = &_location6; + xp = 253; + break; + case 128: + tooltip = &_location7; + xp = 135; + break; + case 16: + tooltip = &_location9; + xp = 354; + break; + case 256: + tooltip = &_location8; + xp = 75; + break; + } + + _timer.set(240, this); + _sceneBounds.center(xp, SCREEN_HEIGHT / 2); + loadScene(55); + _sceneMode = 2; + + loadBackground(xp - 160, 0); + tooltip->update(); +} + +void Scene50::remove() { + // Blank out the screen + clearScreen(); + BF_GLOBALS._scrollFollower = &BF_GLOBALS._player; + + SceneExt::remove(); + T2_GLOBALS._uiElements._active = true; +} + +void Scene50::signal() { + if (_sceneMode == 1) { + // Destination selected + 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._driveFromScene == 410) && (_sceneNumber != BF_GLOBALS._driveFromScene)) { + BF_GLOBALS.setFlag(125); + } + + if ((BF_GLOBALS._driveFromScene == 340) && (_sceneNumber != BF_GLOBALS._driveFromScene)) { + BF_GLOBALS.setFlag(123); + } + + 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(fHasDrivenFromDrunk)) + _sceneNumber = 550; + + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(_sceneNumber); + + } else if (_sceneMode == 2) { + // 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; + } +} + +void Scene50::process(Event &event) { + SceneExt::process(event); + Common::Point pt(event.mousePos.x + _sceneBounds.left, event.mousePos.y + _sceneBounds.top); + bool mouseDown = false; + _field382 = 0; + + if ((event.mousePos.x > 270 && (_sceneBounds.right < (SCREEN_WIDTH * 2)))) + loadBackground(4, 0); + else if ((event.mousePos.x < 50) && (_sceneBounds.left > 0)) + loadBackground(-4, 0); + else + mouseDown = event.eventType == EVENT_BUTTON_DOWN; + + if (BF_GLOBALS._player._uiEnabled) { + Tooltip *tooltipList[9] = { &_location1, &_location2, &_location3, &_location4, + &_location5, &_location6, &_location7, &_location8, &_location9 }; + + for (int idx = 0; idx < 9; ++idx) { + if (tooltipList[idx]->_bounds.contains(pt)) { + // Found a tooltip to highlight + tooltipList[idx]->highlight(mouseDown); + return; + } + } + + // No hotspot selected, so remove any current tooltip display + _text.remove(); + } +} + +/*-------------------------------------------------------------------------- + * 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)) { + T2_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)) { + T2_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)) { + T2_GLOBALS._uiElements.addScore(10); + _state = 606; + } else if (BF_GLOBALS.removeFlag(fCan1004Drunk)) { + T2_GLOBALS._uiElements.addScore(10); + _state = 606; + } else { + _state = 611; + } + break; + case 2: + _state = 612; + break; + case 3: + if (BF_GLOBALS.removeFlag(f1015Marina)) { + T2_GLOBALS._uiElements.addScore(10); + _state = 613; + } else if (BF_GLOBALS.removeFlag(f1015Frankie)) { + T2_GLOBALS._uiElements.addScore(10); + _state = 614; + } else if (BF_GLOBALS.removeFlag(f1015Drunk)) { + T2_GLOBALS._uiElements.addScore(10); + _state = 615; + } else { + _state = 616; + } + break; + case 4: + if (BF_GLOBALS.removeFlag(f1027Marina)) { + T2_GLOBALS._uiElements.addScore(10); + _actionIndex = 5; + _state = 617; + } else if (BF_GLOBALS.removeFlag(f1027Frankie)) { + T2_GLOBALS._uiElements.addScore(10); + _actionIndex = 5; + _state = 618; + } else if (BF_GLOBALS.removeFlag(f1015Drunk)) { + T2_GLOBALS._uiElements.addScore(10); + _actionIndex = 5; + _state = 619; + } else { + _state = 620; + } + break; + case 5: + if (BF_GLOBALS.removeFlag(f1035Marina)) { + BF_GLOBALS.setFlag(fCalledBackup); + T2_GLOBALS._uiElements.addScore(50); + _state = 621; + } else if (BF_GLOBALS.removeFlag(f1035Frankie)) { + BF_GLOBALS.setFlag(fCalledBackup); + T2_GLOBALS._uiElements.addScore(50); + _actionIndex = 5; + _state = 622; + } else if (BF_GLOBALS.removeFlag(f1035Drunk)) { + T2_GLOBALS._uiElements.addScore(10); + _state = 623; + } else { + _state = 624; + } + break; + case 6: + if (BF_GLOBALS.removeFlag(f1097Marina)) { + T2_GLOBALS._uiElements.addScore(10); + _state = 625; + } else if (BF_GLOBALS.removeFlag(f1097Frankie)) { + T2_GLOBALS._uiElements.addScore(10); + _actionIndex = 5; + _state = 626; + } else if (BF_GLOBALS.removeFlag(f1097Drunk)) { + T2_GLOBALS._uiElements.addScore(10); + _state = 627; + } else { + _state = 628; + } + break; + case 7: + if (BF_GLOBALS.removeFlag(f1098Marina)) { + T2_GLOBALS._uiElements.addScore(10); + _state = 629; + } else if (BF_GLOBALS.removeFlag(f1098Frankie)) { + T2_GLOBALS._uiElements.addScore(10); + _state = 630; + } else if (BF_GLOBALS.removeFlag(f1098Drunk)) { + T2_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 new file mode 100644 index 0000000000..103e5f0a4c --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes0.h @@ -0,0 +1,190 @@ +/* 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_SCENES0_H +#define TSAGE_BLUEFORCE_SCENES0_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 Scene20 : public SceneExt { + /* Actions */ + class Action1 : public Action { + private: + ASoundExt _sound; + public: + virtual void signal(); + }; +public: + Action1 _action1; + ScenePalette _scenePalette; + SceneObject _object1, _object2, _object3, _object4; + SceneObject _object5, _object6, _object7, _object8; + + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene50: public SceneExt { + class Tooltip: public SavedObject { + public: + Rect _bounds; + Common::String _msg; + int _newSceneNumber; + int _locationId; + public: + Tooltip(); + void set(const Rect &bounds, int v60, const Common::String &msg, int v62); + void update(); + void highlight(bool btnDown); + + virtual Common::String getClassName() { return "Scene50_Tooltip"; } + virtual void synchronize(Serializer &s); + }; + class Tooltip2: public Action { + public: + Tooltip2(): Action() {} + + virtual Common::String getClassName() { return "Scene50_Tooltip2"; } + virtual void signal(); + virtual void dispatch(); + }; +public: + int _field380, _field382; + int _sceneNumber; + SceneText _text; + SceneItemType2 _item; + Tooltip _location1, _location2, _location3, _location4, _location5; + Tooltip _location6, _location7, _location8, _location9; + Timer _timer; +public: + Scene50(); + virtual Common::String getClassName() { return "Scene50"; } + 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 + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp new file mode 100644 index 0000000000..e977d5fbca --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes1.cpp @@ -0,0 +1,3399 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/config-manager.h" +#include "tsage/blue_force/blueforce_scenes1.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/globals.h" + +namespace TsAGE { + +namespace BlueForce { + +/*-------------------------------------------------------------------------- + * Scene 100 - Tsunami Title Screen #2 + * + *--------------------------------------------------------------------------*/ + +void Scene100::Text::dispatch() { + SceneText::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, + pt.y + scene->_action1._textHeight)); +} + + +void Scene100::Action1::signal() { + static byte black[3] = { 0, 0, 0 }; + + switch (_actionIndex++) { + case 0: + _state = 0; + setDelay(6); + break; + case 1: { + Common::String msg1 = g_resourceManager->getMessage(100, _state++); + if (msg1.compareTo("LASTCREDIT")) { + 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); + } + break; + } + case 2: + setDelay(600); + break; + case 3: + BF_GLOBALS._sound1.fade(0, 10, 10, 1, this); + GLOBALS._scenePalette.addFader(black, 1, 2, NULL); + break; + case 4: + error("??exit"); + break; + } +} + +void Scene100::Action1::setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action) { + // Set data for first text control + _sceneText1._fontNumber = 10; + _sceneText1._width = 160; + _sceneText1._textMode = ALIGN_RIGHT; + _sceneText1._color1 = BF_GLOBALS._scenePalette._colors.foreground; + _sceneText1._color2 = BF_GLOBALS._scenePalette._colors.background; + _sceneText1._color3 = BF_GLOBALS._scenePalette._colors.foreground; + _sceneText1.setup(msg1); + _sceneText1.fixPriority(255); + _sceneText1.setPosition(Common::Point( + (SCREEN_WIDTH - _sceneText1.getFrame().getBounds().width()) / 2, 202)); + _sceneText1._moveRate = 30; + _sceneText1._moveDiff.y = 1; + + // Set data for second text control + _sceneText2._fontNumber = 10; + _sceneText2._width = _sceneText1._width; + _sceneText2._textMode = _sceneText1._textMode; + _sceneText2._color1 = _sceneText1._color1; + _sceneText2._color2 = 31; + _sceneText2._color3 = _sceneText1._color3; + _sceneText2.setup(msg2); + _sceneText2.fixPriority(255); + GfxSurface textSurface = _sceneText2.getFrame(); + _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); + NpcMover *mover = new NpcMover(); + _sceneText1.addMover(mover, &pt, action); +} + +void Scene100::Action2::signal() { + Scene100 *scene = (Scene100 *)g_globals->_sceneManager._scene; + static byte black[3] = {0, 0, 0}; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._scenePalette.addFader(black, 1, -2, this); + break; + case 1: + setDelay(180); + break; + case 2: { + const char *SEEN_INTRO = "seen_intro"; + if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) { + // First time being played, so will need to show the intro + ConfMan.setBool(SEEN_INTRO, true); + ConfMan.flushToDisk(); + } else { + // Prompt user for whether to start play or watch introduction + g_globals->_player.enableControl(); + g_globals->_events.setCursor(CURSOR_WALK); + + if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { + // Signal to start the game + scene->_index = 190; + remove(); + return; + } + } + + // At this point the introduction needs to start + g_globals->_scenePalette.addFader(black, 1, 2, this); + break; + } + case 3: + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene100::Scene100(): SceneExt() { + _index = 0; +} + +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; + BF_GLOBALS._interfaceY = SCREEN_HEIGHT; + + g_globals->_player.postInit(); + g_globals->_player.hide(); + g_globals->_player.disableControl(); + _index = 109; + + if (BF_GLOBALS._dayNumber < 6) { + // Title + BF_GLOBALS._sound1.play(2); + setAction(&_action2, this); + } else { + // Credits + BF_GLOBALS._sound1.play(118); + setAction(&_action1, this); + } +} + +void Scene100::signal() { + ++_sceneMode; + if (BF_GLOBALS._dayNumber < 6) { + BF_GLOBALS._scenePalette.clearListeners(); + BF_GLOBALS._scenePalette.loadPalette(100); + BF_GLOBALS._sceneManager.changeScene(_index); + } else { + if (_sceneMode > 1) + BF_GLOBALS._events.setCursor(CURSOR_ARROW); + + setAction(this, &_action1, this); + } +} + +/*-------------------------------------------------------------------------- + * Scene 109 - Introduction Bar Room + * + *--------------------------------------------------------------------------*/ + +void Scene109::Action1::signal() { + Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + BF_GLOBALS._sound1.play(12); + BF_GLOBALS._sceneObjects->draw(); + BF_GLOBALS._scenePalette.loadPalette(2); + BF_GLOBALS._scenePalette.refresh(); + setDelay(10); + break; + case 2: + scene->_text.setup(BF_19840515, this); + break; + case 3: + BF_GLOBALS._v51C44 = 1; + scene->loadScene(115); + + scene->_protaginist2.show(); + scene->_protaginist2.setPriority(133); + scene->_protaginist1.show(); + scene->_bartender.show(); + scene->_object1.show(); + scene->_drunk.show(); + scene->_drunk.setAction(&scene->_action3); + scene->_object2.show(); + scene->_object9.show(); + scene->_object9.setAction(&scene->_action2); + + BF_GLOBALS._v501FC = 170; + setDelay(60); + break; + case 4: + // Start drinking + scene->_bartender.setAction(&scene->_sequenceManager4, NULL, 109, &scene->_bartender, &scene->_object2, NULL); + scene->_protaginist1.setAction(&scene->_sequenceManager5, NULL, 107, &scene->_protaginist1, NULL); + scene->_protaginist2.setAction(&scene->_sequenceManager6, this, 106, &scene->_protaginist2, NULL); + break; + case 5: + // Open briefcase and pass over disk + setAction(&scene->_sequenceManager6, this, 105, &scene->_object10, NULL); + break; + case 6: + // Protaginist 2 walk to the bar + scene->_object10.remove(); + setAction(&scene->_sequenceManager6, this, 100, &scene->_protaginist2, NULL); + break; + case 7: + // Two thugs enter and walk to table + scene->_object7.setAction(&scene->_sequenceManager7, NULL, 103, &scene->_object7, NULL); + scene->_object5.setAction(&scene->_sequenceManager8, this, 102, &scene->_object5, NULL); + scene->_protaginist2.setAction(&scene->_sequenceManager6, NULL, 104, &scene->_protaginist2, &scene->_bartender, NULL); + break; + case 8: + // Protaginist 1 leaves, protaginist 2 stands up + setAction(&scene->_sequenceManager8, this, 101, &scene->_object5, &scene->_protaginist1, NULL); + break; + case 9: + // Shots fired! + scene->_protaginist1.setAction(&scene->_sequenceManager5, this, 98, &scene->_protaginist1, NULL); + scene->_object7.setAction(&scene->_sequenceManager7, NULL, 99, &scene->_object7, NULL); + break; + case 10: + // End scene + scene->_sceneMode = 1; + remove(); + break; + } +} + +void Scene109::Action2::signal() { + Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene; + scene->setAction(&scene->_sequenceManager2, this, 3117, &scene->_object9, NULL); +} + +void Scene109::Action3::signal() { + Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene; + scene->setAction(&scene->_sequenceManager3, this, 108, &scene->_drunk, NULL); +} + +/*--------------------------------------------------------------------------*/ + +Scene109::Scene109(): PalettedScene() { +} + +void Scene109::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(OwnerList); + loadScene(999); + + _protaginist2.postInit(); + _protaginist2.setVisage(119); + _protaginist2.setFrame(11); + _protaginist2.fixPriority(133); + _protaginist2.setPosition(Common::Point(165, 124)); + _protaginist2.hide(); + + _protaginist1.postInit(); + _protaginist1.setVisage(118); + _protaginist1.setStrip(1); + _protaginist1.setFrame(8); + _protaginist1.fixPriority(132); + _protaginist1.setPosition(Common::Point(143, 125)); + _protaginist1.hide(); + + _bartender.postInit(); + _bartender.setVisage(121); + _bartender.setStrip(2); + _bartender.setFrame(1); + _bartender.setPriority(-1); + _bartender.setPosition(Common::Point(92, 64)); + _bartender.hide(); + + _object1.postInit(); + _object1.setVisage(121); + _object1.setStrip(6); + _object1.setFrame(1); + _object1.setPriority(-1); + _object1.setPosition(Common::Point(110, 64)); + _object1.hide(); + + _drunk.postInit(); + _drunk.setVisage(120); + _drunk.setStrip(2); + _drunk.setFrame(5); + _drunk.setPriority(-1); + _drunk.setPosition(Common::Point(127, 97)); + _drunk.hide(); + + _object2.postInit(); + _object2.setVisage(121); + _object2.setStrip(5); + _object2.setFrame(1); + _object2.setPriority(-1); + _object2.setPosition(Common::Point(104, 64)); + _object2.hide(); + + _object9.postInit(); + _object9.setVisage(115); + _object9.setStrip(4); + _object9.setFrame(1); + _object9.setPosition(Common::Point(262, 29)); + _object9.hide(); + + _object5.postInit(); + _object5.hide(); + + _object7.postInit(); + _object7.hide(); + + _object10.postInit(); + _object10.hide(); + + BF_GLOBALS._player.disableControl(); + setAction(&_action1, this); +} + +void Scene109::signal() { + if (_sceneMode == 1) { + BF_GLOBALS._scenePalette.clearListeners(); + BF_GLOBALS._sceneManager.changeScene(110); + } +} + +/*-------------------------------------------------------------------------- + * Scene 110 - Intro - Outside the bar + * + *--------------------------------------------------------------------------*/ + +void Scene110::Action1::signal() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: + scene->_object8.show(); + scene->_object7.show(); + scene->_object1.show(); + scene->_object4.show(); + scene->_object5.show(); + scene->_object6.show(); + scene->_object9.show(); + scene->_object10.show(); + BF_GLOBALS._v51C44 = 1; + scene->loadScene(110); + setDelay(10); + break; + case 2: + BF_GLOBALS._v51C44 = 1; + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 3: { + Common::Point pt(123, 121); + NpcMover *mover = new NpcMover(); + scene->_object4.addMover(mover, &pt, this); + } + // No break on purpose + case 7: + setDelay(30); + break; + case 4: + // Guy running to the moto + scene->_object1.animate(ANIM_MODE_6, NULL); + break; + case 5: + scene->_object4.setStrip(2); + scene->_object4.setPosition(Common::Point(117, 106)); + scene->_object4.animate(ANIM_MODE_5, this); + break; + case 6: + // Play "Vroum" + scene->_sound.play(31); + // The guy starts the engine + scene->_object4.setStrip(3); + scene->_object4._frame = 1; + scene->_object4.animate(ANIM_MODE_5, NULL); + // The guy looks behind him + scene->_object2.setPosition(Common::Point(227, 190)); + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 8: + scene->_object2.animate(ANIM_MODE_6, this); + break; + case 9: + scene->_object2.remove(); + scene->_object4.remove(); + scene->_object5.setStrip(4); + scene->_object5.setFrame2(5); + scene->_object5.setPosition(Common::Point(105, 120)); + setDelay(10); + scene->_object6.setPosition(Common::Point(127, 96)); + scene->_object6.animate(ANIM_MODE_2, NULL); + scene->_object6.setAction(&scene->_action2); + scene->_sound.play(22); + break; + case 10: + scene->_object8.setAction(&scene->_action4); + scene->_object5.setFrame2(3); + scene->_object5.setPosition(Common::Point(87, 120)); + setDelay(8); + break; + case 11: + scene->_object5.setFrame2(4); + scene->_object5.setPosition(Common::Point(62, 122)); + setDelay(6); + break; + case 12: + scene->_object5.setFrame2(5); + scene->_object5.setPosition(Common::Point(35, 120)); + scene->_object5.fixPriority(70); + setDelay(4); + break; + case 13: + scene->_object5.setFrame2(6); + scene->_object5.setPosition(Common::Point(22, 111)); + setDelay(2); + break; + case 14: + scene->_object5.setFrame2(7); + scene->_object5.setPosition(Common::Point(19, 99)); + setDelay(2); + break; + case 15: + scene->_object5.setFrame2(8); + scene->_object5.setPosition(Common::Point(54, 76)); + setDelay(1); + break; + case 16: { + Common::Point pt(182, 54); + NpcMover *mover = new NpcMover(); + scene->_object5.addMover(mover, &pt, this); + } + break; + case 17: + scene->_object5.remove(); + break; + default: + break; + } +} + +void Scene110::Action2::signal() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + Common::Point pt(152, 94); + NpcMover *mover = new NpcMover(); + scene->_object6.addMover(mover, &pt, this); + } + break; + case 1: { + Common::Point pt(167, 108); + NpcMover *mover = new NpcMover(); + scene->_object6.addMover(mover, &pt, this); + } + break; + case 2: { + Common::Point pt(172, 109); + NpcMover *mover = new NpcMover(); + scene->_object6.addMover(mover, &pt, this); + } + break; + case 3: { + Common::Point pt(179, 117); + NpcMover *mover = new NpcMover(); + scene->_object6.addMover(mover, &pt, this); + } + break; + case 4: + setDelay(30); + break; + case 5: + scene->_object6.animate(ANIM_MODE_NONE, NULL); + break; + default: + break; + } +} + +void Scene110::Action3::signal() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(3); + break; + case 1: + scene->_object7.setPosition(scene->_object7._position); + scene->_object1.setFrame(2); + setDelay(1); + break; + case 2: + scene->_object1.setFrame(3); + setDelay(1); + break; + case 3: + scene->_object1.setFrame(4); + scene->_object7.animate(ANIM_MODE_5, this); + break; + case 4: { + scene->_object1.animate(ANIM_MODE_6, NULL); + scene->_object7.setPosition(Common::Point(205, 99)); + scene->_object7.setStrip(2); + scene->_object7.animate(ANIM_MODE_1, NULL); + scene->_object7.changeZoom(90); + Common::Point pt(151, 88); + NpcMover *mover = new NpcMover(); + scene->_object7.addMover(mover, &pt, this); + } + break; + case 5: + scene->_object7.fixPriority(76); + scene->_object7.setStrip(3); + scene->_object7.changeZoom(90); + scene->_object7.setFrame(1); + scene->_object7.animate(ANIM_MODE_5, this); + scene->_object10.animate(ANIM_MODE_5, NULL); + break; + case 6: + scene->_object7.fixPriority(73); + scene->_object10.animate(ANIM_MODE_6, this); + break; + case 7: { + scene->_object7._yDiff = 1000; + scene->_object10.remove(); + scene->_object9.setFrame2(2); + Common::Point pt(230, 53); + NpcMover *mover = new NpcMover(); + scene->_object9.addMover(mover, &pt, this); + scene->_sound.play(23); + } + break; + case 8: + scene->_object9.remove(); + BF_GLOBALS._sceneManager.changeScene(125); + break; + default: + break; + } +} + +void Scene110::Action3::dispatch() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + Action::dispatch(); + if ((_actionIndex == 5) && (scene->_object7._percent > 80)) + scene->_object7.changeZoom(scene->_object7._percent - 1); +} + +void Scene110::Action4::signal() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object8.setPosition(scene->_object8._position); + scene->_object1.setFrame(2); + setDelay(1); + break; + case 1: + scene->_object1.setFrame(3); + setDelay(1); + break; + case 2: { + scene->_object1.setFrame(4); + scene->_object8.fixPriority(90); + Common::Point pt(194, 119); + NpcMover *mover = new NpcMover(); + scene->_object8.addMover(mover, &pt, this); + } + break; + case 3: + scene->_object1.animate(ANIM_MODE_6, NULL); + scene->_object8.setPosition(Common::Point(186, 117)); + scene->_object8.setStrip(2); + scene->_object8.setFrame(1); + scene->_object3.setPosition(scene->_object3._position); + scene->_object3.setFrame(1); + setDelay(7); + break; + case 4: + scene->_object8.setFrame2(2); + scene->_object3.setFrame(3); + setDelay(7); + break; + case 5: + scene->_object8.setFrame2(3); + scene->_object3.setFrame(3); + setDelay(7); + scene->_object6.remove(); + break; + case 6: + scene->_object8.setFrame2(4); + scene->_object3.setFrame(4); + setDelay(7); + break; + case 7: + scene->_object8.setFrame2(5); + scene->_object3.setFrame(5); + setDelay(7); + break; + case 8: + scene->_object8.setFrame2(7); + scene->_object3.setFrame(6); + setDelay(30); + break; + case 9: { + scene->_object3.remove(); + scene->_object8.setFrame2(-1); + scene->_object8.setPosition(Common::Point(176, 105)); + scene->_object8.animate(ANIM_MODE_1, NULL); + scene->_object8.setStrip(3); + Common::Point pt(141, 94); + NpcMover *mover = new NpcMover(); + scene->_object8.addMover(mover, &pt, this); + scene->_object7.setAction(&scene->_action3); + } + break; + case 10: { + scene->_object8.fixPriority(77); + Common::Point pt(78, 76); + NpcMover *mover = new NpcMover(); + scene->_object8.addMover(mover, &pt, this); + } + break; + case 11: { + scene->_object8.setPosition(Common::Point(87, 76)); + scene->_object8.fixPriority(71); + scene->_object8.setStrip(6); + scene->_object8.changeZoom(75); + Common::Point pt(103, 74); + NpcMover *mover = new NpcMover(); + scene->_object8.addMover(mover, &pt, this); + } + break; + case 12: + scene->_object8.setPosition(Common::Point(119, 59)); + scene->_object8.setStrip(5); + scene->_object8.changeZoom(100); + scene->_object8.animate(ANIM_MODE_5, this); + break; + case 13: + scene->_object8.setPosition(Common::Point(119, 59), 300); + break; + default: + break; + } +} + +void Scene110::Action4::dispatch() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + Action::dispatch(); + if ((_actionIndex > 9) && (_actionIndex < 12) && (scene->_object8._percent > 80)) + scene->_object8.changeZoom(scene->_object8._percent - 1); +} + +void Scene110::Action5::signal() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object3.setPosition(scene->_object3._position); + scene->_object3.animate(ANIM_MODE_5, this); + break; + case 1: + scene->_object3.remove(); + break; + default: + break; + } +} + +void Scene110::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(999); + _object8.postInit(); + _object8.setVisage(112); + _object8.setPosition(Common::Point(239, 98), 300); + _object8.setFrame(1); + _object8.setStrip(1); + _object8.changeZoom(90); + _object8.fixPriority(90); + _object8.animate(ANIM_MODE_1, NULL); + _object8._moveDiff.x = 7; + _object8._moveDiff.y = 3; + _object8.hide(); + + _object3.postInit(); + _object3.setVisage(112); + _object3.setPosition(Common::Point(247, 190), 300); + _object3.setFrame(1); + _object3.setStrip(4); + _object3.changeZoom(100); + _object3.fixPriority(255); + + _object7.postInit(); + _object7.setVisage(113); + _object7.setPosition(Common::Point(236, 86), 300); + _object7._frame = 1; + _object7.setStrip(1); + _object7.changeZoom(110); + _object7.fixPriority(89); + _object7._moveDiff.x = 7; + _object7._moveDiff.y = 3; + _object7.hide(); + + _object1.postInit(); + _object1.setVisage(110); + _object1.setPosition(Common::Point(216, 88), 0); + _object1._frame = 1; + _object1.setStrip(1); + _object1.changeZoom(100); + _object1.fixPriority(83); + _object1.hide(); + + _object2.postInit(); + _object2.setVisage(111); + _object2.setPosition(Common::Point(527, 190), 0); + _object2._frame = 1; + _object2.fixPriority(250); + _object2.setStrip(5); + _object2.changeZoom(100); + + _object4.postInit(); + _object4.setVisage(111); + _object4.setPosition(Common::Point(253, 98), 0); + _object4._frame = 1; + _object4.setStrip(1); + _object4.changeZoom(100); + _object4.fixPriority(90); + _object4.animate(ANIM_MODE_1, NULL); + _object4._moveDiff.x = 10; + _object4._moveDiff.y = 10; + _object4.hide(); + + _object5.postInit(); + _object5.setVisage(111); + _object5.setPosition(Common::Point(114, 119), 0); + _object5.setFrame2(1); + _object5.setStrip(7); + _object5.fixPriority(70); + _object5.changeZoom(100); + _object5._moveDiff.x = 20; + _object5._moveDiff.y = 20; + _object5.hide(); + + _object6.postInit(); + _object6.setVisage(111); + _object6.setPosition(Common::Point(527, 96), 0); + _object6._frame = 1; + _object6.setStrip(6); + _object6.changeZoom(100); + _object6.fixPriority(238); + _object6._moveDiff.x = 10; + _object6._moveDiff.y = 10; + _object6.hide(); + + _object9.postInit(); + _object9.setVisage(110); + _object9.setPosition(Common::Point(148, 69), 0); + _object9._frame = 1; + _object9.setStrip(2); + _object9.changeZoom(100); + _object9.fixPriority(72); + _object9._moveDiff.x = 10; + _object9._moveDiff.y = 10; + _object9.hide(); + + _object10.postInit(); + _object10.setVisage(110); + _object10._frame = 1; + _object10.setStrip(3); + _object10.changeZoom(100); + _object10.fixPriority(74); + _object10._moveDiff.x = 10; + _object10._moveDiff.y = 10; + _object10.setPosition(_object9._position); + _object10.hide(); + + setAction(&_action1); +} +/*-------------------------------------------------------------------------- + * Scene 114 - Outside the Bar + * + *--------------------------------------------------------------------------*/ + +bool Scene114::Vechile::startAction(CursorType action, Event &event) { + Scene114 *scene = (Scene114 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(114, 0); + return true; + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1142; + if (BF_GLOBALS.getFlag(fWithLyle)) { + scene->_lyle.fixPriority(-1); + scene->setAction(&scene->_sequenceManager1, scene, 1142, &BF_GLOBALS._player, &scene->_lyle, NULL); + } else { + Common::Point pt(155, 111); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, scene); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene114::Door::startAction(CursorType action, Event &event) { + Scene114 *scene = (Scene114 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(114, 1); + return true; + case CURSOR_USE: + BF_GLOBALS._walkRegions.proc2(2); + BF_GLOBALS._player.disableControl(); + scene->_lyle.fixPriority(-1); + scene->_sceneMode = 1140; + scene->setAction(&scene->_sequenceManager1, scene, 1140, &BF_GLOBALS._player, this, &scene->_lyle, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +void Scene114::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + + BF_GLOBALS._sound1.fadeSound(33); + loadScene(110); + + setZoomPercents(85, 80, 105, 100); + BF_GLOBALS._walkRegions.proc1(9); + BF_GLOBALS._walkRegions.proc1(22); + + _door.postInit(); + _door.setVisage(110); + _door.setPosition(Common::Point(216, 88)); + BF_GLOBALS._sceneItems.push_front(&_door); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(1358); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setPosition(Common::Point(155, 111)); + BF_GLOBALS._player._moveDiff.x = 3; + BF_GLOBALS._player._moveDiff.y = 2; + BF_GLOBALS._player.changeZoom(-1); + + _lyle.postInit(); + _lyle.setVisage(1359); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setPosition(Common::Point(-118, -146)); + _lyle.changeZoom(-1); + _lyle._moveDiff.x = 2; + _lyle._moveDiff.y = 1; + _lyle.hide(); + _lyle.setDetails(114, 2, -1, -1, 1, NULL); + + _vechile.postInit(); + if (BF_GLOBALS.getFlag(fWithLyle)) { + _vechile.setVisage(444); + _vechile.setPosition(Common::Point(127, 78)); + _vechile.fixPriority(20); + BF_GLOBALS._player.setPosition(Common::Point(139, 79)); + _lyle.setPosition(Common::Point(86, 79)); + _lyle.show(); + } else { + _vechile.setVisage(380); + _vechile.setPosition(Common::Point(128, 125)); + _vechile.setFrame(1); + if (BF_GLOBALS.getFlag(onDuty)) { + _vechile.setStrip(2); + _vechile.changeZoom(70); + BF_GLOBALS._player.setVisage(352); + } else { + _vechile.setStrip(1); + _vechile.changeZoom(77); + } + BF_GLOBALS._walkRegions.proc1(17); + } + BF_GLOBALS._sceneItems.push_front(&_vechile); + BF_GLOBALS._walkRegions.proc1(2); + + if (BF_GLOBALS._sceneManager._previousScene == 115) { + BF_GLOBALS._player.setPosition(Common::Point(219, 100)); + BF_GLOBALS._player.setStrip(6); + _lyle.setPosition(Common::Point(253, 110)); + _lyle.fixPriority(108); + _lyle.setStrip(6); + BF_GLOBALS._player.enableControl(); + } else if (BF_GLOBALS.getFlag(fWithLyle)) { + _sceneMode = 1141; + setAction(&_sequenceManager1, this, 1141, &_lyle, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + + _item1.setDetails(Rect(0, 0, 320, 200), 114, 3, -1, -1, 1, NULL); +} + +void Scene114::signal() { + switch (_sceneMode) { + case 1140: + BF_GLOBALS._sceneManager.changeScene(115); + break; + case 1141: + BF_GLOBALS._player.enableControl(); + break; + case 1142: + BF_GLOBALS._sceneManager.changeScene(60); + break; + default: + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 115 - Inside Tony's bar + * + *--------------------------------------------------------------------------*/ +bool Scene115::Object1::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(115, 8, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_TALK: + if (BF_INVENTORY.getObjectScene(INV_NAPKIN) == 1) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(1174, scene); + } else if (scene->_field31E8 == 0) { + if (BF_GLOBALS.getFlag(fShowedIdToKate)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(1159, scene); + } else { + scene->_sceneMode = 1167; + scene->setAction(&scene->_action6); + } + } else + scene->setAction(&scene->_action7); + return true; + case INV_MUG_SHOT: + if (scene->_field31E8 == 0) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + if (BF_GLOBALS._v4CEAA == 0) + scene->_stripManager.start(1167, scene); + else if (BF_GLOBALS.getFlag(fShowedIdToKate)) + scene->_stripManager.start(1159, scene); + else if (BF_GLOBALS.getFlag(fMugOnKate)) + scene->_stripManager.start(1159, scene); + else { + scene->_sceneMode = 9999; + scene->setAction(&scene->_action6); + } + } else + SceneItem::display(115, 44, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case INV_ID: + if (scene->_field31E8 == 0) { + if (BF_GLOBALS._v4CEAA == 0) { + scene->_sceneMode = 1167; + scene->setAction(&scene->_action6); + } else if (BF_GLOBALS.getFlag(fShowedIdToKate)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(1159, scene); + } else { + BF_GLOBALS.setFlag(fShowedIdToKate); + scene->setAction(&scene->_action8); + } + } else + SceneItem::display(115, 44, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene115::Object2::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(115, 7, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_TALK: + if (BF_GLOBALS._dayNumber == 3) { + if (BF_INVENTORY.getObjectScene(INV_NAPKIN) == 1) + scene->_sceneMode = 1173; + else if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) { + if (BF_GLOBALS.getFlag(fTalkedToTony)) + scene->_sceneMode = 1151; + else if (BF_GLOBALS._v4CEAA == 0) { + scene->_sceneMode = 1150; + BF_GLOBALS.setFlag(fTalkedToTony); + } else + scene->_sceneMode = 1151; + } else if (_field15F8 == 0) { + _field15F8++; + scene->_sceneMode = 1171; + } else + scene->_sceneMode = 1172; + } else if (BF_GLOBALS.getFlag(onDuty)) { + if (scene->_field31EA == 0) { + scene->_field31EA = 1; + scene->_sceneMode = 1169; + } else + scene->_sceneMode = 1170; + } else if (scene->_field31EA == 0) { + scene->_sceneMode = 1171; + scene->_field31EA = 1; + } else + scene->_sceneMode = 1172; + + scene->setAction(&scene->_action9); + return true; + case INV_FOREST_RAP: + if (BF_GLOBALS.getFlag(onDuty)) + scene->_sceneMode = 1178; + else + scene->_sceneMode = 1180; + scene->setAction(&scene->_action9); + return true; + case INV_COBB_RAP: + if (BF_GLOBALS.getFlag(onDuty)) + scene->_sceneMode = 1177; + else if (BF_GLOBALS._v4CEAA == 0) + scene->_sceneMode = 1179; + else + scene->_sceneMode = 1154; + + scene->setAction(&scene->_action9); + return true; + case INV_MUG_SHOT: + scene->setAction(&scene->_action2); + return true; + case INV_ID: + if (BF_INVENTORY.getObjectScene(INV_NAPKIN) == 1) { + scene->_sceneMode = 1173; + scene->setAction(&scene->_action9); + } else if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) { + if (BF_GLOBALS.getFlag(fTalkedToTony)) { + scene->_sceneMode = 1151; + scene->setAction(&scene->_action9); + } else { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fTalkedToTony); + if (BF_GLOBALS._v4CEAA == 0) { + scene->_sceneMode = 1150; + scene->setAction(&scene->_action9); + } else { + BF_GLOBALS._v4CEAA = 1; + scene->setAction(&scene->_action2); + } + } + } else if (_field15F8 == 0) { + _field15F8++; + if (BF_GLOBALS.getFlag(onDuty)) { + scene->_sceneMode = 1182; + scene->setAction(&scene->_action9); + } else { + scene->_sceneMode = 1171; + scene->setAction(&scene->_action9); + } + } else if (BF_GLOBALS.getFlag(onDuty)) { + scene->_sceneMode = 1183; + scene->setAction(&scene->_action9); + } else { + scene->_sceneMode = 1172; + scene->setAction(&scene->_action9); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene115::Object3::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(115, 9, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_USE: + SceneItem::display(115, 23, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_TALK: { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + Common::Point pt(160, 110); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, scene); + return true; + } + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene115::Object4::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(115, 42, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_TALK: + scene->_sceneMode = 0; + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.updateAngle(_position); + scene->_stripManager.start(1184, scene); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +void Scene115::Item1::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + if (_field1F8A == 2) + _field1F8A = 0; + + if (_field1F8A == 1) { + _field1F8A = 2; + setAction(&_sequenceManager6, this, 118, &scene->_object12, &scene->_object11, NULL); + } +} + +bool Scene115::Item1::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (_field1F8A == 0) { + _field1F8A = 1; + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_action4); + } else + SceneItem::display(_resNum, 37, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } else + return NamedHotspot::startAction(action, event); +} + +void Scene115::Item1::synchronize(Serializer &s) { + NamedHotspot::synchronize(s); + s.syncAsSint16LE(_field1F8A); +} + +Scene115::Item1::Item1() { + _field1F8A = 0; +} + +void Scene115::EventHandler1::dispatch() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + if (BF_GLOBALS._player.getRegionIndex() == 27) { + scene->_object1.setAction(&scene->_action5); + scene->removeTimer(this); + } +} + +bool Scene115::Item10::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + if (BF_GLOBALS.getFlag(fWithLyle)) { + scene->_object4.setStrip2(6); + Common::Point pt(-20, 122); + NpcMover *mover = new NpcMover(); + scene->_object4.addMover(mover, &pt, NULL); + } + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1150; + scene->setAction(&scene->_sequenceManager1, scene, 1150, &BF_GLOBALS._player, NULL); + return true; +} + +bool Scene115::Item14::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(115, 10, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_USE: + if (BF_GLOBALS._sceneObjects->contains(&scene->_object3)) + SceneItem::display(115, 23, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + else + SceneItem::display(115, 43, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +void Scene115::Action1::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + _actionIndex = 2 + BF_GLOBALS._randomSource.getRandomNumber(1); + setDelay(BF_GLOBALS._randomSource.getRandomNumber(180)); + break; + case 2: + _actionIndex = 1; + setAction(&scene->_sequenceManager2, this, 115, &scene->_object3, &scene->_object8, &scene->_object9, &scene->_object10, NULL); + break; + case 3: + _actionIndex = 1; + setAction(&scene->_sequenceManager2, this, 116, &scene->_object3, &scene->_object8, &scene->_object9, &scene->_object10, NULL); + break; + default: + break; + } +} + +void Scene115::Action2::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._v4CEAA < 3) { + if (scene->_object2._position.x > 67) { + scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1118, &scene->_object2, NULL); + } else if (scene->_object2._position.x != 67) { + scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1119, &scene->_object2, NULL); + } + } + BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 1117, &BF_GLOBALS._player); + break; + case 1: + BF_GLOBALS._v4CEAA++; + if (BF_GLOBALS.getFlag(onDuty)) { + if (BF_GLOBALS.getFlag(fTalkedToTony)) { + switch (BF_GLOBALS._v4CEAA) { + case 1: + T2_GLOBALS._uiElements.addScore(30); + scene->_stripManager.start(1181, this); + break; + case 2: + scene->_stripManager.start(1176, this); + break; + default: + scene->_stripManager.start(1155, this); + break; + } + } else { + scene->_stripManager.start(1175, this); + } + } else { + if (BF_GLOBALS.getFlag(fTalkedToTony)) { + switch (BF_GLOBALS._v4CEAA) { + case 1: + T2_GLOBALS._uiElements.addScore(30); + scene->_stripManager.start(1153, this); + break; + case 2: + scene->_stripManager.start(1154, this); + break; + default: + scene->_stripManager.start(1155, this); + break; + } + } else { + scene->_stripManager.start(1152, this); + } + } + break; + case 2: + if (BF_GLOBALS._v4CEAA == 3) + scene->_object2.setAction(&scene->_sequenceManager3, NULL, 3119, &scene->_object2, NULL); + BF_GLOBALS._player.enableControl(); + remove(); + default: + break; + } +} + +void Scene115::Action3::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + setAction(&scene->_sequenceManager4, this, 3117, &scene->_object7, NULL); +} + +void Scene115::Action4::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(145, 107); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 1: + BF_GLOBALS._player.setStrip(4); + SceneItem::display(115, 27, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + scene->_object12.animate(ANIM_MODE_NONE); + setDelay(10); + break; + case 2: + setAction(&scene->_sequenceManager1, this, 117, &scene->_object12, &scene->_object11, NULL); + break; + case 3: + scene->_sound1.play(81, &scene->_item1, 127); + BF_GLOBALS._player.enableControl(); + remove(); + default: + break; + } +} + +void Scene115::Action5::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (scene->_item1._field1F8A == 0) { + setAction(&scene->_sequenceManager5, this, 1115, &scene->_object1, NULL); + } else { + _actionIndex--; + setDelay(120); + } + break; + case 1: + setAction(&scene->_sequenceManager5, this, 117, &scene->_object12, &scene->_object11, NULL); + break; + case 2: + scene->_sound1.play(81, &scene->_item1, 127); + scene->_item1._field1F8A = 1; + setDelay(3); + break; + case 3: + setAction(&scene->_sequenceManager5, this, 1116, &scene->_object1, NULL); + break; + case 4: + scene->_field31E8 = 0; + remove(); + default: + break; + } +} + +void Scene115::Action6::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 2115, &scene->_object1, &BF_GLOBALS._player, NULL); + break; + case 1: + if (scene->_sceneMode == 9999) { + setAction(&scene->_sequenceManager1, this, 4115, &scene->_object1, &BF_GLOBALS._player, NULL); + _actionIndex--; + scene->_sceneMode = 1166; + } else { + scene->_stripManager.start(scene->_sceneMode, this); + } + break; + case 2: + scene->_object1.setVisage(131); + scene->_object1.setStrip(1); + scene->_object1.setFrame(1); + scene->_object1.setPosition(Common::Point(122, 97)); + BF_GLOBALS._player.enableControl(); + remove(); + default: + break; + } +} + +void Scene115::Action7::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + BF_GLOBALS._player.disableControl(); + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(142, 105); + BF_GLOBALS._player.addMover(mover, &destPos, this); + } + break; + case 1: + BF_GLOBALS._player.setStrip(4); + if (BF_GLOBALS._v4CEB0 == 0) + scene->_stripManager.start(1156, this); + else + scene->_stripManager.start(1157, this); + BF_GLOBALS._v4CEB0++; + break; + case 2: + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene115::Action8::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setAction(&scene->_sequenceManager1, this, 2115, &scene->_object1, &BF_GLOBALS._player, NULL); + break; + case 1: + T2_GLOBALS._uiElements.addScore(30); + setAction(&scene->_sequenceManager1, this, 4115, &scene->_object1, &BF_GLOBALS._player, NULL); + break; + case 2: + scene->_stripManager.start(1160, this); + break; + case 3: + scene->_stripManager.start(1161, this); + break; + case 4: + BF_GLOBALS.setFlag(fGivenNapkin); + setAction(&scene->_sequenceManager1, this, 2117, &scene->_object1, &BF_GLOBALS._player, &scene->_object13, NULL); + break; + case 5: + BF_INVENTORY.setObjectScene(INV_NAPKIN, 1); + T2_GLOBALS._uiElements.addScore(10); + scene->_object1.setVisage(131); + scene->_object1.setStrip(1); + scene->_object1.setFrame(1); + scene->_object1.setPosition(Common::Point(122, 97)); + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene115::Action9::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + if (scene->_object2._position.x > 67) + scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1118, &scene->_object2, NULL); + else if (scene->_object2._position.x != 67) + scene->_object2.setAction(&scene->_sequenceManager3, NULL, 1119, &scene->_object2, NULL); + BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 1117, &BF_GLOBALS._player, NULL); + break; + case 1: + scene->_stripManager.start(scene->_sceneMode, this); + break; + case 2: + scene->_object2.setAction(&scene->_sequenceManager3, this, 3119, &scene->_object2, NULL); + break; + case 3: + BF_GLOBALS._player.enableControl(); + remove(); + default: + break; + } +} + +Scene115::Scene115() : SceneExt () { + _field168A = _field31E8 = _field31EA = 0; +} + +void Scene115::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + + BF_GLOBALS._sound1.fadeSound(15); + loadScene(115); + setZoomPercents(98, 85, 115, 100); + _field31E8 = 0; + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_kateSpeaker); + _stripManager.addSpeaker(&_tonySpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + _object6.postInit(); + _object6.setVisage(121); + _object6.setPosition(Common::Point(82, 66)); + _object6._frame = 1; + _object6.setStrip(5); + _object6.changeZoom(100); + _object6.fixPriority(95); + + _object5.postInit(); + _object5.setVisage(121); + _object5.setPosition(Common::Point(111, 64)); + _object5._frame = 1; + _object5.setStrip(6); + _object5.changeZoom(100); + _object5.fixPriority(95); + + // Bartender + _object2.postInit(); + _object2.setVisage(132); + _object2.setPosition(Common::Point(74, 66)); + _object2.setStrip(3); + _object2.setFrame(1); + _object2.fixPriority(95); + _object2.animate(ANIM_MODE_2, NULL); + _object2._numFrames = 5; + _object2._field15F8 = 0; + _field31EA = 0; + + //Neon sign + _object7.postInit(); + _object7.setVisage(115); + _object7.setStrip(4); + _object7.setFrame(1); + _object7.setPosition(Common::Point(262, 29)); + _object7.setAction(&_action3); + + _object11.postInit(); + _object11.hide(); + + _object12.postInit(); + _object12.hide(); + + _object13.postInit(); + _object13.hide(); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(129); + BF_GLOBALS._player.setStrip(3); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.changeZoom(-1); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _object4.postInit(); + _object4.setVisage(469); + _object4.animate(ANIM_MODE_1, NULL); + _object4.setStrip2(1); + _object4.setPosition(Common::Point(-20, 155)); + Common::Point destPos(17, 118); + NpcMover *mover = new NpcMover(); + _object4.addMover(mover, &destPos, NULL); + BF_GLOBALS._sceneItems.push_front(&_object4); + BF_GLOBALS._walkRegions.proc1(1); + } else if (BF_GLOBALS.getFlag(onDuty)) + BF_GLOBALS._player.setVisage(1341); + + if (BF_GLOBALS._dayNumber == 3) { + _object3.postInit(); + _object3.setVisage(123); + _object3.setPosition(Common::Point(212, 108)); + _object3.setAction(&_action1); + _field168A = 0; + BF_GLOBALS._sceneItems.push_front(&_object3); + + _object8.postInit(); + _object8.setVisage(115); + _object8.setPosition(Common::Point(330, 87)); + _object8.setStrip(3); + _object8.fixPriority(112); + + _object9.postInit(); + _object9.setVisage(115); + _object9.setPosition(Common::Point(330, 87)); + _object9.setStrip(3); + _object9.fixPriority(112); + + _object10.postInit(); + _object10.setVisage(115); + _object10.setPosition(Common::Point(330, 87)); + _object10.setStrip(3); + _object10.fixPriority(112); + + if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) { + _object1.postInit(); + _object1.setVisage(131); + _object1.setPosition(Common::Point(122, 97)); + _object1.setStrip(1); + _object1.setFrame(1); + _object1.changeZoom(100); + _object1.fixPriority(95); + BF_GLOBALS._sceneItems.push_front(&_object1); + } + addTimer(&_eventHandler1); + } + BF_GLOBALS._sceneItems.push_front(&_object2); + + _item11.setDetails(16, 115, 4, 15, 21, 1); + _item12.setDetails(20, 115, 5, 15, 21, 1); + _item13.setDetails(31, 115, 6, 16, 22, 1); + _item14._sceneRegionId = 13; + BF_GLOBALS._sceneItems.push_front(&_item14); + _item10.setDetails(Rect(0, 147, 30, 167), 115, -1, -1, -1, 1, NULL); + // SUB_177B8 + addTimer(&_item1); + _item1.setDetails(Rect(147, 45, 179, 91), 115, 25, 26, 27, 1, NULL); + // + _item6.setDetails(Rect(107, 43, 122, 61), 115, 28, 29, 30, 1, NULL); + _item7.setDetails(Rect(180, 33, 230, 63), 115, 31, 32, 33, 1, NULL); + _item8.setDetails(Rect( 0, 35, 96, 66), 115, 34, 35, 36, 1, NULL); + _item2.setDetails(Rect( 0, 65, 135, 95), 115, 0, 12, 18, 1, NULL); + _item4.setDetails(Rect(104, 0, 150, 90), 115, 2, 14, 20, 1, NULL); + _item5.setDetails(Rect(148, 0, 320, 93), 115, 3, 14, 20, 1, NULL); + _item3.setDetails(Rect( 0, 95, 320, 168), 115, 1, 13, 19, 1, NULL); + _item9.setDetails(Rect( 0, 0, 320, 168), 115, 11, 17, 24, 1, NULL); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 5115; + setAction(&_sequenceManager1, this, 5115, &BF_GLOBALS._player, NULL); +} + +void Scene115::signal() { + switch (_sceneMode) { + + case 1150: + BF_GLOBALS._sceneManager.changeScene(114); + break; + case 1: + BF_GLOBALS._player.updateAngle(_object3._position); + SceneItem::display(115, 38 + _field168A, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + _field168A++; + if (_field168A >= 4) + _field168A = 0; + // No break on purpose + case 0: + // No break on purpose + case 5115: + // No break on purpose + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene115::process(Event &event) { + SceneExt::process(event); + if (!BF_GLOBALS._player._enabled) + return; + if (event.mousePos.y >= 167) + return; + if (_item10._bounds.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + BF_GLOBALS._events.setCursor(surface); + } else { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } +} + +void Scene115::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field168A); + s.syncAsSint16LE(_field31E8); + s.syncAsSint16LE(_field31EA); +} + +/*-------------------------------------------------------------------------- + * Scene 125 - Intro - Chase in the city + * + *--------------------------------------------------------------------------*/ +void Scene125::Action1::signal() { + Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 1: { + Common::Point destPos(214, 105); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 2: + owner->animate(ANIM_MODE_4, 4, 1, this); + break; + case 3: + owner->setFrame(5); + scene->_object2.show(); + setDelay(180); + break; + case 4: { + Common::Point destPos(311, 85); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 5: + owner->remove(); + break; + case 0: + // No break on purpose + default: + break; + } +} + +void Scene125::Action2::signal() { + Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + scene->_action1.signal(); + setDelay(20); + break; + case 2: { + BF_GLOBALS._v501FA = 10; + BF_GLOBALS._v51C44 = 1; + Common::Point destPos(202, 94); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 3: { + scene->_action3.signal(); + Common::Point destPos(280, 84); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 4: + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 5: { + Common::Point destPos(375, 111); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 6: + BF_GLOBALS._player.setStrip(2); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 7: { + Common::Point destPos(347, 139); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 8: + BF_GLOBALS._player.setStrip(3); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 9: { + Common::Point destPos(107, 75); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + BF_GLOBALS._player.setPriority(80); + break; + } + case 10: + BF_GLOBALS._player.setStrip(4); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 11: { + BF_GLOBALS._player.setPriority(64); + Common::Point destPos(229, 61); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 12: + scene->_action3.signal(); + BF_GLOBALS._player.remove(); + default: + break; + } +} + +void Scene125::Action2::dispatch() { + Action::dispatch(); + + if ((_actionIndex == 10) && (BF_GLOBALS._player._percent > 80)) + BF_GLOBALS._player.changeZoom(BF_GLOBALS._player._percent - 1); + + if ((_actionIndex == 12) && (BF_GLOBALS._player._percent > 50)) + BF_GLOBALS._player.changeZoom(BF_GLOBALS._player._percent - 1); +} + +void Scene125::Action3::signal() { + Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + break; + case 1: { + Common::Point destPos(202, 94); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 2: { + Common::Point destPos(275, 84); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 3: + scene->_soundExt2.fadeSound(20); + owner->fixPriority(70); + owner->animate(ANIM_MODE_5, this); + break; + case 4: { + Common::Point destPos(375, 111); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 5: + owner->setStrip(2); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 6: { + Common::Point destPos(347, 145); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 7: + owner->setStrip(3); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 8: { + Common::Point destPos(96, 71); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + owner->_moveDiff.x = 6; + owner->_moveDiff.y = 6; + owner->setPriority(80); + break; + } + case 9: + owner->setPosition(Common::Point(85, 76)); + owner->setStrip(4); + owner->setFrame(1); + owner->changeZoom(100); + owner->animate(ANIM_MODE_5, this); + break; + case 10: { + scene->_action5.signal(); + scene->_soundExt1.play(25); + Common::Point destPos(154, 94); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 11: + break; + case 12: + scene->_object1.setPosition(owner->_position); + scene->_object1.changeZoom(2); + scene->_object1.show(); + setDelay(1); + case 13: + BF_GLOBALS._sound1.play(6); + scene->_object1.changeZoom(4); + scene->_object1.setPosition(Common::Point(148, 88)); + setDelay(1); + break; + case 14: + scene->_object1.changeZoom(8); + scene->_object1.setPosition(Common::Point(167, 97)); + setDelay(1); + break; + case 15: + scene->_object1.changeZoom(16); + scene->_object1.setPosition(Common::Point(197, 104)); + scene->_object4.show(); + scene->_object3.show(); + scene->_object4.changeZoom(16); + scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 9, scene->_object1._position.y - 8)); + scene->_object3.changeZoom(16); + scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 5, scene->_object1._position.y - 8)); + setDelay(1); + break; + case 16: + scene->_object1.changeZoom(32); + scene->_object1.setPosition(Common::Point(197, 104)); + scene->_object4.changeZoom(32); + scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 17, scene->_object1._position.y - 15)); + scene->_object3.changeZoom(32); + scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 12, scene->_object1._position.y - 15)); + setDelay(1); + break; + case 17: + scene->_object1.changeZoom(64); + scene->_object1.setPosition(Common::Point(198, 114)); + scene->_object4.changeZoom(64); + scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 34, scene->_object1._position.y - 29)); + scene->_object3.changeZoom(64); + scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 23, scene->_object1._position.y - 29)); + setDelay(1); + break; + case 18: + scene->_object1.changeZoom(100); + scene->_object1.setPosition(Common::Point(160, 112)); + scene->_object4.changeZoom(100); + scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 51, scene->_object1._position.y - 45)); + scene->_object3.changeZoom(100); + scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 42, scene->_object1._position.y - 45)); + scene->_object4.animate(ANIM_MODE_5, this); + scene->_object3.animate(ANIM_MODE_5, this); + setDelay(1); + break; + case 19: + break; + case 20: + setDelay(30); + break; + case 21: + BF_GLOBALS._sceneManager.changeScene(140); + break; + default: + break; + } +} + +void Scene125::Action3::dispatch() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + Action::dispatch(); + + if ((_actionIndex == 9) && (owner->_percent > 70)) + owner->changeZoom(owner->_percent - 1); +} + +void Scene125::Action4::signal() { + Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + setDelay(180); + break; + case 1: { + owner->setPriority(scene->_object2._priority - 1); + Common::Point destPos(66, 168); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 2: + owner->animate(ANIM_MODE_5, this); + break; + case 3: { + Common::Point destPos(307, 106); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 4: + owner->remove(); + break; + default: + break; + } +} + +void Scene125::Action4::dispatch() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + Action::dispatch(); + + if ((_actionIndex == 4) && (owner->_percent > 80)) + owner->changeZoom(owner->_percent - 1); +} + +void Scene125::Action5::signal() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + if (_actionIndex++ == 1) { + Common::Point destPos(162, 103); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + } +} + +void Scene125::Action6::signal() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: { + Common::Point destPos(410, 181); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 2: + owner->remove(); + default: + break; + } +} + +void Scene125::Action6::dispatch() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + Action::dispatch(); + + if ((_actionIndex == 2) && (owner->_percent < 100)) + owner->changeZoom(owner->_percent + 1); +} + +void Scene125::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(120); + + _object4.postInit(); + _object4.setVisage(124); + _object4.setPosition(Common::Point(0, 0)); + _object4.setStrip(1); + _object4.setFrame(1); + _object4.fixPriority(251); + _object4.hide(); + + _object3.postInit(); + _object3.setVisage(124); + _object3.setPosition(Common::Point(0, 0)); + _object3.setStrip(2); + _object3.setFrame(1); + _object3.fixPriority(251); + _object3.hide(); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(127); + BF_GLOBALS._player.setPosition(Common::Point(160, 110)); + BF_GLOBALS._player.setStrip(1); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.changeZoom(100); + BF_GLOBALS._player.fixPriority(68); + BF_GLOBALS._player._moveDiff.x = 6; + BF_GLOBALS._player._moveDiff.y = 6; + BF_GLOBALS._player.disableControl(); + + _object5.postInit(); + _object5.setVisage(128); + _object5.setPosition(Common::Point(150, 117)); + _object5.fixPriority(68); + _object5._moveDiff.x = 6; + _object5._moveDiff.y = 6; + + _object9.postInit(); + _object9.setVisage(126); + _object9.setPosition(Common::Point(124, 106)); + _object9.setStrip(4); + _object9.fixPriority(90); + _object9._moveDiff.x = 3; + _object9._moveDiff.y = 3; + + _object1.postInit(); + _object1.setVisage(130); + _object1.setPosition(Common::Point(139, 88)); + _object1.setStrip(1); + _object1.setFrame(1); + _object1.changeZoom(100); + _object1.fixPriority(250); + _object1.hide(); + + _object8.postInit(); + _object8.setVisage(126); + _object8.setPosition(Common::Point(89, 181)); + _object8.setStrip(3); + _object8._moveDiff.x = 6; + _object8._moveDiff.y = 6; + + _object6.postInit(); + _object6.setVisage(126); + _object6.setPosition(Common::Point(289, 128)); + _object6.fixPriority(69); + _object6._moveDiff.x = 6; + _object6._moveDiff.y = 6; + _object6.setAction(&_action1); + + _object2.postInit(); + _object2.setVisage(126); + _object2.setPosition(Common::Point(214, 105)); + _object2.setStrip(2); + _object2.setFrame(1); + _object2.changeZoom(100); + _object2.fixPriority(63); + _object2.hide(); + + _object7.postInit(); + _object7.setVisage(126); + _object7.setPosition(Common::Point(87, 76)); + _object7.setStrip(6); + _object7.setFrame(6); + _object7.changeZoom(80); + _object7._moveDiff.x = 4; + _object7._moveDiff.y = 4; + _object7.setAction(&_action6); + + BF_GLOBALS._sound1.play(5); + setAction(&_action2); + _object5.setAction(&_action3); + _object8.setAction(&_action4); + _object9.setAction(&_action5); +} + +/*-------------------------------------------------------------------------- + * Scene 140 - Intro - Near the house + * + *--------------------------------------------------------------------------*/ + +void Scene140::Action1::signal() { + Scene140 *scene = (Scene140 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + scene->loadScene(999); + setDelay(2); + break; + case 1: + BF_GLOBALS._scenePalette.loadPalette(2); + BF_GLOBALS._scenePalette.refresh(); + scene->_text.setup(BF_19840518, this); + break; + case 2: + scene->_object1.show(); + scene->loadScene(140); + setDelay(1); + break; + case 3: { + Common::Point destPos(236, 144); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + owner->_numFrames = 7; + break; + } + case 4: + owner->setStrip(3); + owner->setFrame(1); + owner->_numFrames = 5; + owner->setPosition(Common::Point(226, 143)); + owner->animate(ANIM_MODE_5, this); + break; + case 5: + owner->setStrip(4); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 6: + scene->_object1.animate(ANIM_MODE_5, this); + owner->setStrip(1); + owner->setFrame(1); + break; + case 7: + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x, owner->_position.y + 1)); + owner->animate(ANIM_MODE_5, this); + break; + case 8: + owner->animate(ANIM_MODE_6, this); + owner->_numFrames = 10; + break; + case 9: + owner->_numFrames = 5; + owner->setPosition(Common::Point(217, 117)); + owner->setStrip(2); + owner->animate(ANIM_MODE_5, this); + break; + case 10: + owner->setPosition(Common::Point(212, 117)); + setDelay(10); + // No break on purpose + case 11: + owner->setPosition(owner->_position, 1000); + setDelay(60); + break; + case 12: + BF_GLOBALS._sound1.play(8); + setDelay(60); + // No break on purpose + case 13: + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(150); + default: + break; + } +} + +void Scene140::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(999); + + _object2.postInit(); + _object2.setVisage(141); + _object2.setPosition(Common::Point(333, 149)); + _object2.setStrip(5); + _object2.animate(ANIM_MODE_1, NULL); + _object2._moveDiff.x = 3; + + _object1.postInit(); + _object1.setVisage(141); + _object1.setPosition(Common::Point(202, 115)); + _object1.setFrame(1); + _object1.setStrip(6); + _object1.changeZoom(100); + _object1.hide(); + + BF_GLOBALS._v5020C = 0; + BF_GLOBALS._v501F8 = 300; + BF_GLOBALS._v501FC = 90; + BF_GLOBALS._sound1.play(7); + + _object2.setAction(&_action1); +} + +/*-------------------------------------------------------------------------- + * Scene 150 - Intro - Burglar inside the house + * + *--------------------------------------------------------------------------*/ +void Scene150::Action1::signal() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + static uint32 v50B96 = 0; + + switch (_actionIndex++) { + case 0: + _actionIndex = 5; + _object2.postInit(); + _object2.setVisage(150); + _object2.setStrip(3); + _object2._frame = 1; + _object2.setPosition(Common::Point(148, 126)); + _object2.changeZoom(100); + setDelay(10); + break; + case 1: + owner->animate(ANIM_MODE_5, this); + break; + case 2: + owner->_frame = 1; + owner->setStrip(4); + owner->animate(ANIM_MODE_4, 3, 1, this); + break; + case 3: + owner->animate(ANIM_MODE_5, this); + _object2.animate(ANIM_MODE_5, this); + break; + case 4: + _object2.remove(); + break; + case 5: + owner->_numFrames = 8; + owner->_frame = 1; + owner->setStrip(2); + owner->animate(ANIM_MODE_4, 14, 1, this); + break; + case 6: + owner->fixPriority(119); + owner->animate(ANIM_MODE_5, this); + break; + case 7: + setDelay(60); + break; + case 8: + BF_GLOBALS._sound1.stop(); + // No break on purpose + case 9: + _sound1.play(8); + setDelay(30); + break; + case 10: + BF_GLOBALS._scenePalette.addFader((const byte *)&v50B96, 1, 2, this); + break; + case 11: + BF_GLOBALS._sound1.play(9); + BF_GLOBALS._sceneManager.changeScene(160); + break; + default: + break; + } +} + +void Scene150::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(150); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setPosition(Common::Point(160, 100)); + BF_GLOBALS._player._moveDiff.x = 15; + BF_GLOBALS._player.hide(); + + _object1.postInit(); + _object1.setVisage(150); + _object1.setPosition(Common::Point(158, 119)); + _object1._numFrames = 5; + _object1.fixPriority(121); + _object1.setAction(&_action1); +} + +/*-------------------------------------------------------------------------- + * Scene 160 - Intro - Burial + * + *--------------------------------------------------------------------------*/ +void Scene160::Action1::signal() { + Scene160 *scene = (Scene160 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + break; + case 1: + scene->_kid.animate(ANIM_MODE_5, this); + break; + case 2: + // No break on purpose + case 10: + scene->_grandma.animate(ANIM_MODE_5, this); + break; + case 3: + // No break on purpose + case 6: + scene->_kid.animate(ANIM_MODE_6, this); + break; + case 4: + scene->_kid.setPosition(Common::Point(scene->_kid._position.x - 2, scene->_kid._position.y + 19)); + scene->_kid.setFrame(1); + scene->_kid.setStrip(2); + scene->_kid.animate(ANIM_MODE_5, this); + + scene->_kidBody.setPosition(scene->_kid._position); + scene->_kidBody.setFrame(1); + scene->_kidBody.setStrip(3); + break; + case 5: + setDelay(60); + break; + case 7: + scene->_kidBody.remove(); + scene->_kid.setStrip(6); + scene->_kid.setFrame(1); + scene->_kid.setPosition(Common::Point(scene->_kid._position.x - 4, scene->_kid._position.y + 19)); + scene->_grandma.animate(ANIM_MODE_6, this); + scene->_grandma._numFrames = 7; + break; + case 8: + scene->_grandma.setStrip(2); + scene->_grandma.setFrame(1); + scene->_grandma.animate(ANIM_MODE_5, this); + break; + case 9: + setDelay(120); + break; + default: + break; + } +} + +void Scene160::Action2::signal() { + Scene160 *scene = (Scene160 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + static uint32 v50BAB = 0; + static uint32 v50BC3 = 0; + + switch (_actionIndex++) { + case 0: + break; + case 1: + owner->animate(ANIM_MODE_5, this); + owner->_numFrames = 8; + break; + case 2: + owner->setStrip(2); + owner->setFrame(1); + owner->setPosition(Common::Point(scene->_flag._position.x + 56, scene->_flag._position.y + 2)); + owner->animate(ANIM_MODE_5, this); + break; + case 3: + owner->setStrip(3); + owner->setFrame(1); + owner->setPosition(Common::Point(scene->_flag._position.x + 26, scene->_flag._position.y - 8)); + owner->animate(ANIM_MODE_4, 8, 1, this); + break; + case 4: + scene->_flag.remove(); + owner->animate(ANIM_MODE_5, this); + break; + case 5: + owner->setVisage(162); + owner->setStrip(1); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x + 27, owner->_position.y + 11)); + owner->animate(ANIM_MODE_5, this); + break; + case 6: + owner->setStrip(2); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x - 42, owner->_position.y + 15)); + owner->animate(ANIM_MODE_5, this); + break; + case 7: + owner->setStrip(3); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x + 1, owner->_position.y)); + owner->animate(ANIM_MODE_5, this); + break; + case 8: + owner->setStrip(4); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x - 3, owner->_position.y - 1)); + + scene->_leftOfficer.show(); + scene->_leftOfficer.setStrip(1); + scene->_leftOfficer.setFrame(1); + scene->_leftOfficer.setPosition(Common::Point(owner->_position.x + 8, owner->_position.y - 39)); + scene->_leftOfficer._numFrames = 5; + scene->_leftOfficer.animate(ANIM_MODE_5, this); + break; + case 9: + setDelay(30); + break; + case 10: + scene->_leftOfficer.hide(); + owner->setVisage(163); + owner->setStrip(2); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x + 39, owner->_position.y)); + owner->animate(ANIM_MODE_5, this); + break; + case 11: + scene->_leftOfficer.fixPriority(owner->_priority + 1); + setDelay(60); + break; + case 12: + scene->_leftOfficer.show(); + scene->_leftOfficer.setPosition(Common::Point(owner->_position.x - 32, owner->_position.y - 38)); + scene->_leftOfficer.setStrip(3); + scene->_leftOfficer.setFrame(1); + + owner->setVisage(165); + owner->setPosition(Common::Point(owner->_position.x + 6, owner->_position.y - 3)); + owner->setStrip(1); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 13: { + owner->setStrip(2); + owner->setFrame(1); + owner->changeZoom(110); + owner->animate(ANIM_MODE_1, NULL); + Common::Point destPos(scene->_kid._position.x - 25, scene->_kid._position.y + 15); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 14: + owner->changeZoom(100); + owner->setStrip(5); + owner->setFrame(1); + scene->_kid.animate(ANIM_MODE_4, 5, 1, this); + break; + case 15: + owner->animate(ANIM_MODE_5, this); + scene->_kid.animate(ANIM_MODE_5, NULL); + break; + case 16: + owner->setStrip(6); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x - 8, owner->_position.y + 3)); + owner->animate(ANIM_MODE_5, this); + break; + case 17: + setDelay(70); + break; + case 18: + owner->animate(ANIM_MODE_6, this); + break; + case 19: + setDelay(120); + break; + case 20: + BF_GLOBALS._sound1.changeSound(10); + BF_GLOBALS._scenePalette.addFader((const byte *)&v50BAB, 1, 2, this); + break; + case 21: + BF_GLOBALS._scenePalette.loadPalette(2); + scene->loadScene(999); + setDelay(2); + break; + case 22: + scene->_sceneBounds.set(0, 0, 320, 200); + scene->_text.setup(BF_11_YEARS, this); + break; + case 23: + BF_GLOBALS._scenePalette.loadPalette(2); + scene->loadScene(165); + BF_GLOBALS._scenePalette.addFader((const byte *)&v50BC3, 1, -5, this); + break; + case 24: + setDelay(900); + break; + case 25: + BF_GLOBALS._sound1.fade(0, 10, 10, true, this); +// FIXME: Currently, fade() doesn't end properly with this song, +// thus never returns here. This hack skips the wait and changes +// directly to the next scene +// Start of hack +// break; +// case 26: + setDelay(5); + BF_GLOBALS._sound1.stop(); +// End of hack + + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(200); + break; + default: + break; + } +} + +void Scene160::Action2::process(Event &event) { + if ((event.handled) || (event.eventType == 5)) + return; + + if (_actionIndex == 25) { + event.handled = true; + setDelay(1); + } +} + +void Scene160::Action3::signal() { + Scene160 *scene = (Scene160 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_text.setup(BF_3_DAYS, this); + break; + case 1: { + Common::Point destPos(720, 100); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 2: + scene->_action1.signal(); + scene->_action2.signal(); + break; + default: + break; + } +} + +void Scene160::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(160); + _sceneBounds.moveTo(0, 0); + + BF_GLOBALS._scenePalette.loadPalette(2); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setPosition(Common::Point(160, 100)); + BF_GLOBALS._player._moveDiff.x = 15; + BF_GLOBALS._player.hide(); + + _grandma.postInit(); + _grandma.setVisage(54); + _grandma.setPosition(Common::Point(712, 97)); + _grandma.fixPriority(66); + + _kid.postInit(); + _kid.setPosition(Common::Point(732, 65)); + _kid.setVisage(164); + _kid.setStrip(4); + _kid.fixPriority(68); + + _kidBody.postInit(); + _kidBody.setPosition(Common::Point(_kid._position.x, _kid._position.y)); + _kidBody.setVisage(164); + _kidBody.setStrip(5); + _kidBody.fixPriority(68); + + _flag.postInit(); + _flag.setPosition(Common::Point(645, 116)); + _flag.setVisage(161); + _flag.setStrip(4); + _flag.fixPriority(80); + + _rightOfficer.postInit(); + _rightOfficer.setVisage(161); + _rightOfficer.setPosition(Common::Point(_flag._position.x + 58, _flag._position.y + 11)); + _rightOfficer.fixPriority(81); + + _leftOfficer.postInit(); + _leftOfficer.setVisage(163); + _leftOfficer.setPosition(Common::Point(620, 79)); + _leftOfficer.setStrip(3); + _leftOfficer.fixPriority(81); + _leftOfficer.hide(); + + _rightOfficer.setAction(&_action2); + _grandma.setAction(&_action1); + setAction(&_action3); + + _sceneBounds.center(BF_GLOBALS._player._position.x, BF_GLOBALS._player._position.y); +} + +/*-------------------------------------------------------------------------- + * Scene 180 - Front of Home + * + *--------------------------------------------------------------------------*/ + +bool Scene180::Vechile::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) { + BF_GLOBALS._sceneManager.changeScene(60); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene180::GarageExit::startAction(CursorType action, Event &event) { + Scene180 *scene = (Scene180 *)BF_GLOBALS._sceneManager._scene; + + if (scene->_garageExit.contains(event.mousePos)) { + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 256, 114); + return true; + } else { + return false; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene180::Scene180(): SceneExt() { + _fieldC56 = 0; +} + +void Scene180::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_fieldC56); +} + +void Scene180::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + + if (((BF_GLOBALS._bookmark == bLyleStoppedBy) && (BF_GLOBALS._dayNumber == 1)) || + ((BF_GLOBALS._bookmark == bDroppedOffLyle) && (BF_GLOBALS._dayNumber == 3)) || + ((BF_GLOBALS._bookmark == bDoneAtLyles) && (BF_GLOBALS._dayNumber == 4))) + loadScene(999); + else + loadScene(1180); + _garageExit.setDetails(Rect(243, 93, 275, 122), 180, -1, -1, -1, 1, NULL); + _gameTextSpeaker._textPos.y = 180; + _stripManager.addSpeaker(&_gameTextSpeaker); + _fieldC56 = 0; + setZoomPercents(121, 60, 125, 70); + + if ((BF_GLOBALS._bookmark == bLyleStoppedBy) && (BF_GLOBALS._dayNumber == 1)) { + BF_GLOBALS._v501FC = 87; + BF_GLOBALS._v501FA = _sceneBounds.left + 10; + // CHECKME: BF_GLOBALS._v50206 = 18; ?? + _sceneMessage.setup(THE_NEXT_DAY); + _sceneMode = 6; + setAction(&_sceneMessage, this); + BF_GLOBALS._driveFromScene = 4; + BF_GLOBALS._driveToScene = 4; + BF_GLOBALS._mapLocationId = 4; + } else if (((BF_GLOBALS._bookmark == bDroppedOffLyle) && (BF_GLOBALS._dayNumber == 3)) || + ((BF_GLOBALS._bookmark == bDoneAtLyles) && (BF_GLOBALS._dayNumber == 4))) { + BF_GLOBALS._v501FC = 87; + BF_GLOBALS._v501FA = _sceneBounds.left + 10; + // CHECKME: BF_GLOBALS._v50206 = 18; ?? + _sceneMessage.setup(THE_NEXT_DAY); + _sceneMode = 6; + setAction(&_sceneMessage, this); + } else if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._player.setPosition(Common::Point(0, 150)); + _vechile.postInit(); + _garageExit.postInit(); + + BF_GLOBALS._driveToScene = 190; + BF_GLOBALS._sound1.play(31); + BF_GLOBALS._sound1.holdAt(1); + _sceneMode = 1800; + + setAction(&_sequenceManager, this, 1800, &_vechile, &_object1, NULL); + } else if (BF_GLOBALS._driveFromScene == 180) { + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(831); + BF_GLOBALS._player.setPosition(Common::Point(285, 125)); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player._strip = 3; + BF_GLOBALS._player.changeZoom(-1); + + _vechile.postInit(); + _vechile.setVisage(580); + _vechile.setStrip(2); + _vechile.setPosition(Common::Point(262, 131)); + _vechile.setZoom(65); + _vechile.setDetails(180, 33, 34, 35, 1, NULL); + + _object1.postInit(); + _object1.setVisage(182); + _object1.setStrip(2); + _object1.setPosition(Common::Point(258, 122)); + _object1.setFrame(6); + + BF_GLOBALS._driveFromScene = 0; + BF_GLOBALS._player.enableControl(); + } else if (BF_GLOBALS._driveToScene != 180) { + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.disableControl(); + + _vechile.postInit(); + _vechile.setDetails(180, 33, 34, 35, 1, NULL); + + _object1.postInit(); + + BF_GLOBALS._driveFromScene = 4; + BF_GLOBALS._driveToScene = 4; + BF_GLOBALS._mapLocationId = 4; + + BF_GLOBALS._sound1.fadeSound(33); + _sceneMode = 1801; + setAction(&_sequenceManager, this, 1801, &BF_GLOBALS._player, &_vechile, &_object1, NULL); + } else { + BF_GLOBALS._driveFromScene = 0; + if (!BF_GLOBALS.getFlag(onDuty) && !BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._player.setPosition(Common::Point(0, 150)); + + _object1.postInit(); + _object1.setVisage(182); + _object1.setStrip(2); + _object1.setPosition(Common::Point(258, 122)); + + _vechile.postInit(); + _vechile.setVisage(181); + _vechile.setStrip(2); + _vechile.changeZoom(80); + _vechile.fixPriority(150); + _vechile._moveDiff = Common::Point(40, 5); + _vechile.setPosition(Common::Point(-25, 171)); + + _fieldC56 = 1; + + BF_GLOBALS._sound1.play(29); + _sceneMode = 1; + ADD_MOVER(_vechile, 259, 150); + } else { + BF_GLOBALS._player.setPosition(Common::Point(0, 150)); + + _object1.postInit(); + _object1.setVisage(182); + _object1.setStrip(2); + _object1.setPosition(Common::Point(258, 122)); + + _vechile.postInit(); + if (BF_GLOBALS.getFlag(onDuty)) { + BF_GLOBALS._sound1.play(29); + + _vechile.setVisage(191); + _vechile.setStrip(3); + _vechile._frame = 5; + _vechile.changeZoom(75); + + _fieldC56 = 1; + _vechile._moveDiff.x = 45; + } else { + _vechile.setVisage(444); + _vechile.setStrip(2); + _vechile.changeZoom(85); + + _fieldC56 = 3; + _vechile._moveDiff.x = 30; + } + + _vechile.fixPriority(150); + _vechile._moveDiff.y = 5; + _vechile.setPosition(Common::Point(-25, 171)); + + _sceneMode = 3; + ADD_MOVER(_vechile, 258, 145); + } + } + + if (_sceneMode != 6) { + _frontDoor.setDetails(Rect(183, 92, 218, 122), 180, 27, 28, 29, 1, NULL); + _driveway.setDetails(8, 180, 36, 37, 38, 1); + _street.setDetails(1, 180, 21, 22, 23, 1); + _lawn.setDetails(3, 180, 18, 19, 20, 1); + _bushes.setDetails(4, 180, 15, 16, 17, 1); + _palms.setDetails(6, 180, 12, 13, 14, 1); + _garage.setDetails(Rect(241, 85, 319, 121), 180, 30, 31, 32, 1, NULL); + _fence.setDetails(Rect(0, 109, 21, 125), 180, 9, 10, 11, 1, NULL); + _house.setDetails(5, 180, 24, 25, 26, 1); + _steps.setDetails(7, 180, 6, 7, 8, 1); + _curb.setDetails(2, 180, 3, 4, 5, 1); + _sky.setDetails(Rect(0, 0, 319, 190), 180, 0, 1, 2, 1, NULL); + } +} + +void Scene180::signal() { + switch (_sceneMode) { + case 1: + _fieldC56 = 0; + switch (BF_GLOBALS._bookmark) { + case bFlashBackThree: + BF_GLOBALS._bookmark = bDroppedOffLyle; + _sceneMode = 7; + break; + case bDoneWithIsland: + BF_GLOBALS._bookmark = bDoneAtLyles; + _sceneMode = 8; + break; + default: + _sceneMode = 1802; + break; + } + + setAction(&_sequenceManager, this, 1802, &_vechile, &_object1, NULL); + break; + case 2: + _fieldC56 = 0; + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(BF_GLOBALS._driveToScene); + break; + case 3: + _fieldC56 = 0; + BF_GLOBALS._sound1.stop(); + _stripManager.start(1800, this); + _sceneMode = 4; + break; + case 4: + _sceneMode = 5; + BF_GLOBALS._sound1.fadeSound(29); + ADD_MOVER(_vechile, 340, 140); + _vechile._moveDiff.y = 1; + break; + case 5: + BF_GLOBALS._sceneManager.changeScene(50); + break; + case 6: + loadScene(1180); + BF_GLOBALS._sound1.fadeSound(33); + + switch (BF_GLOBALS._bookmark) { + case bLyleStoppedBy: + BF_GLOBALS._dayNumber = 2; + BF_INVENTORY.alterInventory(2); + break; + case bDroppedOffLyle: + BF_GLOBALS._dayNumber = 4; + BF_INVENTORY.alterInventory(4); + break; + case bDoneAtLyles: + BF_GLOBALS._dayNumber = 5; + BF_INVENTORY.alterInventory(5); + break; + default: + break; + } + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.disableControl(); + + _vechile.postInit(); + _vechile.setDetails(180, 33, 34, 35, 1, NULL); + + _object1.postInit(); + _sceneMode = 1801; + setAction(&_sequenceManager, this, 1801, &BF_GLOBALS._player, &_vechile, &_object1, NULL); + + _frontDoor.setDetails(Rect(183, 92, 218, 122), 180, 27, 28, 29, 1, NULL); + _driveway.setDetails(8, 180, 36, 37, 38, 1); + _street.setDetails(1, 180, 21, 22, 23, 1); + _lawn.setDetails(3, 180, 18, 19, 20, 1); + _bushes.setDetails(4, 180, 15, 16, 17, 1); + _palms.setDetails(6, 180, 12, 13, 14, 1); + _garage.setDetails(Rect(241, 85, 319, 121), 180, 30, 31, 32, 1, NULL); + _fence.setDetails(Rect(0, 109, 21, 125), 180, 9, 10, 11, 1, NULL); + _house.setDetails(4, 180, 24, 25, 26, 1); + _steps.setDetails(7, 180, 6, 7, 8, 1); + _curb.setDetails(2, 180, 3, 4, 5, 1); + _sky.setDetails(Rect(0, 0, 319, 190), 180, 0, 1, 2, 1, NULL); + break; + case 7: + BF_INVENTORY.setObjectScene(INV_COBB_RAP, 0); + BF_INVENTORY.setObjectScene(INV_MUG_SHOT, 0); + BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 0); + BF_INVENTORY.setObjectScene(INV_LYLE_CARD, 0); + BF_INVENTORY.setObjectScene(INV_NAPKIN, 0); + BF_INVENTORY.setObjectScene(INV_9MM_BULLETS, 0); + BF_INVENTORY.setObjectScene(INV_SCHEDULE, 0); + BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 0); + + BF_GLOBALS._sceneManager.changeScene(180); + break; + case 8: + if (BF_GLOBALS.getFlag(fLeftTraceIn900) || BF_GLOBALS.getFlag(fGotPointsForSearchingDA) || + BF_GLOBALS.getFlag(fLeftTraceIn920)) { + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._driveToScene = 0; + BF_GLOBALS._driveFromScene = 0; + BF_GLOBALS._sceneManager.changeScene(271); + } else { + BF_GLOBALS._sceneManager.changeScene(180); + } + break; + case 1800: + _fieldC56 = 2; + _vechile._moveDiff.x = 10; + _sceneMode = 2; + ADD_MOVER(_vechile, -25, 171); + break; + case 1801: + BF_GLOBALS._player._strip = 3; + BF_GLOBALS._player.enableControl(); + break; + case 1802: + BF_GLOBALS._sound1.release(); + BF_GLOBALS._driveToScene = 0; + BF_GLOBALS._driveFromScene = 0; + BF_GLOBALS._sceneManager.changeScene(270); + break; + default: + break; + } +} + +void Scene180::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + if (_vechile.contains(event.mousePos)) { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } else if (_garageExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NW); + BF_GLOBALS._events.setCursor(surface); + } else { + // In case an exit cursor was being shown, restore the previously selected cursor + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } +} + +void Scene180::dispatch() { + switch (_fieldC56) { + case 1: + if (_vechile._mover && (_vechile._percent > 50)) + _vechile.changeZoom(_vechile._percent - 1); + if (_vechile._moveDiff.x > 15) + --_vechile._moveDiff.x; + break; + case 2: + if (_vechile._mover && (_vechile._percent < 100)) + _vechile.changeZoom(_vechile._percent + 1); + if (_vechile._moveDiff.x < 35) + ++_vechile._moveDiff.x; + break; + case 3: + if (_vechile._mover && (_vechile._percent > 70)) + _vechile.changeZoom(_vechile._percent - 1); + if (_vechile._moveDiff.x > 15) + --_vechile._moveDiff.x; + break; + default: + break; + } + + SceneExt::dispatch(); + + if (!_action && (BF_GLOBALS._player._position.y < 120)) { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._driveToScene = 0; + BF_GLOBALS._driveFromScene = 0; + + if (BF_GLOBALS.getFlag(fLeftTraceIn900) || BF_GLOBALS.getFlag(fGotPointsForSearchingDA) || + BF_GLOBALS.getFlag(fLeftTraceIn920)) + BF_GLOBALS._sceneManager.changeScene(271); + else + BF_GLOBALS._sceneManager.changeScene(270); + } +} + +/*-------------------------------------------------------------------------- + * Scene 190 - Front of Police Station + * + *--------------------------------------------------------------------------*/ + +bool Scene190::Object4::startAction(CursorType action, Event &event) { + 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(); + T2_GLOBALS._uiElements._active = true; + _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, UI_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 < (UI_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 new file mode 100644 index 0000000000..bdf414ec9b --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes1.h @@ -0,0 +1,488 @@ +/* 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_SCENES1_H +#define TSAGE_BLUEFORCE_SCENES1_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 Scene100: public SceneExt { + /* Support classes */ + class Text: public SceneText { + public: + virtual Common::String getClassName() { return "BF100Text"; } + virtual void dispatch(); + }; + + /* Actions */ + class Action1: public ActionExt { + private: + void setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action); + public: + Text _sceneText1; + SceneText _sceneText2; + int _textHeight; + + virtual Common::String getClassName() { return "BF100Action1"; } + virtual void synchronize(Serializer &s) { + ActionExt::synchronize(s); + s.syncAsSint16LE(_textHeight); + } + virtual void signal(); + }; + class Action2: public ActionExt { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Action1 _action1; + Action2 _action2; + ScenePalette _scenePalette; + NamedObject _object1, _object2, _object3, _object4, _object5; + int _index; + + Scene100(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene109: 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(); + }; + +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; + SequenceManager _sequenceManager4, _sequenceManager5, _sequenceManager6; + SequenceManager _sequenceManager7, _sequenceManager8; + SceneObject _object1, _object2, _protaginist2, _protaginist1, _object5; + SceneObject _drunk, _object7, _bartender, _object9, _object10; + IntroSceneText _text; + Action1 _action1; + Action _action2, _action3; +public: + Scene109(); + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene110: public SceneExt { + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; + class Action3: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action4: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action5: public Action { + public: + virtual void signal(); + }; +public: + NamedObject _object1, _object2, _object3, _object4, _object5, _object6, _object7, _object8, _object9, _object10; + ASound _sound; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; +public: + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene114: public SceneExt { + /* Objects */ + class Vechile: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Door: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager1; + Vechile _vechile; + Door _door; + NamedObject _lyle; + NamedHotspot _item1; +public: + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene115: public SceneExt { + /* Objects */ + class Object1: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object2: public NamedObject { + public: + int _field15F8; + virtual bool startAction(CursorType action, Event &event); + }; + class Object3: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object4: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Custom class */ + class EventHandler1: public EventHandler { + public: + virtual Common::String getClassName() { return "Scene115_EventHandler1"; } + virtual void dispatch(); + }; + + /* Items */ + class Item1: public NamedHotspot { + SequenceManager _sequenceManager6; + public: + int _field1F8A; + + Item1(); + virtual bool startAction(CursorType action, Event &event); + virtual void signal(); + virtual void synchronize(Serializer &s); + }; + class Item10: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item14: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; + class Action3: public Action { + public: + virtual void signal(); + }; + class Action4: public Action { + public: + virtual void signal(); + }; + class Action5: public Action { + public: + virtual void signal(); + }; + class Action6: public Action { + public: + virtual void signal(); + }; + class Action7: public Action { + public: + virtual void signal(); + }; + class Action8: public Action { + public: + virtual void signal(); + }; + class Action9: public Action { + public: + virtual void signal(); + }; + + SequenceManager _sequenceManager1; + SequenceManager _sequenceManager2; + SequenceManager _sequenceManager3; + SequenceManager _sequenceManager4; + SequenceManager _sequenceManager5; + Object1 _object1; + Object2 _object2; + Object3 _object3; + Object4 _object4; + SceneObject _object5, _object6, _object7, _object8, _object9; + SceneObject _object10, _object11, _object12, _object13; + Item1 _item1; + EventHandler1 _eventHandler1; + NamedHotspot _item2, _item3, _item4, _item5, _item6, _item7, _item8, _item9; + Item10 _item10; + NamedHotspot _item11, _item12, _item13; + Item14 _item14; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + Action9 _action9; + SpeakerGameText _gameTextSpeaker; + SpeakerKate _kateSpeaker; + SpeakerTony _tonySpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + ASound _sound1; + int _field168A; + int _field31E8; + int _field31EA; +public: + Scene115(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); +}; + +class Scene125: public SceneExt { + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action3: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action4: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action5: public Action { + public: + virtual void signal(); + }; + class Action6: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + +public: + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + NamedObject _object1, _object2, _object3, _object4, _object5; + NamedObject _object6, _object7, _object8, _object9; + ASoundExt _soundExt1; + ASoundExt _soundExt2; + + void postInit(SceneObjectList *OwnerList); +}; + +class Scene140: public SceneExt { + class Action1: public Action { + public: + virtual void signal(); + }; +public: + Action1 _action1; + ASoundExt _soundExt1; + NamedObject _object1; + NamedObject _object2; + IntroSceneText _text; + + void postInit(SceneObjectList *OwnerList); +}; + +class Scene150: public SceneExt { + class Action1: public Action { + NamedObject _object2; + ASound _sound1; + public: + virtual void signal(); + }; +public: + NamedObject _object1; + Action1 _action1; + + void postInit(SceneObjectList *OwnerList); +}; + +class Scene160: public SceneExt { + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + virtual void process(Event &event); + }; + class Action3: public ActionExt { + public: + virtual void signal(); + }; +public: + NamedObject _flag, _kid, _kidBody, _leftOfficer, _grandma, _rightOfficer; + ASound _sound1; + Action1 _action1; + Action2 _action2; + Action3 _action3; + IntroSceneText _text; + + void postInit(SceneObjectList *OwnerList); +}; + +class Scene180: public SceneExt { + /* Objects */ + class Vechile: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class GarageExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + NamedObject _object1; + Vechile _vechile; + NamedHotspot _driveway, _garage, _frontDoor, _house, _street; + NamedHotspot _lawn, _bushes, _palms, _fence, _steps; + NamedHotspot _curb, _sky; + GarageExit _garageExit; + ASoundExt _sound1; + SceneMessage _sceneMessage; + int _fieldC56; + + Scene180(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene190: public SceneExt { + /* Objects */ + class Object4: public NamedObject { + 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 + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp new file mode 100644 index 0000000000..3af02bd463 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes2.cpp @@ -0,0 +1,1853 @@ +/* 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, 0); + owner->animate(ANIM_MODE_5, this); + break; + case 2: + owner->setPosition(owner->_position, 1000); + owner->setFrame(1); + _actionIndex = 0; + setDelay(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); + +// FIXME: This fixes an obvious glitch during scene transition. +// Shouldn't it be included in the 2 previous functions? + clearScreen(); +// + + BF_GLOBALS._scenePalette.loadPalette(235); + BF_GLOBALS._scenePalette.refresh(); + + _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); + +// FIXME: This fixes an obvious glitch during scene transition. +// Shouldn't it be included in the 2 previous functions? + clearScreen(); +// + + _object2.postInit(); + _object2.setVisage(220); + _object2.setPosition(Common::Point(182, 122)); + _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 - Intro - 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(); + SceneExt::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, scene, 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 { + T2_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 < (UI_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, UI_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, 2704, &BF_GLOBALS._player, &_object12, &_object7, &_object8, NULL); + break; + 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_NULL(BF_GLOBALS._player, _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; + default: + 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 < UI_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(); +} + +/*-------------------------------------------------------------------------- + * Scene 280 - Bedroom Flashback cut-scene + * + *--------------------------------------------------------------------------*/ + +void Scene280::Action1::signal() { + Scene280 *scene = (Scene280 *)BF_GLOBALS._sceneManager._scene; + static uint32 black = 0; + + switch (_actionIndex++) { + case 0: + scene->_jake.postInit(); + scene->_jake.setVisage(283); + scene->_jake.setPosition(Common::Point(331, 200)); + scene->_jake.animate(ANIM_MODE_1, NULL); + scene->_jake.setStrip(1); + ADD_MOVER(scene->_jake, 189, 131); + break; + case 1: + scene->_jake.setStrip(2); + scene->_jake.setFrame(1); + scene->_jake.animate(ANIM_MODE_8, NULL); + scene->_jake._numFrames = 5; + + scene->_stripManager.start(2800, this); + break; + case 2: + scene->_jake.animate(ANIM_MODE_5, NULL); + scene->_dad.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_jake.setStrip(4); + scene->_jake.setFrame(1); + scene->_dad.setStrip(2); + scene->_jake.setFrame(1); + scene->_dad.animate(ANIM_MODE_5, this); + break; + case 4: + scene->_dad.setStrip(3); + scene->_dad.setFrame(1); + scene->_dad.animate(ANIM_MODE_5, this); + break; + case 5: + scene->_object4.hide(); + scene->_dad.setVisage(282); + scene->_dad.setStrip(1); + scene->_dad.setFrame(1); + scene->_dad._numFrames = 5; + scene->_dad.animate(ANIM_MODE_5, this); + break; + case 6: + scene->_stripManager.start(2801, this); + break; + case 7: + scene->_mum.postInit(); + scene->_mum.setVisage(282); + scene->_mum.setStrip(2); + scene->_mum.setFrame(1); + scene->_mum.fixPriority(1); + scene->_mum.setPosition(Common::Point(160, 138)); + + scene->_jake.setStrip(3); + scene->_jake.setFrame(1); + scene->_jake.animate(ANIM_MODE_5, this); + + scene->_dad._numFrames = 10; + scene->_dad.setVisage(284); + scene->_dad.setStrip(1); + scene->_dad.fixPriority(-1); + scene->_dad.setPosition(Common::Point(174, 136)); + scene->_dad.setFrame(1); + scene->_dad.animate(ANIM_MODE_1, NULL); + ADD_MOVER(scene->_dad, 438, 320); + break; + case 8: + scene->_mum.animate(ANIM_MODE_4, 5, 1, this); + break; + case 9: + scene->_sceneMode = 2; + BF_GLOBALS._sound1.fadeOut2(NULL); + scene->addFader((const byte *)&black, 2, scene); + + scene->_jake.remove(); + scene->_mum.animate(ANIM_MODE_5, NULL); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene280::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(); + BF_GLOBALS._interfaceY = SCREEN_HEIGHT; + loadScene(280); + + _stripManager.addSpeaker(&_gameTextSpeaker); + + _dad.postInit(); + _dad.setVisage(281); + _dad.setPosition(Common::Point(160, 138)); + _dad.fixPriority(1); + + _object4.postInit(); + _object4.setVisage(280); + _object4.setPosition(Common::Point(139, 141)); + + const uint32 black = 0; + add2Faders((const byte *)&black, 2, 280, this); + _sceneMode = 1; + setAction(&_action1); +} + +void Scene280::signal() { + if (_sceneMode == 2) + BF_GLOBALS._sceneManager.changeScene(271); +} + +} // End of namespace BlueForce + +} // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes2.h b/engines/tsage/blue_force/blueforce_scenes2.h new file mode 100644 index 0000000000..17e749d7a1 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes2.h @@ -0,0 +1,298 @@ +/* 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(); +}; + +class Scene280: public PalettedScene { + /* Actions */ + class Action1: public ActionExt { + public: + virtual void signal(); + }; +public: + Action1 _action1; + SpeakerGameText _gameTextSpeaker; + NamedObject _jake, _dad, _mum, _object4; + + void postInit(SceneObjectList *OwnerList); + virtual void signal(); +}; + +} // End of namespace BlueForce + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp new file mode 100644 index 0000000000..1fa27ccb27 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes3.cpp @@ -0,0 +1,5930 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/config-manager.h" +#include "tsage/blue_force/blueforce_scenes3.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/globals.h" + +namespace TsAGE { + +namespace BlueForce { + +/*-------------------------------------------------------------------------- + * Scene 300 - Outside Police Station + * + *--------------------------------------------------------------------------*/ + +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 { + return NamedObject::startAction(action, event); + } +} + +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; +} + +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 { + return NamedHotspot::startAction(action, event); + } +} + +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 { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene300::Item14::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 151, 54); + return true; +} + +bool Scene300::Item15::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 316, 90); + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene300::Action1::signal() { + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setDelay(1); + break; + case 1: + 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, + BF_GLOBALS._player._position.y); + break; + } + case 3: + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene300::Action2::signal() { + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setDelay(1); + break; + case 1: + SceneItem::display2(300, 28); + setDelay(1); + break; + case 2: { + ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 8, + BF_GLOBALS._player._position.y); + break; + } + case 3: + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene300::Action3::signal() { + Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setDelay(1); + break; + case 1: + BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 306, &BF_GLOBALS._player, + &scene->_object8, NULL); + break; + case 2: + SceneItem::display2(300, 35); + setDelay(1); + break; + case 3: + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene300::Action4::signal() { + Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setDelay(1); + break; + case 1: + setAction(&scene->_sequenceManager1, this, 316, &BF_GLOBALS._player, &scene->_object19, NULL); + break; + case 2: + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 3: + setAction(&scene->_sequenceManager1, this, 319, &scene->_object19, NULL); + break; + case 4: + BF_GLOBALS.setFlag(2); + BF_GLOBALS._sceneManager.changeScene(190); + break; + default: + break; + } +} + +void Scene300::Action5::signal() { + Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + scene->_field2760 = 1; + setDelay(1); + break; + case 1: + setAction(&scene->_sequenceManager1, this, 1306, &scene->_object1, &scene->_object8, NULL); + break; + case 2: + scene->_stripManager.start(3004, this); + break; + case 3: { + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 186, 140); + break; + } + case 4: + remove(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene300::Scene300(): SceneExt(), _object13(3000), _object14(3001), _object15(3002), + _object16(3003) { + _field2760 = _field2762 = 0; +} + +void Scene300::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(300); + + // Add the speakers + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_sutterSpeaker); + _stripManager.addSpeaker(&_dougSpeaker); + _stripManager.addSpeaker(&_jakeSpeaker); + + _field2762 = 0; + _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; + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(playerVisage); + BF_GLOBALS._player.setStrip(3); + BF_GLOBALS._player.setPosition(Common::Point(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + 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._dayNumber != 2) || (BF_GLOBALS._bookmark < bEndDayOne)) { + _object17.postInit(); + _object17.setVisage(301); + _object17.setStrip(1); + _object17.setPosition(Common::Point(87, 88)); + _object17.setDetails(300, 11, 13, 2, 1, NULL); + + _object18.postInit(); + _object18.setVisage(301); + _object18.setStrip(1); + _object18.setPosition(Common::Point(137, 92)); + _object18.setDetails(300, 11, 13, 3, 1, NULL); + } + + _object19.postInit(); + _object19.setVisage(301); + _object19.setStrip(1); + _object19.setPosition(Common::Point(175, 99)); + _object19.setDetails(300, 11, 13, 34, 1, NULL); + + _object11.postInit(); + _object11.setVisage(301); + _object11.setStrip(8); + _object11.setPosition(Common::Point(265, 91)); + _object11.hide(); + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 50: + case 60: + BF_GLOBALS.clearFlag(onBike); + if (BF_GLOBALS.getFlag(onDuty)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 318; + setAction(&_sequenceManager1, this, 318, &BF_GLOBALS._player, &_object19, NULL); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 300; + setAction(&_sequenceManager1, this, 1300, &BF_GLOBALS._player, NULL); + } + break; + case 190: + _sceneMode = 0; + if (!BF_GLOBALS.getFlag(2)) { + _sceneMode = 7308; + BF_GLOBALS._player.setPosition(Common::Point(175, 50)); + ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 123, 71); + + if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._bookmark < bEndDayOne)) + setup(); + } else if (!BF_GLOBALS.getFlag(3)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 300; + setAction(&_sequenceManager1, this, 300, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 318; + setAction(&_sequenceManager1, this, 318, &BF_GLOBALS._player, &_object19, NULL); + } + break; + case 315: + BF_GLOBALS._player.setPosition(Common::Point(305, 66)); + 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); + } else { + BF_GLOBALS._player.setVisage(1304); + setup(); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 306, &BF_GLOBALS._player, &_object8, NULL); + } + break; + default: + _sceneMode = 0; + BF_GLOBALS._player.setVisage(1304); + BF_GLOBALS._player.disableControl(); + 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, UI_INTERFACE_Y - 1), 300, 6, 13, 15, 1, NULL); + _item7.setDetails(Rect(219, 46, 251, 74), 300, 22, 23, 24, 1, NULL); + _item8.setDetails(Rect(301, 53, 319, 78), 300, 22, 23, 24, 1, NULL); + _item5.setDetails(Rect(179, 44, 200, 55), 300, 8, 13, 17, 1, NULL); + _item6.setDetails(Rect(210, 46, 231, 55), 300, 8, 13, 17, 1, NULL); + _item3.setDetails(Rect(160, 0, SCREEN_WIDTH - 1, 75), 300, 4, 13, 14, 1, NULL); + _item9.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 300, 29, 30, 31, 1, NULL); +} + +void Scene300::signal() { + switch (_sceneMode) { + case 300: + BF_GLOBALS._sound1.fadeSound(33); + BF_GLOBALS.clearFlag(onBike); + _sceneMode = 0; + + if ((BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark != bNone)) { + signal(); + } else { + _stripManager.start(3005, this); + } + break; + case 301: + if (_field2760) { + _sceneMode = 1302; + signal(); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 1302; + setAction(&_sequenceManager1, this, 306, &_object1, &_object8, NULL); + } + + _object12.show(); + _object5.dispatch(); + BF_GLOBALS._player.hide(); + break; + case 303: + BF_GLOBALS._player.disableControl(); + _sceneMode = 2307; + setAction(&_sequenceManager1, this, 303, &_object13, &_object1, NULL); + break; + case 305: + if ((BF_GLOBALS._dayNumber == 4) || (BF_GLOBALS._dayNumber == 5)) { + _sceneMode = 0; + setAction(&_action3); + } else { + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(315); + } + break; + case 309: + BF_GLOBALS._player.disableControl(); + _sceneMode = 3307; + setAction(&_sequenceManager1, this, 309, &_object14, &_object1, NULL); + break; + case 310: + BF_GLOBALS._player.disableControl(); + _sceneMode = 4307; + setAction(&_sequenceManager1, this, 310, &_object12, &_object1, NULL); + break; + case 311: + BF_GLOBALS._player.disableControl(); + _sceneMode = 5307; + setAction(&_sequenceManager1, this, 311, &_object15, &_object1, NULL); + break; + case 312: + case 5307: + BF_GLOBALS._player.disableControl(); + _sceneMode = 1305; + setAction(&_sequenceManager1, this, 312, &_object1, &_object16, NULL); + break; + case 317: + BF_GLOBALS.setFlag(2); + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 318: + BF_GLOBALS.clearFlag(onBike); + _sceneMode = 0; + signal(); + break; + case 1302: + _field2762 = 0; + BF_GLOBALS._player.disableControl(); + _sceneMode = 1308; + setAction(&_sequenceManager1, this, 302, &_object1, NULL); + break; + case 1305: + BF_GLOBALS._player.disableControl(); + _sceneMode = 1313; + setAction(&_sequenceManager1, this, 305, &_object1, &_object8, NULL); + BF_GLOBALS._player.show(); + _object12.hide(); + break; + case 1307: + case 2308: + BF_GLOBALS._player.disableControl(); + _sceneMode = 303; + setAction(&_sequenceManager1, this, 308, &_object14, NULL); + break; + case 1308: + BF_GLOBALS._player.disableControl(); + _sceneMode = 1307; + setAction(&_sequenceManager1, this, 308, &_object13, NULL); + break; + case 1313: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + _object15.setAction(&_sequenceManager4, NULL, 315, &_object15, &_object16, NULL); + _object13.setAction(&_sequenceManager2, NULL, 313, &_object13, &_object17, NULL); + _object14.setAction(&_sequenceManager3, this, 314, &_object14, &_object18, NULL); + + BF_GLOBALS._bookmark = bEndDayOne; + BF_GLOBALS._sound1.changeSound(33); + break; + case 2307: + case 3308: + BF_GLOBALS._player.disableControl(); + _sceneMode = 309; + setAction(&_sequenceManager1, this, 308, &_object12, NULL); + break; + case 3307: + _object9.postInit(); + _object9.hide(); + _object10.postInit(); + _object10.hide(); + + if (BF_GLOBALS.getFlag(1)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 4308; + setAction(&_sequenceManager1, this, 6307, &_object2, &_object1, &_object9, &_object10, NULL); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 4308; + setAction(&_sequenceManager1, this, 7307, &_object12, &_object1, &_object9, &_object10, NULL); + } + break; + case 4307: + case 5308: + BF_GLOBALS._player.disableControl(); + _sceneMode = 311; + setAction(&_sequenceManager1, this, 308, &_object16, NULL); + break; + case 4308: + BF_GLOBALS._player.disableControl(); + _sceneMode = 310; + setAction(&_sequenceManager1, this, 308, &_object15, NULL); + break; + case 6308: + BF_GLOBALS._sceneManager.changeScene(190); + break; + case 7308: + if (_field2762) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 301; + setAction(&_sequenceManager1, this, 301, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + case 0: + default: + if (_field2762) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 301; + setAction(&_sequenceManager1, this, 301, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + } +} + +void Scene300::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_item14.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NE); + BF_GLOBALS._events.setCursor(surface); + } else if (_item15.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 Scene300::dispatch() { + SceneExt::dispatch(); + + if (!_action) { + int regionIndex = BF_GLOBALS._player.getRegionIndex(); + if ((regionIndex == 1) && (_field2762 == 1)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 301; + setAction(&_sequenceManager1, this, 301, &BF_GLOBALS._player, NULL); + } + + if ((BF_GLOBALS._player._position.y < 59) && (BF_GLOBALS._player._position.x > 137) && + (_sceneMode != 6308) && (_sceneMode != 7308)) { + BF_GLOBALS._v4CEA4 = 3; + _sceneMode = 6308; + BF_GLOBALS._player.disableControl(); + 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); + } + } + } +} + +void Scene300::setup() { + _object13.postInit(); + _object13.setVisage(307); + _object13.setStrip(6); + _object13.setPosition(Common::Point(156, 134)); + _object13._moveDiff = Common::Point(3, 1); + _object3.setup(&_object13, 306, 1, 29); + + _object14.postInit(); + _object14.setVisage(307); + _object14.setStrip(6); + _object14.setPosition(Common::Point(171, 137)); + _object14._moveDiff = Common::Point(3, 1); + _object4.setup(&_object14, 306, 2, 29); + + _object12.postInit(); + _object12.setVisage(307); + _object12.setStrip(6); + _object12.setPosition(Common::Point(186, 140)); + _object12._moveDiff = Common::Point(3, 1); + _object5.setup(&_object12, 306, 2, 29); + _object12.hide(); + + _object15.postInit(); + _object15.setVisage(307); + _object15.setStrip(6); + _object15.setPosition(Common::Point(201, 142)); + _object15._moveDiff = Common::Point(3, 1); + _object6.setup(&_object15, 306, 3, 29); + + _object16.postInit(); + _object16.setVisage(307); + _object16.setStrip(6); + _object16.setPosition(Common::Point(216, 145)); + _object16._moveDiff = Common::Point(3, 1); + _object7.setup(&_object16, 306, 1, 29); + + _object1.postInit(); + _object1.setVisage(307); + _object1.setStrip(6); + _object1.setPosition(Common::Point(305, 66)); + _object1._moveDiff = Common::Point(3, 1); + _object1.setObjectWrapper(new SceneObjectWrapper()); + _object1.animate(ANIM_MODE_1, NULL); + _object2.setup(&_object1, 306, 4, 9); + + BF_GLOBALS._sceneItems.addItems(&_object13, &_object14, &_object15, &_object16, NULL); + _timer.set(3600, this, &_action5); + + _field2760 = 0; + _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 { + ++scene->_field1B66; + 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; + scene->_currentCursor = action; + + 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)) { + T2_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)) { + T2_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) { + T2_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: + T2_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); + BF_GLOBALS._sceneManager.changeScene(666); + } else if ((BF_GLOBALS._bookmark != bBookedFrankie) || !BF_GLOBALS.getFlag(onDuty)) { + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(190); + } 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: + T2_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); + T2_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements.show(); + break; + case 3153: + T2_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); + T2_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements.show(); + break; + case 3156: + T2_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(); + T2_GLOBALS._uiElements.addScore(10); + BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 1); + break; + case 3159: + if (!BF_GLOBALS.getFlag(fBookedGreenEvidence)) { + T2_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 < (UI_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, UI_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 < (UI_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, UI_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 < (UI_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::FireBox::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); + T2_GLOBALS._uiElements.addScore(30); + } + remove(); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene350::FireboxInset::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->_fireBoxInset.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 FocusObject::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, UI_INTERFACE_Y - 1), 350, -1, -1, -1, 1, NULL); + + if ((BF_GLOBALS._dayNumber != 1) && (BF_GLOBALS._dayNumber != 4)) { + _yacht.setDetails(28, 350, 15, 16, 17, 1); + } 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); + } + } + + _fireBox._sceneRegionId = 5; + BF_GLOBALS._sceneItems.push_back(&_fireBox); + _item4.setDetails(15, 350, 0, 1, 2, 1); + BF_GLOBALS._sceneItems.push_back(&_yacht); + + _item3.setDetails(7, 350, 23, 24, 25, 1); + _item2.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, 31), 350, 3, 4, 5, 1, NULL); + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, UI_INTERFACE_Y), 350, 0, 1, 2, 1, NULL); + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 370: + BF_GLOBALS._player.enableControl(); + T2_GLOBALS._uiElements._active = true; + T2_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); + + _fireBoxInset.postInit(); + _fireBoxInset.setVisage(350); + _fireBoxInset.setStrip(4); + _fireBoxInset.fixPriority(200); + _fireBoxInset.setPosition(Common::Point(85, 166)); + BF_GLOBALS._sceneItems.push_front(&_fireBoxInset); + + if (BF_INVENTORY.getObjectScene(INV_HOOK) == 350) { + _hook.postInit(); + _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 < (UI_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->_lyle._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::LockerInset::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); + T2_GLOBALS._uiElements.addScore(30); + + scene->_object9.remove(); + remove(); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene355::Green::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, 3557, &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._greenDay5TalkCtr++) { + case 0: + scene->_stripManager.start(3565, scene); + break; + case 1: + scene->_stripManager.start(3567, scene); + break; + default: + 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->_lyle)) + scene->_lyle.setAction(NULL); + + BF_GLOBALS._player.disableControl(); + scene->_green.setStrip(1); + scene->_green.setFrame(1); + scene->_sceneMode = 9981; + scene->signal(); + } + return true; + case INV_HANDCUFFS: + if (BF_GLOBALS._greenDay5TalkCtr <= 1) + SceneItem::display2(355, 38); + else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9979; + scene->setAction(&scene->_sequenceManager, scene, 4551, &BF_GLOBALS._player, this, NULL); + BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 355); + T2_GLOBALS._uiElements.addScore(50); + _flag = 1; + BF_GLOBALS._bookmark = bInvestigateBoat; + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); + } +} + +bool Scene355::Lyle::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->_green)) { + 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::display2(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::Pouch::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 355) { + SceneItem::display2(355, 29); + return true; + } + break; + case CURSOR_USE: + if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 355) { + if (scene->_modeFlag) { + 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: + break; + } + + 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->_lyle._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::RentalExit::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->_sceneMode = 9991; + 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->_lyle.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.enableControl(); + _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; + + _pouch.setDetails(Rect(22, 136, 46, 146), 355, 43, -1, -1, 1, NULL); + _nextSceneMode = 0; + + if (!BF_GLOBALS.getFlag(fLyleOnIsland)) { + _lyle.postInit(); + _lyle.setVisage(847); + _lyle.setPosition(Common::Point(296, 97)); + _lyle.setStrip(1); + _lyle.setAction(&_action1); + _lyle._flag = BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 1 : 0; + _lyle.setDetails(355, 40, 42, 41, 1, NULL); + } + + if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_JAR) == 0) && + (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; + _lyle._flag = 2; + + _green.postInit(); + BF_GLOBALS._sceneItems.push_back(&_green); + + if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) { + _green.setVisage(376); + _green.setStrip(1); + _green.setPosition(Common::Point(193, 88)); + _green._flag = 0; + } else { + _green._flag = 1; + + if (BF_INVENTORY.getObjectScene(INV_GRENADES) == 1) { + _green.setVisage(373); + _green.setStrip(5); + _green.setPosition(Common::Point(238, 142)); + } else { + _green.setVisage(375); + _green.setStrip(1); + _green.setFrame(_green.getFrameCount()); + _green.setPosition(Common::Point(193, 147)); + } + } + + if ((BF_GLOBALS._bookmark == bFinishedWGreen) && BF_GLOBALS._sceneObjects->contains(&_lyle) && + !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; + } + + _item3._sceneRegionId = 18; + _harrison.setDetails(355, 18, 20, 19, 1, NULL); + _item6.setDetails(10, 355, 2, -1, 14, 1); + _item7.setDetails(11, 355, 3, -1, 15, 1); + _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) { + _rentalExit.setBounds(Rect(115, 101, 186, 154)); + BF_GLOBALS._sceneItems.push_front(&_rentalExit); + } else { + _item2.setDetails(Rect(273, 53, 320, 101), 355, -1, -1, -1, 2, NULL); + } + + _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); + T2_GLOBALS._uiElements.addScore(10); + } + + SceneItem::display2(355, !_doorway._v3 ? 24 : 25); + BF_GLOBALS._player.enableControl(); + break; + case 4550: + T2_GLOBALS._uiElements.addScore(50); + _object10.remove(); + BF_GLOBALS._sound1.play(90); + BF_GLOBALS._player._regionBitList |= 0x10; + + _doorway._v3 = 0; + _doorway._v2 = 2; + _lyle._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 = 9992; + break; + default: + _sceneMode = 0; + 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; + _green.animate(ANIM_MODE_5, NULL); + addFader((const byte *)&black, 10, this); + break; + case 9982: + _sceneMode = 9983; + if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355) { + if (BF_GLOBALS.getFlag(fLyleOnIsland)) { + BF_GLOBALS._player.updateAngle(_green._position); + _stripManager.start(3581, this); + } else { + BF_GLOBALS._player.updateAngle(_lyle._position); + _stripManager.start(3570, this); + } + } else { + if (BF_GLOBALS.getFlag(fLyleOnIsland)) { + if (BF_GLOBALS._sceneObjects->contains(&_green)) { + BF_INVENTORY.setObjectScene(INV_GRENADES, 860); + _stripManager.start(3583, this); + } else { + signal(); + } + } else { + BF_GLOBALS._player.updateAngle(_lyle._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); + _lyle._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); + T2_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: + T2_GLOBALS._uiElements.addScore(30); + if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_JAR) == 0) && + (BF_INVENTORY.getObjectScene(INV_FLARE) == 0)) { + _green.postInit(); + _green.setVisage(373); + _green.setPosition(Common::Point(-10, -10)); + _green._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(&_green); + BF_GLOBALS.setFlag(fTookTrailerAmmo); + BF_GLOBALS._sound1.fade(0, 5, 60, true, NULL); + _sceneMode = 4550; + + setAction(&_sequenceManager, this, 4550, &_doorway, &_green, &_object9, &_object10, &_object11, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + case 9989: + _lockerInset.postInit(); + _lockerInset.setVisage(2356); + _lockerInset.setStrip(2); + BF_GLOBALS._sceneItems.push_front(&_lockerInset); + + if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 999) { + _lockerInset.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 { + _lockerInset.setFrame(1); + } + + _lockerInset.setPosition(Common::Point(82, 115)); + _lockerInset.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); + T2_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 earlier days + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_rentalExit.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); + } + } + + if ((_sceneMode != 2357) && (_sceneMode != 1357) && !BF_GLOBALS.getFlag(greenTaken) && + (event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45)) { + if (BF_GLOBALS._player.contains(event.mousePos)) { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS.clearFlag(gunDrawn); + _sceneMode = 2357; + setAction(&_sequenceManager, this, 2357, &BF_GLOBALS._player, &_harrison, NULL); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 1357; + setAction(&_sequenceManager, this, 1357, &BF_GLOBALS._player, &_harrison, NULL); + BF_GLOBALS.setFlag(gunDrawn); + } + } else { + _item11.startAction(INV_COLT45, event); + } + event.handled = true; + } + } else { + // Day 5 handling + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on the exit to the rental boat + if (_rentalExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(!_modeFlag ? EXITFRAME_SW : EXITFRAME_NE); + BF_GLOBALS._events.setCursor(surface); + } else { + // In case an exit cursor was being shown, restore the previously selected cursor + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } + + // Special handling of actions + if (event.eventType == EVENT_BUTTON_DOWN) { + switch (BF_GLOBALS._events.getCursor()) { + 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; + } + } + } + + PalettedScene::process(event); +} + +void Scene355::dispatch() { + PalettedScene::dispatch(); + if (BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _lyle.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); + T2_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, UI_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 { + T2_GLOBALS._uiElements.addScore(50); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3704; + scene->setAction(&scene->_sequenceManager, scene, 3704, &BF_GLOBALS._player, this, &scene->_harrison, NULL); + } + 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); + T2_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); + T2_GLOBALS._uiElements.addScore(30); + _greensGun.remove(); + BF_GLOBALS._player.enableControl(); + break; + case 3712: + T2_GLOBALS._uiElements._active = false; + T2_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: + T2_GLOBALS._uiElements.addScore(50); + BF_INVENTORY.setObjectScene(INV_GREEN_ID, 1); + BF_INVENTORY.setObjectScene(INV_GREENS_KNIFE, 1); + BF_GLOBALS._walkRegions.proc1(3); + BF_GLOBALS._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 < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_exit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E); + BF_GLOBALS._events.setCursor(surface); + } else { + // In case an exit cursor was being shown, restore the previously selected cursor + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } +} + +void 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)) { + T2_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 < (UI_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 { + T2_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); + T2_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 { + T2_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: + T2_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 new file mode 100644 index 0000000000..2982fd3306 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes3.h @@ -0,0 +1,893 @@ +/* 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_SCENES3_H +#define TSAGE_BLUEFORCE_SCENES3_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 Scene300: public SceneExt { + /* Objects */ + class Object: public NamedObject { + public: + int _stripNumber; + public: + Object(int stripNumber) { _stripNumber = stripNumber; } + + virtual bool startAction(CursorType action, Event &event); + }; + class Object19: 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 Item14: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item15: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; + class Action3: public Action { + public: + virtual void signal(); + }; + class Action4: public Action { + public: + virtual void signal(); + }; + class Action5: public Action { + public: + virtual void signal(); + }; +private: + void setup(); +public: + SequenceManager _sequenceManager1, _sequenceManager2; + SequenceManager _sequenceManager3, _sequenceManager4; + NamedObject _object1; + FollowerObject _object2, _object3, _object4, _object5, _object6, _object7; + SceneObject _object8, _object9, _object10; + NamedObject _object11, _object12; + Object _object13, _object14, _object15, _object16; + NamedObject _object17, _object18; + Object19 _object19; + Item1 _item1; + Item2 _item2; + NamedHotspot _item3, _item4, _item5, _item6, _item7; + NamedHotspot _item8, _item9, _item10, _item11; + NamedHotspot _item12, _item13; + Item14 _item14; + Item15 _item15; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + SpeakerGameText _gameTextSpeaker; + SpeakerSutter _sutterSpeaker; + SpeakerDoug _dougSpeaker; + SpeakerJakeNoHead _jakeSpeaker; + TimerExt _timer; + int _field2760, _field2762; + + Scene300(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + 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 FireBox: 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 FireboxInset: public FocusObject { + 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; + FireboxInset _fireBoxInset; + NamedHotspot _item1, _item2, _item3, _item4; + FireBox _fireBox; + 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 LockerInset: public FocusObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object5: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Green: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Lyle: 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 Pouch: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item11: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class RentalExit: 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; + LockerInset _lockerInset; + Object5 _object5; + Green _green; + Lyle _lyle; + Object8 _object8; + NamedObject _object9, _object10, _object11; + Item1 _item1; + Item2 _item2; + Item3 _item3; + Item4 _item4; + Pouch _pouch; + NamedHotspot _item6, _item7, _item8; + NamedHotspot _item9, _item10; + Item11 _item11; + RentalExit _rentalExit; + 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 + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes4.cpp b/engines/tsage/blue_force/blueforce_scenes4.cpp new file mode 100644 index 0000000000..814a2fff7f --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes4.cpp @@ -0,0 +1,1674 @@ +/* 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->_talkCount++) { + 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 + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 13, SET_EXT_BGCOLOR, 82, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_GLOBALS._player.enableControl(); + 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->_passenger, &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->_passenger._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->_passenger._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->_driver._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->_driver, &scene->_passenger, + &scene->_harrison, NULL); + break; + case 5: + T2_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::Motorcycle::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->_harrison)) { + 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::TruckFront::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)) { + T2_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::Driver::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; + T2_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->_talkCount < 5) || (scene->_field1FB6 < 1) || (scene->_field1FBC != 0)) + break; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4123; + scene->_stripManager.start(4125, scene); + scene->_field1FBC = 1; + T2_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->_passenger, &BF_GLOBALS._player, NULL); + } else if ((scene->_field1FBC != 0) || (scene->_field1FC2 != 0)) { + break; + } else { + scene->_field1FC2 = 1; + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4127; + scene->setAction(&scene->_sequenceManager1, scene, 4127, &BF_GLOBALS._player, &scene->_driver, 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); + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + + // TODO: Original code pushes a copy of the entirety of object1 onto stack + scene->setAction(&scene->_sequenceManager1, scene, 4126, &BF_GLOBALS._player, &scene->_driver, NULL); + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene410::Passenger::startAction(CursorType action, Event &event) { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(fCalledBackup)) { + if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { + 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; + T2_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->_talkCount < 5) || (scene->_field1FBA != 0)) + break; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9; + Common::Point destPos(195, 139); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &destPos, scene); + } else if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { + scene->setAction(&scene->_action3); + } else { + 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); + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 0; + scene->setAction(&scene->_sequenceManager1, scene, 4125, &BF_GLOBALS._player, + &scene->_passenger, NULL); + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene410::Harrison::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; + + Common::Point destPos(147, 143); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &destPos, scene); + } 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->_talkCount < 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 = _talkCount = _field1FBA = _field1FBC = 0; + _field1FBE = _field1FC0 = _field1FC2 = _field1FC4 = 0; +} + +void Scene410::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field1FB6); + s.syncAsSint16LE(_talkCount); + 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); + _stripManager.addSpeaker(&_driverSpeaker); + + 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); + + _motorcycle.setDetails(8, 410, 15, -1, -1, 1); + + _passenger.postInit(); + _passenger.setVisage(415); + _passenger.setStrip(1); + _passenger.setPosition(Common::Point(278, 92)); + _passenger.setDetails(410, 4, -1, 5, 1, NULL); + + _driver.postInit(); + _driver.setVisage(416); + _driver.setStrip(2); + _driver.setPosition(Common::Point(244, 85)); + _driver.setDetails(410, 6, -1, 7, 1, NULL); + _driver.changeZoom(-1); + + _object5.postInit(); + _object5.setVisage(410); + _object5.setStrip(2); + _object5.setPosition(Common::Point(282, 96)); + + _object6.postInit(); + _object6.setVisage(410); + _object6.setStrip(4); + _object6.setPosition(Common::Point(240, 43)); + + _truckFront.setDetails(6, 410, 3, -1, -1, 1); + _truckBack.setDetails(7, 410, 3, -1, -1, 1); + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 415: + BF_GLOBALS.setFlag(fSearchedTruck); + BF_GLOBALS._player.setPosition(Common::Point(210, 90)); + + _passenger.remove(); + _driver.remove(); + BF_GLOBALS._walkRegions.proc1(21); + BF_GLOBALS._walkRegions.proc1(22); + + _harrison.postInit(); + _harrison.setVisage(343); + _harrison.setObjectWrapper(new SceneObjectWrapper()); + _harrison.animate(ANIM_MODE_1, NULL); + _harrison.setDetails(350, 12, 13, 14, 1, NULL); + _harrison.setPosition(Common::Point(97, 185)); + _harrison.changeZoom(-1); + + _patrolCar.postInit(); + _patrolCar.setVisage(410); + _patrolCar.setDetails(410, 8, 9, 10, 1, NULL); + _patrolCar.fixPriority(148); + _patrolCar.setPosition(Common::Point(39, 168)); + + _field1FC4 = 1; + _sceneMode = 0; + signal(); + break; + case 60: + if (BF_GLOBALS.getFlag(fSearchedTruck)) { + _passenger.remove(); + _driver.remove(); + _sceneMode = 0; + } else { + _field1FC4 = BF_GLOBALS._v50CC8; + _field1FBA = BF_GLOBALS._v50CC2; + _talkCount = BF_GLOBALS._v50CC6; + _field1FB6 = BF_GLOBALS._v50CC4; + + _passenger.setVisage(418); + _passenger.setStrip(6); + _passenger.setPosition(Common::Point(227, 137)); + + if (_talkCount > 0) { + _passenger.setVisage(415); + _passenger.setStrip(2); + _passenger.setFrame(5); + } + if (_field1FBA) { + _passenger.setVisage(415); + _passenger.setStrip(6); + _passenger.setFrame(8); + } + + BF_GLOBALS._walkRegions.proc1(16); + if (BF_GLOBALS.getFlag(fDriverOutOfTruck)) { + _driver.setVisage(417); + _driver.setStrip(1); + _driver.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); + + _harrison.postInit(); + _harrison.setVisage(343); + _harrison.setObjectWrapper(new SceneObjectWrapper()); + _harrison.animate(ANIM_MODE_1, NULL); + _harrison.setDetails(350, 12, 13, 14, 1, NULL); + BF_GLOBALS._sceneItems.addBefore(&_driver, &_harrison); + + _harrison.setPosition(Common::Point(-10, 124)); + _harrison.changeZoom(-1); + + _patrolCar.postInit(); + _patrolCar.setVisage(410); + _patrolCar.setDetails(410, 8, 9, 10, 1, NULL); + _patrolCar.fixPriority(148); + + if (_field1FC4) { + _harrison.setPosition(Common::Point(108, 112)); + _patrolCar.fixPriority(148); + _patrolCar.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(); + + _background.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_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 = _talkCount; + 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); + _harrison.changeAngle(45); + _sceneMode = 4114; + _stripManager.start(4120, this); + break; + case 9: + _sceneMode = 4106; + _stripManager.start(4111, this); + _field1FBA = 1; + BF_GLOBALS.setFlag(fCuffedFrankie); + T2_GLOBALS._uiElements.addScore(30); + break; + case 10: + BF_GLOBALS._player.updateAngle(_harrison._position); + _sceneMode = 0; + break; + case 4100: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4100, &_passenger, &_object5, NULL); + BF_GLOBALS._walkRegions.proc1(16); + break; + case 4101: + // Driver gets out of the car + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4101, &_driver, &_object6, NULL); + BF_GLOBALS.setFlag(fDriverOutOfTruck); + BF_GLOBALS._walkRegions.proc1(7); + break; + case 4103: + // Click on moto to ask for backup + BF_GLOBALS._player.disableControl(); + _sceneMode = 1; + setAction(&_sequenceManager1, this, 4103, &BF_GLOBALS._player, NULL); + break; + case 4104: + // After call for backup, patrol car is coming + _field1FC4 = 1; + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4104, &_patrolCar, &_harrison, NULL); + break; + case 4105: + // Second guy gets nervous + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4105, &_passenger, NULL); + break; + case 4106: + BF_GLOBALS._player.disableControl(); + _sceneMode = 4119; + setAction(&_sequenceManager1, this, 4106, &_passenger, NULL); + break; + case 4107: + BF_GLOBALS._player.disableControl(); + _sceneMode = 5; + setAction(&_sequenceManager1, this, 4107, &BF_GLOBALS._player, &_passenger, NULL); + break; + case 4108: + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.updateAngle(Common::Point(100, 170)); + BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._walkRegions.proc2(16); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4108, &_harrison, 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, &_driver, &_harrison, NULL); + break; + case 4110: + // Harrisson takes care of the driver + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4110, &_harrison, &_driver, 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, &_driver, &_passenger, &_harrison, NULL); + break; + case 4114: + BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._player.disableControl(); + _sceneMode = 4116; + setAction(&_sequenceManager1, this, 4114, &_harrison, &_patrolCar, NULL); + break; + case 4116: + BF_GLOBALS._walkRegions.proc2(21); + BF_GLOBALS._walkRegions.proc2(22); + _harrison.remove(); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4116, &_patrolCar, 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, &BF_GLOBALS._player, &_passenger, NULL); + break; + case 4121: + BF_GLOBALS._player.disableControl(); + _sceneMode = 6; + setAction(&_sequenceManager1, this, 4121, &BF_GLOBALS._player, &_passenger, 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, &_passenger, &_harrison, NULL); + break; + case 4123: + BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 0); + BF_GLOBALS._player.disableControl(); + _sceneMode = 5; + setAction(&_sequenceManager1, this, 4123, &_driver, &BF_GLOBALS._player, NULL); + break; + case 4124: + BF_GLOBALS._player.disableControl(); + _sceneMode = 7; + setAction(&_sequenceManager1, this, 4124, &_driver, &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, &_passenger, &BF_GLOBALS._player, NULL); + } + } else if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) { + if (!_action) { + _sceneMode = 1; + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager1, this, 4120, &_passenger, &BF_GLOBALS._player, NULL); + } + } + } + + if (!event.handled) + SceneExt::process(event); +} + +void Scene410::dispatch() { + SceneExt::dispatch(); + if ((_sceneMode == 4112) || (_sceneMode == 4101)) { + _harrison.updateAngle(_driver._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); + T2_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); + T2_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); + T2_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); + T2_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, UI_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, UI_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::Weasel::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(); + T2_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::PinBoy::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::Manager::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 { + T2_GLOBALS._uiElements.addScore(30); + scene->_sceneMode = 4510; + BF_INVENTORY.setObjectScene(INV_NAPKIN, 450); + scene->setAction(&scene->_sequenceManager, scene, 4510, &BF_GLOBALS._player, this, NULL); + } + } + 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)) + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(showEugeneID); + + if ((BF_GLOBALS.getFlag(showRapEugene) || BF_GLOBALS.getFlag(showEugeneNapkin)) && + !BF_GLOBALS.getFlag(fMgrCallsWeasel)) { + T2_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::Exit::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) { + _pinBoy.postInit(); + _pinBoy.setVisage(463); + _pinBoy.setPosition(Common::Point(138, 121)); + _pinBoy.fixPriority(100); + _pinBoy.setFrame(_pinBoy.getFrameCount()); + BF_GLOBALS._sceneItems.push_back(&_pinBoy); + } else if (!BF_GLOBALS.getFlag(fWithLyle) || !BF_GLOBALS.getFlag(fGivenNapkin) || + (BF_INVENTORY.getObjectScene(INV_CARAVAN_KEY) == 1)) { + _pinBoy.postInit(); + _pinBoy.setVisage(463); + _pinBoy.setPosition(Common::Point(138, 121)); + _pinBoy.fixPriority(100); + _pinBoy.setFrame(_pinBoy.getFrameCount()); + BF_GLOBALS._sceneItems.push_back(&_pinBoy); + } else { + _manager.postInit(); + _manager.setVisage(467); + _manager.setPosition(Common::Point(138, 121)); + _manager.changeZoom(-1); + _manager.fixPriority(100); + BF_GLOBALS._sceneItems.push_back(&_manager); + + if (!BF_GLOBALS.getFlag(takenWeasel)) { + _object2.postInit(); + _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); + + _weasel.postInit(); + _weasel.setVisage(466); + _weasel.animate(ANIM_MODE_1, NULL); + _weasel.setObjectWrapper(new SceneObjectWrapper()); + _weasel.setPosition(Common::Point(70, 80)); + _weasel.setStrip(5); + _weasel.changeZoom(90); + _weasel.fixPriority(65); + _weasel._flag = 0; + BF_GLOBALS._sceneItems.push_back(&_weasel); + } + } + + _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)) { + _sceneMode = 450; + ADD_MOVER(_object2, -20, 135); + } else { + _sceneMode = 451; + ADD_PLAYER_MOVER(0, 160); + } + break; + case 4503: + _weasel.fixPriority(100); + BF_GLOBALS._player.enableControl(); + break; + case 4505: + BF_GLOBALS.setFlag(takenWeasel); + _weasel.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, &_weasel, &_door, &_manager, NULL); + break; + case 4508: + _manager.remove(); + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + break; + case 4517: + BF_GLOBALS.setFlag(gotTrailer450); + BF_INVENTORY.setObjectScene(INV_CARAVAN_KEY, 1); + _sceneMode = 4508; + setAction(&_sequenceManager, this, 4508, &BF_GLOBALS._player, &_manager, &_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 < (UI_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..6c40211f28 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes4.h @@ -0,0 +1,268 @@ +/* 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 Driver: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Passenger: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Harrison: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Motorcycle: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class TruckFront: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; + Driver _driver; + Passenger _passenger; + Harrison _harrison; + NamedObject _patrolCar, _object5, _object6; + NamedHotspot _background; + Motorcycle _motorcycle; + NamedHotspot _truckBack; + TruckFront _truckFront; + 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, _talkCount, _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 Weasel: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object2: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class PinBoy: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Manager: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Exit: 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; + Weasel _weasel; + NamedObject _object2; + PinBoy _pinBoy; + Manager _manager; + NamedObject _door, _counterDoor; + Exit _exit; + NamedHotspot _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..500cad60b1 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes5.cpp @@ -0,0 +1,2555 @@ +/* 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::Lyle::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(INV_CARAVAN_KEY) == 1 ? 5513 : 5512; + scene->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 INV_CARAVAN_KEY: + 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); + + _lyle.postInit(); + _lyle.setVisage(835); + _lyle.setPosition(Common::Point(139, 83)); + _lyle.setDetails(550, 29, 30, 31, 1, NULL); + _lyle.setStrip(8); + + BF_GLOBALS._player.setVisage(303); + BF_GLOBALS._player.setPosition(Common::Point(89, 76)); + BF_GLOBALS._player.updateAngle(_lyle._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, &_lyle, 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; + T2_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)) { + T2_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)) { + T2_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 < UI_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); + T2_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)) { + T2_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)) { + T2_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 + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + scene->_sound1.play(73); + + T2_GLOBALS._uiElements.hide(); + T2_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: + T2_GLOBALS._uiElements.hide(); + T2_GLOBALS._uiElements._active = false; + scene->_sceneMode = 5705; + scene->setAction(&scene->_sequenceManager, scene, 5705, &scene->_object3, NULL); + break; + case 10: + T2_GLOBALS._uiElements.hide(); + T2_GLOBALS._uiElements._active = false; + scene->_sceneMode = 5706; + scene->setAction(&scene->_sequenceManager, scene, 5706, &scene->_object3, NULL); + break; + case 12: + T2_GLOBALS._uiElements.hide(); + T2_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(); + T2_GLOBALS._uiElements.hide(); + T2_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); + T2_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)) { + T2_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(); + T2_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements.show(); + BF_GLOBALS._player.enableControl(); + break; + case 5704: + case 5705: + case 5706: + case 5707: + T2_GLOBALS._uiElements._active = true; + T2_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; + T2_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 < (UI_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 Scene590::dispatch() { + if (!_action && (BF_GLOBALS._player._position.x < 182) && (BF_GLOBALS._player._position.y > 158)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager, this, 5901, &BF_GLOBALS._player, NULL); + } +} + +} // End of namespace BlueForce + +} // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes5.h b/engines/tsage/blue_force/blueforce_scenes5.h new file mode 100644 index 0000000000..34328ab9e8 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes5.h @@ -0,0 +1,407 @@ +/* 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 Lyle: 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; + Lyle _lyle; + 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); + virtual void dispatch(); +}; + +} // 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..56fdec47cd --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes6.cpp @@ -0,0 +1,515 @@ +/* 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((const 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); +} + +// WORKAROUND: Fix for original game bug where the global scrolling object follower +// remains set to an object within the scene that is no longer active +void Scene600::remove() { + BF_GLOBALS._scrollFollower = &BF_GLOBALS._player; + + SceneExt::remove(); +} + +/*-------------------------------------------------------------------------- + * Scene 620 - Hospital cut-scene + * + *--------------------------------------------------------------------------*/ + +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); + T2_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(); + T2_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..e354e9e069 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes6.h @@ -0,0 +1,125 @@ +/* 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(); + virtual void remove(); +}; + +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..2ced7ce08c --- /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 - Beach + * + *--------------------------------------------------------------------------*/ + +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: { + ADD_MOVER(BF_GLOBALS._player, scene->_laura._position.x + 8, scene->_laura._position.y + 8); + 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::display2(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::display2(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(INV_CRATE1, 1); + _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..91bd1e537f --- /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; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); + virtual 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..c81f3b8d65 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes8.cpp @@ -0,0 +1,3612 @@ +/* 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::display2(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(); + T2_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, 8004, &_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(); + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene800::dispatch() { + SceneExt::dispatch(); + if (BF_GLOBALS._player.getRegionIndex() == 7) { + BF_GLOBALS._player.updateZoom(); + } else { + BF_GLOBALS._player.changeZoom(-1); + } +} + +/*-------------------------------------------------------------------------- + * Scene 810 - Lyle's Office + * + *--------------------------------------------------------------------------*/ + +void Scene810::Action1::signal() { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (scene->_lyle._position.x == 115) { + ADD_PLAYER_MOVER(174, 142); + } else if (scene->_lyle._position.x < 160) { + ADD_PLAYER_MOVER(scene->_lyle._position.x + 20, scene->_lyle._position.y + 15); + } else { + ADD_PLAYER_MOVER(scene->_lyle._position.x - 20, scene->_lyle._position.y + 15); + } + break; + case 1: + BF_GLOBALS._player.updateAngle(scene->_lyle._position); + scene->_stripManager.start(scene->_sceneMode, this); + break; + case 2: + if (BF_GLOBALS.getFlag(shownFax) && (BF_GLOBALS._dayNumber == 3) && !BF_GLOBALS.getFlag(fWithLyle)) + BF_GLOBALS.setFlag(showMugAround); + + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene810::Action2::signal() { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (!BF_GLOBALS.getFlag(shownLyleCrate1Day1)) + T2_GLOBALS._uiElements.addScore(30); + + if (scene->_lyle._position.x == 115) { + ADD_PLAYER_MOVER(174, 142); + } else { + ADD_PLAYER_MOVER(193, 105); + } + break; + case 1: + BF_GLOBALS._player.setStrip(8); + if (scene->_lyle._position.x != 115) + _actionIndex = 3; + + if (BF_GLOBALS.getFlag(shownLyleCrate1Day1)) { + if (BF_GLOBALS.getFlag(onDuty)) { + scene->_stripManager.start(8138, this); + } else { + scene->_stripManager.start((BF_GLOBALS._dayNumber == 3) ? 8110 : 8126, this); + } + } else if (BF_GLOBALS._dayNumber >= 3) { + scene->_stripManager.start(8110, this); + } else { + scene->_stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8140 : 8128, this); + } + break; + case 2: + setAction(&scene->_sequenceManager1, this, 8117, &scene->_lyle, &scene->_chair, NULL); + break; + case 3: + BF_GLOBALS._walkRegions.proc2(4); + ADD_PLAYER_MOVER_THIS(scene->_lyle, 27, 124); + break; + case 4: + scene->_lyle.setVisage(813); + scene->_lyle.setStrip(2); + scene->_lyle.setFrame(1); + + ADD_PLAYER_MOVER(84, 113); + break; + case 5: + BF_GLOBALS._player.setStrip(8); + scene->_lyle.animate(ANIM_MODE_4, 5, 1, this); + break; + case 6: + scene->_lyle.animate(ANIM_MODE_5, NULL); + scene->_stripManager.start(8111, this); + break; + case 7: + scene->_lyle.setVisage(845); + scene->_lyle.setStrip(1); + scene->_lyle.setFrame(1); + scene->_lyle.animate(ANIM_MODE_1, NULL); + + scene->_stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8137 : 8112, this); + break; + case 8: + BF_GLOBALS._walkRegions.proc1(13); + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene810::Lyle::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 26); + return true; + + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.updateAngle(_position); + + switch (BF_GLOBALS._dayNumber) { + case 4: + scene->_sceneMode = (BF_INVENTORY.getObjectScene(INV_AUTO_RIFLE) == 810) ? 8001 : 8123; + break; + case 2: + if (BF_GLOBALS.getFlag(shownFax)) + scene->_sceneMode = 8151; + else if (BF_GLOBALS.getFlag(onDuty)) { + if (BF_GLOBALS.getFlag(shownLyleCrate1)) { + scene->_sceneMode = BF_GLOBALS.getFlag(shownLyleCrate1Day1) ? 8145 : 8154; + } else if (BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLylePO)) { + scene->_sceneMode = 8145; + } else if (!_flag) { + ++_flag; + scene->_sceneMode = 8139; + } else { + scene->_sceneMode = 8152; + } + } else { + if (BF_GLOBALS.getFlag(shownLyleCrate1)) { + scene->_sceneMode = BF_GLOBALS.getFlag(shownLyleCrate1Day1) ? 8133 : 8153; + } else if (BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLylePO)) { + scene->_sceneMode = 8133; + } else if (!_flag) { + ++_flag; + scene->_sceneMode = 8127; + } else { + scene->_sceneMode = 8152; + } + } + break; + default: + if (BF_GLOBALS.getFlag(shownFax)) + scene->_sceneMode = 8146; + else if (BF_GLOBALS.getFlag(shownLylePO) || BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLyleCrate1)) + scene->_sceneMode = 8108; + else if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) + scene->_sceneMode = 8107; + else + scene->_sceneMode = 8155; + break; + } + + scene->setAction(&scene->_action1); + return true; + + case INV_FOREST_RAP: + if (BF_GLOBALS.getFlag(shownLyleRapsheet)) + scene->_sceneMode = 8148; + else { + BF_GLOBALS.setFlag(shownLyleRapsheet); + if (BF_GLOBALS._dayNumber != 2) { + scene->_sceneMode = BF_GLOBALS.getFlag(shownLylePO) ? 8122 : 8101; + } else if (BF_GLOBALS.getFlag(onDuty)) { + scene->_sceneMode = BF_GLOBALS.getFlag(shownLylePO) ? 8142 : 8143; + } else { + scene->_sceneMode = BF_GLOBALS.getFlag(shownLylePO) ? 8130 : 8131; + } + } + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_action1); + return true; + + case INV_COBB_RAP: + if (BF_GLOBALS.getFlag(shownFax)) { + scene->_sceneMode = 8151; + } else { + BF_GLOBALS.setFlag(shownFax); + scene->_sceneMode = 8118; + } + + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_action1); + return true; + + case INV_AUTO_RIFLE: + BF_INVENTORY.setObjectScene(INV_AUTO_RIFLE, 810); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8116; + scene->setAction(&scene->_sequenceManager1, scene, 8116, &BF_GLOBALS._player, NULL); + return true; + + case INV_PRINT_OUT: + if (BF_GLOBALS.getFlag(shownLylePO)) { + scene->_sceneMode = 8149; + } else if (!BF_GLOBALS.getFlag(shownLylePO)) { + if (!BF_GLOBALS.getFlag(shownFax)) { + // WORKAROUND: Original did not do a 'not', but I think this is correct + BF_GLOBALS.setFlag(shownFax); + scene->_sceneMode = 8125; + } else if (BF_GLOBALS.getFlag(shownLyleRapsheet)) { + scene->_sceneMode = 8104; + } else { + scene->_sceneMode = 8121; + } + } else if (BF_GLOBALS.getFlag(onDuty)) { + scene->_sceneMode = 8141; + } else { + if (BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLyleCrate1)) + scene->_sceneMode = 8129; + else + scene->_sceneMode = 8121; + } + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_action1); + return true; + + case INV_CRATE1: + if (BF_GLOBALS.getFlag(shownLyleCrate1)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8147; + scene->setAction(&scene->_action1); + } else { + BF_GLOBALS.setFlag(shownLyleCrate1); + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_action2); + } + return true; + + default: + return NamedObjectExt::startAction(action, event); + } +} + +bool Scene810::Chair::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 28); + return true; + case CURSOR_USE: + SceneItem::display2(810, 29); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene810::Object3::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 30); + return true; + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(seenFolder)) { + BF_GLOBALS.setFlag(seenFolder); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8104; + scene->setAction(&scene->_sequenceManager1, scene, 8104, &BF_GLOBALS._player, this, NULL); + } else if (BF_INVENTORY.getObjectScene(INV_MICROFILM) == 810) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8114; + scene->setAction(&scene->_sequenceManager1, scene, 8114, &BF_GLOBALS._player, NULL); + } else { + SceneItem::display2(810, 38); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene810::FaxMachineInset::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_WALK: + return true; + case CURSOR_LOOK: + SceneItem::display2(810, 32); + return true; + case CURSOR_USE: + if (scene->_rect3.contains(event.mousePos)) { + if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 811) { + T2_GLOBALS._uiElements.addScore(50); + scene->_sound1.play(77); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 8109; + scene->setAction(&scene->_sequenceManager1, scene, 8109, &BF_GLOBALS._player, + &scene->_object6, &scene->_object5, NULL); + scene->_fieldA70 = 1; + scene->_fieldA74 = 1; + remove(); + } else { + SceneItem::display2(810, 39); + } + } + + if (scene->_rect1.contains(event.mousePos) || scene->_rect2.contains(event.mousePos)) { + if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 811) { + scene->_sound1.play(77); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 8109; + scene->setAction(&scene->_sequenceManager1, scene, 8109, &BF_GLOBALS._player, + &scene->_object6, &scene->_object5, NULL); + scene->_fieldA74 = 1; + remove(); + } else { + SceneItem::display2(810, 39); + } + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene810::Object5::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 33); + return true; + case CURSOR_USE: { + scene->_sceneMode = 8195; + BF_GLOBALS._player.disableControl(); + + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(67, 111); + BF_GLOBALS._player.addMover(mover, &destPos, scene); + return true; + } + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene810::Object7::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8113; + scene->setAction(&scene->_sequenceManager1, scene, 8113, &BF_GLOBALS._player, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene810::Map::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 0); + return true; + case CURSOR_USE: + SceneItem::display2(810, 1); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Window::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 2); + return true; + case CURSOR_USE: + SceneItem::display2(810, 3); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Bookcase::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 4); + return true; + case CURSOR_USE: + SceneItem::display2(810, 5); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::FaxMachine::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 6); + return true; + case CURSOR_USE: + if (scene->_fieldA74 == 1) { + scene->_object5.startAction(action, event); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8105; + + Common::Point destPos(67, 111); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &destPos, scene); + } + return true; + case INV_PRINT_OUT: + if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) + SceneItem::display2(810, 31); + else { + BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 811); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 811; + + if (BF_GLOBALS._sceneObjects->contains(&scene->_lyle)) { + scene->setAction(&scene->_sequenceManager1, scene, BF_GLOBALS.getFlag(onDuty) ? 8108 : 8105, + &BF_GLOBALS._player, &scene->_object6, NULL); + } else { + scene->setAction(&scene->_sequenceManager1, scene, 8111, &BF_GLOBALS._player, + &scene->_object6, NULL); + } + } + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::GarbageCan::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 8); + return true; + case CURSOR_USE: + SceneItem::display2(810, 9); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::FileCabinets::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 10); + return true; + case CURSOR_USE: + SceneItem::display2(810, 11); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::CoffeeMaker::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 12); + return true; + case CURSOR_USE: + SceneItem::display2(810, 13); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Shelves::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 14); + return true; + case CURSOR_USE: + SceneItem::display2(810, 15); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::MicroficheReader::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 16); + return true; + case CURSOR_USE: + SceneItem::display2(810, 17); + return true; + case INV_MICROFILM: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8106; + scene->setAction(&scene->_sequenceManager1, scene, 8106, &BF_GLOBALS._player, NULL); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Item10::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 18); + return true; + case CURSOR_USE: + SceneItem::display2(810, 19); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Pictures::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 20); + return true; + case CURSOR_USE: + SceneItem::display2(810, 21); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Item12::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 22); + return true; + case CURSOR_USE: + SceneItem::display2(810, 23); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Background::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 24); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Desk::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 36); + return true; + case CURSOR_USE: + SceneItem::display2(810, 37); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Exit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER(event.mousePos.x + 30, event.mousePos.y); + return true; +} + +/*--------------------------------------------------------------------------*/ + +Scene810::Scene810(): SceneExt() { + _fieldA70 = _fieldA74 = 0; + _rect1 = Rect(68, 12, 120, 22); + _rect2 = Rect(59, 27, 117, 37); + _rect3 = Rect(49, 43, 112, 54); +} + +void Scene810::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_fieldA70); + s.syncAsSint16LE(_fieldA72); + s.syncAsSint16LE(_fieldA74); +} + +void Scene810::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(810); + setZoomPercents(90, 80, 135, 100); + if (BF_GLOBALS._sceneManager._previousScene != 820) + BF_GLOBALS._sound1.fadeSound(76); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player._moveDiff = Common::Point(5, 3); + BF_GLOBALS._player.enableControl(); + + if (BF_GLOBALS._dayNumber == 2) + BF_GLOBALS.setFlag(beenToJRDay2); + + if (BF_GLOBALS._dayNumber == 3) { + _object3.postInit(); + _object3.setVisage(810); + _object3.setStrip(3); + _object3.setPosition(Common::Point(154, 97)); + _object3.fixPriority(128); + BF_GLOBALS._sceneItems.push_back(&_object3); + } + + if (BF_GLOBALS._dayNumber == 4) { + BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 0); + BF_INVENTORY.setObjectScene(INV_COBB_RAP, 0); + BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 0); + BF_INVENTORY.setObjectScene(INV_CRATE1, 0); + } + + _desk._sceneRegionId = 12; + BF_GLOBALS._sceneItems.push_back(&_desk); + + _lyle.postInit(); + _lyle.setVisage(812); + _lyle.setPosition(Common::Point(115, 112)); + _lyle._moveDiff = Common::Point(4, 2); + _lyle.changeZoom(-1); + _lyle._flag = 0; + BF_GLOBALS._sceneItems.push_back(&_lyle); + + _chair.postInit(); + _chair.setVisage(810); + _chair.setStrip(2); + _chair.setPosition(Common::Point(113, 126)); + _chair.hide(); + BF_GLOBALS._sceneItems.push_back(&_chair); + + _object6.postInit(); + _object6.setVisage(810); + _object6.setStrip(6); + _object6.setPosition(Common::Point(51, 65)); + _object6._numFrames = 3; + _object6.hide(); + + _object5.postInit(); + _object5.setVisage(810); + _object5.setStrip(5); + _object5.setPosition(Common::Point(58, 82)); + _object5._numFrames = 3; + _object5.fixPriority(108); + _object5.hide(); + + if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 811) { + _object5.show(); + BF_GLOBALS._sceneItems.push_back(&_object5); + } + + if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark < bEndDayThree)) { + _lyle.remove(); + _chair.show(); + } + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 820: + BF_GLOBALS._player.setStrip(7); + BF_GLOBALS._player.setPosition(Common::Point(278, 116)); + + _lyle.setVisage(845); + _lyle.setPosition(Common::Point(340, 175)); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + + _chair.show(); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 8107; + setAction(&_sequenceManager1, this, 8107, &BF_GLOBALS._player, &_lyle, NULL); + break; + case 935: + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._scenePalette.loadPalette(2); + _lyle.remove(); + + BF_GLOBALS._player.setPosition(Common::Point(174, 142)); + BF_GLOBALS._player.setStrip(8); + BF_GLOBALS._player.enableControl(); + + _chair.remove(); + break; + default: + BF_GLOBALS._player.setPosition(Common::Point(340, 180)); + BF_GLOBALS._player.disableControl(); + _sceneMode = 8100; + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.setVisage(845); + _lyle.setPosition(Common::Point(340, 175)); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + + _chair.show(); + _sceneMode = 8196; + setAction(&_sequenceManager1, NULL, 8100, &BF_GLOBALS._player, NULL); + _lyle.setAction(&_sequenceManager2, this, 8107, &BF_GLOBALS._player, &_lyle, NULL); + } else { + setAction(&_sequenceManager1, this, 8100, &BF_GLOBALS._player, NULL); + } + break; + } + + _exit.setDetails(Rect(315, 117, 320, 154), 810, -1, -1, -1, 1, NULL); + _map.setBounds(Rect(10, 10, 81, 52)); + _window.setBounds(Rect(96, 10, 155, 49)); + _bookcase.setBounds(Rect(5, 70, 74, 105)); + _garbageCan.setBounds(Rect(84, 118, 101, 142)); + _fileCabinets.setBounds(Rect(203, 41, 255, 100)); + _coffeeMaker.setBounds(Rect(182, 54, 202, 89)); + _shelves.setBounds(Rect(265, 10, 319, 41)); + _microficheReader.setBounds(Rect(283, 47, 314, 73)); + + _faxMachine._sceneRegionId = 8; + BF_GLOBALS._sceneItems.push_back(&_faxMachine); + _item10._sceneRegionId = 9; + BF_GLOBALS._sceneItems.push_back(&_item10); + _pictures._sceneRegionId = 10; + BF_GLOBALS._sceneItems.push_back(&_pictures); + _item12._sceneRegionId = 8; + BF_GLOBALS._sceneItems.push_back(&_item12); + + BF_GLOBALS._sceneItems.addItems(&_microficheReader, &_map, &_window, &_bookcase, &_garbageCan, + &_fileCabinets, &_coffeeMaker, &_shelves, &_background, NULL); + _background.setBounds(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y)); +} + +void Scene810::signal() { + switch (_sceneMode) { + case 811: + case 8105: + _faxMachineInset.postInit(); + _faxMachineInset.setVisage(810); + _faxMachineInset.setPosition(Common::Point(77, 94)); + _faxMachineInset.setStrip(8); + _faxMachineInset.fixPriority(250); + BF_GLOBALS._sceneItems.push_back(&_faxMachineInset); + BF_GLOBALS._player.enableControl(); + break; + case 8100: + if (BF_GLOBALS.getFlag(examinedFile810)) { + if ((BF_GLOBALS._dayNumber == 4) && BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _sceneMode = 8115; + setAction(&_sequenceManager1, this, 8115, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + } else { + if ((BF_GLOBALS._dayNumber == 3) && BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _sceneMode = 8103; + setAction(&_sequenceManager1, this, 8103, &BF_GLOBALS._player, &_lyle, &_chair, NULL); + } else if (BF_GLOBALS.getFlag(shownLyleCrate1Day1) && !BF_GLOBALS.getFlag(shownLyleCrate1)) { + BF_GLOBALS.setFlag(shownLyleCrate1); + setAction(&_action2); + } else { + BF_GLOBALS._player.enableControl(); + } + } + break; + case 8101: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(800); + break; + case 8103: + _lyle.remove(); + BF_GLOBALS._player.enableControl(); + break; + case 8104: + BF_GLOBALS.setFlag(examinedFile810); + _object7.postInit(); + _object7.setVisage(810); + _object7.setPosition(Common::Point(54, 101)); + _object7.fixPriority(200); + BF_GLOBALS._sceneItems.push_front(&_object7); + BF_GLOBALS._player.enableControl(); + break; + case 8106: + T2_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene(INV_MICROFILM, 820); + BF_GLOBALS._sceneManager.changeScene(820); + break; + case 8107: + if (BF_GLOBALS.getFlag(shownFax)) { + BF_GLOBALS.setFlag(showMugAround); + } else { + BF_GLOBALS._walkRegions.proc1(4); + BF_GLOBALS._player.enableControl(); + } + break; + case 8109: + _object6.setFrame(1); + BF_GLOBALS._sceneItems.push_front(&_object5); + BF_GLOBALS._player.enableControl(); + break; + case 8110: + case 8115: + BF_GLOBALS._player.enableControl(); + break; + case 8112: + BF_GLOBALS.setFlag(fWithLyle); + BF_GLOBALS._sceneManager.changeScene(800); + break; + case 8113: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(935); + break; + case 8114: + T2_GLOBALS._uiElements.addScore(10); + BF_INVENTORY.setObjectScene(INV_MICROFILM, 1); + BF_GLOBALS._player.enableControl(); + break; + case 8116: + BF_GLOBALS._bookmark = bDoneWithIsland; + BF_GLOBALS._player.enableControl(); + break; + case 8195: + BF_GLOBALS._player.setStrip(8); + BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 1); + if (_fieldA70 == 1) { + BF_INVENTORY.setObjectScene(INV_COBB_RAP, 1); + _sceneMode = 8110; + if (BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _sceneMode = 8198; + BF_GLOBALS.setFlag(shownFax); + _stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8135 : 8106, this); + } else { + _stripManager.start(8117, this); + } + } else { + SceneItem::display2(810, 34); + BF_GLOBALS._player.enableControl(); + } + + _fieldA74 = 0; + _object5.hide(); + _object5.setFrame(1); + break; + case 8196: + BF_GLOBALS._walkRegions.proc1(4); + BF_GLOBALS._player.enableControl(); + break; + case 8198: + if (BF_GLOBALS._dayNumber == 3) { + BF_GLOBALS.setFlag(showMugAround); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + default: + break; + } +} + +void Scene810::process(Event &event) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_exit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E); + BF_GLOBALS._events.setCursor(surface); + } else { + // In case an exit cursor was being shown, restore the previously selected cursor + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } + + if (!event.handled) + SceneExt::process(event); +} + +void Scene810::dispatch() { + SceneExt::dispatch(); + + if (BF_GLOBALS._sceneObjects->contains(&_lyle) && (BF_GLOBALS._player._position.x != 115) && !_lyle._mover) { + _lyle.updateAngle(BF_GLOBALS._player._position); + } + + if (BF_GLOBALS._sceneObjects->contains(&_faxMachineInset) && (BF_GLOBALS._player._position.x != 67) && + (BF_GLOBALS._player._position.y != 111)) { + _faxMachineInset.remove(); + } + + if (!_action) { + if (BF_GLOBALS.getFlag(showMugAround)) { + if (_lyle._position.y == 115) { + BF_GLOBALS._player.disableControl(); + + _sceneMode = 8110; + setAction(&_sequenceManager1, this, 8117, &_lyle, &_chair, NULL); + } else { + BF_GLOBALS.clearFlag(showMugAround); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._walkRegions.proc2(4); + BF_GLOBALS._walkRegions.proc2(13); + + _sceneMode = 8112; + setAction(&_sequenceManager1, this, 8112, &BF_GLOBALS._player, &_lyle, NULL); + } + } + + if (BF_GLOBALS._player._position.x >= 318) { + BF_GLOBALS._player.disableControl(); + + if ((BF_GLOBALS._dayNumber == 3) && !BF_GLOBALS.getFlag(examinedFile810)) { + SceneItem::display2(810, 35); + _sceneMode = 8100; + setAction(&_sequenceManager1, this, 8100, &BF_GLOBALS._player, NULL); + } else { + if (BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._walkRegions.proc2(4); + BF_GLOBALS._walkRegions.proc2(13); + + ADD_MOVER_NULL(_lyle, 320, 155); + } + + _sceneMode = 8101; + setAction(&_sequenceManager1, this, 8101, &BF_GLOBALS._player, NULL); + } + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 820 - Microfiche Reader + * + *--------------------------------------------------------------------------*/ + +bool Scene820::PowerButton::startAction(CursorType action, Event &event) { + Scene820 *scene = (Scene820 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(820, 5); + return true; + case CURSOR_USE: + scene->_sound1.play(69); + if (_flags & OBJFLAG_HIDING) { + scene->_pageNumber = 0; + show(); + BF_GLOBALS._scenePalette.loadPalette(821); + BF_GLOBALS._scenePalette.refresh(); + + SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0, + SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END); + } else { + BF_GLOBALS._scenePalette.loadPalette(820); + BF_GLOBALS._scenePalette.refresh(); + + scene->_object4.remove(); + scene->_object5.remove(); + + SceneItem::display(0, 0); + hide(); + + BF_GLOBALS._sceneManager.changeScene(810); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene820::BackButton::startAction(CursorType action, Event &event) { + Scene820 *scene = (Scene820 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(820, 7); + return true; + case CURSOR_USE: + // WORKAROUND: The original game had a bug where you could see the microfiche text by directly + // using the paging buttons, but then you had to use the power button twice to 'turn on' the + // reader and then off again. This check prevents the paging buttons being used until the + // reader is properly turned on. + if (scene->_powerButton._flags & OBJFLAG_HIDING) + return true; + + scene->_sound1.play(72); + show(); + scene->_sceneMode = 8200; + scene->setAction(&scene->_sequenceManager, scene, 8200, NULL); + + if (scene->_pageNumber) + --scene->_pageNumber; + if (scene->_pageNumber == 3) { + scene->_object4.hide(); + scene->_object5.hide(); + } + + SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0, + SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene820::ForwardButton::startAction(CursorType action, Event &event) { + Scene820 *scene = (Scene820 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(820, 6); + return true; + case CURSOR_USE: + // WORKAROUND: The original game had a bug where you could see the microfiche text by directly + // using the paging buttons, but then you had to use the power button twice to 'turn on' the + // reader and then off again. This check prevents the paging buttons being used until the + // reader is properly turned on. + if (scene->_powerButton._flags & OBJFLAG_HIDING) + return true; + + scene->_sound1.play(72); + show(); + scene->_sceneMode = 8200; + scene->setAction(&scene->_sequenceManager, scene, 8200, NULL); + + if (scene->_pageNumber < 4) + ++scene->_pageNumber; + + SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0, + SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END); + + if (scene->_pageNumber == 4) { + scene->_object4.show(); + scene->_object5.show(); + } + + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +Scene820::Scene820(): SceneExt() { + _pageNumber = 0; +} + +void Scene820::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_pageNumber); +} + +void Scene820::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(820); + + _stripManager.addSpeaker(&_gameTextSpeaker); + + _powerButton.postInit(); + _powerButton.setVisage(820); + _powerButton.setPosition(Common::Point(42, 163)); + _powerButton.hide(); + BF_GLOBALS._sceneItems.push_back(&_powerButton); + + _backButton.postInit(); + _backButton.setVisage(820); + _backButton.setStrip(2); + _backButton.setPosition(Common::Point(278, 155)); + _backButton.hide(); + BF_GLOBALS._sceneItems.push_back(&_backButton); + + _forwardButton.postInit(); + _forwardButton.setVisage(820); + _forwardButton.setStrip(3); + _forwardButton.setPosition(Common::Point(278, 164)); + _forwardButton.hide(); + BF_GLOBALS._sceneItems.push_back(&_forwardButton); + + _object4.postInit(); + _object4.setVisage(821); + _object4.setPosition(Common::Point(96, 130)); + _object4.hide(); + + _object5.postInit(); + _object5.setVisage(821); + _object5.setStrip(2); + _object5.setPosition(Common::Point(223, 130)); + _object5.hide(); + + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 820, -1, -1, -1, 1, NULL); +} + +void Scene820::signal() { + if (_sceneMode == 8200) { + _forwardButton.hide(); + _backButton.hide(); + } +} + +/*-------------------------------------------------------------------------- + * Scene 830 - Outside Boat Rentals + * + *--------------------------------------------------------------------------*/ + +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::RentalBoat::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, 834, &BF_GLOBALS._player, &scene->_rentalBoat, 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) { + _rentalBoat.postInit(); + _rentalBoat.setVisage(830); + _rentalBoat.setStrip(1); + _rentalBoat.setPosition(Common::Point(271, 146)); + _rentalBoat.fixPriority(90); + _rentalBoat.setDetails(830, 0, 1, 2, 1, NULL); + } + + _door.postInit(); + _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; + + T2_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene(INV_CARTER_NOTE, 1); + break; + case 8307: + BF_GLOBALS._player.enableControl(); + _object5.remove(); + T2_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; + } + + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_seExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SE); + 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::BoatKeysInset::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::BoatKeysInset::remove() { + Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; + + _rentalKeys.remove(); + _waveKeys.remove(); + FocusObject::remove(); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 8412; + scene->setAction(&scene->_sequenceManager1, scene, 8412, &BF_GLOBALS._player, NULL); +} + +void Scene840::BoatKeysInset::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::BoatKeysInset::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::display2(840, 47); + else { + T2_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::BoatKeysInset::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); + T2_GLOBALS._uiElements.addScore(30); + + scene->_boatKeysInset._v1B4 = 1; + remove(); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene840::BoatKeysInset::WaveKeys::startAction(CursorType action, Event &event) { + Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (scene->_field1AC2) { + SceneItem::display2(840, 56); + BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 1); + T2_GLOBALS._uiElements.addScore(50); + scene->_boatKeysInset._v1B6 = 1; + remove(); + } else { + SceneItem::display2(840, 9); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene840::BoatKeys::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)) { + T2_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, UI_INTERFACE_Y), 840, 41, 42, 43, 1, NULL); + + if (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) { + _boatKeys.postInit(); + _boatKeys.setVisage(840); + _boatKeys.setStrip(4); + _boatKeys.setFrame(1); + _boatKeys.setPosition(Common::Point(250, 83)); + _boatKeys.fixPriority(120); + _boatKeys.setDetails(840, -1, 8, 9, 2, NULL); + _field1AC0 = 1; + } + + _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; + _boatKeys.postInit(); + _boatKeys.setDetails(840, -1, 8, 9, 2, NULL); + setAction(&_sequenceManager1, this, 8403, &_carter, &_boatKeys, 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(&_boatKeys)) { + _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(); + T2_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene(INV_CARTER_NOTE, 3); + BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 1); + BF_INVENTORY.setObjectScene(INV_RENTAL_COUPON, 1); + break; + case 8403: + T2_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(); + _boatKeysInset.postInit(); + _boatKeysInset.setVisage(840); + _boatKeysInset.setStrip(2); + _boatKeysInset.setPosition(Common::Point(160, 140)); + _boatKeysInset.fixPriority(254); + _boatKeysInset.setDetails(840, 50, 8, 51); + break; + case 8412: + if (_boatKeysInset._v1B6) { + _sceneMode = 8409; + setAction(&_sequenceManager1, this, 8409, &BF_GLOBALS._player, &_carter, &_doors, NULL); + } else if (!_boatKeysInset._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: + T2_GLOBALS._uiElements.addScore(50); + _sceneMode = 8409; + setAction(&_sequenceManager1, this, 8409, &BF_GLOBALS._player, &_carter, &_doors, NULL); + break; + case 8417: + _field1ABA = 1; + T2_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 < (UI_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); + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 850 - Boat Leaving/Entering Marina + * + *--------------------------------------------------------------------------*/ + +void Scene850::Timer1::signal() { + PaletteRotation *rot = BF_GLOBALS._scenePalette.addRotation(240, 254, 1); + rot->setDelay(25); + + remove(); +} + +/*--------------------------------------------------------------------------*/ + +void Scene850::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(850); + BF_GLOBALS._sound1.fadeSound(35); + + BF_GLOBALS._player.disableControl(); + _timer.set(2, NULL); + + _object1.postInit(); + if (BF_GLOBALS._sceneManager._previousScene == 830) { + _sceneMode = 8500; + setAction(&_sequenceManager, this, 8500, &_object1, NULL); + } else { + BF_GLOBALS._sound1.changeSound(10); + _sceneMode = 8501; + setAction(&_sequenceManager, this, 8501, &_object1, NULL); + } +} + +void Scene850::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + SceneExt::remove(); +} + +void Scene850::signal() { + switch (_sceneMode) { + case 8500: + BF_GLOBALS._sceneManager.changeScene(860); + break; + case 8501: + BF_GLOBALS._sceneManager.changeScene(830); + break; + default: + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 860 - Boat Entering Cove + * + *--------------------------------------------------------------------------*/ + +void Scene860::Action1::signal() { + Scene860 *scene = (Scene860 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_sound1.play(88); + scene->_sound1.holdAt(1); + + if (scene->_field888 == scene->_field886) { + ++_actionIndex; + signal(); + } else { + BF_GLOBALS._player.addMover(NULL); + BF_GLOBALS._player.setStrip((scene->_field886 == 1) ? 4 : 5); + scene->_field888 = scene->_field886; + + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player._numFrames = 9; + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + } + break; + case 1: + if (scene->_field886 == 1) { + BF_GLOBALS._player._position.x += 5; + BF_GLOBALS._player.setStrip(3); + } else { + BF_GLOBALS._player._position.x -= 5; + BF_GLOBALS._player.setStrip(2); + } + signal(); + // Deliberate fall-through + case 2: + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + ADD_MOVER_NULL(BF_GLOBALS._player, scene->_destPos.x, scene->_destPos.y); + remove(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene860::Scene860(): SceneExt() { + _field87E = _field880 = 0; + _destPos.x = _destPos.y = 0; + _field886 = _field888 = 0; + + _swRect = Rect(37, 102, 175, 128); + _neRect = Rect(259, 50, 320, 84); +} + +void Scene860::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field87E); + s.syncAsSint16LE(_field880); + s.syncAsSint16LE(_destPos.x); + s.syncAsSint16LE(_destPos.y); + s.syncAsSint16LE(_field886); + s.syncAsSint16LE(_field888); + + _swRect.synchronize(s); + _neRect.synchronize(s); + _yachtRect.synchronize(s); +} + +void Scene860::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(880); + + BF_GLOBALS._sound1.changeSound(90); + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._dayNumber = 1; + BF_GLOBALS.setFlag(fBlowUpGoon); + } + + if (BF_GLOBALS.getFlag(fBlowUpGoon)) { + _deadBody.postInit(); + _deadBody.setVisage(875); + _deadBody.setStrip(7); + _deadBody.setFrame2(_deadBody.getFrameCount()); + _deadBody.fixPriority(130); + _deadBody.setPosition(Common::Point(255, 148)); + } + + if (BF_GLOBALS._dayNumber == 5) { + _object2.postInit(); + _object2.setVisage(880); + _object2.setPosition(Common::Point(196, 81)); + BF_GLOBALS._sceneItems.push_back(&_object2); + _object2.setDetails(860, 0, 1, -1, 1, NULL); + _object2.fixPriority(20); + + _neRect = Rect(0, 0, 0, 0); + _yachtRect = Rect(180, 66, 219, 79); + } + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(880); + BF_GLOBALS._player._moveDiff = Common::Point(1, 1); + BF_GLOBALS._player._moveRate = 20; + + BF_GLOBALS._events.setCursor(CURSOR_WALK); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player._canWalk = false; + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 355: + if (BF_INVENTORY.getObjectScene(INV_GRENADES) == 860) { + _sceneMode = 8610; + setAction(&_sequenceManager, this, 8610, &BF_GLOBALS._player, NULL); + } else { + _sceneMode = 8609; + setAction(&_sequenceManager, this, 8609, &BF_GLOBALS._player, NULL); + _field87E = 0; + _field880 = 1; + _field888 = 1; + } + break; + case 870: + _sound1.play(89); + _sound1.holdAt(1); + _sceneMode = 8608; + setAction(&_sequenceManager, this, 8608, &BF_GLOBALS._player, NULL); + _field880 = 0; + _field87E = 2; + _field888 = 1; + break; + default: + _sound1.play(89); + _sound1.holdAt(1); + _sceneMode = 8607; + setAction(&_sequenceManager, this, 8607, &BF_GLOBALS._player, NULL); + _field87E = 0; + _field880 = 2; + _field888 = 1; + break; + } +} + +void Scene860::signal() { + switch (_sceneMode) { + case 8601: + case 8606: + BF_GLOBALS._sceneManager.changeScene(870); + break; + case 8602: + case 8604: + BF_GLOBALS._sceneManager.changeScene(355); + break; + case 8603: + case 8605: + BF_GLOBALS._sceneManager.changeScene(850); + break; + case 8607: + case 8608: + case 8609: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + break; + case 8610: + BF_GLOBALS._deathReason = 22; + BF_GLOBALS._sceneManager.changeScene(866); + break; + default: + break; + } +} + +void Scene860::process(Event &event) { + if (_swRect.contains(event.mousePos)) { + GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_SW); + BF_GLOBALS._events.setCursor(cursor); + + if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) { + event.handled = true; + _field886 = 2; + _destPos = Common::Point(119, 126); + _field87E = 0; + setAction(&_action1); + } + } else if (_neRect.contains(event.mousePos)) { + GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_NE); + BF_GLOBALS._events.setCursor(cursor); + + if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) { + event.handled = true; + _field886 = 1; + _destPos = Common::Point(266, 56); + _field87E = 2; + setAction(&_action1); + } + } else if (_yachtRect.contains(event.mousePos)) { + GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_NW); + BF_GLOBALS._events.setCursor(cursor); + + if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) { + event.handled = true; + _field886 = (BF_GLOBALS._player._position.y <= 78) ? 2 : 1; + _destPos = Common::Point(212, 78); + _field87E = 1; + setAction(&_action1); + } + } else { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } +} + +void Scene860::dispatch() { + if (_action) { + _action->dispatch(); + } else if (_swRect.contains(BF_GLOBALS._player._position) && (_field87E == 0)) { + _sound1.play(88); + BF_GLOBALS._sceneManager.changeScene(870); + } else if (_neRect.contains(BF_GLOBALS._player._position) && (_field87E == 2)) { + _sound1.release(); + BF_GLOBALS._sceneManager.changeScene(850); + } else if (_yachtRect.contains(BF_GLOBALS._player._position) && (_field87E == 1)) { + _sound1.play(88); + BF_GLOBALS._sceneManager.changeScene(355); + } +} + +/*-------------------------------------------------------------------------- + * Scene 870 - Cove Beach + * + *--------------------------------------------------------------------------*/ + +bool Scene870::Lyle::startAction(CursorType action, Event &event) { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_TALK) { + if (BF_GLOBALS.getFlag(fTookTrailerAmmo)) { + scene->startStrip((BF_GLOBALS._bookmark >= bFinishedWGreen) ? 8704 : 8701); + } else { + scene->startStrip(8700); + } + return true; + } else { + return NamedObjectExt::startAction(action, event); + } +} + +bool Scene870::Green::startAction(CursorType action, Event &event) { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_TALK) { + if (!BF_GLOBALS.getFlag(fLyleOnIsland) && !scene->_field1664 && (BF_GLOBALS._bookmark == bFinishedWGreen)) { + scene->startStrip(8703); + ++scene->_field1664; + } else { + scene->startStrip(8705); + } + return true; + } else { + return NamedObjectExt::startAction(action, event); + } +} + +void Scene870::CrateInset::postInit(SceneObjectList *OwnerList) { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + FocusObject::postInit(); + setVisage(870); + setStrip(5); + setFrame(scene->_field1662); + setPosition(Common::Point(160, 130)); + fixPriority(250); + + if (scene->_field1662 == 3) { + initContents(); + } +} + +void Scene870::CrateInset::initContents() { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + if (BF_INVENTORY.getObjectScene(INV_JAR) == 870) { + // Jar still in crate, so display it + _jar.postInit(); + _jar.setVisage(870); + _jar.setStrip(4); + _jar.setFrame(5); + _jar.setPosition(Common::Point(scene->_crateInset._position.x + 5, + scene->_crateInset._position.y - 26)); + _jar.fixPriority(251); + _jar.setDetails(870, 39, 40, 41, 1, NULL); + BF_GLOBALS._sceneItems.remove(&_jar); + BF_GLOBALS._sceneItems.push_front(&_jar); + } + + if (BF_INVENTORY.getObjectScene(INV_RAGS) == 870) { + // Rags still in crate, so display it + _rags.postInit(); + _rags.setVisage(870); + _rags.setStrip(4); + _rags.setFrame(6); + _rags.setPosition(Common::Point(scene->_crateInset._position.x - 18, + scene->_crateInset._position.y - 18)); + _rags.fixPriority(251); + _rags.setDetails(870, 42, 43, 44, 1, NULL); + BF_GLOBALS._sceneItems.remove(&_rags); + BF_GLOBALS._sceneItems.push_front(&_rags); + } +} + +void Scene870::CrateInset::remove() { + _jar.remove(); + _rags.remove(); + FocusObject::remove(); +} + +bool Scene870::CrateInset::startAction(CursorType action, Event &event) { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_WALK: + return true; + case CURSOR_LOOK: + if (scene->_field1662 != 2) + break; + + scene->_field1662 = 3; + setFrame(3); + initContents(); + return true; + case CURSOR_USE: + if (scene->_field1662 == 2) { + setFrame(1); + scene->_field1662 = 1; + } else { + setFrame(2); + scene->_field1662 = 2; + _jar.remove(); + _rags.remove(); + } + return true; + default: + break; + } + + return FocusObject::startAction(action, event); +} + +bool Scene870::CrateInset::Jar::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) { + BF_INVENTORY.setObjectScene(INV_JAR, 1); + remove(); + T2_GLOBALS._uiElements.addScore(30); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene870::CrateInset::Rags::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) { + BF_INVENTORY.setObjectScene(INV_RAGS, 1); + remove(); + T2_GLOBALS._uiElements.addScore(30); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene870::Boat::startAction(CursorType action, Event &event) { + if (action == INV_RENTAL_KEYS) { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._sceneManager.changeScene(860); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene870::Crate::startAction(CursorType action, Event &event) { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + Common::Point destPos(163, 164); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &destPos, scene); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene870::Exit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER(event.mousePos.x, event.mousePos.y); + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene870::Action1::signal() { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + scene->_yacht.setStrip(6); + scene->_yacht.setFrame(1); + scene->_yacht._numFrames = 6; + scene->_yacht.animate(ANIM_MODE_5, this); + break; + case 2: + BF_GLOBALS._sceneManager.changeScene(666); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene870::Scene870(): SceneExt() { + _field1662 = 1; + _field1664 = 0; +} + +void Scene870::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field1662); + s.syncAsSint16LE(_field1664); +} + +void Scene870::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(870); + BF_GLOBALS._sound1.changeSound(90); + + PaletteRotation *rot; + rot = BF_GLOBALS._scenePalette.addRotation(235, 235, 1); + rot->setDelay(10); + rot = BF_GLOBALS._scenePalette.addRotation(237, 238, 1); + rot->setDelay(40); + rot = BF_GLOBALS._scenePalette.addRotation(242, 243, 1); + rot->setDelay(30); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_greenSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 5; + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(831); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player._moveDiff = Common::Point(2, 1); + + _exit.setDetails(Rect(305, 150, 320, 168), 870, -1, -1, -1, 1, NULL); + _lumber.setDetails(9, 870, 36, 37, 38, 1); + _firePit.setDetails(8, 870, 9, 10, 11, 1); + + if (BF_GLOBALS._dayNumber == 5) { + if (!BF_GLOBALS.getFlag(fLyleOnIsland) && (BF_GLOBALS._bookmark != bFinishedWGreen) && + (!BF_GLOBALS.getFlag(fTookTrailerAmmo) || (BF_GLOBALS._bookmark >= bInvestigateBoat))) { + _lyle.postInit(); + _lyle.setVisage(835); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle._moveDiff = Common::Point(2, 1); + _lyle.setDetails(870, 27, 28, 29, 1, NULL); + } + + _yacht.postInit(); + _yacht.setVisage(870); + _yacht.setStrip(4); + _yacht.setFrame(4); + _yacht.setPosition(Common::Point(232, 19)); + _yacht.setDetails(870, 30, 31, 32, 1, NULL); + + if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_FLARE) == 0) && + (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355)) { + _green.postInit(); + _green.setVisage(870); + _green.setStrip(7); + _green.setPosition(Common::Point(127, 109)); + + if (BF_GLOBALS._bookmark == bFinishedWGreen) { + _green.setDetails(870, 51, 54, 53, 1, NULL); + } else { + _green.setDetails(870, 51, 52, 53, 1, NULL); + } + } + } + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 355: + _object6.postInit(); + _object6.setVisage(870); + _object6.setPosition(Common::Point(142, 154)); + _object6.fixPriority(148); + + BF_GLOBALS._player.remove(); + _lyle.remove(); + setAction(&_action1); + break; + case 880: + if (BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _lyle.setPosition(Common::Point(330, 169)); + ADD_PLAYER_MOVER_NULL(_lyle, 303, 169); + } + + BF_GLOBALS._player.setPosition(Common::Point(330, 139)); + BF_GLOBALS._player.disableControl(); + _sceneMode = 8700; + setAction(&_sequenceManager, this, 8700, &BF_GLOBALS._player, NULL); + break; + default: + if (BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _lyle.setPosition(Common::Point(156, 148)); + _lyle.fixPriority(149); + } + + if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) && + (BF_INVENTORY.getObjectScene(INV_GRENADES) == 355)) { + _object4.postInit(); + _object4.hide(); + _object5.postInit(); + _object5.hide(); + + BF_GLOBALS._deathReason = 7; + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager, this, 8703, &BF_GLOBALS._player, &_lyle, &_green, + &_object4, &_object5, NULL); + } else { + BF_GLOBALS._player.changeAngle(135); + BF_GLOBALS._player.setPosition(Common::Point(214, 139)); + BF_GLOBALS._player.enableControl(); + } + break; + } + + _boat.setDetails(7, 870, 3, 4, 5, 1); + _crate.setDetails(14, 870, 12, 13, 14, 1); + _water.setDetails(5, 870, 24, 25, 26, 1); + _palmTrees.setDetails(4, 870, 45, 46, 47, 1); + _sand.setDetails(3, 870, 21, 22, 23, 1); + _boulders.setDetails(2, 870, 18, 19, 20, 1); + _farShore.setDetails(1, 870, 48, 49, 50, 1); +} + +void Scene870::startStrip(int stripNumber) { + _sceneMode = 3; + BF_GLOBALS._player.disableControl(); + _stripManager.start(stripNumber, this); +} + +void Scene870::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + SceneExt::remove(); +} + +void Scene870::signal() { + switch (_sceneMode) { + case 0: + case 3: + case 8700: + BF_GLOBALS._player.enableControl(); + break; + case 1: + _crateInset.postInit(); + _crateInset.setDetails(870, -1, -1, -1); + BF_GLOBALS._player.enableControl(); + break; + case 2: + _yacht.setStrip(6); + _yacht.setFrame(1); + _yacht._numFrames = 6; + _yacht.animate(ANIM_MODE_5, this); + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 8701: + BF_GLOBALS._sceneManager.changeScene(880); + break; + default: + break; + } +} + +void Scene870::process(Event &event) { + SceneExt::process(event); + + if (!event.handled && BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_exit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E); + BF_GLOBALS._events.setCursor(surface); + } else { + // In case an exit cursor was being shown, restore the previously selected cursor + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } +} + +void Scene870::dispatch() { + SceneExt::dispatch(); + + if (BF_GLOBALS._sceneObjects->contains(&_lyle) && _lyle.isNoMover()) { + _lyle.updateAngle(BF_GLOBALS._player._position); + } + + if (!_action && (BF_GLOBALS._player._position.x > 305)) { + if (BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _lyle.animate(ANIM_MODE_1, NULL); + ADD_PLAYER_MOVER_NULL(_lyle, BF_GLOBALS._player._position.x, BF_GLOBALS._player._position.y + 5); + } + + BF_GLOBALS._player.disableControl(); + _sceneMode = 8701; + setAction(&_sequenceManager, this, 8701, &BF_GLOBALS._player, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 880 - Beach Path + * + *--------------------------------------------------------------------------*/ + +void Scene880::Action1::signal() { + Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _actionIndex = 1 + BF_GLOBALS._randomSource.getRandomNumber(1); + setDelay(BF_GLOBALS._randomSource.getRandomNumber(90)); + break; + case 1: + _actionIndex = 0; + scene->_sequenceManager2._onCallback = SequenceManager_callbackProc; + setAction(&scene->_sequenceManager2, this, 8811, &scene->_object4, NULL); + break; + case 2: + _actionIndex = 1; + setAction(&scene->_sequenceManager2, this, 8814, &scene->_object4, NULL); + break; + default: + break; + } +} + +void Scene880::Action1::SequenceManager_callbackProc(int v1, int v2) { + int idx = BF_GLOBALS._randomSource.getRandomNumber(2); + Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene; + + switch (idx) { + case 0: + scene->_object5.show(); + break; + case 1: + scene->_object6.show(); + break; + case 2: + scene->_object7.show(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene880::Object4::startAction(CursorType action, Event &event) { + Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (!scene->_seqNumber) + break; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8815; + scene->setAction(&scene->_sequenceManager1, scene, scene->_seqNumber, &BF_GLOBALS._player, NULL); + return true; + case CURSOR_TALK: + if (scene->_sceneMode != 2) + break; + + scene->_stripManager.start(8800, &BF_GLOBALS._stripProxy); + return true; + case INV_COLT45: + if (scene->_sceneMode != 2) + break; + + scene->gunDisplay(); + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene880::NorthExit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER(40, 113); + return true; +} + +bool Scene880::SouthEastExit::startAction(CursorType action, Event &event) { + Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene; + + if (scene->_sceneMode == 2) + return false; + else { + ADD_PLAYER_MOVER(300, 158); + return true; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene880::Scene880(): SceneExt() { + _seqNumber = 0; +} + +void Scene880::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_seqNumber); +} + +void Scene880::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(880); + + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 5; + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(1358); + BF_GLOBALS._player._moveDiff = Common::Point(3, 2); + BF_GLOBALS._player.disableControl(); + + _northExit.setDetails(Rect(25, 99, 54, 127), 880, -1, -1, -1, 1, NULL); + _seExit.setDetails(Rect(279, 150, 320, 167), 880, -1, -1, -1, 1, NULL); + + if (BF_GLOBALS._dayNumber == 5) { + BF_GLOBALS._sound1.changeSound(107); + _object1.postInit(); + _object1.hide(); + + if ((BF_GLOBALS._bookmark != bFinishedWGreen) && (BF_GLOBALS._bookmark >= bInvestigateBoat) && + BF_GLOBALS.getFlag(fTookTrailerAmmo)) { + BF_GLOBALS.setFlag(fLyleOnIsland); + } + + _object2.postInit(); + _object2.setVisage(880); + _object2.setPosition(Common::Point(209, 76)); + _object2.setDetails(880, 4, 5, 6, 1, NULL); + + _object4.postInit(); + _object4.setVisage(875); + _object4.setDetails(880, 7, -1, 9, 1, NULL); + + _object5.postInit(); + _object5.setVisage(874); + _object5.setStrip(2); + _object5.setFrame(2); + _object5.fixPriority(118); + _object5.setPosition(Common::Point(55, 117)); + _object5.hide(); + + _object6.postInit(); + _object6.setVisage(874); + _object6.setStrip(3); + _object6.setFrame(2); + _object6.fixPriority(118); + _object6.setPosition(Common::Point(60, 109)); + _object6.hide(); + + _object7.postInit(); + _object7.setVisage(874); + _object7.setStrip(4); + _object7.setFrame(2); + _object7.fixPriority(118); + _object7.setPosition(Common::Point(57, 100)); + _object7.hide(); + + if (BF_GLOBALS.getFlag(fShootGoon)) { + _object4.setStrip(6); + _object4.setFrame2(_object4.getFrameCount()); + _object4.fixPriority(160); + _object4.setPosition(Common::Point(255, 148)); + + _seqNumber = 8816; + } else if (BF_GLOBALS.getFlag(fBlowUpGoon)) { + _object4.setStrip(7); + _object4.setFrame2(_object4.getFrameCount()); + _object4.fixPriority(130); + _object4.setPosition(Common::Point(255, 148)); + + _seqNumber = 8815; + } else { + _object4.setStrip(2); + _object4.setPosition(Common::Point(258, 147)); + + _object3.postInit(); + _object3.setVisage(871); + _object3.setStrip(4); + _object3.hide(); + + _seqNumber = 0; + } + } else if (BF_GLOBALS._sceneManager._previousScene != 900) { + BF_GLOBALS._sound1.changeSound(91); + } + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 900: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 8802, &BF_GLOBALS._player, NULL); + break; + default: + BF_GLOBALS._player.disableControl(); + + if (BF_GLOBALS._dayNumber != 5) { + _sceneMode = 0; + setAction(&_sequenceManager1, this, 8800, &BF_GLOBALS._player, NULL); + } else if ((BF_GLOBALS._bookmark > bFinishedWGreen) || (_seqNumber != 0)) { + _sceneMode = 0; + setAction(&_sequenceManager1, this, 8800, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._bookmark = bFinishedWGreen; + _sceneMode = 8805; + setAction(&_sequenceManager1, this, 8805, &BF_GLOBALS._player, &_object1, &_object4, NULL); + } + break; + } + + _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 880, 0, -1, -1, 1, NULL); +} + +void Scene880::signal() { + switch (_sceneMode) { + case 0: + case 2: + BF_GLOBALS._player._moveDiff = Common::Point(3, 2); + BF_GLOBALS._player.fixPriority(-1); + BF_GLOBALS._player.enableControl(); + break; + case 1: + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 3: + T2_GLOBALS._uiElements.addScore(50); + BF_GLOBALS.clearFlag(gunDrawn); + BF_INVENTORY.setObjectScene(INV_GRENADES, 880); + _sceneMode = 0; + signal(); + break; + case 4: + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.clearFlag(gunDrawn); + _sceneMode = 0; + signal(); + break; + case 6: + BF_GLOBALS._deathReason = 10; + BF_GLOBALS.clearFlag(gunDrawn); + + if (_object4._action) { + handleAction(_object4._action); + } + + BF_GLOBALS._player.disableControl(); + _sceneMode = 1; + setAction(&_sequenceManager1, this, 8806, &BF_GLOBALS._player, &_object4, NULL); + break; + case 7: + BF_GLOBALS.clearFlag(gunDrawn); + BF_GLOBALS._player.disableControl(); + _sceneMode = 8801; + setAction(&_sequenceManager1, this, 8801, &BF_GLOBALS._player, NULL); + break; + case 8801: + BF_GLOBALS._sceneManager.changeScene(870); + break; + case 8803: + BF_GLOBALS._sceneManager.changeScene(900); + break; + case 8805: + _object4.setAction(&_action1); + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager1, this, 8807, &BF_GLOBALS._player, NULL); + BF_GLOBALS.setFlag(gunDrawn); + break; + case 8815: + if (BF_INVENTORY.getObjectScene(INV_DOG_WHISTLE) == 880) { + BF_INVENTORY.setObjectScene(INV_DOG_WHISTLE, 1); + T2_GLOBALS._uiElements.addScore(30); + + SceneItem::display2(880, 13); + } else { + SceneItem::display2(880, 12); + } + BF_GLOBALS._player.enableControl(); + break; + default: + break; + } +} + +void Scene880::process(Event &event) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_northExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N); + BF_GLOBALS._events.setCursor(surface); + } else if (_seExit.contains(event.mousePos) && (_sceneMode != 2)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SE); + BF_GLOBALS._events.setCursor(surface); + } else { + // In case an exit cursor was being shown, restore the previously selected cursor + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } + + if (event.eventType == EVENT_BUTTON_DOWN) { + switch (BF_GLOBALS._events.getCursor()) { + case INV_COLT45: + if (_sceneMode != 2) { + _sceneMode = 0; + SceneItem::display2(880, 11); + signal(); + } else if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS.clearFlag(gunDrawn); + BF_GLOBALS._player.disableControl(); + _sceneMode = 6; + setAction(&_sequenceManager1, this, 8812, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager1, this, 8807, &BF_GLOBALS._player, NULL); + } + + event.handled = true; + break; + case INV_GRENADES: + if (_sceneMode == 2) { + if (event.mousePos.x >= 150) { + BF_GLOBALS.setFlag(fBlowUpGoon); + _seqNumber = 8815; + if (_object4._action) + handleAction(_object4._action); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 3; + setAction(&_sequenceManager1, this, 8809, &BF_GLOBALS._player, &_object3, &_object4, NULL); + } else { + if (_object4._action) + handleAction(_object4._action); + + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._deathReason = 11; + _sceneMode = 1; + setAction(&_sequenceManager1, this, 8810, &BF_GLOBALS._player, &_object3, NULL); + } + event.handled = true; + } + break; + case CURSOR_WALK: + if (_sceneMode == 2) { + event.handled = true; + BF_GLOBALS._player.disableControl(); + + _sceneMode = (event.mousePos.y <= BF_GLOBALS._player._position.y) ? 7 : 6; + setAction(&_sequenceManager1, this, 8812, &BF_GLOBALS._player, NULL); + } + break; + default: + break; + } + } + + SceneExt::process(event); +} + +void Scene880::handleAction(Action *action) { + if (action->_action) + // Work down into sub-actions + handleAction(action->_action); + + if (action->_owner) { + action->_owner->_action = NULL; + action->_owner = NULL; + } +} + +void Scene880::dispatch() { + SceneExt::dispatch(); + + if (!_action) { + if ((BF_GLOBALS._player._position.y <= 123) && (BF_GLOBALS._player._priority != 5)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 8801; + setAction(&_sequenceManager1, this, 8801, &BF_GLOBALS._player, NULL); + } + + if ((BF_GLOBALS._player._position.x >= 275) && (BF_GLOBALS._player._position.y > 155)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 8803; + setAction(&_sequenceManager1, this, 8803, &BF_GLOBALS._player, NULL); + } + } +} + +} // End of namespace BlueForce + +} // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes8.h b/engines/tsage/blue_force/blueforce_scenes8.h new file mode 100644 index 0000000000..ef5ef81563 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes8.h @@ -0,0 +1,568 @@ +/* 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 Scene810: public SceneExt { + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; + + /* Items */ + class Map: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Window: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Bookcase: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class FaxMachine: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class GarbageCan: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class FileCabinets: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class CoffeeMaker: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Shelves: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class MicroficheReader: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item10: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Pictures: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item12: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Background: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Desk: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Exit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Lyle: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Chair: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object3: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class FaxMachineInset: public FocusObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object5: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object7: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + Action1 _action1; + Action2 _action2; + SequenceManager _sequenceManager1, _sequenceManager2; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + Lyle _lyle; + Chair _chair; + Object3 _object3; + FaxMachineInset _faxMachineInset; + Object5 _object5; + NamedObject _object6; + Object7 _object7; + Map _map; + Window _window; + Bookcase _bookcase; + FaxMachine _faxMachine; + GarbageCan _garbageCan; + FileCabinets _fileCabinets; + CoffeeMaker _coffeeMaker; + Shelves _shelves; + MicroficheReader _microficheReader; + Item10 _item10; + Pictures _pictures; + Item12 _item12; + Background _background; + Desk _desk; + Exit _exit; + ASoundExt _sound1; + Rect _rect1, _rect2, _rect3; + int _fieldA70, _fieldA72, _fieldA74; + + Scene810(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene820: public SceneExt { + /* Objects */ + class PowerButton: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class ForwardButton: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class BackButton: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + ASoundExt _sound1; + SpeakerGameText _gameTextSpeaker; + PowerButton _powerButton; + BackButton _backButton; + ForwardButton _forwardButton; + NamedObject _object4, _object5; + NamedHotspot _item1; + int _pageNumber; + + Scene820(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene830: public PalettedScene { + /* Items */ + class SouthEastExit: public NamedHotspot { + 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 RentalBoat: 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; + RentalBoat _rentalBoat; + 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 BoatKeysInset: 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 BoatKeys: 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; + BoatKeysInset _boatKeysInset; + NamedObject _doors; + BoatKeys _boatKeys; + 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(); +}; + +class Scene850: public SceneExt { + /* Timers */ + class Timer1: public Timer { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Timer1 _timer; + NamedObject _object1; + ASoundExt _sound1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); +}; + +class Scene860: public SceneExt { + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + NamedObject _deadBody, _object2; + NamedHotspot _item1; + Action1 _action1; + Rect _swRect, _neRect, _yachtRect; + ASoundExt _sound1; + int _field87E, _field880, _field886, _field888; + Common::Point _destPos; + + Scene860(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene870: public SceneExt { + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; + + /* Objects */ + class Lyle: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Green: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class CrateInset: public FocusObject { + class Jar: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Rags: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + private: + void initContents(); + public: + Jar _jar; + Rags _rags; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Boat: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Crate: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Exit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + SpeakerGreen _greenSpeaker; + Boat _boat; + Crate _crate; + Exit _exit; + NamedObject _yacht; + Lyle _lyle; + Green _green; + NamedObject _object4, _object5, _object6; + CrateInset _crateInset; + NamedHotspot _lumber, _firePit, _water, _boulders; + NamedHotspot _palmTrees, _sand, _farShore, _item11; + Action1 _action1; + int _field1662, _field1664; + + Scene870(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + + void startStrip(int stripNumber); +}; + +class Scene880: public SceneExt { + /* Actions */ + class Action1: public Action { + private: + static void SequenceManager_callbackProc(int v1, int v2); + public: + virtual void signal(); + }; + + /* Objects */ + class Object4: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class NorthExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class SouthEastExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +private: + static void handleAction(Action *action); +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + Action1 _action1; + NamedObject _object1, _object2, _object3; + Object4 _object4; + NamedObject _object5, _object6, _object7; + NamedHotspot _background; + NorthExit _northExit; + SouthEastExit _seExit; + int _seqNumber; + + Scene880(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +} // End of namespace BlueForce + +} // 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..545edb91d6 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes9.cpp @@ -0,0 +1,3892 @@ +/* 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::Gate::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->_dog._flag == false) { + BF_GLOBALS._player.setAction(&scene->_action4); + } else { + scene->_sceneMode = 9005; + scene->setAction(&scene->_sequenceManager1, scene, 9005, &BF_GLOBALS._player, this, NULL); + BF_GLOBALS._walkRegions.proc2(24); + } + } + 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); + T2_GLOBALS._uiElements.addScore(30); + } + BF_GLOBALS._v4CEC0 = 1; + } else { + if (!BF_GLOBALS.getFlag(fGotPointsForLockGate)) { + if (BF_GLOBALS._bookmark == bEndDayThree) { + BF_GLOBALS.setFlag(fGotPointsForLockGate); + T2_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::Door::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->_door, 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->_door, NULL); + } else + SceneItem::display2(900, 5); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene900::Dog::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::Lyle::startAction(CursorType action, Event &event) { + Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_TALK) { + if (!_action) { + if (scene->_dog._flag) { + if (BF_GLOBALS._v4CEC0 == 0) + scene->_stripManager.start(9004, &BF_GLOBALS._stripProxy); + else { + if (scene->_door._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::Body::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->_dog._flag == 0) { + scene->_dog.setStrip(3); + if ((BF_GLOBALS._randomSource.getRandomNumber(3) == 1) || (BF_GLOBALS._player._position.x > 790) || (scene->_field1976 != 0)) { + Common::Point pt(864, 130); + NpcMover *mover = new NpcMover(); + scene->_dog.addMover(mover, &pt, this); + } else { + _actionIndex = 4; + Common::Point pt(775, 107); + NpcMover *mover = new NpcMover(); + scene->_dog.addMover(mover, &pt, this); + } + } + break; + case 1: + scene->_dog.setPosition(Common::Point(864, 117)); + scene->_dog.setStrip(7); + scene->_dog.setFrame(1); + scene->_dog.animate(ANIM_MODE_5, this); + if (BF_GLOBALS._randomSource.getRandomNumber(3) == 1) + scene->_sound1.play(92); + else + scene->_sound1.play(44); + if ((BF_GLOBALS._player._position.x > 750) || (scene->_field1976 != 0)) + _actionIndex = 7; + break; + case 2: + scene->_dog.animate(ANIM_MODE_6, this); + break; + case 3: { + scene->_dog.setStrip(3); + scene->_dog.setPosition(Common::Point(864, 130)); + scene->_dog.fixPriority(122); + scene->_dog.animate(ANIM_MODE_1, NULL); + Common::Point pt(775, 107); + NpcMover *mover = new NpcMover(); + scene->_dog.addMover(mover, &pt, this); + break; + } + case 6: + _actionIndex = 0; + // No break on purpose + case 4: + setDelay(30); + break; + case 5: { + scene->_dog.setStrip(4); + Common::Point pt(940, 145); + NpcMover *mover = new NpcMover(); + scene->_dog.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->_dog.setStrip(1); + scene->_dog.setFrame(7); + scene->_dog.animate(ANIM_MODE_6, NULL); + break; + case 9: + scene->_field1976 = 0; + scene->_dog._flag = 0; + _actionIndex = 7; + scene->_dog.setStrip(1); + scene->_dog.setFrame(1); + scene->_dog.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->_dog._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->_dog, NULL); + BF_INVENTORY.setObjectScene(INV_FISHING_NET, 900); + break; + case 2: + BF_GLOBALS._player._strip = 7; + if (!BF_GLOBALS.getFlag(fGotPointsForTrapDog)) { + BF_GLOBALS.setFlag(fGotPointsForTrapDog); + T2_GLOBALS._uiElements.addScore(50); + } + SceneItem::display2(900, 10); + scene->_dog._flag = 1; + scene->_dog.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->_dog._action->getActionIndex() != 7) { + _actionIndex = 0; + } + setDelay(5); + break; + case 1: + if (scene->_dog._strip == 3) { + _actionIndex = 3; + Common::Point pt(775, 107); + NpcMover *mover = new NpcMover(); + scene->_dog.addMover(mover, &pt, this); + } else + scene->_dog.animate(ANIM_MODE_6, this); + break; + case 2: { + scene->_dog.setStrip(3); + scene->_dog.setPosition(Common::Point(864, 130)); + scene->_dog.fixPriority(122); + scene->_dog.animate(ANIM_MODE_1, NULL); + Common::Point pt(775, 107); + NpcMover *mover = new NpcMover(); + scene->_dog.addMover(mover, &pt, this); + break; + } + case 3: + scene->_dog.remove(); + scene->_dog._flag = 1; + SceneItem::display2(900, 24); + if (!BF_GLOBALS.getFlag(fGotPointsForLockWarehouse)) { + BF_GLOBALS.setFlag(fGotPointsForLockWarehouse); + T2_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->_dog._action->getActionIndex() != 8) + _actionIndex = 0; + setDelay(5); + break; + case 1: + scene->setAction(&scene->_sequenceManager1, this, 9005, &BF_GLOBALS._player, &scene->_gate, NULL); + break; + case 2: + scene->setAction(&scene->_sequenceManager1, this, 9008, &BF_GLOBALS._player, &scene->_dog, 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(OwnerList); + loadScene(900); + + if (BF_GLOBALS._sceneManager._previousScene == 910) + BF_GLOBALS._sound1.changeSound(91); + _field1974 = 0; + _field1976 = 0; + T2_GLOBALS._uiElements._active = true; + BF_GLOBALS.clearFlag(fCanDrawGun); + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._dayNumber = 4; + BF_INVENTORY.setObjectScene(INV_FISHING_NET, 1); + BF_INVENTORY.setObjectScene(INV_HOOK, 1); + } + _dog._flag = 0; + if (BF_GLOBALS._bookmark >= bFinishedWGreen) { + _body.postInit(); + _body.fixPriority(120); + _body.setVisage(901); + _body.setPosition(Common::Point(159,128)); + _body.setDetails(900, 15, 16, 17, ANIM_MODE_1, NULL); + } + if (BF_GLOBALS._sceneManager._previousScene == 910) { + _sceneBounds.moveTo(639, 0); + + BF_GLOBALS._v4CEC0 = 2; + BF_INVENTORY.setObjectScene(INV_FISHING_NET, 900); + _dog._flag = 1; + } + if (BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 900) + _dog._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(); + + _dog.postInit(); + _dog.setVisage(902); + _dog.setPosition(Common::Point(845, 135)); + _dog.fixPriority(122); + _dog.setDetails(900, 8, -1, 9, 1, NULL); + + if (_dog._flag == 0) { + _dog.animate(ANIM_MODE_1, NULL); + _dog.setAction(&_action1); + } else { + _dog.setAction(&_action1); + _dog.fixPriority(130); + if (BF_GLOBALS._dayNumber == 4) { + _dog.setPosition(Common::Point(879, 120)); + _dog.setStrip(2); + } else { + _dog.setPosition(Common::Point(864, 117)); + _dog.setStrip(6); + _dog.setFrame(6); + } + } + + _gate.postInit(); + _gate.setVisage(900); + _gate.setStrip(2); + + if (BF_GLOBALS._v4CEC0 == 2) + _gate.setPosition(Common::Point(758, 127)); + else { + BF_GLOBALS._walkRegions.proc1(24); + _gate.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)); + } + + _door.postInit(); + _door.setVisage(900); + + if (BF_GLOBALS._v4CEC8 == 0) + _door.setStrip(4); + else + _door.setStrip(1); + + _door.setPosition(Common::Point(847, 45)); + _door._flag = 1; + + if ((BF_GLOBALS._sceneManager._previousScene == 880) || (BF_GLOBALS._sceneManager._previousScene != 910)) { + BF_GLOBALS._walkRegions.proc1(26); + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._bookmark == bFinishedWGreen) { + _sceneMode = 9013; + _lyle.postInit(); + _lyle._moveDiff.y = 7; + _lyle._flags |= OBJFLAG_CHECK_REGION; + _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL); + _lyleHatSpeaker._xp = 210; + _jakeJacketSpeaker._xp = 75; + setAction(&_sequenceManager1, this, 9013, &BF_GLOBALS._player, &_lyle, NULL); + BF_GLOBALS._bookmark = bAmbushed; + BF_GLOBALS.setFlag(fWithLyle); + } else { + if (BF_GLOBALS._bookmark > bFinishedWGreen) { + _lyle.postInit(); + _lyle.setVisage(811); + _lyle.setPosition(Common::Point(780, 153)); + _lyle._moveDiff.y = 7; + _lyle._flags |= 0x1000; + _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + } + + _sceneMode = 9000; + setAction(&_sequenceManager1, this, 9000, &BF_GLOBALS._player, NULL); + } + } else { + _door._flag = 0; + _door.setFrame(_door.getFrameCount()); + BF_GLOBALS._player.disableControl(); + _sceneMode = 9002; + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.postInit(); + _lyle._flags |= 0x1000; + _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL); + setAction(&_sequenceManager1, this, 9014, &BF_GLOBALS._player, &_door, &_lyle, NULL); + } else + setAction(&_sequenceManager1, this, 9002, &BF_GLOBALS._player, &_door, NULL); + } + + _gate.setDetails(900, 0, -1, 1, 1, 0); + _door.setDetails(900, 2, -1, 5, 1, 0); + _item2.setDetails(Rect(0, 0, 225, 21), 666, 25, -1, -1, 1, NULL); + _item3.setDetails(Rect(37, 21, 324, 50), 666, 26, -1, -1, 1, NULL); + _item1.setDetails(Rect(0, 0, 960, 200), 900, 7, -1, -1, 1, NULL); +} + +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, &_gate, NULL); + break; + case 9000: + BF_GLOBALS._player.enableControl(); + break; + case 9001: + if ((BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 900) || (BF_GLOBALS._v4CEC0 != 0) || + (_door._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 (_dog._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, &_dog, NULL); + } else { + BF_GLOBALS._player._strip = 7; + _action1.setActionIndex(9); + _dog.signal(); + if ((!BF_GLOBALS.getFlag(fGotPointsForFreeDog)) && (BF_GLOBALS._bookmark == bEndDayThree)) { + BF_GLOBALS.setFlag(fGotPointsForFreeDog); + T2_GLOBALS._uiElements.addScore(50); + } + BF_INVENTORY.setObjectScene(INV_FISHING_NET, 1); + SceneItem::display2(900, 11); + BF_GLOBALS._player.enableControl(); + } + break; + case 9012: + if (_door._flag == 0) { + SceneItem::display2(900, 12); + _door._flag = 1; + if ((!BF_GLOBALS.getFlag(fGotPointsForLockWarehouse)) && (BF_GLOBALS._bookmark == bEndDayThree)) { + BF_GLOBALS.setFlag(fGotPointsForLockWarehouse); + T2_GLOBALS._uiElements.addScore(30); + } + } else { + SceneItem::display2(900, 13); + _door._flag = 0; + if (!BF_GLOBALS.getFlag(fGotPointsForUnlockWarehouse)) { + BF_GLOBALS.setFlag(fGotPointsForUnlockWarehouse); + T2_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 < (UI_INTERFACE_Y - 1))) { + if (_item4.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W); + 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 910 - Inside the warehouse + * + *--------------------------------------------------------------------------*/ +/* Actions */ +void Scene910::Action1::signal() { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex - 1) { + case 0: + scene->_vent.setStrip(1); + scene->_vent.animate(ANIM_MODE_5, this); + break; + case 1: + if (scene->_vent._strip == 2) + scene->_vent.setFrame(4); + scene->_vent.setStrip(1); + scene->_vent.animate(ANIM_MODE_6, NULL); + break; + case 2: + scene->_vent.setStrip(2); + scene->_vent.animate(ANIM_MODE_2, NULL); + break; + default: + break; + } +} + +void Scene910::Action2::signal() { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object7.postInit(); + scene->_object7.setVisage(919); + scene->_object7.setPosition(Common::Point(267, 51)); + scene->_object7.fixPriority(40); + signal(); + break; + case 1: + scene->_object7.hide(); + setDelay(600); + break; + case 2: + scene->_object7.setStrip(BF_GLOBALS._randomSource.getRandomNumber(3) + 2); + scene->_object7.setFrame(1); + scene->_object7.show(); + setDelay(6); + break; + case 3: + _actionIndex = 1; + scene->_object7.setStrip(BF_GLOBALS._randomSource.getRandomNumber(3) + 2); + scene->_object7.animate(ANIM_MODE_5, this); + break; + default: + break; + } +} + +/* Objects */ + +void Scene910::Lyle::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_field90); +} + +bool Scene910::Lyle::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (BF_GLOBALS._v4CEE2 == 0) + return NamedObject::startAction(action, event); + else + return false; + } else if (action == CURSOR_TALK) { + if ((BF_GLOBALS._v4CEE0 != 0) || (BF_GLOBALS._v4CEE2 != 0)) { + scene->_stripManager.start(9100 + _field90, &BF_GLOBALS._stripProxy); + if (_field90 < 1) + _field90++; + return true; + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9130; + if (BF_GLOBALS.getFlag(gunDrawn)) + scene->setAction(&scene->_sequenceManager1, scene, 9138, &BF_GLOBALS._player, &scene->_lyle, NULL); + else + scene->setAction(&scene->_sequenceManager1, scene, 9130, &BF_GLOBALS._player, &scene->_lyle, NULL); + return true; + } + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene910::Nico::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_field2DDA = 6; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + break; + case CURSOR_TALK: + if (BF_GLOBALS._v4CEE2 >= 4) + return NamedObject::startAction(action, event); + + if (BF_GLOBALS._v4CEE6 < 4) + BF_GLOBALS._v4CEE6++; + + if (BF_GLOBALS._v4CEE6 == 2) { + scene->_sceneMode = 13; + scene->_stripManager.start(9105, scene); + } else + scene->_stripManager.start(9103 + BF_GLOBALS._v4CEE6, &BF_GLOBALS._stripProxy); + return true; + break; + case 1: + if (BF_GLOBALS._v4CEE2 > 1) { + if (BF_GLOBALS._v4CEE2 != 4) { + if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(25)) && (BF_GLOBALS.getHasBullets())) { + if (scene->_field2DE0 == 0) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9126; + scene->setAction(&scene->_sequenceManager1, scene, 9126, &scene->_nico, NULL); + return NamedObject::startAction(action, event); + } else { + scene->_stripManager.start(9117, &BF_GLOBALS._stripProxy); + return NamedObject::startAction(action, event); + } + } else + return NamedObject::startAction(action, event); + } else { + SceneItem::display(910, 90, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } + } else { + if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(25)) && (BF_GLOBALS.getHasBullets())) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9125; + scene->setAction(&scene->_sequenceManager1, scene, 9125, &scene->_nico, NULL); + } + return NamedObject::startAction(action, event); + } + break; + case 39: + case 53: + if (BF_GLOBALS._v4CEE2 >= 4) + return NamedObject::startAction(action, event); + + if (BF_GLOBALS._v4CEE6 < 4) + BF_GLOBALS._v4CEE6++; + + if (BF_GLOBALS._v4CEE6 == 2) { + scene->_sceneMode = 13; + scene->_stripManager.start(9105, scene); + } else + scene->_stripManager.start(9103 + BF_GLOBALS._v4CEE6, &BF_GLOBALS._stripProxy); + + return true; + break; + case 57: + if (BF_GLOBALS._v4CEE2 < 4) { + BF_GLOBALS._player.disableControl(); + scene->_yellowCord.fixPriority(121); + scene->_field2DDA = 10; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + + return true; + } else { + SceneItem::display(910, 95, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + + return true; + } + break; + case 58: + if (BF_GLOBALS._v4CECC == 1) + SceneItem::display(910, 84, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + else + SceneItem::display(910, 82, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + break; + case 59: + case 61: + SceneItem::display(910, 83, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + break; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene910::Stuart::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_field2DDA = 7; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + break; + case CURSOR_TALK: + if (BF_GLOBALS._v4CEE8 < 3) + BF_GLOBALS._v4CEE8++; + + scene->_stripManager.start(9107 + BF_GLOBALS._v4CEE8, &BF_GLOBALS._stripProxy); + return true; + break; + case 1: + if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(25)) && (BF_GLOBALS.getHasBullets())){ + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._v4CEE4 == 2) { + scene->_sceneMode = 9132; + scene->setAction(&scene->_sequenceManager1, scene, 9132, &scene->_stuart, NULL); + return NamedObject::startAction(action, event); + } else { + if (scene->_field2DE0 == 0) { + scene->_sceneMode = 9132; + scene->setAction(&scene->_sequenceManager1, scene, 9132, &scene->_stuart, NULL); + } else + scene->_stripManager.start(9117, &BF_GLOBALS._stripProxy); + return NamedObject::startAction(action, event); + } + } else + return NamedObject::startAction(action, event); + break; + case 57: + if (BF_GLOBALS._v4CECC == 1) { + SceneItem::display(910, 84, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } else { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._v4CEE2 == 4) { + scene->_field2DDA = 11; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + } else { + scene->_field2DDA = 12; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + } + } + break; + case 58: + if (BF_GLOBALS._v4CECC == 1) { + SceneItem::display(910, 84, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } else { + BF_GLOBALS._player.disableControl(); + scene->_field2DDA = 11; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + } + break; + case 59: + case 61: + SceneItem::display(910, 83, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + break; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene910::Forbes::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_TALK) { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._walkRegions.proc2(1); + BF_GLOBALS._walkRegions.proc2(16); + scene->_sceneMode = 9140; + scene->setAction(&scene->_sequenceManager1, scene, 9140, &scene->_forbes, &BF_GLOBALS._player, &scene->_lyle, NULL); + return true; + } else + return NamedObject::startAction(action, event); +} + +void Scene910::PowerCord::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_field90); + s.syncAsSint16LE(_field92); +} + +bool Scene910::PowerCord::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + // the last check is used in order to replace a check on CURSOR_1000, which is replaced + // directly by its sub-check. All items have an id inferior to 100h. + if ((action == CURSOR_LOOK) || (action == CURSOR_TALK) || (action < CURSOR_WALK)) { + if (_field90 == 1) + return false; + if ((_field92 != 1) || (BF_GLOBALS._v4CEE0 == 0 )) + return NamedObject::startAction(action, event); + return false; + } else if (action == CURSOR_USE) { + if (_field90 == 0) { + if ((BF_GLOBALS._v4CEE0 == 0) || (_field92 != 1)) { + BF_GLOBALS._player.disableControl(); + if (_field92 == 1) { + scene->_field2DDA = 8; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + _field90 = 1; + return true; + } else { + scene->_destPos = Common::Point(151, 186); + scene->_field2DDA = 4; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + _field90 = 1; + return true; + } + } else + return false; + } else if (_field90 == 1) + return false; + else + return true; + } else + return NamedObject::startAction(action, event); +} + +void Scene910::PowerCord::init(int val) { + NamedObject::postInit(); + + _field92 = val; + _field90 = 0; +} + +bool Scene910::BreakerBox::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (BF_GLOBALS._v4CEC8 == 0) + SceneItem::display2(910, 7); + else + SceneItem::display2(910, 6); + return true; + break; + case CURSOR_USE: + if (scene->_lyle._position.x == 115) { + SceneItem::display2(910, 62); + return true; + } else if (scene->_sceneMode != 9120) { + if (BF_GLOBALS._v4CEE2 == 1) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9118; + scene->setAction(&scene->_sequenceManager1, scene, 9118, &BF_GLOBALS._player, &scene->_nico, NULL); + return true; + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9102; + if (BF_GLOBALS.getFlag(gunDrawn)) { + scene->_field2DDA = 1; + scene->_sceneMode = 9123; + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + return true; + } else { + scene->setAction(&scene->_sequenceManager1, scene, 9102, &BF_GLOBALS._player, NULL); + return true; + } + } + } else { + SceneItem::display(910, 62, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } + break; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene910::FakeWall::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == INV_YELLOW_CORD) { + BF_GLOBALS._player.disableControl(); + scene->_destPos = Common::Point(285, 114); + scene->_field2DDA = 9; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + } else + return NamedObject::startAction(action, event); +} + +void Scene910::BreakerBoxInset::postInit(SceneObjectList *OwnerList) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + FocusObject::postInit(); + _resNum = 910; + _lookLineNum = 7; + _useLineNum = 8; + BF_GLOBALS._sceneItems.push_back(this); + scene->_field2DD8 = 0; + + _object13.setupBreaker(115, 44, 1, BF_GLOBALS._v4CECE[0]); + _object14.setupBreaker(116, 63, 2, BF_GLOBALS._v4CECE[1]); + _object15.setupBreaker(116, 69, 2, BF_GLOBALS._v4CECE[2]); + _object16.setupBreaker(115, 76, 1, BF_GLOBALS._v4CECE[3]); + _object17.setupBreaker(115, 95, 1, BF_GLOBALS._v4CECE[4]); + _object18.setupBreaker(116, 114, 2, BF_GLOBALS._v4CECE[5]); + _object19.setupBreaker(116, 120, 2, BF_GLOBALS._v4CECE[6]); + _object20.setupBreaker(188, 45, 2, BF_GLOBALS._v4CECE[7]); + _object21.setupBreaker(188, 51, 2, BF_GLOBALS._v4CECE[8]); + _object22.setupBreaker(179, 59, 1, BF_GLOBALS._v4CECE[9]); + _object23.setupBreaker(187, 78, 2, BF_GLOBALS._v4CECE[10]); + _object24.setupBreaker(187, 84, 2, BF_GLOBALS._v4CECE[11]); + + _object25.subEBBDC(178, 90, 1, BF_GLOBALS._v4CECE[12]); + _object26.subEBBDC(178, 108, 2, BF_GLOBALS._v4CECE[13]); +} + +void Scene910::BreakerBoxInset::remove() { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + _object13.remove(); + _object14.remove(); + _object15.remove(); + _object16.remove(); + _object17.remove(); + _object18.remove(); + _object19.remove(); + _object20.remove(); + _object21.remove(); + _object22.remove(); + _object23.remove(); + _object24.remove(); + _object25.remove(); + _object26.remove(); + _object27.remove(); + _object28.remove(); + + if ((BF_GLOBALS._v4CECE[13] < 4) && (scene->_breakerBox._frame > 1)) + scene->_breakerBox.animate(ANIM_MODE_6, NULL); + + FocusObject::remove(); +} + +void Scene910::Object13::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_field90); + s.syncAsSint16LE(_field92); +} + +bool Scene910::Object13::startAction(CursorType action, Event &event) { + static uint32 black = 0; + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + int8 var2; + + if (_field92 == 1) + var2 = 12; + else + var2 = 7; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(910, 9, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_USE: + scene->_sound2.play(101); + if (event.mousePos.x <= _position.x + var2) { + if (_field92 != 1) { + if (_frame > 6) + setFrame(_frame - 1); + } else { + if (_frame > 1) + setFrame(_frame - 1); + } + } else { + if (_field92 == 1) { + if (_frame < 3) + setFrame(_frame + 1); + } else { + if (_frame < 8) + setFrame(_frame + 1); + } + } + + if (_field92 != 1) + BF_GLOBALS._v4CECE[_field90 - 1] = (_field90 + 251) % 256; + else + BF_GLOBALS._v4CECE[_field90 - 1] = _field90; + + switch (_field90) { + case 1: + if (BF_GLOBALS._v4CEE2 < 1) { + if (_frame == 2) { + if (!BF_GLOBALS.getFlag(81)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(81); + } + scene->_sceneMode = 0; + if (BF_GLOBALS._dayNumber == 5) { + if (BF_GLOBALS._v4CEE2 == 0) { + scene->_breakerBoxInset.remove(); + // _objectList.draw(); + BF_GLOBALS._player.disableControl(); + scene->_lyle.setVisage(912); + scene->_object7.remove(); + scene->_action2.remove(); + scene->_nico.postInit(); + scene->_sceneMode = 9129; + scene->setAction(&scene->_sequenceManager1, scene, 9129, &BF_GLOBALS._player, &scene->_nico, NULL); + } else if (BF_GLOBALS._v4CEE2 == 2) { + scene->_breakerBoxInset.remove(); + // _objectList.draw(); + BF_GLOBALS._player.disableControl(); + scene->_lyle.setVisage(911); + scene->_lyle.setStrip(4); + scene->_nico.setVisage(923); + scene->_nico.setStrip(2); + scene->_stuart.setVisage(923); + scene->_stuart.setStrip(3); + scene->_sceneMode = 9134; + scene->setAction(&scene->_sequenceManager1, scene, 9134, &BF_GLOBALS._player, &scene->_nico, &scene->_lyle, NULL); + } + } + BF_GLOBALS._v4CEC8 = 1; + scene->_object5.show(); + if (scene->_sceneMode == 0) { + BF_GLOBALS._player.setVisage(911); + scene->_lyle.setVisage(912); + } + scene->transition((const byte *)&black, 25, 910, NULL, 0, 111, 112, 255, 0); + BF_GLOBALS._scenePalette.signalListeners(); + // _objectList.draw(); + } else { + if (BF_GLOBALS._v4CEC8 == 1) { + if (!BF_GLOBALS.getFlag(78)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(78); + } + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._v4CEC8 = 0; + scene->_sceneMode = 2; + scene->transition((const byte *)&black, 30, 910, scene, 0, 111, 112, 255, 0); + } + } + } else + SceneItem::display(910, 97, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case 4: + if (_frame == 2) { + if (BF_GLOBALS._v4CECE[4] == 2) { + scene->_action1.setActionIndex(2); + scene->_action1.signal(); + } + } else if (scene->_action1.getActionIndex() == 2) { + scene->_action1.setActionIndex(1); + scene->_action1.signal(); + } + return true; + case 5: + if (_frame == 2) { + if (BF_GLOBALS._v4CECE[3] == 2) { + scene->_action1.setActionIndex(2); + scene->_action1.signal(); + } + } else if (scene->_action1.getActionIndex() == 2) { + scene->_action1.setActionIndex(1); + scene->_action1.signal(); + } + return true; + case 15: + if ((BF_GLOBALS._v4CECA == 2) && (BF_GLOBALS._v4CECE[17] == 1)) { + if (_frame == 7) + scene->subE83E1(); + else + scene->subE82BD(); + } + return true; + default: + return true; + } + default: + return NamedObject::startAction(action, event); + break; + } +} + +void Scene910::Object13::remove() { + BF_GLOBALS._sceneItems.remove(this); + SceneObject::remove(); +} + +void Scene910::Object13::setupBreaker(int x, int y, int mode, int8 frameNumber) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + NamedObject::postInit(); + _field92 = mode; + scene->_field2DD8++; + _field90 = scene->_field2DD8; + setVisage(910); + + if (mode == 1) { + setStrip(8); + setFrame(frameNumber); + } else if (mode == 2) { + setStrip(7); + setFrame(frameNumber + 5); + } + + fixPriority(252); + setPosition(Common::Point(x, y)); + BF_GLOBALS._sceneItems.push_front(this); +} + +void Scene910::Object25::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_field90); + s.syncAsSint16LE(_field92); +} + +bool Scene910::Object25::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (_field92 == 1) + SceneItem::display2(910, 10); + else + SceneItem::display2(910, 11); + return true; + case CURSOR_USE: + _field92 = BF_GLOBALS._v4CECE[_field90 + 11]; + switch (_field92 - 1) { + case 0: + _field92 = 2; + setStrip(7); + setFrame(1); + if (_field90 == 1) { + scene->_field2DD8 = 14; + scene->_breakerBoxInset._object27.setupBreaker(182, 92, 2, BF_GLOBALS._v4CECE[14]); + } else { + scene->_field2DD8 = 15; + scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._v4CECE[15]); + } + SceneItem::display2(910, 12); + break; + case 1: + _field92 = 3; + setStrip(6); + setFrame(3); + if (_field90 == 1) + scene->_breakerBoxInset._object27.remove(); + else + scene->_breakerBoxInset._object28.remove(); + break; + case 2: + _field92 = 2; + setStrip(7); + setFrame(1); + if (_field90 == 1) { + scene->_field2DD8 = 14; + scene->_breakerBoxInset._object27.setupBreaker(182, 96, 2, BF_GLOBALS._v4CECE[14]); + } else { + scene->_field2DD8 = 15; + scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._v4CECE[15]); + } + break; + case 3: + SceneItem::display2(910, 13); + break; + default: + break; + } + + BF_GLOBALS._v4CECE[_field90 + 11] = _field92; + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + +void Scene910::Object25::remove() { + BF_GLOBALS._sceneItems.remove(this); + SceneObject::remove(); +} + +void Scene910::Object25::subEBBDC(int x, int y, int arg8, int argA) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + NamedObject::postInit(); + scene->_field2DD8++; + _field90 = arg8; + _field92 = argA; + setVisage(910); + + if ((_field92 != 2) && (_field92 != 4)) { + setStrip(6); + setFrame(3); + } else { + setStrip(7); + setFrame(1); + if (_field90 == 1) { + scene->_field2DD8 = 14; + scene->_breakerBoxInset._object27.setupBreaker(182, 96, 2, BF_GLOBALS._v4CECE[14]); + } else { + scene->_field2DD8 = 15; + scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._v4CECE[15]); + } + } + + fixPriority(251); + setPosition(Common::Point(x, y)); + BF_GLOBALS._sceneItems.push_front(this); +} + +bool Scene910::BlackPlug::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(910, 14, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_USE: + switch (_frame - _field90 - 2) { + case 0: + SceneItem::display(910, 15, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + break; + case 1: + if (BF_GLOBALS._v4CECA == 1) { + BF_GLOBALS._v4CECA = 0; + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 1); + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 910); + } else if (BF_GLOBALS._v4CECA == 2) { + BF_GLOBALS._v4CECA = 1; + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 3 - _field90); + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1); + scene->_blackCord.setPosition(Common::Point(540, 100)); + } + setFrame(_field90 + 2); + break; + case 2: + if (BF_GLOBALS._v4CECC == 1) { + BF_GLOBALS._v4CECC = 0; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 1); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910); + } else if (BF_GLOBALS._v4CECC == 2) { + BF_GLOBALS._v4CECC = 1; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 3 - _field90); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1); + scene->_yellowCord.setPosition(Common::Point(540, 100)); + } + setFrame(_field90 + 2); + break; + case 3: + if ((_position.x - 12) - (5 * _field90) < event.mousePos.x) { + if (BF_GLOBALS._v4CECA == 1) { + BF_GLOBALS._v4CECA = 0; + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 1); + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 910); + scene->_blackCord.setPosition(Common::Point(540, 100)); + } else if (BF_GLOBALS._v4CECA == 2) { + BF_GLOBALS._v4CECA = 1; + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 3 - _field90); + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1); + scene->_blackCord.setPosition(Common::Point(540, 100)); + } + setFrame(_field90 + 4); + } else { + if (BF_GLOBALS._v4CECC == 1) { + BF_GLOBALS._v4CECC = 0; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 1); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910); + } else if (BF_GLOBALS._v4CECC == 2) { + BF_GLOBALS._v4CECC = 1; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 3 - _field90); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1); + scene->_yellowCord.setPosition(Common::Point(540, 100)); + } + setFrame(_field90 + 3); + } + default: + break; + } + BF_GLOBALS._v4CECE[_field90 + 15] = _frame; + if (_field90 == 0) { + if (_frame == 2) + BF_GLOBALS._v4CECE[13] = 2; + else + BF_GLOBALS._v4CECE[13] = 4; + } + return true; + case INV_HALF_YELLOW_CORD: + if (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == _field90 + 2) { + SceneItem::display(910, 85, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } + if (BF_GLOBALS._v4CEE2 == 3) { + SceneItem::display(910, 84, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } + // no break on purpose + case INV_YELLOW_CORD: + if (BF_GLOBALS._v4CECC == 0) { + BF_GLOBALS._v4CECC = 1; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, _field90 + 2); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1); + } else if (BF_GLOBALS._v4CECC == 1) { + BF_GLOBALS._v4CECC = 2; + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, _field90 + 2); + scene->_yellowCord.setStrip(4); + scene->_yellowCord.setFrame(2); + scene->_yellowCord.setPosition(Common::Point(135, 93)); + scene->_yellowCord.fixPriority(50); + } + if (_frame - _field90 == 2) + setFrame(_field90 + 4); + else if (_frame - _field90 == 3) + setFrame(_field90 + 5); + BF_GLOBALS._v4CECE[15 + _field90] = _frame; + BF_GLOBALS._v4CECE[_field90 + 15] = _frame; + if (_field90 == 0) { + if (_frame == 2) + BF_GLOBALS._v4CECE[13] = 2; + else + BF_GLOBALS._v4CECE[13] = 4; + } + return true; + case INV_HALF_BLACK_CORD: + if (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == _field90 + 2) { + SceneItem::display(910, 85, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } + //No break on purpose + case INV_BLACK_CORD: + if (BF_GLOBALS._v4CECA == 0) { + if (_field90 == 1) { + if (!BF_GLOBALS.getFlag(fGotPointsForBlackCord)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForBlackCord); + } + } else { + if (!BF_GLOBALS.getFlag(fGotPointsForGeneratorPlug)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForGeneratorPlug); + } + } + BF_GLOBALS._v4CECA = 1; + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, _field90 + 2); + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1); + } else if (BF_GLOBALS._v4CECA == 1) { + if (_field90 == 1) { + if (!BF_GLOBALS.getFlag(fGotPointsForBlackCord)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForBlackCord); + } + } else { + if (!BF_GLOBALS.getFlag(fGotPointsForGeneratorPlug)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForGeneratorPlug); + } + } + BF_GLOBALS._v4CECA = 2; + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, _field90 + 2); + scene->_blackCord.setStrip(4); + scene->_blackCord.setFrame(1); + scene->_blackCord.setPosition(Common::Point(135, 93)); + scene->_blackCord.fixPriority(50); + scene->_blackCord.show(); + scene->_blackCord._field90 = 1; + if (BF_GLOBALS._v4CECE[17] == 1) { + if (BF_GLOBALS._v4CECE[14] == 2) + scene->subE83E1(); + else + scene->subE82BD(); + } + } + if (_frame - _field90 == 2) + setFrame(_field90 + 3); + else if (_frame - _field90 == 4) + setFrame(_field90 + 5); + BF_GLOBALS._v4CECE[15 + _field90] = _frame; + BF_GLOBALS._v4CECE[_field90 + 15] = _frame; + if (_field90 == 0) { + if (_frame == 2) + BF_GLOBALS._v4CECE[13] = 2; + else + BF_GLOBALS._v4CECE[13] = 4; + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +void Scene910::BlackPlug::init(int x, int y, int arg8, int8 argA) { + NamedObject::postInit(); + _field90 = arg8; + _field92 = argA; + setVisage(910); + if (_field90 == 0) + setStrip(7); + else + setStrip(3); + setFrame(argA); + fixPriority(251); + setPosition(Common::Point(x, y)); + BF_GLOBALS._sceneItems.push_front(this); +} + +void Scene910::BlackPlug::remove() { + BF_GLOBALS._sceneItems.remove(this); + SceneObject::remove(); +} + +void Scene910::GeneratorInset::postInit(SceneObjectList *OwnerList) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + FocusObject::postInit(); + _resNum = 910; + _lookLineNum = 99; + _useLineNum = 87; + BF_GLOBALS._sceneItems.push_front(this); + + scene->_field2DD8 = 16; + _blackPlug.init(142, 86, 1, BF_GLOBALS._v4CECE[16]); + + scene->_field2DD8 = 17; + _powerButton.init(BF_GLOBALS._v4CECE[17]); +} + +void Scene910::GeneratorInset::remove() { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 12; + BF_GLOBALS._player.animate(ANIM_MODE_6, scene); + _blackPlug.remove(); + _powerButton.remove(); + FocusObject::remove(); +} + +bool Scene910::PowerButton::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (_frame == 4) { + scene->_sound1.play(100); + scene->_sound1.holdAt(1); + if (!BF_GLOBALS.getFlag(77)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(77); + } + setFrame(5); + _object32.setFrame(7); + if (BF_GLOBALS._v4CECA == 2) { + if (BF_GLOBALS._v4CECE[14] == 2) + scene->subE83E1(); + else + scene->subE82BD(); + } + } else { + scene->_sound1.release(); + if (BF_GLOBALS._bookmark == 21) { + if (!BF_GLOBALS.getFlag(82)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(82); + } + } + setFrame(4); + _object32.setFrame(6); + } + BF_GLOBALS._v4CECE[17] = (_frame + 252) % 256; + return true; + } else + return NamedObject::startAction(action, event); +} + +void Scene910::PowerButton::remove() { + _object32.remove(); + SceneObject::remove(); +} + +void Scene910::PowerButton::init(int frame) { + NamedObject::postInit(); + setVisage(910); + setStrip(6); + setFrame(frame + 4); + setPosition(Common::Point(159, 83)); + fixPriority(251); + _object32.postInit(); + _object32.setVisage(910); + _object32.setStrip(6); + _object32.setFrame(6 + frame); + _object32.setPosition(Common::Point(166, 84)); + _object32.fixPriority(251); + BF_GLOBALS._sceneItems.push_front(this); +} + +bool Scene910::Generator::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (scene->_lyle._position.x == 115) + SceneItem::display(910, 62, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + else if (BF_GLOBALS._v4CEE2 == 1) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9118; + scene->setAction(&scene->_sequenceManager1, scene, 9118, &BF_GLOBALS._player, &scene->_nico, NULL); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9103; + if (BF_GLOBALS.getFlag(gunDrawn)) { + scene->_sceneMode = 9123; + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + } else + scene->setAction(&scene->_sequenceManager1, scene, 9103, &BF_GLOBALS._player, NULL); + } + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene910::Item2::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == 59) { + BF_GLOBALS._player.disableControl(); + scene->_destPos = Common::Point(151, 186); + scene->_field2DDA = 5; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + } else + return NamedHotspot::startAction(action, event); +} + +bool Scene910::Item3::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_TALK) && (BF_GLOBALS._v4CEE2 == 4) && (BF_GLOBALS._v4CEE4 == 0)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 15; + scene->_stripManager.start(9102, scene); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene910::Item9::startAction(CursorType action, Event &event) { + if (BF_GLOBALS._v4CEE0 == 0) + return NamedHotspot::startAction(action, event); + else + return false; +} + +bool Scene910::Item15::startAction(CursorType action, Event &event) { + if (BF_GLOBALS._v4CEC8 == 0) + return false; + + if ((action == CURSOR_LOOK) || (action == CURSOR_USE) || (action == CURSOR_TALK)) + return NamedHotspot::startAction(action, event); + + if (action >= CURSOR_WALK) + return false; + + SceneItem::display(910, 2, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; +} + +bool Scene910::Item16::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if ((BF_GLOBALS._v4CEE0 == 0) || (BF_GLOBALS._v4CEE2 != 0)) + return false; + + if (BF_GLOBALS._player._visage == 1911) { + BF_GLOBALS._player.disableControl(); + scene->_destPos = Common::Point(292, 100); + scene->_field2DDA = 0; + scene->_sceneMode = 9123; + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + } else { + Common::Point pt(292, 100); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, NULL); + } + + return true; +} + +bool Scene910::Item17::startAction(CursorType action, Event &event) { + Common::Point pt(15, 159); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, NULL); + + return true; +} + +void Scene910::remove() { + PalettedScene::remove(); +} + +void Scene910::synchronize(Serializer &s) { + PalettedScene::synchronize(s); + + s.syncAsSint16LE(_field2DDA); + s.syncAsSint16LE(_field2DD8); + s.syncAsSint16LE(_field2DE0); + s.syncAsSint16LE(_field2DE2); + s.syncAsSint16LE(_field2DE4); + s.syncAsSint16LE(_destPos.x); + s.syncAsSint16LE(_destPos.y); +} + +void Scene910::postInit(SceneObjectList *OwnerList) { + uint32 unk_50E94 = 0, unk_50E90 = 0; + uint32 unk_50E98 = 0, unk_50E9C = 0; + + PalettedScene::postInit(OwnerList); + loadScene(910); + + BF_GLOBALS._sound1.changeSound(99); + BF_GLOBALS._v51C44 = 0; + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + _stripManager.addSpeaker(&_fbiSpeaker); + _stripManager.addSpeaker(&_nicoSpeaker); + _stripManager.addSpeaker(&_daSpeaker); + BF_GLOBALS._player.postInit(); + + if (BF_GLOBALS._v4CEC8 == 0) + BF_GLOBALS._player.setVisage(129); + else + BF_GLOBALS._player.setVisage(911); + + BF_GLOBALS._player.setPosition(Common::Point(330, 190)); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.disableControl(); + + _vent.postInit(); + _vent.setVisage(910); + if ((BF_GLOBALS._v4CECE[3] == 2) && (BF_GLOBALS._v4CECE[4] == 2)) { + _action1.setActionIndex(4); + } else { + _vent.animate(ANIM_MODE_2, NULL); + _vent.setStrip(2); + } + _vent.setPosition(Common::Point(98, 34)); + _vent.setAction(&_action1); + + _breakerBox.postInit(); + _breakerBox.setVisage(910); + _breakerBox.setStrip(5); + _breakerBox.setFrame(1); + _breakerBox.setPosition(Common::Point(91, 66)); + + _fakeWall.postInit(); + _fakeWall.setVisage(910); + _fakeWall.setStrip(8); + _fakeWall.setFrame(4); + _fakeWall.fixPriority(48); + + _yellowCord.init(1); + _yellowCord.setVisage(910); + _yellowCord.setStrip(6); + _yellowCord.setFrame(2); + _yellowCord.fixPriority(50); + + _blackCord.init(2); + _blackCord.setVisage(910); + _blackCord.setStrip(6); + _blackCord.setFrame(1); + _blackCord.setPosition(Common::Point(114, 149)); + _blackCord.fixPriority(246); + + if (BF_GLOBALS._dayNumber < 5) + _item17.setDetails(Rect(0, 149, 29, 167), 910, -1, -1, -1, 1, NULL); + + if (BF_GLOBALS._v4CEE2 == 0) + _item16.setDetails(Rect(265, 18, 319, 102), 910, -1, -1, -1, 1, NULL); + + _breakerBox.setDetails(910, 6, -1, -1, 1, NULL); + _item15.setDetails(Rect(0, 0, 320, 170), 910, 0, 1, 2, 1, NULL); + _yellowCord.setDetails(910, 52, 53, -1, 1, NULL); + _blackCord.setDetails(910, 54, 55, -1, 1, NULL); + _item2.setDetails(3, 910, 22, -1, 24, 1); + _item4.setDetails(1, 910, 16, 17, 18, 1); + _item8.setDetails(4, 910, 25, 26, 27, 1); + _item6.setDetails(Rect(37, 58, 42, 67), 910, 34, 35, 36, 1, NULL); + _item7.setDetails(Rect(114, 53, 135, 87), 910, 37, 38, 39, 1, NULL); + _generator.setDetails(Rect(146, 67, 184, 93), 910, 40, 41, 42, 1, NULL); + _item9.setDetails(Rect(266, 39, 274, 70), 910, 43, 44, 45, 1, NULL); + _item10.setDetails(Rect(276, 27, 288, 83), 910, 46, 47, 48, 1, NULL); + _item11.setDetails(Rect(295, 42, 312, 87), 910, 49, 50, 51, 1, NULL); + _fakeWall.setDetails(910, 28, -1, 30, 1, NULL); + _item3.setDetails(7, 910, 59, 60, 61, 1); + _item5.setDetails(2, 910, 19, 20, 21, 1); + _backWall.setDetails(6, 910, 28, 29, 30, 1); + _item13.setDetails(5, 910, 31, 32, 33, 1); + _item14.setDetails(Rect(0, 0, 320, 170), 910, 3, 4, 5, 1, NULL); + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._dayNumber = 5; + BF_GLOBALS._sceneManager._previousScene = 900; + BF_GLOBALS.setFlag(7); + } + + if ( (BF_GLOBALS._sceneManager._previousScene == 910) + || (BF_GLOBALS._sceneManager._previousScene == 190) + || (BF_GLOBALS._sceneManager._previousScene == 300)) { + BF_GLOBALS._sceneManager._previousScene = 900; + BF_GLOBALS._v4CEE2 = 0; + BF_GLOBALS._v4CEE4 = 0; + } + + _field2DE0 = 0; + _field2DE2 = 0; + _field2DE4 = 0; + BF_GLOBALS.clearFlag(34); + _lyle._position.x = 0; + + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._sceneManager._previousScene == 900)){ + BF_GLOBALS.setFlag(34); + BF_GLOBALS._v4CEC8 = 0; + BF_GLOBALS._player.setVisage(129); + + _lyle.postInit(); + _lyle.setVisage(811); + _lyle.setPosition(Common::Point(-52, 217)); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle._field90 = 0; + _lyle.setDetails(910, 69, 70, 71, 5, &_item4); + + BF_GLOBALS._v4CECE[0] = 3; + BF_GLOBALS._v4CECE[12] = 2; + BF_GLOBALS._v4CECE[13] = 4; + BF_GLOBALS._v4CECE[14] = 3; + BF_GLOBALS._v4CECE[15] = 3; + BF_GLOBALS._v4CECE[16] = 4; + BF_GLOBALS._v4CECE[17] = 1; + BF_GLOBALS._v4CECA = 2; + BF_GLOBALS._v4CEE0 = 1; + _yellowCord.setPosition(Common::Point(291, -30)); + BF_GLOBALS._v4CECC = 0; + } + + if (BF_GLOBALS._sceneManager._previousScene == 920) { + BF_GLOBALS.setFlag(34); + BF_GLOBALS._player.setPosition(Common::Point(276, 119)); + BF_GLOBALS._player.setStrip(6); + if (BF_GLOBALS._v4CECC == 0) + _yellowCord.setPosition(Common::Point(291, -30)); + + if (BF_GLOBALS._dayNumber == 5) { + _nico.postInit(); + _nico.setVisage(914); + _nico.setStrip(5); + _nico.setFrame(8); + _nico.setPosition(Common::Point(263, 120)); + _nico.setDetails(910, 63, 64, 65, 5, &_item4); + + _stuart.postInit(); + _stuart.setVisage(918); + _stuart.setStrip(4); + _stuart.setFrame(1); + _stuart.setPosition(Common::Point(291, 127)); + _stuart.setDetails(910, 66, 67, 68, 5, &_nico); + + _lyle.postInit(); + _lyle.setVisage(916); + _lyle.setPosition(Common::Point(155, 113)); + _lyle.setStrip(3); + _lyle.setFrame(3); + _lyle._field90 = 1; + _lyle.setDetails(910, 69, 70, 71, 5, &_item4); + } + BF_GLOBALS._player.enableControl(); + } else if (BF_GLOBALS._sceneManager._previousScene == 935) { + BF_GLOBALS.setFlag(34); + BF_GLOBALS._v4CEC8 = 0; + _lyle.postInit(); + _lyle.setVisage(916); + _lyle.setPosition(Common::Point(155, 113)); + _lyle.setStrip(3); + _lyle.setFrame(3); + _lyle._field90 = 1; + _lyle.setDetails(910, 69, 70 ,71 , 5, &_item4); + + BF_GLOBALS._walkRegions.proc1(15); + BF_GLOBALS._walkRegions.proc1(16); + BF_GLOBALS._walkRegions.proc1(14); + BF_GLOBALS._walkRegions.proc1(10); + if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS._player.setVisage(1911); + BF_GLOBALS._player.animate(ANIM_MODE_NONE, 0, NULL); + BF_GLOBALS._player.setFrame(7); + } + BF_GLOBALS._player.setPosition(Common::Point(174, 157)); + BF_GLOBALS._player._strip = 7; + _nico.postInit(); + _nico.setVisage(913); + _nico.setPosition(Common::Point(262, 124)); + _nico.setStrip(6); + BF_GLOBALS._v4CEE6 = 0; + BF_GLOBALS._v4CEE2 = 1; + _nico.setDetails(910, 63, 64, 67, 5, &_item4); + BF_GLOBALS._v4CECA = 2; + if (BF_GLOBALS._v4CECC == 0) + _yellowCord.setPosition(Common::Point(291, -30)); + _sceneMode = 11; + if (BF_GLOBALS._v4CEC8 == 0) + add2Faders((const byte *)&unk_50E94, 2, 913, this); + else + add2Faders((const byte *)&unk_50E90, 2, 911, this); + } else { + BF_GLOBALS.clearFlag(8); + BF_GLOBALS._player.disableControl(); + } + + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)){ + _object7.postInit(); + _object7.setAction(&_action2); + } + + if (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 1) + _yellowCord.setPosition(Common::Point(540, 100)); + + if (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == 1) + _blackCord.setPosition(Common::Point(540, 100)); + + if (BF_GLOBALS._v4CECC == 2) { + _yellowCord.setStrip(4); + _yellowCord.setFrame(2); + _yellowCord.setPosition(Common::Point(135, 93)); + _yellowCord.setPriority(50); + _yellowCord._field90 = 1; + + _breakerBox.setFrame(3); + } + + if (BF_GLOBALS._v4CECA == 2) { + _blackCord.setStrip(4); + _blackCord.setFrame(1); + _blackCord.setPosition(Common::Point(135, 93)); + _blackCord.fixPriority(50); + _blackCord._field90 = 1; + + _breakerBox.setFrame(3); + } + + _object5.postInit(); + _object5.setVisage(919); + _object5.setStrip(5); + _object5.setPosition(Common::Point(286, 129)); + _object5.fixPriority(1); + + if (BF_GLOBALS._v4CEC8 == 0) + _object5.hide(); + + if (BF_GLOBALS._v4CEE0 == 0) { + _object5.setFrame(1); + _fakeWall.setPosition(Common::Point(292, 107)); + if (BF_GLOBALS._v4CECC != 2) + _yellowCord.setPosition(Common::Point(288, 57)); + BF_GLOBALS._walkRegions.proc1(10); + } else { + _object5.setFrame(6); + _fakeWall.setPosition(Common::Point(295, 20)); + _fakeWall.hide(); + if (BF_GLOBALS._v4CECC != 2) + _yellowCord.setPosition(Common::Point(291, -30)); + BF_GLOBALS._walkRegions.proc1(10); + } + + if (BF_GLOBALS._v4CECE[17] != 0) { + _sound1.play(100); + _sound1.holdAt(1); + } + + if (BF_GLOBALS._sceneManager._previousScene != 935) { + _sceneMode = 11; + if (BF_GLOBALS._v4CEC8 == 0) + add2Faders((const byte *)&unk_50E9C, 10, 910, this); + else + add2Faders((const byte *)&unk_50E98, 10, 911, this); + } +} + +void Scene910::signal() { + static uint32 black = 0; + + switch (_sceneMode) { + case 2: + _sceneMode = 3; + _timer1.set(60, this); + break; + case 3: + _sceneMode = 4; + transition((const byte *)&black, 35, 910, this, 0, 111, 112, 255, false); + break; + case 4: + _sceneMode = 5; + _timer1.set(30, this); + break; + case 5: + _sceneMode = 6; + transition((const byte *)&black, 40, 910, this, 0, 111, 112, 255, false); + break; + case 6: + _sceneMode = 7; + _timer1.set(60, this); + break; + case 7: + BF_GLOBALS._player.setVisage(129); + _lyle.setVisage(811); + _object5.hide(); + _sceneMode = 8; + transition((const byte *)&black, 95, 910, this, 0, 111, 112, 255, false); + break; + case 8: + _sceneMode = 9; + _timer1.set(30, this); + break; + case 9: + _sceneMode = 0; + transition((const byte *)&black, 100, 910, this, 0, 111, 112, 255, false); + BF_GLOBALS._player.enableControl(); + break; + case 10: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._v51C44 = 0; + BF_GLOBALS._sceneManager.changeScene(935); + break; + case 11: + if (BF_GLOBALS._sceneManager._previousScene == 900) { + if (BF_GLOBALS._v4CEC8 != 0) + transition((const byte *)&black, 25, 910, NULL, 0, 111, 112, 255, false); + if (BF_GLOBALS.getFlag(fWithLyle)) { + NpcMover *mover = new NpcMover(); + Common::Point destPos(22, 157); + _lyle.addMover(mover, &destPos, NULL); + } + + _sceneMode = 9100; + setAction(&_sequenceManager1, this, 9100, &BF_GLOBALS._player, NULL); + } else if (BF_GLOBALS._sceneManager._previousScene == 935) { + _sceneMode = 9146; + _stripManager.start(9103, this); + } + break; + case 12: + BF_GLOBALS._player.setVisage(129); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setStrip(7); + BF_GLOBALS._player.enableControl(); + break; + case 13: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 9117, &_nico, NULL); + BF_GLOBALS._v4CEE2 = 2; + // No break on purpose + case 15: + _stuart.postInit(); + _stuart.setDetails(910, 66, 67, 68, 5, &_nico); + BF_GLOBALS._v4CEE8 = 0; + _sceneMode = 9121; + setAction(&_sequenceManager1, this, 9121, &_stuart, NULL); + break; + case 14: + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(940); + break; + case 16: + _lyle._field90 = 1; + _sceneMode = 10; + addFader((const byte *)&black, 2, this); + BF_GLOBALS._v4CEE2 = 1; + BF_GLOBALS._walkRegions.proc1(16); + BF_GLOBALS._walkRegions.proc1(14); + BF_GLOBALS._sceneItems.remove(&_item16); + break; + case 17: + BF_GLOBALS._player._strip = 7; + BF_GLOBALS._player._frame = 1; + if (_field2DE2 == 0) { + _field2DE2 = 1; + if (BF_GLOBALS._v4CEE2 == 4) { + _sceneMode = 9149; + setAction(&_sequenceManager1, this, 9149, &BF_GLOBALS._player, NULL); + } else { + _sceneMode = 9141; + setAction(&_sequenceManager1, this, 9141, &BF_GLOBALS._player, &_nico, NULL); + } + } else { + SceneItem::display(910, 91, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_GLOBALS._player.enableControl(); + } + break; + case 18: + BF_GLOBALS._player._strip = 7; + BF_GLOBALS._player._frame = 1; + if (BF_GLOBALS._v4CEE4 == 3) { + if (_field2DE4 == 0) { + _field2DE4 = 1; + _sceneMode = 9142; + setAction(&_sequenceManager1, this, 9142, &BF_GLOBALS._player, &_stuart, NULL); + } else { + SceneItem::display(910, 92, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_GLOBALS._player.enableControl(); + } + } else { + SceneItem::display(910, 94, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_GLOBALS._player.enableControl(); + } + break; + case 19: + BF_GLOBALS._deathReason = 14; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 20: + BF_GLOBALS._player.enableControl(); + break; + case 9100: + if (BF_GLOBALS._dayNumber == 5) + BF_GLOBALS._walkRegions.proc1(1); + BF_GLOBALS._player.enableControl(); + break; + case 9101: + if ((BF_GLOBALS._v4CEE0 == 0) && (BF_GLOBALS._v4CEC8 != 0) && (BF_GLOBALS._v4CECE[17] == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910) && (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == 910)) + BF_GLOBALS.clearFlag(fGotPointsForSearchingDA); + else + BF_GLOBALS.setFlag(fGotPointsForSearchingDA); + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(900); + break; + case 9102: + if ((BF_GLOBALS._v4CECE[13] < 4) && (_breakerBox._frame == 1)) + _breakerBox.animate(ANIM_MODE_5, NULL); + + BF_GLOBALS._player.enableControl(); + _breakerBoxInset.postInit(); + _breakerBoxInset.setVisage(910); + _breakerBoxInset.setStrip(3); + _breakerBoxInset.setFrame(1); + _breakerBoxInset.setPosition(Common::Point(160, 130)); + _breakerBoxInset.fixPriority(250); + break; + case 9103: + BF_GLOBALS._player.enableControl(); + _generatorInset.postInit(); + _generatorInset.setVisage(910); + _generatorInset.setStrip(3); + _generatorInset.setFrame(2); + _generatorInset.setPosition(Common::Point(160, 130)); + _generatorInset.fixPriority(250); + break; + case 9110: + if (!BF_GLOBALS.getFlag(fGotPointsForCrate)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForCrate); + } + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 1); + _blackCord.setPosition(Common::Point(540, 100)); + BF_GLOBALS._player.enableControl(); + break; + case 9111: + if ((BF_GLOBALS._bookmark == bEndDayThree) && (!BF_GLOBALS.getFlag(fGotPointsForGeneratorOff))) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForGeneratorOff); + } + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 910); + _blackCord.setStrip(6); + _blackCord.setFrame(1); + _blackCord.setPosition(Common::Point(114, 149)); + _blackCord.fixPriority(249); + BF_GLOBALS._v4CECA = 0; + _blackCord._field90 = 0; + BF_GLOBALS._player.enableControl(); + break; + case 9112: + BF_GLOBALS._player._strip = 4; + BF_GLOBALS._player._frame = 1; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 1); + _yellowCord.setPosition(Common::Point(540, 100)); + BF_GLOBALS._player.enableControl(); + break; + case 9113: + BF_GLOBALS._player._strip = 4; + BF_GLOBALS._player._frame = 1; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 910); + _yellowCord.setStrip(6); + _yellowCord.setFrame(2); + _yellowCord.setPosition(Common::Point(_fakeWall._position.x - 4, _fakeWall._position.y - 50)); + _yellowCord.fixPriority(50); + BF_GLOBALS._v4CECC = 0; + _yellowCord._field90 = 0; + _yellowCord.show(); + BF_GLOBALS._player.enableControl(); + break; + case 9114: + _fakeWall.hide(); + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)) { + BF_GLOBALS._player.disableControl(); + _nico.postInit(); + _nico.setDetails(910, 63, 64, 65, 5, &_item4); + BF_GLOBALS._v4CEE6 = 0; + _object7.postInit(); + _action2.remove(); + _sceneMode = 9116; + setAction(&_sequenceManager1, this, 9116, &_nico, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + case 9115: + BF_GLOBALS._player.enableControl(); + break; + case 9116: + BF_GLOBALS._player.disableControl(); + _sceneMode = 16; + _stripManager.start(9119, this); + break; + case 9118: + // No break on purpose + case 9137: + BF_GLOBALS._deathReason = 16; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9119: + if (!BF_GLOBALS.getFlag(fGotPointsForCordOnForklift)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForCordOnForklift); + } + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 0); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1); + BF_GLOBALS._player.enableControl(); + break; + case 9120: + BF_GLOBALS._walkRegions.proc1(7); + BF_GLOBALS._player.enableControl(); + break; + case 9121: + _item3.setDetails(7, 910, 96, 60, 61, 3); + BF_GLOBALS._v4CEE4 = 2; + if (BF_GLOBALS._v4CEE2 == 4) { + _sceneMode = 20; + _stripManager.start(9115, this); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + case 9123: + BF_GLOBALS.clearFlag(gunDrawn); + switch (_field2DDA - 1) { + case 0: + _sceneMode = 9102; + setAction(&_sequenceManager1, this, 9102, &BF_GLOBALS._player, NULL); + break; + case 1: + _sceneMode = 9103; + setAction(&_sequenceManager1, this, 9103, &BF_GLOBALS._player, NULL); + break; + case 2: + _sceneMode = 9143; + setAction(&_sequenceManager1, this, 9143, &BF_GLOBALS._player, NULL); + break; + case 3: + _sceneMode = 9110; + setAction(&_sequenceManager1, this, 9110, &BF_GLOBALS._player, &_blackCord, NULL); + break; + case 4: + _sceneMode = 9111; + setAction(&_sequenceManager1, this, 9111, &BF_GLOBALS._player, &_blackCord, NULL); + break; + case 5: + switch (BF_GLOBALS._v4CEE2 - 1) { + case 0: + _sceneMode = 9118; + setAction(&_sequenceManager1, this, 9118, &BF_GLOBALS._player, &_nico, NULL); + break; + case 1: + _sceneMode = 9148; + setAction(&_sequenceManager1, this, 9148, &BF_GLOBALS._player, &_nico, NULL); + break; + case 2: + // No break on purpose + case 3: { + _sceneMode = 17; + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(232, 138); + BF_GLOBALS._player.addMover(mover, &destPos, this); + } + default: + break; + } + break; + case 6: { + _sceneMode = 18; + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(248, 137); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 7: { + _sceneMode = 9112; + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(285, 114); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 8: { + _sceneMode = 9113; + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(285, 114); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 9: + _sceneMode = 9119; + setAction(&_sequenceManager1, this, 9119, &BF_GLOBALS._player, &_nico, &_yellowCord, NULL); + break; + case 10: + _yellowCord.fixPriority(127); + if (_yellowCord._position.x != 267) + _yellowCord.hide(); + _sceneMode = 9136; + setAction(&_sequenceManager1, this, 9136, &BF_GLOBALS._player, &_stuart, &_yellowCord, NULL); + BF_GLOBALS._v4CEE4 = 3; + break; + case 11: + _sceneMode = 9137; + setAction(&_sequenceManager1, this, 9137, &BF_GLOBALS._player, &_nico, NULL); + break; + default: + BF_GLOBALS._player.enableControl(); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &_destPos, NULL); + break; + } + break; + case 9124: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS.setFlag(gunDrawn); + break; + case 9125: + BF_GLOBALS.setFlag(fBackupAt340); + BF_GLOBALS._v4CEE2 = 4; + _stuart.postInit(); + _nico.setDetails(910, 72, 73, 74, 3, NULL); + _stuart.setDetails(910, 66, 67, 68, 5, &_nico); + BF_GLOBALS._v4CEE8 = 0; + _sceneMode = 9121; + setAction(&_sequenceManager1, this, 9121, &_stuart, NULL); + break; + case 9126: + _sceneMode = 19; + if (BF_GLOBALS._v4CEE4 == 0) + signal(); + else + _stripManager.start(9115, this); + break; + case 9129: + // No break on purpose + case 9134: + BF_GLOBALS._deathReason = 17; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9130: + _lyle.setAction(&_sequenceManager2, NULL, 9133, &_lyle, NULL); + BF_GLOBALS._v4CECE[14] = 3; + subE82BD(); + BF_GLOBALS._walkRegions.proc1(15); + break; + case 9132: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._v4CEE4 = 4; + BF_GLOBALS._deathReason = 13; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9135: + BF_GLOBALS._deathReason = 15; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9136: + if (!BF_GLOBALS.getFlag(fGotPointsForCuffingNico)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForCuffingNico); + } + _lyle.setAction(&_sequenceManager2, NULL, 9131, &_lyle, NULL); + BF_GLOBALS._walkRegions.proc2(16); + if (BF_GLOBALS._v4CEE2 == 4) + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 0); + else + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910); + _forbes.postInit(); + _forbes.setDetails(910, 86, 87, 88, 4, &_item8); + _sceneMode = 9139; + setAction(&_sequenceManager1, this, 9139, &_forbes, &BF_GLOBALS._player, NULL); + break; + case 9139: + BF_GLOBALS._walkRegions.proc1(4); + _field2DE0 = 1; + BF_GLOBALS._player.enableControl(); + break; + case 9140: + _sceneMode = 14; + addFader((const byte *)&black, 2, this); + break; + case 9141: + BF_INVENTORY.setObjectScene(INV_22_SNUB, 1); + if (!BF_GLOBALS.getFlag(fGotPointsForCuffingDA)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForCuffingDA); + } + BF_GLOBALS._player.enableControl(); + break; + case 9142: + BF_GLOBALS._player.enableControl(); + if (!BF_GLOBALS.getFlag(fGotPointsForSearchingNico)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForSearchingNico); + } + break; + case 9143: + if (BF_GLOBALS._v4CEE2 == 0) { + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(920); + } else { + SceneItem::display(910, 89, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + _sceneMode = 9144; + setAction(&_sequenceManager1, this, 9144, &BF_GLOBALS._player, NULL); + } + break; + case 9144: + // No break on purpose + case 9146: + BF_GLOBALS._player.enableControl(); + break; + case 9148: + BF_GLOBALS._deathReason = 23; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9149: + SceneItem::display(910, 74, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_INVENTORY.setObjectScene(INV_22_SNUB, 1); + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player.setVisage(129); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player._strip = 7; + BF_GLOBALS._player._frame = 1; + break; + default: + break; + } +} + +void Scene910::process(Event &event) { + SceneExt::process(event); + if ((!BF_GLOBALS._player._enabled) || (event.mousePos.y >= 167)) + return; + + if (!_focusObject) { + if (_item17._bounds.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + BF_GLOBALS._events.setCursor(surface); + } else if ((BF_GLOBALS._v4CEE0 == 0) || (BF_GLOBALS._v4CEE2 != 0)) { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } else if (!_item16._bounds.contains(event.mousePos)) { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } else { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NW); + BF_GLOBALS._events.setCursor(surface); + } + } + + if (event.eventType != EVENT_BUTTON_DOWN) + return; + + switch (BF_GLOBALS._events.getCursor()) { + case INV_COLT45: + if (!BF_GLOBALS._player._bounds.contains(event.mousePos)) + break; + if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS._player.disableControl(); + _destPos = BF_GLOBALS._player._position; + _sceneMode = 9123; + setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL); + event.handled = true; + } else if (BF_GLOBALS._v4CEE2 <= 1) { + if (BF_GLOBALS.getFlag(fCanDrawGun)) { + BF_GLOBALS._player.addMover(NULL); + BF_GLOBALS._player.disableControl(); + _sceneMode = 9124; + setAction(&_sequenceManager1, this, 9124, &BF_GLOBALS._player, NULL); + } else + SceneItem::display(1, 4, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + } else + SceneItem::display(910, 81, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + event.handled = true; + break; + case CURSOR_WALK: + if (BF_GLOBALS._v4CEE2 == 1) { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._player._visage == 1911) { + BF_GLOBALS._player.disableControl(); + _destPos = event.mousePos; + _field2DDA = 0; + _sceneMode = 9123; + setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL); + } else { + _sceneMode = 9118; + setAction(&_sequenceManager1, this, 9118, &BF_GLOBALS._player, &_nico, NULL); + event.handled = true; + } + } else if (BF_GLOBALS._player._visage == 1911) { + BF_GLOBALS._player.disableControl(); + _destPos = event.mousePos; + _field2DDA = 0; + _sceneMode = 9123; + setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL); + } + default: + break; + } +} + +void Scene910::dispatch() { + SceneExt::dispatch(); + if (_action) + return; + + if ((_sceneMode != 14) && (BF_GLOBALS._player._position.x < 30) && (BF_GLOBALS._player._position.y > 148)) { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._dayNumber != 5) { + _sceneMode = 9101; + setAction(&_sequenceManager1, this, 9101, &BF_GLOBALS._player, NULL); + } else { + _sceneMode = 9146; + if (BF_GLOBALS._v4CEE0 == 0) + setAction(&_sequenceManager1, this, 9146, &BF_GLOBALS._player, NULL); + else + setAction(&_sequenceManager1, this, 9145, &BF_GLOBALS._player, NULL); + } + } + + if ((BF_GLOBALS._player._position.x > 265) && (BF_GLOBALS._player._position.y < 102) && (BF_GLOBALS._v4CEE0 != 0) && (_sceneMode != 9143)) { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS.getFlag(gunDrawn)) { + _field2DDA = 3; + _sceneMode = 9123; + setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL); + } else if (BF_GLOBALS._v4CEE2 == 0) { + _sceneMode = 9143; + setAction(&_sequenceManager1, this, 9143, &BF_GLOBALS._player, NULL); + } else { + SceneItem::display(910, 98, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + _sceneMode = 9144; + setAction(&_sequenceManager1, this, 9144, &BF_GLOBALS._player, NULL); + } + } + + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._player._position.x > 250) && (_sceneMode != 9135) && (_sceneMode != 11) && (BF_GLOBALS._v4CEE0 != 0) && (BF_GLOBALS._v4CEE2 == 0)) { + BF_GLOBALS._player.disableControl(); + _object7.remove(); + _nico.remove(); + _nico.postInit(); + _nico.setDetails(910, 63, 64, 65, 5, &_item4); + _sceneMode = 9135; + setAction(&_sequenceManager1, this, 9135, &BF_GLOBALS._player, &_nico, NULL); + } + +} + +void Scene910::checkGun() { + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0) && (BF_GLOBALS._v4CEE0 != 0)) + SceneItem::display(910, 70, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + else + SceneExt::checkGun(); +} + +void Scene910::subE82BD() { + if (BF_GLOBALS._v4CEE0 != 0) + return; + + if (! BF_GLOBALS.getFlag(fGotPointsForLightsOn)) { + T2_GLOBALS._uiElements.addScore(50); + BF_GLOBALS.setFlag(fGotPointsForLightsOn); + } + BF_GLOBALS._v4CEE0 = 1; + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._walkRegions.proc2(10); + _sceneMode = 9114; + _sound2.play(42); + if ((BF_GLOBALS._v4CECC == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910)) + setAction(&_sequenceManager1, this, 9127, &_fakeWall, &_yellowCord, &_object5, NULL); + else + setAction(&_sequenceManager1, this, 9114, &_fakeWall, &_object5, NULL); +} + +void Scene910::subE83E1() { + if (BF_GLOBALS._v4CEE0 != 0) { + _fakeWall.show(); + if ((BF_GLOBALS._bookmark == 21) && (!BF_GLOBALS.getFlag(80))) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(80); + } + BF_GLOBALS._v4CEE0 = 0; + BF_GLOBALS._walkRegions.proc1(10); + BF_GLOBALS._player.disableControl(); + _sceneMode = 9115; + _sound2.play(42); + if ((BF_GLOBALS._v4CECC == 0) && (BF_INVENTORY.getObjectScene(57) == 910)) + setAction(&_sequenceManager1, this, 9128, &_fakeWall, &_yellowCord, &_object5, NULL); + else + setAction(&_sequenceManager1, this, 9115, &_fakeWall, &_object5, NULL); + } + + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)) { + // _objectList.draw(); + if (BF_GLOBALS._sceneObjects->contains(&_breakerBoxInset)) + _breakerBoxInset.remove(); + if (BF_GLOBALS._sceneObjects->contains(&_generatorInset)) + _generatorInset.remove(); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 9120; + BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 9120, &BF_GLOBALS._player, &_lyle, NULL); + BF_GLOBALS._walkRegions.proc2(1); + } +} + +/*-------------------------------------------------------------------------- + * 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->_crateWindow.postInit(); + scene->_sceneMode = 9204; + if (!BF_GLOBALS.getFlag(fGotPointsForBoots)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForBoots); + } + scene->setAction(&scene->_sequenceManager1, scene, 9204, &BF_GLOBALS._player, &scene->_crateWindow, 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->_crateTop, 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->_crateTop, 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) { + _doorway.postInit(); + _doorway.setVisage(922); + _doorway.setStrip(2); + _doorway.fixPriority(1); + _doorway.setPosition(Common::Point(145, 82)); + } + + _crateTop.postInit(); + _crateTop.setVisage(922); + if (BF_GLOBALS.getFlag(fCrateOpen)) { + _crateTop.setStrip(3); + _crateTop.setFrame(5); + } + + _crateTop.setPosition(Common::Point(158, 107)); + _crateTop.fixPriority(130); + + _exitN.setDetails(Rect(116, 12, 165, 81), 920, -1, -1, -1, 1, NULL); + _item6.setDetails(6, 920, 15, 16, 17, 1); + _item4.setDetails(5, 920, 12, 13, 14, 1); + _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: + _crateWindow.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(); + T2_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 < (UI_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); + T2_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; + } +} + +void Scene930::Object4::remove() { + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + + if (scene->_v141C && !BF_GLOBALS._sceneObjects->contains(&scene->_object5)) { + scene->_boots.setAction(&scene->_action3); + } + + FocusObject::remove(); +} + +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 { + T2_GLOBALS._uiElements.addScore(50); + BF_INVENTORY.setObjectScene(55, 1); + setFrame2(getFrameCount()); + _lookLineNum = 92; + _useLineNum = -1; + } + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + +void Scene930::Object5::remove() { + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + scene->_boots.setAction(&scene->_action3); + + FocusObject::remove(); +} + +/* Items */ +bool Scene930::Item1::startAction(CursorType action, Event &event) { + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + + 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)) { + T2_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 + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + scene->subF3C07(); + 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 + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + signal(); + 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(INV_SCHEDULE) == 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->transition((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->transition((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->transition((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 - Jail ending animation + * + *--------------------------------------------------------------------------*/ + +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)) { + // WORKAROUND: If the player shot Nico, the alternate text was previously going off-screen + scene->_gameTextSpeaker1._offsetPos.y -= 10; + scene->_stripManager.start(9408, this); + } else + 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; + T2_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(); + T2_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..b0761713b1 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes9.h @@ -0,0 +1,498 @@ +/* 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: + virtual bool startAction(CursorType action, Event &event); + }; + class Item4: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + /* Objects */ + class Gate: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Door: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Dog: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Lyle: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Body: 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(); + }; + class Action3 : public Action { + public: + virtual void signal(); + }; + class Action4 : public Action { + public: + virtual void signal(); + }; + +public: + SequenceManager _sequenceManager1, _sequenceManager2; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + Item1 _item1; + Gate _gate; + Door _door; + Dog _dog; + NamedHotspot _item2; + NamedHotspot _item3; + NamedObject _object4; + NamedObject _object5; + Lyle _lyle; + Body _body; + Item4 _item4; + ASoundExt _sound1; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + int _field1974; + int _field1976; + + Scene900(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void synchronize(Serializer &s); +}; + +class Scene910: public PalettedScene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + /* Objects */ + class Lyle: public NamedObject { + public: + int _field90; + virtual void synchronize(Serializer &s); + virtual bool startAction(CursorType action, Event &event); + }; + class Nico: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Stuart: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Forbes: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class PowerCord: public NamedObject { + public: + int _field90, _field92; + + virtual void synchronize(Serializer &s); + virtual bool startAction(CursorType action, Event &event); + void init(int val); + + }; + class BreakerBox: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class FakeWall: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + class Object13: public NamedObject { + protected: + int _field90, _field92; + public: + void setupBreaker(int x, int y, int mode, int8 frameNumber); + virtual void synchronize(Serializer &s); + virtual bool startAction(CursorType action, Event &event); + virtual void remove(); + }; + + class BlackPlug: public Object13 { + public: + void init(int x, int y, int arg8, int8 argA); + virtual bool startAction(CursorType action, Event &event); + virtual void remove(); + }; + + class Object25: public NamedObject { + int _field90, _field92; + public: + void subEBBDC(int x, int y, int arg8, int argA); + virtual void synchronize(Serializer &s); + virtual bool startAction(CursorType action, Event &event); + virtual void remove(); + }; + + class BreakerBoxInset: public FocusObject { + Object13 _object13, _object14, _object15, _object16, _object17, _object18; + Object13 _object19, _object20, _object21, _object22, _object23, _object24; + Object25 _object25, _object26; + public: + Object13 _object27; + BlackPlug _object28; + virtual Common::String getClassName() { return "Scene910_object12"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + }; + + class PowerButton: public NamedObject { + public: + NamedObject _object32; + virtual void remove(); + virtual bool startAction(CursorType action, Event &event); + void init(int frame); + }; + + class GeneratorInset: public FocusObject { + BlackPlug _blackPlug; + PowerButton _powerButton; + public: + virtual Common::String getClassName() { return "Scene910_object29"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + }; + + /* Items */ + class Generator: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item2: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item3: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item9: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item15: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item16: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item17: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + int _field2DDA, _field2DD8, _field2DE0, _field2DE2, _field2DE4; + Common::Point _destPos; +public: + SequenceManager _sequenceManager1, _sequenceManager2; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + SpeakerFBI _fbiSpeaker; + SpeakerNico _nicoSpeaker; + SpeakerDA _daSpeaker; + Action1 _action1; + Action2 _action2; + Timer _timer1; + Lyle _lyle; + Nico _nico; + Stuart _stuart; + Forbes _forbes; + NamedObject _object5, _vent, _object7; + PowerCord _blackCord, _yellowCord; + BreakerBox _breakerBox; + FakeWall _fakeWall; + BreakerBoxInset _breakerBoxInset; + GeneratorInset _generatorInset; + NamedObject _object30, _object31, _object32; + Generator _generator; + Item2 _item2; + Item3 _item3; + NamedHotspot _item4, _item5, _item6, _item7, _item8; + Item9 _item9, _item10; + NamedHotspot _item11, _backWall, _item13, _item14; + Item15 _item15; + Item16 _item16; + Item17 _item17; + ASoundExt _sound1, _sound2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void checkGun(); + void subE82BD(); + void subE83E1(); +}; + +class Scene920: public SceneExt { + /* Items */ + class Item1: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item8: public NamedHotspot { + public: + virtual 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 _crateTop; + NamedObject _crateWindow; + NamedObject _doorway; + Item8 _exitN; + Common::Point _oldCoord; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void synchronize(Serializer &s); +}; + +class Scene930: public PalettedScene { + /* Objects */ + class Object1: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object2: public FocusObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object3: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object4: public FocusObject { + public: + virtual bool startAction(CursorType action, Event &event); + virtual void remove(); + }; + class Object5: public FocusObject { + public: + virtual bool startAction(CursorType action, Event &event); + virtual void remove(); + }; + /* Items */ + class Item1: 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(); + }; + + 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; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); + virtual void synchronize(Serializer &s); +}; + +class Scene935: public PalettedScene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + +public: + SequenceManager _sequenceManager; + NamedObject _object1; + NamedObject _object2; + NamedObject _object3; + Action1 _action1; + VisualSpeaker _visualSpeaker; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene940: public SceneExt { + /* Items */ + class Item1: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + /* Actions */ + class Action1 : public Action { + public: + virtual 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; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual 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..8af18b43b8 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_speakers.cpp @@ -0,0 +1,1023 @@ +/* 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"; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerKate::SpeakerKate(): VisualSpeaker() { + _color1 = 108; + + _speakerName = "KATE"; +} + +void SpeakerKate::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(122); + _object1.setStrip2(8); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 270, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(122); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 270, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2._numFrames = 7; + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerTony::SpeakerTony(): VisualSpeaker() { + _color1 = 108; + _color2 = 8; + + _speakerName = "TONY"; +} + +void SpeakerTony::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(132); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 62, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +} // End of namespace BlueForce + +} // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_speakers.h b/engines/tsage/blue_force/blueforce_speakers.h new file mode 100644 index 0000000000..508279a929 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_speakers.h @@ -0,0 +1,359 @@ +/* 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"; } +}; + +class SpeakerKate: public VisualSpeaker { +public: + SpeakerKate(); + + virtual Common::String getClassName() { return "SpeakerKate"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerTony: public VisualSpeaker { +public: + SpeakerTony(); + + virtual Common::String getClassName() { return "SpeakerTony"; } + virtual void setText(const Common::String &msg); +}; +} // End of namespace BlueForce + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blueforce_logic.cpp b/engines/tsage/blueforce_logic.cpp deleted file mode 100644 index d266d5e1d9..0000000000 --- a/engines/tsage/blueforce_logic.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* 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/blueforce_logic.h" -#include "tsage/scenes.h" -#include "tsage/tsage.h" -#include "tsage/staticres.h" - -namespace tSage { - -void BlueForceGame::start() { - // Start the game - _globals->_sceneManager.changeScene(20); - - _globals->_events.setCursor(CURSOR_WALK); -} - -Scene *BlueForceGame::createScene(int sceneNumber) { - switch (sceneNumber) { - case 20: - case 50: - case 60: - error("Scene group 0 not implemented"); - case 100: - case 109: - case 110: - case 114: - case 115: - case 125: - case 140: - case 150: - case 160: - case 180: - case 190: - error("Scene group 1 not implemented"); - case 200: - case 210: - case 220: - case 225: - case 265: - case 270: - case 271: - case 280: - error("Scene group 2 not implemented"); - case 300: - case 315: - case 325: - case 330: - case 340: - case 342: - case 350: - case 355: - case 360: - case 370: - case 380: - case 385: - case 390: - error("Scene group 3 not implemented"); - case 410: - case 415: - case 440: - case 450: - error("Scene group 4 not implemented"); - case 550: - case 551: - case 560: - case 570: - case 580: - case 590: - error("Scene group 5 not implemented"); - case 600: - case 620: - case 666: - case 690: - error("Scene group 6 not implemented"); - case 710: - error("Scene group 7 not implemented"); - case 800: - case 810: - case 820: - case 830: - case 840: - case 850: - case 860: - case 870: - case 880: - error("Scene group 8 not implemented"); - case 900: - case 910: - case 920: - case 930: - case 935: - case 940: - error("Scene group 9 not implemented"); - default: - error("Unknown scene number - %d", sceneNumber); - break; - } -} - -} // End of namespace tSage diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp index b475310533..d86548bd4b 100644 --- a/engines/tsage/converse.cpp +++ b/engines/tsage/converse.cpp @@ -26,7 +26,7 @@ #include "tsage/globals.h" #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { #define STRIP_WORD_DELAY 30 @@ -34,12 +34,13 @@ namespace tSage { SequenceManager::SequenceManager() : Action() { Common::set_to(&_objectList[0], &_objectList[6], (SceneObject *)NULL); _sequenceData.clear(); - _field24 = 0; + _fontNum = 0; _sequenceOffset = 0; _resNum = 0; _field26 = 0; _objectIndex = 0; _keepActive = false; + _onCallback = NULL; setup(); } @@ -56,7 +57,7 @@ void SequenceManager::synchronize(Serializer &s) { s.syncAsSint32LE(_resNum); s.syncAsSint32LE(_sequenceOffset); s.syncAsByte(_keepActive); - s.syncAsSint32LE(_field24); + s.syncAsSint32LE(_fontNum); s.syncAsSint32LE(_field26); s.syncAsSint32LE(_objectIndex); @@ -77,7 +78,7 @@ void SequenceManager::remove() { _sequenceData.clear(); } - if (_globals->_sceneObjects->contains(&_sceneText)) + if (g_globals->_sceneObjects->contains(&_sceneText)) _sceneText.remove(); Common::set_to(&_objectList[0], &_objectList[6], (SceneObject *)NULL); @@ -85,7 +86,7 @@ void SequenceManager::remove() { } void SequenceManager::signal() { - if (_globals->_sceneObjects->contains(&_sceneText)) + if (g_globals->_sceneObjects->contains(&_sceneText)) _sceneText.hide(); bool continueFlag = true; @@ -98,8 +99,6 @@ void SequenceManager::signal() { } uint16 idx = static_cast<uint16>(getNextValue() - 32000); - if (idx > 34) - continue; int16 v1, v2, v3; switch (idx) { @@ -144,8 +143,8 @@ void SequenceManager::signal() { v1 = getNextValue(); v3 = getNextValue(); v2 = getNextValue(); - _globals->_sceneManager._scene->_sceneBounds.moveTo(v3, v2); - _globals->_sceneManager._scene->loadScene(v1); + g_globals->_sceneManager._scene->_sceneBounds.moveTo(v3, v2); + g_globals->_sceneManager._scene->loadScene(v1); break; case 10: { int resNum= getNextValue(); @@ -225,7 +224,7 @@ void SequenceManager::signal() { int minPercent = getNextValue(); int yEnd = getNextValue(); int maxPercent = getNextValue(); - _globals->_sceneManager._scene->setZoomPercents(yStart, minPercent, yEnd, maxPercent); + g_globals->_sceneManager._scene->setZoomPercents(yStart, minPercent, yEnd, maxPercent); break; } case 26: @@ -253,7 +252,7 @@ void SequenceManager::signal() { break; case 30: v1 = getNextValue(); - _globals->_scrollFollower = (v1 == -1) ? NULL : _objectList[v1]; + g_globals->_scrollFollower = (v1 == -1) ? NULL : _objectList[v1]; break; case 31: _sceneObject->setObjectWrapper(new SceneObjectWrapper()); @@ -267,7 +266,7 @@ void SequenceManager::signal() { setDelay(1); else { _sceneText.remove(); - _globals->_sceneManager._scene->_stripManager.start(v1, this); + g_globals->_sceneManager._scene->_stripManager.start(v1, this); } break; case 34: { @@ -284,6 +283,33 @@ void SequenceManager::signal() { _objectList[objIndex3], _objectList[objIndex4], _objectList[objIndex5], _objectList[objIndex6], NULL); break; } + /* Following indexes were introduced for Blue Force */ + case 35: + v1 = getNextValue(); + _sceneObject->updateAngle(_objectList[v1]->_position); + break; + case 36: + _sceneObject->animate(ANIM_MODE_9, NULL); + break; + case 37: + v1 = getNextValue(); + v2 = getNextValue(); + if (_onCallback) + _onCallback(v1, v2); + break; + case 38: { + int resNum = getNextValue(); + int lineNum = getNextValue(); + int fontNum = getNextValue(); + int color1 = getNextValue(); + int color2 = getNextValue(); + int color3 = getNextValue(); + int xp = getNextValue(); + int yp = getNextValue(); + int width = getNextValue(); + setMessage(resNum, lineNum, fontNum, color1, color2, color3, Common::Point(xp, yp), width); + break; + } default: error("SequenceManager::signal - Unknown action %d at offset %xh", idx, _sequenceOffset - 2); break; @@ -293,7 +319,7 @@ void SequenceManager::signal() { void SequenceManager::process(Event &event) { if (((event.eventType == EVENT_BUTTON_DOWN) || (event.eventType == EVENT_KEYPRESS)) && - !event.handled && _globals->_sceneObjects->contains(&_sceneText)) { + !event.handled && g_globals->_sceneObjects->contains(&_sceneText)) { // Remove the text item _sceneText.remove(); setDelay(2); @@ -308,8 +334,8 @@ void SequenceManager::attached(EventHandler *newOwner, EventHandler *endHandler, // Get the sequence number to use _resNum = va_arg(va, int); - byte *seqData = _resourceManager->getResource(RES_SEQUENCE, _resNum, 0); - uint seqSize = _vm->_memoryManager.getSize(seqData); + byte *seqData = g_resourceManager->getResource(RES_SEQUENCE, _resNum, 0); + uint seqSize = g_vm->_memoryManager.getSize(seqData); _sequenceData.resize(seqSize); Common::copy(seqData, seqData + seqSize, &_sequenceData[0]); @@ -337,21 +363,26 @@ uint16 SequenceManager::getNextValue() { } void SequenceManager::setMessage(int resNum, int lineNum, int color, const Common::Point &pt, int width) { - _sceneText._color1 = color; - _sceneText._color2 = 0; - _sceneText._color3 = 0; - _sceneText._fontNumber = 2; + setMessage(resNum, lineNum, 2, color, 0, 0, pt, width); +} + +void SequenceManager::setMessage(int resNum, int lineNum, int fontNum, int color1, int color2, int color3, + const Common::Point &pt, int width) { + _sceneText._color1 = color1; + _sceneText._color2 = color2; + _sceneText._color3 = color3; + _sceneText._fontNumber = fontNum; _sceneText._width = width; // Get the display message - Common::String msg = _resourceManager->getMessage(resNum, lineNum); + Common::String msg = g_resourceManager->getMessage(resNum, lineNum); // Set the text message _sceneText.setup(msg); // Move the text to the correct position Rect textRect = _sceneText._bounds; - Rect sceneBounds = _globals->_sceneManager._scene->_sceneBounds; + Rect sceneBounds = g_globals->_sceneManager._scene->_sceneBounds; sceneBounds.collapse(4, 2); textRect.moveTo(pt); textRect.contain(sceneBounds); @@ -374,14 +405,14 @@ void SequenceManager::setMessage(int resNum, int lineNum, int color, const Commo } SequenceManager *SequenceManager::globalManager() { - return &_globals->_sequenceManager; + return &g_globals->_sequenceManager; } /*--------------------------------------------------------------------------*/ ConversationChoiceDialog::ConversationChoiceDialog() { _stdColor = 23; - _highlightColor = _globals->_scenePalette._colors.background; + _highlightColor = g_globals->_scenePalette._colors.background; _fontNumber = 1; } @@ -412,17 +443,17 @@ int ConversationChoiceDialog::execute(const Common::StringArray &choiceList) { // Draw the dialog draw(); - _globals->_events.showCursor(); + g_globals->_events.showCursor(); // Event handling loop Event event; - while (!_vm->getEventManager()->shouldQuit()) { - while (!_globals->_events.getEvent(event, EVENT_KEYPRESS | EVENT_BUTTON_DOWN | EVENT_MOUSE_MOVE) && - !_vm->getEventManager()->shouldQuit()) { + while (!g_vm->shouldQuit()) { + while (!g_globals->_events.getEvent(event, EVENT_KEYPRESS | EVENT_BUTTON_DOWN | EVENT_MOUSE_MOVE) && + !g_vm->shouldQuit()) { g_system->delayMillis(10); g_system->updateScreen(); } - if (_vm->getEventManager()->shouldQuit()) + if (g_vm->shouldQuit()) break; if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode >= Common::KEYCODE_1) && @@ -473,7 +504,7 @@ void ConversationChoiceDialog::draw() { // Make a backup copy of the area the dialog will occupy Rect tempRect = _bounds; tempRect.collapse(-10, -10); - _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), tempRect); + _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), tempRect); // Fill in the contents of the entire dialog _gfxManager._bounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); @@ -527,6 +558,8 @@ void Obj44::synchronize(Serializer &s) { StripManager::StripManager() { _callbackObject = NULL; _activeSpeaker = NULL; + _onBegin = NULL; + _onEnd = NULL; reset(); } @@ -534,12 +567,14 @@ StripManager::~StripManager() { } void StripManager::start(int stripNum, EventHandler *owner, StripCallback *callback) { + if (_onBegin) + _onBegin(); reset(); _stripNum = stripNum; _callbackObject = callback; - _sceneNumber = _globals->_sceneManager._scene->_screenNumber; - _sceneBounds = _globals->_sceneManager._scene->_sceneBounds; + _sceneNumber = g_globals->_sceneManager._scene->_screenNumber; + _sceneBounds = g_globals->_sceneManager._scene->_sceneBounds; _script.clear(); assert(owner); @@ -568,8 +603,8 @@ void StripManager::reset() { void StripManager::load() { // Get the script - byte *script = _resourceManager->getResource(RES_STRIP, _stripNum, 2); - uint scriptSize = _vm->_memoryManager.getSize(script); + byte *script = g_resourceManager->getResource(RES_STRIP, _stripNum, 2); + uint scriptSize = g_vm->_memoryManager.getSize(script); _script.resize(scriptSize); Common::copy(script, script + scriptSize, &_script[0]); @@ -577,8 +612,8 @@ void StripManager::load() { DEALLOCATE(script); // Get the object list - byte *obj44List = _resourceManager->getResource(RES_STRIP, _stripNum, 1); - int dataSize = _vm->_memoryManager.getSize(obj44List); + byte *obj44List = g_resourceManager->getResource(RES_STRIP, _stripNum, 1); + int dataSize = g_vm->_memoryManager.getSize(obj44List); assert((dataSize % 0x44) == 0); byte *dataP = obj44List; @@ -642,11 +677,14 @@ void StripManager::remove() { if (_activeSpeaker) _activeSpeaker->remove(); - if (_sceneNumber != _globals->_sceneManager._scene->_screenNumber) { - _globals->_sceneManager._scene->_sceneBounds = _sceneBounds; - _globals->_sceneManager._scene->loadScene(_sceneNumber); + if (_sceneNumber != g_globals->_sceneManager._scene->_screenNumber) { + g_globals->_sceneManager._scene->_sceneBounds = _sceneBounds; + g_globals->_sceneManager._scene->loadScene(_sceneNumber); } + if (_onEnd) + _onEnd(); + Action::remove(); } @@ -706,9 +744,9 @@ void StripManager::signal() { _activeSpeaker->remove(); _activeSpeaker = speakerP; - if ((_activeSpeaker->_newSceneNumber == -1) && (_globals->_sceneManager._scene->_screenNumber != _sceneNumber)) { - _globals->_sceneManager._scene->_sceneBounds = _sceneBounds; - _globals->_sceneManager._scene->loadScene(_sceneNumber); + if ((_activeSpeaker->_newSceneNumber == -1) && (g_globals->_sceneManager._scene->_screenNumber != _sceneNumber)) { + g_globals->_sceneManager._scene->_sceneBounds = _sceneBounds; + g_globals->_sceneManager._scene->loadScene(_sceneNumber); } _activeSpeaker->proc12(this); @@ -801,7 +839,7 @@ Speaker::Speaker() : EventHandler() { _textPos = Common::Point(10, 20); _fontNumber = 2; _textMode = ALIGN_LEFT; - _color1 = _color2 = _color3 = _globals->_scenePalette._colors.foreground; + _color1 = _color2 = _color3 = g_globals->_scenePalette._colors.foreground; _action = NULL; _speakerName = "SPEAKER"; } @@ -834,9 +872,9 @@ void Speaker::remove() { void Speaker::proc12(Action *action) { _action = action; if (_newSceneNumber != -1) { - _oldSceneNumber = _globals->_sceneManager._sceneNumber; - _sceneBounds = _globals->_sceneManager._scene->_sceneBounds; - _globals->_sceneManager._scene->loadScene(_newSceneNumber); + _oldSceneNumber = g_globals->_sceneManager._sceneNumber; + _sceneBounds = g_globals->_sceneManager._scene->_sceneBounds; + g_globals->_sceneManager._scene->loadScene(_newSceneNumber); } if (_hideObjects) @@ -844,14 +882,14 @@ void Speaker::proc12(Action *action) { _objectList.activate(); // Draw the speaker objects without any fading - FadeMode fadeMode = _globals->_sceneManager._fadeMode; - _globals->_sceneManager._fadeMode = FADEMODE_IMMEDIATE; - _globals->_sceneObjects->draw(); - _globals->_sceneManager._fadeMode = fadeMode; + FadeMode fadeMode = g_globals->_sceneManager._fadeMode; + g_globals->_sceneManager._fadeMode = FADEMODE_IMMEDIATE; + g_globals->_sceneObjects->draw(); + g_globals->_sceneManager._fadeMode = fadeMode; } void Speaker::setText(const Common::String &msg) { - _globals->_sceneObjects->draw(); + g_globals->_sceneObjects->draw(); _sceneText._color1 = _color1; _sceneText._color2 = _color2; @@ -904,16 +942,16 @@ void ScreenSpeaker::setText(const Common::String &msg) { gfxMan._font.setFontNumber(_fontNumber); Rect textRect; - _globals->gfxManager().getStringBounds(msg.c_str(), textRect, _textWidth); + g_globals->gfxManager().getStringBounds(msg.c_str(), textRect, _textWidth); if (_npc) { textRect.center(_npc->_position.x, _npc->_bounds.top - (textRect.height() / 2 + 10)); } else { - textRect.center(_globals->_sceneManager._scene->_sceneBounds.left + - (_globals->_sceneManager._scene->_sceneBounds.width() / 2), - _globals->_sceneManager._scene->_sceneBounds.top); + textRect.center(g_globals->_sceneManager._scene->_sceneBounds.left + + (g_globals->_sceneManager._scene->_sceneBounds.width() / 2), + g_globals->_sceneManager._scene->_sceneBounds.top); } - Rect rect2 = _globals->_sceneManager._scene->_sceneBounds; + Rect rect2 = g_globals->_sceneManager._scene->_sceneBounds; rect2.collapse(10, 6); textRect.contain(rect2); @@ -929,14 +967,14 @@ void ScreenSpeaker::setText(const Common::String &msg) { void SpeakerAction::signal() { switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(60) + 60); + setDelay(g_globals->_randomSource.getRandomNumber(60) + 60); break; case 1: static_cast<SceneObject *>(_owner)->setFrame(1); static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_5, this, NULL); break; case 2: - setDelay(_globals->_randomSource.getRandomNumber(10)); + setDelay(g_globals->_randomSource.getRandomNumber(10)); _actionIndex = 0; break; default: @@ -954,4 +992,4 @@ void AnimatedSpeaker::removeText() { _objectList.draw(); } -} // end of namespace tSage +} // end of namespace TsAGE diff --git a/engines/tsage/converse.h b/engines/tsage/converse.h index 13c490e995..f82c07a7dd 100644 --- a/engines/tsage/converse.h +++ b/engines/tsage/converse.h @@ -27,31 +27,36 @@ #include "tsage/dialogs.h" #include "tsage/sound.h" -namespace tSage { +namespace TsAGE { class StripCallback : public Action { public: virtual void stripCallback(int v) = 0; }; +typedef void (*SequenceCallback)(int v1, int v2); + class SequenceManager : public Action { private: void setup(); uint16 getNextValue(); void setMessage(int resNum, int lineNum, int color, const Common::Point &pt, int width); + void setMessage(int resNum, int lineNum, int fontNum, int color1, int color2, int color3, + const Common::Point &pt, int width); SequenceManager *globalManager(); public: SceneText _sceneText; int _resNum; uint _sequenceOffset; bool _keepActive; - int _field24; + int _fontNum; int _field26; Common::Array<byte> _sequenceData; int _objectIndex; SceneObject *_sceneObject; SceneObject *_objectList[6]; ASound _soundHandler; + SequenceCallback _onCallback; public: SequenceManager(); @@ -185,6 +190,8 @@ public: virtual void synchronize(Serializer &s); }; +typedef void (*StripProc)(); + class StripManager : public Action { private: void reset(); @@ -206,6 +213,8 @@ public: int _field2E8; Common::Array<Obj44> _obj44List; Common::Array<byte> _script; + StripProc _onBegin; + StripProc _onEnd; public: StripManager(); virtual ~StripManager(); @@ -222,6 +231,6 @@ public: void addSpeaker(Speaker *speaker); }; -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 76714a6f10..a56b30ad4d 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -22,6 +22,7 @@ #include "common/system.h" #include "common/config-manager.h" +#include "common/util.h" #include "engines/engine.h" #include "graphics/palette.h" #include "tsage/tsage.h" @@ -32,8 +33,9 @@ #include "tsage/staticres.h" #include "tsage/globals.h" #include "tsage/sound.h" +#include "tsage/blue_force/blueforce_logic.h" -namespace tSage { +namespace TsAGE { // The engine uses ScumMVM screen buffering, so all logic is hardcoded to use pane buffer 0 #define CURRENT_PANENUM 0 @@ -48,21 +50,47 @@ InvObject::InvObject(int sceneNumber, int rlbNum, int cursorNum, CursorType curs // Decode the image for the inventory item to get it's display bounds uint size; - byte *imgData = _resourceManager->getSubResource(_displayResNum, _rlbNum, _cursorNum, &size); + byte *imgData = g_resourceManager->getSubResource(_displayResNum, _rlbNum, _cursorNum, &size); GfxSurface s = surfaceFromRes(imgData); _bounds = s.getBounds(); DEALLOCATE(imgData); } +InvObject::InvObject(int visage, int strip, int frame) { + assert(g_vm->getGameID() == GType_BlueForce); + _visage = visage; + _strip = strip; + _frame = frame; + _sceneNumber = 0; + _iconResNum = 10; +} + +InvObject::InvObject(int strip, int frame) { + assert(g_vm->getGameID() == GType_Ringworld2); + _strip = strip; + _frame = frame; + + _visage = 0; + _sceneNumber = 0; + _iconResNum = 10; +} + void InvObject::setCursor() { - _globals->_events._currentCursor = _cursorId; + if (g_vm->getGameID() == GType_BlueForce) { + // Blue Force cursor handling + _cursorId = (CursorType)BF_GLOBALS._inventory->indexOf(this); + g_globals->_events.setCursor(_cursorId); + } else { + // Ringworld cursor handling + g_globals->_events._currentCursor = _cursorId; - if (_iconResNum != -1) { - GfxSurface s = surfaceFromRes(_iconResNum, _rlbNum, _cursorNum); + if (_iconResNum != -1) { + GfxSurface s = surfaceFromRes(_iconResNum, _rlbNum, _cursorNum); - Graphics::Surface src = s.lockSurface(); - _globals->_events.setCursor(src, s._transColor, s._centroid, _cursorId); + Graphics::Surface src = s.lockSurface(); + g_globals->_events.setCursor(src, s._transColor, s._centroid, _cursorId); + } } } @@ -77,6 +105,31 @@ void InvObjectList::synchronize(Serializer &s) { SYNC_POINTER(_selectedItem); } +int InvObjectList::indexOf(InvObject *obj) const { + int idx = 0; + SynchronizedList<InvObject *>::const_iterator i; + + for (i = _itemList.begin(); i != _itemList.end(); ++i, ++idx) { + if ((*i) == obj) + return idx; + } + + return -1; +} + +InvObject *InvObjectList::getItem(int objectNum) { + SynchronizedList<InvObject *>::const_iterator i = _itemList.begin(); + while (objectNum-- > 0) + ++i; + + return *i; +} + +int InvObjectList::getObjectScene(int objectNum) { + InvObject *obj = getItem(objectNum); + return obj->_sceneNumber; +} + /*--------------------------------------------------------------------------*/ void EventHandler::dispatch() { @@ -128,7 +181,7 @@ void Action::remove() { _owner->_action = NULL; _owner = NULL; } else { - _globals->_sceneManager.removeAction(this); + g_globals->_sceneManager.removeAction(this); } _attached = false; @@ -146,7 +199,7 @@ void Action::dispatch() { _action->dispatch(); if (_delayFrames) { - uint32 frameNumber = _globals->_events.getFrameNumber(); + uint32 frameNumber = g_globals->_events.getFrameNumber(); if (frameNumber >= _startFrame) { _delayFrames -= frameNumber - _startFrame; @@ -162,7 +215,7 @@ void Action::dispatch() { void Action::attached(EventHandler *newOwner, EventHandler *endHandler, va_list va) { _actionIndex = 0; _delayFrames = 0; - _startFrame = _globals->_events.getFrameNumber(); + _startFrame = g_globals->_events.getFrameNumber(); _owner = newOwner; _endHandler = endHandler; _attached = true; @@ -171,7 +224,7 @@ void Action::attached(EventHandler *newOwner, EventHandler *endHandler, va_list void Action::setDelay(int numFrames) { _delayFrames = numFrames; - _startFrame = _globals->_events.getFrameNumber(); + _startFrame = g_globals->_events.getFrameNumber(); } /*--------------------------------------------------------------------------*/ @@ -279,8 +332,12 @@ void ObjectMover::dispatch() { void ObjectMover::setup(const Common::Point &destPos) { _sceneObject->calcAngle(destPos); - if ((_sceneObject->_objectWrapper) && !(_sceneObject->_flags & OBJFLAG_SUPPRESS_DISPATCH)) - _sceneObject->_objectWrapper->dispatch(); + if ((_sceneObject->_objectWrapper) && !(_sceneObject->_flags & OBJFLAG_SUPPRESS_DISPATCH)) { + if (g_vm->getGameID() == GType_Ringworld) + _sceneObject->_objectWrapper->dispatch(); + else + _sceneObject->updateAngle(destPos); + } // Get the difference int diffX = destPos.x - _sceneObject->_position.x; @@ -439,8 +496,8 @@ void PlayerMover::endMove() { } // Set up the new interim destination along the route - _globals->_walkRegions._routeEnds.moveSrc = _globals->_walkRegions._routeEnds.moveDest; - _globals->_walkRegions._routeEnds.moveDest = _routeList[_routeIndex]; + g_globals->_walkRegions._routeEnds.moveSrc = g_globals->_walkRegions._routeEnds.moveDest; + g_globals->_walkRegions._routeEnds.moveDest = _routeList[_routeIndex]; setup(_routeList[_routeIndex]); dispatch(); } @@ -448,18 +505,18 @@ void PlayerMover::endMove() { void PlayerMover::setDest(const Common::Point &destPos) { _routeList[0] = _sceneObject->_position; - if (_globals->_walkRegions._resNum == -1) { + if (g_globals->_walkRegions._resNum == -1) { // Scene has no walk regions defined, so player can walk anywhere directly _routeList[0] = destPos; _routeList[1] = Common::Point(ROUTE_END_VAL, ROUTE_END_VAL); } else { // Figure out a path to the destination (or as close as possible to it) - pathfind(_routeList, _sceneObject->_position, destPos, _globals->_walkRegions._routeEnds); + pathfind(_routeList, _sceneObject->_position, destPos, g_globals->_walkRegions._routeEnds); } _routeIndex = 0; - _globals->_walkRegions._routeEnds.moveSrc = _sceneObject->_position; - _globals->_walkRegions._routeEnds.moveDest = _routeList[0]; + g_globals->_walkRegions._routeEnds.moveSrc = _sceneObject->_position; + g_globals->_walkRegions._routeEnds.moveDest = _routeList[0]; setup(_routeList[0]); } @@ -472,7 +529,7 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo Common::Point objPos; // Get the region the source is in - int srcRegion = _globals->_walkRegions.indexOf(srcPos); + int srcRegion = g_globals->_walkRegions.indexOf(srcPos); if (srcRegion == -1) { srcRegion = findClosestRegion(srcPos, regionIndexes); } @@ -481,7 +538,7 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo routeRegions[0] = 0; while (!routeRegions[0]) { // Check the destination region - int destRegion = _globals->_walkRegions.indexOf(destPos, ®ionIndexes); + int destRegion = g_globals->_walkRegions.indexOf(destPos, ®ionIndexes); if ((srcRegion == -1) && (destRegion == -1)) { // Both source and destination are outside walkable areas @@ -492,14 +549,14 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo Common::Point newPos; findLinePoint(&tempRouteEnds, &objPos, 1, &newPos); - int srcId = _globals->_walkRegions.indexOf(newPos); + int srcId = g_globals->_walkRegions.indexOf(newPos); if (srcId == -1) { tempRouteEnds.moveDest = tempRouteEnds.moveSrc; tempRouteEnds.moveSrc = routeEnds.moveDest; findLinePoint(&tempRouteEnds, &objPos, 1, &newPos); - srcRegion = _globals->_walkRegions.indexOf(newPos); + srcRegion = g_globals->_walkRegions.indexOf(newPos); if (srcRegion == -1) srcRegion = checkMover(srcPos, destPos); @@ -532,8 +589,8 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo } // field 0 holds the start, and field 1 holds the destination - WRField18 &currSrcField = _globals->_walkRegions._field18[0]; - WRField18 &currDestField = _globals->_walkRegions._field18[1]; + WRField18 &currSrcField = g_globals->_walkRegions._field18[0]; + WRField18 &currDestField = g_globals->_walkRegions._field18[1]; currSrcField._pt1 = srcPos; currSrcField._pt2 = srcPos; @@ -551,11 +608,11 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo int breakEntry2 = routeRegions[idx + 1]; int listIndex = 0; - while (_globals->_walkRegions._idxList[_globals->_walkRegions[breakEntry]._idxListIndex + listIndex] != + while (g_globals->_walkRegions._idxList[g_globals->_walkRegions[breakEntry]._idxListIndex + listIndex] != breakEntry2) ++listIndex; - tempList[idx] = _globals->_walkRegions._idxList2[_globals->_walkRegions[breakEntry]._idxList2Index + tempList[idx] = g_globals->_walkRegions._idxList2[g_globals->_walkRegions[breakEntry]._idxList2Index + listIndex]; ++endIndex; @@ -566,8 +623,8 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo int thisIdx = tempList[listIndex]; int nextIdx = tempList[listIndex + 1]; - WRField18 &thisField = _globals->_walkRegions._field18[thisIdx]; - WRField18 &nextField = _globals->_walkRegions._field18[nextIdx]; + WRField18 &thisField = g_globals->_walkRegions._field18[thisIdx]; + WRField18 &nextField = g_globals->_walkRegions._field18[nextIdx]; if (sub_F8E5_calculatePoint(currSrcField._pt1, nextField._pt1, thisField._pt1, thisField._pt2) && @@ -616,8 +673,8 @@ void PlayerMover::pathfind(Common::Point *routeList, Common::Point srcPos, Commo } int PlayerMover::regionIndexOf(const Common::Point &pt) { - for (uint idx = 0; idx < _globals->_walkRegions._regionList.size(); ++idx) { - if (_globals->_walkRegions._regionList[idx].contains(pt)) + for (uint idx = 0; idx < g_globals->_walkRegions._regionList.size(); ++idx) { + if (g_globals->_walkRegions._regionList[idx].contains(pt)) return idx + 1; } @@ -737,14 +794,14 @@ int PlayerMover::checkMover(Common::Point &srcPos, const Common::Point &destPos) _sceneObject->_mover->dispatch(); // Scan walk regions for point - for (uint idx = 0; idx < _globals->_walkRegions._regionList.size(); ++idx) { - if (_globals->_walkRegions[idx].contains(_sceneObject->_position)) { + for (uint idx = 0; idx < g_globals->_walkRegions._regionList.size(); ++idx) { + if (g_globals->_walkRegions[idx].contains(_sceneObject->_position)) { regionIndex = idx + 1; srcPos = _sceneObject->_position; break; } } - } while ((regionIndex == 0) && (_sceneObject->_mover) && !_vm->shouldQuit()); + } while ((regionIndex == 0) && (_sceneObject->_mover) && !g_vm->shouldQuit()); _sceneObject->_position = objPos; _sceneObject->_regionBitList = regionBitList; @@ -799,14 +856,14 @@ int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destReg return 32000; } - WalkRegion &srcWalkRegion = _globals->_walkRegions[srcRegion]; + WalkRegion &srcWalkRegion = g_globals->_walkRegions[srcRegion]; int distance; if (!routeList[0]) { // The route is empty (new route). distance = 0; } else { // Find the distance from the last region in the route. - WalkRegion ®ion = _globals->_walkRegions[routeList[*routeList]]; + WalkRegion ®ion = g_globals->_walkRegions[routeList[*routeList]]; distance = findDistance(srcWalkRegion._pt, region._pt); } @@ -827,7 +884,7 @@ int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destReg int foundIndex = 0; int idx = 0; int currDest; - while ((currDest = _globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + idx]) != 0) { + while ((currDest = g_globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + idx]) != 0) { if (currDest == destRegion) { foundIndex = idx; break; @@ -838,7 +895,7 @@ int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destReg // Check every connected region until we find a route to the destination (or we have no more to check). int bestDistance = 31990; - while (((currDest = _globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + foundIndex]) != 0) && (!foundRoute)) { + while (((currDest = g_globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + foundIndex]) != 0) && (!foundRoute)) { int newDistance = calculateRestOfRoute(tempList, currDest, destRegion, foundRoute); if ((newDistance <= bestDistance) || foundRoute) { @@ -999,7 +1056,7 @@ void PaletteModifierCached::synchronize(Serializer &s) { PaletteRotation::PaletteRotation() : PaletteModifierCached() { _percent = 0; _delayCtr = 0; - _frameNumber = _globals->_events.getFrameNumber(); + _frameNumber = g_globals->_events.getFrameNumber(); } void PaletteRotation::synchronize(Serializer &s) { @@ -1017,7 +1074,7 @@ void PaletteRotation::synchronize(Serializer &s) { void PaletteRotation::signal() { if (_delayCtr) { - uint32 frameNumber = _globals->_events.getFrameNumber(); + uint32 frameNumber = g_globals->_events.getFrameNumber(); if (frameNumber >= _frameNumber) { _delayCtr = frameNumber - _frameNumber; @@ -1161,6 +1218,20 @@ void PaletteFader::remove() { action->signal(); } +void PaletteFader::setPalette(ScenePalette *palette, int step) { + if (step < 0) { + // Reverse step means moving from dest palette to source, so swap the two palettes + byte tempPal[256 * 3]; + Common::copy(&palette->_palette[0], &palette->_palette[256 * 3], &tempPal[0]); + Common::copy(&this->_palette[0], &this->_palette[256 * 3], &palette->_palette[0]); + Common::copy(&tempPal[0], &tempPal[256 * 3], &this->_palette[0]); + + step = -step; + } + + PaletteModifierCached::setPalette(palette, step); +} + /*--------------------------------------------------------------------------*/ ScenePalette::ScenePalette() { @@ -1184,7 +1255,7 @@ ScenePalette::ScenePalette(int paletteNum) { } bool ScenePalette::loadPalette(int paletteNum) { - byte *palData = _resourceManager->getResource(RES_PALETTE, paletteNum, 0, true); + byte *palData = g_resourceManager->getResource(RES_PALETTE, paletteNum, 0, true); if (!palData) return false; @@ -1224,6 +1295,15 @@ void ScenePalette::setPalette(int index, int count) { } /** + * Set a palette entry + */ +void ScenePalette::setEntry(int index, uint r, uint g, uint b) { + _palette[index * 3] = r; + _palette[index * 3 + 1] = g; + _palette[index * 3 + 2] = b; +} + +/** * Returns the palette index with the closest matching color to that specified * @param r R component * @param g G component @@ -1314,7 +1394,7 @@ PaletteRotation *ScenePalette::addRotation(int start, int end, int rotationMode, return obj; } -PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int percent, Action *action) { +PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int step, Action *action) { PaletteFader *fader = new PaletteFader(); fader->_action = action; for (int i = 0; i < 256 * 3; i += 3) { @@ -1326,8 +1406,8 @@ PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int arrBufferRGB += 3; } - fader->setPalette(this, percent); - _globals->_scenePalette._listeners.push_back(fader); + fader->setPalette(this, step); + g_globals->_scenePalette._listeners.push_back(fader); return fader; } @@ -1335,7 +1415,7 @@ PaletteFader *ScenePalette::addFader(const byte *arrBufferRGB, int palSize, int void ScenePalette::changeBackground(const Rect &bounds, FadeMode fadeMode) { ScenePalette tempPalette; - if (_globals->_sceneManager._hasPalette) { + if (g_globals->_sceneManager._hasPalette) { if ((fadeMode == FADEMODE_GRADUAL) || (fadeMode == FADEMODE_IMMEDIATE)) { // Fade out any active palette tempPalette.getPalette(); @@ -1348,13 +1428,17 @@ void ScenePalette::changeBackground(const Rect &bounds, FadeMode fadeMode) { g_system->delayMillis(10); } } else { - _globals->_scenePalette.refresh(); - _globals->_sceneManager._hasPalette = false; + g_globals->_scenePalette.refresh(); + g_globals->_sceneManager._hasPalette = false; } } - _globals->_screenSurface.copyFrom(_globals->_sceneManager._scene->_backSurface, - bounds, Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), NULL); + Rect tempRect = bounds; + if (g_vm->getGameID() != GType_Ringworld) + tempRect.setHeight(BF_GLOBALS._interfaceY); + + g_globals->_screenSurface.copyFrom(g_globals->_sceneManager._scene->_backSurface, + tempRect, Rect(0, 0, tempRect.width(), tempRect.height()), NULL); for (SynchronizedList<PaletteModifier *>::iterator i = tempPalette._listeners.begin(); i != tempPalette._listeners.end(); ++i) delete *i; @@ -1395,7 +1479,20 @@ void SceneItem::synchronize(Serializer &s) { } void SceneItem::remove() { - _globals->_sceneItems.remove(this); + g_globals->_sceneItems.remove(this); +} + +bool SceneItem::startAction(CursorType action, Event &event) { + if (g_vm->getGameID() == GType_Ringworld) { + doAction(action); + return true; + } else if ((action == CURSOR_LOOK) || (action == CURSOR_USE) || (action == CURSOR_TALK) || + (action < CURSOR_LOOK)) { + doAction(action); + return true; + } else { + return false; + } } void SceneItem::doAction(int action) { @@ -1423,21 +1520,25 @@ void SceneItem::doAction(int action) { } bool SceneItem::contains(const Common::Point &pt) { - const Rect &sceneBounds = _globals->_sceneManager._scene->_sceneBounds; + const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds; if (_sceneRegionId == 0) return _bounds.contains(pt.x + sceneBounds.left, pt.y + sceneBounds.top); else - return _globals->_sceneRegions.indexOf(Common::Point(pt.x + sceneBounds.left, + return g_globals->_sceneRegions.indexOf(Common::Point(pt.x + sceneBounds.left, pt.y + sceneBounds.top)) == _sceneRegionId; } void SceneItem::display(int resNum, int lineNum, ...) { - Common::String msg = !resNum ? Common::String() : _resourceManager->getMessage(resNum, lineNum); + Common::String msg = (!resNum || (resNum == -1)) ? Common::String() : + g_resourceManager->getMessage(resNum, lineNum); - if (_globals->_sceneObjects->contains(&_globals->_sceneText)) { - _globals->_sceneText.remove(); - _globals->_sceneObjects->draw(); + if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.hide(); + + if (g_globals->_sceneObjects->contains(&g_globals->_sceneText)) { + g_globals->_sceneText.remove(); + g_globals->_sceneObjects->draw(); } GfxFontBackup font; @@ -1445,12 +1546,15 @@ void SceneItem::display(int resNum, int lineNum, ...) { Rect textRect; int maxWidth = 120; bool keepOnscreen = false; - bool centerText = true; + bool centerText = g_vm->getGameID() == GType_Ringworld; - if (resNum) { + if (resNum != 0) { va_list va; va_start(va, lineNum); + if (resNum == -1) + msg = Common::String(va_arg(va, const char *)); + int mode; do { // Get next instruction @@ -1460,7 +1564,7 @@ void SceneItem::display(int resNum, int lineNum, ...) { case SET_WIDTH: // Set width maxWidth = va_arg(va, int); - _globals->_sceneText._width = maxWidth; + g_globals->_sceneText._width = maxWidth; break; case SET_X: // Set the X Position @@ -1472,21 +1576,21 @@ void SceneItem::display(int resNum, int lineNum, ...) { break; case SET_FONT: // Set the font number - _globals->_sceneText._fontNumber = va_arg(va, int); - _globals->gfxManager()._font.setFontNumber(_globals->_sceneText._fontNumber); + g_globals->_sceneText._fontNumber = va_arg(va, int); + g_globals->gfxManager()._font.setFontNumber(g_globals->_sceneText._fontNumber); break; case SET_BG_COLOR: { // Set the background color int bgColor = va_arg(va, int); - _globals->gfxManager()._font._colors.background = bgColor; + g_globals->gfxManager()._font._colors.background = bgColor; if (!bgColor) - _globals->gfxManager().setFillFlag(false); + g_globals->gfxManager().setFillFlag(false); break; } case SET_FG_COLOR: // Set the foreground color - _globals->_sceneText._color1 = va_arg(va, int); - _globals->gfxManager()._font._colors.foreground = _globals->_sceneText._color1; + g_globals->_sceneText._color1 = va_arg(va, int); + g_globals->gfxManager()._font._colors.foreground = g_globals->_sceneText._color1; break; case SET_KEEP_ONSCREEN: // Suppresses immediate display @@ -1495,15 +1599,15 @@ void SceneItem::display(int resNum, int lineNum, ...) { case SET_EXT_BGCOLOR: { // Set secondary bg color int v = va_arg(va, int); - _globals->_sceneText._color2 = v; - _globals->gfxManager()._font._colors2.background = v; + g_globals->_sceneText._color2 = v; + g_globals->gfxManager()._font._colors2.background = v; break; } case SET_EXT_FGCOLOR: { // Set secondary fg color int v = va_arg(va, int); - _globals->_sceneText._color3 = v; - _globals->gfxManager()._font._colors.foreground = v; + g_globals->_sceneText._color3 = v; + g_globals->gfxManager()._font._colors.foreground = v; break; } case SET_POS_MODE: @@ -1512,7 +1616,7 @@ void SceneItem::display(int resNum, int lineNum, ...) { break; case SET_TEXT_MODE: // Set the text mode - _globals->_sceneText._textMode = (TextAlign)va_arg(va, int); + g_globals->_sceneText._textMode = (TextAlign)va_arg(va, int); break; default: break; @@ -1524,27 +1628,27 @@ void SceneItem::display(int resNum, int lineNum, ...) { if (resNum) { // Get required bounding size - _globals->gfxManager().getStringBounds(msg.c_str(), textRect, maxWidth); + g_globals->gfxManager().getStringBounds(msg.c_str(), textRect, maxWidth); textRect.center(pos.x, pos.y); - textRect.contain(_globals->gfxManager()._bounds); + textRect.contain(g_globals->gfxManager()._bounds); if (centerText) { - _globals->_sceneText._color1 = _globals->_sceneText._color2; - _globals->_sceneText._color2 = 0; - _globals->_sceneText._color3 = 0; + g_globals->_sceneText._color1 = g_globals->_sceneText._color2; + g_globals->_sceneText._color2 = 0; + g_globals->_sceneText._color3 = 0; } - _globals->_sceneText.setup(msg); + g_globals->_sceneText.setup(msg); if (centerText) { - _globals->_sceneText.setPosition(Common::Point( - _globals->_sceneManager._scene->_sceneBounds.left + textRect.left, - _globals->_sceneManager._scene->_sceneBounds.top + textRect.top), 0); + g_globals->_sceneText.setPosition(Common::Point( + g_globals->_sceneManager._scene->_sceneBounds.left + textRect.left, + g_globals->_sceneManager._scene->_sceneBounds.top + textRect.top), 0); } else { - _globals->_sceneText.setPosition(pos, 0); + g_globals->_sceneText.setPosition(pos, 0); } - _globals->_sceneText.fixPriority(255); - _globals->_sceneObjects->draw(); + g_globals->_sceneText.fixPriority(255); + g_globals->_sceneObjects->draw(); } // Unless the flag is set to keep the message on-screen, show it until a mouse or keypress, then remove it @@ -1552,77 +1656,98 @@ void SceneItem::display(int resNum, int lineNum, ...) { Event event; // Keep event on-screen until a mouse or keypress - while (!_vm->getEventManager()->shouldQuit() && !_globals->_events.getEvent(event, + while (!g_vm->shouldQuit() && !g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS)) { g_system->updateScreen(); g_system->delayMillis(10); } - _globals->_sceneText.remove(); + g_globals->_sceneText.remove(); } -} -/*--------------------------------------------------------------------------*/ + if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active) { + // Show user interface + T2_GLOBALS._uiElements.show(); -void SceneHotspot::doAction(int action) { - switch ((int)action) { - case CURSOR_LOOK: - display(1, 0, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - break; - case CURSOR_USE: - display(1, 5, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - break; - case CURSOR_TALK: - display(1, 15, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + // Re-show the cursor + BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor()); + } +} + +void SceneItem::display2(int resNum, int lineNum) { + switch (g_vm->getGameID()) { + case GType_BlueForce: + display(resNum, lineNum, SET_WIDTH, 312, + SET_X, 4 + GLOBALS._sceneManager._scene->_sceneBounds.left, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); break; - case CURSOR_WALK: + case GType_Ringworld2: + display(resNum, lineNum, SET_WIDTH, 280, SET_X, 20, SET_Y, 20, SET_EXT_BGCOLOR, 60, LIST_END); break; default: - display(2, action, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + display(resNum, lineNum, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); break; } } +void SceneItem::display(const Common::String &msg) { + assert(g_vm->getGameID() == GType_BlueForce); + + display(-1, -1, msg.c_str(), + SET_WIDTH, 312, + SET_X, 4 + GLOBALS._sceneManager._scene->_sceneBounds.left, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); +} + /*--------------------------------------------------------------------------*/ -void NamedHotspot::doAction(int action) { +bool SceneHotspot::startAction(CursorType action, Event &event) { switch (action) { - case CURSOR_WALK: - // Nothing - break; + case GType_BlueForce: { + BlueForce::SceneExt *scene = (BlueForce::SceneExt *)BF_GLOBALS._sceneManager._scene; + assert(scene); + return scene->display(action); + } + default: + return SceneItem::startAction(action, event); + } +} + +void SceneHotspot::doAction(int action) { + switch ((int)action) { case CURSOR_LOOK: - if (_lookLineNum == -1) - SceneHotspot::doAction(action); + if (g_vm->getGameID() == GType_BlueForce) + SceneItem::display(LOOK_SCENE_HOTSPOT); else - SceneItem::display(_resnum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + display(1, 0, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); break; case CURSOR_USE: - if (_useLineNum == -1) - SceneHotspot::doAction(action); + if (g_vm->getGameID() == GType_BlueForce) + SceneItem::display(USE_SCENE_HOTSPOT); + else + display(1, 5, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + break; + case CURSOR_TALK: + if (g_vm->getGameID() == GType_BlueForce) + SceneItem::display(TALK_SCENE_HOTSPOT); else - SceneItem::display(_resnum, _useLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + display(1, 15, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + break; + case CURSOR_WALK: break; default: - SceneHotspot::doAction(action); + if (g_vm->getGameID() == GType_BlueForce) + SceneItem::display(DEFAULT_SCENE_HOTSPOT); + else + display(2, action, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); break; } } -void NamedHotspot::setup(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) { - setBounds(ys, xe, ye, xs); - _resnum = resnum; - _lookLineNum = lookLineNum; - _useLineNum = useLineNum; - _globals->_sceneItems.addItems(this, NULL); -} - -void NamedHotspot::synchronize(Serializer &s) { - SceneHotspot::synchronize(s); - s.syncAsSint16LE(_resnum); - s.syncAsSint16LE(_lookLineNum); - s.syncAsSint16LE(_useLineNum); -} - /*--------------------------------------------------------------------------*/ void SceneObjectWrapper::setSceneObject(SceneObject *so) { @@ -1641,12 +1766,17 @@ void SceneObjectWrapper::remove() { } void SceneObjectWrapper::dispatch() { + if (g_vm->getGameID() == GType_Ringworld) + check(); +} + +void SceneObjectWrapper::check() { _visageImages.setVisage(_sceneObject->_visage); - int frameCount = _visageImages.getFrameCount(); + int visageCount = _visageImages.getFrameCount(); int angle = _sceneObject->_angle; int strip = _sceneObject->_strip; - if (frameCount == 4) { + if (visageCount == 4) { if ((angle > 314) || (angle < 45)) strip = 4; if ((angle > 44) && (angle < 135)) @@ -1655,7 +1785,7 @@ void SceneObjectWrapper::dispatch() { strip = 3; if ((angle >= 225) && (angle < 315)) strip = 2; - } else if (frameCount == 8) { + } else if (visageCount == 8) { if ((angle > 330) || (angle < 30)) strip = 4; if ((angle >= 30) && (angle < 70)) @@ -1674,8 +1804,8 @@ void SceneObjectWrapper::dispatch() { strip = 8; } - if (strip > frameCount) - strip = frameCount; + if (strip > visageCount) + strip = visageCount; _sceneObject->setStrip(strip); } @@ -1699,9 +1829,12 @@ SceneObject::SceneObject() : SceneHotspot() { _sceneRegionId = 0; _percent = 100; _flags |= OBJFLAG_PANES; + _priority = 0; _frameChange = 0; _visage = 0; + _strip = 0; + _frame = 0; } SceneObject::SceneObject(const SceneObject &so) : SceneHotspot() { @@ -1745,7 +1878,7 @@ void SceneObject::animEnded() { int SceneObject::changeFrame() { int frameNum = _frame; - uint32 mouseCtr = _globals->_events.getFrameNumber(); + uint32 mouseCtr = g_globals->_events.getFrameNumber(); if ((_updateStartFrame <= mouseCtr) || (_animateMode == ANIM_MODE_1)) { if (_numFrames > 0) { @@ -1856,7 +1989,7 @@ void SceneObject::addMover(ObjectMover *mover, ...) { if (mover) { // Set up the assigned mover - _walkStartFrame = _globals->_events.getFrameNumber(); + _walkStartFrame = g_globals->_events.getFrameNumber(); if (_moveRate != 0) _walkStartFrame = 60 / _moveRate; @@ -1879,7 +2012,7 @@ void SceneObject::getHorizBounds() { } int SceneObject::getRegionIndex() { - return _globals->_sceneRegions.indexOf(_position); + return g_globals->_sceneRegions.indexOf(_position); } int SceneObject::checkRegion(const Common::Point &pt) { @@ -1890,7 +2023,7 @@ int SceneObject::checkRegion(const Common::Point &pt) { Common::Point savedPos = _position; _position = pt; - int regIndex = _globals->_sceneRegions.indexOf(pt); + int regIndex = g_globals->_sceneRegions.indexOf(pt); if (_regionBitList & (1 << regIndex)) regionIndex = regIndex; @@ -1912,13 +2045,13 @@ int SceneObject::checkRegion(const Common::Point &pt) { newY -= _yDiff; SynchronizedList<SceneObject *>::iterator i; - for (i = _globals->_sceneObjects->begin(); (regionIndex == 0) && (i != _globals->_sceneObjects->end()); ++i) { + for (i = g_globals->_sceneObjects->begin(); (regionIndex == 0) && (i != g_globals->_sceneObjects->end()); ++i) { if ((*i) && ((*i)->_flags & OBJFLAG_CHECK_REGION)) { int objYDiff = (*i)->_position.y - _yDiff; if ((objYDiff >= yPos) && (objYDiff <= newY) && ((*i)->_xs < tempRect.right) && ((*i)->_xe > tempRect.left)) { // Found index - regionIndex = -1; //****DEBUG*** = *i; + regionIndex = (*i)->_regionIndex; break; } } @@ -1929,7 +2062,7 @@ int SceneObject::checkRegion(const Common::Point &pt) { void SceneObject::animate(AnimateMode animMode, ...) { _animateMode = animMode; - _updateStartFrame = _globals->_events.getFrameNumber(); + _updateStartFrame = g_globals->_events.getFrameNumber(); if (_numFrames) _updateStartFrame += 60 / _numFrames; @@ -1988,6 +2121,7 @@ void SceneObject::animate(AnimateMode animMode, ...) { break; case ANIM_MODE_8: + case ANIM_MODE_9: _field68 = va_arg(va, int); _endAction = va_arg(va, Action *); _frameChange = 1; @@ -2004,9 +2138,19 @@ SceneObject *SceneObject::clone() const { } void SceneObject::checkAngle(const SceneObject *obj) { - _angle = GfxManager::getAngle(_position, obj->_position); + checkAngle(obj->_position); +} - if (_objectWrapper) +void SceneObject::checkAngle(const Common::Point &pt) { + int angleAmount = GfxManager::getAngle(_position, pt); + if (angleAmount != -1) { + _angle = angleAmount; + + if (_animateMode == ANIM_MODE_9) + _angle = (angleAmount + 180) % 360; + } + + if (_objectWrapper && (g_vm->getGameID() == GType_Ringworld)) _objectWrapper->dispatch(); } @@ -2063,7 +2207,7 @@ void SceneObject::synchronize(Serializer &s) { void SceneObject::postInit(SceneObjectList *OwnerList) { if (!OwnerList) - OwnerList = _globals->_sceneObjects; + OwnerList = g_globals->_sceneObjects; if (!OwnerList->contains(this)) { _percent = 100; @@ -2091,7 +2235,7 @@ void SceneObject::postInit(SceneObjectList *OwnerList) { void SceneObject::remove() { SceneItem::remove(); - if (_globals->_sceneObjects->contains(this)) + if (g_globals->_sceneObjects->contains(this)) // For objects in the object list, flag the object for removal in the next drawing, so that // the drawing code has a chance to restore the area previously covered by the object _flags |= OBJFLAG_PANES | OBJFLAG_REMOVE | OBJFLAG_HIDE; @@ -2101,7 +2245,7 @@ void SceneObject::remove() { } void SceneObject::dispatch() { - uint32 currTime = _globals->_events.getFrameNumber(); + uint32 currTime = g_globals->_events.getFrameNumber(); if (_action) _action->dispatch(); @@ -2145,7 +2289,7 @@ void SceneObject::dispatch() { int frameNum = 0; do { int count = getFrameCount(); - frameNum = _globals->_randomSource.getRandomNumber(count - 1); + frameNum = g_globals->_randomSource.getRandomNumber(count - 1); } while (frameNum == _frame); setFrame(frameNum); @@ -2174,7 +2318,25 @@ void SceneObject::dispatch() { } else { setFrame(changeFrame()); } + break; + + case ANIM_MODE_9: + if (_frame == _endFrame) { + if (_frameChange != -1) { + _frameChange = -1; + _strip = ((_strip - 1) ^ 1) + 1; + _endFrame = 1; + } else if ((_field68 == 0) || (--_field68 != 0)) { + _frameChange = 1; + _endFrame = getFrameCount(); + setFrame(changeFrame()); + } else { + animEnded(); + } + } else { + setFrame(changeFrame()); + } break; default: @@ -2185,7 +2347,7 @@ void SceneObject::dispatch() { // Handle updating the zoom and/or priority if (!(_flags & OBJFLAG_ZOOMED)) { int yp = CLIP((int)_position.y, 0, 255); - setZoom(_globals->_sceneManager._scene->_zoomPercents[yp]); + setZoom(g_globals->_sceneManager._scene->_zoomPercents[yp]); } if (!(_flags & OBJFLAG_FIXED_PRIORITY)) { setPriority(_position.y); @@ -2199,12 +2361,8 @@ void SceneObject::calcAngle(const Common::Point &pt) { } void SceneObject::removeObject() { - _globals->_sceneItems.remove(this); - _globals->_sceneObjects->remove(this); - - if (_visage) { - _visage = 0; - } + g_globals->_sceneItems.remove(this); + g_globals->_sceneObjects->remove(this); if (_objectWrapper) { _objectWrapper->remove(); @@ -2236,11 +2394,11 @@ void SceneObject::reposition() { */ void SceneObject::draw() { Rect destRect = _bounds; - destRect.translate(-_globals->_sceneManager._scene->_sceneBounds.left, - -_globals->_sceneManager._scene->_sceneBounds.top); - Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(_priority); + destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left, + -g_globals->_sceneManager._scene->_sceneBounds.top); + Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(_priority); GfxSurface frame = getFrame(); - _globals->gfxManager().copyFrom(frame, destRect, priorityRegion); + g_globals->gfxManager().copyFrom(frame, destRect, priorityRegion); } /** @@ -2249,20 +2407,32 @@ void SceneObject::draw() { */ void SceneObject::updateScreen() { Rect srcRect = _paneRects[CURRENT_PANENUM]; - const Rect &sceneBounds = _globals->_sceneManager._scene->_sceneBounds; + const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds; srcRect.left = (srcRect.left / 4) * 4; srcRect.right = ((srcRect.right + 3) / 4) * 4; - srcRect.clip(_globals->_sceneManager._scene->_sceneBounds); + srcRect.clip(g_globals->_sceneManager._scene->_sceneBounds); if (srcRect.isValidRect()) { Rect destRect = srcRect; destRect.translate(-sceneBounds.left, -sceneBounds.top); - srcRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y); + srcRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y); - _globals->_screenSurface.copyFrom(_globals->_sceneManager._scene->_backSurface, srcRect, destRect); + g_globals->_screenSurface.copyFrom(g_globals->_sceneManager._scene->_backSurface, srcRect, destRect); } } +void SceneObject::updateAngle(const Common::Point &pt) { + checkAngle(pt); + if (_objectWrapper) + _objectWrapper->check(); +} + +void SceneObject::changeAngle(int angle) { + _angle = angle; + if (_objectWrapper) + _objectWrapper->check(); +} + void SceneObject::setup(int visage, int stripFrameNum, int frameNum, int posX, int posY, int priority) { postInit(); setVisage(visage); @@ -2272,6 +2442,33 @@ void SceneObject::setup(int visage, int stripFrameNum, int frameNum, int posX, i fixPriority(priority); } +void SceneObject::setup(int visage, int stripFrameNum, int frameNum) { + postInit(); + setVisage(visage); + setStrip(stripFrameNum); + setFrame(frameNum); +} + +/*--------------------------------------------------------------------------*/ + +void BackgroundSceneObject::postInit(SceneObjectList *OwnerList) { + SceneObjectList dummyList; + SceneObjectList *pList = !g_globals->_sceneManager._scene ? &dummyList : + &g_globals->_sceneManager._scene->_bgSceneObjects; + + SceneObject::postInit(pList); +} + +void BackgroundSceneObject::draw() { + assert(g_globals->_sceneManager._scene); + Rect destRect = _bounds; + destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left, + -g_globals->_sceneManager._scene->_sceneBounds.top); + Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(_priority); + GfxSurface frame = getFrame(); + g_globals->_sceneManager._scene->_backSurface.copyFrom(frame, destRect, priorityRegion); +} + /*--------------------------------------------------------------------------*/ void SceneObjectList::draw() { @@ -2282,27 +2479,27 @@ void SceneObjectList::draw() { if (_objList.size() == 0) { // Alternate draw mode - if (_globals->_paneRefreshFlag[paneNum] == 1) { + if (g_globals->_paneRefreshFlag[paneNum] == 1) { // Load the background - _globals->_sceneManager._scene->refreshBackground(0, 0); + g_globals->_sceneManager._scene->refreshBackground(0, 0); - Rect tempRect = _globals->_sceneManager._scene->_sceneBounds; - tempRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y); - ScenePalette::changeBackground(tempRect, _globals->_sceneManager._fadeMode); + Rect tempRect = g_globals->_sceneManager._scene->_sceneBounds; + tempRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y); + ScenePalette::changeBackground(tempRect, g_globals->_sceneManager._fadeMode); } else { - _globals->_paneRegions[CURRENT_PANENUM].draw(); + g_globals->_paneRegions[CURRENT_PANENUM].draw(); } - _globals->_paneRegions[CURRENT_PANENUM].setRect(0, 0, 0, 0); - _globals->_sceneManager.fadeInIfNecessary(); + g_globals->_paneRegions[CURRENT_PANENUM].setRect(0, 0, 0, 0); + g_globals->_sceneManager.fadeInIfNecessary(); } else { // If there is a scroll follower, check whether it has moved off-screen - if (_globals->_scrollFollower) { - const Rect &scrollerRect = _globals->_sceneManager._scrollerRect; + if (g_globals->_scrollFollower) { + const Rect &scrollerRect = g_globals->_sceneManager._scrollerRect; Common::Point objPos( - _globals->_scrollFollower->_position.x - _globals->_sceneManager._scene->_sceneBounds.left, - _globals->_scrollFollower->_position.y - _globals->_sceneManager._scene->_sceneBounds.top); + g_globals->_scrollFollower->_position.x - g_globals->_sceneManager._scene->_sceneBounds.left, + g_globals->_scrollFollower->_position.y - g_globals->_sceneManager._scene->_sceneBounds.top); int loadCount = 0; if (objPos.x >= scrollerRect.right) { @@ -2323,21 +2520,21 @@ void SceneObjectList::draw() { } if (loadCount > 0) - _globals->_sceneManager.setBgOffset(Common::Point(xAmount, yAmount), loadCount); + g_globals->_sceneManager.setBgOffset(Common::Point(xAmount, yAmount), loadCount); } - if (_globals->_sceneManager._sceneLoadCount > 0) { - --_globals->_sceneManager._sceneLoadCount; - _globals->_sceneManager._scene->loadBackground(_globals->_sceneManager._sceneBgOffset.x, - _globals->_sceneManager._sceneBgOffset.y); + if (g_globals->_sceneManager._sceneLoadCount > 0) { + --g_globals->_sceneManager._sceneLoadCount; + g_globals->_sceneManager._scene->loadBackground(g_globals->_sceneManager._sceneBgOffset.x, + g_globals->_sceneManager._sceneBgOffset.y); } // Set up the flag mask uint32 flagMask = (paneNum == 0) ? OBJFLAG_PANE_0 : OBJFLAG_PANE_1; // Initial loop to set up object list and update object position, priority, and flags - for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneObjects->begin(); - i != _globals->_sceneObjects->end(); ++i) { + for (SynchronizedList<SceneObject *>::iterator i = g_globals->_sceneObjects->begin(); + i != g_globals->_sceneObjects->end(); ++i) { SceneObject *obj = *i; objList.push_back(obj); @@ -2350,10 +2547,10 @@ void SceneObjectList::draw() { // Handle updating object priority if (!(obj->_flags & OBJFLAG_FIXED_PRIORITY)) { obj->_priority = MIN((int)obj->_position.y, - (int)_globals->_sceneManager._scene->_backgroundBounds.bottom - 1); + (int)g_globals->_sceneManager._scene->_backgroundBounds.bottom - 1); } - if ((_globals->_paneRefreshFlag[paneNum] != 0) || !_globals->_paneRegions[paneNum].empty()) { + if ((g_globals->_paneRefreshFlag[paneNum] != 0) || !g_globals->_paneRegions[paneNum].empty()) { obj->_flags |= flagMask; } } @@ -2362,20 +2559,20 @@ void SceneObjectList::draw() { checkIntersection(objList, objList.size(), CURRENT_PANENUM); sortList(objList); - if (_globals->_paneRefreshFlag[paneNum] == 1) { + if (g_globals->_paneRefreshFlag[paneNum] == 1) { // Load the background - _globals->_sceneManager._scene->refreshBackground(0, 0); + g_globals->_sceneManager._scene->refreshBackground(0, 0); } - _globals->_sceneManager._scene->_sceneBounds.left &= ~3; - _globals->_sceneManager._scene->_sceneBounds.right &= ~3; - _globals->_sceneOffset.x &= ~3; + g_globals->_sceneManager._scene->_sceneBounds.left &= ~3; + g_globals->_sceneManager._scene->_sceneBounds.right &= ~3; + g_globals->_sceneOffset.x &= ~3; - if (_globals->_paneRefreshFlag[paneNum] != 0) { + if (g_globals->_paneRefreshFlag[paneNum] != 0) { // Change the background - Rect tempRect = _globals->_sceneManager._scene->_sceneBounds; - tempRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y); - ScenePalette::changeBackground(tempRect, _globals->_sceneManager._fadeMode); + Rect tempRect = g_globals->_sceneManager._scene->_sceneBounds; + tempRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y); + ScenePalette::changeBackground(tempRect, g_globals->_sceneManager._fadeMode); } else { for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) { SceneObject *obj = objList[objIndex]; @@ -2384,10 +2581,10 @@ void SceneObjectList::draw() { obj->updateScreen(); } - _globals->_paneRegions[paneNum].draw(); + g_globals->_paneRegions[paneNum].draw(); } - _globals->_paneRegions[paneNum].setRect(0, 0, 0, 0); + g_globals->_paneRegions[paneNum].setRect(0, 0, 0, 0); redraw: // Main draw loop for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) { @@ -2400,9 +2597,9 @@ redraw: } // Update the palette - _globals->_sceneManager.fadeInIfNecessary(); - _globals->_sceneManager._loadMode = 0; - _globals->_paneRefreshFlag[paneNum] = 0; + g_globals->_sceneManager.fadeInIfNecessary(); + g_globals->_sceneManager._loadMode = 0; + g_globals->_paneRefreshFlag[paneNum] = 0; // Loop through the object list, removing any objects and refreshing the screen as necessary for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) { @@ -2485,9 +2682,9 @@ void SceneObjectList::sortList(Common::Array<SceneObject *> &ObjList) { } void SceneObjectList::activate() { - SceneObjectList *objectList = _globals->_sceneObjects; - _globals->_sceneObjects = this; - _globals->_sceneObjects_queue.push_front(this); + SceneObjectList *objectList = g_globals->_sceneObjects; + g_globals->_sceneObjects = this; + g_globals->_sceneObjects_queue.push_front(this); // Flag all the objects as modified SynchronizedList<SceneObject *>::iterator i; @@ -2504,19 +2701,19 @@ void SceneObjectList::activate() { } void SceneObjectList::deactivate() { - if (_globals->_sceneObjects_queue.size() <= 1) + if (g_globals->_sceneObjects_queue.size() <= 1) return; - SceneObjectList *objectList = *_globals->_sceneObjects_queue.begin(); - _globals->_sceneObjects_queue.pop_front(); - _globals->_sceneObjects = *_globals->_sceneObjects_queue.begin(); + SceneObjectList *objectList = *g_globals->_sceneObjects_queue.begin(); + g_globals->_sceneObjects_queue.pop_front(); + g_globals->_sceneObjects = *g_globals->_sceneObjects_queue.begin(); SynchronizedList<SceneObject *>::iterator i; for (i = objectList->begin(); i != objectList->end(); ++i) { if (!((*i)->_flags & OBJFLAG_CLONED)) { SceneObject *sceneObj = (*i)->clone(); sceneObj->_flags |= OBJFLAG_HIDE | OBJFLAG_REMOVE | OBJFLAG_CLONED; - _globals->_sceneObjects->push_front(sceneObj); + g_globals->_sceneObjects->push_front(sceneObj); } } } @@ -2545,6 +2742,14 @@ void SceneText::setup(const Common::String &msg) { gfxMan.activate(); Rect textRect; + if ((g_vm->getGameID() != GType_Ringworld) && g_globals->_sceneObjects->contains(this) && + (_flags & OBJFLAG_REMOVE)) { + // Trying to setup a SceneText scheduled to be removed, so remove it now + _bounds.expandPanes(); + this->removeObject(); + g_globals->_sceneObjects->remove(this); + } + gfxMan._font.setFontNumber(_fontNumber); gfxMan._font._colors.foreground = _color1; gfxMan._font._colors2.background = _color2; @@ -2582,12 +2787,21 @@ void SceneText::synchronize(Serializer &s) { _textSurface.synchronize(s); } +void SceneText::updateScreen() { + // FIXME: Hack for Blue Force to handle not refreshing the screen if the user interface + // has been re-activated after showing some scene text + if ((g_vm->getGameID() != GType_BlueForce) || (_bounds.top < UI_INTERFACE_Y) || + !T2_GLOBALS._uiElements._visible) + SceneObject::updateScreen(); +} + /*--------------------------------------------------------------------------*/ Visage::Visage() { - _resNum = 0; - _rlbNum = 0; + _resNum = -1; + _rlbNum = -1; _data = NULL; + _flipHoriz = false; } Visage::Visage(const Visage &v) { @@ -2595,7 +2809,7 @@ Visage::Visage(const Visage &v) { _rlbNum = v._rlbNum; _data = v._data; if (_data) - _vm->_memoryManager.incLocks(_data); + g_vm->_memoryManager.incLocks(_data); } Visage &Visage::operator=(const Visage &s) { @@ -2603,7 +2817,7 @@ Visage &Visage::operator=(const Visage &s) { _rlbNum = s._rlbNum; _data = s._data; if (_data) - _vm->_memoryManager.incLocks(_data); + g_vm->_memoryManager.incLocks(_data); return *this; } @@ -2613,7 +2827,37 @@ void Visage::setVisage(int resNum, int rlbNum) { _resNum = resNum; _rlbNum = rlbNum; DEALLOCATE(_data); - _data = _resourceManager->getResource(RES_VISAGE, resNum, rlbNum); + + if (g_vm->getGameID() == GType_Ringworld) { + // In Ringworld, we immediately get the data + _data = g_resourceManager->getResource(RES_VISAGE, resNum, rlbNum); + } else { + // Games after Ringworld have an extra indirection via the visage index file + byte *indexData = g_resourceManager->getResource(RES_VISAGE, resNum, 9999); + if (rlbNum == 9999) { + _data = indexData; + } else { + if (rlbNum == 0) + rlbNum = 1; + + // Check how many slots there are + uint16 count = READ_LE_UINT16(indexData); + if (rlbNum > count) + rlbNum = count; + + // Get the flags/rlbNum to use + uint32 v = READ_LE_UINT32(indexData + (rlbNum - 1) * 4 + 2); + int flags = v >> 30; + + if (flags & 3) { + rlbNum = (int)(v & 0xff); + } + _flipHoriz = flags & 1; + + _data = g_resourceManager->getResource(RES_VISAGE, resNum, rlbNum); + } + } + assert(_data); } } @@ -2632,17 +2876,33 @@ GfxSurface Visage::getFrame(int frameNum) { int offset = READ_LE_UINT32(_data + 2 + frameNum * 4); byte *frameData = _data + offset; - return surfaceFromRes(frameData); + GfxSurface result = surfaceFromRes(frameData); + if (_flipHoriz) flip(result); + return result; } int Visage::getFrameCount() const { return READ_LE_UINT16(_data); } +void Visage::flip(GfxSurface &gfxSurface) { + Graphics::Surface s = gfxSurface.lockSurface(); + + for (int y = 0; y < s.h; ++y) { + // Flip the line + byte *lineP = (byte *)s.getBasePtr(0, y); + for (int x = 0; x < (s.w / 2); ++x) + SWAP(lineP[x], lineP[s.w - x - 1]); + } + + gfxSurface.unlockSurface(); +} + /*--------------------------------------------------------------------------*/ Player::Player(): SceneObject() { _canWalk = false; + _enabled = false; _uiEnabled = false; _field8C = 0; } @@ -2661,35 +2921,63 @@ void Player::postInit(SceneObjectList *OwnerList) { void Player::disableControl() { _canWalk = false; _uiEnabled = false; - _globals->_events.setCursor(CURSOR_NONE); + g_globals->_events.setCursor(CURSOR_NONE); + _enabled = false; + + if ((g_vm->getGameID() == GType_BlueForce) && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.hide(); } void Player::enableControl() { + CursorType cursor; + _canWalk = true; _uiEnabled = true; - _globals->_events.setCursor(CURSOR_WALK); + _enabled = true; - switch (_globals->_events.getCursor()) { - case CURSOR_WALK: - case CURSOR_LOOK: - case CURSOR_USE: - case CURSOR_TALK: - _globals->_events.setCursor(_globals->_events.getCursor()); + switch (g_vm->getGameID()) { + case GType_BlueForce: + case GType_Ringworld2: + cursor = g_globals->_events.getCursor(); + g_globals->_events.setCursor(cursor); + + if (T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.show(); break; + default: - _globals->_events.setCursor(CURSOR_WALK); + // Ringworld + g_globals->_events.setCursor(CURSOR_WALK); + + switch (g_globals->_events.getCursor()) { + case CURSOR_WALK: + case CURSOR_LOOK: + case CURSOR_USE: + case CURSOR_TALK: + g_globals->_events.setCursor(g_globals->_events.getCursor()); + break; + default: + g_globals->_events.setCursor(CURSOR_WALK); + break; + } break; } } void Player::process(Event &event) { + if ((g_vm->getGameID() != GType_Ringworld) && _action) + _action->process(event); + if (!event.handled && (event.eventType == EVENT_BUTTON_DOWN) && - (_globals->_events.getCursor() == CURSOR_WALK) && _globals->_player._canWalk && - (_position != event.mousePos) && _globals->_sceneObjects->contains(this)) { + (g_globals->_events.getCursor() == CURSOR_WALK) && g_globals->_player._canWalk && + (_position != event.mousePos) && g_globals->_sceneObjects->contains(this)) { + + if ((g_vm->getGameID() == GType_BlueForce) && !BF_GLOBALS._player._enabled) + return; PlayerMover *newMover = new PlayerMover(); - Common::Point destPos(event.mousePos.x + _globals->_sceneManager._scene->_sceneBounds.left, - event.mousePos.y + _globals->_sceneManager._scene->_sceneBounds.top); + Common::Point destPos(event.mousePos.x + g_globals->_sceneManager._scene->_sceneBounds.left, + event.mousePos.y + g_globals->_sceneManager._scene->_sceneBounds.top); addMover(newMover, &destPos, NULL); event.handled = true; @@ -2702,6 +2990,9 @@ void Player::synchronize(Serializer &s) { s.syncAsByte(_canWalk); s.syncAsByte(_uiEnabled); s.syncAsSint16LE(_field8C); + + if (g_vm->getGameID() == GType_BlueForce) + s.syncAsByte(_enabled); } /*--------------------------------------------------------------------------*/ @@ -2709,7 +3000,7 @@ void Player::synchronize(Serializer &s) { Region::Region(int resNum, int rlbNum, ResourceType ctlType) { _regionId = rlbNum; - byte *regionData = _resourceManager->getResource(ctlType, resNum, rlbNum); + byte *regionData = g_resourceManager->getResource(ctlType, resNum, rlbNum); assert(regionData); load(regionData); @@ -2844,7 +3135,7 @@ LineSliceSet Region::mergeSlices(const LineSliceSet &set1, const LineSliceSet &s * Copies the background covered by the given region to the screen surface */ void Region::draw() { - Rect &sceneBounds = _globals->_sceneManager._scene->_sceneBounds; + Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds; for (int yp = sceneBounds.top; yp < sceneBounds.bottom; ++yp) { // Generate a line slice set @@ -2859,10 +3150,10 @@ void Region::draw() { rect1.right = (rect1.right + 3) & ~3; Rect rect2 = rect1; - rect1.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y); + rect1.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y); rect2.translate(-sceneBounds.left, -sceneBounds.top); - _globals->gfxManager().getSurface().copyFrom(_globals->_sceneManager._scene->_backSurface, + g_globals->gfxManager().getSurface().copyFrom(g_globals->_sceneManager._scene->_backSurface, rect1, rect2); } } @@ -2927,8 +3218,8 @@ void Region::uniteRect(const Rect &rect) { void SceneRegions::load(int sceneNum) { clear(); - bool altRegions = _vm->getFeatures() & GF_ALT_REGIONS; - byte *regionData = _resourceManager->getResource(RES_CONTROL, sceneNum, altRegions ? 1 : 9999, true); + bool altRegions = g_vm->getFeatures() & GF_ALT_REGIONS; + byte *regionData = g_resourceManager->getResource(RES_CONTROL, sceneNum, altRegions ? 1 : 9999, true); if (regionData) { int regionCount = READ_LE_UINT16(regionData); @@ -3149,7 +3440,7 @@ void WalkRegions::load(int sceneNum) { clear(); _resNum = sceneNum; - if (_vm->getFeatures() & GF_ALT_REGIONS) { + if (g_vm->getFeatures() & GF_ALT_REGIONS) { loadRevised(); } else { loadOriginal(); @@ -3160,7 +3451,7 @@ void WalkRegions::load(int sceneNum) { * This version handles loading walk regions for Ringworld floppy version and Demo #1 */ void WalkRegions::loadOriginal() { - byte *regionData = _resourceManager->getResource(RES_WALKRGNS, _resNum, 1, true); + byte *regionData = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 1, true); if (!regionData) { // No data, so return _resNum = -1; @@ -3171,8 +3462,8 @@ void WalkRegions::loadOriginal() { int dataSize; // Load the field 18 list - dataP = _resourceManager->getResource(RES_WALKRGNS, _resNum, 2); - dataSize = _vm->_memoryManager.getSize(dataP); + dataP = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 2); + dataSize = g_vm->_memoryManager.getSize(dataP); assert(dataSize % 10 == 0); byte *p = dataP; @@ -3185,8 +3476,8 @@ void WalkRegions::loadOriginal() { DEALLOCATE(dataP); // Load the idx list - dataP = _resourceManager->getResource(RES_WALKRGNS, _resNum, 3); - dataSize = _vm->_memoryManager.getSize(dataP); + dataP = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 3); + dataSize = g_vm->_memoryManager.getSize(dataP); assert(dataSize % 2 == 0); p = dataP; @@ -3196,8 +3487,8 @@ void WalkRegions::loadOriginal() { DEALLOCATE(dataP); // Load the secondary idx list - dataP = _resourceManager->getResource(RES_WALKRGNS, _resNum, 4); - dataSize = _vm->_memoryManager.getSize(dataP); + dataP = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 4); + dataSize = g_vm->_memoryManager.getSize(dataP); assert(dataSize % 2 == 0); p = dataP; @@ -3207,7 +3498,7 @@ void WalkRegions::loadOriginal() { DEALLOCATE(dataP); // Handle the loading of the actual regions themselves - dataP = _resourceManager->getResource(RES_WALKRGNS, _resNum, 5); + dataP = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 5); byte *pWalkRegion = regionData + 16; byte *srcP = dataP; @@ -3238,7 +3529,7 @@ void WalkRegions::loadOriginal() { * version, it may also be used by future game titles */ void WalkRegions::loadRevised() { - byte *regionData = _resourceManager->getResource(RES_WALKRGNS, _resNum, 2, true); + byte *regionData = g_resourceManager->getResource(RES_WALKRGNS, _resNum, 2, true); if (!regionData) { // No data, so return _resNum = -1; @@ -3321,8 +3612,8 @@ void ScenePriorities::load(int resNum) { _resNum = resNum; clear(); - bool altMode = (_vm->getFeatures() & GF_ALT_REGIONS) != 0; - byte *regionData = _resourceManager->getResource(RES_PRIORITY, resNum, altMode ? 1 : 9999, true); + bool altMode = (g_vm->getFeatures() & GF_ALT_REGIONS) != 0; + byte *regionData = g_resourceManager->getResource(RES_PRIORITY, resNum, altMode ? 1 : 9999, true); if (!regionData) return; @@ -3346,8 +3637,11 @@ void ScenePriorities::load(int resNum) { Region *ScenePriorities::find(int priority) { // If no priority regions are loaded, then return the placeholder region - if (empty()) - return &_defaultPriorityRegion; + if (empty()) { + if (g_vm->getGameID() == GType_Ringworld) + return &_defaultPriorityRegion; + return NULL; + } if (priority > 255) priority = 255; @@ -3400,8 +3694,8 @@ GameHandler::GameHandler() : EventHandler() { } GameHandler::~GameHandler() { - if (_globals) - _globals->_game->removeHandler(this); + if (g_globals) + g_globals->_game->removeHandler(this); } void GameHandler::execute() { @@ -3426,93 +3720,142 @@ void GameHandler::synchronize(Serializer &s) { SceneHandler::SceneHandler() { _saveGameSlot = -1; _loadGameSlot = -1; + _prevFrameNumber = 0; } void SceneHandler::registerHandler() { postInit(); - _globals->_game->addHandler(this); + g_globals->_game->addHandler(this); +} + +uint32 SceneHandler::getFrameDifference() { + return GLOBALS._events.getFrameNumber() - _prevFrameNumber; } void SceneHandler::postInit(SceneObjectList *OwnerList) { _delayTicks = 2; - _globals->_scenePalette.loadPalette(0); - _globals->_scenePalette.refresh(); + g_globals->_scenePalette.loadPalette(0); + g_globals->_scenePalette.refresh(); - _globals->_soundManager.postInit(); - _globals->_soundManager.buildDriverList(true); - _globals->_soundManager.installConfigDrivers(); + g_globals->_soundManager.postInit(); + g_globals->_soundManager.buildDriverList(true); + g_globals->_soundManager.installConfigDrivers(); - _globals->_game->start(); + g_globals->_game->start(); } void SceneHandler::process(Event &event) { // Main keypress handler if (!event.handled) { - _globals->_game->processEvent(event); + g_globals->_game->processEvent(event); if (event.eventType == EVENT_KEYPRESS) - _globals->_events.setCursorFromFlag(); + g_globals->_events.setCursorFromFlag(); } // Check for displaying right-click dialog if ((event.eventType == EVENT_BUTTON_DOWN) && (event.btnState == BTNSHIFT_RIGHT) && - _globals->_player._uiEnabled) { - RightClickDialog *dlg = new RightClickDialog(); - dlg->execute(); - delete dlg; + g_globals->_player._uiEnabled) { + g_globals->_game->rightClick(); event.handled = true; return; } // If there is an active scene, pass the event to it - if (_globals->_sceneManager._scene) - _globals->_sceneManager._scene->process(event); + if (g_globals->_sceneManager._scene) + g_globals->_sceneManager._scene->process(event); if (!event.handled) { // Separate check for F5 - Save key if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_F5)) { // F5 - Save - _globals->_game->saveGame(); + g_globals->_game->saveGame(); event.handled = true; - _globals->_events.setCursorFromFlag(); + g_globals->_events.setCursorFromFlag(); } // Check for debugger if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_d) && (event.kbd.flags & Common::KBD_CTRL)) { // Attach to the debugger - _vm->_debugger->attach(); - _vm->_debugger->onFrame(); + g_vm->_debugger->attach(); + g_vm->_debugger->onFrame(); + } + + if ((event.eventType == EVENT_KEYPRESS) && g_globals->_player._enabled && g_globals->_player._canWalk) { + // Keyboard shortcuts for different actions + switch (event.kbd.keycode) { + case Common::KEYCODE_w: + g_globals->_events.setCursor(CURSOR_WALK); + event.handled = true; + break; + case Common::KEYCODE_l: + g_globals->_events.setCursor(CURSOR_LOOK); + event.handled = true; + break; + case Common::KEYCODE_u: + g_globals->_events.setCursor(CURSOR_USE); + event.handled = true; + break; + case Common::KEYCODE_t: + g_globals->_events.setCursor(CURSOR_TALK); + event.handled = true; + break; + default: + break; + } } // Mouse press handling - if (_globals->_player._uiEnabled && (event.eventType == EVENT_BUTTON_DOWN) && - !_globals->_sceneItems.empty()) { + bool enabled = (g_vm->getGameID() == GType_BlueForce) ? g_globals->_player._enabled : + g_globals->_player._uiEnabled; + if (enabled && (event.eventType == EVENT_BUTTON_DOWN) && !g_globals->_sceneItems.empty()) { + // Check if the mouse is on the player + if (g_globals->_player.contains(event.mousePos)) { + playerAction(event); + if (event.handled) + return; + } + // Scan the item list to find one the mouse is within - SynchronizedList<SceneItem *>::iterator i = _globals->_sceneItems.begin(); - while ((i != _globals->_sceneItems.end()) && !(*i)->contains(event.mousePos)) - ++i; - - if (i != _globals->_sceneItems.end()) { - // Pass the action to the item - (*i)->doAction(_globals->_events.getCursor()); - event.handled = _globals->_events.getCursor() != CURSOR_WALK; - - if (_globals->_player._uiEnabled && _globals->_player._canWalk && - (_globals->_events.getCursor() != CURSOR_LOOK)) { - _globals->_events.setCursor(CURSOR_WALK); - } else if (_globals->_player._canWalk && (_globals->_events.getCursor() != CURSOR_LOOK)) { - _globals->_events.setCursor(CURSOR_WALK); - } else if (_globals->_player._uiEnabled && (_globals->_events.getCursor() != CURSOR_LOOK)) { - _globals->_events.setCursor(CURSOR_USE); + SynchronizedList<SceneItem *>::iterator i; + for (i = g_globals->_sceneItems.begin(); i != g_globals->_sceneItems.end(); ++i) { + if ((*i)->contains(event.mousePos)) { + // Pass the action to the item + bool handled = (*i)->startAction(g_globals->_events.getCursor(), event); + if (!handled) + // Item wasn't handled, keep scanning + continue; + + if ((g_vm->getGameID() == GType_Ringworld) || (g_globals->_events.getCursor() == CURSOR_9999)) { + event.handled = g_globals->_events.getCursor() != CURSOR_WALK; + + if (g_globals->_player._uiEnabled && g_globals->_player._canWalk && + (g_globals->_events.getCursor() != CURSOR_LOOK)) { + g_globals->_events.setCursor(CURSOR_WALK); + } else if (g_globals->_player._canWalk && (g_globals->_events.getCursor() != CURSOR_LOOK)) { + g_globals->_events.setCursor(CURSOR_WALK); + } else if (g_globals->_player._uiEnabled && (g_globals->_events.getCursor() != CURSOR_LOOK)) { + g_globals->_events.setCursor(CURSOR_USE); + } + + if (g_vm->getGameID() == GType_BlueForce) + event.handled = true; + } else if (g_vm->getGameID() != GType_Ringworld) { + event.handled = true; + } + break; } } - // Handle player processing - _globals->_player.process(event); + // Handle any fallback text display + processEnd(event); } + + // Handle player processing + g_globals->_player.process(event); } } @@ -3521,7 +3864,7 @@ void SceneHandler::dispatch() { if (_saveGameSlot != -1) { int saveSlot = _saveGameSlot; _saveGameSlot = -1; - Common::Error err = _saver->save(saveSlot, _saveName); + Common::Error err = g_saver->save(saveSlot, _saveName); // FIXME: Make use of the description string in err to enhance // the error reported to the user. if (err.getCode() != Common::kNoError) @@ -3530,40 +3873,49 @@ void SceneHandler::dispatch() { if (_loadGameSlot != -1) { int loadSlot = _loadGameSlot; _loadGameSlot = -1; - _saver->restore(loadSlot); - _globals->_events.setCursorFromFlag(); + g_saver->restore(loadSlot); + g_globals->_events.setCursorFromFlag(); } - _globals->_soundManager.dispatch(); - _globals->_scenePalette.signalListeners(); + g_globals->_soundManager.dispatch(); + g_globals->_scenePalette.signalListeners(); // Dispatch to any objects registered in the scene - _globals->_sceneObjects->recurse(SceneHandler::dispatchObject); + g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject); // If a scene is active, then dispatch to it - if (_globals->_sceneManager._scene) - _globals->_sceneManager._scene->dispatch(); + if (g_globals->_sceneManager._scene) + g_globals->_sceneManager._scene->dispatch(); // Not actually used //_eventListeners.forEach(SceneHandler::handleListener); - // Handle pending eents + // Handle pending events Event event; - while (_globals->_events.getEvent(event)) + if (g_globals->_events.getEvent(event)) { + // Process pending events + do { + process(event); + } while (g_globals->_events.getEvent(event)); + } else if (g_vm->getGameID() == GType_BlueForce) { + // For Blue Force, 'none' events need to be generated in the absence of any + event.eventType = EVENT_NONE; + event.mousePos = g_globals->_events._mousePos; process(event); + } // Handle drawing the contents of the scene - if (_globals->_sceneManager._scene) - _globals->_sceneObjects->draw(); + if (g_globals->_sceneManager._scene) + g_globals->_sceneObjects->draw(); // Check to see if any scene change is required - _globals->_sceneManager.checkScene(); + g_globals->_sceneManager.checkScene(); // Signal the ScummVM debugger - _vm->_debugger->onFrame(); + g_vm->_debugger->onFrame(); // Delay between frames - _globals->_events.delay(_delayTicks); + g_globals->_events.delay(_delayTicks); } void SceneHandler::dispatchObject(EventHandler *obj) { @@ -3573,4 +3925,4 @@ void SceneHandler::dispatchObject(EventHandler *obj) { void SceneHandler::saveListener(Serializer &ser) { } -} // End of namespace tSage +} // End of namespace TsAGE diff --git a/engines/tsage/core.h b/engines/tsage/core.h index b86e2f63fe..0137134583 100644 --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -34,7 +34,7 @@ #include "tsage/resources.h" #include "tsage/saveload.h" -namespace tSage { +namespace TsAGE { #define MAX_FLAGS 256 @@ -55,8 +55,14 @@ public: CursorType _cursorId; Common::String _description; int _iconResNum; + + int _visage; + int _strip; + int _frame; public: InvObject(int sceneNumber, int rlbNum, int cursorNum, CursorType cursorId, const Common::String description); + InvObject(int visage, int strip, int frame); + InvObject(int visage, int strip); bool inInventory() const { return _sceneNumber == 1; } void setCursor(); @@ -73,6 +79,9 @@ public: InvObject *_selectedItem; InvObjectList(); + int indexOf(InvObject *obj) const; + InvObject *getItem(int objectNum); + int getObjectScene(int objectNum); virtual Common::String getClassName() { return "InvObjectList"; } virtual void synchronize(Serializer &s); @@ -157,6 +166,18 @@ public: int _state; }; +#define ADD_PLAYER_MOVER(X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ + g_globals->_player.addMover(mover, &pt, this); } +#define ADD_PLAYER_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ + OBJ.addMover(mover, &pt, NULL); } +#define ADD_PLAYER_MOVER_THIS(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ + OBJ.addMover(mover, &pt, this); } + +#define ADD_MOVER(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \ + OBJ.addMover(mover, &pt, this); } +#define ADD_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \ + OBJ.addMover(mover, &pt, NULL); } + class ObjectMover : public EventHandler { public: Common::Point _destPosition; @@ -287,7 +308,7 @@ public: PaletteModifierCached(); - void setPalette(ScenePalette *palette, int step); + virtual void setPalette(ScenePalette *palette, int step); virtual Common::String getClassName() { return "PaletteModifierCached"; } virtual void synchronize(Serializer &s); }; @@ -323,6 +344,7 @@ public: virtual void synchronize(Serializer &s); virtual void signal(); virtual void remove(); + virtual void setPalette(ScenePalette *palette, int step); }; /*--------------------------------------------------------------------------*/ @@ -350,13 +372,14 @@ public: bool loadPalette(int paletteNum); void refresh(); void setPalette(int index, int count); + void setEntry(int index, uint r, uint g, uint b); uint8 indexOf(uint r, uint g, uint b, int threshold = 0xffff); void getPalette(int start = 0, int count = 256); void signalListeners(); void clearListeners(); void fade(const byte *adjustData, bool fullAdjust, int percent); PaletteRotation *addRotation(int start, int end, int rotationMode, int duration = 0, Action *action = NULL); - PaletteFader *addFader(const byte *arrBufferRGB, int palSize, int percent, Action *action); + PaletteFader *addFader(const byte *arrBufferRGB, int palSize, int step, Action *action); static void changeBackground(const Rect &bounds, FadeMode fadeMode); @@ -393,16 +416,15 @@ public: virtual Common::String getClassName() { return "SceneItem"; } virtual void remove(); virtual void destroy() {} - virtual void startMover(CursorType action) { doAction(action); } + virtual bool startAction(CursorType action, Event &event); virtual void doAction(int action); bool contains(const Common::Point &pt); void setBounds(const Rect &newBounds) { _bounds = newBounds; } void setBounds(const int ys, const int xe, const int ye, const int xs) { _bounds = Rect(MIN(xs, xe), MIN(ys, ye), MAX(xs, xe), MAX(ys, ye)); } static void display(int resNum, int lineNum, ...); - static void display2(int resNum, int lineNum) { - display(resNum, lineNum, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } + static void display2(int resNum, int lineNum); + static void display(const Common::String &msg); }; class SceneItemExt : public SceneItem { @@ -419,33 +441,28 @@ public: class SceneHotspot : public SceneItem { public: SceneHotspot() : SceneItem() {} - + virtual bool startAction(CursorType action, Event &event); virtual Common::String getClassName() { return "SceneHotspot"; } virtual void doAction(int action); }; -class NamedHotspot : public SceneHotspot { -public: - int _resnum, _lookLineNum, _useLineNum; - NamedHotspot() : SceneHotspot() {} - - void setup(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum); - virtual void doAction(int action); - virtual Common::String getClassName() { return "NamedHotspot"; } - virtual void synchronize(Serializer &s); -}; - enum AnimateMode {ANIM_MODE_NONE = 0, ANIM_MODE_1 = 1, ANIM_MODE_2 = 2, ANIM_MODE_3 = 3, - ANIM_MODE_4 = 4, ANIM_MODE_5 = 5, ANIM_MODE_6 = 6, ANIM_MODE_7 = 7, ANIM_MODE_8 = 8}; + ANIM_MODE_4 = 4, ANIM_MODE_5 = 5, ANIM_MODE_6 = 6, ANIM_MODE_7 = 7, ANIM_MODE_8 = 8, + // Introduced in Blue Force + ANIM_MODE_9 = 9 +}; class SceneObject; class Visage { private: byte *_data; + + void flip(GfxSurface &s); public: int _resNum; int _rlbNum; + bool _flipHoriz; public: Visage(); Visage(const Visage &v); @@ -454,7 +471,7 @@ public: void setVisage(int resNum, int rlbNum = 9999); GfxSurface getFrame(int frameNum); int getFrameCount() const; - Visage &operator=(const Visage &s); + Visage &operator=(const Visage &gfxSurface); }; class SceneObjectWrapper : public EventHandler { @@ -467,6 +484,7 @@ public: virtual ~SceneObjectWrapper() {} void setSceneObject(SceneObject *so); + void check(); virtual void synchronize(Serializer &s); virtual Common::String getClassName() { return "SceneObjectWrapper"; } @@ -487,7 +505,6 @@ private: int getNewFrame(); void animEnded(); int changeFrame(); - bool isNoMover() const { return !_mover || (_regionIndex > 0); } public: uint32 _updateStartFrame; uint32 _walkStartFrame; @@ -537,10 +554,12 @@ public: void animate(AnimateMode animMode, ...); SceneObject *clone() const; void checkAngle(const SceneObject *obj); + void checkAngle(const Common::Point &pt); void hide(); void show(); int getSpliceArea(const SceneObject *obj); int getFrameCount(); + bool isNoMover() const { return !_mover || (_regionIndex > 0); } virtual void synchronize(Serializer &s); virtual Common::String getClassName() { return "SceneObject"; } @@ -555,18 +574,19 @@ public: virtual void draw(); virtual void proc19() {} virtual void updateScreen(); + // New methods introduced by Blue Force + virtual void updateAngle(const Common::Point &pt); + virtual void changeAngle(int angle); + void setup(int visage, int stripFrameNum, int frameNum, int posX, int posY, int priority); + void setup(int visage, int stripFrameNum, int frameNum); }; -class SceneObjectExt : public SceneObject { +class BackgroundSceneObject: public SceneObject { public: - int _state; - - virtual void synchronize(Serializer &s) { - SceneObject::synchronize(s); - s.syncAsSint16LE(_state); - } - virtual Common::String getClassName() { return "SceneObjectExt"; } + virtual Common::String getClassName() { return "BackgroundSceneObject"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void draw(); }; class SceneText : public SceneObject { @@ -587,6 +607,7 @@ public: virtual void synchronize(Serializer &s); virtual Common::String getClassName() { return "SceneText"; } virtual GfxSurface getFrame() { return _textSurface; } + virtual void updateScreen(); }; class Player : public SceneObject { @@ -594,6 +615,7 @@ public: bool _canWalk; bool _uiEnabled; int _field8C; + bool _enabled; public: Player(); @@ -695,13 +717,14 @@ public: SynchronizedList<SceneObject *>::iterator begin() { return _objList.begin(); } SynchronizedList<SceneObject *>::iterator end() { return _objList.end(); } int size() const { return _objList.size(); } - bool contains(SceneObject *sceneObj) { return tSage::contains(_objList, sceneObj); } + bool contains(SceneObject *sceneObj) { return TsAGE::contains(_objList, sceneObj); } void push_back(SceneObject *sceneObj) { _objList.push_back(sceneObj); } void push_front(SceneObject *sceneObj) { _objList.push_front(sceneObj); } void remove(SceneObject *sceneObj) { _objList.remove(sceneObj); _listAltered = true; } + void clear() { _objList.clear(); } }; class ScenePriorities : public Common::List<Region> { @@ -788,6 +811,8 @@ public: assert((idx >= 1) && (idx <= (int)_regionList.size())); return _regionList[idx - 1]; } + void proc1(int v) { warning("TODO: WalkRegions::proc1"); } + void proc2(int v) { warning("TODO: WalkRegions::proc2"); } }; /*--------------------------------------------------------------------------*/ @@ -827,9 +852,14 @@ public: int _loadGameSlot; int _delayTicks; Common::String _saveName; + uint32 _prevFrameNumber; +protected: + virtual void playerAction(Event &event) {} + virtual void processEnd(Event &event) {} public: SceneHandler(); void registerHandler(); + uint32 getFrameDifference(); virtual Common::String getClassName() { return "SceneHandler"; } virtual void postInit(SceneObjectList *OwnerList = NULL); @@ -840,6 +870,6 @@ public: static void saveListener(Serializer &ser); }; -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp index 9277fd429a..a0e8b9edba 100644 --- a/engines/tsage/debugger.cpp +++ b/engines/tsage/debugger.cpp @@ -23,21 +23,23 @@ #include "tsage/debugger.h" #include "tsage/globals.h" #include "tsage/graphics.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" -namespace tSage { +namespace TsAGE { Debugger::Debugger() : GUI::Debugger() { DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit)); DCmd_Register("scene", WRAP_METHOD(Debugger, Cmd_Scene)); DCmd_Register("walk_regions", WRAP_METHOD(Debugger, Cmd_WalkRegions)); DCmd_Register("priority_regions", WRAP_METHOD(Debugger, Cmd_PriorityRegions)); + DCmd_Register("scene_regions", WRAP_METHOD(Debugger, Cmd_SceneRegions)); DCmd_Register("setflag", WRAP_METHOD(Debugger, Cmd_SetFlag)); DCmd_Register("getflag", WRAP_METHOD(Debugger, Cmd_GetFlag)); DCmd_Register("clearflag", WRAP_METHOD(Debugger, Cmd_ClearFlag)); DCmd_Register("listobjects", WRAP_METHOD(Debugger, Cmd_ListObjects)); DCmd_Register("moveobject", WRAP_METHOD(Debugger, Cmd_MoveObject)); DCmd_Register("hotspots", WRAP_METHOD(Debugger, Cmd_Hotspots)); + DCmd_Register("sound", WRAP_METHOD(Debugger, Cmd_Sound)); } static int strToInt(const char *s) { @@ -66,9 +68,9 @@ bool Debugger::Cmd_Scene(int argc, const char **argv) { } if (argc == 3) - _globals->_sceneManager._sceneNumber = strToInt(argv[2]); + g_globals->_sceneManager._sceneNumber = strToInt(argv[2]); - _globals->_sceneManager.changeScene(strToInt(argv[1])); + g_globals->_sceneManager.changeScene(strToInt(argv[1])); return false; } @@ -85,20 +87,20 @@ bool Debugger::Cmd_WalkRegions(int argc, const char **argv) { int color = 16; // Lock the background surface for access - Graphics::Surface destSurface = _globals->_sceneManager._scene->_backSurface.lockSurface(); + Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface(); // Loop through drawing each walk region in a different color to the background surface Common::String regionsDesc; - for (uint regionIndex = 0; regionIndex < _globals->_walkRegions._regionList.size(); ++regionIndex, ++color) { - WalkRegion &wr = _globals->_walkRegions._regionList[regionIndex]; + for (uint regionIndex = 0; regionIndex < g_globals->_walkRegions._regionList.size(); ++regionIndex, ++color) { + WalkRegion &wr = g_globals->_walkRegions._regionList[regionIndex]; for (int yp = wr._bounds.top; yp < wr._bounds.bottom; ++yp) { LineSliceSet sliceSet = wr.getLineSlices(yp); for (uint idx = 0; idx < sliceSet.items.size(); ++idx) - destSurface.hLine(sliceSet.items[idx].xs - _globals->_sceneOffset.x, yp, - sliceSet.items[idx].xe - _globals->_sceneOffset.x, color); + destSurface.hLine(sliceSet.items[idx].xs - g_globals->_sceneOffset.x, yp, + sliceSet.items[idx].xe - g_globals->_sceneOffset.x, color); } regionsDesc += Common::String::format("Region #%d d bounds=%d,%d,%d,%d\n", @@ -106,12 +108,12 @@ bool Debugger::Cmd_WalkRegions(int argc, const char **argv) { } // Release the surface - _globals->_sceneManager._scene->_backSurface.unlockSurface(); + g_globals->_sceneManager._scene->_backSurface.unlockSurface(); // Mark the scene as requiring a full redraw - _globals->_paneRefreshFlag[0] = 2; + g_globals->_paneRefreshFlag[0] = 2; - DebugPrintf("Total regions = %d\n", _globals->_walkRegions._regionList.size()); + DebugPrintf("Total regions = %d\n", g_globals->_walkRegions._regionList.size()); DebugPrintf("%s\n", regionsDesc.c_str()); return false; @@ -132,12 +134,12 @@ bool Debugger::Cmd_PriorityRegions(int argc, const char **argv) { int count = 0; // Lock the background surface for access - Graphics::Surface destSurface = _globals->_sceneManager._scene->_backSurface.lockSurface(); + Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface(); - Common::List<Region>::iterator i = _globals->_sceneManager._scene->_priorities.begin(); + Common::List<Region>::iterator i = g_globals->_sceneManager._scene->_priorities.begin(); Common::String regionsDesc; - for (; i != _globals->_sceneManager._scene->_priorities.end(); ++i, ++color, ++count) { + for (; i != g_globals->_sceneManager._scene->_priorities.end(); ++i, ++color, ++count) { Region &r = *i; if ((regionNum == 0) || (regionNum == (count + 1))) { @@ -145,8 +147,8 @@ bool Debugger::Cmd_PriorityRegions(int argc, const char **argv) { byte *destP = (byte *)destSurface.getBasePtr(0, y); for (int x = 0; x < destSurface.w; ++x) { - if (r.contains(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + x, - _globals->_sceneManager._scene->_sceneBounds.top + y))) + if (r.contains(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + x, + g_globals->_sceneManager._scene->_sceneBounds.top + y))) *destP = color; ++destP; } @@ -158,10 +160,63 @@ bool Debugger::Cmd_PriorityRegions(int argc, const char **argv) { } // Release the surface - _globals->_sceneManager._scene->_backSurface.unlockSurface(); + g_globals->_sceneManager._scene->_backSurface.unlockSurface(); // Mark the scene as requiring a full redraw - _globals->_paneRefreshFlag[0] = 2; + g_globals->_paneRefreshFlag[0] = 2; + + DebugPrintf("Total regions = %d\n", count); + DebugPrintf("%s", regionsDesc.c_str()); + + return true; +} + +/* + * This command draws the scene regions onto the screen. These are the regions + * used by hotspots that have non-rectangular areas. + */ +bool Debugger::Cmd_SceneRegions(int argc, const char **argv) { + int regionNum = 0; + + // Check for an optional specific region to display + if (argc == 2) + regionNum = strToInt(argv[1]); + + // Color index to use for the first priority region + int color = 16; + int count = 0; + + // Lock the background surface for access + Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface(); + + Common::List<Region>::iterator i = g_globals->_sceneRegions.begin(); + Common::String regionsDesc; + + for (; i != g_globals->_sceneRegions.end(); ++i, ++color, ++count) { + Region &r = *i; + + if ((regionNum == 0) || (regionNum == (count + 1))) { + for (int y = 0; y < destSurface.h; ++y) { + byte *destP = (byte *)destSurface.getBasePtr(0, y); + + for (int x = 0; x < destSurface.w; ++x) { + if (r.contains(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + x, + g_globals->_sceneManager._scene->_sceneBounds.top + y))) + *destP = color; + ++destP; + } + } + } + + regionsDesc += Common::String::format("Region id = %d bounds=%d,%d,%d,%d\n", + r._regionId, r._bounds.left, r._bounds.top, r._bounds.right, r._bounds.bottom); + } + + // Release the surface + g_globals->_sceneManager._scene->_backSurface.unlockSurface(); + + // Mark the scene as requiring a full redraw + g_globals->_paneRefreshFlag[0] = 2; DebugPrintf("Total regions = %d\n", count); DebugPrintf("%s", regionsDesc.c_str()); @@ -180,7 +235,7 @@ bool Debugger::Cmd_SetFlag(int argc, const char **argv) { } int flagNum = strToInt(argv[1]); - _globals->setFlag(flagNum); + g_globals->setFlag(flagNum); return true; } @@ -195,7 +250,7 @@ bool Debugger::Cmd_GetFlag(int argc, const char **argv) { } int flagNum = strToInt(argv[1]); - DebugPrintf("Value: %d\n", _globals->getFlag(flagNum)); + DebugPrintf("Value: %d\n", g_globals->getFlag(flagNum)); return true; } @@ -210,7 +265,7 @@ bool Debugger::Cmd_ClearFlag(int argc, const char **argv) { } int flagNum = strToInt(argv[1]); - _globals->clearFlag(flagNum); + g_globals->clearFlag(flagNum); return true; } @@ -389,31 +444,32 @@ bool Debugger::Cmd_MoveObject(int argc, const char **argv) { */ bool Debugger::Cmd_Hotspots(int argc, const char **argv) { int colIndex = 16; - const Rect &sceneBounds = _globals->_sceneManager._scene->_sceneBounds; + const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds; // Lock the background surface for access - Graphics::Surface destSurface = _globals->_sceneManager._scene->_backSurface.lockSurface(); + Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface(); // Iterate through the scene items SynchronizedList<SceneItem *>::iterator i; - for (i = _globals->_sceneItems.reverse_begin(); i != _globals->_sceneItems.end(); --i, ++colIndex) { + for (i = g_globals->_sceneItems.reverse_begin(); i != g_globals->_sceneItems.end(); --i, ++colIndex) { SceneItem *o = *i; // Draw the contents of the hotspot area if (o->_sceneRegionId == 0) { // Scene item doesn't use a region, so fill in the entire area - destSurface.fillRect(Rect(o->_bounds.left - sceneBounds.left, o->_bounds.top - sceneBounds.top, - o->_bounds.right - sceneBounds.left - 1, o->_bounds.bottom - sceneBounds.top - 1), colIndex); + if ((o->_bounds.right > o->_bounds.left) && (o->_bounds.bottom > o->_bounds.top)) + destSurface.fillRect(Rect(o->_bounds.left - sceneBounds.left, o->_bounds.top - sceneBounds.top, + o->_bounds.right - sceneBounds.left - 1, o->_bounds.bottom - sceneBounds.top - 1), colIndex); } else { // Scene uses a region, so get it and use it to fill out only the correct parts - SceneRegions::iterator ri = _globals->_sceneRegions.begin(); - while ((ri != _globals->_sceneRegions.end()) && ((*ri)._regionId != o->_sceneRegionId)) + SceneRegions::iterator ri = g_globals->_sceneRegions.begin(); + while ((ri != g_globals->_sceneRegions.end()) && ((*ri)._regionId != o->_sceneRegionId)) ++ri; - if (ri != _globals->_sceneRegions.end()) { + if (ri != g_globals->_sceneRegions.end()) { // Fill out the areas defined by the region Region &r = *ri; - + for (int y = r._bounds.top; y < r._bounds.bottom; ++y) { LineSliceSet set = r.getLineSlices(y); @@ -426,13 +482,26 @@ bool Debugger::Cmd_Hotspots(int argc, const char **argv) { } // Release the surface - _globals->_sceneManager._scene->_backSurface.unlockSurface(); + g_globals->_sceneManager._scene->_backSurface.unlockSurface(); // Mark the scene as requiring a full redraw - _globals->_paneRefreshFlag[0] = 2; + g_globals->_paneRefreshFlag[0] = 2; return false; } +/** + * Play the specified sound + */ +bool Debugger::Cmd_Sound(int argc, const char **argv) { + if (argc != 2) { + DebugPrintf("Usage: %s <sound number>\n", argv[0]); + return true; + } + + int soundNum = strToInt(argv[1]); + g_globals->_soundHandler.play(soundNum); + return false; +} -} // End of namespace tSage +} // End of namespace TsAGE diff --git a/engines/tsage/debugger.h b/engines/tsage/debugger.h index 3c14cd7bed..fcdbc2d243 100644 --- a/engines/tsage/debugger.h +++ b/engines/tsage/debugger.h @@ -26,7 +26,7 @@ #include "common/scummsys.h" #include "gui/debugger.h" -namespace tSage { +namespace TsAGE { class Debugger : public GUI::Debugger { public: @@ -37,15 +37,16 @@ protected: bool Cmd_Scene(int argc, const char **argv); bool Cmd_WalkRegions(int argc, const char **argv); bool Cmd_PriorityRegions(int argc, const char **argv); + bool Cmd_SceneRegions(int argc, const char **argv); bool Cmd_SetFlag(int argc, const char **argv); bool Cmd_GetFlag(int argc, const char **argv); bool Cmd_ClearFlag(int argc, const char **argv); bool Cmd_ListObjects(int argc, const char **argv); bool Cmd_MoveObject(int argc, const char **argv); - bool Cmd_Hotspots(int argc, const char **argv); + bool Cmd_Sound(int argc, const char **argv); }; -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/detection.cpp b/engines/tsage/detection.cpp index aaa9030a04..12add10c58 100644 --- a/engines/tsage/detection.cpp +++ b/engines/tsage/detection.cpp @@ -30,7 +30,7 @@ #include "tsage/tsage.h" -namespace tSage { +namespace TsAGE { struct tSageGameDescription { ADGameDescription desc; @@ -55,12 +55,13 @@ Common::String TSageEngine::getPrimaryFilename() const { return Common::String(_gameDescription->desc.filesDescriptions[0].fileName); } -} // End of namespace tSage +} // End of namespace TsAGE static const PlainGameDescriptor tSageGameTitles[] = { - { "tsage", "Unknown Tsunami TSAGE-based Game" }, - { "ring", "Ringworld: Revenge of the Patriarch" }, + { "tsage", "Tsunami TsAGE-based Game" }, + { "ringworld", "Ringworld: Revenge of the Patriarch" }, { "blueforce", "Blue Force" }, + { "ringworld2", "Return to Ringworld" }, { 0, 0 } }; @@ -72,10 +73,10 @@ enum { class TSageMetaEngine : public AdvancedMetaEngine { public: - TSageMetaEngine() : AdvancedMetaEngine(tSage::gameDescriptions, sizeof(tSage::tSageGameDescription), tSageGameTitles) { + TSageMetaEngine() : AdvancedMetaEngine(TsAGE::gameDescriptions, sizeof(TsAGE::tSageGameDescription), tSageGameTitles) { _md5Bytes = 5000; _singleid = "tsage"; - _guioptions = Common::GUIO_NOSPEECH; + _guioptions = GUIO1(GUIO_NOSPEECH); } virtual const char *getName() const { @@ -103,7 +104,7 @@ public: virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { if (desc) { - *engine = new tSage::TSageEngine(syst, (const tSage::tSageGameDescription *)desc); + *engine = new TsAGE::TSageEngine(syst, (const TsAGE::tSageGameDescription *)desc); } return desc != 0; } @@ -118,7 +119,7 @@ public: Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern); sort(filenames.begin(), filenames.end()); - tSage::tSageSavegameHeader header; + TsAGE::tSageSavegameHeader header; SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { @@ -129,8 +130,10 @@ public: Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { - if (tSage::Saver::readSavegameHeader(in, header)) { + if (TsAGE::Saver::readSavegameHeader(in, header)) { saveList.push_back(SaveStateDescriptor(slot, header.saveName)); + + header.thumbnail->free(); delete header.thumbnail; } @@ -154,22 +157,25 @@ public: SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const { Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading( generateGameStateFileName(target, slot)); - assert(f); - - tSage::tSageSavegameHeader header; - tSage::Saver::readSavegameHeader(f, header); - delete f; - - // Create the return descriptor - SaveStateDescriptor desc(slot, header.saveName); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); - desc.setThumbnail(header.thumbnail); - desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); - desc.setSaveTime(header.saveHour, header.saveMinutes); - desc.setPlayTime(header.totalFrames * GAME_FRAME_TIME); - - return desc; + + if (f) { + TsAGE::tSageSavegameHeader header; + TsAGE::Saver::readSavegameHeader(f, header); + delete f; + + // Create the return descriptor + SaveStateDescriptor desc(slot, header.saveName); + desc.setDeletableFlag(true); + desc.setWriteProtectedFlag(false); + desc.setThumbnail(header.thumbnail); + desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); + desc.setSaveTime(header.saveHour, header.saveMinutes); + desc.setPlayTime(header.totalFrames * GAME_FRAME_TIME); + + return desc; + } + + return SaveStateDescriptor(); } }; diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index 8b80edf89d..360dbac0ae 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -20,20 +20,34 @@ * */ -namespace tSage { +namespace TsAGE { static const tSageGameDescription gameDescriptions[] = { - // Ringworld CD and First Wave versions + // Ringworld English CD and First Wave versions { { - "ring", + "ringworld", "CD", AD_ENTRY1s("ring.rlb", "466f0e6492d9d0f34d35c5cd088de90f", 37847618), Common::EN_ANY, Common::kPlatformPC, - ADGF_UNSTABLE, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + ADGF_CD, + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) + }, + GType_Ringworld, + GF_CD | GF_ALT_REGIONS + }, + // Ringworld Spanish CD + { + { + "ringworld", + "CD", + AD_ENTRY1s("ring.rlb", "cb8bba91b30cd172712371d7123bd763", 7427980), + Common::ES_ESP, + Common::kPlatformPC, + ADGF_CD, + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_Ringworld, GF_CD | GF_ALT_REGIONS @@ -41,13 +55,13 @@ static const tSageGameDescription gameDescriptions[] = { // Ringworld English Floppy version { { - "ring", + "ringworld", "Floppy", AD_ENTRY1s("ring.rlb", "7b7f0c5b37b58fa5ec06ebb2ca0d0d9d", 8438770), Common::EN_ANY, Common::kPlatformPC, - ADGF_UNSTABLE, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_Ringworld, GF_FLOPPY @@ -55,13 +69,13 @@ static const tSageGameDescription gameDescriptions[] = { // Ringworld English Floppy Demo #1 version { { - "ring", + "ringworld", "Floppy Demo", AD_ENTRY1s("tsage.rlb", "3b3604a97c06c91f3735d3e9d341f63f", 833453), Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_Ringworld, GF_FLOPPY | GF_DEMO @@ -70,13 +84,13 @@ static const tSageGameDescription gameDescriptions[] = { // Ringworld English Floppy Demo #2 version { { - "ring", + "ringworld", "Floppy Demo", AD_ENTRY1s("demoring.rlb", "64050e1806203b15bb03876140eb4f56", 832206), Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_Ringworld, GF_FLOPPY | GF_DEMO | GF_ALT_REGIONS @@ -92,7 +106,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, GF_FLOPPY @@ -106,11 +120,11 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "17eabb456cb1546c66baf1aff387ba6a", 10032614), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + ADGF_UNSTABLE, + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, - GF_FLOPPY + GF_FLOPPY | GF_ALT_REGIONS }, // Blue Force CD and First Wave use the same files { @@ -120,13 +134,29 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "99983f48cb218f1f3760cf2f9a7ef11d", 63863322), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + ADGF_CD | ADGF_UNSTABLE, + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, - GF_CD + GF_CD | GF_ALT_REGIONS }, + + // Return to Ringworld + { + { + "ringworld2", + "CD", + AD_ENTRY1s("r2rw.rlb", "df6c25622387007788ca36d99362c1f0", 47586928), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_CD | ADGF_UNSTABLE, + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) + }, + GType_Ringworld2, + GF_CD | GF_ALT_REGIONS + }, + { AD_TABLE_END_MARKER, 0, 0 } }; -} // End of namespace tSage +} // End of namespace TsAGE diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp index 86fbbc8e43..002835e76b 100644 --- a/engines/tsage/dialogs.cpp +++ b/engines/tsage/dialogs.cpp @@ -30,9 +30,9 @@ #include "tsage/dialogs.h" #include "tsage/staticres.h" #include "tsage/globals.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" -namespace tSage { +namespace TsAGE { /*--------------------------------------------------------------------------*/ @@ -64,16 +64,16 @@ MessageDialog::MessageDialog(const Common::String &message, const Common::String setDefaults(); // Set the dialog's center - setCenter(_globals->_dialogCenter.x, _globals->_dialogCenter.y); + setCenter(g_globals->_dialogCenter.x, g_globals->_dialogCenter.y); } int MessageDialog::show(const Common::String &message, const Common::String &btn1Message, const Common::String &btn2Message) { // Ensure that the cursor is the arrow - _globals->_events.setCursor(CURSOR_ARROW); + g_globals->_events.setCursor(CURSOR_ARROW); int result = show2(message, btn1Message, btn2Message); - _globals->_events.setCursorFromFlag(); + g_globals->_events.setCursorFromFlag(); return result; } @@ -109,186 +109,6 @@ ConfigDialog::ConfigDialog() : GUI::OptionsDialog("", "GlobalConfig") { /*--------------------------------------------------------------------------*/ -#define BUTTON_WIDTH 28 -#define BUTTON_HEIGHT 29 - -RightClickButton::RightClickButton(int buttonIndex, int xp, int yp) : GfxButton() { - _buttonIndex = buttonIndex; - this->_bounds.left = xp; - this->_bounds.top = yp; - this->_bounds.setWidth(BUTTON_WIDTH); - this->_bounds.setHeight(BUTTON_HEIGHT); - _savedButton = NULL; -} - -void RightClickButton::highlight() { - if (_savedButton) { - // Button was previously highlighted, so de-highlight by restoring saved area - _globals->gfxManager().copyFrom(*_savedButton, _bounds.left, _bounds.top); - delete _savedButton; - _savedButton = NULL; - } else { - // Highlight button by getting the needed highlighted image resource - _savedButton = Surface_getArea(_globals->gfxManager().getSurface(), _bounds); - - uint size; - byte *imgData = _resourceManager->getSubResource(7, 2, _buttonIndex, &size); - - GfxSurface btnSelected = surfaceFromRes(imgData); - _globals->gfxManager().copyFrom(btnSelected, _bounds.left, _bounds.top); - - DEALLOCATE(imgData); - } -} - -/*--------------------------------------------------------------------------*/ - -/** - * This dialog implements the right-click dialog - */ -RightClickDialog::RightClickDialog() : GfxDialog(), - _walkButton(1, 48, 12), _lookButton(2, 31, 29), _useButton(3, 65, 29), - _talkButton(4, 14, 47), _inventoryButton(5, 48, 47), _optionsButton(6, 83, 47) { - Rect rectArea, dialogRect; - - // Set the palette and change the cursor - _gfxManager.setDialogPalette(); - _globals->_events.setCursor(CURSOR_ARROW); - - // Get the dialog image - _surface = surfaceFromRes(7, 1, 1); - - // Set the dialog position - dialogRect.resize(_surface, 0, 0, 100); - dialogRect.center(_globals->_events._mousePos.x, _globals->_events._mousePos.y); - - // Ensure the dialog will be entirely on-screen - Rect screenRect = _globals->gfxManager()._bounds; - screenRect.collapse(4, 4); - dialogRect.contain(screenRect); - - _bounds = dialogRect; - _gfxManager._bounds = _bounds; - - _highlightedButton = NULL; - _selectedAction = -1; -} - -RightClickDialog::~RightClickDialog() { -} - -RightClickButton *RightClickDialog::findButton(const Common::Point &pt) { - RightClickButton *btnList[] = { &_walkButton, &_lookButton, &_useButton, &_talkButton, &_inventoryButton, &_optionsButton }; - - for (int i = 0; i < 6; ++i) { - btnList[i]->_owner = this; - - if (btnList[i]->_bounds.contains(pt)) - return btnList[i]; - } - - return NULL; -} - -void RightClickDialog::draw() { - // Save the covered background area - _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), _bounds); - - // Draw the dialog image - _globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top); -} - -bool RightClickDialog::process(Event &event) { - switch (event.eventType) { - case EVENT_MOUSE_MOVE: { - // Check whether a button is highlighted - RightClickButton *btn = findButton(event.mousePos); - - if (btn != _highlightedButton) { - // De-highlight any previously selected button - if (_highlightedButton) { - _highlightedButton->highlight(); - _highlightedButton = NULL; - } - if (btn) { - // Highlight the new button - btn->highlight(); - _highlightedButton = btn; - } - } - event.handled = true; - return true; - } - - case EVENT_BUTTON_DOWN: - // If a button is highlighted, then flag the selected button index - if (_highlightedButton) - _selectedAction = _highlightedButton->_buttonIndex; - else - _selectedAction = _lookButton._buttonIndex; - event.handled = true; - return true; - - default: - break; - } - - return false; -} - -void RightClickDialog::execute() { - // Draw the dialog - draw(); - - // Dialog event handler loop - _gfxManager.activate(); - - while (!_vm->getEventManager()->shouldQuit() && (_selectedAction == -1)) { - Event evt; - while (_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 - switch (_selectedAction) { - case 1: - // Look action - _globals->_events.setCursor(CURSOR_LOOK); - break; - case 2: - // Walk action - _globals->_events.setCursor(CURSOR_WALK); - break; - case 3: - // Use cursor - _globals->_events.setCursor(CURSOR_USE); - break; - case 4: - // Talk cursor - _globals->_events.setCursor(CURSOR_TALK); - break; - case 5: - // Inventory dialog - InventoryDialog::show(); - break; - case 6: - // Dialog options - OptionsDialog::show(); - break; - } - - _gfxManager.deactivate(); -} - -/*--------------------------------------------------------------------------*/ - void ModalDialog::draw() { // Set the palette for use in the dialog setPalette(); @@ -296,7 +116,7 @@ void ModalDialog::draw() { // Make a backup copy of the area the dialog will occupy Rect tempRect = _bounds; tempRect.collapse(-10, -10); - _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), tempRect); + _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), tempRect); _gfxManager.activate(); @@ -318,7 +138,7 @@ void ModalDialog::drawFrame() { _bounds.collapse(-10, -10); // Fill the dialog area - _globals->gfxManager().fillRect(origRect, 54); + g_globals->gfxManager().fillRect(origRect, 54); // Draw top line GfxSurface surface = surfaceFromRes(8, 1, 7); @@ -465,14 +285,14 @@ void InventoryDialog::execute() { bool lookFlag = false; _gfxManager.activate(); - while (!_vm->getEventManager()->shouldQuit()) { + while (!g_vm->shouldQuit()) { // Get events Event event; - while (!_globals->_events.getEvent(event) && !_vm->getEventManager()->shouldQuit()) { + while (!g_globals->_events.getEvent(event) && !g_vm->shouldQuit()) { g_system->delayMillis(10); g_system->updateScreen(); } - if (_vm->getEventManager()->shouldQuit()) + if (g_vm->shouldQuit()) break; hiliteObj = NULL; @@ -499,18 +319,18 @@ void InventoryDialog::execute() { if (hiliteObj == &_btnOk) { // Ok button clicked if (lookFlag) - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); break; } else if (hiliteObj == &_btnLook) { // Look button clicked if (_btnLook._message == LOOK_BTN_STRING) { _btnLook._message = PICK_BTN_STRING; lookFlag = 1; - _globals->_events.setCursor(CURSOR_LOOK); + g_globals->_events.setCursor(CURSOR_LOOK); } else { _btnLook._message = LOOK_BTN_STRING; lookFlag = 0; - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); } hiliteObj->draw(); @@ -518,7 +338,7 @@ void InventoryDialog::execute() { // Inventory item selected InvObject *invObject = static_cast<GfxInvImage *>(hiliteObj)->_invObject; if (lookFlag) { - _globals->_screenSurface.displayText(invObject->_description); + g_globals->_screenSurface.displayText(invObject->_description); } else { RING_INVENTORY._selectedItem = invObject; invObject->setCursor(); @@ -540,19 +360,20 @@ void OptionsDialog::show() { if (btn == &dlg->_btnQuit) { // Quit game if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) { - _vm->quitGame(); + g_vm->quitGame(); } } else if (btn == &dlg->_btnRestart) { // Restart game - _globals->_game->restartGame(); + g_globals->_game->restartGame(); } else if (btn == &dlg->_btnSound) { // Sound dialog + SoundDialog::execute(); } else if (btn == &dlg->_btnSave) { // Save button - _globals->_game->saveGame(); + g_globals->_game->saveGame(); } else if (btn == &dlg->_btnRestore) { // Restore button - _globals->_game->restoreGame(); + g_globals->_game->restoreGame(); } dlg->remove(); @@ -594,5 +415,14 @@ OptionsDialog::OptionsDialog() { setCenter(160, 100); } +/*--------------------------------------------------------------------------*/ + +void SoundDialog::execute() { + ConfigDialog *dlg = new ConfigDialog(); + dlg->runModal(); + delete dlg; + g_globals->_soundManager.syncSounds(); + g_globals->_events.setCursorFromFlag(); +} -} // End of namespace tSage +} // End of namespace TsAGE diff --git a/engines/tsage/dialogs.h b/engines/tsage/dialogs.h index a50307f775..35ed60ba1a 100644 --- a/engines/tsage/dialogs.h +++ b/engines/tsage/dialogs.h @@ -30,7 +30,7 @@ #include "common/rect.h" #include "common/system.h" -namespace tSage { +namespace TsAGE { class MessageDialog : public GfxDialog { public: @@ -49,35 +49,6 @@ public: ConfigDialog(); }; -class RightClickButton : public GfxButton { -private: - GfxSurface *_savedButton; -public: - int _buttonIndex; - - RightClickButton(int buttonIndex, int xp, int yp); - ~RightClickButton() { delete _savedButton; } - - virtual void highlight(); -}; - -class RightClickDialog : public GfxDialog { -private: - GfxSurface _surface; - RightClickButton *_highlightedButton; - int _selectedAction; - RightClickButton _walkButton, _lookButton, _useButton, _talkButton, _inventoryButton, _optionsButton; - - RightClickButton *findButton(const Common::Point &pt); -public: - RightClickDialog(); - ~RightClickDialog(); - - virtual void draw(); - virtual bool process(Event &event); - void execute(); -}; - /*--------------------------------------------------------------------------*/ class ModalDialog : public GfxDialog { @@ -128,6 +99,13 @@ public: static void show(); }; -} // End of namespace tSage +/*--------------------------------------------------------------------------*/ + +class SoundDialog { +public: + static void execute(); +}; + +} // End of namespace TsAGE #endif diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp index a24f65421b..073cbc35b9 100644 --- a/engines/tsage/events.cpp +++ b/engines/tsage/events.cpp @@ -31,7 +31,7 @@ #include "tsage/tsage.h" #include "tsage/globals.h" -namespace tSage { +namespace TsAGE { EventsClass::EventsClass() { _currentCursor = CURSOR_NONE; @@ -39,7 +39,8 @@ EventsClass::EventsClass() { _frameNumber = 0; _priorFrameTime = 0; _prevDelayFrame = 0; - _saver->addListener(this); + g_saver->addListener(this); + g_saver->addLoadNotifier(&EventsClass::loadNotifierProc); } bool EventsClass::pollEvent() { @@ -78,7 +79,7 @@ bool EventsClass::pollEvent() { void EventsClass::waitForPress(int eventMask) { Event evt; - while (!_vm->getEventManager()->shouldQuit() && !getEvent(evt, eventMask)) + while (!g_vm->shouldQuit() && !getEvent(evt, eventMask)) g_system->delayMillis(10); } @@ -86,7 +87,7 @@ void EventsClass::waitForPress(int eventMask) { * Standard event retrieval, which only returns keyboard and mouse clicks */ bool EventsClass::getEvent(Event &evt, int eventMask) { - while (pollEvent() && !_vm->getEventManager()->shouldQuit()) { + while (pollEvent() && !g_vm->shouldQuit()) { evt.handled = false; evt.eventType = EVENT_NONE; evt.mousePos = _event.mouse; @@ -142,43 +143,76 @@ void EventsClass::setCursor(CursorType cursorType) { return; _lastCursor = cursorType; - _globals->clearFlag(122); + g_globals->clearFlag(122); CursorMan.showMouse(true); const byte *cursor; bool delFlag = true; uint size; + bool questionEnabled = false; switch (cursorType) { case CURSOR_NONE: // No cursor - _globals->setFlag(122); + g_globals->setFlag(122); - if (_vm->getFeatures() & GF_DEMO) { + if ((g_vm->getFeatures() & GF_DEMO) || (g_vm->getGameID() != GType_Ringworld)) { CursorMan.showMouse(false); return; } - cursor = _resourceManager->getSubResource(4, 1, 6, &size); + cursor = g_resourceManager->getSubResource(4, 1, 6, &size); break; case CURSOR_LOOK: // Look cursor - cursor = _resourceManager->getSubResource(4, 1, 5, &size); + if (g_vm->getGameID() == GType_BlueForce) { + cursor = g_resourceManager->getSubResource(1, 5, 3, &size); + } else if (g_vm->getGameID() == GType_Ringworld2) { + cursor = g_resourceManager->getSubResource(5, 1, 5, &size); + } else { + cursor = g_resourceManager->getSubResource(4, 1, 5, &size); + } _currentCursor = CURSOR_LOOK; break; case CURSOR_USE: // Use cursor - cursor = _resourceManager->getSubResource(4, 1, 4, &size); + if (g_vm->getGameID() == GType_BlueForce) { + cursor = g_resourceManager->getSubResource(1, 5, 2, &size); + } else if (g_vm->getGameID() == GType_Ringworld2) { + cursor = g_resourceManager->getSubResource(5, 1, 4, &size); + } else { + cursor = g_resourceManager->getSubResource(4, 1, 4, &size); + } _currentCursor = CURSOR_USE; break; case CURSOR_TALK: // Talk cursor - cursor = _resourceManager->getSubResource(4, 1, 3, &size); + if (g_vm->getGameID() == GType_BlueForce) { + cursor = g_resourceManager->getSubResource(1, 5, 4, &size); + } else if (g_vm->getGameID() == GType_Ringworld2) { + cursor = g_resourceManager->getSubResource(5, 1, 6, &size); + } else { + cursor = g_resourceManager->getSubResource(4, 1, 3, &size); + } _currentCursor = CURSOR_TALK; break; + case CURSOR_EXIT: + // Exit cursor (Blue Force) + assert(g_vm->getGameID() == GType_BlueForce); + cursor = g_resourceManager->getSubResource(1, 5, 7, &size); + _currentCursor = CURSOR_EXIT; + break; + + case CURSOR_PRINTER: + // Printer cursor (Blue Force) + assert(g_vm->getGameID() == GType_BlueForce); + cursor = g_resourceManager->getSubResource(1, 7, 6, &size); + _currentCursor = CURSOR_PRINTER; + break; + case CURSOR_ARROW: // Arrow cursor cursor = CURSOR_ARROW_DATA; @@ -187,10 +221,22 @@ void EventsClass::setCursor(CursorType cursorType) { case CURSOR_WALK: default: - // Walk cursor - cursor = CURSOR_WALK_DATA; - _currentCursor = CURSOR_WALK; - delFlag = false; + if (g_vm->getGameID() == GType_BlueForce) { + if (cursorType == CURSOR_WALK) { + cursor = g_resourceManager->getSubResource(1, 5, 1, &size); + } else { + // Inventory icon + cursor = g_resourceManager->getSubResource(10, ((int)cursorType - 1) / 20 + 1, + ((int)cursorType - 1) % 20 + 1, &size); + questionEnabled = true; + } + _currentCursor = cursorType; + } else { + // For Ringworld, always treat as the walk cursor + cursor = CURSOR_WALK_DATA; + _currentCursor = CURSOR_WALK; + delFlag = false; + } break; } @@ -204,6 +250,10 @@ void EventsClass::setCursor(CursorType cursorType) { if (delFlag) DEALLOCATE(cursor); + + // For Blue Force, enable the question button when an inventory icon is selected + if (g_vm->getGameID() == GType_BlueForce) + T2_GLOBALS._uiElements._question.setEnabled(questionEnabled); } void EventsClass::pushCursor(CursorType cursorType) { @@ -214,22 +264,22 @@ void EventsClass::pushCursor(CursorType cursorType) { switch (cursorType) { case CURSOR_NONE: // No cursor - cursor = _resourceManager->getSubResource(4, 1, 6, &size); + cursor = g_resourceManager->getSubResource(4, 1, 6, &size); break; case CURSOR_LOOK: // Look cursor - cursor = _resourceManager->getSubResource(4, 1, 5, &size); + cursor = g_resourceManager->getSubResource(4, 1, 5, &size); break; case CURSOR_USE: // Use cursor - cursor = _resourceManager->getSubResource(4, 1, 4, &size); + cursor = g_resourceManager->getSubResource(4, 1, 4, &size); break; case CURSOR_TALK: // Talk cursor - cursor = _resourceManager->getSubResource(4, 1, 3, &size); + cursor = g_resourceManager->getSubResource(4, 1, 3, &size); break; case CURSOR_ARROW: @@ -269,6 +319,17 @@ void EventsClass::setCursor(Graphics::Surface &cursor, int transColor, const Com _currentCursor = cursorId; } +void EventsClass::setCursor(GfxSurface &cursor) { + // TODO: Find proper parameters for this form in Blue Force + Graphics::Surface s = cursor.lockSurface(); + + const byte *cursorData = (const byte *)s.getBasePtr(0, 0); + CursorMan.replaceCursor(cursorData, cursor.getBounds().width(), cursor.getBounds().height(), + cursor._centroid.x, cursor._centroid.y, cursor._transColor); + + _lastCursor = CURSOR_NONE; +} + void EventsClass::setCursorFromFlag() { setCursor(isCursorVisible() ? _currentCursor : CURSOR_NONE); } @@ -277,12 +338,14 @@ void EventsClass::showCursor() { setCursor(_currentCursor); } -void EventsClass::hideCursor() { +CursorType EventsClass::hideCursor() { + CursorType oldCursor = _currentCursor; setCursor(CURSOR_NONE); + return oldCursor; } bool EventsClass::isCursorVisible() const { - return !_globals->getFlag(122); + return !g_globals->getFlag(122); } /** @@ -315,4 +378,13 @@ void EventsClass::listenerSynchronize(Serializer &s) { } } -} // end of namespace tSage +void EventsClass::loadNotifierProc(bool postFlag) { + if (postFlag) { + if (g_globals->_events._lastCursor == CURSOR_NONE) + g_globals->_events._lastCursor = g_globals->_events._currentCursor; + else + g_globals->_events._lastCursor = CURSOR_NONE; + } +} + +} // end of namespace TsAGE diff --git a/engines/tsage/events.h b/engines/tsage/events.h index a13455d378..874020f140 100644 --- a/engines/tsage/events.h +++ b/engines/tsage/events.h @@ -29,7 +29,7 @@ #include "graphics/surface.h" #include "tsage/saveload.h" -namespace tSage { +namespace TsAGE { enum EventType {EVENT_NONE = 0, EVENT_BUTTON_DOWN = 1, EVENT_BUTTON_UP = 2, EVENT_KEYPRESS = 4, EVENT_MOUSE_MOVE = 8}; @@ -37,6 +37,7 @@ enum EventType {EVENT_NONE = 0, EVENT_BUTTON_DOWN = 1, EVENT_BUTTON_UP = 2, EVEN enum ButtonShiftFlags {BTNSHIFT_LEFT = 0, BTNSHIFT_RIGHT = 3, BTNSHIFT_MIDDLE = 4}; // Intrinisc game delay between execution frames. This runs at 60Hz +#define GAME_FRAME_RATE 60 #define GAME_FRAME_TIME (1000 / 60) class GfxManager; @@ -53,6 +54,7 @@ public: }; enum CursorType { + // Ringworld objects OBJECT_STUNNER = 0, OBJECT_SCANNER = 1, OBJECT_STASIS_BOX = 2, OBJECT_INFODISK = 3, OBJECT_STASIS_NEGATOR = 4, OBJECT_KEY_DEVICE = 5, OBJECT_MEDKIT = 6, OBJECT_LADDER = 7, OBJECT_ROPE = 8, OBJECT_KEY = 9, OBJECT_TRANSLATOR = 10, OBJECT_ALE = 11, @@ -62,10 +64,42 @@ enum CursorType { OBJECT_NULLIFIER = 25, OBJECT_PEG = 26, OBJECT_VIAL = 27, OBJECT_JACKET = 28, OBJECT_TUNIC2 = 29, OBJECT_BONE = 30, OBJECT_EMPTY_JAR = 31, OBJECT_JAR = 32, + // Blue Force objects + INV_NONE = 0, INV_COLT45 = 1, INV_AMMO_CLIP = 2, INV_SPARE_CLIP = 3, INV_HANDCUFFS = 4, + INV_GREENS_GUN = 5, INV_TICKET_BOOK = 6, INV_MIRANDA_CARD = 7, INV_FOREST_RAP = 8, + INV_GREEN_ID = 9, INV_BASEBALL_CARD = 10, INV_BOOKING_GREEN = 11, INV_FLARE = 12, + INV_COBB_RAP = 13, INV_22_BULLET = 14, INV_AUTO_RIFLE = 15, INV_WIG = 16, INV_FRANKIE_ID = 17, + INV_TYRONE_ID = 18, INV_22_SNUB = 19, INV_BOOKING_FRANKIE = 21, INV_BOOKING_GANG = 22, + INV_FBI_TELETYPE = 23, INV_DA_NOTE = 24, INV_PRINT_OUT = 25, INV_WAREHOUSE_KEYS = 26, + INV_CENTER_PUNCH = 27, INV_TRANQ_GUN = 28, INV_HOOK = 29, INV_RAGS = 30, INV_JAR = 31, + INV_SCREWDRIVER = 32, INV_D_FLOPPY = 33, INV_BLANK_DISK = 34, INV_STICK = 35, + INV_CRATE1 = 36, INV_CRATE2 = 37, INV_SHOEBOX = 38, INV_BADGE = 39, INV_RENTAL_COUPON = 41, + INV_NICKEL = 42, INV_LYLE_CARD = 43, INV_CARTER_NOTE = 44, INV_MUG_SHOT = 45, + INV_CLIPPING = 46, INV_MICROFILM = 47, INV_WAVE_KEYS = 48, INV_RENTAL_KEYS = 49, + INV_NAPKIN = 50, INV_DMV_PRINTOUT = 51, INV_FISHING_NET = 52, INV_ID = 53, + INV_9MM_BULLETS = 54, INV_SCHEDULE = 55, INV_GRENADES = 56, INV_YELLOW_CORD = 57, + INV_HALF_YELLOW_CORD = 58, INV_BLACK_CORD = 59, INV_HALF_BLACK_CORD = 61, INV_WARRANT = 62, + INV_JACKET = 63, INV_GREENS_KNIFE = 64, INV_DOG_WHISTLE = 65, INV_AMMO_BELT = 66, + INV_CARAVAN_KEY = 67, BF_LAST_INVENT = 68, + + // Ringworld 2 objects + R2_1 = 1, R2_2 = 2, R2_3 = 3, R2_STEPPING_DISKS = 4, R2_5 = 5, R2_6 = 6, R2_7 = 7, + R2_8 = 8, R2_9 = 9, R2_10 = 10, R2_11 = 11, R2_12 = 12, R2_13 = 13, R2_14 = 14, + R2_15 = 15, R2_16 = 16, R2_17 = 17, R2_18 = 18, R2_19 = 19, R2_20 = 20, R2_21 = 21, + R2_22 = 22, R2_23 = 23, R2_24 = 24, R2_25 = 25, R2_26 = 26, R2_27 = 27, R2_28 = 28, + R2_29 = 29, R2_30 = 30, R2_31 = 31, R2_32 = 32, R2_33 = 33, R2_34 = 34, R2_35 = 35, + R2_36 = 36, R2_37 = 37, R2_38 = 38, R2_39 = 39, R2_40 = 40, R2_41 = 41, R2_42 = 42, + R2_43 = 43, R2_44 = 44, R2_45 = 45, R2_46 = 46, R2_47 = 47, R2_48 = 48, R2_49 = 49, + R2_50 = 50, R2_51 = 51, R2_52 = 52, + + // Cursors CURSOR_WALK = 0x100, CURSOR_LOOK = 0x200, CURSOR_700 = 700, CURSOR_USE = 0x400, CURSOR_TALK = 0x800, + CURSOR_1000 = 0x1000, CURSOR_PRINTER = 0x4000, CURSOR_EXIT = 0x7004, CURSOR_9999 = 9999, CURSOR_NONE = -1, CURSOR_CROSSHAIRS = -2, CURSOR_ARROW = -3 }; +class GfxSurface; + class EventsClass : public SaveListener { private: Common::Event _event; @@ -83,10 +117,11 @@ public: void pushCursor(CursorType cursorType); void popCursor(); void setCursor(Graphics::Surface &cursor, int transColor, const Common::Point &hotspot, CursorType cursorId); + void setCursor(GfxSurface &cursor); void setCursorFromFlag(); CursorType getCursor() const { return _currentCursor; } void showCursor(); - void hideCursor(); + CursorType hideCursor(); bool isCursorVisible() const; bool pollEvent(); @@ -97,10 +132,13 @@ public: Common::EventType type() { return _event.type; } uint32 getFrameNumber() const { return _frameNumber; } void delay(int numFrames); + bool isInventoryIcon() const { return _currentCursor < 256; } + void proc1() { warning("TODO: EventsClass::proc1"); } virtual void listenerSynchronize(Serializer &s); + static void loadNotifierProc(bool postFlag); }; -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index 34b26ec311..7711e7fba7 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -22,14 +22,15 @@ #include "tsage/globals.h" #include "tsage/tsage.h" -#include "tsage/blueforce_logic.h" -#include "tsage/ringworld_demo.h" -#include "tsage/ringworld_logic.h" +#include "tsage/blue_force/blueforce_logic.h" +#include "tsage/ringworld/ringworld_demo.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/ringworld2/ringworld2_logic.h" -namespace tSage { +namespace TsAGE { -Globals *_globals = NULL; -ResourceManager *_resourceManager = NULL; +Globals *g_globals = NULL; +ResourceManager *g_resourceManager = NULL; /*--------------------------------------------------------------------------*/ @@ -51,12 +52,12 @@ static SavedObject *classFactoryProc(const Common::String &className) { /*--------------------------------------------------------------------------*/ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface), - _randomSource("tsage"), _unkColor1(0), _unkColor2(255), _unkColor3(255) { + _randomSource("tsage"), _color1(0), _color2(255), _color3(255) { reset(); _stripNum = 0; _gfxEdgeAdjust = 3; - if (_vm->getFeatures() & GF_DEMO) { + if (g_vm->getFeatures() & GF_DEMO) { _gfxFontNumber = 0; _gfxColors.background = 6; _gfxColors.foreground = 0; @@ -64,18 +65,34 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface _fontColors.foreground = 6; _dialogCenter.y = 80; // Workaround in order to use later version of the engine - _unkColor1 = _gfxColors.foreground; - _unkColor2 = _gfxColors.foreground; - _unkColor3 = _gfxColors.foreground; - } else if ((_vm->getGameID() == GType_Ringworld) && (_vm->getFeatures() & GF_CD)) { + _color1 = _gfxColors.foreground; + _color2 = _gfxColors.foreground; + _color3 = _gfxColors.foreground; + } else if (g_vm->getGameID() == GType_BlueForce) { + // Blue Force + _gfxFontNumber = 0; + _gfxColors.background = 89; + _gfxColors.foreground = 83; + _fontColors.background = 88; + _fontColors.foreground = 92; + _dialogCenter.y = 140; + } else if (g_vm->getGameID() == GType_Ringworld2) { + // Return to Ringworld + _gfxFontNumber = 2; + _gfxColors.background = 89; + _gfxColors.foreground = 83; + _fontColors.background = 88; + _fontColors.foreground = 92; + _dialogCenter.y = 140; + } else if ((g_vm->getGameID() == GType_Ringworld) && (g_vm->getFeatures() & GF_CD)) { _gfxFontNumber = 50; _gfxColors.background = 53; _gfxColors.foreground = 0; _fontColors.background = 51; _fontColors.foreground = 54; - _unkColor1 = 18; - _unkColor2 = 18; - _unkColor3 = 18; + _color1 = 18; + _color2 = 18; + _color3 = 18; } else { _gfxFontNumber = 50; _gfxColors.background = 53; @@ -83,9 +100,9 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface _fontColors.background = 51; _fontColors.foreground = 54; // Workaround in order to use later version of the engine - _unkColor1 = _gfxColors.foreground; - _unkColor2 = _gfxColors.foreground; - _unkColor3 = _gfxColors.foreground; + _color1 = _gfxColors.foreground; + _color2 = _gfxColors.foreground; + _color3 = _gfxColors.foreground; } _screenSurface.setScreenSurface(); _gfxManagers.push_back(&_gfxManagerInstance); @@ -100,31 +117,42 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface _scrollFollower = NULL; _inventory = NULL; - switch (_vm->getGameID()) { + switch (g_vm->getGameID()) { case GType_Ringworld: - if (!(_vm->getFeatures() & GF_DEMO)) { - _inventory = new RingworldInvObjectList(); - _game = new RingworldGame(); + if (!(g_vm->getFeatures() & GF_DEMO)) { + _inventory = new Ringworld::RingworldInvObjectList(); + _game = new Ringworld::RingworldGame(); } else { - _game = new RingworldDemoGame(); + _game = new Ringworld::RingworldDemoGame(); } + _sceneHandler = new SceneHandler(); break; case GType_BlueForce: - _game = new BlueForceGame(); + _game = new BlueForce::BlueForceGame(); + _inventory = new BlueForce::BlueForceInvObjectList(); + _sceneHandler = new BlueForce::SceneHandlerExt(); + break; + + case GType_Ringworld2: + _inventory = new Ringworld2::Ringworld2InvObjectList(); + _game = new Ringworld2::Ringworld2Game(); + _sceneHandler = new SceneHandler(); break; } } Globals::~Globals() { + _scenePalette.clearListeners(); delete _inventory; + delete _sceneHandler; delete _game; - _globals = NULL; + g_globals = NULL; } void Globals::reset() { Common::set_to(&_flags[0], &_flags[MAX_FLAGS], false); - _saver->addFactory(classFactoryProc); + g_saver->addFactory(classFactoryProc); } void Globals::synchronize(Serializer &s) { @@ -142,9 +170,9 @@ void Globals::synchronize(Serializer &s) { s.syncAsSint32LE(_fontColors.foreground); if (s.getVersion() >= 4) { - s.syncAsByte(_unkColor1); - s.syncAsByte(_unkColor2); - s.syncAsByte(_unkColor3); + s.syncAsByte(_color1); + s.syncAsByte(_color2); + s.syncAsByte(_color3); } s.syncAsSint16LE(_dialogCenter.x); s.syncAsSint16LE(_dialogCenter.y); @@ -166,5 +194,175 @@ void Globals::dispatchSounds() { Common::for_each(_sounds.begin(), _sounds.end(), Globals::dispatchSound); } +/*--------------------------------------------------------------------------*/ + +void TsAGE2Globals::reset() { + Globals::reset(); + + // Reset the inventory + T2_GLOBALS._uiElements.updateInventory(); + T2_GLOBALS._uiElements._scoreValue = 0; + T2_GLOBALS._uiElements._active = false; +} + +/*--------------------------------------------------------------------------*/ + +namespace BlueForce { + +BlueForceGlobals::BlueForceGlobals(): TsAGE2Globals() { +} + +void BlueForceGlobals::synchronize(Serializer &s) { + Globals::synchronize(s); + + s.syncAsSint16LE(_dayNumber); + s.syncAsSint16LE(_v4CEA4); + s.syncAsSint16LE(_v4CEAA); + s.syncAsSint16LE(_marinaWomanCtr); + s.syncAsSint16LE(_v4CEB0); + s.syncAsSint16LE(_v4CEB6); + s.syncAsSint16LE(_safeCombination); + s.syncAsSint16LE(_v4CEC0); + s.syncAsSint16LE(_greenDay5TalkCtr); + s.syncAsSint16LE(_v4CEC4); + s.syncAsSint16LE(_v4CEC8); + s.syncAsSint16LE(_v4CECA); + s.syncAsSint16LE(_v4CECC); + for (int i = 0; i < 18; i++) + s.syncAsByte(_v4CECE[i]); + s.syncAsSint16LE(_v4CEE0); + s.syncAsSint16LE(_v4CEE2); + s.syncAsSint16LE(_v4CEE4); + s.syncAsSint16LE(_v4CEE6); + s.syncAsSint16LE(_v4CEE8); + s.syncAsSint16LE(_deziTopic); + s.syncAsSint16LE(_deathReason); + s.syncAsSint16LE(_driveFromScene); + s.syncAsSint16LE(_driveToScene); + s.syncAsSint16LE(_v501F8); + s.syncAsSint16LE(_v501FA); + s.syncAsSint16LE(_v501FC); + s.syncAsSint16LE(_v5020C); + s.syncAsSint16LE(_v50696); + s.syncAsSint16LE(_v5098C); + s.syncAsSint16LE(_v5098D); + s.syncAsSint16LE(_v50CC2); + s.syncAsSint16LE(_v50CC4); + s.syncAsSint16LE(_v50CC6); + s.syncAsSint16LE(_v50CC8); + s.syncAsSint16LE(_v51C42); + s.syncAsSint16LE(_v51C44); + s.syncAsSint16LE(_interfaceY); + s.syncAsSint16LE(_bookmark); + s.syncAsSint16LE(_mapLocationId); + s.syncAsSint16LE(_clip1Bullets); + s.syncAsSint16LE(_clip2Bullets); +} + +void BlueForceGlobals::reset() { + TsAGE2Globals::reset(); + _scenePalette.clearListeners(); + + _scrollFollower = &_player; + _bookmark = bNone; + + // Reset the inventory + ((BlueForceInvObjectList *)_inventory)->reset(); + + _mapLocationId = 1; + _driveFromScene = 300; + _driveToScene = 0; + + _interfaceY = UI_INTERFACE_Y; + _dayNumber = 0; + _v4CEA4 = 0; + _v4CEAA = 0; + _marinaWomanCtr = 0; + _v4CEB0 = 0; + _v4CEB6 = 0; + _safeCombination = 0; + _v4CEC0 = 0; + _greenDay5TalkCtr = 0; + _v4CEC4 = 0; + _v4CEC8 = 1; + _v4CECA = 0; + _v4CECC = 0; + _v4CECE[0] = 2; + _v4CECE[1] = 2; + _v4CECE[2] = 2; + _v4CECE[3] = 1; + _v4CECE[4] = 2; + _v4CECE[5] = 2; + _v4CECE[6] = 2; + _v4CECE[7] = 2; + _v4CECE[8] = 2; + _v4CECE[9] = 2; + _v4CECE[10] = 2; + _v4CECE[11] = 2; + _v4CECE[12] = 1; + _v4CECE[13] = 1; + _v4CECE[14] = 2; + _v4CECE[15] = 2; + _v4CECE[16] = 3; + _v4CECE[17] = 0; + _v4CEE0 = 0; + _v4CEE2 = 0; + _v4CEE4 = 0; + _v4CEE6 = 0; + _v4CEE8 = 0; + _deziTopic = 0; + _deathReason = 0; + _v501F8 = 0; + _v501FA = 0; + _v501FC = 0; + _v5020C = 0; + _v50696 = 0; + _v5098C = 0; + _v5098D = 0; + _v50CC2 = 0; + _v50CC4 = 0; + _v50CC6 = 0; + _v50CC8 = 0; + _v51C42 = 0; + _v51C44 = 1; + _clip1Bullets = 8; + _clip2Bullets = 8; +} + +bool BlueForceGlobals::getHasBullets() { + if (!getFlag(fGunLoaded)) + return false; + return BF_GLOBALS.getFlag(fLoadedSpare) ? (_clip2Bullets > 0) : (_clip1Bullets > 0); +} + +void BlueForceGlobals::set2Flags(int flagNum) { + if (!getFlag(flagNum + 1)) { + setFlag(flagNum + 1); + setFlag(flagNum); + } +} + +bool BlueForceGlobals::removeFlag(int flagNum) { + bool result = getFlag(flagNum); + clearFlag(flagNum); + return result; +} + +} // end of namespace BlueForce + +namespace Ringworld2 { + +void Ringworld2Globals::reset() { + Globals::reset(); + + // Reset the inventory + R2_INVENTORY.reset(); + T2_GLOBALS._uiElements.updateInventory(); + T2_GLOBALS._uiElements._active = false; +} + + + +} // end of namespace Ringworld2 -} // end of namespace tSage +} // end of namespace TsAGE diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index 7cfec718e2..a5293a5ad1 100644 --- a/engines/tsage/globals.h +++ b/engines/tsage/globals.h @@ -30,8 +30,9 @@ #include "tsage/events.h" #include "tsage/sound.h" #include "tsage/saveload.h" +#include "tsage/user_interface.h" -namespace tSage { +namespace TsAGE { class Globals : public SavedObject { private: @@ -40,7 +41,7 @@ public: GfxSurface _screenSurface; GfxManager _gfxManagerInstance; Common::List<GfxManager *> _gfxManagers; - SceneHandler _sceneHandler; + SceneHandler *_sceneHandler; Game *_game; EventsClass _events; SceneManager _sceneManager; @@ -54,7 +55,7 @@ public: int _gfxFontNumber; GfxColors _gfxColors; GfxColors _fontColors; - byte _unkColor1, _unkColor2, _unkColor3; + byte _color1, _color2, _color3; SoundManager _soundManager; Common::Point _dialogCenter; WalkRegions _walkRegions; @@ -76,7 +77,6 @@ public: Globals(); ~Globals(); - void reset(); void setFlag(int flagNum) { assert((flagNum >= 0) && (flagNum < MAX_FLAGS)); _flags[flagNum] = true; @@ -93,15 +93,160 @@ public: GfxManager &gfxManager() { return **_gfxManagers.begin(); } virtual Common::String getClassName() { return "Globals"; } virtual void synchronize(Serializer &s); + virtual void reset(); + void dispatchSounds(); }; -extern Globals *_globals; +typedef bool (*SelectItemProc)(int objectNumber); + +/** + * The following class represents common globals that were introduced after the release of Ringworld. + */ +class TsAGE2Globals: public Globals { +public: + UIElements _uiElements; + SelectItemProc _onSelectItem; + int _interfaceY; + + TsAGE2Globals() { _onSelectItem = NULL; } + virtual void reset(); +}; + +extern Globals *g_globals; -// Note: Currently this can't be part of the _globals structure, since it needs to be constructed +#define GLOBALS (*::TsAGE::g_globals) +#define T2_GLOBALS (*((::TsAGE::TsAGE2Globals *)g_globals)) +#define BF_GLOBALS (*((::TsAGE::BlueForce::BlueForceGlobals *)g_globals)) +#define R2_GLOBALS (*((::TsAGE::Ringworld2::Ringworld2Globals *)g_globals)) + +// Note: Currently this can't be part of the g_globals structure, since it needs to be constructed // prior to many of the fields in Globals execute their constructors -extern ResourceManager *_resourceManager; +extern ResourceManager *g_resourceManager; + + +namespace BlueForce { + +using namespace TsAGE; + +enum Bookmark { + bNone, + bStartOfGame, bCalledToDomesticViolence, bArrestedGreen, bLauraToParamedics, + bBookedGreen, bStoppedFrankie, bBookedFrankie, bBookedFrankieEvidence, + bEndOfWorkDayOne, bTalkedToGrannyAboutSkipsCard, bLyleStoppedBy, bEndDayOne, + bInspectionDone, bCalledToDrunkStop, bArrestedDrunk, bEndDayTwo, + bFlashBackOne, bFlashBackTwo, bFlashBackThree, bDroppedOffLyle, bEndDayThree, + bDoneWithIsland, bDoneAtLyles, bEndDayFour, bInvestigateBoat, bFinishedWGreen, + bAmbushed, bAmbushOver, bEndOfGame +}; + +enum Flag { + JAKE_FILE_COPIED, gunClean, onBike, onDuty, fShowedIdToKate, fLateToMarina, + fCalledBackup, fWithLyle, gunDrawn, fBackupArrived340, fBriefedBackup, + fGotAllSkip340, fToldToLeave340, fBackupIn350, fNetInBoat, fForbesWaiting, + fWithCarter, fTalkedToTony, fMugOnKate, takenWeasel, gotTrailer450, + showEugeneNapkin, showRapEugene, fMgrCallsWeasel, fCarterMetLyle, + fGunLoaded, fLoadedSpare, showEugeneID, fRandomShot350, examinedFile810, + shownLyleCrate1, shownLyleRapsheet, shownLyleDisk, shownLylePO, + fCanDrawGun, fGotAutoWeapon, fGotBulletsFromDash, fShotSuttersDesk, + greenTaken, fLateToDrunkStop, didDrunk, fSearchedTruck, seenFolder, + showMugAround, frankInJail, fTalkedCarterDay3, fDecryptedBluePrints, + fTalkedToDrunkInCar, fToldLyleOfSchedule, fTalkedShooterNoBkup, + fTalkedDriverNoBkup, fDriverOutOfTruck, readGreenRights, readFrankRights, + talkedToHarrisAboutDrunk, unlockBoat, fShootGoon, fBlowUpGoon, + fTalkedToBarry, fTalkedToLarry, fLeftTraceIn920, fLeftTraceIn900, + fBackupAt340, fShotNicoIn910, fGotPointsForTktBook, fGotPointsForMCard, + fShowedBluePrint, fGotPointsForPunch, fGotPointsForBox, fGotPointsForBank, + fGotPointsForCombo, fGotPointsForCoin, fGotPointsForCPU, fGotPointsForBoots, + fGotPointsForCrate, fGotPointsForBlackCord, fGotPointsForGeneratorPlug, + fGotPointsForFuseBoxPlug, fGotPointsForStartGenerator, fGotPointsForLightsOn, + fGotPointsForOpeningDoor, fGotPointsForClosingDoor, fGotPointsForLightsOff, + fGotPointsForGeneratorOff, fGotPointsForCordOnForklift, fGotPointsForCuffingNico, + fGotPointsForCuffingDA, fGotPointsForSearchingNico, fGotPointsForSearchingDA, + fLeftTraceIn910, fBookedGreenEvidence, fGotPointsForCleaningGun, + fGotPointsForMemo, fGotPointsForFBI, fTookTrailerAmmo, fAlertedGreen355, + fGotGreen355fTalkedToGrannyDay3, shownFax, beenToJRDay2, shownLyleCrate1Day1, + fLyleOnIsland, iWasAmbushed, fGangInCar, fArrivedAtGangStop, ticketVW, + f1015Marina, fCan1015Marina, f1015Frankie, fCan1015Frankie, f1015Drunk, + fCan1015Drunk, f1027Marina, fCan1027Marina, f1027Frankie, fCan1027Frankie, + f1027Drunk, fCan1027Drunk, f1035Marina, fCan1035Marina, f1035Frankie, + fCan1035Frankie, f1035Drunk, fCan1035Drunk, f1097Marina, fCan1097Marina, + f1097Frankie, fCan1097Frankie, f1097Drunk, fCan1097Drunk, f1098Marina, + fCan1098Marina, f1098Frankie, fCan1098Frankie, f1098Drunk, fCan1098Drunk, + fCuffedFrankie, fGotPointsForTrapDog, fGotPointsForUnlockGate, + fGotPointsForUnlockWarehouse, fGotPointsForLockWarehouse, fGotPointsForLockGate, + fGotPointsForFreeDog, fGotPointsForWhistleDog, fGivenNapkin, fCan1004Marina, + fCan1004Drunk, fHasLeftDrunk, fHasDrivenFromDrunk, fCrateOpen, fSawGuns, + hookPoints +}; + +class BlueForceGlobals: public TsAGE2Globals { +public: + ASoundExt _sound1, _sound2, _sound3; + StripProxy _stripProxy; + int _dayNumber; + int _v4CEA4; + int _v4CEAA; + int _marinaWomanCtr; + int _v4CEB0; + int _v4CEB6; + int _safeCombination; + int _v4CEC0; + int _greenDay5TalkCtr; + int _v4CEC4; + int _v4CEC8; + int _v4CECA; + int _v4CECC; + int8 _v4CECE[18]; + int _v4CEE0; + int _v4CEE2; + int _v4CEE4; + int _v4CEE6; + int _v4CEE8; + int _deziTopic; + int _deathReason; + int _driveFromScene; + int _driveToScene; + int _v501F8; + int _v501FA; + int _v501FC; + int _v5020C; + int _v50696; + uint8 _v5098C; + uint8 _v5098D; + int _v50CC2; + int _v50CC4; + int _v50CC6; + int _v50CC8; + int _v51C42; + int _v51C44; + Bookmark _bookmark; + int _mapLocationId; + int _clip1Bullets, _clip2Bullets; + + BlueForceGlobals(); + bool getHasBullets(); + + virtual Common::String getClassName() { return "BFGlobals"; } + virtual void synchronize(Serializer &s); + virtual void reset(); + void set2Flags(int flagNum); + bool removeFlag(int flagNum); +}; + +} // End of namespace BlueForce + +namespace Ringworld2 { + +class Ringworld2Globals: public TsAGE2Globals { +public: + ASoundExt _sound1, _sound2, _sound3, _sound4; + + virtual void reset(); +}; + +} // End of namespace Ringworld2 -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index 1d432724dc..4b2da0b456 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -30,7 +30,7 @@ #include "graphics/surface.h" #include "tsage/globals.h" -namespace tSage { +namespace TsAGE { /** * Creates a new graphics surface with the specified area of another surface @@ -120,7 +120,7 @@ GfxSurface surfaceFromRes(const byte *imgData) { GfxSurface surfaceFromRes(int resNum, int rlbNum, int subNum) { uint size; - byte *imgData = _resourceManager->getSubResource(resNum, rlbNum, subNum, &size); + byte *imgData = g_resourceManager->getSubResource(resNum, rlbNum, subNum, &size); GfxSurface surface = surfaceFromRes(imgData); DEALLOCATE(imgData); @@ -202,8 +202,8 @@ void Rect::resize(const GfxSurface &surface, int xp, int yp, int percent) { * Expands the pane region to contain the specified Rect */ void Rect::expandPanes() { - _globals->_paneRegions[0].uniteRect(*this); - _globals->_paneRegions[1].uniteRect(*this); + g_globals->_paneRegions[0].uniteRect(*this); + g_globals->_paneRegions[1].uniteRect(*this); } /** @@ -326,7 +326,7 @@ void GfxSurface::synchronize(Serializer &s) { s.syncAsSint16LE(zero); } } else { - int w, h; + int w = 0, h = 0; s.syncAsSint16LE(w); s.syncAsSint16LE(h); @@ -408,7 +408,7 @@ bool GfxSurface::displayText(const Common::String &msg, const Common::Point &pt) // Write for a mouse or keypress Event event; - while (!_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !_vm->getEventManager()->shouldQuit()) + while (!g_globals->_events.getEvent(event, EVENT_BUTTON_DOWN | EVENT_KEYPRESS) && !g_vm->shouldQuit()) ; // Restore the display area @@ -423,15 +423,15 @@ bool GfxSurface::displayText(const Common::String &msg, const Common::Point &pt) * Loads a quarter of a screen from a resource */ void GfxSurface::loadScreenSection(Graphics::Surface &dest, int xHalf, int yHalf, int xSection, int ySection) { - int screenNum = _globals->_sceneManager._scene->_activeScreenNumber; + int screenNum = g_globals->_sceneManager._scene->_activeScreenNumber; Rect updateRect(0, 0, 160, 100); updateRect.translate(xHalf * 160, yHalf * 100); - int xHalfCount = (_globals->_sceneManager._scene->_backgroundBounds.right + 159) / 160; - int yHalfCount = (_globals->_sceneManager._scene->_backgroundBounds.bottom + 99) / 100; + int xHalfCount = (g_globals->_sceneManager._scene->_backgroundBounds.right + 159) / 160; + int yHalfCount = (g_globals->_sceneManager._scene->_backgroundBounds.bottom + 99) / 100; if (xSection < xHalfCount && ySection < yHalfCount) { int rlbNum = xSection * yHalfCount + ySection; - byte *data = _resourceManager->getResource(RES_BITMAP, screenNum, rlbNum); + byte *data = g_resourceManager->getResource(RES_BITMAP, screenNum, rlbNum); for (int y = 0; y < updateRect.height(); ++y) { byte *pSrc = data + y * 160; @@ -582,8 +582,8 @@ void GfxSurface::copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Regi while (tempSrc < (pSrc + destBounds.width())) { if (!priorityRegion || !priorityRegion->contains(Common::Point( - xp + _globals->_sceneManager._scene->_sceneBounds.left, - destBounds.top + y + _globals->_sceneManager._scene->_sceneBounds.top))) { + xp + g_globals->_sceneManager._scene->_sceneBounds.left, + destBounds.top + y + g_globals->_sceneManager._scene->_sceneBounds.top))) { if (*tempSrc != src._transColor) *tempDest = *tempSrc; } @@ -609,7 +609,7 @@ void GfxSurface::draw(const Common::Point &pt, Rect *rect) { *rect = tempRect; } else { // Draw image - _globals->gfxManager().copyFrom(*this, tempRect, NULL); + g_globals->gfxManager().copyFrom(*this, tempRect, NULL); } } @@ -623,12 +623,12 @@ GfxElement::GfxElement() { void GfxElement::setDefaults() { _flags = 0; - _fontNumber = _globals->_gfxFontNumber; - _colors = _globals->_gfxColors; - _fontColors = _globals->_fontColors; - _unkColor1 = _globals->_unkColor1; - _unkColor2 = _globals->_unkColor2; - _unkColor3 = _globals->_unkColor3; + _fontNumber = g_globals->_gfxFontNumber; + _colors = g_globals->_gfxColors; + _fontColors = g_globals->_fontColors; + _color1 = g_globals->_color1; + _color2 = g_globals->_color2; + _color3 = g_globals->_color3; } /** @@ -636,13 +636,13 @@ void GfxElement::setDefaults() { */ void GfxElement::highlight() { // Get a lock on the surface - GfxManager &gfxManager = _globals->gfxManager(); + GfxManager &gfxManager = g_globals->gfxManager(); Graphics::Surface surface = gfxManager.lockSurface(); // Scan through the contents of the element, switching any occurances of the foreground // color with the background color and vice versa Rect tempRect(_bounds); - tempRect.collapse(_globals->_gfxEdgeAdjust - 1, _globals->_gfxEdgeAdjust - 1); + tempRect.collapse(g_globals->_gfxEdgeAdjust - 1, g_globals->_gfxEdgeAdjust - 1); for (int yp = tempRect.top; yp < tempRect.bottom; ++yp) { byte *lineP = (byte *)surface.getBasePtr(tempRect.left, yp); @@ -661,7 +661,7 @@ void GfxElement::highlight() { */ void GfxElement::drawFrame() { // Get a lock on the surface and save the active font - GfxManager &gfxManager = _globals->gfxManager(); + GfxManager &gfxManager = g_globals->gfxManager(); gfxManager.lockSurface(); uint8 bgColor, fgColor; @@ -674,7 +674,7 @@ void GfxElement::drawFrame() { } Rect tempRect = _bounds; - tempRect.collapse(_globals->_gfxEdgeAdjust, _globals->_gfxEdgeAdjust); + tempRect.collapse(g_globals->_gfxEdgeAdjust, g_globals->_gfxEdgeAdjust); tempRect.collapse(-1, -1); gfxManager.fillRect(tempRect, _colors.background); @@ -715,10 +715,10 @@ bool GfxElement::focusedEvent(Event &event) { // HACK: It should use the GfxManager object to figure out the relative // position, but for now this seems like the easiest way. - int xOffset = mousePos.x - _globals->_events._mousePos.x; - int yOffset = mousePos.y - _globals->_events._mousePos.y; + int xOffset = mousePos.x - g_globals->_events._mousePos.x; + int yOffset = mousePos.y - g_globals->_events._mousePos.y; - while (event.eventType != EVENT_BUTTON_UP && !_vm->getEventManager()->shouldQuit()) { + while (event.eventType != EVENT_BUTTON_UP && !g_vm->shouldQuit()) { g_system->delayMillis(10); if (_bounds.contains(mousePos)) { @@ -733,7 +733,7 @@ bool GfxElement::focusedEvent(Event &event) { highlight(); } - if (_globals->_events.getEvent(event, EVENT_MOUSE_MOVE | EVENT_BUTTON_UP)) { + if (g_globals->_events.getEvent(event, EVENT_MOUSE_MOVE | EVENT_BUTTON_UP)) { if (event.eventType == EVENT_MOUSE_MOVE) { mousePos.x = event.mousePos.x + xOffset; mousePos.y = event.mousePos.y + yOffset; @@ -769,7 +769,7 @@ void GfxImage::setDefaults() { // Decode the image uint size; - byte *imgData = _resourceManager->getSubResource(_resNum, _rlbNum, _cursorNum, &size); + byte *imgData = g_resourceManager->getSubResource(_resNum, _rlbNum, _cursorNum, &size); _surface = surfaceFromRes(imgData); DEALLOCATE(imgData); @@ -781,9 +781,9 @@ void GfxImage::setDefaults() { void GfxImage::draw() { Rect tempRect = _bounds; - tempRect.translate(_globals->gfxManager()._topLeft.x, _globals->gfxManager()._topLeft.y); + tempRect.translate(g_globals->gfxManager()._topLeft.x, g_globals->gfxManager()._topLeft.y); - _globals->gfxManager().copyFrom(_surface, tempRect); + g_globals->gfxManager().copyFrom(_surface, tempRect); } /*--------------------------------------------------------------------------*/ @@ -805,7 +805,7 @@ void GfxMessage::setDefaults() { GfxElement::setDefaults(); GfxFontBackup font; - GfxManager &gfxManager = _globals->gfxManager(); + GfxManager &gfxManager = g_globals->gfxManager(); Rect tempRect; gfxManager._font.setFontNumber(this->_fontNumber); @@ -818,15 +818,15 @@ void GfxMessage::setDefaults() { void GfxMessage::draw() { GfxFontBackup font; - GfxManager &gfxManager = _globals->gfxManager(); + GfxManager &gfxManager = g_globals->gfxManager(); // Set the font and color gfxManager.setFillFlag(false); gfxManager._font.setFontNumber(_fontNumber); - gfxManager._font._colors.foreground = this->_unkColor1; - gfxManager._font._colors2.background = this->_unkColor2; - gfxManager._font._colors2.foreground = this->_unkColor3; + gfxManager._font._colors.foreground = this->_color1; + gfxManager._font._colors2.background = this->_color2; + gfxManager._font._colors2.foreground = this->_color3; // Display the text gfxManager._font.writeLines(_message.c_str(), _bounds, _textAlign); @@ -838,7 +838,7 @@ void GfxButton::setDefaults() { GfxElement::setDefaults(); GfxFontBackup font; - GfxManager &gfxManager = _globals->gfxManager(); + GfxManager &gfxManager = g_globals->gfxManager(); Rect tempRect; // Get the string bounds and round up the x end to a multiple of 16 @@ -847,8 +847,8 @@ void GfxButton::setDefaults() { tempRect.right = ((tempRect.right + 15) / 16) * 16; // Set the button bounds - tempRect.collapse(-_globals->_gfxEdgeAdjust, -_globals->_gfxEdgeAdjust); - if (_vm->getFeatures() & GF_CD) + tempRect.collapse(-g_globals->_gfxEdgeAdjust, -g_globals->_gfxEdgeAdjust); + if (g_vm->getFeatures() & GF_CD) --tempRect.top; tempRect.moveTo(_bounds.left, _bounds.top); _bounds = tempRect; @@ -857,7 +857,7 @@ void GfxButton::setDefaults() { void GfxButton::draw() { // Get a lock on the surface and save the active font GfxFontBackup font; - GfxManager &gfxManager = _globals->gfxManager(); + GfxManager &gfxManager = g_globals->gfxManager(); gfxManager.lockSurface(); // Draw a basic frame for the button @@ -867,14 +867,14 @@ void GfxButton::draw() { gfxManager._font.setFontNumber(_fontNumber); // - gfxManager._font._colors.foreground = this->_unkColor1; - gfxManager._font._colors2.background = this->_unkColor2; - gfxManager._font._colors2.foreground = this->_unkColor3; + gfxManager._font._colors.foreground = this->_color1; + gfxManager._font._colors2.background = this->_color2; + gfxManager._font._colors2.foreground = this->_color3; // Display the button's text Rect tempRect(_bounds); - tempRect.collapse(_globals->_gfxEdgeAdjust, _globals->_gfxEdgeAdjust); - if (_vm->getFeatures() & GF_CD) + tempRect.collapse(g_globals->_gfxEdgeAdjust, g_globals->_gfxEdgeAdjust); + if (g_vm->getFeatures() & GF_CD) ++tempRect.top; gfxManager._font.writeLines(_message.c_str(), tempRect, ALIGN_CENTER); @@ -936,14 +936,14 @@ void GfxDialog::setDefaults() { // Set the dialog boundaries _gfxManager._bounds = tempRect; - tempRect.collapse(-_globals->_gfxEdgeAdjust * 2, -_globals->_gfxEdgeAdjust * 2); + tempRect.collapse(-g_globals->_gfxEdgeAdjust * 2, -g_globals->_gfxEdgeAdjust * 2); _bounds = tempRect; } void GfxDialog::remove() { if (_savedArea) { // Restore the area the dialog covered - _globals->_gfxManagerInstance.copyFrom(*_savedArea, _bounds.left, _bounds.top); + g_globals->_gfxManagerInstance.copyFrom(*_savedArea, _bounds.left, _bounds.top); delete _savedArea; _savedArea = NULL; @@ -954,7 +954,7 @@ void GfxDialog::draw() { Rect tempRect(_bounds); // Make a backup copy of the area the dialog will occupy - _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), _bounds); + _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); // Set the palette for use in the dialog setPalette(); @@ -966,7 +966,7 @@ void GfxDialog::draw() { drawFrame(); // Reset the dialog's graphics manager to only draw within the dialog boundaries - tempRect.translate(_globals->_gfxEdgeAdjust * 2, _globals->_gfxEdgeAdjust * 2); + tempRect.translate(g_globals->_gfxEdgeAdjust * 2, g_globals->_gfxEdgeAdjust * 2); _gfxManager._bounds = tempRect; // Draw each element in the dialog in order @@ -1003,7 +1003,7 @@ void GfxDialog::addElements(GfxElement *ge, ...) { } void GfxDialog::setTopLeft(int xp, int yp) { - _bounds.moveTo(xp - _globals->_gfxEdgeAdjust * 2, yp - _globals->_gfxEdgeAdjust * 2); + _bounds.moveTo(xp - g_globals->_gfxEdgeAdjust * 2, yp - g_globals->_gfxEdgeAdjust * 2); } void GfxDialog::setCenter(int xp, int yp) { @@ -1029,9 +1029,9 @@ GfxButton *GfxDialog::execute(GfxButton *defaultButton) { GfxButton *selectedButton = NULL; bool breakFlag = false; - while (!_vm->getEventManager()->shouldQuit() && !breakFlag) { + while (!g_vm->shouldQuit() && !breakFlag) { Event event; - while (_globals->_events.getEvent(event) && !breakFlag) { + while (g_globals->_events.getEvent(event) && !breakFlag) { // Adjust mouse positions to be relative within the dialog event.mousePos.x -= _gfxManager._bounds.left; event.mousePos.y -= _gfxManager._bounds.top; @@ -1069,17 +1069,28 @@ GfxButton *GfxDialog::execute(GfxButton *defaultButton) { } void GfxDialog::setPalette() { - _globals->_scenePalette.loadPalette(0); - _globals->_scenePalette.setPalette(0, 1); - _globals->_scenePalette.setPalette(_globals->_scenePalette._colors.foreground, 1); - _globals->_scenePalette.setPalette(_globals->_fontColors.background, 1); - _globals->_scenePalette.setPalette(_globals->_fontColors.foreground, 1); - _globals->_scenePalette.setPalette(255, 1); + if (g_vm->getGameID() == GType_BlueForce) { + g_globals->_scenePalette.loadPalette(2); + g_globals->_scenePalette.setPalette(0, 1); + g_globals->_scenePalette.setPalette(g_globals->_gfxColors.background, 1); + g_globals->_scenePalette.setPalette(g_globals->_gfxColors.foreground, 1); + g_globals->_scenePalette.setPalette(g_globals->_fontColors.background, 1); + g_globals->_scenePalette.setPalette(g_globals->_fontColors.foreground, 1); + g_globals->_scenePalette.setEntry(255, 0xff, 0xff, 0xff); + g_globals->_scenePalette.setPalette(255, 1); + } else { + g_globals->_scenePalette.loadPalette(0); + g_globals->_scenePalette.setPalette(0, 1); + g_globals->_scenePalette.setPalette(g_globals->_scenePalette._colors.foreground, 1); + g_globals->_scenePalette.setPalette(g_globals->_fontColors.background, 1); + g_globals->_scenePalette.setPalette(g_globals->_fontColors.foreground, 1); + g_globals->_scenePalette.setPalette(255, 1); + } } /*--------------------------------------------------------------------------*/ -GfxManager::GfxManager() : _surface(_globals->_screenSurface), _oldManager(NULL) { +GfxManager::GfxManager() : _surface(g_globals->_screenSurface), _oldManager(NULL) { _font.setOwner(this); _font._fillFlag = false; _bounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); @@ -1098,19 +1109,19 @@ void GfxManager::setDefaults() { _pane0Rect4 = screenBounds; _font._edgeSize = Common::Point(1, 1); - _font._colors = _globals->_fontColors; - _font.setFontNumber(_globals->_gfxFontNumber); + _font._colors = g_globals->_fontColors; + _font.setFontNumber(g_globals->_gfxFontNumber); } void GfxManager::activate() { - assert(!contains(_globals->_gfxManagers, this)); - _globals->_gfxManagers.push_front(this); + assert(!contains(g_globals->_gfxManagers, this)); + g_globals->_gfxManagers.push_front(this); } void GfxManager::deactivate() { // Assert that there will still be another manager, and we're correctly removing our own - assert((_globals->_gfxManagers.size() > 1) && (&_globals->gfxManager() == this)); - _globals->_gfxManagers.pop_front(); + assert((g_globals->_gfxManagers.size() > 1) && (&g_globals->gfxManager() == this)); + g_globals->_gfxManagers.pop_front(); } int GfxManager::getStringWidth(const char *s, int numChars) { @@ -1148,7 +1159,7 @@ void GfxManager::setDialogPalette() { // Get the main palette information byte palData[256 * 3]; uint count, start; - _resourceManager->getPalette(0, &palData[0], &start, &count); + g_resourceManager->getPalette(0, &palData[0], &start, &count); g_system->getPaletteManager()->setPalette(&palData[0], start, count); // Miscellaneous @@ -1183,7 +1194,7 @@ int GfxManager::getAngle(const Common::Point &p1, const Common::Point &p2) { GfxFont::GfxFont() { - _fontNumber = (_vm->getFeatures() & GF_DEMO) ? 0 : 50; + _fontNumber = (g_vm->getFeatures() & GF_DEMO) ? 0 : 50; _numChars = 0; _bpp = 0; _fontData = NULL; @@ -1207,9 +1218,9 @@ void GfxFont::setFontNumber(uint32 fontNumber) { _fontNumber = fontNumber; - _fontData = _resourceManager->getResource(RES_FONT, _fontNumber, 0, true); + _fontData = g_resourceManager->getResource(RES_FONT, _fontNumber, 0, true); if (!_fontData) - _fontData = _resourceManager->getResource(RES_FONT, _fontNumber, 0); + _fontData = g_resourceManager->getResource(RES_FONT, _fontNumber, 0); _numChars = READ_LE_UINT16(_fontData + 4); _fontSize.y = READ_LE_UINT16(_fontData + 6); @@ -1498,18 +1509,18 @@ void GfxFont::writeLines(const char *s, const Rect &bounds, TextAlign align) { /*--------------------------------------------------------------------------*/ GfxFontBackup::GfxFontBackup() { - _edgeSize = _globals->gfxManager()._font._edgeSize; - _position = _globals->gfxManager()._font._position; - _colors = _globals->gfxManager()._font._colors; - _fontNumber = _globals->gfxManager()._font._fontNumber; + _edgeSize = g_globals->gfxManager()._font._edgeSize; + _position = g_globals->gfxManager()._font._position; + _colors = g_globals->gfxManager()._font._colors; + _fontNumber = g_globals->gfxManager()._font._fontNumber; } GfxFontBackup::~GfxFontBackup() { - _globals->gfxManager()._font.setFontNumber(_fontNumber); - _globals->gfxManager()._font._edgeSize = _edgeSize; - _globals->gfxManager()._font._position = _position; - _globals->gfxManager()._font._colors = _colors; + g_globals->gfxManager()._font.setFontNumber(_fontNumber); + g_globals->gfxManager()._font._edgeSize = _edgeSize; + g_globals->gfxManager()._font._position = _position; + g_globals->gfxManager()._font._colors = _colors; } -} // End of namespace tSage +} // End of namespace TsAGE diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h index e09e1093a3..06b482d7b5 100644 --- a/engines/tsage/graphics.h +++ b/engines/tsage/graphics.h @@ -30,7 +30,7 @@ #include "common/system.h" #include "graphics/surface.h" -namespace tSage { +namespace TsAGE { class GfxSurface; class Region; @@ -177,7 +177,7 @@ public: uint16 _fontNumber; GfxColors _colors; GfxColors _fontColors; - byte _unkColor1, _unkColor2, _unkColor3; + byte _color1, _color2, _color3; uint16 _keycode; public: GfxElement(); @@ -343,6 +343,6 @@ GfxSurface *Surface_getArea(GfxSurface &src, const Rect &bounds); GfxSurface surfaceFromRes(const byte *imgData); GfxSurface surfaceFromRes(int resNum, int rlbNum, int subNum); -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk index aefc8b0992..0ea8916647 100644 --- a/engines/tsage/module.mk +++ b/engines/tsage/module.mk @@ -1,7 +1,19 @@ MODULE := engines/tsage MODULE_OBJS := \ - blueforce_logic.o \ + blue_force/blueforce_dialogs.o \ + blue_force/blueforce_logic.o \ + blue_force/blueforce_scenes0.o \ + blue_force/blueforce_scenes1.o \ + blue_force/blueforce_scenes2.o \ + blue_force/blueforce_scenes3.o \ + blue_force/blueforce_scenes4.o \ + blue_force/blueforce_scenes5.o \ + blue_force/blueforce_scenes6.o \ + blue_force/blueforce_scenes7.o \ + blue_force/blueforce_scenes8.o \ + blue_force/blueforce_scenes9.o \ + blue_force/blueforce_speakers.o \ converse.o \ core.o \ debugger.o \ @@ -11,27 +23,32 @@ MODULE_OBJS := \ globals.o \ graphics.o \ resources.o \ - ringworld_demo.o \ - ringworld_logic.o \ - ringworld_scenes1.o \ - ringworld_scenes2.o \ - ringworld_scenes3.o \ - ringworld_scenes4.o \ - ringworld_scenes5.o \ - ringworld_scenes6.o \ - ringworld_scenes8.o \ - ringworld_scenes10.o \ + ringworld/ringworld_demo.o \ + ringworld/ringworld_dialogs.o \ + ringworld/ringworld_logic.o \ + ringworld/ringworld_scenes1.o \ + ringworld/ringworld_scenes2.o \ + ringworld/ringworld_scenes3.o \ + ringworld/ringworld_scenes4.o \ + ringworld/ringworld_scenes5.o \ + ringworld/ringworld_scenes6.o \ + ringworld/ringworld_scenes8.o \ + ringworld/ringworld_scenes10.o \ + ringworld/ringworld_speakers.o \ + ringworld2/ringworld2_dialogs.o \ + ringworld2/ringworld2_logic.o \ + ringworld2/ringworld2_scenes0.o \ saveload.o \ scenes.o \ sound.o \ staticres.o \ - tsage.o + tsage.o \ + user_interface.o # This module can be built as a plugin ifeq ($(ENABLE_TSAGE), DYNAMIC_PLUGIN) PLUGIN := 1 endif -# Include common rules +# Include common rules include $(srcdir)/rules.mk - diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp index d24c564a1f..652ab32350 100644 --- a/engines/tsage/resources.cpp +++ b/engines/tsage/resources.cpp @@ -28,7 +28,7 @@ #include "tsage/resources.h" #include "tsage/tsage.h" -namespace tSage { +namespace TsAGE { MemoryManager::MemoryManager() { @@ -237,8 +237,13 @@ byte *TLib::getResource(uint16 id, bool suppressErrors) { uint16 ctrCurrent = 0x102, ctrMax = 0x200; uint16 word_48050 = 0, currentToken = 0, word_48054 =0; byte byte_49068 = 0, byte_49069 = 0; - DecodeReference table[0x1000]; - for (int i = 0; i < 0x1000; ++i) { + + const uint tableSize = 0x1000; + DecodeReference *table = (DecodeReference *)malloc(tableSize * sizeof(DecodeReference)); + if (!table) + error("[TLib::getResource] Cannot allocate table buffer"); + + for (uint i = 0; i < tableSize; ++i) { table[i].vByte = table[i].vWord = 0; } Common::Stack<uint16> tokenList; @@ -302,6 +307,8 @@ byte *TLib::getResource(uint16 id, bool suppressErrors) { } } + free(table); + assert(bytesWritten == re->uncompressedSize); delete compStream; return dataOut; @@ -347,6 +354,8 @@ void TLib::loadIndex() { se.resNum = resNum; se.resType = (ResourceType)(configId & 0x1f); se.fileOffset = (((configId >> 5) & 0x7ff) << 16) | fileOffset; + if (g_vm->getGameID() == GType_Ringworld2) + se.fileOffset <<= 4; _sections.push_back(se); } @@ -431,7 +440,7 @@ ResourceManager::~ResourceManager() { void ResourceManager::addLib(const Common::String &libName) { assert(_libList.size() < 5); - _libList.push_back(new TLib(_vm->_memoryManager, libName)); + _libList.push_back(new TLib(g_vm->_memoryManager, libName)); } byte *ResourceManager::getResource(uint16 id, bool suppressErrors) { @@ -497,4 +506,4 @@ Common::String ResourceManager::getMessage(int resNum, int lineNum, bool suppres return result; } -} // end of namespace tSage +} // end of namespace TsAGE diff --git a/engines/tsage/resources.h b/engines/tsage/resources.h index efbb86b24e..8f90b21908 100644 --- a/engines/tsage/resources.h +++ b/engines/tsage/resources.h @@ -33,7 +33,7 @@ #include "common/util.h" #include "graphics/surface.h" -namespace tSage { +namespace TsAGE { // Magic number used by original game to identify valid memory blocks const uint32 MEMORY_ENTRY_ID = 0xE11DA722; @@ -42,7 +42,10 @@ const int MEMORY_POOL_SIZE = 1000; enum ResourceType { RES_LIBRARY, RES_STRIP, RES_IMAGE, RES_PALETTE, RES_VISAGE, RES_SOUND, RES_MESSAGE, RES_FONT, RES_POINTER, RES_BANK, RES_SND_DRIVER, RES_PRIORITY, RES_CONTROL, RES_WALKRGNS, - RES_BITMAP, RES_SAVE, RES_SEQUENCE }; + RES_BITMAP, RES_SAVE, RES_SEQUENCE, + // Return to Ringworld specific resource types + RT17, RT18, RT19, RT20, RT21, RT22, RT23, RT24, RT25, RT26, RT27, RT28, RT29, RT30, RT31 +}; class MemoryHeader { public: @@ -175,6 +178,6 @@ public: }; -} // end of namespace tSage +} // end of namespace TsAGE #endif diff --git a/engines/tsage/ringworld_demo.cpp b/engines/tsage/ringworld/ringworld_demo.cpp index b24fec98f9..fedb19c804 100644 --- a/engines/tsage/ringworld_demo.cpp +++ b/engines/tsage/ringworld/ringworld_demo.cpp @@ -20,18 +20,20 @@ * */ -#include "tsage/ringworld_demo.h" +#include "tsage/ringworld/ringworld_demo.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { void RingworldDemoGame::start() { // Start the demo's single scene - _globals->_sceneManager.changeScene(1); + g_globals->_sceneManager.changeScene(1); - _globals->_events.setCursor(CURSOR_NONE); + g_globals->_events.setCursor(CURSOR_NONE); } Scene *RingworldDemoGame::createScene(int sceneNumber) { @@ -39,13 +41,21 @@ Scene *RingworldDemoGame::createScene(int sceneNumber) { return new RingworldDemoScene(); } +bool RingworldDemoGame::canLoadGameStateCurrently() { + return false; +} + +bool RingworldDemoGame::canSaveGameStateCurrently() { + return false; +} + void RingworldDemoGame::quitGame() { if (MessageDialog::show(DEMO_EXIT_MSG, EXIT_BTN_STRING, DEMO_BTN_STRING) == 0) - _vm->quitGame(); + g_vm->quitGame(); } void RingworldDemoGame::pauseGame() { - _globals->_events.setCursor(CURSOR_ARROW); + g_globals->_events.setCursor(CURSOR_ARROW); MessageDialog *dlg = new MessageDialog(DEMO_PAUSED_MSG, EXIT_BTN_STRING, DEMO_RESUME_BTN_STRING); dlg->draw(); @@ -53,10 +63,10 @@ void RingworldDemoGame::pauseGame() { bool exitFlag = selectedButton != &dlg->_btn2; delete dlg; - _globals->_events.hideCursor(); + g_globals->_events.hideCursor(); if (exitFlag) - _vm->quitGame(); + g_vm->quitGame(); } void RingworldDemoGame::processEvent(Event &event) { @@ -72,8 +82,8 @@ void RingworldDemoGame::processEvent(Event &event) { ConfigDialog *dlg = new ConfigDialog(); dlg->runModal(); delete dlg; - _globals->_soundManager.syncSounds(); - _globals->_events.setCursorFromFlag(); + g_globals->_soundManager.syncSounds(); + g_globals->_events.setCursorFromFlag(); break; } @@ -117,4 +127,6 @@ void RingworldDemoScene::process(Event &event) { } -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld_demo.h b/engines/tsage/ringworld/ringworld_demo.h index 3e7431e107..7c0ac39285 100644 --- a/engines/tsage/ringworld_demo.h +++ b/engines/tsage/ringworld/ringworld_demo.h @@ -30,7 +30,11 @@ #include "tsage/globals.h" #include "tsage/sound.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { + +using namespace TsAGE; class RingworldDemoGame: public Game { private: @@ -40,6 +44,8 @@ public: virtual Scene *createScene(int sceneNumber); virtual void quitGame(); virtual void processEvent(Event &event); + virtual bool canSaveGameStateCurrently(); + virtual bool canLoadGameStateCurrently(); }; class RingworldDemoScene: public Scene { @@ -54,6 +60,8 @@ public: virtual void signal(); }; -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld/ringworld_dialogs.cpp b/engines/tsage/ringworld/ringworld_dialogs.cpp new file mode 100644 index 0000000000..9d1a7effc2 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_dialogs.cpp @@ -0,0 +1,222 @@ +/* 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/ringworld/ringworld_dialogs.h" +#include "tsage/ringworld/ringworld_logic.h" + +namespace TsAGE { + +namespace Ringworld { + +/*--------------------------------------------------------------------------*/ + +#define BUTTON_WIDTH 28 +#define BUTTON_HEIGHT 29 + +RightClickButton::RightClickButton(int buttonIndex, int xp, int yp) : GfxButton() { + _buttonIndex = buttonIndex; + this->_bounds.left = xp; + this->_bounds.top = yp; + this->_bounds.setWidth(BUTTON_WIDTH); + this->_bounds.setHeight(BUTTON_HEIGHT); + _savedButton = NULL; +} + +void RightClickButton::highlight() { + if (_savedButton) { + // Button was previously highlighted, so de-highlight by restoring saved area + g_globals->gfxManager().copyFrom(*_savedButton, _bounds.left, _bounds.top); + delete _savedButton; + _savedButton = NULL; + } else { + // Highlight button by getting the needed highlighted image resource + _savedButton = Surface_getArea(g_globals->gfxManager().getSurface(), _bounds); + + uint size; + byte *imgData = g_resourceManager->getSubResource(7, 2, _buttonIndex, &size); + + GfxSurface btnSelected = surfaceFromRes(imgData); + g_globals->gfxManager().copyFrom(btnSelected, _bounds.left, _bounds.top); + + DEALLOCATE(imgData); + } +} + +/*--------------------------------------------------------------------------*/ + +/** + * This dialog implements the right-click dialog + */ +RightClickDialog::RightClickDialog() : GfxDialog(), + _walkButton(1, 48, 12), _lookButton(2, 31, 29), _useButton(3, 65, 29), + _talkButton(4, 14, 47), _inventoryButton(5, 48, 47), _optionsButton(6, 83, 47) { + Rect rectArea, dialogRect; + + // Set the palette and change the cursor + _gfxManager.setDialogPalette(); + g_globals->_events.setCursor(CURSOR_ARROW); + + // Get the dialog image + _surface = surfaceFromRes(7, 1, 1); + + // Set the dialog position + dialogRect.resize(_surface, 0, 0, 100); + dialogRect.center(g_globals->_events._mousePos.x, g_globals->_events._mousePos.y); + + // Ensure the dialog will be entirely on-screen + Rect screenRect = g_globals->gfxManager()._bounds; + screenRect.collapse(4, 4); + dialogRect.contain(screenRect); + + _bounds = dialogRect; + _gfxManager._bounds = _bounds; + + _highlightedButton = NULL; + _selectedAction = -1; +} + +RightClickDialog::~RightClickDialog() { +} + +RightClickButton *RightClickDialog::findButton(const Common::Point &pt) { + RightClickButton *btnList[] = { &_walkButton, &_lookButton, &_useButton, &_talkButton, &_inventoryButton, &_optionsButton }; + + for (int i = 0; i < 6; ++i) { + btnList[i]->_owner = this; + + if (btnList[i]->_bounds.contains(pt)) + return btnList[i]; + } + + return NULL; +} + +void RightClickDialog::draw() { + // Save the covered background area + _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + + // Draw the dialog image + g_globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top); +} + +bool RightClickDialog::process(Event &event) { + switch (event.eventType) { + case EVENT_MOUSE_MOVE: { + // Check whether a button is highlighted + RightClickButton *btn = findButton(event.mousePos); + + if (btn != _highlightedButton) { + // De-highlight any previously selected button + if (_highlightedButton) { + _highlightedButton->highlight(); + _highlightedButton = NULL; + } + if (btn) { + // Highlight the new button + btn->highlight(); + _highlightedButton = btn; + } + } + event.handled = true; + return true; + } + + case EVENT_BUTTON_DOWN: + // If a button is highlighted, then flag the selected button index + if (_highlightedButton) + _selectedAction = _highlightedButton->_buttonIndex; + else + _selectedAction = _lookButton._buttonIndex; + 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 + switch (_selectedAction) { + case 1: + // Look action + g_globals->_events.setCursor(CURSOR_LOOK); + break; + case 2: + // Walk action + g_globals->_events.setCursor(CURSOR_WALK); + break; + case 3: + // Use cursor + g_globals->_events.setCursor(CURSOR_USE); + break; + case 4: + // Talk cursor + g_globals->_events.setCursor(CURSOR_TALK); + break; + case 5: + // Inventory dialog + InventoryDialog::show(); + break; + case 6: + // Dialog options + OptionsDialog::show(); + break; + } + + _gfxManager.deactivate(); +} + +} // End of namespace Ringworld + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld/ringworld_dialogs.h b/engines/tsage/ringworld/ringworld_dialogs.h new file mode 100644 index 0000000000..11a8f10e70 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_dialogs.h @@ -0,0 +1,70 @@ +/* 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_RINGWORLD_DIALOGS_H +#define TSAGE_RINGWORLD_DIALOGS_H + +#include "gui/options.h" +#include "tsage/events.h" +#include "tsage/graphics.h" +#include "common/list.h" +#include "common/rect.h" +#include "common/system.h" + +namespace TsAGE { + +namespace Ringworld { + +class RightClickButton : public GfxButton { +private: + GfxSurface *_savedButton; +public: + int _buttonIndex; + + RightClickButton(int buttonIndex, int xp, int yp); + ~RightClickButton() { delete _savedButton; } + + virtual void highlight(); +}; + +class RightClickDialog : public GfxDialog { +private: + GfxSurface _surface; + RightClickButton *_highlightedButton; + int _selectedAction; + RightClickButton _walkButton, _lookButton, _useButton, _talkButton, _inventoryButton, _optionsButton; + + RightClickButton *findButton(const Common::Point &pt); +public: + RightClickDialog(); + ~RightClickDialog(); + + virtual void draw(); + virtual bool process(Event &event); + void execute(); +}; + +} // End of namespace Ringworld + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp new file mode 100644 index 0000000000..ad67b66f69 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_logic.cpp @@ -0,0 +1,691 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/config-manager.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/ringworld/ringworld_demo.h" +#include "tsage/ringworld/ringworld_dialogs.h" +#include "tsage/ringworld/ringworld_scenes1.h" +#include "tsage/ringworld/ringworld_scenes2.h" +#include "tsage/ringworld/ringworld_scenes3.h" +#include "tsage/ringworld/ringworld_scenes4.h" +#include "tsage/ringworld/ringworld_scenes5.h" +#include "tsage/ringworld/ringworld_scenes6.h" +#include "tsage/ringworld/ringworld_scenes8.h" +#include "tsage/ringworld/ringworld_scenes10.h" + +namespace TsAGE { + +namespace Ringworld { + +Scene *RingworldGame::createScene(int sceneNumber) { + switch (sceneNumber) { + /* Scene group 1 */ + // Kziniti Palace (Introduction) + case 10: return new Scene10(); + // Outer Space (Introduction) + case 15: return new Scene15(); + // Cut-scenes for Ch'mee house in distance + case 20: return new Scene20(); + // Outside Ch'mee residence + case 30: return new Scene30(); + // Chmeee Home + case 40: return new Scene40(); + // By Flycycles + case 50: return new Scene50(); + // Flycycle controls + case 60: return new Scene60(); + // Shipyard Entrance + case 90: return new Scene90(); + // Ship Close-up + case 95: return new Scene95(); + // Sunflower navigation sequence + case 6100: return new Scene6100(); + + /* Scene group 2 */ + // Title screen + case 1000: return new Scene1000(); + // Fleeing planet cutscene + case 1001: return new Scene1001(); + // Unused + case 1250: return new Scene1250(); + // Ringworld Wall + case 1400: return new Scene1400(); + // Ringworld Space-port + case 1500: return new Scene1500(); + + /* Scene group 3 - Part #1 */ + // Cockpit cutscenes + case 2000: return new Scene2000(); + // Starcraft - Cockpit + case 2100: return new Scene2100(); + // Encyclopedia + case 2120: return new Scene2120(); + // Starcraft - Level 2 + case 2150: return new Scene2150(); + // Starcraft - AutoDoc + case 2200: return new Scene2200(); + // Stasis Field Map + case 2222: return new Scene2222(); + // Starcraft - Quinn's Room + case 2230: return new Scene2230(); + + /* Scene group 3 - Part #2 */ + // Starcraft - Storage Room + case 2280: return new Scene2280(); + // Starcraft - Hanger Bay + case 2300: return new Scene2300(); + // Starcraft - Copy Protection Screen + case 2310: return new Scene2310(); + // Starcraft - Lander Bay + case 2320: return new Scene2320(); + // Scene 2400 - Descending in Lander + case 2400: return new Scene2400(); + + /* Scene group 4 */ + // Ringworld Scan + case 3500: return new Scene3500(); + // Remote Viewer + case 3700: return new Scene3700(); + + /* Scene group 5 */ + // Village + case 4000: return new Scene4000(); + // Village - Outside Lander + case 4010: return new Scene4010(); + // Village - Puzzle Board + case 4025: return new Scene4025(); + // Village - Temple Antechamber + case 4045: return new Scene4045(); + // Village - Temple + case 4050: return new Scene4050(); + // Village - Hut + case 4100: return new Scene4100(); + // Village - Bedroom + case 4150: return new Scene4150(); + // Village - Near Slaver Ship + case 4250: return new Scene4250(); + // Village - Slaver Ship + case 4300: return new Scene4300(); + // Village - Slaver Ship Keypad + case 4301: return new Scene4301(); + + /* Scene group 6 */ + // Caverns - Entrance + case 5000: return new Scene5000(); + // Caverns + case 5100: return new Scene5100(); + // Caverns - Throne-room + case 5200: return new Scene5200(); + // Caverns - Pit + case 5300: return new Scene5300(); + + /* Scene group 8 */ + // Landing near beach + case 7000: return new Scene7000(); + // Underwater: swimming + case 7100: return new Scene7100(); + // Underwater: Entering the cave + case 7200: return new Scene7200(); + // Underwater: Lord Poria + case 7300: return new Scene7300(); + // Floating Buildings: Outside + case 7600: return new Scene7600(); + // Floating Buildings: In the lab + case 7700: return new Scene7700(); + + /* Scene group 10 */ + // Near beach: Slave washing clothes + case 9100: return new Scene9100(); + // Castle: Outside the bulwarks + case 9150: return new Scene9150(); + // Castle: Near the fountain + case 9200: return new Scene9200(); + // Castle: In front of a large guarded door + case 9300: return new Scene9300(); + // Castle: In a hallway + case 9350: return new Scene9350(); + // Castle: In a hallway + case 9360: return new Scene9360(); + // Castle: Black-Smith room + case 9400: return new Scene9400(); + // Castle: Dining room + case 9450: return new Scene9450(); + // Castle: Bedroom + case 9500: return new Scene9500(); + // Castle: Balcony + case 9700: return new Scene9700(); + // Castle: In the garden + case 9750: return new Scene9750(); + // Castle: Dressing room + case 9850: return new Scene9850(); + // Ending + case 9900: return new Scene9900(); + // Space travel + case 9999: return new Scene9999(); + + default: + error("Unknown scene number - %d", sceneNumber); + break; + } +} + +/** + * Returns true if it is currently okay to restore a game + */ +bool RingworldGame::canLoadGameStateCurrently() { + return !g_globals->getFlag(50); +} + +/** + * Returns true if it is currently okay to save the game + */ +bool RingworldGame::canSaveGameStateCurrently() { + return !g_globals->getFlag(50); +} + +/*--------------------------------------------------------------------------*/ + +DisplayHotspot::DisplayHotspot(int regionId, ...) { + _sceneRegionId = regionId; + + // Load up the actions + va_list va; + va_start(va, regionId); + + int param = va_arg(va, int); + while (param != LIST_END) { + _actions.push_back(param); + param = va_arg(va, int); + } + + va_end(va); +} + +bool DisplayHotspot::performAction(int action) { + for (uint i = 0; i < _actions.size(); i += 3) { + if (_actions[i] == action) { + display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return true; + } + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +DisplayObject::DisplayObject(int firstAction, ...) { + // Load up the actions + va_list va; + va_start(va, firstAction); + + int param = firstAction; + while (param != LIST_END) { + _actions.push_back(param); + param = va_arg(va, int); + } + + va_end(va); +} + +bool DisplayObject::performAction(int action) { + for (uint i = 0; i < _actions.size(); i += 3) { + if (_actions[i] == action) { + display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return true; + } + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +SceneArea::SceneArea() { + _savedArea = NULL; + _pt.x = _pt.y = 0; +} + +SceneArea::~SceneArea() { + delete _savedArea; +} + +void SceneArea::setup(int resNum, int rlbNum, int subNum, int actionId) { + _resNum = resNum; + _rlbNum = rlbNum; + _subNum = subNum; + _actionId = actionId; + + _surface = surfaceFromRes(resNum, rlbNum, subNum); +} + +void SceneArea::draw2() { + _surface.draw(Common::Point(_bounds.left, _bounds.top)); +} + +void SceneArea::display() { + _bounds.left = _pt.x - (_surface.getBounds().width() / 2); + _bounds.top = _pt.y + 1 - _surface.getBounds().height(); + _bounds.setWidth(_surface.getBounds().width()); + _bounds.setHeight(_surface.getBounds().height()); + + _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + draw2(); +} + +void SceneArea::restore() { + assert(_savedArea); + _savedArea->draw(Common::Point(_bounds.left, _bounds.top)); + delete _savedArea; + _savedArea = NULL; +} + +void SceneArea::draw(bool flag) { + _surface = surfaceFromRes(_resNum, _rlbNum, flag ? _subNum + 1 : _subNum); + _surface.draw(Common::Point(_bounds.left, _bounds.top)); +} + +void SceneArea::wait() { + // Wait until a mouse or keypress + Event event; + while (!g_vm->shouldQuit() && !g_globals->_events.getEvent(event)) { + g_system->updateScreen(); + g_system->delayMillis(10); + } + + SynchronizedList<SceneItem *>::iterator ii; + for (ii = g_globals->_sceneItems.begin(); ii != g_globals->_sceneItems.end(); ++ii) { + SceneItem *sceneItem = *ii; + if (sceneItem->contains(event.mousePos)) { + sceneItem->doAction(_actionId); + break; + } + } + + g_globals->_events.setCursor(CURSOR_ARROW); +} + +void SceneArea::synchronize(Serializer &s) { + if (s.getVersion() >= 2) + SavedObject::synchronize(s); + + s.syncAsSint16LE(_pt.x); + s.syncAsSint16LE(_pt.y); + s.syncAsSint32LE(_resNum); + s.syncAsSint32LE(_rlbNum); + s.syncAsSint32LE(_subNum); + s.syncAsSint32LE(_actionId); + _bounds.synchronize(s); +} + +/*--------------------------------------------------------------------------*/ + +RingworldInvObjectList::RingworldInvObjectList() : + _stunner(2280, 1, 2, OBJECT_STUNNER, "This is your stunner."), + _scanner(1, 1, 3, OBJECT_SCANNER, "A combination scanner comm unit."), + _stasisBox(5200, 1, 4, OBJECT_STASIS_BOX, "A stasis box."), + _infoDisk(40, 1, 1, OBJECT_INFODISK, "The infodisk you took from the assassin."), + _stasisNegator(0, 2, 2, OBJECT_STASIS_NEGATOR, "The stasis field negator."), + _keyDevice(4250, 1, 6, OBJECT_KEY_DEVICE, "A magnetic key device."), + _medkit(2280, 1, 7, OBJECT_MEDKIT, "Your medkit."), + _ladder(4100, 1, 8, OBJECT_LADDER, "The chief's ladder."), + _rope(4150, 1, 9, OBJECT_ROPE, "The chief's rope."), + _key(7700, 1, 11, OBJECT_KEY, "A key."), + _translator(7700, 1, 13, OBJECT_TRANSLATOR, "The dolphin translator box."), + _ale(2150, 1, 10, OBJECT_ALE, "A bottle of ale."), + _paper(7700, 1, 12, OBJECT_PAPER, "A slip of paper with the numbers 2,4, and 3 written on it."), + _waldos(0, 1, 14, OBJECT_WALDOS, "A pair of waldos from the ruined probe."), + _stasisBox2(8100, 1, 4, OBJECT_STASIS_BOX2, "A stasis box."), + _ring(8100, 2, 5, OBJECT_RING, "This is a signet ring sent to you by Louis Wu."), + _cloak(9850, 2, 6, OBJECT_CLOAK, "A fine silk cloak."), + _tunic(9450, 2, 7, OBJECT_TUNIC, "The patriarch's soiled tunic."), + _candle(9500, 2, 8, OBJECT_CANDLE, "A tallow candle."), + _straw(9400, 2, 9, OBJECT_STRAW, "Clean, dry straw."), + _scimitar(9850, 1, 18, OBJECT_SCIMITAR, "A scimitar from the Patriarch's closet."), + _sword(9850, 1, 17, OBJECT_SWORD, "A short sword from the Patriarch's closet."), + _helmet(9500, 2, 4, OBJECT_HELMET, "Some type of helmet."), + _items(4300, 2, 10, OBJECT_ITEMS, "Two interesting items from the Tnuctipun vessel."), + _concentrator(4300, 2, 11, OBJECT_CONCENTRATOR, "The Tnuctipun anti-matter concentrator contained in a stasis field."), + _nullifier(5200, 2, 12, OBJECT_NULLIFIER, "A purported neural wave nullifier."), + _peg(4045, 2, 16, OBJECT_PEG, "A peg with a symbol."), + _vial(5100, 2, 17, OBJECT_VIAL, "A vial of the bat creatures anti-pheromone drug."), + _jacket(9850, 3, 1, OBJECT_JACKET, "A natty padded jacket."), + _tunic2(9850, 3, 2, OBJECT_TUNIC2, "A very hairy tunic."), + _bone(5300, 3, 5, OBJECT_BONE, "A very sharp bone."), + _jar(7700, 3, 4, OBJECT_JAR, "An jar filled with a green substance."), + _emptyJar(7700, 3, 3, OBJECT_EMPTY_JAR, "An empty jar.") { + + // Add the items to the list + _itemList.push_back(&_stunner); + _itemList.push_back(&_scanner); + _itemList.push_back(&_stasisBox); + _itemList.push_back(&_infoDisk); + _itemList.push_back(&_stasisNegator); + _itemList.push_back(&_keyDevice); + _itemList.push_back(&_medkit); + _itemList.push_back(&_ladder); + _itemList.push_back(&_rope); + _itemList.push_back(&_key); + _itemList.push_back(&_translator); + _itemList.push_back(&_ale); + _itemList.push_back(&_paper); + _itemList.push_back(&_waldos); + _itemList.push_back(&_stasisBox2); + _itemList.push_back(&_ring); + _itemList.push_back(&_cloak); + _itemList.push_back(&_tunic); + _itemList.push_back(&_candle); + _itemList.push_back(&_straw); + _itemList.push_back(&_scimitar); + _itemList.push_back(&_sword); + _itemList.push_back(&_helmet); + _itemList.push_back(&_items); + _itemList.push_back(&_concentrator); + _itemList.push_back(&_nullifier); + _itemList.push_back(&_peg); + _itemList.push_back(&_vial); + _itemList.push_back(&_jacket); + _itemList.push_back(&_tunic2); + _itemList.push_back(&_bone); + _itemList.push_back(&_jar); + _itemList.push_back(&_emptyJar); + + _selectedItem = NULL; +} + +/*--------------------------------------------------------------------------*/ + +void RingworldGame::start() { + // Set some default flags + g_globals->setFlag(12); + g_globals->setFlag(34); + + // Set the screen to scroll in response to the player moving off-screen + g_globals->_scrollFollower = &g_globals->_player; + + // Set the object's that will be in the player's inventory by default + RING_INVENTORY._stunner._sceneNumber = 1; + RING_INVENTORY._scanner._sceneNumber = 1; + RING_INVENTORY._ring._sceneNumber = 1; + + int slot = -1; + + if (ConfMan.hasKey("save_slot")) { + slot = ConfMan.getInt("save_slot"); + Common::String file = g_vm->generateSaveName(slot); + Common::InSaveFile *in = g_vm->_system->getSavefileManager()->openForLoading(file); + if (in) + delete in; + else + slot = -1; + } + + if (slot >= 0) + g_globals->_sceneHandler->_loadGameSlot = slot; + else + // Switch to the title screen + g_globals->_sceneManager.setNewScene(1000); + + g_globals->_events.showCursor(); +} + +void RingworldGame::restart() { + g_globals->_scenePalette.clearListeners(); + g_globals->_soundHandler.stop(); + + // Reset the flags + g_globals->reset(); + g_globals->setFlag(34); + + // Clear save/load slots + g_globals->_sceneHandler->_saveGameSlot = -1; + g_globals->_sceneHandler->_loadGameSlot = -1; + + g_globals->_stripNum = 0; + g_globals->_events.setCursor(CURSOR_WALK); + + // Reset item properties + RING_INVENTORY._stunner._sceneNumber = 1; + RING_INVENTORY._scanner._sceneNumber = 1; + RING_INVENTORY._stasisBox._sceneNumber = 5200; + RING_INVENTORY._infoDisk._sceneNumber = 40; + RING_INVENTORY._stasisNegator._sceneNumber = 0; + RING_INVENTORY._keyDevice._sceneNumber = 0; + RING_INVENTORY._medkit._sceneNumber = 2280; + RING_INVENTORY._ladder._sceneNumber = 4100; + RING_INVENTORY._rope._sceneNumber = 4150; + RING_INVENTORY._key._sceneNumber = 7700; + RING_INVENTORY._translator._sceneNumber = 2150; + RING_INVENTORY._paper._sceneNumber = 7700; + RING_INVENTORY._waldos._sceneNumber = 0; + RING_INVENTORY._ring._sceneNumber = 1; + RING_INVENTORY._stasisBox2._sceneNumber = 8100; + RING_INVENTORY._cloak._sceneNumber = 9850; + RING_INVENTORY._tunic._sceneNumber = 9450; + RING_INVENTORY._candle._sceneNumber = 9500; + RING_INVENTORY._straw._sceneNumber = 9400; + RING_INVENTORY._scimitar._sceneNumber = 9850; + RING_INVENTORY._sword._sceneNumber = 9850; + RING_INVENTORY._helmet._sceneNumber = 9500; + RING_INVENTORY._items._sceneNumber = 4300; + RING_INVENTORY._concentrator._sceneNumber = 4300; + RING_INVENTORY._nullifier._sceneNumber = 4300; + RING_INVENTORY._peg._sceneNumber = 4045; + RING_INVENTORY._vial._sceneNumber = 5100; + RING_INVENTORY._jacket._sceneNumber = 9850; + RING_INVENTORY._tunic2._sceneNumber = 9850; + RING_INVENTORY._bone._sceneNumber = 5300; + RING_INVENTORY._jar._sceneNumber = 7700; + RING_INVENTORY._emptyJar._sceneNumber = 7700; + RING_INVENTORY._selectedItem = NULL; + + // Change to the first game scene + g_globals->_sceneManager.changeScene(30); +} + +void RingworldGame::endGame(int resNum, int lineNum) { + g_globals->_events.setCursor(CURSOR_WALK); + Common::String msg = g_resourceManager->getMessage(resNum, lineNum); + bool savesExist = g_saver->savegamesExist(); + + if (!savesExist) { + // No savegames exist, so prompt the user to restart or quit + if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0) + g_vm->quitGame(); + else + restart(); + } else { + // Savegames exist, so prompt for Restore/Restart + bool breakFlag; + do { + if (g_vm->shouldQuit()) { + breakFlag = true; + } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) { + restart(); + breakFlag = true; + } else { + handleSaveLoad(false, g_globals->_sceneHandler->_loadGameSlot, g_globals->_sceneHandler->_saveName); + breakFlag = g_globals->_sceneHandler->_loadGameSlot >= 0; + } + } while (!breakFlag); + } + + g_globals->_events.setCursorFromFlag(); +} + +void RingworldGame::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; + } + } +} + +void RingworldGame::rightClick() { + RightClickDialog *dlg = new RightClickDialog(); + dlg->execute(); + delete dlg; +} + +/*--------------------------------------------------------------------------*/ + +NamedHotspot::NamedHotspot() : SceneHotspot() { + _resNum = 0; + _lookLineNum = _useLineNum = _talkLineNum = -1; +} + +void NamedHotspot::doAction(int action) { + switch (action) { + case CURSOR_WALK: + // Nothing + return; + case CURSOR_LOOK: + if (_lookLineNum == -1) + break; + + SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return; + case CURSOR_USE: + if (_useLineNum == -1) + break; + + SceneItem::display(_resNum, _useLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return; + case CURSOR_TALK: + if (_talkLineNum == -1) + break; + + SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return; + default: + break; + } + + SceneHotspot::doAction(action); +} + +void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) { + setBounds(ys, xe, ye, xs); + _resNum = resnum; + _lookLineNum = lookLineNum; + _useLineNum = useLineNum; + _talkLineNum = -1; + g_globals->_sceneItems.addItems(this, NULL); +} + +void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { + setBounds(bounds); + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + switch (mode) { + case 2: + g_globals->_sceneItems.push_front(this); + break; + case 4: + g_globals->_sceneItems.addBefore(item, this); + break; + case 5: + g_globals->_sceneItems.addAfter(item, this); + break; + default: + g_globals->_sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) { + _sceneRegionId = sceneRegionId; + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + // Handle adding hotspot to scene items list as necessary + switch (mode) { + case 2: + GLOBALS._sceneItems.push_front(this); + break; + case 3: + break; + default: + GLOBALS._sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::synchronize(Serializer &s) { + SceneHotspot::synchronize(s); + s.syncAsSint16LE(_resNum); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_useLineNum); + + if (g_vm->getGameID() == GType_BlueForce) + s.syncAsSint16LE(_talkLineNum); +} + + +} // End of namespace Ringworld + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld/ringworld_logic.h b/engines/tsage/ringworld/ringworld_logic.h new file mode 100644 index 0000000000..6f6a66cc26 --- /dev/null +++ b/engines/tsage/ringworld/ringworld_logic.h @@ -0,0 +1,191 @@ +/* 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_RINGWORLD_LOGIC_H +#define TSAGE_RINGWORLD_LOGIC_H + +#include "common/scummsys.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" + +namespace TsAGE { + +namespace Ringworld { + +using namespace TsAGE; + +class SceneFactory { +public: + static Scene *createScene(int sceneNumber); +}; + +class DisplayHotspot : public SceneObject { +private: + Common::Array<int> _actions; + bool performAction(int action); +public: + DisplayHotspot(int regionId, ...); + + virtual void doAction(int action) { + if (!performAction(action)) + SceneHotspot::doAction(action); + } +}; + +class DisplayObject : public SceneObject { +private: + Common::Array<int> _actions; + bool performAction(int action); +public: + DisplayObject(int firstAction, ...); + + virtual void doAction(int action) { + if (!performAction(action)) + SceneHotspot::doAction(action); + } +}; + +class SceneObjectExt : public SceneObject { +public: + int _state; + + virtual void synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsSint16LE(_state); + } + virtual Common::String getClassName() { return "SceneObjectExt"; } +}; + +class SceneArea : public SavedObject { +public: + GfxSurface _surface; + GfxSurface *_savedArea; + Common::Point _pt; + int _resNum; + int _rlbNum; + int _subNum; + int _actionId; + Rect _bounds; +public: + SceneArea(); + ~SceneArea(); + + void setup(int resNum, int rlbNum, int subNum, int actionId); + void draw2(); + void display(); + void restore(); + + virtual void synchronize(Serializer &s); + virtual void draw(bool flag); + virtual void wait(); +}; + +/*--------------------------------------------------------------------------*/ + +class RingworldInvObjectList : public InvObjectList { +public: + InvObject _stunner; + InvObject _scanner; + InvObject _stasisBox; + InvObject _infoDisk; + InvObject _stasisNegator; + InvObject _keyDevice; + InvObject _medkit; + InvObject _ladder; + InvObject _rope; + InvObject _key; + InvObject _translator; + InvObject _ale; + InvObject _paper; + InvObject _waldos; + InvObject _stasisBox2; + InvObject _ring; + InvObject _cloak; + InvObject _tunic; + InvObject _candle; + InvObject _straw; + InvObject _scimitar; + InvObject _sword; + InvObject _helmet; + InvObject _items; + InvObject _concentrator; + InvObject _nullifier; + InvObject _peg; + InvObject _vial; + InvObject _jacket; + InvObject _tunic2; + InvObject _bone; + InvObject _jar; + InvObject _emptyJar; +public: + RingworldInvObjectList(); + + virtual Common::String getClassName() { return "RingworldInvObjectList"; } +}; + +#define RING_INVENTORY (*((::TsAGE::Ringworld::RingworldInvObjectList *)g_globals->_inventory)) + +class RingworldGame: public Game { +public: + virtual void start(); + virtual void restart(); + virtual void endGame(int resNum, int lineNum); + + virtual Scene *createScene(int sceneNumber); + virtual void processEvent(Event &event); + virtual void rightClick(); + virtual bool canSaveGameStateCurrently(); + virtual bool canLoadGameStateCurrently(); +}; + +class NamedHotspot : public SceneHotspot { +public: + int _resNum, _lookLineNum, _useLineNum, _talkLineNum; + NamedHotspot(); + + virtual void doAction(int action); + virtual Common::String getClassName() { return "NamedHotspot"; } + virtual void synchronize(Serializer &s); + virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum); + virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item); + virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode); +}; + +class NamedHotspotExt : public NamedHotspot { +public: + int _flag; + NamedHotspotExt() { _flag = 0; } + + virtual Common::String getClassName() { return "NamedHotspot"; } + virtual void synchronize(Serializer &s) { + NamedHotspot::synchronize(s); + s.syncAsSint16LE(_flag); + } +}; + +} // End of namespace Ringworld + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld/ringworld_scenes1.cpp index 7fe2610fd7..4d9d565705 100644 --- a/engines/tsage/ringworld_scenes1.cpp +++ b/engines/tsage/ringworld/ringworld_scenes1.cpp @@ -20,12 +20,14 @@ * */ -#include "tsage/ringworld_scenes1.h" +#include "tsage/ringworld/ringworld_scenes1.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { /*-------------------------------------------------------------------------- * Scene 10 - Kziniti Palace (Introduction) @@ -33,14 +35,14 @@ namespace tSage { *--------------------------------------------------------------------------*/ void Scene10::Action1::signal() { - Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene; + Scene10 *scene = (Scene10 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(6); break; case 1: - _globals->_scenePalette.addRotation(240, 254, -1); + g_globals->_scenePalette.addRotation(240, 254, -1); scene->_stripManager.start(10, this); break; case 2: @@ -98,21 +100,21 @@ void Scene10::Action1::signal() { scene->_object4.animate(ANIM_MODE_6, this); break; case 10: - _globals->_soundHandler.fadeOut(this); + g_globals->_soundHandler.fadeOut(this); break; case 11: - _globals->_scenePalette.clearListeners(); - _globals->_sceneManager.changeScene(15); + g_globals->_scenePalette.clearListeners(); + g_globals->_sceneManager.changeScene(15); break; } } void Scene10::Action2::signal() { - Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene; + Scene10 *scene = (Scene10 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(179)); + setDelay(g_globals->_randomSource.getRandomNumber(179)); break; case 1: scene->_object3.setFrame(1); @@ -181,11 +183,11 @@ void Scene10::postInit(SceneObjectList *OwnerList) { _object6.animate(ANIM_MODE_2, NULL); _object6._numFrames = 5; - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; setAction(&_action1); - _globals->_soundHandler.play(5); + g_globals->_soundHandler.play(5); } void Scene10::stripCallback(int v) { @@ -211,7 +213,7 @@ void Scene10::stripCallback(int v) { *--------------------------------------------------------------------------*/ void Scene15::Action1::signal() { - Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene; + Scene15 *scene = (Scene15 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -237,13 +239,13 @@ void Scene15::Action1::signal() { } case 3: SceneItem::display(0, 0); - _globals->_sceneManager.changeScene(20); + g_globals->_sceneManager.changeScene(20); break; } } void Scene15::Action1::dispatch() { - Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene; + Scene15 *scene = (Scene15 *)g_globals->_sceneManager._scene; if (scene->_object1._position.y < 100) scene->_object1.changeZoom(100 - scene->_object1._position.y); @@ -256,7 +258,7 @@ void Scene15::postInit(SceneObjectList *OwnerList) { loadScene(15); Scene::postInit(); setZoomPercents(0, 100, 200, 100); - _globals->_soundHandler.play(6); + g_globals->_soundHandler.play(6); setAction(&_action1); } @@ -266,7 +268,7 @@ void Scene15::postInit(SceneObjectList *OwnerList) { *--------------------------------------------------------------------------*/ void Scene20::Action1::signal() { - Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; + Scene20 *scene = (Scene20 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -276,11 +278,11 @@ void Scene20::Action1::signal() { scene->_stripManager.start(20, this); break; case 2: - _globals->_soundHandler.fadeOut(this); + g_globals->_soundHandler.fadeOut(this); break; case 3: - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_sceneManager.changeScene(30); // First game scene + g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + g_globals->_sceneManager.changeScene(30); // First game scene break; default: break; @@ -288,7 +290,7 @@ void Scene20::Action1::signal() { } void Scene20::Action2::signal() { - Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; + Scene20 *scene = (Scene20 *)g_globals->_sceneManager._scene; NpcMover *npcMover; switch (_actionIndex++) { @@ -303,51 +305,51 @@ void Scene20::Action2::signal() { case 2: { NpcMover *mover = new NpcMover(); Common::Point pt(455, 77); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); ObjectMover2 *mover2 = new ObjectMover2(); - scene->_SceneObjectExt.addMover(mover2, 5, 10, &_globals->_player); + scene->_SceneObjectExt.addMover(mover2, 5, 10, &g_globals->_player); ObjectMover2 *mover3 = new ObjectMover2(); - scene->_sceneObject3.addMover(mover3, 10, 15, &_globals->_player); + scene->_sceneObject3.addMover(mover3, 10, 15, &g_globals->_player); break; } case 3: { npcMover = new NpcMover(); Common::Point pt(557, 100); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); break; } case 4: { npcMover = new NpcMover(); Common::Point pt(602, 90); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); break; } case 5: { npcMover = new NpcMover(); Common::Point pt(618, 90); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); break; } case 6: { npcMover = new NpcMover(); Common::Point pt(615, 81); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); break; } case 7: { npcMover = new NpcMover(); Common::Point pt(588, 79); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); break; } case 8: scene->_sound.release(); - _globals->_soundHandler.fadeOut(this); + g_globals->_soundHandler.fadeOut(this); break; case 9: SceneItem::display(0, 0, LIST_END); - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_sceneManager.changeScene(40); + g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + g_globals->_sceneManager.changeScene(40); break; default: break; @@ -355,7 +357,7 @@ void Scene20::Action2::signal() { } void Scene20::Action3::signal() { - Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; + Scene20 *scene = (Scene20 *)g_globals->_sceneManager._scene; NpcMover *npcMover; switch (_actionIndex++) { @@ -365,47 +367,47 @@ void Scene20::Action3::signal() { case 1: { npcMover = new NpcMover(); Common::Point pt(615, 81); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); ObjectMover2 *mover1 = new ObjectMover2(); - scene->_SceneObjectExt.addMover(mover1, 5, 10, &_globals->_player); + scene->_SceneObjectExt.addMover(mover1, 5, 10, &g_globals->_player); ObjectMover2 *mover2 = new ObjectMover2(); - scene->_sceneObject3.addMover(mover2, 20, 25, &_globals->_player); + scene->_sceneObject3.addMover(mover2, 20, 25, &g_globals->_player); break; } case 2: { npcMover = new NpcMover(); Common::Point pt(618, 90); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); break; } case 3: { - _globals->_player._moveDiff = Common::Point(10, 10); + g_globals->_player._moveDiff = Common::Point(10, 10); scene->_SceneObjectExt._moveDiff = Common::Point(10, 10); scene->_sceneObject3._moveDiff = Common::Point(10, 10); npcMover = new NpcMover(); Common::Point pt(445, 132); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); break; } case 4: { npcMover = new NpcMover(); Common::Point pt(151, 137); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); break; } case 5: { npcMover = new NpcMover(); Common::Point pt(-15, 137); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); break; } case 6: scene->_sound.play(60, this, 127); - _globals->_soundHandler.release(); + g_globals->_soundHandler.release(); break; case 7: - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_sceneManager.changeScene(90); + g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + g_globals->_sceneManager.changeScene(90); break; default: break; @@ -413,7 +415,7 @@ void Scene20::Action3::signal() { } void Scene20::Action4::signal() { - Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene; + Scene20 *scene = (Scene20 *)g_globals->_sceneManager._scene; NpcMover *npcMover; switch (_actionIndex++) { @@ -423,20 +425,20 @@ void Scene20::Action4::signal() { case 1: { npcMover = new NpcMover(); Common::Point pt(486, 134); - _globals->_player.addMover(npcMover, &pt, this); + g_globals->_player.addMover(npcMover, &pt, this); ObjectMover2 *mover1 = new ObjectMover2(); - scene->_SceneObjectExt.addMover(mover1, 20, 35, &_globals->_player); + scene->_SceneObjectExt.addMover(mover1, 20, 35, &g_globals->_player); break; } case 2: { - _globals->_player._moveDiff = Common::Point(12, 12); + g_globals->_player._moveDiff = Common::Point(12, 12); scene->_SceneObjectExt._moveDiff = Common::Point(12, 12); NpcMover *mover1 = new NpcMover(); Common::Point pt(486, 134); scene->_sceneObject3.addMover(mover1, &pt, this); NpcMover *mover2 = new NpcMover(); pt = Common::Point(-15, 134); - _globals->_player.addMover(mover2, &pt, NULL); + g_globals->_player.addMover(mover2, &pt, NULL); NpcMover *mover3 = new NpcMover(); pt = Common::Point(-15, 134); scene->_SceneObjectExt.addMover(mover3, &pt, NULL); @@ -483,7 +485,7 @@ void Scene20::Action4::signal() { scene->_sceneObject5._moveDiff.x = 48; ObjectMover3 *mover = new ObjectMover3(); - scene->_sceneObject5.addMover(mover, &_globals->_player, 4, this); + scene->_sceneObject5.addMover(mover, &g_globals->_player, 4, this); break; } case 6: { @@ -492,24 +494,24 @@ void Scene20::Action4::signal() { scene->_SceneObjectExt.animate(ANIM_MODE_2, NULL); scene->_sceneObject5.remove(); - _globals->_player.setVisage(21); - _globals->_player.setStrip(1); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); - _globals->_player._moveDiff.x = 4; + g_globals->_player.setVisage(21); + g_globals->_player.setStrip(1); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player._moveDiff.x = 4; npcMover = new NpcMover(); - Common::Point pt(_globals->_player._position.x - 25, _globals->_player._position.y + 5); - _globals->_player.addMover(npcMover, &pt, this); + Common::Point pt(g_globals->_player._position.x - 25, g_globals->_player._position.y + 5); + g_globals->_player.addMover(npcMover, &pt, this); break; } case 7: - _globals->_player.setStrip(2); - _globals->_player.animate(ANIM_MODE_2, NULL); + g_globals->_player.setStrip(2); + g_globals->_player.animate(ANIM_MODE_2, NULL); scene->_sound.play(77, this, 127); break; case 8: - _globals->_game->endGame(20, 0); + g_globals->_game->endGame(20, 0); break; default: break; @@ -527,15 +529,15 @@ void Scene20::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerQText); _stripManager.addSpeaker(&_speakerGameText); - _speakerQText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; - if (_globals->_sceneManager._previousScene == 30) { + if (g_globals->_sceneManager._previousScene == 30) { // Cut scene: Assassins are coming - _globals->_player.postInit(); - _globals->_player.setVisage(20); - _globals->_player.setPosition(Common::Point(405, 69)); - _globals->_player._moveDiff = Common::Point(10, 10); - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.postInit(); + g_globals->_player.setVisage(20); + g_globals->_player.setPosition(Common::Point(405, 69)); + g_globals->_player._moveDiff = Common::Point(10, 10); + g_globals->_player.animate(ANIM_MODE_1, NULL); _SceneObjectExt.postInit(); _SceneObjectExt.setVisage(20); @@ -549,21 +551,21 @@ void Scene20::postInit(SceneObjectList *OwnerList) { _SceneObjectExt._moveDiff = Common::Point(10, 10); _sceneObject3._moveDiff = Common::Point(10, 10); - _globals->_soundHandler.play(20); + g_globals->_soundHandler.play(20); _sound.play(21); _sound.holdAt(true); setAction(&_action2); _sceneBounds = Rect(320, 0, 640, 200); - } else if (_globals->_sceneManager._previousScene == 60) { + } else if (g_globals->_sceneManager._previousScene == 60) { // Evasion _sound.play(30); - _globals->_player.postInit(); - _globals->_player.setVisage(20); - _globals->_player.setPosition(Common::Point(588, 79)); - _globals->_player._moveDiff = Common::Point(5, 5); - _globals->_player.fixPriority(50); - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.postInit(); + g_globals->_player.setVisage(20); + g_globals->_player.setPosition(Common::Point(588, 79)); + g_globals->_player._moveDiff = Common::Point(5, 5); + g_globals->_player.fixPriority(50); + g_globals->_player.animate(ANIM_MODE_1, NULL); _SceneObjectExt.postInit(); _SceneObjectExt.setVisage(20); @@ -576,28 +578,28 @@ void Scene20::postInit(SceneObjectList *OwnerList) { _sceneObject3.setPosition(Common::Point(595, 79)); _sceneObject3.animate(ANIM_MODE_1, NULL); - if ((_globals->getFlag(120) && _globals->getFlag(116)) || - (_globals->getFlag(117) && _globals->getFlag(119))) { + if ((g_globals->getFlag(120) && g_globals->getFlag(116)) || + (g_globals->getFlag(117) && g_globals->getFlag(119))) { // Successful evasion setAction(&_action3); - } else if (_globals->getFlag(104)) { + } else if (g_globals->getFlag(104)) { _sceneMode = 21; - setAction(&_sequenceManager, this, 21, &_globals->_player, &_SceneObjectExt, NULL); + setAction(&_sequenceManager, this, 21, &g_globals->_player, &_SceneObjectExt, NULL); } else { // Failed evasion _sceneObject3._moveDiff = Common::Point(8, 8); setAction(&_action4); } - _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); + _sceneBounds.center(g_globals->_player._position.x, g_globals->_player._position.y); } else { // Intro: Quinn looking at the monaster - _globals->_player.postInit(); - _globals->_player.setVisage(2640); - _globals->_player.animate(ANIM_MODE_NONE, NULL); - _globals->_player.setStrip2(1); - _globals->_player.setFrame2(4); - _globals->_player.fixPriority(200); - _globals->_player.setPosition(Common::Point(425, 233)); + g_globals->_player.postInit(); + g_globals->_player.setVisage(2640); + g_globals->_player.animate(ANIM_MODE_NONE, NULL); + g_globals->_player.setStrip2(1); + g_globals->_player.setFrame2(4); + g_globals->_player.fixPriority(200); + g_globals->_player.setPosition(Common::Point(425, 233)); setAction(&_action1); _speakerQText.setTextPos(Common::Point(350, 20)); @@ -605,17 +607,17 @@ void Scene20::postInit(SceneObjectList *OwnerList) { _speakerGameText.setTextPos(Common::Point(350, 20)); _speakerGameText._textWidth = 260; - _globals->_soundHandler.play(8); + g_globals->_soundHandler.play(8); _sceneBounds = Rect(320, 0, 640, 200); } - _globals->_player.disableControl(); + g_globals->_player.disableControl(); loadScene(20); } void Scene20::signal() { if (_sceneMode == 21) - _globals->_sceneManager.changeScene(90); + g_globals->_sceneManager.changeScene(90); } /*-------------------------------------------------------------------------- @@ -629,7 +631,7 @@ void Scene30::BeamObject::doAction(int action) { else if (action == CURSOR_LOOK) display2(30, 2); else if (action == CURSOR_USE) { - Scene30 *parent = (Scene30 *)_globals->_sceneManager._scene; + Scene30 *parent = (Scene30 *)g_globals->_sceneManager._scene; parent->setAction(&parent->_beamAction); } else SceneObject::doAction(action); @@ -647,38 +649,38 @@ void Scene30::DoorObject::doAction(int action) { } void Scene30::BeamAction::signal() { - Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; + Scene30 *scene = (Scene30 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { // Disable control and move player to the doorway beam - _globals->_player.disableControl(); + g_globals->_player.disableControl(); NpcMover *mover = new NpcMover(); Common::Point pt(114, 198); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: // Perform the animation of player raising hand - _globals->_player.setVisage(31); - _globals->_player.setStrip(1); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(31); + g_globals->_player.setStrip(1); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: // Hide the beam and lower the player's hand scene->_sound.play(10, NULL, 127); - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.animate(ANIM_MODE_6, this); scene->_beam.remove(); break; case 3: { // Bring the Kzin to the doorway - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(7); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setStrip(7); scene->_kzin.postInit(); scene->_kzin.setVisage(2801); scene->_kzin.animate(ANIM_MODE_1, NULL); @@ -687,7 +689,7 @@ void Scene30::BeamAction::signal() { NpcMover *mover = new NpcMover(); Common::Point pt(158, 170); scene->_kzin.addMover(mover, &pt, this); - _globals->_sceneItems.push_front(&scene->_kzin); + g_globals->_sceneItems.push_front(&scene->_kzin); break; } @@ -700,7 +702,7 @@ void Scene30::BeamAction::signal() { case 5: // Run the Kzin's talk sequence scene->_sound.play(13, NULL, 127); - _globals->_soundHandler.play(12, NULL, 127); + g_globals->_soundHandler.play(12, NULL, 127); scene->_stripManager.start((scene->_sceneMode == 0) ? 30 : 37, this); break; @@ -713,7 +715,7 @@ void Scene30::BeamAction::signal() { // Re-activate player control scene->_sceneMode = 31; scene->_kzin.setAction(&scene->_kzinAction); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); // End this action remove(); @@ -725,19 +727,19 @@ void Scene30::BeamAction::signal() { } void Scene30::KzinAction::signal() { - Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; + Scene30 *scene = (Scene30 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(1200); break; case 1: - _globals->_soundHandler.fadeOut(NULL); - _globals->_player.disableControl(); - setAction(&scene->_sequenceManager, _globals->_sceneManager._scene, 31, &scene->_kzin, &scene->_door, NULL); + g_globals->_soundHandler.fadeOut(NULL); + g_globals->_player.disableControl(); + setAction(&scene->_sequenceManager, g_globals->_sceneManager._scene, 31, &scene->_kzin, &scene->_door, NULL); break; case 2: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; default: @@ -746,28 +748,28 @@ void Scene30::KzinAction::signal() { } void Scene30::RingAction::signal() { - Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; + Scene30 *scene = (Scene30 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_kzin.setAction(NULL); NpcMover *mover = new NpcMover(); Common::Point pt(114, 198); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: - _globals->_player.checkAngle(&scene->_kzin); + g_globals->_player.checkAngle(&scene->_kzin); scene->_stripManager.start(32, this); break; case 2: { - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.animate(ANIM_MODE_1, NULL); NpcMover *mover = new NpcMover(); Common::Point pt(143, 177); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } @@ -783,7 +785,7 @@ void Scene30::RingAction::signal() { scene->_kzin.addMover(kzinMover, &pt, this); NpcMover *playerMover = new NpcMover(); pt = Common::Point(335, 36); - _globals->_player.addMover(playerMover, &pt, this); + g_globals->_player.addMover(playerMover, &pt, this); break; } @@ -791,7 +793,7 @@ void Scene30::RingAction::signal() { break; case 6: - _globals->_sceneManager.changeScene(20); + g_globals->_sceneManager.changeScene(20); break; default: @@ -800,19 +802,19 @@ void Scene30::RingAction::signal() { } void Scene30::TalkAction::signal() { - Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; + Scene30 *scene = (Scene30 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_kzin.setAction(NULL); NpcMover *mover = new NpcMover(); Common::Point pt(114, 198); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: - _globals->_player.checkAngle(&scene->_kzin); + g_globals->_player.checkAngle(&scene->_kzin); scene->_stripManager.start(34, this); break; case 2: @@ -820,7 +822,7 @@ void Scene30::TalkAction::signal() { break; case 3: scene->_kzin.setAction(&scene->_kzinAction); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; default: @@ -831,7 +833,7 @@ void Scene30::TalkAction::signal() { /*--------------------------------------------------------------------------*/ void Scene30::KzinObject::doAction(int action) { - Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene; + Scene30 *scene = (Scene30 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: @@ -851,7 +853,7 @@ void Scene30::KzinObject::doAction(int action) { display2(30, 10); break; case CURSOR_TALK: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_talkAction); break; default: @@ -879,19 +881,19 @@ void Scene30::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerSText); _stripManager.addSpeaker(&_speakerQText); _speakerSText._npc = &_kzin; - _speakerQText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; // Setup player - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setStrip(7); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(114, 198)); - _globals->_player.changeZoom(75); - _globals->_player.enableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setStrip(7); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(114, 198)); + g_globals->_player.changeZoom(75); + g_globals->_player.enableControl(); // Set up beam object _beam.postInit(); @@ -909,7 +911,7 @@ void Scene30::postInit(SceneObjectList *OwnerList) { _courtyardHotspot.setBounds(Rect(0, 0, 320, 200)); // Add the objects and hotspots to the scene - _globals->_sceneItems.addItems(&_beam, &_wallsHotspot, &_door, &_treeHotspot, &_groundHotspot, + g_globals->_sceneItems.addItems(&_beam, &_wallsHotspot, &_door, &_treeHotspot, &_groundHotspot, &_courtyardHotspot, NULL); // Load the scene data @@ -925,12 +927,12 @@ void Scene30::signal() { _beam.setStrip(2); _beam.setPosition(Common::Point(124, 178)); _beam.fixPriority(188); - _globals->_sceneItems.push_front(&_beam); - _globals->_player.enableControl(); + g_globals->_sceneItems.push_front(&_beam); + g_globals->_player.enableControl(); } else if (_sceneMode == 32) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 31; - setAction(&_sequenceManager, _globals->_sceneManager._scene, 31, &_kzin, &_door, NULL); + setAction(&_sequenceManager, g_globals->_sceneManager._scene, 31, &_kzin, &_door, NULL); } } @@ -940,14 +942,14 @@ void Scene30::signal() { *--------------------------------------------------------------------------*/ void Scene40::Action1::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(120); break; case 1: - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(40, this); break; case 2: @@ -960,7 +962,7 @@ void Scene40::Action1::signal() { case 3: scene->_doorway.hide(); scene->_dyingKzin.setPosition(Common::Point(296, 62)); - _globals->_player.animate(ANIM_MODE_5, NULL); + g_globals->_player.animate(ANIM_MODE_5, NULL); scene->_object1.setVisage(43); scene->_object1.setStrip(3); scene->_object1.animate(ANIM_MODE_5, NULL); @@ -1024,8 +1026,8 @@ void Scene40::Action1::signal() { break; } case 12: { - _globals->_soundHandler.play(26); - _globals->_player._uiEnabled = true; + g_globals->_soundHandler.play(26); + g_globals->_player._uiEnabled = true; scene->_assassin.setVisage(42); scene->_assassin.setPosition(Common::Point(4, 191)); scene->_assassin.setStrip(1); @@ -1046,41 +1048,41 @@ void Scene40::Action1::signal() { scene->_soundHandler.play(28); break; case 15: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_object1.setVisage(40); scene->_object1.setStrip(4); scene->_object1.setFrame(1); scene->_object1.animate(ANIM_MODE_5, NULL); - _globals->_player.setVisage(40); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(40); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 16: - _globals->_soundHandler.play(77, this); + g_globals->_soundHandler.play(77, this); break; case 17: - _globals->_game->endGame(40, 20); + g_globals->_game->endGame(40, 20); remove(); break; } } void Scene40::Action2::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); if (scene->_assassin._position.x < 229) _actionIndex = 0; setDelay(1); break; case 1: scene->_assassin.animate(ANIM_MODE_NONE, NULL); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: { scene->_soundHandler.play(28); @@ -1107,19 +1109,19 @@ void Scene40::Action2::signal() { RING_INVENTORY._infoDisk._sceneNumber = 40; break; case 4: - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 5: { - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(1); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setStrip(1); Common::Point pt(230, 195); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 6: { - _globals->_player.setStrip(7); + g_globals->_player.setStrip(7); scene->_object1.setVisage(2806); scene->_object1.animate(ANIM_MODE_1, NULL); SceneObjectWrapper *wrapper = new SceneObjectWrapper(); @@ -1141,45 +1143,45 @@ void Scene40::Action2::signal() { case 9: scene->_dyingKzin.setAction(&scene->_action7); scene->_object1.remove(); - _globals->_stripNum = 88; - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.enableControl(); + g_globals->_stripNum = 88; + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.enableControl(); scene->_assassin.setAction(&scene->_action8); break; } } void Scene40::Action3::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { - _globals->_player.setAction(NULL); - _globals->_stripNum = 99; - _globals->_player.disableControl(); + g_globals->_player.setAction(NULL); + g_globals->_stripNum = 99; + g_globals->_player.disableControl(); Common::Point pt(240, 195); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: - _globals->_player.setVisage(5010); - _globals->_player._strip = 2; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_4, 5, 1, this); + g_globals->_player.setVisage(5010); + g_globals->_player._strip = 2; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_4, 5, 1, this); break; case 2: scene->_assassin.setStrip(2); scene->_assassin.setFrame(1); RING_INVENTORY._infoDisk._sceneNumber = 1; - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 3: - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(7); - _globals->_stripNum = 88; - _globals->_player.enableControl(); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setStrip(7); + g_globals->_stripNum = 88; + g_globals->_player.enableControl(); remove(); break; } @@ -1190,22 +1192,22 @@ void Scene40::Action4::signal() { case 0: { Common::Point pt(178, 190); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: - _globals->_stripNum = 88; - _globals->_player.enableControl(); + g_globals->_stripNum = 88; + g_globals->_player.enableControl(); break; } } void Scene40::Action5::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(119) + 120); + setDelay(g_globals->_randomSource.getRandomNumber(119) + 120); break; case 1: scene->_object2.animate(ANIM_MODE_8, 1, this); @@ -1214,7 +1216,7 @@ void Scene40::Action5::signal() { } void Scene40::Action6::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { @@ -1251,17 +1253,17 @@ void Scene40::Action6::signal() { } void Scene40::Action7::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(499) + 500); + setDelay(g_globals->_randomSource.getRandomNumber(499) + 500); break; case 1: scene->_object7.postInit(); scene->_object7.setVisage(46); - if (_globals->_randomSource.getRandomNumber(32767) >= 16384) { + if (g_globals->_randomSource.getRandomNumber(32767) >= 16384) { scene->_object7.setStrip(3); scene->_object7.setPosition(Common::Point(15, 185)); } else { @@ -1280,16 +1282,16 @@ void Scene40::Action7::signal() { } void Scene40::Action8::signal() { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(300); break; case 1: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); - if ((_globals->_player._position.y >= 197) || (_globals->_player._visage)) { + if ((g_globals->_player._position.y >= 197) || (g_globals->_player._visage)) { _actionIndex = 1; setDelay(30); } else { @@ -1299,7 +1301,7 @@ void Scene40::Action8::signal() { scene->_doorway.fixPriority(200); scene->_doorway._moveRate = 60; - if (_globals->_player._position.x >= 145) { + if (g_globals->_player._position.x >= 145) { scene->_doorway.fixPriority(-1); scene->_doorway.setPosition(Common::Point(6, 157)); } else { @@ -1307,7 +1309,7 @@ void Scene40::Action8::signal() { } scene->_doorway._moveDiff = Common::Point(40, 40); - Common::Point pt(_globals->_player._position.x, _globals->_player._position.y - 18); + Common::Point pt(g_globals->_player._position.x, g_globals->_player._position.y - 18); NpcMover *mover = new NpcMover(); scene->_doorway.addMover(mover, &pt, this); scene->_doorway.animate(ANIM_MODE_5, NULL); @@ -1315,21 +1317,39 @@ void Scene40::Action8::signal() { break; case 2: scene->_doorway.remove(); - _globals->_player.setVisage(40); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(40); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 3: - _globals->_soundHandler.play(77, this); + g_globals->_soundHandler.play(77, this); break; case 4: - _globals->_game->endGame(40, 45); + g_globals->_game->endGame(40, 45); remove(); break; } } +void Scene40::Action8::dispatch() { + if (_action) + _action->dispatch(); + + if (_delayFrames) { + uint32 frameNumber = g_globals->_events.getFrameNumber(); + if ((_startFrame + 60) < frameNumber) { + --_delayFrames; + _startFrame = frameNumber; + + if (_delayFrames <= 0) { + _delayFrames = 0; + signal(); + } + } + } +} + /*--------------------------------------------------------------------------*/ void Scene40::DyingKzin::doAction(int action) { @@ -1353,14 +1373,14 @@ void Scene40::DyingKzin::doAction(int action) { } void Scene40::Assassin::doAction(int action) { - Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene; + Scene40 *scene = (Scene40 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: if (scene->_assassin._visage == 44) SceneItem::display2(40, 21); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(230, 187); NpcMover *mover = new NpcMover(); addMover(mover, &pt, NULL); @@ -1382,7 +1402,7 @@ void Scene40::Assassin::doAction(int action) { else if (RING_INVENTORY._infoDisk._sceneNumber == 1) SceneItem::display2(40, 19); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setAction(&scene->_action3); } break; @@ -1401,7 +1421,7 @@ void Scene40::Item2::doAction(int action) { switch (action) { case OBJECT_STUNNER: SceneItem::display2(40, 35); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); break; case OBJECT_SCANNER: SceneItem::display2(40, 34); @@ -1416,7 +1436,7 @@ void Scene40::Item2::doAction(int action) { SceneItem::display2(40, 37); break; default: - SceneItem::doAction(action); + SceneHotspot::doAction(action); break; } } @@ -1425,7 +1445,7 @@ void Scene40::Item6::doAction(int action) { switch (action) { case OBJECT_STUNNER: SceneItem::display2(40, 25); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); break; case OBJECT_SCANNER: SceneItem::display2(40, 42); @@ -1437,7 +1457,7 @@ void Scene40::Item6::doAction(int action) { SceneItem::display2(40, 36); break; default: - SceneItem::doAction(action); + SceneHotspot::doAction(action); break; } } @@ -1446,7 +1466,7 @@ void Scene40::Item6::doAction(int action) { Scene40::Scene40() : _item1(2, OBJECT_SCANNER, 40, 24, OBJECT_STUNNER, 40, 25, CURSOR_LOOK, 40, 7, CURSOR_USE, 40, 16, LIST_END), - _item3(5, OBJECT_SCANNER, 40, 26, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 9, CURSOR_USE, 40, 17, LIST_END), + _item3(5, OBJECT_SCANNER, 40, 28, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 2, CURSOR_USE, 40, 30, LIST_END), _item4(6, OBJECT_SCANNER, 40, 31, OBJECT_STUNNER, 40, 32, CURSOR_LOOK, 40, 5, CURSOR_USE, 40, 33, LIST_END), _item5(0, CURSOR_LOOK, 40, 11, LIST_END), _item7(4, OBJECT_SCANNER, 40, 26, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 9, CURSOR_USE, 40, 17, LIST_END), @@ -1458,7 +1478,7 @@ void Scene40::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(0, 100, 200, 100); - _globals->_stripNum = 99; + g_globals->_stripNum = 99; _stripManager.addSpeaker(&_speakerQR); _stripManager.addSpeaker(&_speakerSL); @@ -1468,19 +1488,19 @@ void Scene40::postInit(SceneObjectList *OwnerList) { _speakerGameText._color1 = 9; _speakerGameText.setTextPos(Common::Point(160, 30)); - _speakerQText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; _speakerSText._npc = &_object1; - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(130, 220)); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(130, 220)); + g_globals->_player.disableControl(); - if (_globals->_sceneManager._previousScene == 20) { - _globals->_soundHandler.play(24); - _globals->_player.setVisage(43); + if (g_globals->_sceneManager._previousScene == 20) { + g_globals->_soundHandler.play(24); + g_globals->_player.setVisage(43); _object1.postInit(); _object1.setVisage(41); @@ -1502,7 +1522,7 @@ void Scene40::postInit(SceneObjectList *OwnerList) { _assassin.postInit(); _assassin.setPosition(Common::Point(-40, 191)); - _globals->_sceneItems.push_back(&_assassin); + g_globals->_sceneItems.push_back(&_assassin); _dyingKzin.postInit(); _dyingKzin.setVisage(40); @@ -1537,8 +1557,8 @@ void Scene40::postInit(SceneObjectList *OwnerList) { _assassin.setStrip(2); } - _globals->_sceneItems.push_back(&_assassin); - _globals->_player.setPosition(Common::Point(170, 220)); + g_globals->_sceneItems.push_back(&_assassin); + g_globals->_player.setPosition(Common::Point(170, 220)); setAction(&_action4); } @@ -1547,24 +1567,24 @@ void Scene40::postInit(SceneObjectList *OwnerList) { _item6._sceneRegionId = 3; _item2._sceneRegionId = 7; - _globals->_sceneItems.addItems(&_dyingKzin, &_item8, &_item1, &_item2, &_item3, &_item4, + g_globals->_sceneItems.addItems(&_dyingKzin, &_item8, &_item1, &_item2, &_item3, &_item4, &_item6, &_item7, &_item5, NULL); } void Scene40::signal() { if (_sceneMode == 41) - _globals->_sceneManager.changeScene(50); + g_globals->_sceneManager.changeScene(50); } void Scene40::dispatch() { - if ((_globals->_stripNum == 88) && (_globals->_player._position.y >= 197)) { - _globals->_player.disableControl(); - _globals->_stripNum = 0; - _globals->_player.setAction(NULL); + if ((g_globals->_stripNum == 88) && (g_globals->_player._position.y >= 197)) { + g_globals->_player.disableControl(); + g_globals->_stripNum = 0; + g_globals->_player.setAction(NULL); _sceneMode = 41; - setAction(&_sequenceManager, this, 41, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 41, &g_globals->_player, NULL); - if (_globals->_sceneManager._previousScene == 20) { + if (g_globals->_sceneManager._previousScene == 20) { _dyingKzin.setAction(&_action6); } } @@ -1578,49 +1598,49 @@ void Scene40::dispatch() { *--------------------------------------------------------------------------*/ void Scene50::Action1::signal() { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - setAction(&scene->_sequenceManager, this, 54, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 54, &g_globals->_player, NULL); break; case 1: - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(63, this); break; case 2: if (scene->_stripManager._field2E8 != 107) { - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); } else { Common::Point pt(282, 139); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); } break; case 3: - _globals->_stripNum = -1; - _globals->_sceneManager.changeScene(60); + g_globals->_stripNum = -1; + g_globals->_sceneManager.changeScene(60); break; } } void Scene50::Action2::signal() { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_stripManager.start(66, this); break; case 1: { Common::Point pt(141, 142); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: - _globals->_sceneManager.changeScene(40); + g_globals->_sceneManager.changeScene(40); remove(); break; } @@ -1629,14 +1649,14 @@ void Scene50::Action2::signal() { void Scene50::Action3::signal() { switch (_actionIndex++) { case 0: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(136, 185); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: - _globals->_sceneManager.changeScene(60); + g_globals->_sceneManager.changeScene(60); remove(); break; } @@ -1645,7 +1665,7 @@ void Scene50::Action3::signal() { /*--------------------------------------------------------------------------*/ void Scene50::Object1::doAction(int action) { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: @@ -1661,7 +1681,7 @@ void Scene50::Object1::doAction(int action) { SceneItem::display2(50, 21); break; case CURSOR_TALK: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 52; scene->setAction(&scene->_sequenceManager, scene, 52, NULL); break; @@ -1672,7 +1692,7 @@ void Scene50::Object1::doAction(int action) { } void Scene50::Object2::doAction(int action) { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: @@ -1686,7 +1706,7 @@ void Scene50::Object2::doAction(int action) { break; case OBJECT_INFODISK: case CURSOR_USE: - _globals->_stripNum = 50; + g_globals->_stripNum = 50; scene->setAction(&scene->_action3); break; default: @@ -1696,7 +1716,7 @@ void Scene50::Object2::doAction(int action) { } void Scene50::Object3::doAction(int action) { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: @@ -1713,7 +1733,7 @@ void Scene50::Object3::doAction(int action) { SceneItem::display2(50, 8); break; case CURSOR_TALK: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 52; scene->setAction(&scene->_sequenceManager, scene, 52, NULL); break; @@ -1724,7 +1744,7 @@ void Scene50::Object3::doAction(int action) { } void Scene50::Object4::doAction(int action) { - Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene; + Scene50 *scene = (Scene50 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: @@ -1738,10 +1758,10 @@ void Scene50::Object4::doAction(int action) { break; case OBJECT_INFODISK: case CURSOR_USE: - _globals->_player.disableControl(); - _globals->_stripNum = 0; + g_globals->_player.disableControl(); + g_globals->_stripNum = 0; scene->_sceneMode = 51; - scene->setAction(&scene->_sequenceManager, scene, 51, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 51, &g_globals->_player, NULL); break; default: SceneHotspot::doAction(action); @@ -1770,20 +1790,20 @@ void Scene50::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerQText); _stripManager.addSpeaker(&_speakerSText); - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player._canWalk = false; - _globals->_player.changeZoom(75); - _globals->_player._moveDiff.y = 3; - - if (_globals->_sceneManager._previousScene == 40) { - _globals->_player.setPosition(Common::Point(128, 123)); - } else if (_globals->_stripNum == 50) { - _globals->_player.setPosition(Common::Point(136, 185)); + g_globals->_player.postInit(); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player._canWalk = false; + g_globals->_player.changeZoom(75); + g_globals->_player._moveDiff.y = 3; + + if (g_globals->_sceneManager._previousScene == 40) { + g_globals->_player.setPosition(Common::Point(128, 123)); + } else if (g_globals->_stripNum == 50) { + g_globals->_player.setPosition(Common::Point(136, 185)); } else { - _globals->_player.setPosition(Common::Point(270, 143)); + g_globals->_player.setPosition(Common::Point(270, 143)); } _object2.postInit(); @@ -1804,37 +1824,37 @@ void Scene50::postInit(SceneObjectList *OwnerList) { _object4.setPosition(Common::Point(295, 144)); _object4.fixPriority(178); - _globals->_sceneItems.addItems(&_object2, &_object3, &_object4, NULL); + g_globals->_sceneItems.addItems(&_object2, &_object3, &_object4, NULL); - if (!_globals->getFlag(101)) { - _globals->_player.disableControl(); - _globals->setFlag(101); + if (!g_globals->getFlag(101)) { + g_globals->_player.disableControl(); + g_globals->setFlag(101); setAction(&_action1); } else { - _globals->_player.enableControl(); + g_globals->_player.enableControl(); - if (_globals->_sceneManager._previousScene == 40) { - _globals->_player.disableControl(); + if (g_globals->_sceneManager._previousScene == 40) { + g_globals->_player.disableControl(); _sceneMode = 54; - setAction(&_sequenceManager, this, 54, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 54, &g_globals->_player, NULL); } } _item0.setBounds(Rect(200, 0, 320, 200)); - _globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item0, NULL); + g_globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item0, NULL); } void Scene50::signal() { switch (_sceneMode) { case 51: - _globals->_sceneManager.changeScene(60); + g_globals->_sceneManager.changeScene(60); break; case 55: - _globals->_sceneManager.changeScene(40); + g_globals->_sceneManager.changeScene(40); break; case 52: case 54: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; } } @@ -1842,13 +1862,13 @@ void Scene50::signal() { void Scene50::dispatch() { Scene::dispatch(); - if ((_sceneMode != 55) && _doorwayRect.contains(_globals->_player._position)) { + if ((_sceneMode != 55) && _doorwayRect.contains(g_globals->_player._position)) { // Player in house doorway, start player moving to within - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 55; Common::Point pt(89, 111); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); } } @@ -1858,7 +1878,7 @@ void Scene50::dispatch() { *--------------------------------------------------------------------------*/ void Scene60::Action1::signal() { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1882,7 +1902,7 @@ void Scene60::Action1::signal() { scene->_controlButton.animate(ANIM_MODE_2, NULL); - if (!_globals->getFlag(83)) { + if (!g_globals->getFlag(83)) { scene->_message.postInit(); scene->_message.setVisage(60); scene->_message.setStrip2(3); @@ -1891,18 +1911,18 @@ void Scene60::Action1::signal() { scene->_message.animate(ANIM_MODE_2, NULL); scene->_message._numFrames = 5; - _globals->_sceneItems.push_front(&scene->_message); + g_globals->_sceneItems.push_front(&scene->_message); scene->_soundHandler2.play(38); } - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); break; case 3: scene->_soundHandler2.play(37); scene->loadScene(65); scene->_message.remove(); - if (_globals->_sceneObjects->contains(&scene->_redLights)) + if (g_globals->_sceneObjects->contains(&scene->_redLights)) scene->_redLights.remove(); scene->_controlButton.remove(); @@ -1931,15 +1951,15 @@ void Scene60::Action1::signal() { scene->_rose.setFrame(1); scene->_rose.setPosition(Common::Point(145, 165)); - _globals->_sceneItems.push_front(&scene->_nextButton); - _globals->_sceneItems.push_front(&scene->_prevButton); - _globals->_sceneItems.push_front(&scene->_exitButton); + g_globals->_sceneItems.push_front(&scene->_nextButton); + g_globals->_sceneItems.push_front(&scene->_prevButton); + g_globals->_sceneItems.push_front(&scene->_exitButton); setDelay(10); - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); break; case 4: - _globals->setFlag(90); + g_globals->setFlag(90); // Deliberate fall-through case 5: case 6: @@ -1947,13 +1967,13 @@ void Scene60::Action1::signal() { SceneItem::display(60, _actionIndex - 4, SET_Y, 40, SET_X, 25, SET_FONT, 75, SET_EXT_BGCOLOR, -1, SET_FG_COLOR, 34, SET_POS_MODE, 0, SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END); - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); break; case 9: - _globals->_player._uiEnabled = false; + g_globals->_player._uiEnabled = false; RING_INVENTORY._infoDisk._sceneNumber = 1; - if (_globals->_sceneObjects->contains(&scene->_message)) + if (g_globals->_sceneObjects->contains(&scene->_message)) scene->_message.remove(); scene->_controlButton.animate(ANIM_MODE_NONE); @@ -1973,14 +1993,14 @@ void Scene60::Action1::signal() { scene->_masterButton.setFrame(1); scene->_masterButton._state = 0; - _globals->clearFlag(103); - _globals->clearFlag(!_globals->_stripNum ? 116 : 119); + g_globals->clearFlag(103); + g_globals->clearFlag(!g_globals->_stripNum ? 116 : 119); break; case 10: setDelay(60); break; case 11: - _globals->_player._uiEnabled = true; + g_globals->_player._uiEnabled = true; scene->_floppyDrive.remove(); remove(); break; @@ -1991,7 +2011,7 @@ void Scene60::Action1::signal() { } void Scene60::Action2::signal() { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2002,7 +2022,7 @@ void Scene60::Action2::signal() { scene->_stripManager.start(66, this); break; case 3: - _globals->_sceneManager.changeScene(50); + g_globals->_sceneManager.changeScene(50); break; } } @@ -2010,7 +2030,7 @@ void Scene60::Action2::signal() { /*--------------------------------------------------------------------------*/ void Scene60::PrevObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(60, 16); @@ -2028,7 +2048,7 @@ void Scene60::PrevObject::doAction(int action) { } void Scene60::NextObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(60, 17); @@ -2045,7 +2065,7 @@ void Scene60::NextObject::doAction(int action) { } void Scene60::ExitObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(60, 18); @@ -2076,8 +2096,8 @@ void Scene60::ExitObject::doAction(int action) { scene->_masterButton.setStrip(8); scene->_masterButton.setPosition(Common::Point(143, 105)); - _globals->_sceneItems.push_front(&scene->_masterButton); - _globals->_sceneItems.push_front(&scene->_slaveButton); + g_globals->_sceneItems.push_front(&scene->_masterButton); + g_globals->_sceneItems.push_front(&scene->_slaveButton); scene->_redLights.postInit(); scene->_redLights.setVisage(60); @@ -2091,14 +2111,14 @@ void Scene60::ExitObject::doAction(int action) { if (scene->_masterButton._state) scene->_masterButton.setFrame(2); - _globals->_sceneItems.push_front(&scene->_item1); - _globals->_sceneItems.push_front(&scene->_controlButton); - _globals->_sceneItems.push_front(&scene->_slaveButton); - _globals->_sceneItems.push_front(&scene->_masterButton); - _globals->_sceneItems.push_back(&scene->_item2); + g_globals->_sceneItems.push_front(&scene->_item1); + g_globals->_sceneItems.push_front(&scene->_controlButton); + g_globals->_sceneItems.push_front(&scene->_slaveButton); + g_globals->_sceneItems.push_front(&scene->_masterButton); + g_globals->_sceneItems.push_back(&scene->_item2); - _globals->gfxManager()._font.setFontNumber(2); - _globals->_sceneText._fontNumber = 2; + g_globals->gfxManager()._font.setFontNumber(2); + g_globals->_sceneText._fontNumber = 2; scene->_action1.setActionIndex(2); scene->_action1.setDelay(1); @@ -2110,20 +2130,20 @@ void Scene60::ExitObject::doAction(int action) { } void Scene60::MessageObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(60, 9); } else if (action == CURSOR_USE) { scene->_action1.setDelay(1); - _globals->setFlag(83); + g_globals->setFlag(83); } else { SceneHotspot::doAction(action); } } void Scene60::ControlObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(60, 11); @@ -2131,9 +2151,9 @@ void Scene60::ControlObject::doAction(int action) { if (_animateMode == ANIM_MODE_NONE) SceneItem::display2(60, 14); else if (!scene->_slaveButton._state) { - _globals->_soundHandler.play(40); - _globals->_soundHandler.holdAt(true); - _globals->_sceneManager.changeScene(20); + g_globals->_soundHandler.play(40); + g_globals->_soundHandler.holdAt(true); + g_globals->_sceneManager.changeScene(20); } else { scene->_sceneMode = 15; setAction(&scene->_sequenceManager, scene, 62, NULL); @@ -2144,7 +2164,7 @@ void Scene60::ControlObject::doAction(int action) { } void Scene60::SlaveObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(60, 8); @@ -2154,14 +2174,14 @@ void Scene60::SlaveObject::doAction(int action) { else if (_state) { scene->_soundHandler3.stop(); animate(ANIM_MODE_6, NULL); - _globals->clearFlag(102); - _globals->clearFlag(!_globals->_stripNum ? 117 : 120); + g_globals->clearFlag(102); + g_globals->clearFlag(!g_globals->_stripNum ? 117 : 120); _state = 0; scene->_sceneMode = 9998; } else { scene->_soundHandler3.play(39); - _globals->setFlag(102); - _globals->setFlag(!_globals->_stripNum ? 117 : 120); + g_globals->setFlag(102); + g_globals->setFlag(!g_globals->_stripNum ? 117 : 120); animate(ANIM_MODE_5, NULL); _state = 1; scene->_sceneMode = 9998; @@ -2174,7 +2194,7 @@ void Scene60::SlaveObject::doAction(int action) { } void Scene60::MasterObject::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(60, 7); @@ -2187,15 +2207,15 @@ void Scene60::MasterObject::doAction(int action) { scene->_soundHandler3.stop(); animate(ANIM_MODE_6, NULL); _state = 0; - _globals->clearFlag(103); - _globals->clearFlag(!_globals->_stripNum ? 116 : 119); + g_globals->clearFlag(103); + g_globals->clearFlag(!g_globals->_stripNum ? 116 : 119); scene->_sceneMode = 9998; } else { scene->_soundHandler3.play(39); animate(ANIM_MODE_5, NULL); _state = 1; - _globals->setFlag(103); - _globals->setFlag(!_globals->_stripNum ? 116 : 119); + g_globals->setFlag(103); + g_globals->setFlag(!g_globals->_stripNum ? 116 : 119); scene->_sceneMode = 9998; } @@ -2206,12 +2226,12 @@ void Scene60::MasterObject::doAction(int action) { } void Scene60::FloppyDrive::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(60, 13); } else if (action == CURSOR_USE) { - _globals->setFlag(!_globals->_stripNum ? 118 : 121); + g_globals->setFlag(!g_globals->_stripNum ? 118 : 121); scene->setAction(&scene->_action1); } else { SceneHotspot::doAction(action); @@ -2221,12 +2241,12 @@ void Scene60::FloppyDrive::doAction(int action) { /*--------------------------------------------------------------------------*/ void Scene60::Item1::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_INFODISK: RING_INVENTORY._infoDisk._sceneNumber = 60; - _globals->setFlag(!_globals->_stripNum ? 118 : 121); + g_globals->setFlag(!g_globals->_stripNum ? 118 : 121); scene->_sceneMode = 0; scene->setAction(&scene->_action1); break; @@ -2235,14 +2255,14 @@ void Scene60::Item1::doAction(int action) { break; case CURSOR_USE: if (RING_INVENTORY._infoDisk._sceneNumber == 60) { - if (_globals->getFlag(118) && !_globals->_stripNum) { - _globals->clearFlag(118); + if (g_globals->getFlag(118) && !g_globals->_stripNum) { + g_globals->clearFlag(118); scene->setAction(&scene->_action1); scene->_action1.setActionIndex(9); scene->_action1.setDelay(1); } - if (_globals->getFlag(121) && !_globals->_stripNum) { - _globals->clearFlag(121); + if (g_globals->getFlag(121) && !g_globals->_stripNum) { + g_globals->clearFlag(121); scene->setAction(&scene->_action1); scene->_action1.setActionIndex(9); scene->_action1.setDelay(1); @@ -2260,7 +2280,7 @@ void Scene60::Item1::doAction(int action) { } void Scene60::Item::doAction(int action) { - Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene; + Scene60 *scene = (Scene60 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -2271,7 +2291,7 @@ void Scene60::Item::doAction(int action) { setAction(&scene->_sequenceManager, this, 62, NULL); break; default: - SceneItem::doAction(action); + SceneHotspot::doAction(action); break; } } @@ -2292,8 +2312,8 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerQText); _stripManager.addSpeaker(&_speakerSText); - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_player._uiEnabled = true; + g_globals->_events.setCursor(CURSOR_USE); _slaveButton.postInit(); _slaveButton.setVisage(60); @@ -2307,19 +2327,19 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _masterButton.setPosition(Common::Point(143, 105)); _masterButton._state = 0; - _globals->_sceneItems.push_back(&_masterButton); - _globals->_sceneItems.push_back(&_slaveButton); + g_globals->_sceneItems.push_back(&_masterButton); + g_globals->_sceneItems.push_back(&_slaveButton); _controlButton.postInit(); _controlButton.setVisage(60); _controlButton.setStrip(5); _controlButton.setPosition(Common::Point(233, 143)); - _globals->_sceneItems.push_back(&_controlButton); + g_globals->_sceneItems.push_back(&_controlButton); - if (_globals->_stripNum == -1) { - _globals->_stripNum = 0; + if (g_globals->_stripNum == -1) { + g_globals->_stripNum = 0; } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9999; setAction(&_sequenceManager, this, 61, NULL); } @@ -2327,18 +2347,18 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _item1.setBounds(Rect(130, 55, 174, 70)); _item2.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - if (_globals->_stripNum == 0) { - if (_globals->getFlag(117)) { + if (g_globals->_stripNum == 0) { + if (g_globals->getFlag(117)) { _slaveButton._state = 1; _slaveButton.setFrame(2); } - if (_globals->getFlag(116)) { + if (g_globals->getFlag(116)) { _masterButton._state = 1; _masterButton.setFrame(2); } - if (_globals->getFlag(118)) { + if (g_globals->getFlag(118)) { _controlButton.animate(ANIM_MODE_2, NULL); _redLights.postInit(); @@ -2348,7 +2368,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _soundHandler1.play(35); - if (!_globals->getFlag(83)) { + if (!g_globals->getFlag(83)) { _message.postInit(); _message.setVisage(60); _message.setStrip2(3); @@ -2356,23 +2376,23 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _message.setPosition(Common::Point(148, 85)); _message.animate(ANIM_MODE_2, NULL); _message._numFrames = 5; - _globals->_sceneItems.push_front(&_message); + g_globals->_sceneItems.push_front(&_message); _soundHandler2.play(38); } } } else { - if (_globals->getFlag(120)) { + if (g_globals->getFlag(120)) { _slaveButton._state = 1; _slaveButton.setFrame(2); } - if (_globals->getFlag(119)) { + if (g_globals->getFlag(119)) { _masterButton._state = 1; _masterButton.setFrame(2); } - if (_globals->getFlag(121)) { + if (g_globals->getFlag(121)) { _controlButton.animate(ANIM_MODE_2, NULL); _redLights.postInit(); @@ -2383,7 +2403,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _soundHandler1.play(35); - if (!_globals->getFlag(83)) { + if (!g_globals->getFlag(83)) { _message.postInit(); _message.setVisage(60); _message.setStrip2(3); @@ -2391,24 +2411,24 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _message.setPosition(Common::Point(148, 85)); _message.animate(ANIM_MODE_2, NULL); _message._numFrames = 5; - _globals->_sceneItems.push_front(&_message); + g_globals->_sceneItems.push_front(&_message); _soundHandler2.play(38); } } } - _globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item6, + g_globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item6, &_item1, &_item2, NULL); } void Scene60::signal() { if (_sceneMode != 0) { if (_sceneMode == 9998) { - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); } else if (_sceneMode == 9999) { - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_player._uiEnabled = true; + g_globals->_events.setCursor(CURSOR_USE); _gfxButton.setText(EXIT_MSG); _gfxButton._bounds.center(160, 193); @@ -2416,7 +2436,7 @@ void Scene60::signal() { _gfxButton._bounds.expandPanes(); } else { SceneItem::display2(60, _sceneMode); - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); } } } @@ -2426,7 +2446,7 @@ void Scene60::process(Event &event) { if (_screenNumber == 60) { if (_gfxButton.process(event)) - _globals->_sceneManager.changeScene(50); + g_globals->_sceneManager.changeScene(50); } } @@ -2436,15 +2456,15 @@ void Scene60::process(Event &event) { *--------------------------------------------------------------------------*/ void Scene90::Action1::signal() { - Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; + Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(10); break; case 1: - _globals->_scenePalette.addRotation(64, 72, -1); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_scenePalette.addRotation(64, 72, -1); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(90, this); break; case 2: @@ -2466,17 +2486,17 @@ void Scene90::Action1::signal() { if (scene->_stripManager._field2E8 == 220) scene->_stripManager.start(91, this, scene); else { - scene->_stripManager.start(_globals->getFlag(104) ? 93 : 92, this, scene); + scene->_stripManager.start(g_globals->getFlag(104) ? 93 : 92, this, scene); _actionIndex = 7; } break; case 6: scene->_object2.animate(ANIM_MODE_NONE); - _globals->_player._uiEnabled = true; + g_globals->_player._uiEnabled = true; break; case 7: scene->_object2.animate(ANIM_MODE_NONE); - _globals->_soundHandler.play(56); + g_globals->_soundHandler.play(56); scene->_object3.animate(ANIM_MODE_5, this); break; case 8: { @@ -2498,7 +2518,7 @@ void Scene90::Action1::signal() { PlayerMover2 *mover = new PlayerMover2(); scene->_object1.addMover(mover, 10, 15, &scene->_object5); - if (!_globals->getFlag(104)) { + if (!g_globals->getFlag(104)) { mover = new PlayerMover2(); scene->_object4.addMover(mover, 10, 15, &scene->_object1); } @@ -2506,17 +2526,17 @@ void Scene90::Action1::signal() { break; } case 11: - _globals->_soundHandler.play(57); - _globals->_soundHandler.play(68); + g_globals->_soundHandler.play(57); + g_globals->_soundHandler.play(68); scene->_object3.animate(ANIM_MODE_6, NULL); - SceneItem::display(90, _globals->getFlag(104) ? 15 : 14, + SceneItem::display(90, g_globals->getFlag(104) ? 15 : 14, SET_EXT_BGCOLOR, 13, SET_KEEP_ONSCREEN, -1, SET_X, 120, SET_Y, 20, LIST_END); break; case 12: SceneItem::display(0, 0); - _globals->_scenePalette.clearListeners(); - _globals->_sceneManager.changeScene(95); + g_globals->_scenePalette.clearListeners(); + g_globals->_sceneManager.changeScene(95); break; } } @@ -2524,14 +2544,14 @@ void Scene90::Action1::signal() { /*--------------------------------------------------------------------------*/ void Scene90::Object1::doAction(int action) { - Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; + Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(90, 7); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 97; setAction(&scene->_sequenceManager, scene, 97, this, NULL); break; @@ -2542,12 +2562,12 @@ void Scene90::Object1::doAction(int action) { } void Scene90::Object2::doAction(int action) { - Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; + Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_object6.postInit(); scene->_object6.setVisage(90); scene->_object6.setStrip(6); @@ -2563,7 +2583,7 @@ void Scene90::Object2::doAction(int action) { SceneItem::display2(90, 8); break; case CURSOR_TALK: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setAction(&scene->_sequenceManager, scene, 96, this, NULL); break; default: @@ -2584,10 +2604,10 @@ Scene90::Scene90() : } void Scene90::stripCallback(int v) { - Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene; + Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene; if (v == 1) - scene->_object2.animate(ANIM_MODE_7, NULL); + scene->_object2.animate(ANIM_MODE_7, 0, NULL); else if (v == 2) scene->_object2.animate(ANIM_MODE_NONE); } @@ -2615,7 +2635,7 @@ void Scene90::postInit(SceneObjectList *OwnerList) { _object5._moveDiff = Common::Point(22, 22); _object5.setPosition(Common::Point(151, 177)); _object5.changeZoom(-1); - _globals->_sceneItems.push_back(&_object5); + g_globals->_sceneItems.push_back(&_object5); _object1.postInit(); _object1.setVisage(2337); @@ -2624,9 +2644,9 @@ void Scene90::postInit(SceneObjectList *OwnerList) { _object1._moveDiff = Common::Point(20, 20); _object1.setPosition(Common::Point(212, 183)); _object1.changeZoom(-1); - _globals->_sceneItems.push_back(&_object1); + g_globals->_sceneItems.push_back(&_object1); - if (!_globals->getFlag(104)) { + if (!g_globals->getFlag(104)) { _object4.postInit(); _object4.setVisage(2331); _object4.setObjectWrapper(new SceneObjectWrapper()); @@ -2634,7 +2654,7 @@ void Scene90::postInit(SceneObjectList *OwnerList) { _object4._moveDiff = Common::Point(20, 20); _object4.setPosition(Common::Point(251, 207)); _object4.changeZoom(-1); - _globals->_sceneItems.push_back(&_object4); + g_globals->_sceneItems.push_back(&_object4); } _object2.postInit(); @@ -2642,17 +2662,17 @@ void Scene90::postInit(SceneObjectList *OwnerList) { _object2.animate(ANIM_MODE_1, NULL); _object2.setPosition(Common::Point(315, 185)); _object2._strip = 2; - _globals->_sceneItems.push_back(&_object2); + g_globals->_sceneItems.push_back(&_object2); _object3.postInit(); _object3.setVisage(90); _object3.animate(ANIM_MODE_1, NULL); _object3.setPosition(Common::Point(196, 181)); _object3.fixPriority(175); - _globals->_sceneItems.push_back(&_object3); + g_globals->_sceneItems.push_back(&_object3); - _globals->_player.disableControl(); - _globals->_soundHandler.play(55); + g_globals->_player.disableControl(); + g_globals->_soundHandler.play(55); _soundHandler1.play(52); _soundHandler1.holdAt(true); @@ -2662,21 +2682,21 @@ void Scene90::postInit(SceneObjectList *OwnerList) { _item1.setBounds(Rect(271, 65, 271, 186)); _item2.setBounds(Rect(0, 17, 124, 77)); - _globals->_sceneItems.addItems(&_item1, &_item2, &_item3, NULL); + g_globals->_sceneItems.addItems(&_item1, &_item2, &_item3, NULL); } void Scene90::signal() { switch (_sceneMode) { case 91: _sceneMode = 92; - _globals->_soundHandler.play(77, this); + g_globals->_soundHandler.play(77, this); break; case 92: - _globals->_scenePalette.clearListeners(); - _globals->_game->endGame(90, 6); + g_globals->_scenePalette.clearListeners(); + g_globals->_game->endGame(90, 6); break; case 96: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 97: _stripManager._field2E8 = 0; @@ -2694,7 +2714,7 @@ void Scene90::signal() { *--------------------------------------------------------------------------*/ void Scene95::Action1::signal() { - Scene95 *scene = (Scene95 *)_globals->_sceneManager._scene; + Scene95 *scene = (Scene95 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2719,7 +2739,7 @@ void Scene95::Action1::signal() { Common::Point pt1(5, 198); NpcMover *mover1 = new NpcMover(); - _globals->_player.addMover(mover1, &pt1, this); + g_globals->_player.addMover(mover1, &pt1, this); Common::Point pt2(9, 190); NpcMover *mover2 = new NpcMover(); @@ -2731,7 +2751,7 @@ void Scene95::Action1::signal() { Common::Point pt1(235, 72); PlayerMover *mover1 = new PlayerMover(); - _globals->_player.addMover(mover1, &pt1, NULL); + g_globals->_player.addMover(mover1, &pt1, NULL); Common::Point pt2(235, 72); PlayerMover *mover2 = new PlayerMover(); @@ -2762,8 +2782,8 @@ void Scene95::Action1::signal() { break; case 7: { SceneItem::display(0, 0); - _globals->_player.setVisage(92); - _globals->_player.setPosition(Common::Point(-25, 200)); + g_globals->_player.setVisage(92); + g_globals->_player.setPosition(Common::Point(-25, 200)); scene->_object1.setVisage(91); scene->_object1.setPosition(Common::Point(-22, 220)); @@ -2771,7 +2791,7 @@ void Scene95::Action1::signal() { Common::Point pt1(5, 198); NpcMover *mover1 = new NpcMover(); - _globals->_player.addMover(mover1, &pt1, this); + g_globals->_player.addMover(mover1, &pt1, this); Common::Point pt2(9, 190); NpcMover *mover2 = new NpcMover(); @@ -2781,7 +2801,7 @@ void Scene95::Action1::signal() { case 8: { Common::Point pt1(108, 112); PlayerMover *mover1 = new PlayerMover(); - _globals->_player.addMover(mover1, &pt1, this); + g_globals->_player.addMover(mover1, &pt1, this); Common::Point pt2(108, 112); PlayerMover *mover2 = new PlayerMover(); @@ -2789,7 +2809,7 @@ void Scene95::Action1::signal() { break; } case 9: - _globals->_sceneManager.changeScene(2300); + g_globals->_sceneManager.changeScene(2300); break; } } @@ -2804,14 +2824,14 @@ void Scene95::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(100, 10, 200, 100); - _globals->_player.postInit(); - _globals->_player.setVisage(2337); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player._strip = 4; - _globals->_player._moveDiff = Common::Point(30, 30); - _globals->_player.setPosition(Common::Point(-35, 200)); - _globals->_player.changeZoom(-1); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(2337); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player._strip = 4; + g_globals->_player._moveDiff = Common::Point(30, 30); + g_globals->_player.setPosition(Common::Point(-35, 200)); + g_globals->_player.changeZoom(-1); + g_globals->_player.disableControl(); _object1.postInit(); _object1.setVisage(2333); @@ -2835,7 +2855,7 @@ void Scene95::postInit(SceneObjectList *OwnerList) { *--------------------------------------------------------------------------*/ void Scene6100::Action1::signal() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2852,7 +2872,7 @@ void Scene6100::Action1::signal() { } void Scene6100::Action2::signal() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2869,7 +2889,7 @@ void Scene6100::Action2::signal() { } void Scene6100::Action3::signal() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2877,9 +2897,9 @@ void Scene6100::Action3::signal() { setDelay(60); break; case 1: - _globals->_scenePalette.clearListeners(); + g_globals->_scenePalette.clearListeners(); scene->_fadePercent = 100; - _globals->_scenePalette.refresh(); + g_globals->_scenePalette.refresh(); scene->loadScene(9997); scene->_object1.hide(); scene->_object2.hide(); @@ -2890,7 +2910,7 @@ void Scene6100::Action3::signal() { scene->_rocks.hide(); scene->_sceneText.hide(); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(8120, this); break; case 2: @@ -2898,12 +2918,12 @@ void Scene6100::Action3::signal() { break; case 3: scene->showMessage(NULL, 0, NULL); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(8130, this); break; case 4: - _globals->setFlag(76); - _globals->_sceneManager.changeScene( + g_globals->setFlag(76); + g_globals->_sceneManager.changeScene( (scene->_stripManager._field2E8 == 135) ? 6100 : 2320); remove(); break; @@ -2911,7 +2931,7 @@ void Scene6100::Action3::signal() { } void Scene6100::Action4::signal() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2928,7 +2948,7 @@ void Scene6100::Action4::signal() { } void Scene6100::Action5::dispatch() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene; FloatSet zeroSet; const double MULTIPLY_FACTOR = 0.01744; // 2 * pi / 360 @@ -2978,9 +2998,9 @@ void Scene6100::Action5::dispatch() { if (idx != 3) { scene->_objList[idx]->_floats._float1 = - _globals->_randomSource.getRandomNumber(199); + g_globals->_randomSource.getRandomNumber(199); scene->_objList[idx]->_floats._float2 = - _globals->_randomSource.getRandomNumber(999) + 750.0; + g_globals->_randomSource.getRandomNumber(999) + 750.0; scene->_objList[idx]->_floats.proc1( -(scene->_turnAmount * 10 + scene->_angle) * MULTIPLY_FACTOR); @@ -3002,34 +3022,34 @@ void Scene6100::Action5::dispatch() { scene->_soundHandler.play(233); scene->showMessage(NULL, 0, NULL); - if (!_globals->getFlag(76)) + if (!g_globals->getFlag(76)) scene->_probe.setAction(&scene->_action1); break; case 1: scene->_soundHandler.play(233); scene->showMessage(NULL, 0, NULL); - if (!_globals->getFlag(76)) + if (!g_globals->getFlag(76)) scene->_probe.setAction(&scene->_action2); break; case 2: scene->_soundHandler.play(234); scene->showMessage(NULL, 0, NULL); - if (!_globals->getFlag(76)) + if (!g_globals->getFlag(76)) scene->_probe.setAction(NULL); scene->setAction(&scene->_action3); break; } - _globals->_scenePalette.clearListeners(); + g_globals->_scenePalette.clearListeners(); scene->_fadePercent = 0; } } } void Scene6100::GetBoxAction::signal() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { @@ -3042,7 +3062,7 @@ void Scene6100::GetBoxAction::signal() { } case 1: { scene->showMessage(SCENE6100_TAKE_CONTROLS, 35, this); - _globals->_scenePalette.clearListeners(); + g_globals->_scenePalette.clearListeners(); Common::Point pt(scene->_rocks._position.x, scene->_rocks._position.y - 10); NpcMover *mover = new NpcMover(); @@ -3061,13 +3081,13 @@ void Scene6100::GetBoxAction::signal() { break; case 5: scene->showMessage(NULL, 0, NULL); - _globals->_sceneManager.changeScene(2320); + g_globals->_sceneManager.changeScene(2320); remove(); } } void Scene6100::GetBoxAction::dispatch() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene; if (!scene->_probe._mover && (scene->_getBoxAction._actionIndex >= 1)) { if (scene->_getBoxAction._actionIndex == 1) { @@ -3093,7 +3113,7 @@ void Scene6100::Action7::signal() { setDelay(90); break; case 2: - _globals->_sceneManager.changeScene(2100); + g_globals->_sceneManager.changeScene(2100); remove(); break; } @@ -3105,16 +3125,16 @@ void Scene6100::Object::synchronize(Serializer &s) { SceneObject::synchronize(s); // Save the double fields of the FloatSet - s.syncBytes((byte *)&_floats._float1, sizeof(double)); - s.syncBytes((byte *)&_floats._float2, sizeof(double)); - s.syncBytes((byte *)&_floats._float3, sizeof(double)); - s.syncBytes((byte *)&_floats._float4, sizeof(double)); + s.syncAsDouble(_floats._float1); + s.syncAsDouble(_floats._float2); + s.syncAsDouble(_floats._float3); + s.syncAsDouble(_floats._float4); } /*--------------------------------------------------------------------------*/ void Scene6100::ProbeMover::dispatch() { - Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene; + Scene6100 *scene = (Scene6100 *)g_globals->_sceneManager._scene; if (!dontMove()) { if (scene->_speed > 0) { @@ -3148,10 +3168,10 @@ Scene6100::Scene6100(): Scene() { _angle = 0; _msgActive = false; - _globals->_sceneHandler._delayTicks = 8; + g_globals->_sceneHandler->_delayTicks = 8; - _globals->_player.disableControl(); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.disableControl(); + g_globals->_events.setCursor(CURSOR_WALK); } void Scene6100::synchronize(Serializer &s) { @@ -3220,10 +3240,10 @@ void Scene6100::postInit(SceneObjectList *OwnerList) { int baseVal = 2000; for (int idx = 0; idx < 3; ++idx) { - _objList[idx]->_floats._float1 = _globals->_randomSource.getRandomNumber(999); + _objList[idx]->_floats._float1 = g_globals->_randomSource.getRandomNumber(999); _objList[idx]->_floats._float2 = baseVal; _objList[idx]->_floats._float3 = 0.0; - baseVal += _globals->_randomSource.getRandomNumber(499); + baseVal += g_globals->_randomSource.getRandomNumber(499); _objList[idx]->postInit(); _objList[idx]->setVisage(6100); @@ -3231,23 +3251,23 @@ void Scene6100::postInit(SceneObjectList *OwnerList) { _objList[idx]->_strip = 2; _objList[idx]->setPosition(Common::Point( - _globals->_randomSource.getRandomNumber(319), 60)); + g_globals->_randomSource.getRandomNumber(319), 60)); _objList[idx]->fixPriority(1); _objList[idx]->changeZoom(-1); } setAction(&_action5); - _globals->_scenePalette.addRotation(96, 143, -1); + g_globals->_scenePalette.addRotation(96, 143, -1); - if (!_globals->getFlag(76)) + if (!g_globals->getFlag(76)) _probe.setAction(&_action4); - _globals->_soundHandler.play(231); + g_globals->_soundHandler.play(231); } void Scene6100::remove() { - _globals->_player.disableControl(); - _globals->_scenePalette.clearListeners(); + g_globals->_player.disableControl(); + g_globals->_scenePalette.clearListeners(); Scene::remove(); } @@ -3274,18 +3294,18 @@ void Scene6100::dispatch() { _probe._action->dispatch(); // Handle mouse controlling the turning - int changeAmount = (_globals->_events._mousePos.x - 160) / -20; + int changeAmount = (g_globals->_events._mousePos.x - 160) / -20; _turnAmount += (changeAmount - _turnAmount) / 2; if (_fadePercent < 100) { _fadePercent += 10; if (_fadePercent >= 100) { - _globals->_scenePalette.addRotation(96, 143, -1); + g_globals->_scenePalette.addRotation(96, 143, -1); _fadePercent = 100; } byte adjustData[] = {0xff, 0xff, 0xff, 0}; - _globals->_scenePalette.fade(adjustData, false, _fadePercent); + g_globals->_scenePalette.fade(adjustData, false, _fadePercent); } if (_action != &_action3) { @@ -3324,4 +3344,6 @@ void Scene6100::showMessage(const Common::String &msg, int color, Action *action } } -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld_scenes1.h b/engines/tsage/ringworld/ringworld_scenes1.h index 283cf68e07..bb98c89a8c 100644 --- a/engines/tsage/ringworld_scenes1.h +++ b/engines/tsage/ringworld/ringworld_scenes1.h @@ -24,7 +24,8 @@ #define TSAGE_RINGWORLD_SCENES1_H #include "common/scummsys.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/ringworld/ringworld_speakers.h" #include "tsage/converse.h" #include "tsage/events.h" #include "tsage/core.h" @@ -32,7 +33,11 @@ #include "tsage/globals.h" #include "tsage/sound.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { + +using namespace TsAGE; class Scene10 : public Scene { /* Actions */ @@ -201,6 +206,7 @@ class Scene40 : public Scene { class Action8 : public Action { public: virtual void signal(); + virtual void dispatch(); }; /* Objects */ @@ -214,15 +220,15 @@ class Scene40 : public Scene { }; /* Items */ - class Item2 : public SceneItem { + class Item2 : public SceneHotspot { public: virtual void doAction(int action); }; - class Item6 : public SceneItem { + class Item6 : public SceneHotspot { public: virtual void doAction(int action); }; - class Item8 : public SceneItem { + class Item8 : public SceneHotspot { public: virtual void doAction(int action); }; @@ -532,6 +538,8 @@ public: }; -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld/ringworld_scenes10.cpp index ba4060548e..5aeb127915 100644 --- a/engines/tsage/ringworld_scenes10.cpp +++ b/engines/tsage/ringworld/ringworld_scenes10.cpp @@ -21,12 +21,14 @@ */ #include "graphics/cursorman.h" -#include "tsage/ringworld_scenes10.h" +#include "tsage/ringworld/ringworld_scenes10.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { Scene2::Scene2() : Scene() { _sceneState = 0; @@ -35,55 +37,56 @@ Scene2::Scene2() : Scene() { /*--------------------------------------------------------------------------*/ void Object9350::postInit(SceneObjectList *OwnerList) { - //SceneObject::postInit(&_globals->_sceneManager._altSceneObjects); + //SceneObject::postInit(&g_globals->_sceneManager._bgSceneObjects); SceneObject::postInit(OwnerList); } void Object9350::draw() { reposition(); Rect destRect = _bounds; - destRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y); - Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(_globals->_sceneManager._scene->_stripManager._stripNum); + destRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y); + Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(g_globals->_sceneManager._scene->_stripManager._stripNum); GfxSurface frame = getFrame(); - _globals->gfxManager().copyFrom(frame, destRect, priorityRegion); + g_globals->gfxManager().copyFrom(frame, destRect, priorityRegion); } /*-------------------------------------------------------------------------- * Scene 9100 - Near beach: Slave washing clothes * *--------------------------------------------------------------------------*/ +// Slave hotspot void Scene9100::SceneHotspot1::doAction(int action) { - Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene; + Scene9100 *scene = (Scene9100 *)g_globals->_sceneManager._scene; if (action == CURSOR_TALK) { - if (_globals->getFlag(23)) { - _globals->_player.disableControl(); + if (g_globals->getFlag(23)) { + g_globals->_player.disableControl(); scene->_sceneMode = 9104; } else { - _globals->setFlag(23); - _globals->_player.disableControl(); + g_globals->setFlag(23); + g_globals->_player.disableControl(); scene->_sceneMode = 9105; } - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, &scene->_object5, &scene->_object6, NULL); + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &g_globals->_player, &scene->_object5, &scene->_object6, NULL); } else { NamedHotspot::doAction(action); } } void Scene9100::dispatch() { - Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene; + Scene9100 *scene = (Scene9100 *)g_globals->_sceneManager._scene; if (!_action) { - if (_globals->_player._position.x < 25) { - _globals->_player.disableControl(); - if (!_globals->getFlag(23) || _globals->getFlag(11)) + if (g_globals->_player._position.x < 25) { + g_globals->_player.disableControl(); + if (!g_globals->getFlag(23) || g_globals->getFlag(11)) _sceneMode = 9106; else { _sceneMode = 9108; - _globals->setFlag(11); + g_globals->setFlag(11); } - scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &g_globals->_player, NULL); } } else { Scene::dispatch(); @@ -91,23 +94,23 @@ void Scene9100::dispatch() { } void Scene9100::signal() { - Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene; + Scene9100 *scene = (Scene9100 *)g_globals->_sceneManager._scene; switch (scene->_sceneMode) { case 9102: case 9106: case 9108: - _globals->_sceneManager.changeScene(9150); + g_globals->_sceneManager.changeScene(9150); break; case 9105: - _sceneHotspot3.remove(); + _hotspotCleanedClothes.remove(); // No break on purpose case 9103: case 9104: case 9107: case 9109: default: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; } } @@ -123,7 +126,7 @@ void Scene9100::postInit(SceneObjectList *OwnerList) { _object1.animate(ANIM_MODE_2, NULL); _object1.fixPriority(10); - _globals->_player.postInit(); + g_globals->_player.postInit(); _object2.postInit(); _object2.hide(); @@ -137,39 +140,39 @@ void Scene9100::postInit(SceneObjectList *OwnerList) { _object5.postInit(); _object5.hide(); - if (!_globals->getFlag(23)) { + if (!g_globals->getFlag(23)) { _object6.postInit(); _object6.setVisage(9111); _object6.setStrip(6); _object6.setFrame(1); _object6.setPosition(Common::Point(138, 166)); - _sceneHotspot3.setup(145, 125, 166, 156, 9100, 40, 43); - } - _sceneHotspot1.setup(140, 176, 185, 215, 9100, 36, 37); - _sceneHotspot2.setup(161, 138, 182, 175, 9100, 38, 39); - _sceneHotspot4.setup(37, 196, 47, 320, 9100, 44, -1); - _sceneHotspot5.setup(69, 36, 121, 272, 9100, 45, 46); - _sceneHotspot6.setup(127, 0, 200, 52, 9100, 47, 48); - - _globals->_soundHandler.play(251); - if (_globals->_sceneManager._previousScene == 9150) { - if (_globals->getFlag(20)) { - _globals->_player.disableControl(); - if (_globals->getFlag(11)) + _hotspotCleanedClothes.setDetails(145, 125, 166, 156, 9100, 40, 43); + } + _hotspotSlave.setDetails(140, 176, 185, 215, 9100, 36, 37); + _hotspotSoiledClothes.setDetails(161, 138, 182, 175, 9100, 38, 39); + _hotspotIsland.setDetails(37, 196, 47, 320, 9100, 44, -1); + _hotspotBoulders.setDetails(69, 36, 121, 272, 9100, 45, 46); + _hotspotTrees.setDetails(127, 0, 200, 52, 9100, 47, 48); + + g_globals->_soundHandler.play(251); + if (g_globals->_sceneManager._previousScene == 9150) { + if (g_globals->getFlag(20)) { + g_globals->_player.disableControl(); + if (g_globals->getFlag(11)) _sceneMode = 9107; else _sceneMode = 9109; - setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object5, NULL); + setAction(&_sequenceManager, this, _sceneMode, &g_globals->_player, &_object5, NULL); } else { _sceneMode = 9103; - _globals->_player.disableControl(); - setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL); - _globals->setFlag(20); + g_globals->_player.disableControl(); + setAction(&_sequenceManager, this, _sceneMode, &g_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL); + g_globals->setFlag(20); } } else { _sceneMode = 9102; - _globals->_player.disableControl(); - setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL); + g_globals->_player.disableControl(); + setAction(&_sequenceManager, this, _sceneMode, &g_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL); } } @@ -180,7 +183,7 @@ void Scene9100::postInit(SceneObjectList *OwnerList) { void Scene9150::Object3::signal() { switch (_signalFlag++) { case 0: - _timer = 10 + _globals->_randomSource.getRandomNumber(90); + _timer = 10 + g_globals->_randomSource.getRandomNumber(90); break; default: animate(ANIM_MODE_5, this); @@ -199,15 +202,15 @@ void Scene9150::signal() { switch (_sceneMode) { case 9151: case 9157: - _globals->_sceneManager.changeScene(9100); + g_globals->_sceneManager.changeScene(9100); break; case 9153: - _globals->_sceneManager.changeScene(9300); + g_globals->_sceneManager.changeScene(9300); break; case 9152: case 9155: case 9156: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 9154: default: @@ -227,21 +230,21 @@ void Scene9150::dispatch() { if (_action) { _action->dispatch(); } else { - if (_globals->_player._position.x >= 160) { - if (_globals->_player._position.x > 630) { - _globals->_player.disableControl(); + if (g_globals->_player._position.x >= 160) { + if (g_globals->_player._position.x > 630) { + g_globals->_player.disableControl(); _sceneMode = 9157; - setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL); + setAction(&_sequenceManager1, this, _sceneMode, &g_globals->_player, NULL); } } else { - _globals->_player.disableControl(); - if (_globals->getFlag(11)) { - _globals->_soundHandler.play(286); + g_globals->_player.disableControl(); + if (g_globals->getFlag(11)) { + g_globals->_soundHandler.play(286); _sceneMode = 9153; } else { _sceneMode = 9156; } - setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL); + setAction(&_sequenceManager1, this, _sceneMode, &g_globals->_player, NULL); } } } @@ -249,7 +252,7 @@ void Scene9150::dispatch() { void Scene9150::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(0, 100, 200, 100); - _globals->_player.postInit(); + g_globals->_player.postInit(); _object3.postInit(); _sceneState = 1; @@ -259,37 +262,37 @@ void Scene9150::postInit(SceneObjectList *OwnerList) { _object3.setPosition(Common::Point(312, 95)); _object3.signal(); - _sceneHotspot1.setup(0, 0, 200, 94, 9150, 46, -1); - _sceneHotspot2.setup(51, 90, 118, 230, 9150, 47, -1); - _sceneHotspot3.setup(182, 104, 200, 320, 9150, 48, 49); - _sceneHotspot4.setup(103, 292, 152, 314, 9150, 50, 51); - _sceneHotspot5.setup(115, 350, 160, 374, 9150, 52, 53); - _sceneHotspot6.setup(0, 471, 200, 531, 9150, 54, 55); - _sceneHotspot7.setup(170, 320, 185, 640, 9150, 56, -1); - _sceneHotspot9.setup(157, 107, 186, 320, 9150, 56, -1); - _sceneHotspot8.setup(133, 584, 142, 640, 9150, 57, -1); - _sceneHotspot10.setup(83, 304, 103, 323, 9150, 58, 59); - - _globals->_soundHandler.play(285); - _globals->_player.disableControl(); - - if (_globals->getFlag(20)) { + _sceneHotspot1.setDetails(0, 0, 200, 94, 9150, 46, -1); + _sceneHotspot2.setDetails(51, 90, 118, 230, 9150, 47, -1); + _sceneHotspot3.setDetails(182, 104, 200, 320, 9150, 48, 49); + _sceneHotspot4.setDetails(103, 292, 152, 314, 9150, 50, 51); + _sceneHotspot5.setDetails(115, 350, 160, 374, 9150, 52, 53); + _sceneHotspot6.setDetails(0, 471, 200, 531, 9150, 54, 55); + _sceneHotspot7.setDetails(170, 320, 185, 640, 9150, 56, -1); + _sceneHotspot9.setDetails(157, 107, 186, 320, 9150, 56, -1); + _sceneHotspot8.setDetails(133, 584, 142, 640, 9150, 57, -1); + _sceneHotspot10.setDetails(83, 304, 103, 323, 9150, 58, 59); + + g_globals->_soundHandler.play(285); + g_globals->_player.disableControl(); + + if (g_globals->getFlag(20)) { // Walking alone - _globals->_scrollFollower = &_globals->_player; - if (_globals->getFlag(11)) + g_globals->_scrollFollower = &g_globals->_player; + if (g_globals->getFlag(11)) // Hero wearing peasan suit _sceneMode = 9155; else // Hero wearing Purple suit _sceneMode = 9152; - setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL); + setAction(&_sequenceManager1, this, _sceneMode, &g_globals->_player, NULL); } else { // Walking with the tiger _sceneMode = 9151; _object2.postInit(); _object2.hide(); _object1.postInit(); - setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, &_object1, &_object2, NULL); + setAction(&_sequenceManager1, this, _sceneMode, &g_globals->_player, &_object1, &_object2, NULL); } } @@ -298,22 +301,22 @@ void Scene9150::postInit(SceneObjectList *OwnerList) { * *--------------------------------------------------------------------------*/ void Scene9200::SceneHotspot1::doAction(int action) { - Scene9200 *scene = (Scene9200 *)_globals->_sceneManager._scene; + Scene9200 *scene = (Scene9200 *)g_globals->_sceneManager._scene; if (action == OBJECT_TUNIC) { - _globals->_player.disableControl(); - if (_globals->getFlag(93)) { + g_globals->_player.disableControl(); + if (g_globals->getFlag(93)) { scene->_sceneState = 9214; - scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9214, &g_globals->_player, &scene->_object2, NULL); } else { - _globals->setFlag(93); + g_globals->setFlag(93); scene->_sceneState = 9213; - scene->setAction(&scene->_sequenceManager, scene, 9213, &_globals->_player, &scene->_object2, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9213, &g_globals->_player, &scene->_object2, NULL); } } else if (action <= 100) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneState = 9214; - scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9214, &g_globals->_player, &scene->_object2, NULL); } else { NamedHotspot::doAction(action); } @@ -322,15 +325,15 @@ void Scene9200::SceneHotspot1::doAction(int action) { void Scene9200::signal() { switch (_sceneState++) { case 9207: - _globals->_sceneManager.changeScene(9700); + g_globals->_sceneManager.changeScene(9700); break; case 9208: case 9211: case 9212: - _globals->_sceneManager.changeScene(9500); + g_globals->_sceneManager.changeScene(9500); break; case 9209: - _globals->_sceneManager.changeScene(9360); + g_globals->_sceneManager.changeScene(9360); break; case 9210: _hotspot1.remove(); @@ -342,7 +345,7 @@ void Scene9200::signal() { case 9205: case 9206: default: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; } } @@ -358,30 +361,30 @@ void Scene9200::dispatch() { if (_action) { _action->dispatch(); } else { - if ( (_globals->_player._position.x <= 0) || ((_globals->_player._position.x < 100) && (_globals->_player._position.y > 199))) { - _globals->_player.disableControl(); + if ( (g_globals->_player._position.x <= 0) || ((g_globals->_player._position.x < 100) && (g_globals->_player._position.y > 199))) { + g_globals->_player.disableControl(); _sceneState = 9209; - setAction(&_sequenceManager, this, 9209, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9209, &g_globals->_player, &_object2, &_object3, NULL); } else { - if (rect9200.contains(_globals->_player._position)) { - if (_globals->getFlag(93)) { - if (_globals->getFlag(86)) { + if (rect9200.contains(g_globals->_player._position)) { + if (g_globals->getFlag(93)) { + if (g_globals->getFlag(86)) { _sceneState = 9215; - setAction(&_sequenceManager, this, 9215, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9215, &g_globals->_player, &_object2, &_object3, NULL); } else { _sceneState = 9208; - setAction(&_sequenceManager, this, 9208, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9208, &g_globals->_player, &_object2, &_object3, NULL); } } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneState = 9204; - setAction(&_sequenceManager, this, 9204, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9204, &g_globals->_player, &_object2, &_object3, NULL); } } else { - if (_globals->_player._position.y < 140) { - _globals->_player.disableControl(); + if (g_globals->_player._position.y < 140) { + g_globals->_player.disableControl(); _sceneState = 9207; - setAction(&_sequenceManager, this, 9207, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9207, &g_globals->_player, &_object2, &_object3, NULL); } } } @@ -392,7 +395,7 @@ void Scene9200::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(130, 50, 200, 150); - _globals->_player.postInit(); + g_globals->_player.postInit(); _object3.postInit(); _object3.hide(); _object1.postInit(); @@ -408,63 +411,63 @@ void Scene9200::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerGR); _stripManager.addSpeaker(&_speakerGText); - if (!_globals->getFlag(86)) { + if (!g_globals->getFlag(86)) { _object2.postInit(); - _hotspot1.setup(96, 194, 160, 234, 9200, 29, 31); + _hotspot1.setDetails(96, 194, 160, 234, 9200, 29, 31); } - _hotspot2.setup(164, 0, 200, 282, 9200, 0, 1); - _hotspot3.setup(140, 39, 165, 153, 9200, 2, 3); - _hotspot4.setup(92, 122, 139, 152, 9200, 4, 5); - _hotspot5.setup(33, 20, 142, 115, 9200, 6, 7); - _hotspot6.setup(104, 235, 153, 265, 9200, 8, 9); - _hotspot7.setup(107, 262, 153, 286, 9200, 10, 11); - _hotspot8.setup(69, 276, 164, 320, 9200, 12, 13); + _hotspot2.setDetails(164, 0, 200, 282, 9200, 0, 1); + _hotspot3.setDetails(140, 39, 165, 153, 9200, 2, 3); + _hotspot4.setDetails(92, 122, 139, 152, 9200, 4, 5); + _hotspot5.setDetails(33, 20, 142, 115, 9200, 6, 7); + _hotspot6.setDetails(104, 235, 153, 265, 9200, 8, 9); + _hotspot7.setDetails(107, 262, 153, 286, 9200, 10, 11); + _hotspot8.setDetails(69, 276, 164, 320, 9200, 12, 13); - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.disableControl(); + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.disableControl(); - switch (_globals->_sceneManager._previousScene) { + switch (g_globals->_sceneManager._previousScene) { case 9500: - if (_globals->getFlag(85)) { + if (g_globals->getFlag(85)) { if (RING_INVENTORY._helmet._sceneNumber == 1) { - _globals->setFlag(86); - _globals->_player.disableControl(); + g_globals->setFlag(86); + g_globals->_player.disableControl(); _sceneState = 9210; - setAction(&_sequenceManager, this, 9210, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9210, &g_globals->_player, &_object2, &_object3, NULL); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneState = 9212; - setAction(&_sequenceManager, this, 9212, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9212, &g_globals->_player, &_object2, &_object3, NULL); } } else { if (RING_INVENTORY._helmet._sceneNumber == 1) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneState = 9211; - setAction(&_sequenceManager, this, 9211, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9211, &g_globals->_player, &_object2, &_object3, NULL); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneState = 9202; - setAction(&_sequenceManager, this, 9202, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9202, &g_globals->_player, &_object2, &_object3, NULL); } } break; case 9700: - if (_globals->getFlag(86)) { + if (g_globals->getFlag(86)) { _sceneState = 9206; - setAction(&_sequenceManager, this, 9206, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9206, &g_globals->_player, &_object2, &_object3, NULL); } else { _sceneState = 9203; - setAction(&_sequenceManager, this, 9203, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9203, &g_globals->_player, &_object2, &_object3, NULL); } break; case 9360: default: - if (_globals->getFlag(86)) { + if (g_globals->getFlag(86)) { _sceneState = 9205; - setAction(&_sequenceManager, this, 9205, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9205, &g_globals->_player, &_object2, &_object3, NULL); } else { _sceneState = 9201; - setAction(&_sequenceManager, this, 9201, &_globals->_player, &_object2, &_object3, NULL); + setAction(&_sequenceManager, this, 9201, &g_globals->_player, &_object2, &_object3, NULL); } break; } @@ -477,14 +480,14 @@ void Scene9200::postInit(SceneObjectList *OwnerList) { void Scene9300::signal() { switch (_sceneMode++) { case 9301: - _globals->setFlag(84); + g_globals->setFlag(84); // No break on purpose case 9303: - _globals->_soundHandler.play(295); - _globals->_sceneManager.changeScene(9350); + g_globals->_soundHandler.play(295); + g_globals->_sceneManager.changeScene(9350); break; case 9302: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; default: break; @@ -494,10 +497,10 @@ void Scene9300::signal() { void Scene9300::dispatch() { if (_action) { _action->dispatch(); - } else if (_globals->_player._position.y < 145) { - _globals->_player.disableControl(); + } else if (g_globals->_player._position.y < 145) { + g_globals->_player.disableControl(); _sceneMode = 9303; - setAction(&_sequenceManager, this, 9303, &_globals->_player, &_object1, &_object2, NULL); + setAction(&_sequenceManager, this, 9303, &g_globals->_player, &_object1, &_object2, NULL); } } @@ -506,34 +509,34 @@ void Scene9300::postInit(SceneObjectList *OwnerList) { setZoomPercents(130, 75, 230, 150); _sceneMode = 0; - _globals->_player.postInit(); - _globals->_player.changeZoom(-1); + g_globals->_player.postInit(); + g_globals->_player.changeZoom(-1); _object1.postInit(); _object2.postInit(); - _globals->_soundHandler.play(289); - - _hotspot1.setup(35, 142, 76, 212, 9300, 0, 1); - _hotspot2.setup(28, 90, 81, 143, 9300, 2, 3); - _hotspot3.setup(78, 142, 146, 216, 9300, 4, 5); - _hotspot4.setup(3, 43, 91, 74, 9300, 6, 7); - _hotspot5.setup(82, 19, 157, 65, 9300, 8, 9); - _hotspot6.setup(5, 218, 84, 274, 9300, 10, 11); - _hotspot7.setup(86, 233, 168, 293, 9300, 12, 13); - _hotspot8.setup(157, 0, 200, 230, 9300, 14, 15); - _hotspot9.setup(169, 227, 200, 320, 9300, 16, 17); - _hotspot10.setup(145, 97, 166, 225, 9300, 18, 19); - _hotspot11.setup(81, 75, 145, 145, 9300, 20, 21); - _hotspot12.setup(0, 0, 94, 35, 9300, 22, 23); - _hotspot13.setup(12, 268, 149, 320, 9300, 24, 25); - - if (_globals->_sceneManager._previousScene == 9350) { - _globals->_player.disableControl(); + g_globals->_soundHandler.play(289); + + _hotspot1.setDetails(35, 142, 76, 212, 9300, 0, 1); + _hotspot2.setDetails(28, 90, 81, 143, 9300, 2, 3); + _hotspot3.setDetails(78, 142, 146, 216, 9300, 4, 5); + _hotspot4.setDetails(3, 43, 91, 74, 9300, 6, 7); + _hotspot5.setDetails(82, 19, 157, 65, 9300, 8, 9); + _hotspot6.setDetails(5, 218, 84, 274, 9300, 10, 11); + _hotspot7.setDetails(86, 233, 168, 293, 9300, 12, 13); + _hotspot8.setDetails(157, 0, 200, 230, 9300, 14, 15); + _hotspot9.setDetails(169, 227, 200, 320, 9300, 16, 17); + _hotspot10.setDetails(145, 97, 166, 225, 9300, 18, 19); + _hotspot11.setDetails(81, 75, 145, 145, 9300, 20, 21); + _hotspot12.setDetails(0, 0, 94, 35, 9300, 22, 23); + _hotspot13.setDetails(12, 268, 149, 320, 9300, 24, 25); + + if (g_globals->_sceneManager._previousScene == 9350) { + g_globals->_player.disableControl(); _sceneMode = 9302; - setAction(&_sequenceManager, this, 9302, &_globals->_player, &_object1, &_object2, NULL); + setAction(&_sequenceManager, this, 9302, &g_globals->_player, &_object1, &_object2, NULL); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9301; - setAction(&_sequenceManager, this, 9301, &_globals->_player, &_object1, &_object2, NULL); + setAction(&_sequenceManager, this, 9301, &g_globals->_player, &_object1, &_object2, NULL); } } @@ -548,17 +551,17 @@ void Scene9350::signal() { case 9352: case 9353: case 9354: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 9355: - _globals->_sceneManager.changeScene(9300); + g_globals->_sceneManager.changeScene(9300); break; case 9356: - _globals->_sceneManager.changeScene(9360); + g_globals->_sceneManager.changeScene(9360); break; case 9357: case 9359: - _globals->_sceneManager.changeScene(9400); + g_globals->_sceneManager.changeScene(9400); break; default: break; @@ -567,18 +570,18 @@ void Scene9350::signal() { void Scene9350::dispatch() { if (_action == 0) { - if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) { - _globals->_player.disableControl(); + if ((g_globals->_player._position.x > 300) && (g_globals->_player._position.y < 160)) { + g_globals->_player.disableControl(); _sceneState = 9356; - setAction(&_sequenceManager, this, 9356, &_globals->_player, &_object2, NULL); - } else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) { - _globals->_player.disableControl(); + setAction(&_sequenceManager, this, 9356, &g_globals->_player, &_object2, NULL); + } else if ((g_globals->_player._position.x > 110) && (g_globals->_player._position.y >= 195)) { + g_globals->_player.disableControl(); _sceneState = 9357; - setAction(&_sequenceManager, this, 9357, &_globals->_player, &_object2, NULL); - } else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) { - _globals->_player.disableControl(); + setAction(&_sequenceManager, this, 9357, &g_globals->_player, &_object2, NULL); + } else if ((g_globals->_player._position.x < 10) || ((g_globals->_player._position.x <= 110) && (g_globals->_player._position.y >= 195))) { + g_globals->_player.disableControl(); _sceneState = 9355; - setAction(&_sequenceManager, this, 9355, &_globals->_player, &_object2, NULL); + setAction(&_sequenceManager, this, 9355, &g_globals->_player, &_object2, NULL); } } else { Scene::dispatch(); @@ -588,37 +591,37 @@ void Scene9350::dispatch() { void Scene9350::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(95, 80, 200, 100); - _globals->_player.postInit(); + g_globals->_player.postInit(); _object1.setup(9351, 1, 3, 139, 97, 0); - _sceneHotspot1.setup(42, 0, 97, 60, 9350, 0, -1); - _sceneHotspot2.setup(37, 205, 82, 256, 9350, 0, -1); - _sceneHotspot3.setup(29, 93, 92, 174, 9350, 1, -1); - _sceneHotspot4.setup(0, 308, 109, 320, 9350, 2, -1); - _sceneHotspot5.setup(0, 0, 200, 320, 9350, 3, -1); + _sceneHotspot1.setDetails(42, 0, 97, 60, 9350, 0, -1); + _sceneHotspot2.setDetails(37, 205, 82, 256, 9350, 0, -1); + _sceneHotspot3.setDetails(29, 93, 92, 174, 9350, 1, -1); + _sceneHotspot4.setDetails(0, 308, 109, 320, 9350, 2, -1); + _sceneHotspot5.setDetails(0, 0, 200, 320, 9350, 3, -1); - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.disableControl(); + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.disableControl(); - if (_globals->_sceneManager._previousScene == 9360) { - _globals->_player.disableControl(); + if (g_globals->_sceneManager._previousScene == 9360) { + g_globals->_player.disableControl(); _sceneState = 9352; - setAction(&_sequenceManager, this, 9352, &_globals->_player, &_object2, NULL); - } else if (_globals->_sceneManager._previousScene == 9400) { - _globals->_player.disableControl(); + setAction(&_sequenceManager, this, 9352, &g_globals->_player, &_object2, NULL); + } else if (g_globals->_sceneManager._previousScene == 9400) { + g_globals->_player.disableControl(); _sceneState = 9353; - setAction(&_sequenceManager, this, 9353, &_globals->_player, &_object2, NULL); + setAction(&_sequenceManager, this, 9353, &g_globals->_player, &_object2, NULL); } else { - if (_globals->getFlag(84)) { - _globals->clearFlag(84); + if (g_globals->getFlag(84)) { + g_globals->clearFlag(84); _object2.postInit(); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneState = 9359; - setAction(&_sequenceManager, this, 9359, &_globals->_player, &_object2, NULL); + setAction(&_sequenceManager, this, 9359, &g_globals->_player, &_object2, NULL); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneState = 9354; - setAction(&_sequenceManager, this, 9354, &_globals->_player, &_object2, NULL); + setAction(&_sequenceManager, this, 9354, &g_globals->_player, &_object2, NULL); } } } @@ -634,16 +637,16 @@ void Scene9360::signal() { case 9362: case 9363: case 9364: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 9365: - _globals->_sceneManager.changeScene(9350); + g_globals->_sceneManager.changeScene(9350); break; case 9366: - _globals->_sceneManager.changeScene(9200); + g_globals->_sceneManager.changeScene(9200); break; case 9367: - _globals->_sceneManager.changeScene(9450); + g_globals->_sceneManager.changeScene(9450); break; default: break; @@ -652,18 +655,18 @@ void Scene9360::signal() { void Scene9360::dispatch() { if (_action == 0) { - if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) { - _globals->_player.disableControl(); + if ((g_globals->_player._position.x > 300) && (g_globals->_player._position.y < 160)) { + g_globals->_player.disableControl(); _sceneState = 9366; - setAction(&_sequenceManager, this, 9366, &_globals->_player, NULL); - } else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) { - _globals->_player.disableControl(); + setAction(&_sequenceManager, this, 9366, &g_globals->_player, NULL); + } else if ((g_globals->_player._position.x > 110) && (g_globals->_player._position.y >= 195)) { + g_globals->_player.disableControl(); _sceneState = 9367; - setAction(&_sequenceManager, this, 9367, &_globals->_player, NULL); - } else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) { - _globals->_player.disableControl(); + setAction(&_sequenceManager, this, 9367, &g_globals->_player, NULL); + } else if ((g_globals->_player._position.x < 10) || ((g_globals->_player._position.x <= 110) && (g_globals->_player._position.y >= 195))) { + g_globals->_player.disableControl(); _sceneState = 9365; - setAction(&_sequenceManager, this, 9365, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 9365, &g_globals->_player, NULL); } } else { Scene::dispatch(); @@ -673,30 +676,30 @@ void Scene9360::dispatch() { void Scene9360::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(95, 80, 200, 100); - _globals->_player.postInit(); - - _hotspot1.setup(37, 92, 93, 173, 9360, 0, 1); - _hotspot2.setup(42, 0, 100, 63, 9360, 2, -1); - _hotspot3.setup(36, 205, 82, 260, 9360, 3, -1); - _hotspot4.setup(103, 2, 200, 320, 9360, 4, -1); - _hotspot5.setup(0, 0, 37, 320, 9360, 4, -1); - _hotspot6.setup(35, 61, 103, 92, 9360, 4, -1); - _hotspot7.setup(33, 174, 93, 207, 9360, 4, -1); - _hotspot8.setup(28, 257, 149, 320, 9360, 4, -1); - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.disableControl(); - if (_globals->_sceneManager._previousScene == 9350) { - _globals->_player.disableControl(); + g_globals->_player.postInit(); + + _hotspot1.setDetails(37, 92, 93, 173, 9360, 0, 1); + _hotspot2.setDetails(42, 0, 100, 63, 9360, 2, -1); + _hotspot3.setDetails(36, 205, 82, 260, 9360, 3, -1); + _hotspot4.setDetails(103, 2, 200, 320, 9360, 4, -1); + _hotspot5.setDetails(0, 0, 37, 320, 9360, 4, -1); + _hotspot6.setDetails(35, 61, 103, 92, 9360, 4, -1); + _hotspot7.setDetails(33, 174, 93, 207, 9360, 4, -1); + _hotspot8.setDetails(28, 257, 149, 320, 9360, 4, -1); + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.disableControl(); + if (g_globals->_sceneManager._previousScene == 9350) { + g_globals->_player.disableControl(); _sceneState = 9364; - setAction(&_sequenceManager, this, 9364, &_globals->_player, NULL); - } else if (_globals->_sceneManager._previousScene == 9450) { - _globals->_player.disableControl(); + setAction(&_sequenceManager, this, 9364, &g_globals->_player, NULL); + } else if (g_globals->_sceneManager._previousScene == 9450) { + g_globals->_player.disableControl(); _sceneState = 9363; - setAction(&_sequenceManager, this, 9363, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 9363, &g_globals->_player, NULL); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneState = 9362; - setAction(&_sequenceManager, this, 9362, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 9362, &g_globals->_player, NULL); } _object1.setup(9351, 1, 1, 131, 90, 0); } @@ -710,22 +713,22 @@ Scene9400::Scene9400() { } void Scene9400::SceneHotspot7::doAction(int action) { - Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene; + Scene9400 *scene = (Scene9400 *)g_globals->_sceneManager._scene; if ((action == CURSOR_USE) && (RING_INVENTORY._straw._sceneNumber != 1)) { scene->_sceneState = 1; RING_INVENTORY._straw._sceneNumber = 1; - scene->setAction(&scene->_sequenceManager, scene, 9408, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9408, &g_globals->_player, NULL); } else { NamedHotspot::doAction(action); } } void Scene9400::SceneHotspot8::doAction(int action) { - Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene; + Scene9400 *scene = (Scene9400 *)g_globals->_sceneManager._scene; if (action == CURSOR_TALK) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneState = 2; scene->signal(); } else { @@ -742,7 +745,7 @@ void Scene9400::signal() { case 1: _object1._numFrames = 6; _object1.animate(ANIM_MODE_2, NULL); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 2: _object1.animate(ANIM_MODE_5, this); @@ -752,10 +755,10 @@ void Scene9400::signal() { break; case 4: _object1.animate(ANIM_MODE_2, this); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 9350: - _globals->_sceneManager.changeScene(9350); + g_globals->_sceneManager.changeScene(9350); break; default: break; @@ -772,13 +775,13 @@ void Scene9400::dispatch() { _field1032 = 0; } if (_action == 0) { - if (_globals->_player._position.y < 120) { + if (g_globals->_player._position.y < 120) { _sceneState = 9350; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setAction(&_action1); Common::Point pt(-45, 88); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); } } else { Scene::dispatch(); @@ -789,35 +792,35 @@ void Scene9400::postInit(SceneObjectList *OwnerList) { Scene::postInit(); _screenNumber = 9400; setZoomPercents(0, 100, 200, 100); - _globals->_player.postInit(); + g_globals->_player.postInit(); _object1.postInit(); _object3.postInit(); _speakerQText._textPos.x = 20; - _hotspot7.setup(157, 66, 180, 110, 9400, 21, 23); - _hotspot5.setup(130, 133, 152, 198, 9400, 22, -1); - _hotspot1.setup(33, 280, 69, 297, 9400, 1, 2); - _hotspot2.setup(73, 96, 87, 159, 9400, 3, 4); - _hotspot3.setup(89, 253, 111, 305, 9400, 5, 6); - _hotspot4.setup(46, 0, 116, 35, 9400, 7, 8); - _hotspot8.setup(58, 169, 122, 200, 9400, 9, 10); - _hotspot6.setup(0, 0, 199, 319, 9400, 16, 0); + _hotspot7.setDetails(157, 66, 180, 110, 9400, 21, 23); + _hotspot5.setDetails(130, 133, 152, 198, 9400, 22, -1); + _hotspot1.setDetails(33, 280, 69, 297, 9400, 1, 2); + _hotspot2.setDetails(73, 96, 87, 159, 9400, 3, 4); + _hotspot3.setDetails(89, 253, 111, 305, 9400, 5, 6); + _hotspot4.setDetails(46, 0, 116, 35, 9400, 7, 8); + _hotspot8.setDetails(58, 169, 122, 200, 9400, 9, 10); + _hotspot6.setDetails(0, 0, 199, 319, 9400, 16, 0); _stripManager.addSpeaker(&_speakerQText); _stripManager.addSpeaker(&_speakerOR); _stripManager.addSpeaker(&_speakerOText); - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.disableControl(); + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.disableControl(); - // Useless check (skipped) : if (_globals->_sceneManager._previousScene == 9350) + // Useless check (skipped) : if (g_globals->_sceneManager._previousScene == 9350) _sceneState = 2; - if (!_globals->getFlag(89)) { - _globals->setFlag(89); + if (!g_globals->getFlag(89)) { + g_globals->setFlag(89); _sceneState = 0; } - setAction(&_sequenceManager, this, 9400, &_globals->_player, &_object1, &_object3, NULL); + setAction(&_sequenceManager, this, 9400, &g_globals->_player, &_object1, &_object3, NULL); } void Scene9400::synchronize(Serializer &s) { @@ -831,7 +834,7 @@ void Scene9400::synchronize(Serializer &s) { * *--------------------------------------------------------------------------*/ void Scene9450::Object2::signal() { - Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene; + Scene9450 *scene = (Scene9450 *)g_globals->_sceneManager._scene; this->setAction(&scene->_sequenceManager3, this, 9458, this, &scene->_object1, NULL); } @@ -842,29 +845,29 @@ void Scene9450::Object3::dispatch() { } void Scene9450::Hotspot1::doAction(int action) { - Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene; + Scene9450 *scene = (Scene9450 *)g_globals->_sceneManager._scene; if (action == CURSOR_USE) { if (scene->_object2._action) scene->_object2._action->remove(); scene->_sceneMode = 9459; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL); + g_globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &g_globals->_player, NULL); } else { NamedHotspot::doAction(action); } } void Scene9450::Hotspot3::doAction(int action) { - Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene; + Scene9450 *scene = (Scene9450 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_CLOAK: case OBJECT_JACKET: case OBJECT_TUNIC2: scene->_sceneMode = 9460; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL); + g_globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager1, scene, 9460, &g_globals->_player, &scene->_object2, &scene->_object1, NULL); break; case OBJECT_TUNIC: SceneItem::display(9450, 49, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); @@ -881,14 +884,14 @@ void Scene9450::Hotspot3::doAction(int action) { if (scene->_object2._action) scene->_object2._action->remove(); scene->_sceneMode = 9459; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL); + g_globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &g_globals->_player, NULL); } else if ((RING_INVENTORY._cloak._sceneNumber != 1) && (RING_INVENTORY._jacket._sceneNumber != 1) && (RING_INVENTORY._tunic2._sceneNumber != 1)) { SceneItem::display(9450, 38, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); } else { scene->_sceneMode = 9460; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL); + g_globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager1, scene, 9460, &g_globals->_player, &scene->_object2, &scene->_object1, NULL); } break; default: @@ -909,8 +912,8 @@ void Scene9450::signal() { setAction(&_sequenceManager1, this, 9457, &_object2, &_object1, &_object3, NULL); break; case 9451: - if (_globals->getFlag(87)) { - _globals->_player.enableControl(); + if (g_globals->getFlag(87)) { + g_globals->_player.enableControl(); } else { _sceneMode = 1001; if (_object2._action) @@ -925,20 +928,20 @@ void Scene9450::signal() { setAction(&_sequenceManager1, this, 9455, &_object2, &_object1, &_object3, NULL); break; case 9453: - _globals->_sceneManager.changeScene(9360); + g_globals->_sceneManager.changeScene(9360); break; case 9459: RING_INVENTORY._tunic._sceneNumber = 1; _object2.signal(); - _globals->_player.enableControl(); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.enableControl(); + g_globals->_events.setCursor(CURSOR_WALK); _hotspot1.remove(); break; case 1006: - _globals->setFlag(87); + g_globals->setFlag(87); // No break on purpose default: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; } } @@ -947,14 +950,14 @@ void Scene9450::dispatch() { if (_action) { _action->dispatch(); } else { - if ((_globals->_player._position.y < 98) && (_globals->_player._position.x > 241) && (_globals->_player._position.x < 282)) { - _globals->_player.disableControl(); + if ((g_globals->_player._position.y < 98) && (g_globals->_player._position.x > 241) && (g_globals->_player._position.x < 282)) { + g_globals->_player.disableControl(); _sceneMode = 9452; - setAction(&_sequenceManager1, this, 9452, &_globals->_player, NULL); - } else if ((_globals->_player._position.y < 99) && (_globals->_player._position.x > 68) && (_globals->_player._position.x < 103)) { - _globals->_player.disableControl(); + setAction(&_sequenceManager1, this, 9452, &g_globals->_player, NULL); + } else if ((g_globals->_player._position.y < 99) && (g_globals->_player._position.x > 68) && (g_globals->_player._position.x < 103)) { + g_globals->_player.disableControl(); _sceneMode = 9453; - setAction(&_sequenceManager1, this, 9453, &_globals->_player, NULL); + setAction(&_sequenceManager1, this, 9453, &g_globals->_player, NULL); } } } @@ -962,18 +965,18 @@ void Scene9450::dispatch() { void Scene9450::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(84, 75, 167, 150); - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.postInit(); + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.postInit(); _object2.postInit(); _object1.postInit(); _object1.hide(); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9451; - setAction(&_sequenceManager1, this, 9451, &_globals->_player, NULL); + setAction(&_sequenceManager1, this, 9451, &g_globals->_player, NULL); - if (_globals->getFlag(87)) { + if (g_globals->getFlag(87)) { if (RING_INVENTORY._tunic._sceneNumber == 1) { _object2.signal(); } else { @@ -990,23 +993,23 @@ void Scene9450::postInit(SceneObjectList *OwnerList) { } if (RING_INVENTORY._tunic._sceneNumber != 1) - _hotspot1.setup(123, 139, 138, 170, 9450, 37, -1); - - _hotspot2.setup(153, 102, 176, 141, 9450, 39, 40); - _hotspot3.setup(97, 198, 130, 229, 9450, 41, 42); - _hotspot15.setup(131, 190, 145, 212, 9450, 43, 44); - _hotspot4.setup(33, 144, 105, 192, 9450, 0, 1); - _hotspot5.setup(20, 236, 106, 287, 9450, 2, 3); - _hotspot6.setup(137, 119, 195, 320, 9450, 4, 5); - _hotspot7.setup(20, 59, 99, 111, 9450, 6, -1); - _hotspot8.setup(110, 0, 199, 117, 9450, 7, 8); - _hotspot9.setup(101, 104, 130, 174, 9450, 9, 10); - _hotspot10.setup(110, 246, 149, 319, 9450, 11, 12); - _hotspot11.setup(16, 34, 74, 62, 6450, 13, 14); - _hotspot12.setup(19, 108, 72, 134, 9450, 15, 16); - _hotspot13.setup(18, 215, 71, 237, 9450, 17, 18); - _hotspot14.setup(15, 288, 76, 314, 9450, 19, 20); - _hotspot16.setup(0, 0, 200, 320, 9450, 46, -1); + _hotspot1.setDetails(123, 139, 138, 170, 9450, 37, -1); + + _hotspot2.setDetails(153, 102, 176, 141, 9450, 39, 40); + _hotspot3.setDetails(97, 198, 130, 229, 9450, 41, 42); + _hotspot15.setDetails(131, 190, 145, 212, 9450, 43, 44); + _hotspot4.setDetails(33, 144, 105, 192, 9450, 0, 1); + _hotspot5.setDetails(20, 236, 106, 287, 9450, 2, 3); + _hotspot6.setDetails(137, 119, 195, 320, 9450, 4, 5); + _hotspot7.setDetails(20, 59, 99, 111, 9450, 6, -1); + _hotspot8.setDetails(110, 0, 199, 117, 9450, 7, 8); + _hotspot9.setDetails(101, 104, 130, 174, 9450, 9, 10); + _hotspot10.setDetails(110, 246, 149, 319, 9450, 11, 12); + _hotspot11.setDetails(16, 34, 74, 62, 6450, 13, 14); + _hotspot12.setDetails(19, 108, 72, 134, 9450, 15, 16); + _hotspot13.setDetails(18, 215, 71, 237, 9450, 17, 18); + _hotspot14.setDetails(15, 288, 76, 314, 9450, 19, 20); + _hotspot16.setDetails(0, 0, 200, 320, 9450, 46, -1); } /*-------------------------------------------------------------------------- @@ -1014,67 +1017,67 @@ void Scene9450::postInit(SceneObjectList *OwnerList) { * *--------------------------------------------------------------------------*/ void Scene9500::Hotspot1::doAction(int action) { - Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; + Scene9500 *scene = (Scene9500 *)g_globals->_sceneManager._scene; if (action == OBJECT_SWORD) { scene->_sceneMode = 9510; - _globals->setFlag(92); + g_globals->setFlag(92); RING_INVENTORY._sword._sceneNumber = 9500; - _globals->_player.disableControl(); - _globals->_sceneItems.remove(this); - scene->_hotspot2.setup(87, 294, 104, 314, 9400, 17, -1); - scene->setAction(&scene->_sequenceManager, scene, 9510, &_globals->_player, &scene->_object2, NULL); + g_globals->_player.disableControl(); + g_globals->_sceneItems.remove(this); + scene->_hotspot2.setDetails(87, 294, 104, 314, 9400, 17, -1); + scene->setAction(&scene->_sequenceManager, scene, 9510, &g_globals->_player, &scene->_object2, NULL); } else { NamedHotspot::doAction(action); } } void Scene9500::Hotspot2::doAction(int action) { - Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; + Scene9500 *scene = (Scene9500 *)g_globals->_sceneManager._scene; if (action == CURSOR_USE) { scene->_sceneMode = 9511; - _globals->_player.disableControl(); - _globals->_sceneItems.remove(this); - scene->setAction(&scene->_sequenceManager, scene, 9511, &_globals->_player, &scene->_object2, NULL); + g_globals->_player.disableControl(); + g_globals->_sceneItems.remove(this); + scene->setAction(&scene->_sequenceManager, scene, 9511, &g_globals->_player, &scene->_object2, NULL); } else { NamedHotspot::doAction(action); } } void Scene9500::Hotspot3::doAction(int action) { - Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; + Scene9500 *scene = (Scene9500 *)g_globals->_sceneManager._scene; if ((action == CURSOR_USE) && (RING_INVENTORY._candle._sceneNumber != 1)){ scene->_sceneMode = 9505; - _globals->_player.disableControl(); - _globals->_sceneItems.remove(this); - scene->setAction(&scene->_sequenceManager, scene, 9505, &_globals->_player, &scene->_candle, NULL); + g_globals->_player.disableControl(); + g_globals->_sceneItems.remove(this); + scene->setAction(&scene->_sequenceManager, scene, 9505, &g_globals->_player, &scene->_candle, NULL); } else { NamedHotspot::doAction(action); } } void Scene9500::Hotspot4::doAction(int action) { - Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene; + Scene9500 *scene = (Scene9500 *)g_globals->_sceneManager._scene; if (action == OBJECT_CANDLE) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); if (RING_INVENTORY._straw._sceneNumber == 9500) { scene->_sceneMode = 9506; - _globals->_sceneItems.remove(&scene->_hotspot5); - _globals->_sceneItems.remove(this); - scene->setAction(&scene->_sequenceManager, scene, 9506, &_globals->_player, &scene->_object3, NULL); + g_globals->_sceneItems.remove(&scene->_hotspot5); + g_globals->_sceneItems.remove(this); + scene->setAction(&scene->_sequenceManager, scene, 9506, &g_globals->_player, &scene->_object3, NULL); RING_INVENTORY._candle._sceneNumber = 9850; } else { scene->_sceneMode = 9507; - scene->setAction(&scene->_sequenceManager, scene, 9507, &_globals->_player, &scene->_object3, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9507, &g_globals->_player, &scene->_object3, NULL); } } else if (action == OBJECT_STRAW) { scene->_sceneMode = 9512; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); RING_INVENTORY._straw._sceneNumber = 9500; - scene->setAction(&scene->_sequenceManager, scene, 9512, &_globals->_player, &scene->_object3, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9512, &g_globals->_player, &scene->_object3, NULL); } else { NamedHotspot::doAction(action); } @@ -1083,35 +1086,35 @@ void Scene9500::Hotspot4::doAction(int action) { void Scene9500::signal() { switch (_sceneMode) { case 9503: - _globals->_sceneManager.changeScene(9200); - _globals->_soundHandler.play(295); + g_globals->_sceneManager.changeScene(9200); + g_globals->_soundHandler.play(295); break; case 9504: - _globals->_sceneManager.changeScene(9850); + g_globals->_sceneManager.changeScene(9850); break; case 9505: _candle.setStrip(2); RING_INVENTORY._candle._sceneNumber = 1; - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 9506: - _globals->setFlag(85); - _globals->_player.enableControl(); + g_globals->setFlag(85); + g_globals->_player.enableControl(); break; case 9511: RING_INVENTORY._helmet._sceneNumber = 1; - _globals->_player.enableControl(); - if (!_globals->getFlag(51)) { - _globals->setFlag(51); - _globals->_player.disableControl(); + g_globals->_player.enableControl(); + if (!g_globals->getFlag(51)) { + g_globals->setFlag(51); + g_globals->_player.disableControl(); _sceneMode = 9514; - setAction(&_sequenceManager, this, 9514, &_globals->_player, NULL, NULL, NULL, NULL); + setAction(&_sequenceManager, this, 9514, &g_globals->_player, NULL, NULL, NULL, NULL); } break; case 0: case 9514: default: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; } } @@ -1120,14 +1123,14 @@ void Scene9500::dispatch() { if (_action) { _action->dispatch(); } else { - if (_globals->_player._position.y >= 199) { - _globals->_player.disableControl(); + if (g_globals->_player._position.y >= 199) { + g_globals->_player.disableControl(); _sceneMode = 9503; - setAction(&_sequenceManager, this, 9503, &_globals->_player, NULL, NULL, NULL, NULL); - } else if (_globals->_player._position.y < 127) { - _globals->_player.disableControl(); + setAction(&_sequenceManager, this, 9503, &g_globals->_player, NULL, NULL, NULL, NULL); + } else if (g_globals->_player._position.y < 127) { + g_globals->_player.disableControl(); _sceneMode = 9504; - setAction(&_sequenceManager, this, 9504, &_globals->_player, NULL, NULL, NULL, NULL); + setAction(&_sequenceManager, this, 9504, &g_globals->_player, NULL, NULL, NULL, NULL); } } @@ -1141,8 +1144,8 @@ void Scene9500::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(110, 75, 200, 150); - _globals->_player.postInit(); - _globals->_soundHandler.play(305); + g_globals->_player.postInit(); + g_globals->_soundHandler.play(305); _candle.postInit(); _candle.setVisage(9500); @@ -1162,7 +1165,7 @@ void Scene9500::postInit(SceneObjectList *OwnerList) { _object3._strip = 2; _object3._frame = 9; _object3.setPosition(Common::Point(168, 128)); - if (_globals->getFlag(85)) { + if (g_globals->getFlag(85)) { _object3.setVisage(9500); _object3.setStrip(4); _object3.animate(ANIM_MODE_8, 0, NULL); @@ -1172,61 +1175,61 @@ void Scene9500::postInit(SceneObjectList *OwnerList) { _object2.postInit(); _object2.hide(); - if (_globals->getFlag(92)) { + if (g_globals->getFlag(92)) { _object2.show(); _object2.setVisage(9501); _object2.setStrip(1); _object2.setFrame(_object2.getFrameCount()); _object2.setPosition(Common::Point(303, 130)); _object2.fixPriority(132); - if (RING_INVENTORY._helmet._sceneNumber == 1) { - _hotspot2.setup(87, 294, 104, 314, 9400, 17, -1); + if (RING_INVENTORY._helmet._sceneNumber != 1) { + _hotspot2.setDetails(87, 294, 104, 314, 9400, 17, -1); } else { _object2.setStrip(2); _object2.setFrame(1); } } else { - _hotspot1.setup(105, 295, 134, 313, 9500, 9, 10); + _hotspot1.setDetails(105, 295, 134, 313, 9500, 9, 10); } - _hotspot17.setup(101, 293, 135, 315, 9500, 9, 10); - _hotspot3.setup(84, 12, 107, 47, 9500, 15, 15); - _hotspot6.setup(93, 11, 167, 46, 9500, 0, 1); - _hotspot7.setup(100, 70, 125, 139, 9500, 2, 3); + _hotspot17.setDetails(101, 293, 135, 315, 9500, 9, 10); + _hotspot3.setDetails(84, 12, 107, 47, 9500, 15, 15); + _hotspot6.setDetails(93, 11, 167, 46, 9500, 0, 1); + _hotspot7.setDetails(100, 70, 125, 139, 9500, 2, 3); - if (!_globals->getFlag(85)) { - _hotspot5.setup(111, 68, 155, 244, 9500, 17, -1); - _hotspot4.setup(57, 71, 120, 126, 9500, 16, -1); + if (!g_globals->getFlag(85)) { + _hotspot5.setDetails(111, 68, 155, 244, 9500, 17, -1); + _hotspot4.setDetails(57, 71, 120, 126, 9500, 16, -1); } - _hotspot8.setup(60, 24, 90, 53, 9500, 4, 5); - _hotspot9.setup(72, 143, 93, 163, 9500, 4, 5); - _hotspot10.setup(70, 205, 92, 228, 9500, 4, 5); - _hotspot11.setup(66, 291, 90, 317, 9500, 4, 5); - _hotspot12.setup(22, 58, 101, 145, 9500, 6, 7); - _hotspot13.setup(121, 57, 163, 249, 9500, 6, 7); - _hotspot14.setup(115, 133, 135, 252, 9500, 6, 7); - _hotspot15.setup(55, 240, 125, 254, 9500, 6, 7); - _hotspot16.setup(53, 251, 132, 288, 9500, 8, -1); - _hotspot19.setup(101, 207, 120, 225, 9500, 9, 10); - _hotspot18.setup(98, 144, 117, 162, 9500, 9, 10); - _hotspot20.setup(102, 27, 132, 50, 9500, 9, 10); + _hotspot8.setDetails(60, 24, 90, 53, 9500, 4, 5); + _hotspot9.setDetails(72, 143, 93, 163, 9500, 4, 5); + _hotspot10.setDetails(70, 205, 92, 228, 9500, 4, 5); + _hotspot11.setDetails(66, 291, 90, 317, 9500, 4, 5); + _hotspot12.setDetails(22, 58, 101, 145, 9500, 6, 7); + _hotspot13.setDetails(121, 57, 163, 249, 9500, 6, 7); + _hotspot14.setDetails(115, 133, 135, 252, 9500, 6, 7); + _hotspot15.setDetails(55, 240, 125, 254, 9500, 6, 7); + _hotspot16.setDetails(53, 251, 132, 288, 9500, 8, -1); + _hotspot19.setDetails(101, 207, 120, 225, 9500, 9, 10); + _hotspot18.setDetails(98, 144, 117, 162, 9500, 9, 10); + _hotspot20.setDetails(102, 27, 132, 50, 9500, 9, 10); - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.disableControl(); + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.disableControl(); - if ((_globals->_sceneManager._previousScene == 9200) || (_globals->_sceneManager._previousScene != 9850)) { + if ((g_globals->_sceneManager._previousScene == 9200) || (g_globals->_sceneManager._previousScene != 9850)) { _sceneMode = 0; if (RING_INVENTORY._helmet._sceneNumber != 1) { - setAction(&_sequenceManager, this, 9501, &_globals->_player, &_candle, NULL); + setAction(&_sequenceManager, this, 9501, &g_globals->_player, &_candle, NULL); } else { RING_INVENTORY._helmet._sceneNumber = 9500; - _hotspot2.setup(87, 294, 104, 314, 9400, 17, -1); - setAction(&_sequenceManager, this, 9513, &_globals->_player, &_object2, NULL); + _hotspot2.setDetails(87, 294, 104, 314, 9400, 17, -1); + setAction(&_sequenceManager, this, 9513, &g_globals->_player, &_object2, NULL); } } else { _sceneMode = 0; - setAction(&_sequenceManager, this, 9502, &_globals->_player, &_candle, NULL); + setAction(&_sequenceManager, this, 9502, &g_globals->_player, &_candle, NULL); } } @@ -1237,7 +1240,7 @@ void Scene9500::postInit(SceneObjectList *OwnerList) { void Scene9700::signal() { switch (_sceneMode ++) { case 9703: - _globals->setFlag(88); + g_globals->setFlag(88); // No break on purpose case 9701: case 9702: @@ -1245,13 +1248,13 @@ void Scene9700::signal() { _gfxButton1._bounds.center(50, 190); _gfxButton1.draw(); _gfxButton1._bounds.expandPanes(); - _globals->_player.enableControl(); - _globals->_player._canWalk = false; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_player.enableControl(); + g_globals->_player._canWalk = false; + g_globals->_events.setCursor(CURSOR_USE); break; case 9704: - _globals->_soundHandler.play(323); - _globals->_sceneManager.changeScene(9750); + g_globals->_soundHandler.play(323); + g_globals->_sceneManager.changeScene(9750); break; } } @@ -1260,17 +1263,17 @@ void Scene9700::process(Event &event) { Scene::process(event); if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) { if (_gfxButton1.process(event)) { - _globals->_sceneManager.changeScene(9200); - } else if (_globals->_events._currentCursor == OBJECT_SCANNER) { + g_globals->_sceneManager.changeScene(9200); + } else if (g_globals->_events._currentCursor == OBJECT_SCANNER) { event.handled = true; if (RING_INVENTORY._helmet._sceneNumber == 1) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9704; - setAction(&_sequenceManager, this, 9704, &_globals->_player, &_object1, NULL); + setAction(&_sequenceManager, this, 9704, &g_globals->_player, &_object1, NULL); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9703; - setAction(&_sequenceManager, this, 9703, &_globals->_player, &_object1, NULL); + setAction(&_sequenceManager, this, 9703, &g_globals->_player, &_object1, NULL); } } } @@ -1280,25 +1283,25 @@ void Scene9700::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(0, 100, 200, 100); - _sceneHotspot1.setup(84, 218, 151, 278, 9700, 14, -1); - _sceneHotspot2.setup(89, 11, 151, 121, 9700, 14, -1); - _sceneHotspot3.setup(69, 119, 138, 216, 9700, 15, 16); - _sceneHotspot4.setup(34, 13, 88, 116, 9700, 17, -1); - _sceneHotspot5.setup(52, 119, 68, 204, 9700, 17, -1); - _sceneHotspot6.setup(0, 22, 56, 275, 9700, 18, -1); + _sceneHotspot1.setDetails(84, 218, 151, 278, 9700, 14, -1); + _sceneHotspot2.setDetails(89, 11, 151, 121, 9700, 14, -1); + _sceneHotspot3.setDetails(69, 119, 138, 216, 9700, 15, 16); + _sceneHotspot4.setDetails(34, 13, 88, 116, 9700, 17, -1); + _sceneHotspot5.setDetails(52, 119, 68, 204, 9700, 17, -1); + _sceneHotspot6.setDetails(0, 22, 56, 275, 9700, 18, -1); _object1.postInit(); _object1.hide(); - _globals->_player.postInit(); - if (!_globals->getFlag(97)) { - _globals->_player.disableControl(); + g_globals->_player.postInit(); + if (!g_globals->getFlag(97)) { + g_globals->_player.disableControl(); _sceneMode = 9701; - setAction(&_sequenceManager, this, 9701, &_globals->_player, &_object1, NULL); - _globals->setFlag(97); + setAction(&_sequenceManager, this, 9701, &g_globals->_player, &_object1, NULL); + g_globals->setFlag(97); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9702; - setAction(&_sequenceManager, this, 9702, &_globals->_player, &_object1, NULL); + setAction(&_sequenceManager, this, 9702, &g_globals->_player, &_object1, NULL); } } @@ -1309,10 +1312,10 @@ void Scene9700::postInit(SceneObjectList *OwnerList) { void Scene9750::signal() { switch (_sceneMode ++) { case 9751: - _globals->_soundHandler.fadeOut(this); + g_globals->_soundHandler.fadeOut(this); break; case 9752: - _globals->_sceneManager.changeScene(2100); + g_globals->_sceneManager.changeScene(2100); default: break; } @@ -1327,14 +1330,14 @@ void Scene9750::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(0, 100, 200, 100); - _globals->_player.postInit(); + g_globals->_player.postInit(); _object1.postInit(); _object1.hide(); _object2.postInit(); _object2.hide(); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9751; - setAction(&_sequenceManager, this, 9751, &_globals->_player, &_object1, &_object2, NULL); + setAction(&_sequenceManager, this, 9751, &g_globals->_player, &_object1, &_object2, NULL); } @@ -1369,19 +1372,19 @@ void Scene9850::Object7::doAction(int action) { // Hair covered tunic void Scene9850::Hotspot12::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene; if (action == CURSOR_USE) { if (RING_INVENTORY._tunic2._sceneNumber != 1) { RING_INVENTORY._tunic2._sceneNumber = 1; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 9858; - scene->setAction(&scene->_sequenceManager, scene, 9858, &_globals->_player, &scene->_objTunic2, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9858, &g_globals->_player, &scene->_objTunic2, NULL); } else { RING_INVENTORY._tunic2._sceneNumber = 9850; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 9861; - scene->setAction(&scene->_sequenceManager, scene, 9861, &_globals->_player, &scene->_objTunic2, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9861, &g_globals->_player, &scene->_objTunic2, NULL); } } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._tunic2._sceneNumber != 1)) { NamedHotspot::doAction(action); @@ -1391,19 +1394,19 @@ void Scene9850::Hotspot12::doAction(int action) { } void Scene9850::Hotspot14::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene; if (action == CURSOR_USE) { if (RING_INVENTORY._jacket._sceneNumber != 1) { RING_INVENTORY._jacket._sceneNumber = 1; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 9857; - scene->setAction(&scene->_sequenceManager, scene, 9857, &_globals->_player, &scene->_objJacket, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9857, &g_globals->_player, &scene->_objJacket, NULL); } else { RING_INVENTORY._jacket._sceneNumber = 9850; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 9860; - scene->setAction(&scene->_sequenceManager, scene, 9860, &_globals->_player, &scene->_objJacket, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9860, &g_globals->_player, &scene->_objJacket, NULL); } } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._jacket._sceneNumber != 1)) { NamedHotspot::doAction(action); @@ -1413,19 +1416,19 @@ void Scene9850::Hotspot14::doAction(int action) { } void Scene9850::Hotspot16::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene; if (action == CURSOR_USE) { if (RING_INVENTORY._cloak._sceneNumber != 1) { RING_INVENTORY._cloak._sceneNumber = 1; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 9862; - scene->setAction(&scene->_sequenceManager, scene, 9862, &_globals->_player, &scene->_objCloak, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9862, &g_globals->_player, &scene->_objCloak, NULL); } else { RING_INVENTORY._cloak._sceneNumber = 9850; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 9859; - scene->setAction(&scene->_sequenceManager, scene, 9859, &_globals->_player, &scene->_objCloak, NULL); + scene->setAction(&scene->_sequenceManager, scene, 9859, &g_globals->_player, &scene->_objCloak, NULL); } } else if ((action != CURSOR_LOOK) || (RING_INVENTORY._cloak._sceneNumber != 1)) { NamedHotspot::doAction(action); @@ -1435,7 +1438,7 @@ void Scene9850::Hotspot16::doAction(int action) { } void Scene9850::Hotspot17::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene; if (action == OBJECT_SCANNER) { SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); @@ -1447,7 +1450,7 @@ void Scene9850::Hotspot17::doAction(int action) { } void Scene9850::Hotspot18::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene; if (action == OBJECT_SCANNER) { SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); @@ -1459,7 +1462,7 @@ void Scene9850::Hotspot18::doAction(int action) { } void Scene9850::Hotspot19::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene; if (action == OBJECT_SCANNER) { SceneItem::display(9850, 31, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); @@ -1472,20 +1475,20 @@ void Scene9850::Hotspot19::doAction(int action) { // Arrow on Statue void Scene9850::Hotspot20::doAction(int action) { - Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene; + Scene9850 *scene = (Scene9850 *)g_globals->_sceneManager._scene; if (action == CURSOR_USE) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); if (scene->_objSword._state == 0) { if (RING_INVENTORY._scimitar._sceneNumber == 9850) scene->_objScimitar.show(); if (RING_INVENTORY._sword._sceneNumber == 9850) scene->_objSword.show(); scene->_sceneMode = 11; - setAction(&scene->_sequenceManager, scene, 9853, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL); + setAction(&scene->_sequenceManager, scene, 9853, &g_globals->_player, &scene->_objDoor, &scene->_objLever, NULL); } else { scene->_sceneMode = 10; - setAction(&scene->_sequenceManager, scene, 9854, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL); + setAction(&scene->_sequenceManager, scene, 9854, &g_globals->_player, &scene->_objDoor, &scene->_objLever, NULL); } scene->_objSword._state ^= 1; } else { @@ -1501,26 +1504,26 @@ void Scene9850::signal() { _objScimitar.hide(); if (RING_INVENTORY._sword._sceneNumber == 9850) _objSword.hide(); - _globals->_sceneItems.remove(&_objScimitar); - _globals->_sceneItems.remove(&_objSword); - _globals->_sceneItems.addItems(&_hotspot19, NULL); - _globals->_player.enableControl(); + g_globals->_sceneItems.remove(&_objScimitar); + g_globals->_sceneItems.remove(&_objSword); + g_globals->_sceneItems.addItems(&_hotspot19, NULL); + g_globals->_player.enableControl(); break; case 11: // Hidden closet opened if (RING_INVENTORY._scimitar._sceneNumber == 9850) - _globals->_sceneItems.addItems(&_objScimitar, NULL); + g_globals->_sceneItems.addItems(&_objScimitar, NULL); if (RING_INVENTORY._sword._sceneNumber == 9850) - _globals->_sceneItems.addItems(&_objSword, NULL); - _globals->_sceneItems.remove(&_hotspot19); - _globals->_player.enableControl(); + g_globals->_sceneItems.addItems(&_objSword, NULL); + g_globals->_sceneItems.remove(&_hotspot19); + g_globals->_player.enableControl(); break; case 9500: - _globals->_sceneManager.changeScene(_sceneMode - 1); + g_globals->_sceneManager.changeScene(_sceneMode - 1); break; case 0: default: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; } } @@ -1529,7 +1532,7 @@ void Scene9850::process(Event &event) { Scene::process(event); if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_4)) { event.handled = true; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); if (_objSword._state == 0) { _sceneMode = 0; setAction(&_sequenceManager, this, 9853, &_objLever, &_objDoor, &_objScimitar, &_objSword, NULL); @@ -1544,10 +1547,10 @@ void Scene9850::process(Event &event) { void Scene9850::dispatch() { if (_action) { _action->dispatch(); - } else if (_globals->_player._position.y >= 198) { - _globals->_player.disableControl(); + } else if (g_globals->_player._position.y >= 198) { + g_globals->_player.disableControl(); _sceneMode = 9500; - setAction(&_sequenceManager, this, 9852, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 9852, &g_globals->_player, NULL); } } @@ -1615,31 +1618,31 @@ void Scene9850::postInit(SceneObjectList *OwnerList) { _objSword.hide(); } - _spotLever.setup(30, 251, 45, 270, 9850, 26, -1); - _hotspot1.setup(123, 0, 200, 320, 9850, 0, 1); - _hotspot2.setup(107, 87, 133, 308, 9850, 0, 1); - _hotspot3.setup(2, 28, 53, 80, 9850, 2, 3); - _hotspot4.setup(13, 0, 55, 27, 9850, 2, 3); - _hotspot5.setup(8, 74, 27, 91, 9850, 4, 5); - _hotspot17.setup(61, 0, 125, 28, 9850, 6, 7); - _hotspot18.setup(51, 95, 105, 145, 9850, 6, 7); - _hotspot19.setup(56, 28, 115, 97, 9850, 6, 8); - _hotspot6.setup(0, 223, 115, 257, 9850, 9, 10); - _hotspot7.setup(15, 254, 33, 268, 9850, 9, -1); - _hotspot8.setup(17, 218, 37, 233, 9850, 9, 10); - _hotspot9.setup(8, 113, 26, 221, 9850, 11, 12); - _hotspot10.setup(14, 94, 53, 112, 9850, 13, 14); - _hotspot11.setup(5, 269, 29, 303, 9850, 15, 16); - _hotspot12.setup(43, 278, 91, 317, 9850, 17, 18); - _hotspot13.setup(47, 263, 112, 282, 9850, 19, 20); - _hotspot14.setup(43, 188, 86, 224, 9850, 21, 22); - _hotspot15.setup(43, 162, 92, 191, 9850, 23, 24); - _hotspot16.setup(40, 146, 90, 169, 9850, 25, -1); - - _globals->_player.postInit(); - _globals->_player.disableControl(); + _spotLever.setDetails(30, 251, 45, 270, 9850, 26, -1); + _hotspot1.setDetails(123, 0, 200, 320, 9850, 0, 1); + _hotspot2.setDetails(107, 87, 133, 308, 9850, 0, 1); + _hotspot3.setDetails(2, 28, 53, 80, 9850, 2, 3); + _hotspot4.setDetails(13, 0, 55, 27, 9850, 2, 3); + _hotspot5.setDetails(8, 74, 27, 91, 9850, 4, 5); + _hotspot17.setDetails(61, 0, 125, 28, 9850, 6, 7); + _hotspot18.setDetails(51, 95, 105, 145, 9850, 6, 7); + _hotspot19.setDetails(56, 28, 115, 97, 9850, 6, 8); + _hotspot6.setDetails(0, 223, 115, 257, 9850, 9, 10); + _hotspot7.setDetails(15, 254, 33, 268, 9850, 9, -1); + _hotspot8.setDetails(17, 218, 37, 233, 9850, 9, 10); + _hotspot9.setDetails(8, 113, 26, 221, 9850, 11, 12); + _hotspot10.setDetails(14, 94, 53, 112, 9850, 13, 14); + _hotspot11.setDetails(5, 269, 29, 303, 9850, 15, 16); + _hotspot12.setDetails(43, 278, 91, 317, 9850, 17, 18); + _hotspot13.setDetails(47, 263, 112, 282, 9850, 19, 20); + _hotspot14.setDetails(43, 188, 86, 224, 9850, 21, 22); + _hotspot15.setDetails(43, 162, 92, 191, 9850, 23, 24); + _hotspot16.setDetails(40, 146, 90, 169, 9850, 25, -1); + + g_globals->_player.postInit(); + g_globals->_player.disableControl(); _sceneMode = 0; - setAction(&_sequenceManager, this, 9851, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 9851, &g_globals->_player, NULL); } /*-------------------------------------------------------------------------- @@ -1650,7 +1653,7 @@ void Scene9900::strAction1::signal() { const byte mask1[3] = {0xff, 0xff, 0xff}; const byte mask2[3] = {0, 0, 0}; - Scene9900 *scene = (Scene9900 *)_globals->_sceneManager._scene; + Scene9900 *scene = (Scene9900 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1662,23 +1665,23 @@ void Scene9900::strAction1::signal() { _object9.fixPriority(250); _object9.setPosition(Common::Point(171, 59)); _object9.animate(ANIM_MODE_5, NULL); - _globals->_scenePalette.addRotation(67, 111, 1, 1, this); + g_globals->_scenePalette.addRotation(67, 111, 1, 1, this); scene->_object2.hide(); break; case 1: _palette1.getPalette(); - _globals->_scenePalette.addFader(&mask1[0], 1, 10, this); + g_globals->_scenePalette.addFader(&mask1[0], 1, 10, this); break; case 2: _object9.remove(); - _globals->_scenePalette.addFader(&mask2[0], 1, 5, this); + g_globals->_scenePalette.addFader(&mask2[0], 1, 5, this); break; case 3: - _globals->_soundHandler.play(377); + g_globals->_soundHandler.play(377); setDelay(120); break; case 4: - _globals->_scenePalette.addFader(_palette1._palette, 256, 1, this); + g_globals->_scenePalette.addFader(_palette1._palette, 256, 1, this); break; case 5: remove(); @@ -1700,7 +1703,7 @@ void Scene9900::strAction2::signal() { _var3 = 0; // No break on purpose case 1: { - Common::String msg = _resourceManager->getMessage(8030, _lineNum++); + Common::String msg = g_resourceManager->getMessage(8030, _lineNum++); if (msg.compareTo("LASTCREDIT")) { if (_var3) { // Not used? @@ -1738,7 +1741,7 @@ void Scene9900::strAction2::signal() { _txtArray2[_txtArray1Index]._fontNumber = 2; _txtArray2[_txtArray1Index]._color1 = 23; - msg = _resourceManager->getMessage(8030, _lineNum++); + msg = g_resourceManager->getMessage(8030, _lineNum++); _txtArray2[_txtArray1Index].setup(msg); _txtArray2[_txtArray1Index]._moveRate = 20; _txtArray2[_txtArray1Index]._moveDiff.y = 2; @@ -1746,7 +1749,8 @@ void Scene9900::strAction2::signal() { frameWidth = _txtArray2[_txtArray1Index].getFrame().getBounds().width(); _txtArray2[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200 + frameHeight)); } else { - _globals->_player.enableControl(); + // WORKAROUND: Fix inventory becoming available at end of credits + g_globals->_events.setCursor(CURSOR_WALK); _actionIndex = 3; signal(); } @@ -1801,21 +1805,21 @@ void Scene9900::strAction3::signal() { case 0: _palette2.getPalette(); _palette3.loadPalette(2003); - _globals->_scenePalette.addFader(_palette3._palette, 256, 5, this); + g_globals->_scenePalette.addFader(_palette3._palette, 256, 5, this); break; case 1: - _globals->_scenePalette.addFader(&mask3[0], 1, 10, this); + g_globals->_scenePalette.addFader(&mask3[0], 1, 10, this); break; case 2: - _globals->_scenePalette.addFader(&mask4[0], 1, 1, this); + g_globals->_scenePalette.addFader(&mask4[0], 1, 1, this); break; case 3: _palette2.loadPalette(17); - _globals->_sceneManager._scene->loadScene(17); - _globals->_scenePalette.addFader(_palette2._palette, 256, 5, this); + g_globals->_sceneManager._scene->loadScene(17); + g_globals->_scenePalette.addFader(_palette2._palette, 256, 5, this); break; case 4: - _globals->_game->endGame(9900, 61); + g_globals->_game->endGame(9900, 61); remove(); default: break; @@ -1855,40 +1859,40 @@ void Scene9900::signal() { switch (_sceneMode){ case 150: - _globals->_soundHandler.play(380); + g_globals->_soundHandler.play(380); _object8.postInit(); _object8.setVisage(2002); _object8.setStrip(1); _object8.setFrame(1); _object8.fixPriority(200); _object8.setPosition(Common::Point(64, 199)); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9908; setAction(&_sequenceManager, this, 9908, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 162: warning("TBC: shutdown();"); - _globals->_game->quitGame(); + g_globals->_game->quitGame(); break; case 9901: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9906; setAction(&_sequenceManager, this, 9906, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_player._uiEnabled = true; + g_globals->_events.setCursor(CURSOR_USE); break; case 9902: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9901; setAction(&_sequenceManager, this, 9901, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 9903: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9902; setAction(&_sequenceManager, this, 9902, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 9904: - _globals->_soundHandler.play(390); + g_globals->_soundHandler.play(390); _sceneMode = 9912; setAction(&_strAction2, this); break; @@ -1898,50 +1902,50 @@ void Scene9900::signal() { break; case 9906: if (_object8._state == 0) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9913; setAction(&_sequenceManager, this, 9913, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9905; setAction(&_sequenceManager, this, 9905, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); } break; case 9907: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9903; setAction(&_sequenceManager, this, 9903, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 9908: _object8.remove(); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9904; setAction(&_sequenceManager, this, 9904, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 9909: - _globals->_soundHandler.play(375); - _globals->_player.disableControl(); + g_globals->_soundHandler.play(375); + g_globals->_player.disableControl(); _sceneMode = 9907; setAction(&_sequenceManager, this, 9907, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 9910: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9911; setAction(&_sequenceManager, this, 9911, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 9911: - _globals->_soundHandler.play(367); - _globals->_player.disableControl(); + g_globals->_soundHandler.play(367); + g_globals->_player.disableControl(); _sceneMode = 9909; setAction(&_sequenceManager, this, 9909, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 9912: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9912; setAction(&_sequenceManager, this, 9912, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); _sceneMode = 162; - _globals->_player.enableControl(); - _globals->_player._canWalk = false; + g_globals->_player.enableControl(); + g_globals->_player._canWalk = false; break; case 9913: _sceneMode = 200; @@ -1957,10 +1961,10 @@ void Scene9900::process(Event &event) { return; Scene::process(event); if (_sceneMode == 9906) { - if ((event.eventType == EVENT_BUTTON_DOWN) && (_globals->_events.getCursor() == OBJECT_ITEMS)) { + if ((event.eventType == EVENT_BUTTON_DOWN) && (g_globals->_events.getCursor() == OBJECT_ITEMS)) { _object8._state = 1; RING_INVENTORY._items._sceneNumber = 9900; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); } } } @@ -1992,7 +1996,7 @@ void Scene9900::postInit(SceneObjectList *OwnerList) { RING_INVENTORY._items._description = Common::String("One of the items from the stasis ship. The other is on the Lance's bridge."); _stripManager.addSpeaker(&_speakerMR); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 9910; setAction(&_sequenceManager, this, 9910, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); } @@ -2008,7 +2012,7 @@ void Scene9999::Action1::signal() { setDelay(600); break; case 1: - _globals->_sceneManager.changeScene(3500); + g_globals->_sceneManager.changeScene(3500); break; default: break; @@ -2027,8 +2031,8 @@ void Scene9999::Action2::signal() { setDelay(300); break; case 2: - _globals->_stripNum = 3600; - _globals->_sceneManager.changeScene(3600); + g_globals->_stripNum = 3600; + g_globals->_sceneManager.changeScene(3600); default: break; } @@ -2044,14 +2048,14 @@ void Scene9999::postInit(SceneObjectList *OwnerList) { _object1.setStrip2(3); _object1.setPosition(Common::Point(160, 152)); - _globals->_player.postInit(); - _globals->_player.setVisage(1303); - _globals->_player.setStrip2(1); - _globals->_player.fixPriority(250); - _globals->_player.animate(ANIM_MODE_2, NULL); - _globals->_player.setPosition(Common::Point(194, 98)); - _globals->_player._numFrames = 20; - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(1303); + g_globals->_player.setStrip2(1); + g_globals->_player.fixPriority(250); + g_globals->_player.animate(ANIM_MODE_2, NULL); + g_globals->_player.setPosition(Common::Point(194, 98)); + g_globals->_player._numFrames = 20; + g_globals->_player.disableControl(); _object2.postInit(); _object2.setVisage(1303); @@ -2067,22 +2071,24 @@ void Scene9999::postInit(SceneObjectList *OwnerList) { _object3.setPosition(Common::Point(292, 149)); _object3.setAction(&_action3); - if (_globals->_sceneManager._previousScene == 3500) + if (g_globals->_sceneManager._previousScene == 3500) setAction(&_action2); else setAction(&_action1); - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position.x, g_globals->_player._position.y); + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - if (_globals->_sceneManager._previousScene == 3500) - _globals->_stripNum = 2222; + if (g_globals->_sceneManager._previousScene == 3500) + g_globals->_stripNum = 2222; else - _globals->_stripNum = 2121; + g_globals->_stripNum = 2121; - _globals->_soundHandler.play(118); + g_globals->_soundHandler.play(118); } -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld_scenes10.h b/engines/tsage/ringworld/ringworld_scenes10.h index 33b16d0014..0193d5af63 100644 --- a/engines/tsage/ringworld_scenes10.h +++ b/engines/tsage/ringworld/ringworld_scenes10.h @@ -24,13 +24,18 @@ #define TSAGE_RINGWORLD_SCENES10_H #include "common/scummsys.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/ringworld/ringworld_speakers.h" #include "tsage/events.h" #include "tsage/core.h" #include "tsage/scenes.h" #include "tsage/globals.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { + +using namespace TsAGE; class SceneObject9150 : public SceneObject { public: @@ -75,12 +80,12 @@ public: SceneObject _object4; SceneObject _object5; SceneObject _object6; - SceneHotspot1 _sceneHotspot1; - NamedHotspot _sceneHotspot2; - NamedHotspot _sceneHotspot3; - NamedHotspot _sceneHotspot4; - NamedHotspot _sceneHotspot5; - NamedHotspot _sceneHotspot6; + SceneHotspot1 _hotspotSlave; + NamedHotspot _hotspotSoiledClothes; + NamedHotspot _hotspotCleanedClothes; + NamedHotspot _hotspotIsland; + NamedHotspot _hotspotBoulders; + NamedHotspot _hotspotTrees; virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void signal(); @@ -526,7 +531,8 @@ public: virtual void postInit(SceneObjectList *OwnerList = NULL); }; +} // End of namespace Ringworld -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld_scenes2.cpp b/engines/tsage/ringworld/ringworld_scenes2.cpp index 0154123c3d..e07c9253e6 100644 --- a/engines/tsage/ringworld_scenes2.cpp +++ b/engines/tsage/ringworld/ringworld_scenes2.cpp @@ -21,12 +21,14 @@ */ #include "common/config-manager.h" -#include "tsage/ringworld_scenes2.h" +#include "tsage/ringworld/ringworld_scenes2.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { /*-------------------------------------------------------------------------- * Scene 1000 - Title Screen @@ -34,11 +36,11 @@ namespace tSage { *--------------------------------------------------------------------------*/ void Scene1000::Action1::signal() { - Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene; + Scene1000 *scene = (Scene1000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(10); break; case 1: @@ -61,7 +63,7 @@ void Scene1000::Action1::signal() { break; } case 3: - _globals->_sceneManager.changeScene(1400); + g_globals->_sceneManager.changeScene(1400); break; } @@ -70,7 +72,7 @@ void Scene1000::Action1::signal() { void Scene1000::Action2::signal() { switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(10); break; case 1: @@ -80,7 +82,7 @@ void Scene1000::Action2::signal() { break; case 2: SceneItem::display(0, 0); - _globals->_sceneManager.changeScene(2000); + g_globals->_sceneManager.changeScene(2000); break; default: break; @@ -88,11 +90,11 @@ void Scene1000::Action2::signal() { } void Scene1000::Action3::signal() { - Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene; + Scene1000 *scene = (Scene1000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_sceneManager._scene->loadBackground(0, 0); + g_globals->_sceneManager._scene->loadBackground(0, 0); setDelay(60); break; case 1: { @@ -106,11 +108,11 @@ void Scene1000::Action3::signal() { setDelay(60); break; case 4: - _globals->_player.show(); + g_globals->_player.show(); setDelay(240); break; case 5: { - _globals->_player.enableControl(); + g_globals->_player.enableControl(); const char *SEEN_INTRO = "seen_intro"; if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) { @@ -121,31 +123,31 @@ void Scene1000::Action3::signal() { setDelay(1); } 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) { _actionIndex = 20; - _globals->_soundHandler.fadeOut(this); + g_globals->_soundHandler.fadeOut(this); } else { setDelay(1); } } - _globals->_player.disableControl(); + g_globals->_player.disableControl(); break; } case 6: { scene->_object3.remove(); - _globals->_player.setStrip2(2); + g_globals->_player.setStrip2(2); NpcMover *mover = new NpcMover(); Common::Point pt(480, 100); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 7: - _globals->_scenePalette.loadPalette(1002); - _globals->_scenePalette.refresh(); - _globals->_scenePalette.addRotation(80, 95, -1); + g_globals->_scenePalette.loadPalette(1002); + g_globals->_scenePalette.refresh(); + g_globals->_scenePalette.addRotation(80, 95, -1); scene->_object3.postInit(); scene->_object3.setVisage(1002); scene->_object3.setStrip(1); @@ -214,14 +216,14 @@ void Scene1000::Action3::signal() { break; case 18: zoom(false); - _globals->_scenePalette.clearListeners(); - _globals->_soundHandler.fadeOut(this); + g_globals->_scenePalette.clearListeners(); + g_globals->_soundHandler.fadeOut(this); break; case 19: - _globals->_sceneManager.changeScene(10); + g_globals->_sceneManager.changeScene(10); break; case 20: - _globals->_sceneManager.changeScene(30); + g_globals->_sceneManager.changeScene(30); break; default: break; @@ -229,19 +231,19 @@ void Scene1000::Action3::signal() { } void Scene1000::Action3::zoom(bool up) { - Scene1000 *scene = (Scene1000 *)_globals->_sceneManager._scene; + Scene1000 *scene = (Scene1000 *)g_globals->_sceneManager._scene; if (up) { - while ((scene->_object3._percent < 100) && !_vm->shouldQuit()) { + while ((scene->_object3._percent < 100) && !g_vm->shouldQuit()) { scene->_object3.changeZoom(MIN(scene->_object3._percent + 5, 100)); - _globals->_sceneObjects->draw(); - _globals->_events.delay(1); + g_globals->_sceneObjects->draw(); + g_globals->_events.delay(1); } } else { - while ((scene->_object3._percent > 0) && !_vm->shouldQuit()) { + while ((scene->_object3._percent > 0) && !g_vm->shouldQuit()) { scene->_object3.changeZoom(MAX(scene->_object3._percent - 5, 0)); - _globals->_sceneObjects->draw(); - _globals->_events.delay(1); + g_globals->_sceneObjects->draw(); + g_globals->_events.delay(1); } } } @@ -253,7 +255,7 @@ void Scene1000::postInit(SceneObjectList *OwnerList) { setZoomPercents(0, 100, 200, 100); loadScene(1000); - if (_globals->_sceneManager._previousScene == 2000) { + if (g_globals->_sceneManager._previousScene == 2000) { setZoomPercents(150, 10, 180, 100); _object1.postInit(); _object1.setVisage(1001); @@ -264,12 +266,12 @@ void Scene1000::postInit(SceneObjectList *OwnerList) { setAction(&_action2); - _globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y); + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - _globals->_soundHandler.play(114); - } else if (_globals->_sceneManager._previousScene == 2222) { + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_soundHandler.play(114); + } else if (g_globals->_sceneManager._previousScene == 2222) { setZoomPercents(150, 10, 180, 100); _object1.postInit(); _object1.setVisage(1001); @@ -278,28 +280,28 @@ void Scene1000::postInit(SceneObjectList *OwnerList) { _object1._moveDiff = Common::Point(2, 2); _object1.setPosition(Common::Point(120, 180)); - _globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y); + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; setAction(&_action1); } else { - _globals->_soundHandler.play(4); + g_globals->_soundHandler.play(4); setZoomPercents(0, 10, 30, 100); _object3.postInit(); _object3.setVisage(1050); _object3.changeZoom(-1); _object3.setPosition(Common::Point(158, 0)); - _globals->_player.postInit(); - _globals->_player.setVisage(1050); - _globals->_player.setStrip(3); - _globals->_player.setPosition(Common::Point(160, 191)); - _globals->_player._moveDiff.x = 12; - _globals->_player.hide(); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(1050); + g_globals->_player.setStrip(3); + g_globals->_player.setPosition(Common::Point(160, 191)); + g_globals->_player._moveDiff.x = 12; + g_globals->_player.hide(); + g_globals->_player.disableControl(); - _globals->_sceneManager._scene->_sceneBounds.center(_object3._position.x, _object3._position.y); + g_globals->_sceneManager._scene->_sceneBounds.center(_object3._position.x, _object3._position.y); setAction(&_action3); } @@ -311,7 +313,7 @@ void Scene1000::postInit(SceneObjectList *OwnerList) { *--------------------------------------------------------------------------*/ void Scene1001::Action1::signal() { - Scene1001 *scene = (Scene1001 *)_globals->_sceneManager._scene; + Scene1001 *scene = (Scene1001 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -476,9 +478,9 @@ void Scene1001::Action1::signal() { setDelay(30); break; case 19: { - _globals->_soundHandler.play(91); + g_globals->_soundHandler.play(91); byte adjustData[4] = {0xff, 0xff, 0xff, 0}; - _globals->_scenePalette.fade(adjustData, false, 0); + g_globals->_scenePalette.fade(adjustData, false, 0); scene->_object1._strip = 7; scene->_object1._frame = 1; @@ -488,8 +490,8 @@ void Scene1001::Action1::signal() { break; } case 20: - _globals->_scenePalette.loadPalette(16); - _globals->_scenePalette.refresh(); + g_globals->_scenePalette.loadPalette(16); + g_globals->_scenePalette.refresh(); setDelay(6); break; case 21: @@ -497,14 +499,14 @@ void Scene1001::Action1::signal() { scene->_object1.animate(ANIM_MODE_5, this); break; case 22: - _globals->_soundHandler.play(92); + g_globals->_soundHandler.play(92); scene->_stripManager.start(111, this); break; case 23: setDelay(60); break; case 24: - _globals->_sceneManager.changeScene(2000); + g_globals->_sceneManager.changeScene(2000); break; } } @@ -527,7 +529,7 @@ void Scene1001::postInit(SceneObjectList *OwnerList) { _object3.setStrip2(4); _object3.setPosition(Common::Point(61, 177)); - _globals->_soundHandler.play(85); + g_globals->_soundHandler.play(85); setAction(&_action1); } @@ -538,11 +540,11 @@ void Scene1001::postInit(SceneObjectList *OwnerList) { *--------------------------------------------------------------------------*/ void Scene1250::Action1::signal() { - Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; + Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(120) + 60); + setDelay(g_globals->_randomSource.getRandomNumber(120) + 60); break; case 1: scene->_object1.animate(ANIM_MODE_5, this); @@ -552,11 +554,11 @@ void Scene1250::Action1::signal() { } void Scene1250::Action2::signal() { - Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; + Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - switch (_globals->_randomSource.getRandomNumber(2)) { + switch (g_globals->_randomSource.getRandomNumber(2)) { case 0: scene->_object2.setPosition(Common::Point(163, 75)); break; @@ -578,7 +580,7 @@ void Scene1250::Action2::signal() { } void Scene1250::Action3::signal() { - Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; + Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -591,13 +593,13 @@ void Scene1250::Action3::signal() { setDelay(6); break; case 3: - _globals->_sceneManager.changeScene(1000); + g_globals->_sceneManager.changeScene(1000); break; } } void Scene1250::Action4::signal() { - Scene1250 *scene = (Scene1250 *)_globals->_sceneManager._scene; + Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -610,7 +612,7 @@ void Scene1250::Action4::signal() { setDelay(6); break; case 3: - _globals->_sceneManager.changeScene(2000); + g_globals->_sceneManager.changeScene(2000); break; } } @@ -641,14 +643,14 @@ void Scene1250::postInit(SceneObjectList *OwnerList) { _object2._frame = 1; _object2.setAction(&_action2); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - if ((_globals->_sceneManager._previousScene != 2000) || (_globals->_stripNum != 1250)) { + if ((g_globals->_sceneManager._previousScene != 2000) || (g_globals->_stripNum != 1250)) { setAction(&_action4); } else { setAction(&_action3); - _globals->_soundHandler.play(114); + g_globals->_soundHandler.play(114); } } @@ -658,7 +660,7 @@ void Scene1250::postInit(SceneObjectList *OwnerList) { *--------------------------------------------------------------------------*/ void Scene1400::Action1::signal() { - Scene1400 *scene = (Scene1400 *)_globals->_sceneManager._scene; + Scene1400 *scene = (Scene1400 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -669,23 +671,23 @@ void Scene1400::Action1::signal() { Common::Point pt(160, 700); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: { - _globals->_player.setStrip2(3); - _globals->_player.changeZoom(100); + g_globals->_player.setStrip2(3); + g_globals->_player.changeZoom(100); Common::Point pt(160, 100); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); SceneItem::display(0, 0); setDelay(360); break; } case 3: - SceneItem::display(1400, 2, SET_X, 60, SET_Y, _globals->_sceneManager._scene->_sceneBounds.bottom - 80, + SceneItem::display(1400, 2, SET_X, 60, SET_Y, g_globals->_sceneManager._scene->_sceneBounds.bottom - 80, SET_FONT, 2, SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END); setDelay(420); break; @@ -694,7 +696,7 @@ void Scene1400::Action1::signal() { setDelay(360); break; case 5: - SceneItem::display(1400, 3, SET_X, 60, SET_Y, _globals->_sceneManager._scene->_sceneBounds.bottom - 80, + SceneItem::display(1400, 3, SET_X, 60, SET_Y, g_globals->_sceneManager._scene->_sceneBounds.bottom - 80, SET_FONT, 2, SET_FG_COLOR, 23, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END); setDelay(360); break; @@ -702,25 +704,25 @@ void Scene1400::Action1::signal() { SceneItem::display(0, 0); break; case 7: { - _globals->_player._frame = 1; - _globals->_player.setStrip2(1); - _globals->_player._numFrames = 5; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player._frame = 1; + g_globals->_player.setStrip2(1); + g_globals->_player._numFrames = 5; + g_globals->_player.animate(ANIM_MODE_5, this); Common::Point pt(205, 70); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, NULL); - _globals->_sceneManager._fadeMode = FADEMODE_NONE; + g_globals->_player.addMover(mover, &pt, NULL); + g_globals->_sceneManager._fadeMode = FADEMODE_NONE; scene->loadScene(1402); break; } case 8: - _globals->_player.setStrip2(2); - _globals->_player._numFrames = 10; - _globals->_player.animate(ANIM_MODE_2, NULL); + g_globals->_player.setStrip2(2); + g_globals->_player._numFrames = 10; + g_globals->_player.animate(ANIM_MODE_2, NULL); - SceneItem::display(1400, 4, SET_X, 30, SET_Y, _globals->_player._position.y + 10, SET_FONT, 2, + SceneItem::display(1400, 4, SET_X, 30, SET_Y, g_globals->_player._position.y + 10, SET_FONT, 2, SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END); setDelay(300); break; @@ -728,16 +730,16 @@ void Scene1400::Action1::signal() { SceneItem::display(0, 0); Common::Point pt(450, 45); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 10: - _globals->_sceneManager._scrollerRect = Rect(40, 20, 280, 180); - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_stripNum = 1500; - _globals->_soundHandler.stop(); + g_globals->_sceneManager._scrollerRect = Rect(40, 20, 280, 180); + g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + g_globals->_stripNum = 1500; + g_globals->_soundHandler.stop(); - _globals->_sceneManager.changeScene(1500); + g_globals->_sceneManager.changeScene(1500); break; } } @@ -746,41 +748,41 @@ void Scene1400::Action1::dispatch() { Action::dispatch(); if ((_actionIndex > 3) && (_actionIndex < 9)) - _globals->_sceneText.setPosition(Common::Point(60, _globals->_sceneManager._scene->_sceneBounds.bottom - 80)); + g_globals->_sceneText.setPosition(Common::Point(60, g_globals->_sceneManager._scene->_sceneBounds.bottom - 80)); - if ((_actionIndex <= 2) && (_globals->_player._percent > 22)) - _globals->_player.changeZoom(100 - (800 - _globals->_player._position.y)); + if ((_actionIndex <= 2) && (g_globals->_player._percent > 22)) + g_globals->_player.changeZoom(100 - (800 - g_globals->_player._position.y)); - if ((_actionIndex >= 9) && (_globals->_player._percent > 22)) - _globals->_player.changeZoom(100 - (_globals->_player._position.x - 205)); + if ((_actionIndex >= 9) && (g_globals->_player._percent > 22)) + g_globals->_player.changeZoom(100 - (g_globals->_player._position.x - 205)); } /*--------------------------------------------------------------------------*/ void Scene1400::postInit(SceneObjectList *OwnerList) { - if (_globals->_stripNum != 1400) { + if (g_globals->_stripNum != 1400) { loadScene(1401); } else { loadScene(1402); } Scene::postInit(); - _globals->_sceneManager._scrollerRect = Rect(40, 90, 280, 180); - _globals->_player.postInit(); - _globals->_player.setVisage(1401); - _globals->_player.animate(ANIM_MODE_2, 0); - _globals->_player.setStrip2(4); - _globals->_player.fixPriority(4); - _globals->_player.disableControl(); + g_globals->_sceneManager._scrollerRect = Rect(40, 90, 280, 180); + g_globals->_player.postInit(); + g_globals->_player.setVisage(1401); + g_globals->_player.animate(ANIM_MODE_2, 0); + g_globals->_player.setStrip2(4); + g_globals->_player.fixPriority(4); + g_globals->_player.disableControl(); - _globals->_player._moveDiff = Common::Point(4, 2); - _globals->_player.setPosition(Common::Point(160, 800)); - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.y = (_globals->_sceneManager._scene->_sceneBounds.top / 100) * 100; + g_globals->_player._moveDiff = Common::Point(4, 2); + g_globals->_player.setPosition(Common::Point(160, 800)); + g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position); + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.y = (g_globals->_sceneManager._scene->_sceneBounds.top / 100) * 100; setAction(&_action1); - _globals->_soundHandler.play(118); + g_globals->_soundHandler.play(118); } /*-------------------------------------------------------------------------- @@ -789,7 +791,7 @@ void Scene1400::postInit(SceneObjectList *OwnerList) { *--------------------------------------------------------------------------*/ void Scene1500::Action1::signal() { - Scene1500 *scene = (Scene1500 *)_globals->_sceneManager._scene; + Scene1500 *scene = (Scene1500 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { @@ -854,17 +856,17 @@ void Scene1500::Action1::signal() { scene->_soundHandler.play(124, this); break; case 8: - _globals->_soundHandler.play(126, this); + g_globals->_soundHandler.play(126, this); break; case 9: - _globals->_soundHandler.play(127); - _globals->_sceneManager.changeScene(2000); + g_globals->_soundHandler.play(127); + g_globals->_sceneManager.changeScene(2000); break; } } void Scene1500::Action2::signal() { - Scene1500 *scene = (Scene1500 *)_globals->_sceneManager._scene; + Scene1500 *scene = (Scene1500 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -895,8 +897,8 @@ void Scene1500::Action2::signal() { } case 3: scene->_soundHandler.release(); - _globals->_stripNum = 1505; - _globals->_sceneManager.changeScene(2400); + g_globals->_stripNum = 1505; + g_globals->_sceneManager.changeScene(2400); break; } } @@ -907,8 +909,8 @@ void Scene1500::postInit(SceneObjectList *OwnerList) { loadScene(1500); Scene::postInit(); - if ((_globals->_stripNum == 1500) || ((_globals->_stripNum != 1504) && (_globals->_stripNum != 2751))) { - _globals->_soundHandler.play(120); + if ((g_globals->_stripNum == 1500) || ((g_globals->_stripNum != 1504) && (g_globals->_stripNum != 2751))) { + g_globals->_soundHandler.play(120); setZoomPercents(105, 20, 145, 100); setAction(&_action1); @@ -925,4 +927,6 @@ void Scene1500::postInit(SceneObjectList *OwnerList) { } } -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld_scenes2.h b/engines/tsage/ringworld/ringworld_scenes2.h index 93a8f04fd4..382d9d4157 100644 --- a/engines/tsage/ringworld_scenes2.h +++ b/engines/tsage/ringworld/ringworld_scenes2.h @@ -24,13 +24,18 @@ #define TSAGE_RINGWORLD_SCENES2_H #include "common/scummsys.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/ringworld/ringworld_speakers.h" #include "tsage/events.h" #include "tsage/core.h" #include "tsage/scenes.h" #include "tsage/globals.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { + +using namespace TsAGE; class Scene1000 : public Scene { /* Actions */ @@ -142,8 +147,8 @@ public: virtual void postInit(SceneObjectList *OwnerList = NULL); }; +} // End of namespace Ringworld - -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld/ringworld_scenes3.cpp index 824a96a18b..81190aea7b 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld/ringworld_scenes3.cpp @@ -21,12 +21,14 @@ */ #include "common/config-manager.h" -#include "tsage/ringworld_scenes3.h" +#include "tsage/ringworld/ringworld_scenes3.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { /*-------------------------------------------------------------------------- * Scene 2000 - Cockpit cutscenes @@ -34,7 +36,7 @@ namespace tSage { *--------------------------------------------------------------------------*/ void Scene2000::Action1::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -47,82 +49,82 @@ void Scene2000::Action1::signal() { setDelay(4); break; case 3: - _globals->_stripNum = 0; - _globals->_sceneManager.changeScene(1250); + g_globals->_stripNum = 0; + g_globals->_sceneManager.changeScene(1250); break; } } void Scene2000::Action2::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: scene->_object2.animate(ANIM_MODE_6, NULL); - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + setDelay(g_globals->_randomSource.getRandomNumber(179) + 60); break; case 1: - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); - if (_globals->_randomSource.getRandomNumber(4) >= 2) + setDelay(g_globals->_randomSource.getRandomNumber(179) + 60); + if (g_globals->_randomSource.getRandomNumber(4) >= 2) _actionIndex = 0; break; case 2: - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); - _actionIndex = _globals->_randomSource.getRandomNumber(1); + setDelay(g_globals->_randomSource.getRandomNumber(179) + 60); + _actionIndex = g_globals->_randomSource.getRandomNumber(1); break; } } void Scene2000::Action3::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: scene->_object6.animate(ANIM_MODE_5, NULL); - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + setDelay(g_globals->_randomSource.getRandomNumber(179) + 60); break; case 1: scene->_object6.animate(ANIM_MODE_6, NULL); - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + setDelay(g_globals->_randomSource.getRandomNumber(179) + 60); _actionIndex = 0; break; } } void Scene2000::Action4::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: scene->_object4.animate(ANIM_MODE_5, NULL); - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + setDelay(g_globals->_randomSource.getRandomNumber(179) + 60); break; case 1: scene->_object4.animate(ANIM_MODE_6, NULL); - setDelay(_globals->_randomSource.getRandomNumber(179) + 60); + setDelay(g_globals->_randomSource.getRandomNumber(179) + 60); _actionIndex = 0; break; } } void Scene2000::Action5::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: scene->_object3.animate(ANIM_MODE_5, NULL); - setDelay(_globals->_randomSource.getRandomNumber(125) + 300); + setDelay(g_globals->_randomSource.getRandomNumber(125) + 300); break; case 1: scene->_object3.animate(ANIM_MODE_6, NULL); - setDelay(_globals->_randomSource.getRandomNumber(125) + 300); + setDelay(g_globals->_randomSource.getRandomNumber(125) + 300); _actionIndex = 0; break; } } void Scene2000::Action6::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -133,7 +135,7 @@ void Scene2000::Action6::signal() { scene->_stripManager.start(2000, this); break; case 2: - _globals->_soundHandler.play(81); + g_globals->_soundHandler.play(81); scene->_object6.postInit(); scene->_object6.setVisage(2003); scene->_object6.setAction(NULL); @@ -148,15 +150,15 @@ void Scene2000::Action6::signal() { scene->_object6.animate(ANIM_MODE_6, this); break; case 5: - _globals->_soundHandler.play(80); + g_globals->_soundHandler.play(80); scene->_object6.remove(); - _globals->_sceneManager.changeScene(1001); + g_globals->_sceneManager.changeScene(1001); break; } } void Scene2000::Action7::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -169,13 +171,13 @@ void Scene2000::Action7::signal() { setDelay(3); break; case 3: - _globals->_sceneManager.changeScene(2222); + g_globals->_sceneManager.changeScene(2222); break; } } void Scene2000::Action8::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -188,14 +190,14 @@ void Scene2000::Action8::signal() { setDelay(10); break; case 3: - _globals->_stripNum = 2005; - _globals->_sceneManager.changeScene(1000); + g_globals->_stripNum = 2005; + g_globals->_sceneManager.changeScene(1000); break; } } void Scene2000::Action9::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -208,8 +210,8 @@ void Scene2000::Action9::signal() { setDelay(3); break; case 3: - _globals->_stripNum = 2008; - _globals->_sceneManager.changeScene(9999); + g_globals->_stripNum = 2008; + g_globals->_sceneManager.changeScene(9999); break; } } @@ -228,14 +230,14 @@ void Scene2000::Action10::signal() { break; case 3: SceneItem::display(0, 0); - _globals->_stripNum = 0; - _globals->_sceneManager.changeScene(9999); + g_globals->_stripNum = 0; + g_globals->_sceneManager.changeScene(9999); break; } } void Scene2000::Action11::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -248,35 +250,35 @@ void Scene2000::Action11::signal() { scene->_stripManager.start(2077, this); break; case 3: - _globals->_stripNum = 0; - _globals->_sceneManager.changeScene(1400); + g_globals->_stripNum = 0; + g_globals->_sceneManager.changeScene(1400); break; } } void Scene2000::Action12::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(60); break; case 1: - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(2020, this); break; case 2: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(10); break; case 3: - _globals->_sceneManager.changeScene(2300); + g_globals->_sceneManager.changeScene(2300); break; } } void Scene2000::Action13::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -287,18 +289,18 @@ void Scene2000::Action13::signal() { break; case 2: SceneItem::display(0, 0); - _globals->_stripNum = 2751; - _globals->_sceneManager.changeScene(1500); + g_globals->_stripNum = 2751; + g_globals->_sceneManager.changeScene(1500); break; } } void Scene2000::Action14::signal() { - Scene2000 *scene = (Scene2000 *)_globals->_sceneManager._scene; + Scene2000 *scene = (Scene2000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(30); break; case 1: @@ -308,12 +310,12 @@ void Scene2000::Action14::signal() { setDelay(60); break; case 3: - _globals->_soundHandler.play(99); + g_globals->_soundHandler.play(99); scene->_object8.show(); scene->_object8.animate(ANIM_MODE_5, this); break; case 4: - _globals->_soundHandler.play(12); + g_globals->_soundHandler.play(12); scene->_object8.setStrip(2); scene->_object8.setFrame(1); scene->_object9.show(); @@ -324,7 +326,7 @@ void Scene2000::Action14::signal() { scene->_stripManager.start(2001, this, scene); break; case 6: - _globals->_soundHandler.fadeOut(0/* was false */); + g_globals->_soundHandler.fadeOut(NULL); scene->_object8.setStrip(1); scene->_object8.setFrame(scene->_object8.getFrameCount()); scene->_object8.animate(ANIM_MODE_6, this); @@ -333,7 +335,7 @@ void Scene2000::Action14::signal() { scene->_object10.remove(); break; case 7: - _globals->_soundHandler.play(111); + g_globals->_soundHandler.play(111); scene->_object8.remove(); setDelay(5); break; @@ -341,8 +343,8 @@ void Scene2000::Action14::signal() { scene->_stripManager.start(2071, this); break; case 9: - _globals->_stripNum = 1250; - _globals->_sceneManager.changeScene(1000); + g_globals->_stripNum = 1250; + g_globals->_sceneManager.changeScene(1000); break; } } @@ -384,7 +386,7 @@ void Scene2000::postInit(SceneObjectList *OwnerList) { _object2.setPosition(Common::Point(43, 115)); _object2.setAction(&_action2); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _object6.postInit(); _object6.setVisage(2003); @@ -413,7 +415,7 @@ void Scene2000::postInit(SceneObjectList *OwnerList) { _object10.fixPriority(195); _object10.hide(); - switch (_globals->_sceneManager._previousScene) { + switch (g_globals->_sceneManager._previousScene) { case 1000: setAction(&_action7); break; @@ -425,11 +427,11 @@ void Scene2000::postInit(SceneObjectList *OwnerList) { setAction(&_action13); break; case 2200: - _globals->_soundHandler.play(111); + g_globals->_soundHandler.play(111); setAction(&_action14); break; case 2222: - _globals->_soundHandler.play(115); + g_globals->_soundHandler.play(115); setAction(&_action8); break; case 3500: @@ -437,28 +439,28 @@ void Scene2000::postInit(SceneObjectList *OwnerList) { break; default: _object6.remove(); - _globals->_soundHandler.play(80); + g_globals->_soundHandler.play(80); setAction(&_action6); break; } _soundHandler1.play(78); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; } void Scene2000::stripCallback(int v) { switch (v) { case 0: _object9.setStrip(3); - _object9.animate(ANIM_MODE_7, NULL); + _object9.animate(ANIM_MODE_7, 0, NULL); _object10.setStrip(6); _object10.setFrame(1); _object10.animate(ANIM_MODE_5, NULL); break; case 1: _object10.setStrip(5); - _object10.animate(ANIM_MODE_7, NULL); + _object10.animate(ANIM_MODE_7, 0, NULL); _object9.setStrip(4); _object9.setFrame(1); _object9.animate(ANIM_MODE_5, NULL); @@ -483,22 +485,22 @@ void Scene2000::stripCallback(int v) { *--------------------------------------------------------------------------*/ void Scene2100::Action1::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); if (!scene->_sitFl) setDelay(1); else { - setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 2102, &g_globals->_player, NULL); scene->_sitFl = 0; } break; case 1: { Common::Point pt(157, 62); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: @@ -508,15 +510,15 @@ void Scene2100::Action1::signal() { case 3: { Common::Point pt(157, 56); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 4: - _globals->_player._strip = 3; + g_globals->_player._strip = 3; setDelay(3); break; case 5: - _globals->_player.fixPriority(1); + g_globals->_player.fixPriority(1); scene->_area1.display(); scene->_area2.display(); scene->_area3.display(); @@ -524,12 +526,12 @@ void Scene2100::Action1::signal() { scene->_area1.draw(true); _state = 0; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); - while (!_state && !_vm->getEventManager()->shouldQuit()) { + while (!_state && !g_vm->shouldQuit()) { // Wait for an event Event event; - if (!_globals->_events.getEvent(event)) { + if (!g_globals->_events.getEvent(event)) { g_system->updateScreen(); g_system->delayMillis(10); continue; @@ -568,37 +570,37 @@ void Scene2100::Action1::signal() { if (_state == 2100) { Common::Point pt(157, 65); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } else { - _globals->_sceneManager.changeScene(_state); + g_globals->_sceneManager.changeScene(_state); } break; case 7: - _globals->_player.fixPriority(-1); + g_globals->_player.fixPriority(-1); scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, this); break; case 8: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene2100::Action2::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: scene->_object3._numFrames = 5; - setDelay(_globals->_randomSource.getRandomNumber(59)); + setDelay(g_globals->_randomSource.getRandomNumber(59)); break; case 1: scene->_object3.animate(ANIM_MODE_5, this); break; case 2: - setDelay(_globals->_randomSource.getRandomNumber(59)); + setDelay(g_globals->_randomSource.getRandomNumber(59)); break; case 3: scene->_object3.animate(ANIM_MODE_6, this); @@ -608,12 +610,12 @@ void Scene2100::Action2::signal() { } void Scene2100::Action3::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: case 2: - setDelay(_globals->_randomSource.getRandomNumber(119)); + setDelay(g_globals->_randomSource.getRandomNumber(119)); break; case 1: scene->_object2.animate(ANIM_MODE_5, this); @@ -626,64 +628,64 @@ void Scene2100::Action3::signal() { } void Scene2100::Action4::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); if (!scene->_sitFl) setDelay(1); else - setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 2102, &g_globals->_player, NULL); break; case 1: { Common::Point pt(80, 66); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: - _globals->_player.setVisage(2109); - _globals->_player._frame = 1; - _globals->_player._strip = 2; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2109); + g_globals->_player._frame = 1; + g_globals->_player._strip = 2; + g_globals->_player.animate(ANIM_MODE_5, this); break; case 3: - _globals->_sceneManager.changeScene(2120); + g_globals->_sceneManager.changeScene(2120); break; } } void Scene2100::Action5::signal() { // Quinn enters the cokpit after Seeker decided to enter the cave alone - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(30); break; case 1: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); + setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, &scene->_object1, NULL); break; case 2: { Common::Point pt(272, 127); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 3: - _globals->_player.checkAngle(&scene->_object3); + g_globals->_player.checkAngle(&scene->_object3); setDelay(30); break; case 4: - _globals->_sceneManager.changeScene(3700); + g_globals->_sceneManager.changeScene(3700); break; } } void Scene2100::Action6::signal() { // Seeker stands up and walks to the elevator - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { @@ -715,50 +717,50 @@ void Scene2100::Action6::signal() { } void Scene2100::Action7::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(60); break; case 1: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); + setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, &scene->_object1, NULL); break; case 2: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, NULL); break; case 3: - _globals->_sceneManager.changeScene(8100); + g_globals->_sceneManager.changeScene(8100); break; } } void Scene2100::Action8::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(60); break; case 1: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); + setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, &scene->_object1, NULL); break; case 2: { Common::Point pt(200, 174); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 3: - _globals->_player.checkAngle(&scene->_object3); + g_globals->_player.checkAngle(&scene->_object3); scene->_stripManager.start((RING_INVENTORY._translator._sceneNumber == 1) ? 7720 : 7710, this); break; case 4: if (RING_INVENTORY._translator._sceneNumber != 1) - _globals->_sceneManager.changeScene(7600); + g_globals->_sceneManager.changeScene(7600); else { - _globals->setFlag(24); - _globals->_player.enableControl(); + g_globals->setFlag(24); + g_globals->_player.enableControl(); remove(); } break; @@ -766,7 +768,7 @@ void Scene2100::Action8::signal() { } void Scene2100::Action9::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -786,14 +788,14 @@ void Scene2100::Action9::signal() { scene->_stripManager.start(6051, this, scene); break; case 4: - scene->_soundHandler.fadeOut(0/* was false */); + scene->_soundHandler.fadeOut(NULL); scene->_object4.setStrip(1); scene->_object4.setFrame(scene->_object4.getFrameCount()); scene->_object4.animate(ANIM_MODE_6, this); break; case 5: scene->_object4.hide(); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(6010, this); break; case 6: @@ -806,20 +808,20 @@ void Scene2100::Action9::signal() { } void Scene2100::Action10::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(60); break; case 1: - setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 2102, &g_globals->_player, NULL); break; case 2: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(155, 64); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 3: @@ -851,10 +853,10 @@ void Scene2100::Action10::signal() { scene->_object1.animate(ANIM_MODE_5, this); break; case 6: { - _globals->_player.fixPriority(1); + g_globals->_player.fixPriority(1); Common::Point pt(144, 54); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 7: { @@ -870,8 +872,8 @@ void Scene2100::Action10::signal() { break; } case 8: - _globals->_player.fixPriority(1); - _globals->_player.setStrip(1); + g_globals->_player.fixPriority(1); + g_globals->_player.setStrip(1); scene->_object3.fixPriority(1); scene->_object3.setStrip(2); scene->_object2.fixPriority(2); @@ -884,16 +886,16 @@ void Scene2100::Action10::signal() { scene->_object1.animate(ANIM_MODE_6, this); break; case 10: - _globals->setFlag(70); - _globals->_stripNum = 2101; - _globals->_sceneManager.changeScene(2320); + g_globals->setFlag(70); + g_globals->_stripNum = 2101; + g_globals->_sceneManager.changeScene(2320); break; } } void Scene2100::Action11::signal() { // Miranda stands up and walks to the elevator - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -951,16 +953,16 @@ void Scene2100::Action11::signal() { case 7: scene->_object3.remove(); scene->_object2.remove(); - _globals->setFlag(70); - _globals->_stripNum = 2102; - _globals->_player.enableControl(); - _globals->_player._canWalk = false; + g_globals->setFlag(70); + g_globals->_stripNum = 2102; + g_globals->_player.enableControl(); + g_globals->_player._canWalk = false; break; } } void Scene2100::Action12::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -976,7 +978,7 @@ void Scene2100::Action12::signal() { case 3: { Common::Point pt1(158, 74); NpcMover *mover1 = new NpcMover(); - _globals->_player.addMover(mover1, &pt1, this); + g_globals->_player.addMover(mover1, &pt1, this); Common::Point pt2(158, 68); NpcMover *mover2 = new NpcMover(); @@ -987,10 +989,10 @@ void Scene2100::Action12::signal() { scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, NULL); - _globals->_player.fixPriority(-1); + g_globals->_player.fixPriority(-1); Common::Point pt1(277, 84); PlayerMover *mover1 = new PlayerMover(); - _globals->_player.addMover(mover1, &pt1, this); + g_globals->_player.addMover(mover1, &pt1, this); scene->_object2.fixPriority(-1); Common::Point pt2(255, 76); @@ -999,29 +1001,29 @@ void Scene2100::Action12::signal() { break; } case 6: - _globals->_player.setStrip(4); + g_globals->_player.setStrip(4); scene->_object2.setStrip(4); setDelay(60); break; case 7: - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(6052, this); break; case 8: if (scene->_stripManager._field2E8 == 320) - _globals->setFlag(74); + g_globals->setFlag(74); setDelay(30); break; case 9: - _globals->_events.setCursor(OBJECT_STUNNER); + g_globals->_events.setCursor(OBJECT_STUNNER); scene->_object2.setAction(&scene->_action13); setDelay(60); break; case 10: - if (_globals->getFlag(74)) + if (g_globals->getFlag(74)) setDelay(1); else - setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 2101, &g_globals->_player, NULL); break; case 11: scene->_stripManager.start(2170, this); @@ -1030,14 +1032,14 @@ void Scene2100::Action12::signal() { setDelay(5); break; case 13: - scene->_stripManager.start(_globals->getFlag(74) ? 2172 : 2174, this); + scene->_stripManager.start(g_globals->getFlag(74) ? 2172 : 2174, this); break; case 14: - if (_globals->getFlag(74)) { - _globals->_stripNum = 6100; - _globals->_sceneManager.changeScene(2320); + if (g_globals->getFlag(74)) { + g_globals->_stripNum = 6100; + g_globals->_sceneManager.changeScene(2320); } else { - _globals->_sceneManager.changeScene(6100); + g_globals->_sceneManager.changeScene(6100); } remove(); break; @@ -1045,7 +1047,7 @@ void Scene2100::Action12::signal() { } void Scene2100::Action13::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1080,17 +1082,17 @@ void Scene2100::Action13::signal() { } void Scene2100::Action14::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(6); break; case 1: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); + setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, &scene->_object1, NULL); break; case 2: - setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 2101, &g_globals->_player, NULL); break; case 3: scene->_stripManager.start(6008, this); @@ -1105,7 +1107,7 @@ void Scene2100::Action14::signal() { scene->_stripManager.start(6009, this, scene); break; case 6: - scene->_soundHandler.fadeOut(0/* was false */); + scene->_soundHandler.fadeOut(NULL); scene->_object4.setStrip(1); scene->_object4.setFrame(scene->_object4.getFrameCount()); scene->_object4.animate(ANIM_MODE_6, this); @@ -1158,14 +1160,14 @@ void Scene2100::Action14::signal() { setDelay(90); break; case 15: - _globals->_sceneManager.changeScene(7000); + g_globals->_sceneManager.changeScene(7000); remove(); break; } } void Scene2100::Action15::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1230,7 +1232,7 @@ void Scene2100::Action15::signal() { } void Scene2100::Action16::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1241,13 +1243,13 @@ void Scene2100::Action16::signal() { scene->_stripManager.start(7001, this); break; case 2: - setAction(&scene->_sequenceManager, this, 2102, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 2102, &g_globals->_player, NULL); break; case 3: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(155, 63); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 5: @@ -1257,12 +1259,12 @@ void Scene2100::Action16::signal() { case 6: { Common::Point pt(160, 54); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 7: - _globals->_player.fixPriority(1); - _globals->_player.setStrip(3); + g_globals->_player.fixPriority(1); + g_globals->_player.setStrip(3); setDelay(45); break; case 8: @@ -1270,26 +1272,26 @@ void Scene2100::Action16::signal() { scene->_object1.animate(ANIM_MODE_6, this); break; case 9: - _globals->setFlag(15); - _globals->setFlag(36); - _globals->_sceneManager.changeScene(7000); + g_globals->setFlag(15); + g_globals->setFlag(36); + g_globals->_sceneManager.changeScene(7000); remove(); break; } } void Scene2100::Action17::signal() { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(60); break; case 1: - setAction(&scene->_sequenceManager, this, 2104, &_globals->_player, &scene->_object1, NULL); + setAction(&scene->_sequenceManager, this, 2104, &g_globals->_player, &scene->_object1, NULL); break; case 2: - setAction(&scene->_sequenceManager, this, 2101, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 2101, &g_globals->_player, NULL); break; case 3: scene->_stripManager.start(7070, this); @@ -1315,7 +1317,7 @@ void Scene2100::Action17::signal() { break; case 8: RING_INVENTORY._stasisNegator._sceneNumber = 1; - _globals->_sceneManager.changeScene(9100); + g_globals->_sceneManager.changeScene(9100); remove(); break; } @@ -1324,17 +1326,17 @@ void Scene2100::Action17::signal() { /*--------------------------------------------------------------------------*/ void Scene2100::Hotspot2::doAction(int action) { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2100, 3); break; case CURSOR_USE: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2100, 29); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action4); } break; @@ -1346,17 +1348,17 @@ void Scene2100::Hotspot2::doAction(int action) { void Scene2100::Hotspot3::doAction(int action) { // Computer, on the left - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2100, 4); break; case CURSOR_USE: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2100, 29); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action4); } break; @@ -1381,17 +1383,17 @@ void Scene2100::Hotspot4::doAction(int action) { } void Scene2100::Hotspot8::doAction(int action) { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2100, 12); break; case CURSOR_USE: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2100, 29); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action4); } break; @@ -1403,7 +1405,7 @@ void Scene2100::Hotspot8::doAction(int action) { void Scene2100::Hotspot10::doAction(int action) { // Quinn's Console - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -1411,15 +1413,15 @@ void Scene2100::Hotspot10::doAction(int action) { break; case CURSOR_USE: if (scene->_sitFl) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 2102; - scene->setAction(&scene->_sequenceManager, scene, 2102, &_globals->_player, NULL); - } else if (_globals->getFlag(13)) { + scene->setAction(&scene->_sequenceManager, scene, 2102, &g_globals->_player, NULL); + } else if (g_globals->getFlag(13)) { SceneItem::display2(2100, 28); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 2101; - scene->setAction(&scene->_sequenceManager, scene, 2101, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 2101, &g_globals->_player, NULL); } break; default: @@ -1431,13 +1433,13 @@ void Scene2100::Hotspot10::doAction(int action) { void Scene2100::Hotspot14::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(0)) + if (g_globals->getFlag(0)) SceneItem::display2(2100, 19); else SceneItem::display2(2100, 18); break; case CURSOR_USE: - if (_globals->getFlag(1)) + if (g_globals->getFlag(1)) SceneItem::display2(2100, 21); else SceneItem::display2(2100, 20); @@ -1450,7 +1452,7 @@ void Scene2100::Hotspot14::doAction(int action) { void Scene2100::Object1::doAction(int action) { // Elevator - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -1466,29 +1468,29 @@ void Scene2100::Object1::doAction(int action) { } void Scene2100::Object2::doAction(int action) { - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2100, 30); break; case CURSOR_TALK: - if (_globals->getFlag(72)) { - _globals->_player.disableControl(); - if (!_globals->getFlag(52)) { + if (g_globals->getFlag(72)) { + g_globals->_player.disableControl(); + if (!g_globals->getFlag(52)) { scene->_sceneMode = 2111; scene->setAction(&scene->_sequenceManager, scene, 2111, NULL); } else { - scene->_sceneMode = _globals->getFlag(53) ? 2112 : 2110; + scene->_sceneMode = g_globals->getFlag(53) ? 2112 : 2110; scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, NULL); } - } else if (_globals->getFlag(13)) { + } else if (g_globals->getFlag(13)) { SceneItem::display2(2100, 31); - } else if (_globals->getFlag(14)) { + } else if (g_globals->getFlag(14)) { SceneItem::display2(2100, 32); } else { - _globals->setFlag(14); - _globals->_player.disableControl(); + g_globals->setFlag(14); + g_globals->_player.disableControl(); scene->_sceneMode = 2108; scene->setAction(&scene->_sequenceManager, scene, 2109, NULL); } @@ -1501,19 +1503,19 @@ void Scene2100::Object2::doAction(int action) { void Scene2100::Object3::doAction(int action) { // Miranda - Scene2100 *scene = (Scene2100 *)_globals->_sceneManager._scene; + Scene2100 *scene = (Scene2100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(59)) + if (g_globals->getFlag(59)) SceneItem::display2(2100, 34); else error("***I have no response."); break; case CURSOR_TALK: - if (_globals->getFlag(59)) { - _globals->_player.disableControl(); + if (g_globals->getFlag(59)) { + g_globals->_player.disableControl(); scene->_sceneMode = 2108; scene->setAction(&scene->_sequenceManager, scene, 2108, NULL); } else { @@ -1564,7 +1566,7 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerHText); _stripManager.addSpeaker(&_speakerGameText); _speakerMText._npc = &_object3; - _speakerQText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; _speakerSText._npc = &_object2; _object1.postInit(); @@ -1644,7 +1646,7 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { _hotspot15.setBounds(Rect(14, 90, 46, 107)); _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - if (!_globals->getFlag(36) && !_globals->getFlag(70) && !_globals->getFlag(43)) { + if (!g_globals->getFlag(36) && !g_globals->getFlag(70) && !g_globals->getFlag(43)) { _object3.postInit(); _object3.setPosition(Common::Point(246, 156)); _object3.animate(ANIM_MODE_NONE, NULL); @@ -1653,10 +1655,10 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { _object3.setVisage(2107); _object3.setStrip(1); _object3.setAction(&_action2); - _globals->_sceneItems.push_back(&_object3); + g_globals->_sceneItems.push_back(&_object3); } - if (!_globals->getFlag(59) && !_globals->getFlag(70) && !_globals->getFlag(37) && !_globals->getFlag(114)) { + if (!g_globals->getFlag(59) && !g_globals->getFlag(70) && !g_globals->getFlag(37) && !g_globals->getFlag(114)) { _object2.postInit(); _object2.setVisage(2108); _object2._strip = 3; @@ -1665,50 +1667,50 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { _object2.changeZoom(100); _object2.fixPriority(113); _object2.setAction(&_action3); - _globals->_sceneItems.push_back(&_object2); + g_globals->_sceneItems.push_back(&_object2); } - _globals->_sceneItems.addItems(&_hotspot15, &_hotspot11, &_hotspot10, &_hotspot9, &_hotspot14, + g_globals->_sceneItems.addItems(&_hotspot15, &_hotspot11, &_hotspot10, &_hotspot9, &_hotspot14, &_hotspot13, &_hotspot12, &_hotspot8, &_object1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot6, &_hotspot7, &_hotspot1, NULL); - _globals->_player.postInit(); - if (_globals->getFlag(13)) { - _globals->_player.setVisage(2170); - _globals->_player._moveDiff.y = 1; + g_globals->_player.postInit(); + if (g_globals->getFlag(13)) { + g_globals->_player.setVisage(2170); + g_globals->_player._moveDiff.y = 1; } else { - _globals->_player.setVisage(0); - _globals->_player._moveDiff.y = 3; + g_globals->_player.setVisage(0); + g_globals->_player._moveDiff.y = 3; } - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._moveDiff.x = 4; - _globals->_player.changeZoom(-1); - _globals->_player.disableControl(); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player._moveDiff.x = 4; + g_globals->_player.changeZoom(-1); + g_globals->_player.disableControl(); _sitFl = 0; - switch (_globals->_sceneManager._previousScene) { + switch (g_globals->_sceneManager._previousScene) { case 2120: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); _object1.fixPriority(-1); - _globals->_player.fixPriority(-1); - _globals->_player.setPosition(Common::Point(80, 66)); - _globals->_player.enableControl(); + g_globals->_player.fixPriority(-1); + g_globals->_player.setPosition(Common::Point(80, 66)); + g_globals->_player.enableControl(); break; case 2150: - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(157, 56)); + g_globals->_player.fixPriority(1); + g_globals->_player.setPosition(Common::Point(157, 56)); _sceneMode = 2104; - setAction(&_sequenceManager, this, 2104, &_globals->_player, &_object1, NULL); + setAction(&_sequenceManager, this, 2104, &g_globals->_player, &_object1, NULL); break; case 2222: - if (_globals->_sceneObjects->contains(&_object3)) + if (g_globals->_sceneObjects->contains(&_object3)) _object3.remove(); - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(144, 55)); + g_globals->_player.fixPriority(1); + g_globals->_player.setPosition(Common::Point(144, 55)); _object2.setVisage(2806); _object2.changeZoom(-1); @@ -1721,12 +1723,12 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_action12); break; case 2320: - if (_globals->_stripNum == 2321) { - if (_globals->_sceneObjects->contains(&_object3)) + if (g_globals->_stripNum == 2321) { + if (g_globals->_sceneObjects->contains(&_object3)) _object3.remove(); - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(144, 55)); + g_globals->_player.fixPriority(1); + g_globals->_player.setPosition(Common::Point(144, 55)); _object2.postInit(); _object2.setVisage(2806); @@ -1739,9 +1741,9 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { _object2.animate(ANIM_MODE_1, NULL); setAction(&_action12); - } else if (_globals->_stripNum == 6100) { - _globals->_player.setPosition(Common::Point(157, 56)); - _globals->_player.fixPriority(1); + } else if (g_globals->_stripNum == 6100) { + g_globals->_player.setPosition(Common::Point(157, 56)); + g_globals->_player.fixPriority(1); _object4.postInit(); _object4.setVisage(2102); @@ -1750,27 +1752,27 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_action14); } else { - _globals->_player.disableControl(); - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(157, 56)); + g_globals->_player.disableControl(); + g_globals->_player.fixPriority(1); + g_globals->_player.setPosition(Common::Point(157, 56)); _sceneMode = 2104; - setAction(&_sequenceManager, this, 2104, &_globals->_player, &_object1, NULL); + setAction(&_sequenceManager, this, 2104, &g_globals->_player, &_object1, NULL); } break; case 3700: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); Scene::setZoomPercents(80, 75, 100, 90); - if (_globals->_sceneObjects->contains(&_object2)) + if (g_globals->_sceneObjects->contains(&_object2)) _object2.remove(); - _globals->_player._angle = 225; - _globals->_player.setStrip(6); - _globals->_player.setFrame(1); - _globals->_player.fixPriority(-1); - _globals->_player.setPosition(Common::Point(272, 127)); + g_globals->_player._angle = 225; + g_globals->_player.setStrip(6); + g_globals->_player.setFrame(1); + g_globals->_player.fixPriority(-1); + g_globals->_player.setPosition(Common::Point(272, 127)); _object3.setPosition(Common::Point(246, 156)); _object3.fixPriority(156); @@ -1778,15 +1780,15 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager, this, 2105, &_object3, NULL); break; case 4250: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - _globals->clearFlag(43); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); + g_globals->clearFlag(43); - _globals->_player.setVisage(2104); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(65, 149)); - _globals->_player.fixPriority(152); - _globals->_player.setStrip(2); + g_globals->_player.setVisage(2104); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(65, 149)); + g_globals->_player.fixPriority(152); + g_globals->_player.setStrip(2); _object4.postInit(); _object4.setVisage(2102); @@ -1797,16 +1799,16 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager, this, 2107, &_object4, NULL); break; case 5000: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); - if (_globals->_sceneObjects->contains(&_object2)) + if (g_globals->_sceneObjects->contains(&_object2)) _object2.remove(); - _globals->_player.setStrip(3); - _globals->_player.setFrame(1); - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(157, 56)); + g_globals->_player.setStrip(3); + g_globals->_player.setFrame(1); + g_globals->_player.fixPriority(1); + g_globals->_player.setPosition(Common::Point(157, 56)); _object3.setPosition(Common::Point(246, 156)); _object3.fixPriority(156); @@ -1814,13 +1816,13 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_action5); break; case 5100: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - _globals->_player.setVisage(2104); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(65, 149)); - _globals->_player.fixPriority(152); - _globals->_player.setStrip(2); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); + g_globals->_player.setVisage(2104); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(65, 149)); + g_globals->_player.fixPriority(152); + g_globals->_player.setStrip(2); _sitFl = 1; @@ -1833,67 +1835,67 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_action9); break; case 7000: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); if (RING_INVENTORY._stasisBox2._sceneNumber == 1) { - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(157, 56)); + g_globals->_player.fixPriority(1); + g_globals->_player.setPosition(Common::Point(157, 56)); _object4.postInit(); _object4.setVisage(2102); _object4.setPosition(Common::Point(160, 199)); _object4.hide(); - _globals->clearFlag(15); - _globals->clearFlag(109); - _globals->clearFlag(72); + g_globals->clearFlag(15); + g_globals->clearFlag(109); + g_globals->clearFlag(72); setAction(&_action17); } else { - _globals->_player.setVisage(2104); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(65, 149)); - _globals->_player.fixPriority(152); - _globals->_player.setStrip(2); + g_globals->_player.setVisage(2104); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(65, 149)); + g_globals->_player.fixPriority(152); + g_globals->_player.setStrip(2); _sitFl = 1; setAction(&_action16); } break; case 7600: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); - if (_globals->_sceneObjects->contains(&_object2)) + if (g_globals->_sceneObjects->contains(&_object2)) _object2.remove(); - _globals->_player.fixPriority(1); - _globals->_player.setPosition(Common::Point(157, 56)); + g_globals->_player.fixPriority(1); + g_globals->_player.setPosition(Common::Point(157, 56)); setAction(&_action8); break; case 8100: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); - _globals->_player.setVisage(2104); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(65, 149)); - _globals->_player.fixPriority(152); - _globals->_player.setStrip(2); + g_globals->_player.setVisage(2104); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(65, 149)); + g_globals->_player.fixPriority(152); + g_globals->_player.setStrip(2); _sceneMode = 2106; setAction(&_sequenceManager, this, 2106, NULL); break; case 9750: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); - _globals->_player.setVisage(2104); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(65, 149)); - _globals->_player.fixPriority(152); - _globals->_player.setStrip(2); + g_globals->_player.setVisage(2104); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(65, 149)); + g_globals->_player.fixPriority(152); + g_globals->_player.setStrip(2); _object4.postInit(); _object4.setVisage(2102); @@ -1904,22 +1906,22 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager, this, 2103, &_object4, NULL); break; default: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); - _globals->_player._uiEnabled = true; + g_globals->_player._uiEnabled = true; break; } - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; } void Scene2100::stripCallback(int v) { switch (v) { case 1: _object4._numFrames = 4; - _object4.animate(ANIM_MODE_7, NULL); + _object4.animate(ANIM_MODE_7, 0, NULL); break; case 2: _object4.animate(ANIM_MODE_NONE, NULL); @@ -1931,22 +1933,22 @@ void Scene2100::signal() { switch (_sceneMode) { case 2101: _sitFl = 1; - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_player._uiEnabled = true; + g_globals->_events.setCursor(CURSOR_USE); break; case 2102: _sitFl = 0; - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 2103: - _globals->_stripNum = 9000; - _globals->_sceneManager.changeScene(4000); + g_globals->_stripNum = 9000; + g_globals->_sceneManager.changeScene(4000); break; case 2106: - _globals->_sceneManager.changeScene(7000); + g_globals->_sceneManager.changeScene(7000); break; case 2107: - _globals->_sceneManager.changeScene(5000); + g_globals->_sceneManager.changeScene(5000); break; case 2104: case 2105: @@ -1954,7 +1956,7 @@ void Scene2100::signal() { case 2110: case 2111: case 2112: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; } } @@ -2007,12 +2009,12 @@ Scene2120::Action1::Action1() { } void Scene2120::Action1::signal() { - Scene2120 *scene = (Scene2120 *)_globals->_sceneManager._scene; + Scene2120 *scene = (Scene2120 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(30); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); break; case 1: // First page of index @@ -2045,10 +2047,10 @@ void Scene2120::Action1::signal() { } void Scene2120::Action1::dispatch() { - Scene2120 *scene = (Scene2120 *)_globals->_sceneManager._scene; + Scene2120 *scene = (Scene2120 *)g_globals->_sceneManager._scene; Event event; - if (_globals->_events.getEvent(event) && (event.eventType == EVENT_BUTTON_DOWN)) { + if (g_globals->_events.getEvent(event) && (event.eventType == EVENT_BUTTON_DOWN)) { if (scene->_listRect.contains(event.mousePos) && (scene->_dbMode != 2)) { scene->_topicArrowHotspot.setPosition(Common::Point(scene->_topicArrowHotspot._position.x, event.mousePos.y)); } @@ -2064,8 +2066,8 @@ void Scene2120::Action1::dispatch() { else scene->_subjectIndex = (scene->_topicArrowHotspot._position.y - 44) / 8 + 16; - if ((scene->_subjectIndex == 27) && _globals->getFlag(70)) - _globals->setFlag(75); + if ((scene->_subjectIndex == 27) && g_globals->getFlag(70)) + g_globals->setFlag(75); scene->_topicArrowHotspot.hide(); scene->_prevDbMode = scene->_dbMode; @@ -2142,9 +2144,9 @@ void Scene2120::Action1::dispatch() { setAction(NULL); SceneItem::display(0, 0); - _globals->_gfxManagerInstance._font.setFontNumber(2); - _globals->_sceneText._fontNumber = 2; - _globals->_sceneManager.changeScene(_globals->_sceneManager._previousScene); + g_globals->_gfxManagerInstance._font.setFontNumber(2); + g_globals->_sceneText._fontNumber = 2; + g_globals->_sceneManager.changeScene(g_globals->_sceneManager._previousScene); } else { // Exit out of topic display to index SceneItem::display(0, 0); @@ -2182,7 +2184,7 @@ Scene2120::Scene2120(): Scene() { void Scene2120::postInit(SceneObjectList *OwnerList) { loadScene(2120); setZoomPercents(0, 100, 200, 100); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _subjectButton.setBounds(Rect(266, 13, 320, 56)); _nextPageButton.setBounds(Rect(266, 56, 320, 98)); @@ -2201,8 +2203,8 @@ void Scene2120::postInit(SceneObjectList *OwnerList) { _arrowHotspot.setPosition(Common::Point(400, 200)); setAction(&_action1); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; } void Scene2120::synchronize(Serializer &s) { @@ -2221,14 +2223,14 @@ void Scene2120::synchronize(Serializer &s) { *--------------------------------------------------------------------------*/ void Scene2150::Action1::signal() { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(158, 103); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: @@ -2236,15 +2238,15 @@ void Scene2150::Action1::signal() { scene->_hotspot1.animate(ANIM_MODE_5, this); break; case 2: { - _globals->_player.setStrip2(4); + g_globals->_player.setStrip2(4); Common::Point pt(158, 95); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 3: - _globals->_player.setStrip2(-1); - _globals->_player._strip = 3; + g_globals->_player.setStrip2(-1); + g_globals->_player._strip = 3; setDelay(10); break; case 4: @@ -2255,12 +2257,12 @@ void Scene2150::Action1::signal() { scene->_area2.draw(true); _state = 0; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); - while (!_state && !_vm->getEventManager()->shouldQuit()) { + while (!_state && !g_vm->shouldQuit()) { // Wait for an event Event event; - if (!_globals->_events.getEvent(event)) { + if (!g_globals->_events.getEvent(event)) { g_system->updateScreen(); g_system->delayMillis(10); continue; @@ -2299,10 +2301,10 @@ void Scene2150::Action1::signal() { if (_state == 2150) { Common::Point pt(158, 103); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } else { - _globals->_sceneManager.changeScene(_state); + g_globals->_sceneManager.changeScene(_state); } break; case 6: @@ -2310,28 +2312,28 @@ void Scene2150::Action1::signal() { scene->_hotspot1.animate(ANIM_MODE_6, this); break; case 7: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene2150::Action2::signal() { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(47, 85); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: - _globals->_player.setVisage(2152); - _globals->_player.setFrame(1); - _globals->_player.setStrip(8); - _globals->_player.animate(ANIM_MODE_8, 1, this); + g_globals->_player.setVisage(2152); + g_globals->_player.setFrame(1); + g_globals->_player.setStrip(8); + g_globals->_player.animate(ANIM_MODE_8, 1, this); scene->_soundHandler.play(163); break; @@ -2340,7 +2342,7 @@ void Scene2150::Action2::signal() { scene->_hotspot10.animate(ANIM_MODE_5, this); break; case 3: - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start((RING_INVENTORY._ale._sceneNumber == 2150) ? 2151 : 2152, this); break; case 4: @@ -2356,21 +2358,21 @@ void Scene2150::Action2::signal() { scene->_hotspot14.setFrame(scene->_stripManager._field2E8 - 5); } - _globals->_player.setFrame(1); - _globals->_player.setStrip(7); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setFrame(1); + g_globals->_player.setStrip(7); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 5: scene->_soundHandler.play(164); scene->_hotspot10.animate(ANIM_MODE_6, NULL); scene->_hotspot14.remove(); - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 6: - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.enableControl(); remove(); break; @@ -2380,7 +2382,7 @@ void Scene2150::Action2::signal() { /*--------------------------------------------------------------------------*/ void Scene2150::Hotspot1::doAction(int action) { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -2396,16 +2398,16 @@ void Scene2150::Hotspot1::doAction(int action) { } void Scene2150::Hotspot2::doAction(int action) { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2150, 1); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 2156; - scene->setAction(&scene->_sequenceManager, scene, 2156, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 2156, &g_globals->_player, this, NULL); break; default: SceneHotspot::doAction(action); @@ -2414,16 +2416,16 @@ void Scene2150::Hotspot2::doAction(int action) { } void Scene2150::Hotspot4::doAction(int action) { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2150, 3); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 2155; - scene->setAction(&scene->_sequenceManager, scene, 2155, &_globals->_player, &scene->_hotspot4, NULL); + scene->setAction(&scene->_sequenceManager, scene, 2155, &g_globals->_player, &scene->_hotspot4, NULL); break; default: SceneHotspot::doAction(action); @@ -2432,19 +2434,19 @@ void Scene2150::Hotspot4::doAction(int action) { } void Scene2150::Hotspot7::doAction(int action) { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2150, 7); break; case CURSOR_USE: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2150, 19); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 2154; - scene->setAction(&scene->_sequenceManager, scene, 2154, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 2154, &g_globals->_player, NULL); } break; default: @@ -2454,14 +2456,14 @@ void Scene2150::Hotspot7::doAction(int action) { } void Scene2150::Hotspot10::doAction(int action) { - Scene2150 *scene = (Scene2150 *)_globals->_sceneManager._scene; + Scene2150 *scene = (Scene2150 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2150, 10); break; case CURSOR_USE: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2150, 19); else scene->setAction(&scene->_action2); @@ -2542,60 +2544,60 @@ void Scene2150::postInit(SceneObjectList *OwnerList) { _hotspot10.setStrip(5); _hotspot10.setPosition(Common::Point(59, 56)); - _globals->_player.postInit(); - _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.fixPriority(-1); - _globals->_player.changeZoom(-1); - _globals->_player._moveDiff.y = 3; + g_globals->_player.postInit(); + g_globals->_player.setVisage(g_globals->getFlag(13) ? 2170 : 0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.fixPriority(-1); + g_globals->_player.changeZoom(-1); + g_globals->_player._moveDiff.y = 3; _hotspot8.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); _hotspot9.setBounds(Rect(133, 0, 198, 91)); _hotspot11.setBounds(Rect(142, 119, 176, 158)); - _globals->_sceneItems.addItems(&_hotspot1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, + g_globals->_sceneItems.addItems(&_hotspot1, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot6, &_hotspot7, &_hotspot10, &_hotspot9, &_hotspot11, &_hotspot8, NULL); - switch (_globals->_sceneManager._previousScene) { + switch (g_globals->_sceneManager._previousScene) { case 2120: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - _globals->_player.setPosition(Common::Point(108, 99)); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); + g_globals->_player.setPosition(Common::Point(108, 99)); break; case 2200: - _globals->_player.disableControl(); - _globals->_player.setPosition(Common::Point(159, 240)); + g_globals->_player.disableControl(); + g_globals->_player.setPosition(Common::Point(159, 240)); _sceneMode = 2152; - setAction(&_sequenceManager, this, 2152, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 2152, &g_globals->_player, NULL); break; case 2280: - _globals->_player.disableControl(); - _globals->_player._angle = 180; - _globals->_player.setPosition(Common::Point(265, 80)); + g_globals->_player.disableControl(); + g_globals->_player._angle = 180; + g_globals->_player.setPosition(Common::Point(265, 80)); _hotspot2._frame = _hotspot2.getFrameCount(); _sceneMode = 2157; setAction(&_sequenceManager, this, 2157, &_hotspot2, NULL); break; case 2230: - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player._strip = 4; - _globals->_player.setPosition(Common::Point(229, 139)); + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_player._strip = 4; + g_globals->_player.setPosition(Common::Point(229, 139)); break; case 2100: default: - _globals->_player.disableControl(); - _globals->_player.setPosition(Common::Point(158, 95)); - _globals->_player.setStrip(3); + g_globals->_player.disableControl(); + g_globals->_player.setPosition(Common::Point(158, 95)); + g_globals->_player.setStrip(3); _sceneMode = 2151; - setAction(&_sequenceManager, this, 2151, &_globals->_player, &_hotspot1, NULL); + setAction(&_sequenceManager, this, 2151, &g_globals->_player, &_hotspot1, NULL); break; } - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; } void Scene2150::synchronize(Serializer &s) { @@ -2607,22 +2609,22 @@ void Scene2150::synchronize(Serializer &s) { void Scene2150::signal() { switch (_sceneMode) { case 2151: - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.enableControl(); break; case 2152: case 2153: case 2157: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 2154: - _globals->_sceneManager.changeScene(2120); + g_globals->_sceneManager.changeScene(2120); break; case 2155: - _globals->_sceneManager.changeScene(2230); + g_globals->_sceneManager.changeScene(2230); break; case 2156: - _globals->_sceneManager.changeScene(2280); + g_globals->_sceneManager.changeScene(2280); break; } } @@ -2631,22 +2633,22 @@ void Scene2150::dispatch() { Scene::dispatch(); if (!_action) { - if (_rect1.contains(_globals->_player._position)) { - _globals->_player.disableControl(); + if (_rect1.contains(g_globals->_player._position)) { + g_globals->_player.disableControl(); _sceneMode = 2156; - setAction(&_sequenceManager, this, 2156, &_globals->_player, &_hotspot2, NULL); + setAction(&_sequenceManager, this, 2156, &g_globals->_player, &_hotspot2, NULL); } - if (_rect2.contains(_globals->_player._position)) { - _globals->_player.disableControl(); + if (_rect2.contains(g_globals->_player._position)) { + g_globals->_player.disableControl(); _sceneMode = 2155; - setAction(&_sequenceManager, this, 2155, &_globals->_player, &_hotspot4, NULL); + setAction(&_sequenceManager, this, 2155, &g_globals->_player, &_hotspot4, NULL); } - if (_globals->_player._position.y >= 196) { - _globals->_player.disableControl(); + if (g_globals->_player._position.y >= 196) { + g_globals->_player.disableControl(); SceneItem::display2(2150, 20); _sceneMode = 2153; - setAction(&_sequenceManager, this, 2153, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 2153, &g_globals->_player, NULL); } } } @@ -2657,7 +2659,7 @@ void Scene2150::dispatch() { *--------------------------------------------------------------------------*/ void Scene2200::Action1::signal() { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2668,14 +2670,14 @@ void Scene2200::Action1::signal() { break; case 2: SceneItem::display2(2200, 7); - _globals->_sceneManager.changeScene(2150); + g_globals->_sceneManager.changeScene(2150); remove(); break; } } void Scene2200::Action2::signal() { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2692,20 +2694,20 @@ void Scene2200::Action2::signal() { setDelay(30); break; case 4: - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(2040, this, scene); break; case 5: scene->_hotspot4.setStrip(4); scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); - _globals->_player._uiEnabled = true; + g_globals->_player._uiEnabled = true; remove(); break; } } void Scene2200::Action3::signal() { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { @@ -2713,7 +2715,7 @@ void Scene2200::Action3::signal() { scene->_hotspot4.setStrip(4); scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_hotspot2.postInit(); scene->_hotspot2.setVisage(2201); @@ -2732,16 +2734,16 @@ void Scene2200::Action3::signal() { setDelay(120); break; case 2: - if (_globals->getFlag(83)) { + if (g_globals->getFlag(83)) { _actionIndex = 8; setDelay(5); } else { - for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneObjects->begin(); - i != _globals->_sceneObjects->end(); ++i) { + for (SynchronizedList<SceneObject *>::iterator i = g_globals->_sceneObjects->begin(); + i != g_globals->_sceneObjects->end(); ++i) { (*i)->hide(); } - _globals->_sceneManager._scene->loadScene(66); + g_globals->_sceneManager._scene->loadScene(66); scene->_hotspot6.postInit(); scene->_hotspot6.setVisage(66); @@ -2773,12 +2775,12 @@ void Scene2200::Action3::signal() { setDelay(5); break; case 7: - for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneObjects->begin(); - i != _globals->_sceneObjects->end(); ++i) + for (SynchronizedList<SceneObject *>::iterator i = g_globals->_sceneObjects->begin(); + i != g_globals->_sceneObjects->end(); ++i) (*i)->show(); scene->_hotspot6.remove(); - _globals->_sceneManager._scene->loadScene(2200); + g_globals->_sceneManager._scene->loadScene(2200); setDelay(5); break; case 8: @@ -2789,7 +2791,7 @@ void Scene2200::Action3::signal() { scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); break; case 10: - _globals->_sceneManager.changeScene(2000); + g_globals->_sceneManager.changeScene(2000); remove(); break; } @@ -2806,7 +2808,7 @@ void Scene2200::Action3::process(Event &event) { } void Scene2200::Action4::signal() { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2821,7 +2823,7 @@ void Scene2200::Action4::signal() { setDelay(10); break; case 3: - _globals->_player._uiEnabled = true; + g_globals->_player._uiEnabled = true; remove(); break; } @@ -2830,7 +2832,7 @@ void Scene2200::Action4::signal() { /*--------------------------------------------------------------------------*/ void Scene2200::Hotspot3::doAction(int action) { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -2840,7 +2842,7 @@ void Scene2200::Hotspot3::doAction(int action) { SceneItem::display2(2200, 11); break; case CURSOR_TALK: - _globals->_player._uiEnabled = false; + g_globals->_player._uiEnabled = false; scene->setAction(&scene->_action4); break; default: @@ -2850,7 +2852,7 @@ void Scene2200::Hotspot3::doAction(int action) { } void Scene2200::Hotspot5::doAction(int action) { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -2861,7 +2863,7 @@ void Scene2200::Hotspot5::doAction(int action) { break; case CURSOR_TALK: scene->_sceneMode = 2201; - _globals->_player._uiEnabled = false; + g_globals->_player._uiEnabled = false; scene->setAction(&scene->_sequenceManager, scene, 2201, NULL); break; default: @@ -2871,19 +2873,19 @@ void Scene2200::Hotspot5::doAction(int action) { } void Scene2200::Hotspot9::doAction(int action) { - Scene2200 *scene = (Scene2200 *)_globals->_sceneManager._scene; + Scene2200 *scene = (Scene2200 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - SceneItem::display2(2200, _globals->getFlag(8) ? 1 : 0); + SceneItem::display2(2200, g_globals->getFlag(8) ? 1 : 0); break; case CURSOR_USE: SceneItem::display2(2200, 3); break; case OBJECT_INFODISK: - if (_globals->_sceneManager._previousScene == 2310) { + if (g_globals->_sceneManager._previousScene == 2310) { scene->_soundHandler2.play(35); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action3); } break; @@ -2915,7 +2917,7 @@ void Scene2200::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerMR); _stripManager.addSpeaker(&_speakerGameText); - _speakerQText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; _speakerSText._npc = &_hotspot5; _speakerMText._npc = &_hotspot3; @@ -2931,21 +2933,21 @@ void Scene2200::postInit(SceneObjectList *OwnerList) { _hotspot8.setPosition(Common::Point(96, 184)); _hotspot8.fixPriority(236); - _globals->_player.postInit(); - _globals->_player.setVisage(2640); - _globals->_player.setFrame2(3); - _globals->_player.setPosition(Common::Point(110, 233)); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(2640); + g_globals->_player.setFrame2(3); + g_globals->_player.setPosition(Common::Point(110, 233)); + g_globals->_player.disableControl(); - switch (_globals->_sceneManager._previousScene) { + switch (g_globals->_sceneManager._previousScene) { case 2150: _hotspot5.remove(); _hotspot8.remove(); break; case 4000: - _globals->_soundHandler.play(100); - _globals->_soundHandler.holdAt(true); - _globals->_player.remove(); + g_globals->_soundHandler.play(100); + g_globals->_soundHandler.holdAt(true); + g_globals->_player.remove(); _hotspot5.remove(); _hotspot8.remove(); @@ -2975,20 +2977,20 @@ void Scene2200::postInit(SceneObjectList *OwnerList) { _hotspot3.postInit(); _hotspot3.setVisage(2215); _hotspot3.setPosition(Common::Point(144, 132)); - _globals->_sceneItems.push_back(&_hotspot3); + g_globals->_sceneItems.push_back(&_hotspot3); _hotspot4.postInit(); _hotspot4.setVisage(2215); _hotspot4._strip = 2; _hotspot4.setPosition(Common::Point(120, 78)); _hotspot4.fixPriority(255); - _globals->_sceneItems.push_back(&_hotspot4); + g_globals->_sceneItems.push_back(&_hotspot4); _soundHandler1.play(101); _soundHandler2.play(100); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.holdAt(true); - _globals->_sceneItems.push_back(&_hotspot5); + g_globals->_sceneItems.push_back(&_hotspot5); setAction(&_action2); break; } @@ -2997,9 +2999,9 @@ void Scene2200::postInit(SceneObjectList *OwnerList) { _hotspot9.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); _hotspot10.setBounds(Rect(87, 43, 149, 109)); - _globals->_sceneItems.addItems(&_hotspot10, &_hotspot9, NULL); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneItems.addItems(&_hotspot10, &_hotspot9, NULL); + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; } void Scene2200::stripCallback(int v) { @@ -3022,15 +3024,15 @@ void Scene2200::synchronize(Serializer &s) { void Scene2200::signal() { if ((_sceneMode == 2201) || (_sceneMode == 2202)) - _globals->_player._uiEnabled = true; + g_globals->_player._uiEnabled = true; } void Scene2200::dispatch() { Scene::dispatch(); if (!_action) { - if (_exitRect.contains(_globals->_player._position)) - _globals->_sceneManager.changeScene(2150); + if (_exitRect.contains(g_globals->_player._position)) + g_globals->_sceneManager.changeScene(2150); } } @@ -3040,7 +3042,7 @@ void Scene2200::dispatch() { *--------------------------------------------------------------------------*/ void Scene2222::Action1::signal() { - Scene2222 *scene = (Scene2222 *)_globals->_sceneManager._scene; + Scene2222 *scene = (Scene2222 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -3053,13 +3055,13 @@ void Scene2222::Action1::signal() { setDelay(30); break; case 3: - _globals->_sceneManager.changeScene(1000); + g_globals->_sceneManager.changeScene(1000); break; } } void Scene2222::Action2::signal() { - Scene2222 *scene = (Scene2222 *)_globals->_sceneManager._scene; + Scene2222 *scene = (Scene2222 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -3072,8 +3074,8 @@ void Scene2222::Action2::signal() { setDelay(120); break; case 3: - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_sceneManager.changeScene(2100); + g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + g_globals->_sceneManager.changeScene(2100); break; } } @@ -3081,7 +3083,7 @@ void Scene2222::Action2::signal() { /*--------------------------------------------------------------------------*/ void Scene2222::postInit(SceneObjectList *OwnerList) { - loadScene((_globals->_sceneManager._previousScene == 2000) ? 3400 : 3450); + loadScene((g_globals->_sceneManager._previousScene == 2000) ? 3400 : 3450); Scene::postInit(); setZoomPercents(0, 100, 200, 100); @@ -3121,7 +3123,7 @@ void Scene2222::postInit(SceneObjectList *OwnerList) { _hotspot5.setFrame(5); _hotspot5.animate(ANIM_MODE_2, 0); - if (_globals->_sceneManager._previousScene == 2100) { + if (g_globals->_sceneManager._previousScene == 2100) { _hotspot1.setPosition(Common::Point(61, 101)); _hotspot2.setPosition(Common::Point(239, 149)); _hotspot3.setPosition(Common::Point(184, 85)); @@ -3140,10 +3142,10 @@ void Scene2222::postInit(SceneObjectList *OwnerList) { } _soundHandler.play(116); - _globals->_sceneManager._scene->_sceneBounds.center(_hotspot1._position); + g_globals->_sceneManager._scene->_sceneBounds.center(_hotspot1._position); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; } @@ -3153,7 +3155,7 @@ void Scene2222::postInit(SceneObjectList *OwnerList) { *--------------------------------------------------------------------------*/ void Scene2230::Action1::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -3172,7 +3174,7 @@ void Scene2230::Action1::signal() { case 1: { Common::Point pt(84, 74); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: @@ -3181,20 +3183,20 @@ void Scene2230::Action1::signal() { case 3: { Common::Point pt(63, 60); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 4: scene->_hotspot1.animate(ANIM_MODE_6, this); break; case 5: - _globals->_sceneManager.changeScene(2150); + g_globals->_sceneManager.changeScene(2150); break; } } void Scene2230::Action2::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -3208,67 +3210,67 @@ void Scene2230::Action2::signal() { } break; case 1: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_field30A = 1; - _globals->_player._regionBitList |= ~0x80; + g_globals->_player._regionBitList |= ~0x80; Common::Point pt(160, 96); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: - _globals->_player.setVisage(2235); - _globals->_player.setStrip2(1); - _globals->_player.fixPriority(100); - _globals->_player._frame = 1; - _globals->_player.setPosition(Common::Point(200, 68)); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2235); + g_globals->_player.setStrip2(1); + g_globals->_player.fixPriority(100); + g_globals->_player._frame = 1; + g_globals->_player.setPosition(Common::Point(200, 68)); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 3: scene->_soundHandler.play(157); - _globals->_player._moveDiff = Common::Point(1, 1); - _globals->_player.setAction(&scene->_action4); - _globals->_player._uiEnabled = true; + g_globals->_player._moveDiff = Common::Point(1, 1); + g_globals->_player.setAction(&scene->_action4); + g_globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); remove(); break; } } void Scene2230::Action3::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { - _globals->_player.setAction(NULL); - _globals->_player._moveDiff = Common::Point(5, 3); - _globals->_player.setStrip2(_globals->_player._strip); + g_globals->_player.setAction(NULL); + g_globals->_player._moveDiff = Common::Point(5, 3); + g_globals->_player.setStrip2(g_globals->_player._strip); Common::Point pt(190, 74); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); scene->_soundHandler.stop(); break; } case 1: - _globals->_player._strip = 3; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player._strip = 3; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: - _globals->_player._regionBitList |= 0x80; + g_globals->_player._regionBitList |= 0x80; scene->_field30A = 0; - _globals->_player.setVisage(0); - _globals->_player.setStrip2(-1); - _globals->_player.fixPriority(-1); - _globals->_player.setPosition(Common::Point(164, 96)); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._canWalk = true; + g_globals->_player.setVisage(0); + g_globals->_player.setStrip2(-1); + g_globals->_player.fixPriority(-1); + g_globals->_player.setPosition(Common::Point(164, 96)); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player._canWalk = true; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); remove(); } } @@ -3276,16 +3278,16 @@ void Scene2230::Action3::signal() { void Scene2230::Action4::signal() { switch (_actionIndex++) { case 0: - Common::Point pt(190 + _globals->_randomSource.getRandomNumber(9), 68); + Common::Point pt(190 + g_globals->_randomSource.getRandomNumber(9), 68); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); _actionIndex = 0; break; } } void Scene2230::Action5::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -3299,22 +3301,22 @@ void Scene2230::Action5::signal() { } break; case 1: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(209, 124); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: - _globals->_player.fixPriority(1430); - _globals->_player.setVisage(2232); - _globals->_player._strip = 1; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.fixPriority(1430); + g_globals->_player.setVisage(2232); + g_globals->_player._strip = 1; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_5, this); break; case 3: - _globals->_events.setCursor(CURSOR_USE); - _globals->_player._uiEnabled = true; + g_globals->_events.setCursor(CURSOR_USE); + g_globals->_player._uiEnabled = true; scene->_field30A = 2; remove(); break; @@ -3322,32 +3324,32 @@ void Scene2230::Action5::signal() { } void Scene2230::Action6::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player._strip = 2; - _globals->_player._frame = 1; - _globals->_player.fixPriority(-1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player._strip = 2; + g_globals->_player._frame = 1; + g_globals->_player.fixPriority(-1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 1: scene->_field30A = 0; - _globals->_player.setVisage(0); - _globals->_player._strip = 1; - _globals->_player._canWalk = true; - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setVisage(0); + g_globals->_player._strip = 1; + g_globals->_player._canWalk = true; + g_globals->_player.animate(ANIM_MODE_1, NULL); remove(); break; } } void Scene2230::Action7::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); switch (scene->_field30A) { case 1: @@ -3364,7 +3366,7 @@ void Scene2230::Action7::signal() { case 1: { Common::Point pt(140, 119); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: { @@ -3387,23 +3389,23 @@ void Scene2230::Action7::signal() { scene->_hotspot8._frame = 2; break; case 4: - _globals->_sceneItems.push_front(&scene->_hotspot10); - _globals->_sceneItems.push_front(&scene->_hotspot11); - _globals->_sceneItems.push_front(&scene->_hotspot12); + g_globals->_sceneItems.push_front(&scene->_hotspot10); + g_globals->_sceneItems.push_front(&scene->_hotspot11); + g_globals->_sceneItems.push_front(&scene->_hotspot12); scene->_hotspot2.remove(); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene2230::Action8::signal() { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); switch (scene->_field30A) { case 1: @@ -3420,13 +3422,13 @@ void Scene2230::Action8::signal() { case 1: { Common::Point pt(140, 119); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: { - _globals->_sceneItems.remove(&scene->_hotspot10); - _globals->_sceneItems.remove(&scene->_hotspot11); - _globals->_sceneItems.remove(&scene->_hotspot12); + g_globals->_sceneItems.remove(&scene->_hotspot10); + g_globals->_sceneItems.remove(&scene->_hotspot11); + g_globals->_sceneItems.remove(&scene->_hotspot12); switch (scene->_field30A) { case 1: @@ -3462,7 +3464,7 @@ void Scene2230::Action8::signal() { } case 5: scene->_hotspot8.setStrip2(1); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; @@ -3473,7 +3475,7 @@ void Scene2230::Action8::signal() { /*--------------------------------------------------------------------------*/ void Scene2230::Hotspot1::doAction(int action) { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -3491,13 +3493,13 @@ void Scene2230::Hotspot1::doAction(int action) { void Scene2230::Hotspot3::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(4)) + if (g_globals->getFlag(4)) SceneItem::display2(2230, 1); else { SceneItem::display2(2230, 1); SceneItem::display2(2230, 2); SceneItem::display2(2230, 3); - _globals->setFlag(4); + g_globals->setFlag(4); } break; default: @@ -3509,14 +3511,14 @@ void Scene2230::Hotspot3::doAction(int action) { void Scene2230::Hotspot4::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(30)) + if (g_globals->getFlag(30)) SceneItem::display2(2230, 6); - else if (_globals->getFlag(29)) { + else if (g_globals->getFlag(29)) { SceneItem::display2(2230, 5); - _globals->setFlag(30); + g_globals->setFlag(30); } else { SceneItem::display2(2230, 4); - _globals->setFlag(29); + g_globals->setFlag(29); } break; case CURSOR_USE: @@ -3531,10 +3533,10 @@ void Scene2230::Hotspot4::doAction(int action) { void Scene2230::Hotspot5::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(5)) + if (g_globals->getFlag(5)) SceneItem::display2(2230, 9); else { - _globals->setFlag(5); + g_globals->setFlag(5); SceneItem::display2(2230, 8); } break; @@ -3545,21 +3547,21 @@ void Scene2230::Hotspot5::doAction(int action) { } void Scene2230::Hotspot6::doAction(int action) { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(6)) + if (g_globals->getFlag(6)) SceneItem::display2(2230, 11); else { - _globals->setFlag(6); + g_globals->setFlag(6); SceneItem::display2(2230, 10); } break; case CURSOR_USE: if (scene->_field30A == 1) scene->setAction(&scene->_action3); - else if (_globals->getFlag(13)) + else if (g_globals->getFlag(13)) SceneItem::display2(2230, 28); else scene->setAction(&scene->_action2); @@ -3571,21 +3573,21 @@ void Scene2230::Hotspot6::doAction(int action) { } void Scene2230::Hotspot7::doAction(int action) { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(7)) + if (g_globals->getFlag(7)) SceneItem::display2(2230, 13); else { - _globals->setFlag(6); + g_globals->setFlag(6); SceneItem::display2(2230, 12); } break; case CURSOR_USE: if (scene->_field30A == 2) scene->setAction(&scene->_action6); - else if (_globals->getFlag(13)) + else if (g_globals->getFlag(13)) SceneItem::display2(2230, 29); else scene->setAction(&scene->_action5); @@ -3597,22 +3599,22 @@ void Scene2230::Hotspot7::doAction(int action) { } void Scene2230::Hotspot8::doAction(int action) { - Scene2230 *scene = (Scene2230 *)_globals->_sceneManager._scene; + Scene2230 *scene = (Scene2230 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: if (scene->_hotspot8._strip == 1) { - if (_globals->getFlag(22)) + if (g_globals->getFlag(22)) SceneItem::display2(2230, 19); else { - _globals->setFlag(22); + g_globals->setFlag(22); SceneItem::display2(2230, 14); } } else { - if (_globals->getFlag(25)) + if (g_globals->getFlag(25)) SceneItem::display2(2230, 21); else { - _globals->setFlag(25); + g_globals->setFlag(25); SceneItem::display2(2230, 20); } } @@ -3632,10 +3634,10 @@ void Scene2230::Hotspot8::doAction(int action) { void Scene2230::Hotspot10::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(26)) + if (g_globals->getFlag(26)) SceneItem::display2(2230, 25); else { - _globals->setFlag(26); + g_globals->setFlag(26); SceneItem::display2(2230, 24); } break; @@ -3651,10 +3653,10 @@ void Scene2230::Hotspot10::doAction(int action) { void Scene2230::Hotspot11::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(27)) + if (g_globals->getFlag(27)) SceneItem::display2(2230, 23); else { - _globals->setFlag(27); + g_globals->setFlag(27); SceneItem::display2(2230, 22); } break; @@ -3670,10 +3672,10 @@ void Scene2230::Hotspot11::doAction(int action) { void Scene2230::Hotspot12::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(28)) + if (g_globals->getFlag(28)) SceneItem::display2(2230, 27); else { - _globals->setFlag(28); + g_globals->setFlag(28); SceneItem::display2(2230, 26); } break; @@ -3714,17 +3716,17 @@ void Scene2230::postInit(SceneObjectList *OwnerList) { _rect1 = Rect(59, 64, 89, 74); - _globals->_player.postInit(); - _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0); - _globals->_player.animate(ANIM_MODE_1, 0); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(80, 80)); - _globals->_player._moveDiff.y = 3; - _globals->_player._regionBitList |= 0x80; - _globals->_player.changeZoom(-1); + g_globals->_player.postInit(); + g_globals->_player.setVisage(g_globals->getFlag(13) ? 2170 : 0); + g_globals->_player.animate(ANIM_MODE_1, 0); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(80, 80)); + g_globals->_player._moveDiff.y = 3; + g_globals->_player._regionBitList |= 0x80; + g_globals->_player.changeZoom(-1); _field30A = 0; - _globals->_player.enableControl(); + g_globals->_player.enableControl(); _hotspot5.setBounds(Rect(108, 34, 142, 76)); _hotspot4.setBounds(Rect(92, 14, 106, 57)); @@ -3735,11 +3737,11 @@ void Scene2230::postInit(SceneObjectList *OwnerList) { _hotspot11.setBounds(Rect(158, 109, 164, 115)); _hotspot12.setBounds(Rect(170, 109, 177, 115)); - _globals->_sceneItems.addItems(&_hotspot8, &_hotspot5, &_hotspot4, &_hotspot6, &_hotspot7, + g_globals->_sceneItems.addItems(&_hotspot8, &_hotspot5, &_hotspot4, &_hotspot6, &_hotspot7, &_hotspot1, &_hotspot3, NULL); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; } void Scene2230::synchronize(Serializer &s) { @@ -3752,7 +3754,7 @@ void Scene2230::dispatch() { Scene::dispatch(); if (!_action) { - if (_rect1.contains(_globals->_player._position)) + if (_rect1.contains(g_globals->_player._position)) setAction(&_action1); } } @@ -3763,14 +3765,14 @@ void Scene2230::dispatch() { *--------------------------------------------------------------------------*/ void Scene2280::Action1::signal() { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(192, 97); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: @@ -3780,90 +3782,90 @@ void Scene2280::Action1::signal() { case 2: { Common::Point pt(218, 87); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 3: - _globals->_player.setStrip(3); + g_globals->_player.setStrip(3); setDelay(10); break; case 4: - _globals->_player.fixPriority(1); + g_globals->_player.fixPriority(1); scene->_soundHandler.play(162); scene->_hotspot16.animate(ANIM_MODE_6, this); break; case 5: - _globals->_sceneManager.changeScene(7000); + g_globals->_sceneManager.changeScene(7000); break; } } void Scene2280::Action2::signal() { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(94, 117); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: scene->_soundHandler.play(265); - _globals->_player.setVisage(2162); - _globals->_player._frame = 1; - _globals->_player._strip = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2162); + g_globals->_player._frame = 1; + g_globals->_player._strip = 1; + g_globals->_player.animate(ANIM_MODE_5, this); scene->_hotspot8.remove(); scene->_hotspot10.remove(); break; case 2: - _globals->_player._frame = 1; - _globals->_player._strip = 2; - _globals->_player.animate(ANIM_MODE_4, 3, 1, this); + g_globals->_player._frame = 1; + g_globals->_player._strip = 2; + g_globals->_player.animate(ANIM_MODE_4, 3, 1, this); break; case 3: - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.animate(ANIM_MODE_5, this); scene->_hotspot12.remove(); break; case 4: scene->_soundHandler.play(266); - _globals->_player.setVisage(2170); - _globals->_player._frame = 1; - _globals->_player._strip = 4; - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._moveDiff = Common::Point(4, 1); + g_globals->_player.setVisage(2170); + g_globals->_player._frame = 1; + g_globals->_player._strip = 4; + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player._moveDiff = Common::Point(4, 1); - _globals->setFlag(13); + g_globals->setFlag(13); SceneItem::display2(2280, 37); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene2280::Action3::signal() { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(94, 117); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: scene->_soundHandler.play(265); - _globals->_player.setVisage(2162); - _globals->_player._frame = 6; - _globals->_player._strip = 2; - _globals->_player.animate(ANIM_MODE_4, 3, -1, this); + g_globals->_player.setVisage(2162); + g_globals->_player._frame = 6; + g_globals->_player._strip = 2; + g_globals->_player.animate(ANIM_MODE_4, 3, -1, this); break; case 2: scene->_hotspot12.postInit(); @@ -3873,13 +3875,13 @@ void Scene2280::Action3::signal() { scene->_hotspot12.setPosition(Common::Point(88, 76)); scene->_hotspot12.fixPriority(1); - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 3: - _globals->_player._strip = 1; - _globals->_player._frame = 12; + g_globals->_player._strip = 1; + g_globals->_player._frame = 12; - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 4: scene->_hotspot8.postInit(); @@ -3900,22 +3902,22 @@ void Scene2280::Action3::signal() { scene->_hotspot10.changeZoom(100); scene->_hotspot10.fixPriority(1); - _globals->clearFlag(13); + g_globals->clearFlag(13); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._strip = 4; - _globals->_player._moveDiff = Common::Point(3, 5); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player._strip = 4; + g_globals->_player._moveDiff = Common::Point(3, 5); SceneItem::display2(2280, 38); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene2280::Action4::signal() { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { @@ -3924,24 +3926,24 @@ void Scene2280::Action4::signal() { case 51: { Common::Point pt(163, 67); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 6: case 50: { Common::Point pt(173, 63); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } } break; } case 1: - _globals->_player.setVisage(2161); - _globals->_player._strip = 1; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2161); + g_globals->_player._strip = 1; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: switch (_state) { @@ -3964,7 +3966,7 @@ void Scene2280::Action4::signal() { scene->_hotspot17.fixPriority(1); RING_INVENTORY._medkit._sceneNumber = 2280; - _globals->_sceneItems.push_front(&scene->_hotspot17); + g_globals->_sceneItems.push_front(&scene->_hotspot17); break; case 51: scene->_hotspot18.postInit(); @@ -3977,17 +3979,17 @@ void Scene2280::Action4::signal() { scene->_hotspot18.fixPriority(1); RING_INVENTORY._scanner._sceneNumber = 2280; - _globals->_sceneItems.push_front(&scene->_hotspot18); + g_globals->_sceneItems.push_front(&scene->_hotspot18); break; } - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 3: - _globals->_player.enableControl(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._strip = 2; + g_globals->_player.enableControl(); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player._strip = 2; remove(); break; @@ -3997,24 +3999,24 @@ void Scene2280::Action4::signal() { /*--------------------------------------------------------------------------*/ void Scene2280::Hotspot1::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(16)) + if (g_globals->getFlag(16)) SceneItem::display2(2280, 22); else { - _globals->setFlag(16); + g_globals->setFlag(16); SceneItem::display2(2230, 21); } break; case CURSOR_USE: - if (!_globals->getFlag(15)) + if (!g_globals->getFlag(15)) SceneItem::display2(2280, 23); - else if (!_globals->getFlag(13)) + else if (!g_globals->getFlag(13)) SceneItem::display2(2280, 46); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action1); } break; @@ -4027,10 +4029,10 @@ void Scene2280::Hotspot1::doAction(int action) { void Scene2280::Hotspot2::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(2)) + if (g_globals->getFlag(2)) SceneItem::display2(2280, 1); else { - _globals->setFlag(2); + g_globals->setFlag(2); SceneItem::display2(2280, 0); } break; @@ -4046,10 +4048,10 @@ void Scene2280::Hotspot2::doAction(int action) { void Scene2280::Hotspot4::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(21)) + if (g_globals->getFlag(21)) SceneItem::display2(2280, 33); else { - _globals->setFlag(21); + g_globals->setFlag(21); SceneItem::display2(2280, 32); } break; @@ -4063,31 +4065,31 @@ void Scene2280::Hotspot4::doAction(int action) { } void Scene2280::Hotspot7::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2280, 24); break; case OBJECT_SCANNER: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2280, 43); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_action4._state = 51; - _globals->_events.setCursor(CURSOR_WALK); - _globals->_events._currentCursor = CURSOR_700; + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_events._currentCursor = CURSOR_700; scene->setAction(&scene->_action4); } break; case OBJECT_MEDKIT: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2280, 43); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_action4._state = 50; - _globals->_events.setCursor(CURSOR_WALK); - _globals->_events._currentCursor = CURSOR_700; + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_events._currentCursor = CURSOR_700; scene->setAction(&scene->_action4); } break; @@ -4098,14 +4100,14 @@ void Scene2280::Hotspot7::doAction(int action) { } void Scene2280::Hotspot8::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2280, 3); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action2); break; default: @@ -4115,14 +4117,14 @@ void Scene2280::Hotspot8::doAction(int action) { } void Scene2280::Hotspot10::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2280, 4); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action2); break; default: @@ -4132,14 +4134,14 @@ void Scene2280::Hotspot10::doAction(int action) { } void Scene2280::Hotspot12::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2280, 11); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action2); break; default: @@ -4149,15 +4151,15 @@ void Scene2280::Hotspot12::doAction(int action) { } void Scene2280::Hotspot14::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2280, 3); break; case CURSOR_USE: - _globals->_player.disableControl(); - if (_globals->getFlag(13)) + g_globals->_player.disableControl(); + if (g_globals->getFlag(13)) scene->setAction(&scene->_action3); else scene->setAction(&scene->_action2); @@ -4169,22 +4171,22 @@ void Scene2280::Hotspot14::doAction(int action) { } void Scene2280::Hotspot17::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(18)) + if (g_globals->getFlag(18)) SceneItem::display2(2280, 26); else { - _globals->setFlag(18); + g_globals->setFlag(18); SceneItem::display2(2280, 25); } break; case CURSOR_USE: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2280, 29); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_action4._state = 6; scene->setAction(&scene->_action4); } @@ -4196,22 +4198,22 @@ void Scene2280::Hotspot17::doAction(int action) { } void Scene2280::Hotspot18::doAction(int action) { - Scene2280 *scene = (Scene2280 *)_globals->_sceneManager._scene; + Scene2280 *scene = (Scene2280 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(19)) + if (g_globals->getFlag(19)) SceneItem::display2(2280, 28); else { - _globals->setFlag(19); + g_globals->setFlag(19); SceneItem::display2(2280, 27); } break; case CURSOR_USE: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2280, 29); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_action4._state = 1; scene->setAction(&scene->_action4); } @@ -4252,7 +4254,7 @@ void Scene2280::postInit(SceneObjectList *OwnerList) { _hotspot17.setPosition(Common::Point(162, 39)); _hotspot17.fixPriority(1); - _globals->_sceneItems.push_back(&_hotspot17); + g_globals->_sceneItems.push_back(&_hotspot17); } if (RING_INVENTORY._scanner._sceneNumber == 2280) { @@ -4263,10 +4265,10 @@ void Scene2280::postInit(SceneObjectList *OwnerList) { _hotspot17.setPosition(Common::Point(152, 43)); _hotspot17.fixPriority(1); - _globals->_sceneItems.push_back(&_hotspot17); + g_globals->_sceneItems.push_back(&_hotspot17); } - if (!_globals->getFlag(13)) { + if (!g_globals->getFlag(13)) { _hotspot8.postInit(); _hotspot8.setVisage(2280); _hotspot8._strip = 2; @@ -4287,7 +4289,7 @@ void Scene2280::postInit(SceneObjectList *OwnerList) { _hotspot12.setPosition(Common::Point(88, 76)); _hotspot12.fixPriority(1); - _globals->_sceneItems.addItems(&_hotspot8, &_hotspot10, &_hotspot12, NULL); + g_globals->_sceneItems.addItems(&_hotspot8, &_hotspot10, &_hotspot12, NULL); } _hotspot14.setBounds(Rect(70, 50, 90, 104)); @@ -4320,47 +4322,47 @@ void Scene2280::postInit(SceneObjectList *OwnerList) { _exitRect = Rect(145, 180, 195, 195); - _globals->_player.postInit(); - _globals->_player.setVisage(_globals->getFlag(13) ? 2170 : 0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(146, 161)); - _globals->_player.changeZoom(-1); - _globals->_player._moveDiff = Common::Point(4, 3); + g_globals->_player.postInit(); + g_globals->_player.setVisage(g_globals->getFlag(13) ? 2170 : 0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(146, 161)); + g_globals->_player.changeZoom(-1); + g_globals->_player._moveDiff = Common::Point(4, 3); - if ((_globals->_sceneManager._previousScene != 7300) && (_globals->_sceneManager._previousScene != 7000)) { - _globals->_player.enableControl(); + if ((g_globals->_sceneManager._previousScene != 7300) && (g_globals->_sceneManager._previousScene != 7000)) { + g_globals->_player.enableControl(); } else { - _globals->setFlag(109); - _globals->_player.fixPriority(76); - _globals->_player.disableControl(); + g_globals->setFlag(109); + g_globals->_player.fixPriority(76); + g_globals->_player.disableControl(); _sceneMode = 2281; - setAction(&_sequenceManager, this, 2281, &_globals->_player, &_hotspot16, NULL); + setAction(&_sequenceManager, this, 2281, &g_globals->_player, &_hotspot16, NULL); - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); } - _globals->_sceneItems.addItems(&_hotspot13, &_hotspot11, &_hotspot9, &_hotspot14, &_hotspot7, + g_globals->_sceneItems.addItems(&_hotspot13, &_hotspot11, &_hotspot9, &_hotspot14, &_hotspot7, &_hotspot6, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot1, &_hotspot16, &_hotspot15, NULL); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; } void Scene2280::signal() { if (_sceneMode == 2281) { - _globals->_player.fixPriority(-1); - _globals->_player.enableControl(); + g_globals->_player.fixPriority(-1); + g_globals->_player.enableControl(); } } void Scene2280::dispatch() { Scene::dispatch(); if (!_action) { - if (_exitRect.contains(_globals->_player._position)) - _globals->_sceneManager.changeScene(2150); + if (_exitRect.contains(g_globals->_player._position)) + g_globals->_sceneManager.changeScene(2150); } } @@ -4376,7 +4378,7 @@ void Scene2280::synchronize(Serializer &s) { void Scene2300::Action1::signal() { // Quinn and Seeker - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -4403,8 +4405,8 @@ void Scene2300::Action1::signal() { } case 3: setDelay(2); - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_player._uiEnabled = true; + g_globals->_events.setCursor(CURSOR_WALK); break; case 4: { scene->_hotspot5.setVisage(93); @@ -4429,23 +4431,23 @@ void Scene2300::Action1::signal() { } case 6: scene->_soundHandler1.play(28); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_hotspot2.setVisage(40); scene->_hotspot2.setStrip(4); scene->_hotspot2.setFrame(1); scene->_hotspot2.animate(ANIM_MODE_5, NULL); - _globals->_player.setVisage(40); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(40); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 7: - _globals->_soundHandler.play(77, this); + g_globals->_soundHandler.play(77, this); break; case 8: - _globals->_game->endGame(2300, 0); + g_globals->_game->endGame(2300, 0); remove(); break; case 9: @@ -4457,17 +4459,17 @@ void Scene2300::Action1::signal() { scene->_hotspot5.animate(ANIM_MODE_NONE, NULL); scene->_hotspot6.animate(ANIM_MODE_NONE, NULL); - _globals->_player.disableControl(); - _globals->_player.setVisage(2672); - _globals->_player._strip = 5; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.disableControl(); + g_globals->_player.setVisage(2672); + g_globals->_player._strip = 5; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_5, this); break; case 10: - _globals->_player.setVisage(2674); - _globals->_player._strip = 5; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2674); + g_globals->_player._strip = 5; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_5, this); break; case 11: scene->_soundHandler1.play(28); @@ -4481,17 +4483,17 @@ void Scene2300::Action1::signal() { scene->_hotspot5.fixPriority(20); scene->_hotspot6.fixPriority(20); - _globals->_player.setVisage(2672); - _globals->_player._strip = 5; - _globals->_player._frame = _globals->_player.getFrameCount(); - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.setVisage(2672); + g_globals->_player._strip = 5; + g_globals->_player._frame = g_globals->_player.getFrameCount(); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 12: scene->_soundHandler1.play(77); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(4); - _globals->_player._uiEnabled = false; + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setStrip(4); + g_globals->_player._uiEnabled = false; setDelay(60); break; case 13: @@ -4504,7 +4506,7 @@ void Scene2300::Action1::signal() { case 15: { Common::Point pt1(101, 148); PlayerMover *mover1 = new PlayerMover(); - _globals->_player.addMover(mover1, &pt1, this); + g_globals->_player.addMover(mover1, &pt1, this); Common::Point pt2(scene->_hotspot5._position.x + 5, scene->_hotspot5._position.y + 5); NpcMover *mover2 = new NpcMover(); @@ -4512,7 +4514,7 @@ void Scene2300::Action1::signal() { break; } case 16: - _globals->_sceneManager.changeScene(2000); + g_globals->_sceneManager.changeScene(2000); remove(); break; } @@ -4520,29 +4522,29 @@ void Scene2300::Action1::signal() { void Scene2300::Action2::signal() { // Miranda tearing cables - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(30); break; case 1: { Common::Point pt(153, 135); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(2030, this); break; case 3: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); setDelay(600); break; case 4: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_hotspot2.postInit(); scene->_hotspot2.setVisage(2801); @@ -4580,34 +4582,34 @@ void Scene2300::Action2::signal() { scene->_stripManager.start(2035, this); break; case 10: - _globals->_sceneManager.changeScene(2310); + g_globals->_sceneManager.changeScene(2310); break; } } void Scene2300::Action3::signal() { // Stunned Miranda - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { Common::Point pt(153, 135); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: - _globals->_player.disableControl(); - _globals->_player.setVisage(2672); - _globals->_player._strip = 2; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.disableControl(); + g_globals->_player.setVisage(2672); + g_globals->_player._strip = 2; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: - _globals->_player.setVisage(2674); - _globals->_player._strip = 2; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2674); + g_globals->_player._strip = 2; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_5, this); break; case 3: scene->_soundHandler1.play(97); @@ -4617,30 +4619,30 @@ void Scene2300::Action3::signal() { scene->_hotspot7._frame = 1; scene->_hotspot7.animate(ANIM_MODE_5, this); - _globals->_player.setVisage(2672); - _globals->_player._strip = 2; - _globals->_player._frame = _globals->_player.getFrameCount(); - _globals->_player.animate(ANIM_MODE_6, NULL); + g_globals->_player.setVisage(2672); + g_globals->_player._strip = 2; + g_globals->_player._frame = g_globals->_player.getFrameCount(); + g_globals->_player.animate(ANIM_MODE_6, NULL); break; case 4: scene->_soundHandler2.play(97); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(1); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setStrip(1); scene->_stripManager.start(2034, this); break; case 5: setDelay(10); break; case 6: - _globals->_sceneManager.changeScene(2310); + g_globals->_sceneManager.changeScene(2310); break; } } void Scene2300::Action4::signal() { // Ennemies coming - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -4679,12 +4681,12 @@ void Scene2300::Action4::signal() { void Scene2300::Hotspot5::doAction(int action) { // Ennemies - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: - _globals->_player.disableControl(); - _globals->_player.addMover(NULL); + g_globals->_player.disableControl(); + g_globals->_player.addMover(NULL); scene->_action1.setActionIndex(9); scene->_action1.setDelay(1); break; @@ -4702,7 +4704,7 @@ void Scene2300::Hotspot5::doAction(int action) { void Scene2300::Hotspot7::doAction(int action) { // Miranda - Scene2300 *scene = (Scene2300 *)_globals->_sceneManager._scene; + Scene2300 *scene = (Scene2300 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: @@ -4747,8 +4749,8 @@ void Scene2300::postInit(SceneObjectList *OwnerList) { _hotspot8.setVisage(2301); _hotspot8.setPosition(Common::Point(288, 74)); - _globals->_soundHandler.play(96); - if (_globals->_sceneManager._previousScene == 2000) { + g_globals->_soundHandler.play(96); + if (g_globals->_sceneManager._previousScene == 2000) { _hotspot8.remove(); _hotspot9.postInit(); @@ -4764,13 +4766,13 @@ void Scene2300::postInit(SceneObjectList *OwnerList) { _hotspot10._frame = _hotspot10.getFrameCount(); _hotspot10.setPosition(Common::Point(292, 113)); - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.setPosition(Common::Point(109, 139)); - _globals->_player.changeZoom(40); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(0); + g_globals->_player.setPosition(Common::Point(109, 139)); + g_globals->_player.changeZoom(40); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.disableControl(); _hotspot7.postInit(); _hotspot7.setVisage(2302); @@ -4780,7 +4782,7 @@ void Scene2300::postInit(SceneObjectList *OwnerList) { _soundHandler1.play(95); _soundHandler2.play(96); - _globals->_sceneItems.push_back(&_hotspot7); + g_globals->_sceneItems.push_back(&_hotspot7); setAction(&_action2); } else { @@ -4805,13 +4807,13 @@ void Scene2300::postInit(SceneObjectList *OwnerList) { _hotspot1.setPosition(Common::Point(255, 190)); _hotspot1.changeZoom(40); - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.setPosition(Common::Point(203, 191)); - _globals->_player.changeZoom(40); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(0); + g_globals->_player.setPosition(Common::Point(203, 191)); + g_globals->_player.changeZoom(40); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.disableControl(); _hotspot5.postInit(); _hotspot5.setVisage(91); @@ -4827,7 +4829,7 @@ void Scene2300::postInit(SceneObjectList *OwnerList) { _hotspot6.changeZoom(40); _hotspot6.setObjectWrapper(new SceneObjectWrapper()); - _globals->_sceneItems.push_back(&_hotspot5); + g_globals->_sceneItems.push_back(&_hotspot5); setAction(&_action1); } @@ -4837,7 +4839,7 @@ void Scene2300::postInit(SceneObjectList *OwnerList) { _hotspot14._sceneRegionId = 11; _hotspot15.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _globals->_sceneItems.addItems(&_hotspot12, &_hotspot11, &_hotspot13, &_hotspot14, &_hotspot15, NULL); + g_globals->_sceneItems.addItems(&_hotspot12, &_hotspot11, &_hotspot13, &_hotspot14, &_hotspot15, NULL); } /*-------------------------------------------------------------------------- @@ -4891,20 +4893,20 @@ void Scene2310::postInit(SceneObjectList *OwnerList) { _wireList[idx].setPosition(pointList[idx]); } - _globals->_player.disableControl(); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.disableControl(); + g_globals->_events.setCursor(CURSOR_WALK); - if (_vm->getFeatures() & GF_CD) - _pageIndex = _globals->_randomSource.getRandomNumber(14) + 2; + if (g_vm->getFeatures() & GF_CD) + _pageIndex = g_globals->_randomSource.getRandomNumber(14) + 2; else - _pageIndex = _globals->_randomSource.getRandomNumber(19) + 1; + _pageIndex = g_globals->_randomSource.getRandomNumber(19) + 1; signal(); } void Scene2310::signal() { switch (_sceneMode++) { case 0: { - Common::String fmtString = _resourceManager->getMessage(2300, 22); + Common::String fmtString = g_resourceManager->getMessage(2300, 22); Common::String msg = Common::String::format(fmtString.c_str(), _pageList[_pageIndex]._pageNumber); _sceneText._width = 280; @@ -4917,18 +4919,18 @@ void Scene2310::signal() { break; } case 1: { - Common::String msg = _resourceManager->getMessage(2300, 23); + Common::String msg = g_resourceManager->getMessage(2300, 23); _sceneText.setup(msg); _sceneText.fixPriority(255); _sceneText.setPosition(Common::Point(30, 170)); - _globals->_sceneObjects->draw(); - _globals->_events.waitForPress(); + g_globals->_sceneObjects->draw(); + g_globals->_events.waitForPress(); _sceneText.hide(); - _globals->_sceneObjects->draw(); + g_globals->_sceneObjects->draw(); - _globals->_sceneManager.changeScene(2200); + g_globals->_sceneManager.changeScene(2200); break; } } @@ -4964,11 +4966,11 @@ void Scene2310::process(Event &event) { if (idx != 5) { _wireList[idx].hide(); - _globals->_sceneObjects->draw(); + g_globals->_sceneObjects->draw(); _wireList[idx].setFrame(frameNum); _wireList[idx].show(); - _globals->_sceneObjects->draw(); + g_globals->_sceneObjects->draw(); } } else { // End the moving of the currently active wire @@ -5001,7 +5003,7 @@ void Scene2310::process(Event &event) { void Scene2310::dispatch() { if (_wireIndex != 5) { for (int idx = 0; idx < 5; ++idx) { - if (_rectList[idx].contains(_globals->_events._mousePos)) { + if (_rectList[idx].contains(g_globals->_events._mousePos)) { _wireList[_wireIndex].setFrame(idx + 2); return; } @@ -5026,12 +5028,12 @@ int Scene2310::findObject(int objIndex) { *--------------------------------------------------------------------------*/ void Scene2320::Action1::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(10); - if (_globals->_sceneManager._previousScene == 2120) + if (g_globals->_sceneManager._previousScene == 2120) _actionIndex = 3; break; case 1: { @@ -5058,7 +5060,7 @@ void Scene2320::Action1::signal() { } void Scene2320::Action2::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { @@ -5078,13 +5080,13 @@ void Scene2320::Action2::signal() { } void Scene2320::Action3::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { Common::Point pt(320, 86); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 1: @@ -5094,12 +5096,12 @@ void Scene2320::Action3::signal() { case 2: { Common::Point pt(320, 79); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 3: - _globals->_player.fixPriority(scene->_hotspot6._priority - 1); - _globals->_player._strip = 3; + g_globals->_player.fixPriority(scene->_hotspot6._priority - 1); + g_globals->_player._strip = 3; setDelay(10); break; case 4: @@ -5110,12 +5112,12 @@ void Scene2320::Action3::signal() { scene->_area3.draw(true); _state = 0; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); - while (!_state && !_vm->getEventManager()->shouldQuit()) { + while (!_state && !g_vm->shouldQuit()) { // Wait for an event Event event; - if (!_globals->_events.getEvent(event)) { + if (!g_globals->_events.getEvent(event)) { g_system->updateScreen(); g_system->delayMillis(10); continue; @@ -5152,13 +5154,13 @@ void Scene2320::Action3::signal() { break; case 5: { if (_state == 2320) - _globals->_player.fixPriority(-1); + g_globals->_player.fixPriority(-1); else - _globals->_sceneManager.changeScene(_state); + g_globals->_sceneManager.changeScene(_state); Common::Point pt(320, 86); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 6: @@ -5166,7 +5168,7 @@ void Scene2320::Action3::signal() { scene->_hotspot6.animate(ANIM_MODE_6, this); break; case 7: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -5174,28 +5176,28 @@ void Scene2320::Action3::signal() { void Scene2320::Action4::signal() { // Fly Cycle actions - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: { Common::Point pt(213, 84); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: case 16: - _globals->_player.setVisage(2109); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2109); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 3: - _globals->_player.animate(ANIM_MODE_6, NULL); + g_globals->_player.animate(ANIM_MODE_6, NULL); setAction(&scene->_action2, this); break; case 4: { @@ -5220,63 +5222,63 @@ void Scene2320::Action4::signal() { } case 6: { scene->_hotspot16.fixPriority(-1); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); Common::Point pt(233, 176); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 7: { Common::Point pt(291, 194); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 8: - _globals->_player.setStrip(5); - _globals->_player.setFrame(1); + g_globals->_player.setStrip(5); + g_globals->_player.setFrame(1); setDelay(13); break; case 9: // Quinn sits in the flycycle scene->_hotspot16.hide(); - _globals->_player.setVisage(2323); - _globals->_player.setPosition(Common::Point(303, 176)); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2323); + g_globals->_player.setPosition(Common::Point(303, 176)); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 10: - if (_globals->getFlag(109)) { - _globals->_soundHandler.play(40); - _globals->_soundHandler.holdAt(true); + if (g_globals->getFlag(109)) { + g_globals->_soundHandler.play(40); + g_globals->_soundHandler.holdAt(true); Common::Point pt(303, 240); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); } else { setDelay(3); } break; case 11: - if (_globals->getFlag(109)) { - _globals->_sceneManager.changeScene(7600); + if (g_globals->getFlag(109)) { + g_globals->_sceneManager.changeScene(7600); } else { SceneItem::display2(2320, 19); setDelay(3); } break; case 12: - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 13: - _globals->_player.setVisage(0); - _globals->_player.setPosition(Common::Point(291, 194)); - _globals->_player.setStrip(5); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setVisage(0); + g_globals->_player.setPosition(Common::Point(291, 194)); + g_globals->_player.setStrip(5); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_1, NULL); scene->_hotspot16.show(); setDelay(3); @@ -5284,17 +5286,17 @@ void Scene2320::Action4::signal() { case 14: { Common::Point pt(233, 176); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 15: { Common::Point pt(213, 85); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 17: { - _globals->_player.animate(ANIM_MODE_6, NULL); + g_globals->_player.animate(ANIM_MODE_6, NULL); scene->_hotspot16.fixPriority(160); Common::Point pt(320, 121); @@ -5320,9 +5322,9 @@ void Scene2320::Action4::signal() { break; } case 20: - _globals->_player.enableControl(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.enableControl(); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); scene->_hotspot13.fixPriority(1); remove(); @@ -5331,11 +5333,11 @@ void Scene2320::Action4::signal() { } void Scene2320::Action5::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); ADD_PLAYER_MOVER(163, 126); break; case 1: @@ -5345,29 +5347,29 @@ void Scene2320::Action5::signal() { setDelay(2); break; case 3: - if (!_globals->getFlag(59)) + if (!g_globals->getFlag(59)) setDelay(10); else scene->_stripManager.start(2323, this); break; case 4: - _globals->_player.setVisage(2347); - _globals->_player.setStrip(1); - _globals->_player.setFrame(1); - _globals->_player.fixPriority(137); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2347); + g_globals->_player.setStrip(1); + g_globals->_player.setFrame(1); + g_globals->_player.fixPriority(137); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 5: - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 6: - if (_globals->getFlag(72)) - _globals->_sceneManager.changeScene(7000); - else if (_globals->getFlag(59)) - _globals->_sceneManager.changeScene(5000); - else if (!_globals->getFlag(43) || (RING_INVENTORY._ale._sceneNumber != 1)) + if (g_globals->getFlag(72)) + g_globals->_sceneManager.changeScene(7000); + else if (g_globals->getFlag(59)) + g_globals->_sceneManager.changeScene(5000); + else if (!g_globals->getFlag(43) || (RING_INVENTORY._ale._sceneNumber != 1)) setDelay(10); else { scene->_hotspot11.setAction(NULL); @@ -5379,7 +5381,7 @@ void Scene2320::Action5::signal() { NpcMover *mover = new NpcMover(); scene->_hotspot11.addMover(mover, &pt, NULL); - _globals->clearFlag(43); + g_globals->clearFlag(43); scene->_stripManager.start(2325, this); } break; @@ -5387,82 +5389,82 @@ void Scene2320::Action5::signal() { setDelay(10); break; case 8: - _globals->_sceneManager.changeScene(4000); + g_globals->_sceneManager.changeScene(4000); break; } } void Scene2320::Action6::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(30); break; case 1: - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 2: - _globals->_player.setStrip(1); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.setStrip(1); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 3: - _globals->_player.setVisage(0); - _globals->_player.setStrip(3); - _globals->_player.fixPriority(-1); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setVisage(0); + g_globals->_player.setStrip(3); + g_globals->_player.fixPriority(-1); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.animate(ANIM_MODE_1, NULL); setDelay(60); break; case 4: - if ((_globals->_sceneManager._previousScene != 4000) || _globals->getFlag(43)) + if ((g_globals->_sceneManager._previousScene != 4000) || g_globals->getFlag(43)) setDelay(3); - else if (_globals->getFlag(35)) { - _globals->setFlag(43); + else if (g_globals->getFlag(35)) { + g_globals->setFlag(43); scene->_stripManager.start(4200, this); - _globals->setFlag(69); - } else if (_globals->getFlag(36)) { + g_globals->setFlag(69); + } else if (g_globals->getFlag(36)) { setDelay(3); } else { - _globals->setFlag(43); + g_globals->setFlag(43); scene->_stripManager.start(4210, this); break; } break; case 5: - if (_globals->_sceneObjects->contains(&scene->_hotspot11)) { + if (g_globals->_sceneObjects->contains(&scene->_hotspot11)) { scene->_hotspot11.setAction(&scene->_action1); - if (_globals->_sceneObjects->contains(&scene->_hotspot10)) { + if (g_globals->_sceneObjects->contains(&scene->_hotspot10)) { ADD_MOVER(scene->_hotspot10, 491, 160); } else { setDelay(60); } - _globals->_sceneItems.push_front(&scene->_hotspot11); + g_globals->_sceneItems.push_front(&scene->_hotspot11); } else { setDelay(3); } break; case 6: - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player.enableControl(); + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_player.enableControl(); remove(); break; } } void Scene2320::Action7::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(30); break; case 1: - _globals->_soundHandler.play(162); + g_globals->_soundHandler.play(162); scene->_hotspot6.animate(ANIM_MODE_5, this); break; case 2: @@ -5471,8 +5473,8 @@ void Scene2320::Action7::signal() { scene->_hotspot11.fixPriority(-1); ADD_MOVER_NULL(scene->_hotspot11, 346, 85); - _globals->_player.fixPriority(-1); - ADD_MOVER(_globals->_player, 297, 89); + g_globals->_player.fixPriority(-1); + ADD_MOVER(g_globals->_player, 297, 89); break; case 3: ADD_PLAYER_MOVER(462, 182); @@ -5483,17 +5485,17 @@ void Scene2320::Action7::signal() { case 5: ADD_MOVER(scene->_hotspot11, 500, 164); ADD_MOVER(scene->_hotspot10, 382, 93); - _globals->_player.setStrip(3); + g_globals->_player.setStrip(3); break; case 6: ADD_MOVER_NULL(scene->_hotspot10, 491, 160); - ADD_MOVER(_globals->_player, 391, 88); + ADD_MOVER(g_globals->_player, 391, 88); break; case 7: ADD_PLAYER_MOVER(462, 182); break; case 8: - _globals->_player.setStrip(7); + g_globals->_player.setStrip(7); setDelay(15); break; case 9: @@ -5506,14 +5508,14 @@ void Scene2320::Action7::signal() { scene->_stripManager.start(6022, this); break; case 12: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); RING_INVENTORY._stasisBox._sceneNumber = 2320; break; } } void Scene2320::Action8::signal() { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -5523,24 +5525,24 @@ void Scene2320::Action8::signal() { ADD_PLAYER_MOVER(462, 182); break; case 2: - _globals->_player.setStrip(7); + g_globals->_player.setStrip(7); setDelay(5); break; case 3: - scene->_speakerGameText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 30, 10)); - scene->_stripManager.start(_globals->getFlag(75) ? 6030 : 2320, this); + scene->_speakerGameText.setTextPos(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + 30, 10)); + scene->_stripManager.start(g_globals->getFlag(75) ? 6030 : 2320, this); break; case 4: - if (_globals->getFlag(75)) + if (g_globals->getFlag(75)) setDelay(3); else - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 5: RING_INVENTORY._stasisBox._sceneNumber = 2320; scene->_sceneMode = 2326; - scene->_speakerGameText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 30, 10)); - scene->setAction(&scene->_sequenceManager1, scene, 2326, &_globals->_player, &scene->_hotspot11, NULL); + scene->_speakerGameText.setTextPos(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + 30, 10)); + scene->setAction(&scene->_sequenceManager1, scene, 2326, &g_globals->_player, &scene->_hotspot11, NULL); break; } } @@ -5548,16 +5550,16 @@ void Scene2320::Action8::signal() { /*--------------------------------------------------------------------------*/ void Scene2320::Hotspot5::doAction(int action) { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2320, 13); break; case CURSOR_USE: - if (_globals->getFlag(70)) + if (g_globals->getFlag(70)) SceneItem::display2(2320, 33); - else if (_globals->getFlag(13)) + else if (g_globals->getFlag(13)) SceneItem::display2(2320, 18); else scene->setAction(&scene->_action5); @@ -5569,14 +5571,14 @@ void Scene2320::Hotspot5::doAction(int action) { } void Scene2320::Hotspot6::doAction(int action) { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2320, 2); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action3); break; default: @@ -5586,7 +5588,7 @@ void Scene2320::Hotspot6::doAction(int action) { } void Scene2320::Hotspot8::doAction(int action) { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -5594,7 +5596,7 @@ void Scene2320::Hotspot8::doAction(int action) { break; case CURSOR_USE: scene->_sceneMode = 2336; - scene->setAction(&scene->_sequenceManager1, scene, 2336, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 2336, &g_globals->_player, this, NULL); break; default: SceneHotspot::doAction(action); @@ -5604,21 +5606,21 @@ void Scene2320::Hotspot8::doAction(int action) { void Scene2320::Hotspot10::doAction(int action) { // Seeker - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2320, 26); break; case CURSOR_TALK: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 2329; - if (_globals->getFlag(13)) { + if (g_globals->getFlag(13)) { scene->_stripManager.start(2337, scene); - } else if (_globals->getFlag(70)) { + } else if (g_globals->getFlag(70)) { scene->setAction(&scene->_action8); - } else if (_globals->getFlag(109)) { + } else if (g_globals->getFlag(109)) { scene->setAction(&scene->_sequenceManager1, scene, 2337, NULL); } else if (!_state) { ++_state; @@ -5634,29 +5636,29 @@ void Scene2320::Hotspot10::doAction(int action) { } void Scene2320::Hotspot11::doAction(int action) { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2320, 25); break; case CURSOR_TALK: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 2329; - if (_globals->getFlag(13)) { - _globals->_player.disableControl(); + if (g_globals->getFlag(13)) { + g_globals->_player.disableControl(); scene->_sceneMode = 5000; scene->_stripManager.start(2336, scene); - } else if (_globals->getFlag(70)) { + } else if (g_globals->getFlag(70)) { scene->setAction(&scene->_action8); } else { scene->_sceneMode = 2329; if (RING_INVENTORY._ale._sceneNumber == 1) { scene->setAction(&scene->_sequenceManager1, scene, 2329, NULL); - } else if (!_globals->getFlag(110)) { - _globals->setFlag(110); + } else if (!g_globals->getFlag(110)) { + g_globals->setFlag(110); scene->setAction(&scene->_sequenceManager1, scene, 2330, NULL); } else if (RING_INVENTORY._peg._sceneNumber != 1) { scene->setAction(&scene->_sequenceManager1, scene, 2331, NULL); @@ -5675,19 +5677,19 @@ void Scene2320::Hotspot11::doAction(int action) { } void Scene2320::Hotspot12::doAction(int action) { - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2320, 5); break; case CURSOR_USE: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2320, 24); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 2322; - scene->setAction(&scene->_sequenceManager1, scene, 2322, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 2322, &g_globals->_player, NULL); } break; default: @@ -5698,23 +5700,23 @@ void Scene2320::Hotspot12::doAction(int action) { void Scene2320::Hotspot14::doAction(int action) { // Right Console - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2320, 17); break; case CURSOR_USE: - if (_globals->getFlag(24)) { - _globals->clearFlag(24); - _globals->_player.disableControl(); + if (g_globals->getFlag(24)) { + g_globals->clearFlag(24); + g_globals->_player.disableControl(); scene->_hotspot8.postInit(); scene->_hotspot8.setVisage(2345); scene->_hotspot8.setPosition(Common::Point(634, 65)); scene->_hotspot8.hide(); - _globals->_sceneItems.push_front(&scene->_hotspot8); + g_globals->_sceneItems.push_front(&scene->_hotspot8); RING_INVENTORY._waldos._sceneNumber = 2320; scene->_hotspot9.postInit(); @@ -5731,11 +5733,11 @@ void Scene2320::Hotspot14::doAction(int action) { scene->_hotspot16.hide(); scene->_sceneMode = 2324; - scene->setAction(&scene->_sequenceManager1, scene, 2324, &_globals->_player, &scene->_hotspot7, + scene->setAction(&scene->_sequenceManager1, scene, 2324, &g_globals->_player, &scene->_hotspot7, &scene->_hotspot8, &scene->_hotspot9, &scene->_hotspot16, NULL); - } else if (_globals->getFlag(13)) { + } else if (g_globals->getFlag(13)) { SceneItem::display2(2320, 24); - } else if (!_globals->getFlag(76)) { + } else if (!g_globals->getFlag(76)) { SceneItem::display2(2320, 28); } else if (!RING_INVENTORY._waldos._sceneNumber) { SceneItem::display2(2320, 27); @@ -5751,14 +5753,14 @@ void Scene2320::Hotspot14::doAction(int action) { void Scene2320::Hotspot15::doAction(int action) { // Left console (Flycycle console) - Scene2320 *scene = (Scene2320 *)_globals->_sceneManager._scene; + Scene2320 *scene = (Scene2320 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(2320, 16); break; case CURSOR_USE: - if (_globals->getFlag(13)) + if (g_globals->getFlag(13)) SceneItem::display2(2320, 24); else scene->setAction(&scene->_action4); @@ -5806,7 +5808,7 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerGameText); _speakerMText._npc = &_hotspot11; - _speakerQText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; _hotspotPtr = &_hotspot10; _hotspot6.postInit(); @@ -5836,33 +5838,33 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { _hotspot8.setPosition(Common::Point(541, 103)); _hotspot8.fixPriority(201); - _globals->_sceneItems.push_back(&_hotspot8); + g_globals->_sceneItems.push_back(&_hotspot8); } - if (_globals->getFlag(43)) { + if (g_globals->getFlag(43)) { _hotspot11.postInit(); _hotspot11.setVisage(2705); _hotspot11._strip = 3; _hotspot11.setPosition(Common::Point(510, 156)); - _globals->_sceneItems.push_back(&_hotspot11); + g_globals->_sceneItems.push_back(&_hotspot11); _hotspot11._state = 0; _hotspot11.setAction(&_action1); } - _globals->_player.postInit(); - if (_globals->getFlag(13)) - _globals->_player.setVisage(2170); + g_globals->_player.postInit(); + if (g_globals->getFlag(13)) + g_globals->_player.setVisage(2170); else - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(320, 79)); - _globals->_player.fixPriority(10); - _globals->_player.changeZoom(-1); - _globals->_player._moveDiff.y = 3; - _globals->_player.disableControl(); - - if (_globals->getFlag(114)) { + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(320, 79)); + g_globals->_player.fixPriority(10); + g_globals->_player.changeZoom(-1); + g_globals->_player._moveDiff.y = 3; + g_globals->_player.disableControl(); + + if (g_globals->getFlag(114)) { _hotspot10.postInit(); _hotspot10.setVisage(2806); _hotspot10.setPosition(Common::Point(481, 162)); @@ -5870,10 +5872,10 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { _hotspot10.setStrip(5); _hotspot10._state = 0; - _globals->_sceneItems.push_back(&_hotspot10); + g_globals->_sceneItems.push_back(&_hotspot10); } - if (_globals->getFlag(70)) { + if (g_globals->getFlag(70)) { _hotspot11.postInit(); _hotspot11.setVisage(2705); _hotspot11.setPosition(Common::Point(500, 164)); @@ -5884,20 +5886,20 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { _hotspot10.changeZoom(-1); _hotspot10.setStrip(5); - _globals->_sceneItems.addItems(&_hotspot11, &_hotspot10, NULL); + g_globals->_sceneItems.addItems(&_hotspot11, &_hotspot10, NULL); } - switch (_globals->_sceneManager._previousScene) { + switch (g_globals->_sceneManager._previousScene) { case 2120: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); - _globals->_player.fixPriority(-1); - _globals->_player.setPosition(Common::Point(389, 72)); - _globals->_player.enableControl(); + g_globals->_player.fixPriority(-1); + g_globals->_player.setPosition(Common::Point(389, 72)); + g_globals->_player.enableControl(); break; case 4000: - if (!_globals->getFlag(36) && !_globals->getFlag(43)) { + if (!g_globals->getFlag(36) && !g_globals->getFlag(43)) { _hotspot11.postInit(); _hotspot11.setVisage(2705); _hotspot11.setPosition(Common::Point(178, 118)); @@ -5907,25 +5909,25 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { case 4250: case 5000: case 7000: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); - if ((_globals->_sceneManager._previousScene == 7000) && !_globals->getFlag(80)) - _globals->setFlag(36); - - _globals->_player.disableControl(); - _globals->_player.animate(ANIM_MODE_NONE, NULL); - _globals->_player.setObjectWrapper(NULL); - _globals->_player.setVisage(2347); - _globals->_player.setStrip(2); - _globals->_player.setFrame(5); - _globals->_player.fixPriority(137); - _globals->_player.setPosition(Common::Point(165, 132)); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); + if ((g_globals->_sceneManager._previousScene == 7000) && !g_globals->getFlag(80)) + g_globals->setFlag(36); + + g_globals->_player.disableControl(); + g_globals->_player.animate(ANIM_MODE_NONE, NULL); + g_globals->_player.setObjectWrapper(NULL); + g_globals->_player.setVisage(2347); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(5); + g_globals->_player.fixPriority(137); + g_globals->_player.setPosition(Common::Point(165, 132)); setAction(&_action6); break; case 6100: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); _hotspot8.postInit(); _hotspot8.setVisage(2345); @@ -5933,19 +5935,19 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { _hotspot8.hide(); _sceneMode = 2325; - setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL); + setAction(&_sequenceManager1, this, 2325, &g_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL); break; case 7600: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); _soundHandler.play(21); - _globals->_player.setVisage(2323); - _globals->_player.setStrip(2); - _globals->_player.setFrame(_globals->_player.getFrameCount()); - _globals->_player.setPosition(Common::Point(303, 176)); - _globals->_player.fixPriority(-1); - _globals->_player.disableControl(); + g_globals->_player.setVisage(2323); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(g_globals->_player.getFrameCount()); + g_globals->_player.setPosition(Common::Point(303, 176)); + g_globals->_player.fixPriority(-1); + g_globals->_player.disableControl(); _hotspot13.setPosition(Common::Point(319, 199)); @@ -5957,14 +5959,14 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { _hotspot16.hide(); _sceneMode = 2338; - setAction(&_sequenceManager1, this, 2338, &_globals->_player, &_hotspot16, &_hotspot13, NULL); + setAction(&_sequenceManager1, this, 2338, &g_globals->_player, &_hotspot16, &_hotspot13, NULL); break; default: - switch (_globals->_stripNum) { + switch (g_globals->_stripNum) { case 2101: - _globals->_player.disableControl(); - _globals->_player.setStrip(3); - _globals->_player.setPosition(Common::Point(307, 84)); + g_globals->_player.disableControl(); + g_globals->_player.setStrip(3); + g_globals->_player.setPosition(Common::Point(307, 84)); _hotspot11.postInit(); _hotspot11.setVisage(2705); @@ -5992,21 +5994,21 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { _hotspot8.hide(); _sceneMode = 2325; - setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL); + setAction(&_sequenceManager1, this, 2325, &g_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL); break; default: - _globals->_soundHandler.play(160); - _globals->_soundHandler.holdAt(true); + g_globals->_soundHandler.play(160); + g_globals->_soundHandler.holdAt(true); _sceneMode = 2321; - _globals->_player.setStrip(3); - setAction(&_sequenceManager1, this, 2321, &_globals->_player, &_hotspot6, NULL); + g_globals->_player.setStrip(3); + setAction(&_sequenceManager1, this, 2321, &g_globals->_player, &_hotspot6, NULL); break; } } - _globals->_stripNum = 0; - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); + g_globals->_stripNum = 0; + g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position); loadScene(2320); _hotspot14._sceneRegionId = 8; @@ -6017,7 +6019,7 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { _hotspot5.setBounds(Rect(104, 122, 174, 157)); _hotspot15.setBounds(Rect(191, 53, 205, 63)); - _globals->_sceneItems.addItems(&_hotspot14, &_hotspot15, &_hotspot5, &_hotspot6, &_hotspot12, + g_globals->_sceneItems.addItems(&_hotspot14, &_hotspot15, &_hotspot5, &_hotspot6, &_hotspot12, &_hotspot13, &_hotspot4, &_hotspot3, &_hotspot2, &_hotspot1, NULL); } @@ -6031,40 +6033,40 @@ void Scene2320::signal() { case 2321: case 2327: case 2329: - if (_globals->getFlag(43) && !_hotspot11._action) + if (g_globals->getFlag(43) && !_hotspot11._action) _hotspot11.setAction(&_action1); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 2322: - _globals->_sceneManager.changeScene(2120); + g_globals->_sceneManager.changeScene(2120); break; case 2323: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); break; case 2338: case 2324: _hotspot16.remove(); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 2325: - _globals->setFlag(76); - _globals->clearFlag(70); - _globals->_stripNum = 6100; - _globals->_sceneManager.changeScene(2100); + g_globals->setFlag(76); + g_globals->clearFlag(70); + g_globals->_stripNum = 6100; + g_globals->_sceneManager.changeScene(2100); break; case 2326: - _globals->clearFlag(70); + g_globals->clearFlag(70); RING_INVENTORY._nullifier._sceneNumber = 1; - _globals->_stripNum = 2321; - _globals->_sceneManager.changeScene(2100); + g_globals->_stripNum = 2321; + g_globals->_sceneManager.changeScene(2100); break; case 2336: - _globals->setFlag(77); + g_globals->setFlag(77); RING_INVENTORY._waldos._sceneNumber = 1; _hotspot8.remove(); break; case 5000: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; } } @@ -6080,32 +6082,32 @@ void Scene2400::Action1::signal() { setDelay(60); break; case 1: - ADD_MOVER(_globals->_player, 160, 71); + ADD_MOVER(g_globals->_player, 160, 71); break; case 2: - ADD_MOVER(_globals->_player, 160, 360); + ADD_MOVER(g_globals->_player, 160, 360); break; case 3: - _globals->_player._moveDiff = Common::Point(1, 1); - ADD_MOVER(_globals->_player, 140, 375); + g_globals->_player._moveDiff = Common::Point(1, 1); + ADD_MOVER(g_globals->_player, 140, 375); break; case 4: - ADD_MOVER(_globals->_player, 87, 338); + ADD_MOVER(g_globals->_player, 87, 338); break; case 5: - _globals->_player.hide(); + g_globals->_player.hide(); setDelay(60); break; case 6: - _globals->_sceneManager.changeScene(4000); + g_globals->_sceneManager.changeScene(4000); break; } } void Scene2400::Action1::dispatch() { Action::dispatch(); - if ((_actionIndex == 4) && (_globals->_player._percent > 5)) - _globals->_player.changeZoom(_globals->_player._percent - 2); + if ((_actionIndex == 4) && (g_globals->_player._percent > 5)) + g_globals->_player.changeZoom(g_globals->_player._percent - 2); } /*--------------------------------------------------------------------------*/ @@ -6115,19 +6117,21 @@ void Scene2400::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(0, 100, 200, 100); - _globals->_player.postInit(); - _globals->_player.setVisage(2410); - _globals->_player.setPosition(Common::Point(340, -10)); - _globals->_player.animate(ANIM_MODE_2, NULL); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(2410); + g_globals->_player.setPosition(Common::Point(340, -10)); + g_globals->_player.animate(ANIM_MODE_2, NULL); + g_globals->_player.disableControl(); setAction(&_action1); - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position.x, g_globals->_player._position.y); + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - _globals->_soundHandler.play(153); + g_globals->_soundHandler.play(153); } -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld_scenes3.h b/engines/tsage/ringworld/ringworld_scenes3.h index 711360c190..682ef44fc6 100644 --- a/engines/tsage/ringworld_scenes3.h +++ b/engines/tsage/ringworld/ringworld_scenes3.h @@ -26,9 +26,14 @@ #include "common/scummsys.h" #include "tsage/core.h" #include "tsage/converse.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/ringworld/ringworld_speakers.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { + +using namespace TsAGE; class Scene2000 : public Scene { /* Actions */ @@ -890,6 +895,8 @@ public: virtual void postInit(SceneObjectList *OwnerList = NULL); }; -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld_scenes4.cpp b/engines/tsage/ringworld/ringworld_scenes4.cpp index 838769e4af..98bf0158e7 100644 --- a/engines/tsage/ringworld_scenes4.cpp +++ b/engines/tsage/ringworld/ringworld_scenes4.cpp @@ -21,12 +21,14 @@ */ #include "common/config-manager.h" -#include "tsage/ringworld_scenes4.h" +#include "tsage/ringworld/ringworld_scenes4.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { /*-------------------------------------------------------------------------- * Scene 3500 - Ringworld Scan @@ -34,7 +36,7 @@ namespace tSage { *--------------------------------------------------------------------------*/ void Scene3500::Action1::signal() { - Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene; + Scene3500 *scene = (Scene3500 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -47,13 +49,13 @@ void Scene3500::Action1::signal() { setDelay(3); break; case 3: - _globals->_sceneManager.changeScene(9999); + g_globals->_sceneManager.changeScene(9999); break; } } void Scene3500::Action2::signal() { - Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene; + Scene3500 *scene = (Scene3500 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -66,7 +68,7 @@ void Scene3500::Action2::signal() { setDelay(3); break; case 3: - _globals->_sceneManager.changeScene(2012); + g_globals->_sceneManager.changeScene(2012); break; } } @@ -74,17 +76,17 @@ void Scene3500::Action2::signal() { /*--------------------------------------------------------------------------*/ void Scene3500::postInit(SceneObjectList *OwnerList) { - loadScene((_globals->_stripNum == 3600) ? 3600 : 3500); + loadScene((g_globals->_stripNum == 3600) ? 3600 : 3500); Scene::postInit(); _stripManager.addSpeaker(&_speakerQText); _stripManager.addSpeaker(&_speakerMText); _stripManager.addSpeaker(&_speakerSText); - _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); - _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.top / 160) * 160; + g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds); + g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.top / 160) * 160; - setAction((_globals->_stripNum == 3600) ? (Action *)&_action2 : (Action *)&_action1); + setAction((g_globals->_stripNum == 3600) ? (Action *)&_action2 : (Action *)&_action1); } /*-------------------------------------------------------------------------- @@ -100,7 +102,7 @@ Scene3700::Viewer::Viewer() { _frameList[0] = 1; for (int idx = 1; idx <= 3; ++idx) - _frameList[idx] = _globals->_randomSource.getRandomNumber(4) + 1; + _frameList[idx] = g_globals->_randomSource.getRandomNumber(4) + 1; _active = true; _countdownCtr = 0; @@ -130,7 +132,7 @@ void Scene3700::Viewer::dispatch() { int newFrame; do { - newFrame = _globals->_randomSource.getRandomNumber(4) + 1; + newFrame = g_globals->_randomSource.getRandomNumber(4) + 1; } while (newFrame == _frameList[2]); _frameList[1] = newFrame; @@ -144,27 +146,27 @@ void Scene3700::Viewer::reposition() { } void Scene3700::Viewer::draw() { - Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(1); + Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(1); for (int idx = 0; idx < 4; ++idx) { Visage &v = (idx == 0) ? _images1 : _images2; GfxSurface img = v.getFrame(_frameList[idx]); Rect destRect = img.getBounds(); - destRect.resize(img, (_position.x - _globals->_sceneOffset.x), - (_position.y - _globals->_sceneOffset.y - _yDiff), _percentList[idx]); + destRect.resize(img, (_position.x - g_globals->_sceneOffset.x), + (_position.y - g_globals->_sceneOffset.y - _yDiff), _percentList[idx]); - destRect.translate(-_globals->_sceneManager._scene->_sceneBounds.left, - -_globals->_sceneManager._scene->_sceneBounds.top); + destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left, + -g_globals->_sceneManager._scene->_sceneBounds.top); - _globals->gfxManager().copyFrom(img, destRect, priorityRegion); + g_globals->gfxManager().copyFrom(img, destRect, priorityRegion); } } /*--------------------------------------------------------------------------*/ void Scene3700::Action1::signal() { - Scene3700 *scene = (Scene3700 *)_globals->_sceneManager._scene; + Scene3700 *scene = (Scene3700 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -216,18 +218,18 @@ void Scene3700::Action1::signal() { case 8: scene->_hotspot1.remove(); scene->_hotspot2.show(); - _globals->setFlag(59); + g_globals->setFlag(59); setDelay(30); break; case 9: - _globals->_sceneManager.changeScene(2100); + g_globals->_sceneManager.changeScene(2100); break; } } /*--------------------------------------------------------------------------*/ -void Scene3700::postInit(tSage::SceneObjectList *OwnerList) { +void Scene3700::postInit(TsAGE::SceneObjectList *OwnerList) { Scene::postInit(); loadScene(3700); @@ -244,7 +246,9 @@ void Scene3700::postInit(tSage::SceneObjectList *OwnerList) { _viewer.setPosition(Common::Point(195, 83)); setAction(&_action1); - _globals->_soundHandler.play(195); + g_globals->_soundHandler.play(195); } -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld_scenes4.h b/engines/tsage/ringworld/ringworld_scenes4.h index 0b575d02d3..64706805bc 100644 --- a/engines/tsage/ringworld_scenes4.h +++ b/engines/tsage/ringworld/ringworld_scenes4.h @@ -26,9 +26,14 @@ #include "common/scummsys.h" #include "tsage/core.h" #include "tsage/converse.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/ringworld/ringworld_speakers.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { + +using namespace TsAGE; class Scene3500 : public Scene { /* Actions */ @@ -87,6 +92,8 @@ public: virtual void postInit(SceneObjectList *OwnerList = NULL); }; -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld/ringworld_scenes5.cpp index fccc7e1b50..3cf1207e9e 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld/ringworld_scenes5.cpp @@ -21,12 +21,14 @@ */ #include "common/config-manager.h" -#include "tsage/ringworld_scenes5.h" +#include "tsage/ringworld/ringworld_scenes5.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { /*-------------------------------------------------------------------------- * Scene 4000 - Village @@ -35,7 +37,7 @@ namespace tSage { void Scene4000::Action1::signal() { // Quinn has the peg. Everybody enter the screen. - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { @@ -50,10 +52,10 @@ void Scene4000::Action1::signal() { scene->_hotspot5.addMover(mover, &pt, this); RING_INVENTORY._ale._sceneNumber = 0; - _globals->clearFlag(42); - _globals->clearFlag(36); - _globals->clearFlag(43); - _globals->clearFlag(37); + g_globals->clearFlag(42); + g_globals->clearFlag(36); + g_globals->clearFlag(43); + g_globals->clearFlag(37); break; } case 1: { @@ -83,7 +85,7 @@ void Scene4000::Action1::signal() { ADD_PLAYER_MOVER_THIS(scene->_miranda, 266, 169); - ADD_PLAYER_MOVER_NULL(_globals->_player, 241, 155); + ADD_PLAYER_MOVER_NULL(g_globals->_player, 241, 155); break; } case 2: @@ -102,14 +104,14 @@ void Scene4000::Action1::signal() { ADD_MOVER_NULL(scene->_hotspot5, -40, 86); break; case 5: - _globals->_soundHandler.play(155); - _globals->setFlag(43); - _globals->setFlag(114); + g_globals->_soundHandler.play(155); + g_globals->setFlag(43); + g_globals->setFlag(114); scene->_stripManager.start(4430, this); break; case 6: ADD_PLAYER_MOVER_THIS(scene->_olo, 277, 175); - ADD_PLAYER_MOVER_NULL(_globals->_player, 258, 187); + ADD_PLAYER_MOVER_NULL(g_globals->_player, 258, 187); break; case 7: scene->_stripManager.start(4440, this); @@ -118,8 +120,8 @@ void Scene4000::Action1::signal() { setDelay(30); break; case 9: - _globals->setFlag(96); - _globals->_sceneManager.changeScene(4025); + g_globals->setFlag(96); + g_globals->_sceneManager.changeScene(4025); break; } } @@ -127,11 +129,11 @@ void Scene4000::Action1::signal() { void Scene4000::Action2::signal() { // Quinn, Seeker and Miranda walks down to the village // Then, they talk to Rock, and enter the priest hut - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL); + setAction(&scene->_sequenceManager1, this, 4001, &g_globals->_player, NULL); scene->_hotspot5.postInit(); scene->_hotspot5.setVisage(2801); @@ -144,13 +146,13 @@ void Scene4000::Action2::signal() { scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL); break; case 1: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_lander.remove(); ADD_MOVER(scene->_guardRock, scene->_hotspot5._position.x + 30, scene->_hotspot5._position.y - 10); break; case 2: - _globals->_player.checkAngle(&scene->_guardRock); + g_globals->_player.checkAngle(&scene->_guardRock); scene->_hotspot5.checkAngle(&scene->_guardRock); scene->_miranda.checkAngle(&scene->_guardRock); scene->_stripManager.start(4000, this); @@ -163,7 +165,7 @@ void Scene4000::Action2::signal() { ADD_MOVER(scene->_hotspot2, 116, 160); ADD_MOVER(scene->_hotspot5, 116, 160); - _globals->setFlag(37); + g_globals->setFlag(37); break; case 4: break; @@ -176,14 +178,14 @@ void Scene4000::Action2::signal() { ADD_PLAYER_MOVER_NULL(scene->_miranda, 210, 133); break; case 7: - _globals->_sceneManager.changeScene(4045); + g_globals->_sceneManager.changeScene(4045); break; } } void Scene4000::Action3::signal() { // The guard walks to the left and exits the screen - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -202,19 +204,19 @@ void Scene4000::Action3::signal() { void Scene4000::Action4::signal() { // Quinn ties the rope to the rock - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player._uiEnabled = false; - ADD_MOVER(_globals->_player, 257, 57); + g_globals->_player._uiEnabled = false; + ADD_MOVER(g_globals->_player, 257, 57); break; case 1: - _globals->_player.setVisage(4008); - _globals->_player.setPosition(Common::Point(258, 83)); - _globals->_player._frame = 1; - _globals->_player._strip = 3; - _globals->_player.animate(ANIM_MODE_4, 2, 1, this); + g_globals->_player.setVisage(4008); + g_globals->_player.setPosition(Common::Point(258, 83)); + g_globals->_player._frame = 1; + g_globals->_player._strip = 3; + g_globals->_player.animate(ANIM_MODE_4, 2, 1, this); break; case 2: scene->_rope.postInit(); @@ -224,16 +226,16 @@ void Scene4000::Action4::signal() { scene->_rope.setPosition(Common::Point(268, 44)); RING_INVENTORY._rope._sceneNumber = 4000; - _globals->_events.setCursor(CURSOR_USE); - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_events.setCursor(CURSOR_USE); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 3: - _globals->_player.setVisage(2602); - _globals->_player.setPosition(Common::Point(257, 57)); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._uiEnabled = true; + g_globals->_player.setVisage(2602); + g_globals->_player.setPosition(Common::Point(257, 57)); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player._uiEnabled = true; - _globals->setFlag(41); + g_globals->setFlag(41); remove(); break; } @@ -241,15 +243,15 @@ void Scene4000::Action4::signal() { void Scene4000::Action5::signal() { // Chat with Miranda - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(15); break; case 1: - scene->_stripManager.start(_globals->_stripNum, this); + scene->_stripManager.start(g_globals->_stripNum, this); break; case 2: setDelay(10); @@ -260,7 +262,7 @@ void Scene4000::Action5::signal() { scene->_hotspot8.setFrame2(-1); scene->_hotspot8.setAction(&scene->_action3); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -269,102 +271,102 @@ void Scene4000::Action5::signal() { void Scene4000::Action6::signal() { // Quinn and Miranda enter the screen and walk to the village. // Rock comes and notices the alcohol. They all enter his hut. - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(30); break; case 1: - setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL); + setAction(&scene->_sequenceManager1, this, 4001, &g_globals->_player, NULL); - if (!_globals->getFlag(36)) + if (!g_globals->getFlag(36)) scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL); break; case 2: - _globals->_player.disableControl(); - ADD_MOVER(scene->_guardRock, _globals->_player._position.x + 30, _globals->_player._position.y - 5); + g_globals->_player.disableControl(); + ADD_MOVER(scene->_guardRock, g_globals->_player._position.x + 30, g_globals->_player._position.y - 5); break; case 3: - scene->_stripManager.start(_globals->getFlag(35) ? 4500 : 4502, this); + scene->_stripManager.start(g_globals->getFlag(35) ? 4500 : 4502, this); break; case 4: - _globals->clearFlag(35); + g_globals->clearFlag(35); ADD_MOVER_NULL(scene->_guardRock, 292, 138); ADD_PLAYER_MOVER(283, 147); - if (!_globals->getFlag(36)) + if (!g_globals->getFlag(36)) ADD_PLAYER_MOVER_NULL(scene->_miranda, 280, 150); RING_INVENTORY._ale._sceneNumber = 4100; break; case 5: - _globals->_sceneManager.changeScene(4100); + g_globals->_sceneManager.changeScene(4100); break; } } void Scene4000::Action7::signal() { // Climb down left Chimney using a rope - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_rope.setFrame(1); - ADD_MOVER(_globals->_player, 247, 53); + ADD_MOVER(g_globals->_player, 247, 53); break; case 1: - _globals->_player.setVisage(4008); - _globals->_player.setStrip(4); - _globals->_player.setFrame(1); - _globals->_player.fixPriority(16); - _globals->_player.setPosition(Common::Point(260, 55)); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(4008); + g_globals->_player.setStrip(4); + g_globals->_player.setFrame(1); + g_globals->_player.fixPriority(16); + g_globals->_player.setPosition(Common::Point(260, 55)); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: - _globals->_sceneManager.changeScene(4050); + g_globals->_sceneManager.changeScene(4050); break; } } void Scene4000::Action8::signal() { // Climb down right Chimney using a rope - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); - if (_globals->getFlag(41)) + g_globals->_player.disableControl(); + if (g_globals->getFlag(41)) scene->_rope.setFrame(2); - ADD_MOVER(_globals->_player, 289, 53); + ADD_MOVER(g_globals->_player, 289, 53); break; case 1: - _globals->_player.setVisage(4008); - _globals->_player.setStrip(5); - _globals->_player.fixPriority(16); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(283, 52)); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(4008); + g_globals->_player.setStrip(5); + g_globals->_player.fixPriority(16); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(283, 52)); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: - _globals->_player.remove(); + g_globals->_player.remove(); setDelay(60); break; case 3: - _globals->_soundHandler.play(170); + g_globals->_soundHandler.play(170); scene->_smoke2.setVisage(4000); scene->_smoke2.setStrip(6); scene->_smoke2.animate(ANIM_MODE_2, NULL); setDelay(60); break; case 4: - _globals->_soundHandler.play(77, this); + g_globals->_soundHandler.play(77, this); break; case 5: - _globals->_game->endGame(4000, 15); + g_globals->_game->endGame(4000, 15); remove(); break; } @@ -374,7 +376,7 @@ void Scene4000::Action9::signal() { // Villager animations switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(119) + 240); + setDelay(g_globals->_randomSource.getRandomNumber(119) + 240); break; case 1: static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_8, 1, this); @@ -387,7 +389,7 @@ void Scene4000::Action10::signal() { // Villager animations switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(119) + 240); + setDelay(g_globals->_randomSource.getRandomNumber(119) + 240); break; case 1: static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_8, 1, this); @@ -397,11 +399,11 @@ void Scene4000::Action10::signal() { } void Scene4000::Action11::signal() { - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); ADD_MOVER(scene->_lander, -30, 70); break; case 1: @@ -415,7 +417,7 @@ void Scene4000::Action11::signal() { scene->_hotspot5._moveDiff.x = 4; scene->_hotspot5.setPosition(Common::Point(-8, 88)); - setAction(&scene->_sequenceManager1, this, 4001, &_globals->_player, NULL); + setAction(&scene->_sequenceManager1, this, 4001, &g_globals->_player, NULL); scene->_miranda.setPosition(Common::Point(-210, 139)); scene->_miranda.setAction(&scene->_sequenceManager2, NULL, 4002, &scene->_miranda, NULL); @@ -432,33 +434,33 @@ void Scene4000::Action11::signal() { scene->_soundHandler1.stop(); scene->_forceField.remove(); - ADD_MOVER(_globals->_player, 340, 163); + ADD_MOVER(g_globals->_player, 340, 163); ADD_MOVER_NULL(scene->_miranda, 340, 169); ADD_MOVER_NULL(scene->_hotspot5, 340, 165); break; case 6: - _globals->_sceneManager.changeScene(4250); + g_globals->_sceneManager.changeScene(4250); break; } } void Scene4000::Action12::signal() { // Quinn enter Rock's hut - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(5); break; case 1: - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(4015, this); break; case 2: - _globals->setFlag(32); + g_globals->setFlag(32); if (scene->_stripManager._field2E8 == 275) { - _globals->setFlag(82); + g_globals->setFlag(82); ADD_MOVER_NULL(scene->_guardRock, 292, 138); ADD_PLAYER_MOVER(283, 147); } else { @@ -467,7 +469,7 @@ void Scene4000::Action12::signal() { break; case 3: if (scene->_stripManager._field2E8 == 275) { - _globals->_sceneManager.changeScene(4100); + g_globals->_sceneManager.changeScene(4100); } else { ADD_PLAYER_MOVER_THIS(scene->_guardRock, 300, 132); } @@ -477,8 +479,8 @@ void Scene4000::Action12::signal() { scene->_stripManager.start(4020, this); break; case 5: - _globals->setFlag(35); - _globals->_player.enableControl(); + g_globals->setFlag(35); + g_globals->_player.enableControl(); remove(); break; } @@ -486,11 +488,11 @@ void Scene4000::Action12::signal() { void Scene4000::Action13::signal() { // Lander is landing - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: @@ -500,7 +502,7 @@ void Scene4000::Action13::signal() { break; case 2: scene->_soundHandler2.release(); - _globals->_sceneManager.changeScene(4010); + g_globals->_sceneManager.changeScene(4010); break; } } @@ -508,7 +510,7 @@ void Scene4000::Action13::signal() { /*--------------------------------------------------------------------------*/ void Scene4000::Miranda::doAction(int action) { - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: @@ -518,28 +520,28 @@ void Scene4000::Miranda::doAction(int action) { SceneItem::display2(4000, 29); break; case CURSOR_TALK: - if (_globals->getFlag(31)) { - if (!_globals->getFlag(111)) { - _globals->setFlag(111); - _globals->_stripNum = 4070; - } else if (!_globals->getFlag(33)) - _globals->_stripNum = 4094; - else if (!_globals->getFlag(112)) { - _globals->setFlag(112); - _globals->_stripNum = 4300; - } else if (!_globals->getFlag(113)) { - _globals->setFlag(113); - _globals->_stripNum = 4093; + if (g_globals->getFlag(31)) { + if (!g_globals->getFlag(111)) { + g_globals->setFlag(111); + g_globals->_stripNum = 4070; + } else if (!g_globals->getFlag(33)) + g_globals->_stripNum = 4094; + else if (!g_globals->getFlag(112)) { + g_globals->setFlag(112); + g_globals->_stripNum = 4300; + } else if (!g_globals->getFlag(113)) { + g_globals->setFlag(113); + g_globals->_stripNum = 4093; } else - _globals->_stripNum = 4094; + g_globals->_stripNum = 4094; } else { - if (!_globals->getFlag(33)) - _globals->_stripNum = 4094; - else if (!_globals->getFlag(112)) { - _globals->setFlag(112); - _globals->_stripNum = 4300; + if (!g_globals->getFlag(33)) + g_globals->_stripNum = 4094; + else if (!g_globals->getFlag(112)) { + g_globals->setFlag(112); + g_globals->_stripNum = 4300; } else - _globals->_stripNum = 4094; + g_globals->_stripNum = 4094; } scene->setAction(&scene->_action5); @@ -552,7 +554,7 @@ void Scene4000::Miranda::doAction(int action) { void Scene4000::Hotspot8::doAction(int action) { // Guard - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: @@ -567,20 +569,20 @@ void Scene4000::Hotspot8::doAction(int action) { else { switch (_ctr) { case 0: - _globals->_stripNum = 4090; + g_globals->_stripNum = 4090; break; case 1: - _globals->_stripNum = 4091; + g_globals->_stripNum = 4091; break; case 2: - _globals->_stripNum = 4092; + g_globals->_stripNum = 4092; break; default: SceneItem::display2(4000, 34); break; } - if (_globals->_stripNum) { + if (g_globals->_stripNum) { setAction(NULL); addMover(NULL); ++_ctr; @@ -612,20 +614,20 @@ void Scene4000::GuardRock::doAction(int action) { } void Scene4000::Ladder::doAction(int action) { - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4000, 30); break; case CURSOR_USE: - _globals->_player.disableControl(); - if (_globals->getFlag(40)) { + g_globals->_player.disableControl(); + if (g_globals->getFlag(40)) { scene->_sceneMode = 4005; - scene->setAction(&scene->_sequenceManager1, scene, 4005, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 4005, &g_globals->_player, NULL); } else { scene->_sceneMode = 4004; - scene->setAction(&scene->_sequenceManager1, scene, 4004, &_globals->_player, &scene->_ladder, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 4004, &g_globals->_player, &scene->_ladder, NULL); } break; default: @@ -635,7 +637,7 @@ void Scene4000::Ladder::doAction(int action) { } void Scene4000::TheTech::doAction(int action) { - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -648,15 +650,15 @@ void Scene4000::TheTech::doAction(int action) { SceneItem::display2(4000, 20); break; case CURSOR_USE: - if (_globals->getFlag(40)) + if (g_globals->getFlag(40)) SceneItem::display2(4000, 37); else { - _globals->_player.disableControl(); - if (_globals->_sceneObjects->contains(&scene->_miranda)) - _globals->clearFlag(96); + g_globals->_player.disableControl(); + if (g_globals->_sceneObjects->contains(&scene->_miranda)) + g_globals->clearFlag(96); scene->_sceneMode = 4012; - scene->setAction(&scene->_sequenceManager1, scene, 4012, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 4012, &g_globals->_player, NULL); } break; default: @@ -667,14 +669,14 @@ void Scene4000::TheTech::doAction(int action) { void Scene4000::Hotspot13::doAction(int action) { // Rock between the two chimneys - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4000, 21); break; case OBJECT_ROPE: - if (_globals->getFlag(40)) + if (g_globals->getFlag(40)) scene->setAction(&scene->_action4); else SceneItem::display2(4000, 22); @@ -687,7 +689,7 @@ void Scene4000::Hotspot13::doAction(int action) { void Scene4000::Hotspot::doAction(int action) { // Wall between the two doors - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -700,16 +702,16 @@ void Scene4000::Hotspot::doAction(int action) { SceneItem::display2(4000, 18); break; case OBJECT_LADDER: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_ladder.postInit(); scene->_ladder.setVisage(4000); scene->_ladder.setStrip(5); scene->_ladder.setPosition(Common::Point(245, 147)); scene->_ladder.hide(); - _globals->_sceneItems.push_front(&scene->_ladder); + g_globals->_sceneItems.push_front(&scene->_ladder); - if (_globals->_sceneObjects->contains(&scene->_hotspot8)) { + if (g_globals->_sceneObjects->contains(&scene->_hotspot8)) { scene->_hotspot8.setAction(NULL); Common::Point pt(118, 145); NpcMover *mover = new NpcMover(); @@ -717,7 +719,7 @@ void Scene4000::Hotspot::doAction(int action) { } scene->_sceneMode = 4004; - scene->setAction(&scene->_sequenceManager1, scene, 4011, &_globals->_player, &scene->_ladder, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 4011, &g_globals->_player, &scene->_ladder, NULL); break; } default: @@ -728,14 +730,14 @@ void Scene4000::Hotspot::doAction(int action) { void Scene4000::Hotspot17::doAction(int action) { // Left Chimney - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4000, 23); break; case CURSOR_USE: - if (_globals->getFlag(40)) + if (g_globals->getFlag(40)) scene->setAction(&scene->_action7); else SceneItem::display2(4000, 24); @@ -748,14 +750,14 @@ void Scene4000::Hotspot17::doAction(int action) { void Scene4000::Hotspot18::doAction(int action) { // Right Chimney - Scene4000 *scene = (Scene4000 *)_globals->_sceneManager._scene; + Scene4000 *scene = (Scene4000 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4000, 36); break; case CURSOR_USE: - if (_globals->getFlag(40)) + if (g_globals->getFlag(40)) scene->setAction(&scene->_action8); else SceneItem::display2(4000, 24); @@ -770,7 +772,7 @@ void Scene4000::Hotspot23::doAction(int action) { // Door of the temple switch (action) { case CURSOR_LOOK: - SceneItem::display2(4000, _globals->getFlag(31) ? 10 : 9); + SceneItem::display2(4000, g_globals->getFlag(31) ? 10 : 9); break; default: SceneHotspot::doAction(action); @@ -815,7 +817,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _speakerSText._npc = &_hotspot5; _speakerMText._npc = &_miranda; _speakerPText._npc = &_olo; - _speakerQText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; _hotspot13.setBounds(Rect(263, 41, 278, 55)); _hotspot14.setBounds(Rect(96 /*140*/, 177, 140 /*96*/, 204)); @@ -866,7 +868,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _theTech.fixPriority(200); _theTech.setPosition(Common::Point(281, 176)); - if (_globals->getFlag(34)) { + if (g_globals->getFlag(34)) { _soundHandler1.play(156); _forceField.postInit(); @@ -876,16 +878,16 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _forceField.fixPriority(200); _forceField.animate(ANIM_MODE_8, 0, NULL); - _globals->_sceneItems.push_back(&_forceField); + g_globals->_sceneItems.push_back(&_forceField); } - _globals->_player.postInit(); - _globals->_player.setVisage(2602); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(-28, 86)); + g_globals->_player.postInit(); + g_globals->_player.setVisage(2602); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(-28, 86)); - if (!_globals->getFlag(36) && !_globals->getFlag(43)) { + if (!g_globals->getFlag(36) && !g_globals->getFlag(43)) { _miranda.postInit(); _miranda.setVisage(2701); _miranda.animate(ANIM_MODE_1, NULL); @@ -893,14 +895,14 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _miranda._moveDiff = Common::Point(4, 2); _miranda.setPosition(Common::Point(-210, 139)); - _globals->_sceneItems.push_back(&_miranda); + g_globals->_sceneItems.push_back(&_miranda); } - _globals->clearFlag(40); + g_globals->clearFlag(40); - switch (_globals->_sceneManager._previousScene) { + switch (g_globals->_sceneManager._previousScene) { case 2320: - _globals->_soundHandler.play(155); + g_globals->_soundHandler.play(155); if (RING_INVENTORY._ale._sceneNumber == 1) { _guardRock.postInit(); @@ -911,17 +913,17 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { setAction(&_action6); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 4001; - setAction(&_sequenceManager1, this, 4001, &_globals->_player, NULL); + setAction(&_sequenceManager1, this, 4001, &g_globals->_player, NULL); - if (!_globals->getFlag(36) && !_globals->getFlag(43)) + if (!g_globals->getFlag(36) && !g_globals->getFlag(43)) _miranda.setAction(&_sequenceManager2, NULL, 4002, &_miranda, NULL); } - if (_globals->getFlag(42)) + if (g_globals->getFlag(42)) _hotspot8.setAction(&_action3); - else if (_globals->getFlag(91)) + else if (g_globals->getFlag(91)) _hotspot8.remove(); break; @@ -948,12 +950,12 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { if (RING_INVENTORY._ladder._sceneNumber == 4000) _hotspot8.remove(); - _globals->_player.setPosition(Common::Point(260, 185)); + g_globals->_player.setPosition(Common::Point(260, 185)); - if (!_globals->getFlag(36) && !_globals->getFlag(43)) + if (!g_globals->getFlag(36) && !g_globals->getFlag(43)) _miranda.setPosition(Common::Point(246, 146)); - if (_globals->getFlag(96)) { + if (g_globals->getFlag(96)) { _olo.postInit(); _olo.setVisage(4006); _olo.animate(ANIM_MODE_1, NULL); @@ -961,7 +963,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _olo.setPosition(Common::Point(290, 163)); } - if (_globals->_stripNum == 4025) { + if (g_globals->_stripNum == 4025) { _soundHandler1.play(182); _forceField.remove(); @@ -972,9 +974,9 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _hotspot5._moveDiff.x = 4; _hotspot5.setPosition(Common::Point(-18, 86)); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); - if (!_globals->getFlag(96)) { + if (!g_globals->getFlag(96)) { _olo.postInit(); _olo.setVisage(4006); _olo.animate(ANIM_MODE_1, NULL); @@ -988,17 +990,17 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _sceneMode = 4003; setAction(&_sequenceManager1, this, 4003, &_hotspot5, NULL); - } else if (_globals->getFlag(96)) { - _globals->_player.disableControl(); + } else if (g_globals->getFlag(96)) { + g_globals->_player.disableControl(); _sceneMode = 4013; setAction(&_sequenceManager1, this, 4013, &_olo, NULL); } - _globals->clearFlag(96); + g_globals->clearFlag(96); break; case 4045: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); if (RING_INVENTORY._ladder._sceneNumber != 4000) { _hotspot8.setVisage(4017); @@ -1007,13 +1009,13 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _hotspot8.setAction(&_action3); } - _globals->_player.setPosition(Common::Point(208, 153)); - if (!_globals->getFlag(36) && !_globals->getFlag(43)) + g_globals->_player.setPosition(Common::Point(208, 153)); + if (!g_globals->getFlag(36) && !g_globals->getFlag(43)) _miranda.setPosition(Common::Point(246, 146)); - if (_globals->getFlag(39)) { + if (g_globals->getFlag(39)) { // Ollo follows Quinn and gives explanations on the Tech. - _globals->clearFlag(39); + g_globals->clearFlag(39); _olo.postInit(); _olo.setVisage(4006); @@ -1022,14 +1024,14 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _olo.setPosition(Common::Point(219, 150)); _sceneMode = 4010; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); // This is the buggy animation where Miranda comments the Tech even // if she's not in the room but in the lander. - setAction(&_sequenceManager1, this, 4010, &_globals->_player, &_olo, NULL); + setAction(&_sequenceManager1, this, 4010, &g_globals->_player, &_olo, NULL); } - if (_globals->_stripNum == 4000) { - _globals->_stripNum = 0; + if (g_globals->_stripNum == 4000) { + g_globals->_stripNum = 0; _guardRock.postInit(); _guardRock.setVisage(4001); @@ -1043,21 +1045,21 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { break; case 4050: - _globals->_soundHandler.play(155); - _globals->_player.disableControl(); + g_globals->_soundHandler.play(155); + g_globals->_player.disableControl(); - if (_globals->_stripNum == 4050) { - _globals->_player.setVisage(4008); - _globals->_player.setStrip(4); - _globals->_player.setFrame(_globals->_player.getFrameCount()); - _globals->_player.fixPriority(16); - _globals->_player.setPosition(Common::Point(260, 55)); + if (g_globals->_stripNum == 4050) { + g_globals->_player.setVisage(4008); + g_globals->_player.setStrip(4); + g_globals->_player.setFrame(g_globals->_player.getFrameCount()); + g_globals->_player.fixPriority(16); + g_globals->_player.setPosition(Common::Point(260, 55)); _sceneMode = 4007; - setAction(&_sequenceManager1, this, 4007, &_globals->_player, NULL); + setAction(&_sequenceManager1, this, 4007, &g_globals->_player, NULL); } else { - _globals->_player.setPosition(Common::Point(208, 153)); - _globals->_player.enableControl(); + g_globals->_player.setPosition(Common::Point(208, 153)); + g_globals->_player.enableControl(); } if (RING_INVENTORY._ladder._sceneNumber != 4000) @@ -1065,22 +1067,22 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { break; case 4100: - _globals->_player.enableControl(); - _globals->_player.setPosition(Common::Point(270, 155)); + g_globals->_player.enableControl(); + g_globals->_player.setPosition(Common::Point(270, 155)); - if (_globals->getFlag(42) && (RING_INVENTORY._ladder._sceneNumber != 4000)) { + if (g_globals->getFlag(42) && (RING_INVENTORY._ladder._sceneNumber != 4000)) { _hotspot8.setVisage(4017); _hotspot8.animate(ANIM_MODE_1, NULL); _hotspot8.setPosition(Common::Point(244, 151)); _hotspot8.setAction(&_action3); } - if (!_globals->getFlag(36) && !_globals->getFlag(43)) + if (!g_globals->getFlag(36) && !g_globals->getFlag(43)) _miranda.setPosition(Common::Point(246, 146)); break; default: - _globals->_soundHandler.play(155); + g_globals->_soundHandler.play(155); _lander.postInit(); _lander.setVisage(4002); @@ -1090,7 +1092,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _lander.setPosition(Common::Point(130, -1)); _lander.animate(ANIM_MODE_2, NULL); - if (_globals->_stripNum == 9000) { + if (g_globals->_stripNum == 9000) { _olo.postInit(); _olo.setVisage(4006); _olo.setPosition(Common::Point(235, 153)); @@ -1113,7 +1115,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _forceField.fixPriority(200); _forceField.animate(ANIM_MODE_8, 0, NULL); } else { - if (!_globals->getFlag(37)) { + if (!g_globals->getFlag(37)) { _hotspot2.postInit(); _hotspot2.setVisage(4018); _hotspot2._strip = 1; @@ -1134,7 +1136,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _ladder.setStrip(5); _ladder.setPosition(Common::Point(245, 147)); - _globals->_sceneItems.push_back(&_ladder); + g_globals->_sceneItems.push_back(&_ladder); } if (RING_INVENTORY._rope._sceneNumber == 4000) { @@ -1145,7 +1147,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _rope.setPosition(Common::Point(268, 44)); } - _globals->_sceneItems.addItems(&_hotspot8, &_hotspot17, &_hotspot18, &_hotspot14, &_hotspot15, + g_globals->_sceneItems.addItems(&_hotspot8, &_hotspot17, &_hotspot18, &_hotspot14, &_hotspot15, &_hotspot16, &_theTech, &_hotspot13, &_hotspot21, &_hotspot20, &_hotspot22, &_hotspot23, &_hotspot24, &_hotspot25, &_hotspot19, &_hotspot26, NULL); } @@ -1153,51 +1155,51 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { void Scene4000::signal() { switch (_sceneMode) { case 4010: - _globals->setFlag(38); + g_globals->setFlag(38); _olo.remove(); // Deliberate fall-through case 4001: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 4002: case 4011: break; case 4003: _sceneMode = 4014; - setAction(&_sequenceManager1, this, 4014, &_globals->_player, &_hotspot5, NULL); + setAction(&_sequenceManager1, this, 4014, &g_globals->_player, &_hotspot5, NULL); break; case 4004: RING_INVENTORY._ladder._sceneNumber = 4000; // Deliberate fall-through case 4007: - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); - _globals->setFlag(40); + g_globals->_player._uiEnabled = true; + g_globals->_events.setCursor(CURSOR_USE); + g_globals->setFlag(40); break; case 4005: - _globals->_player.enableControl(); - _globals->_events.setCursor(CURSOR_WALK); - _globals->clearFlag(40); + g_globals->_player.enableControl(); + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->clearFlag(40); break; case 4006: - _globals->_sceneManager.changeScene(4045); + g_globals->_sceneManager.changeScene(4045); break; case 4008: - _globals->_sceneManager.changeScene(2320); + g_globals->_sceneManager.changeScene(2320); break; case 4009: - _globals->_sceneManager.changeScene(2200); + g_globals->_sceneManager.changeScene(2200); break; case 4012: - _globals->_player.checkAngle(&_theTech); - _globals->_sceneManager.changeScene(4025); + g_globals->_player.checkAngle(&_theTech); + g_globals->_sceneManager.changeScene(4025); break; case 4013: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); _olo.remove(); break; case 4014: - _globals->_sceneManager.changeScene(4250); + g_globals->_sceneManager.changeScene(4250); break; case 4015: ADD_MOVER_NULL(_miranda, 0, _miranda._position.y - 5); @@ -1208,14 +1210,14 @@ void Scene4000::signal() { void Scene4000::dispatch() { Scene::dispatch(); - if ((_globals->_player.getRegionIndex() == 10) || (_globals->_player.getRegionIndex() == 6)) - _globals->_player.fixPriority(200); - if (_globals->_player.getRegionIndex() == 11) - _globals->_player.fixPriority(-1); - if (_globals->_player.getRegionIndex() == 5) - _globals->_player.fixPriority(94); + if ((g_globals->_player.getRegionIndex() == 10) || (g_globals->_player.getRegionIndex() == 6)) + g_globals->_player.fixPriority(200); + if (g_globals->_player.getRegionIndex() == 11) + g_globals->_player.fixPriority(-1); + if (g_globals->_player.getRegionIndex() == 5) + g_globals->_player.fixPriority(94); - if (_globals->_sceneObjects->contains(&_hotspot5)) { + if (g_globals->_sceneObjects->contains(&_hotspot5)) { if ((_hotspot5.getRegionIndex() == 10) || (_hotspot5.getRegionIndex() == 6)) _hotspot5.fixPriority(200); if (_hotspot5.getRegionIndex() == 11) @@ -1224,10 +1226,10 @@ void Scene4000::dispatch() { _hotspot5.fixPriority(94); } - if (_globals->_sceneObjects->contains(&_miranda)) { + if (g_globals->_sceneObjects->contains(&_miranda)) { if (!_miranda._mover) - _miranda.checkAngle(&_globals->_player); - if (!_action && _globals->_player.getRegionIndex() == 23) { + _miranda.checkAngle(&g_globals->_player); + if (!_action && g_globals->_player.getRegionIndex() == 23) { ADD_MOVER_NULL(_miranda, 204, 186); } @@ -1240,30 +1242,30 @@ void Scene4000::dispatch() { } if (!_action) { - if ((RING_INVENTORY._peg._sceneNumber == 1) && _globals->getFlag(34) && - _globals->getFlag(37) && !_globals->getFlag(40)) { - _globals->_player.disableControl(); + if ((RING_INVENTORY._peg._sceneNumber == 1) && g_globals->getFlag(34) && + g_globals->getFlag(37) && !g_globals->getFlag(40)) { + g_globals->_player.disableControl(); _soundHandler1.play(177); - _globals->_soundHandler.play(178); + g_globals->_soundHandler.play(178); setAction(&_action1); } - if (_globals->_player.getRegionIndex() == 2) - _globals->_sceneManager.changeScene(4045); - if (_globals->_player.getRegionIndex() == 15) - _globals->_sceneManager.changeScene(4100); + if (g_globals->_player.getRegionIndex() == 2) + g_globals->_sceneManager.changeScene(4045); + if (g_globals->_player.getRegionIndex() == 15) + g_globals->_sceneManager.changeScene(4100); - if ((_globals->_player._position.x <= 5) && (_globals->_player._position.y < 100)) { - _globals->_player.disableControl(); + if ((g_globals->_player._position.x <= 5) && (g_globals->_player._position.y < 100)) { + g_globals->_player.disableControl(); - if (!_globals->_sceneObjects->contains(&_miranda) || (_miranda._position.y <= 100)) { + if (!g_globals->_sceneObjects->contains(&_miranda) || (_miranda._position.y <= 100)) { _sceneMode = 4008; - setAction(&_sequenceManager1, this, 4008, &_globals->_player, NULL); + setAction(&_sequenceManager1, this, 4008, &g_globals->_player, NULL); } else { _sceneMode = 4015; - _globals->_player.addMover(NULL); - setAction(&_sequenceManager1, this, 4015, &_globals->_player, &_miranda, NULL); + g_globals->_player.addMover(NULL); + setAction(&_sequenceManager1, this, 4015, &g_globals->_player, &_miranda, NULL); } } } @@ -1284,14 +1286,14 @@ void Scene4010::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerMText); _speakerSText._npc = &_hotspot1; _speakerMText._npc = &_hotspot2; - _speakerQText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(-38, 175)); - _globals->_player.changeZoom(75); + g_globals->_player.postInit(); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(-38, 175)); + g_globals->_player.changeZoom(75); _hotspot2.postInit(); _hotspot2.setVisage(2705); @@ -1308,12 +1310,12 @@ void Scene4010::postInit(SceneObjectList *OwnerList) { _hotspot1.animate(ANIM_MODE_1, NULL); _hotspot1.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.disableControl(); - setAction(&_sequenceManager, this, 4017, &_globals->_player, &_hotspot1, &_hotspot2, NULL); + g_globals->_player.disableControl(); + setAction(&_sequenceManager, this, 4017, &g_globals->_player, &_hotspot1, &_hotspot2, NULL); } void Scene4010::signal() { - _globals->_sceneManager.changeScene(4000); + g_globals->_sceneManager.changeScene(4000); } /*-------------------------------------------------------------------------- @@ -1322,7 +1324,7 @@ void Scene4010::signal() { *--------------------------------------------------------------------------*/ void Scene4025::Action1::signal() { - Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; + Scene4025 *scene = (Scene4025 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1362,15 +1364,15 @@ void Scene4025::Action1::signal() { break; case 2: - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_player._uiEnabled = true; + g_globals->_events.setCursor(CURSOR_USE); remove(); break; } } void Scene4025::Action2::signal() { - Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; + Scene4025 *scene = (Scene4025 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1406,8 +1408,8 @@ void Scene4025::Action2::signal() { scene->_armHotspot.animate(ANIM_MODE_5, this); break; case 2: - _globals->_player._uiEnabled = true; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_player._uiEnabled = true; + g_globals->_events.setCursor(CURSOR_USE); remove(); break; } @@ -1416,14 +1418,14 @@ void Scene4025::Action2::signal() { void Scene4025::Action3::signal() { switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); - _globals->_scenePalette.addRotation(64, 111, -1); + g_globals->_player.disableControl(); + g_globals->_scenePalette.addRotation(64, 111, -1); setDelay(120); break; case 1: - _globals->clearFlag(34); - _globals->_stripNum = 4025; - _globals->_sceneManager.changeScene(4000); + g_globals->clearFlag(34); + g_globals->_stripNum = 4025; + g_globals->_sceneManager.changeScene(4000); break; } } @@ -1439,7 +1441,7 @@ void Scene4025::Hole::synchronize(Serializer &s) { } void Scene4025::Hole::doAction(int action) { - Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; + Scene4025 *scene = (Scene4025 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -1449,15 +1451,15 @@ void Scene4025::Hole::doAction(int action) { if (!scene->_pegPtr && !_pegPtr) { setAction(&scene->_sequenceManager, scene, 4028, NULL); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_holePtr = this; scene->setAction(&scene->_action2); } break; case OBJECT_PEG: if (!scene->_pegPtr2) { - _globals->_player.disableControl(); - _globals->_events.setCursor(CURSOR_USE); + g_globals->_player.disableControl(); + g_globals->_events.setCursor(CURSOR_USE); RING_INVENTORY._peg._sceneNumber = 4025; scene->_pegPtr = &scene->_peg5; @@ -1481,14 +1483,14 @@ void Scene4025::Peg::synchronize(Serializer &s) { } void Scene4025::Peg::doAction(int action) { - Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene; + Scene4025 *scene = (Scene4025 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4025, 1); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_pegPtr = this; scene->setAction(&scene->_action1); break; @@ -1507,7 +1509,7 @@ void Scene4025::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(0, 100, 200, 100); - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); _pegPtr = _pegPtr2 = NULL; _peg1.postInit(); @@ -1607,11 +1609,11 @@ void Scene4025::postInit(SceneObjectList *OwnerList) { _armHotspot.setStrip(3); _armHotspot.setFrame(4); - _globals->_sceneItems.addItems(&_hole1, &_hole2, &_hole3, &_hole4, &_hole5, + g_globals->_sceneItems.addItems(&_hole1, &_hole2, &_hole3, &_hole4, &_hole5, &_peg1, &_peg2, &_peg3, &_peg4, &_peg5, NULL); - _globals->_player._uiEnabled = true; - _globals->_player.disableControl(); + g_globals->_player._uiEnabled = true; + g_globals->_player.disableControl(); setAction(&_sequenceManager, this, 4026, NULL); } @@ -1623,7 +1625,7 @@ void Scene4025::synchronize(Serializer &s) { } void Scene4025::remove() { - _globals->_scenePalette.clearListeners(); + g_globals->_scenePalette.clearListeners(); Scene::remove(); } @@ -1636,10 +1638,10 @@ void Scene4025::signal() { _gfxButton._bounds.expandPanes(); } - _globals->_player._uiEnabled = true; + g_globals->_player._uiEnabled = true; } - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); } void Scene4025::process(Event &event) { @@ -1649,7 +1651,7 @@ void Scene4025::process(Event &event) { if (RING_INVENTORY._peg._sceneNumber == 4025) RING_INVENTORY._peg._sceneNumber = 1; - _globals->_sceneManager.changeScene(4000); + g_globals->_sceneManager.changeScene(4000); } } @@ -1667,15 +1669,15 @@ void Scene4025::dispatch() { *--------------------------------------------------------------------------*/ void Scene4045::Action1::signal() { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(60); break; case 1: - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(4040, this, scene); break; case 2: @@ -1689,52 +1691,52 @@ void Scene4045::Action1::signal() { scene->_hotspot4.animate(ANIM_MODE_6, this); break; case 5: - ADD_MOVER(_globals->_player, 150, 300); + ADD_MOVER(g_globals->_player, 150, 300); break; case 6: - _globals->_stripNum = 4000; - _globals->_sceneManager.changeScene(4000); + g_globals->_stripNum = 4000; + g_globals->_sceneManager.changeScene(4000); remove(); break; } } void Scene4045::Action2::signal() { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(15); break; case 1: - scene->_stripManager.start(_globals->_stripNum, this, scene); + scene->_stripManager.start(g_globals->_stripNum, this, scene); break; case 2: scene->_olloFace.animate(ANIM_MODE_NONE, NULL); setDelay(10); break; case 3: - if (_globals->getFlag(38)) { - _globals->_player.enableControl(); + if (g_globals->getFlag(38)) { + g_globals->_player.enableControl(); remove(); } else { - ADD_MOVER(_globals->_player, 150, 300); + ADD_MOVER(g_globals->_player, 150, 300); } break; case 4: - _globals->setFlag(39); - _globals->_sceneManager.changeScene(4000); + g_globals->setFlag(39); + g_globals->_sceneManager.changeScene(4000); break; } } void Scene4045::Action3::signal() { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_hotspot4.animate(ANIM_MODE_5, this); break; case 1: @@ -1743,10 +1745,10 @@ void Scene4045::Action3::signal() { case 2: scene->_hotspot4.animate(ANIM_MODE_6, NULL); scene->_olloFace.animate(ANIM_MODE_NONE, NULL); - ADD_MOVER(_globals->_player, 91, 1264); + ADD_MOVER(g_globals->_player, 91, 1264); break; case 3: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -1755,7 +1757,7 @@ void Scene4045::Action3::signal() { /*--------------------------------------------------------------------------*/ void Scene4045::OlloStand::doAction(int action) { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: @@ -1772,20 +1774,20 @@ void Scene4045::OlloStand::doAction(int action) { setStrip(6); animate(ANIM_MODE_NONE, NULL); } - if (_globals->_player._position.y < 135) { + if (g_globals->_player._position.y < 135) { scene->_sceneMode = 4046; _numFrames = 10; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager, this, 4046, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, this, 4046, &g_globals->_player, this, NULL); } else { - if (!_globals->getFlag(31)) { - _globals->setFlag(31); - _globals->_stripNum = 4080; - } else if (!_globals->getFlag(38)) - _globals->_stripNum = 4060; + if (!g_globals->getFlag(31)) { + g_globals->setFlag(31); + g_globals->_stripNum = 4080; + } else if (!g_globals->getFlag(38)) + g_globals->_stripNum = 4060; else - _globals->_stripNum = 4503; + g_globals->_stripNum = 4503; scene->setAction(&scene->_action2); } @@ -1797,7 +1799,7 @@ void Scene4045::OlloStand::doAction(int action) { } void Scene4045::Miranda::doAction(int action) { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -1805,7 +1807,7 @@ void Scene4045::Miranda::doAction(int action) { break; case CURSOR_TALK: scene->_sceneMode = 4102; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_sequenceManager, scene, 4104, NULL); break; default: @@ -1815,22 +1817,22 @@ void Scene4045::Miranda::doAction(int action) { } void Scene4045::Necklace::doAction(int action) { - Scene4045 *scene = (Scene4045 *)_globals->_sceneManager._scene; + Scene4045 *scene = (Scene4045 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4045, 17); break; case CURSOR_USE: - if (_globals->_player._position.y < 135) { + if (g_globals->_player._position.y < 135) { SceneItem::display2(4045, 16); RING_INVENTORY._peg._sceneNumber = 1; - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); remove(); } else { scene->_sceneMode = 4047; - _globals->_player.disableControl(); - scene->setAction(&scene->_sequenceManager, scene, 4047, &_globals->_player, &scene->_olloStand, NULL); + g_globals->_player.disableControl(); + scene->setAction(&scene->_sequenceManager, scene, 4047, &g_globals->_player, &scene->_olloStand, NULL); } break; default: @@ -1875,13 +1877,13 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _flame.setPosition(Common::Point(47, 111)); _flame.animate(ANIM_MODE_2, NULL); _flame.fixPriority(156); - _globals->_sceneItems.push_back(&_flame); + g_globals->_sceneItems.push_back(&_flame); - _globals->_player.postInit(); - _globals->_player.setVisage(4200); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._moveDiff = Common::Point(7, 4); + g_globals->_player.postInit(); + g_globals->_player.setVisage(4200); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player._moveDiff = Common::Point(7, 4); _olloStand.postInit(); _olloStand.setVisage(4051); @@ -1891,10 +1893,10 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _olloFace.setStrip(4); _olloFace.fixPriority(152); - if(_globals->_sceneManager._previousScene == 4050) { - _globals->_soundHandler.play(155); - _globals->_player.setPosition(Common::Point(72, 128)); - _globals->_player.enableControl(); + if(g_globals->_sceneManager._previousScene == 4050) { + g_globals->_soundHandler.play(155); + g_globals->_player.setPosition(Common::Point(72, 128)); + g_globals->_player.enableControl(); _olloStand.setStrip(5); _olloStand.setPosition(Common::Point(173, 99)); @@ -1908,13 +1910,13 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _necklace.setVisage(4045); _necklace.setStrip(2); _necklace.setPosition(Common::Point(108, 82)); - _globals->_sceneItems.push_back(&_necklace); + g_globals->_sceneItems.push_back(&_necklace); } } else { - _globals->_player.setPosition(Common::Point(108, 192)); - _globals->_player.setStrip(4); + g_globals->_player.setPosition(Common::Point(108, 192)); + g_globals->_player.setStrip(4); - if (!_globals->getFlag(36) && !_globals->getFlag(43)) { + if (!g_globals->getFlag(36) && !g_globals->getFlag(43)) { _miranda.postInit(); _miranda.setVisage(4102); _miranda.animate(ANIM_MODE_NONE, NULL); @@ -1923,10 +1925,10 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _miranda.changeZoom(-1); _miranda.setPosition(Common::Point(66, 209)); - _globals->_sceneItems.push_back(&_miranda); + g_globals->_sceneItems.push_back(&_miranda); } - if (_globals->getFlag(31)) { + if (g_globals->getFlag(31)) { // Olo asleep _olloStand.setVisage(4051); _olloStand.setStrip(5); @@ -1941,7 +1943,7 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _necklace.setVisage(4045); _necklace.setStrip(2); _necklace.setPosition(Common::Point(108, 82)); - _globals->_sceneItems.push_back(&_necklace); + g_globals->_sceneItems.push_back(&_necklace); } } else { _olloStand.setPosition(Common::Point(186, 149)); @@ -1953,14 +1955,14 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _hotspot4.setPosition(Common::Point(202, 80)); _olloFace.setPosition(Common::Point(192, 77)); - _globals->setFlag(31); + g_globals->setFlag(31); setAction(&_action1); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); } } - _globals->_sceneItems.addItems(&_olloStand, &_hotspot7, &_hotspot8, &_hotspot9, &_hotspot10, + g_globals->_sceneItems.addItems(&_olloStand, &_hotspot7, &_hotspot8, &_hotspot9, &_hotspot10, &_hotspot13, &_hotspot11, &_hotspot12, &_hotspot14, NULL); } @@ -1982,34 +1984,34 @@ void Scene4045::signal() { _olloFace.animate(ANIM_MODE_NONE, NULL); break; case 4050: - _globals->_sceneManager.changeScene(4000); + g_globals->_sceneManager.changeScene(4000); break; case 4102: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; } } void Scene4045::dispatch() { if (!_action) { - if (_globals->_player.getRegionIndex() == 8) { - _globals->_player.addMover(NULL); + if (g_globals->_player.getRegionIndex() == 8) { + g_globals->_player.addMover(NULL); if (_olloStand._strip != 1) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 4046; _olloStand._numFrames = 10; - setAction(&_sequenceManager, this, 4046, &_globals->_player, &_olloStand, NULL); + setAction(&_sequenceManager, this, 4046, &g_globals->_player, &_olloStand, NULL); } else { setAction(&_action3); } } - if (_globals->_player.getRegionIndex() == 10) - _globals->_sceneManager.changeScene(4050); - if (_globals->_player._position.y >= 196) { + if (g_globals->_player.getRegionIndex() == 10) + g_globals->_sceneManager.changeScene(4050); + if (g_globals->_player._position.y >= 196) { _sceneMode = 4050; - _globals->_player.disableControl(); - setAction(&_sequenceManager, this, 4105, &_globals->_player, NULL); + g_globals->_player.disableControl(); + setAction(&_sequenceManager, this, 4105, &g_globals->_player, NULL); } } @@ -2023,21 +2025,21 @@ void Scene4045::dispatch() { void Scene4050::Action1::signal() { // "Map" on the wall - Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; + Scene4050 *scene = (Scene4050 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: { Common::Point pt(204, 152); PlayerMover *mover = new PlayerMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: - _globals->_player.checkAngle(&scene->_hotspot17); + g_globals->_player.checkAngle(&scene->_hotspot17); scene->_hotspot14.postInit(); scene->_hotspot14.setVisage(4050); @@ -2047,11 +2049,11 @@ void Scene4050::Action1::signal() { setDelay(10); break; case 3: - _globals->_events.waitForPress(); - _globals->setFlag(45); + g_globals->_events.waitForPress(); + g_globals->setFlag(45); scene->_hotspot14.remove(); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -2061,34 +2063,34 @@ void Scene4050::Action2::signal() { // Climb down the rope switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(120); break; case 1: - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: - _globals->_player.setVisage(4202); - _globals->_player.changeZoom(100); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(192, 130)); + g_globals->_player.setVisage(4202); + g_globals->_player.changeZoom(100); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(192, 130)); - ADD_MOVER(_globals->_player, 215, 130); + ADD_MOVER(g_globals->_player, 215, 130); break; case 3: - _globals->_player.setVisage(4052); - _globals->_player.setStrip(5); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(236, 130)); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(4052); + g_globals->_player.setStrip(5); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(236, 130)); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 4: - _globals->_player.setVisage(4202); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setPosition(Common::Point(210, 185)); - _globals->_player.fixPriority(-1); - _globals->_player.enableControl(); + g_globals->_player.setVisage(4202); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setPosition(Common::Point(210, 185)); + g_globals->_player.fixPriority(-1); + g_globals->_player.enableControl(); remove(); break; } @@ -2101,51 +2103,51 @@ void Scene4050::Action3::signal() { ADD_PLAYER_MOVER(210, 185); break; case 1: - _globals->_player.fixPriority(200); - _globals->_player.setVisage(4052); - _globals->_player.setStrip(5); - _globals->_player.changeZoom(100); - _globals->_player.setFrame(_globals->_player.getFrameCount()); - _globals->_player.setPosition(Common::Point(236, 130)); - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.fixPriority(200); + g_globals->_player.setVisage(4052); + g_globals->_player.setStrip(5); + g_globals->_player.changeZoom(100); + g_globals->_player.setFrame(g_globals->_player.getFrameCount()); + g_globals->_player.setPosition(Common::Point(236, 130)); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 2: - _globals->_player.setVisage(4202); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(215, 130)); - ADD_MOVER(_globals->_player, 212, 130); + g_globals->_player.setVisage(4202); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(215, 130)); + ADD_MOVER(g_globals->_player, 212, 130); break; case 3: - _globals->_stripNum = 4050; - _globals->_sceneManager.changeScene(4000); + g_globals->_stripNum = 4050; + g_globals->_sceneManager.changeScene(4000); break; } } void Scene4050::Action4::signal() { - Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; + Scene4050 *scene = (Scene4050 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); - ADD_MOVER(_globals->_player, 189, 135); - _globals->_player.fixPriority(200); + g_globals->_player.disableControl(); + ADD_MOVER(g_globals->_player, 189, 135); + g_globals->_player.fixPriority(200); break; case 1: - _globals->_player._moveDiff.y = 3; - _globals->_player.setStrip2(3); - _globals->_player._frame = 1; - _globals->_player.setPosition(Common::Point(189, 129)); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player._moveDiff.y = 3; + g_globals->_player.setStrip2(3); + g_globals->_player._frame = 1; + g_globals->_player.setPosition(Common::Point(189, 129)); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: - _globals->_player.setVisage(4202); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(192, 130)); - _globals->_player.changeZoom(100); - ADD_MOVER(_globals->_player, 215, 130); + g_globals->_player.setVisage(4202); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(192, 130)); + g_globals->_player.changeZoom(100); + ADD_MOVER(g_globals->_player, 215, 130); scene->_hotspot16.postInit(); scene->_hotspot16.setVisage(4052); @@ -2155,18 +2157,18 @@ void Scene4050::Action4::signal() { ADD_MOVER(scene->_hotspot16, 172, 188); break; case 3: - _globals->_player.setVisage(4052); - _globals->_player.setStrip(5); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(238, 130)); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(4052); + g_globals->_player.setStrip(5); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(238, 130)); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 4: - _globals->_player.setVisage(4052); - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(216, 184)); - _globals->_player.fixPriority(-1); + g_globals->_player.setVisage(4052); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(216, 184)); + g_globals->_player.fixPriority(-1); break; case 5: scene->_hotspot16.setStrip2(4); @@ -2175,12 +2177,12 @@ void Scene4050::Action4::signal() { break; case 6: scene->_hotspot16.animate(ANIM_MODE_5, NULL); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 7: - _globals->_player.setVisage(4202); - _globals->_player.setStrip(6); - _globals->_player.setFrame(1); + g_globals->_player.setVisage(4202); + g_globals->_player.setStrip(6); + g_globals->_player.setFrame(1); scene->_stripManager.start(4051, this); break; @@ -2188,7 +2190,7 @@ void Scene4050::Action4::signal() { setDelay(15); break; case 9: - _globals->_sceneManager.changeScene(4000); + g_globals->_sceneManager.changeScene(4000); break; } } @@ -2196,14 +2198,14 @@ void Scene4050::Action4::signal() { /*--------------------------------------------------------------------------*/ void Scene4050::Hotspot15::doAction(int action) { - Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; + Scene4050 *scene = (Scene4050 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4050, 14); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setAction(&scene->_action3); break; default: @@ -2213,7 +2215,7 @@ void Scene4050::Hotspot15::doAction(int action) { } void Scene4050::Hotspot17::doAction(int action) { - Scene4050 *scene = (Scene4050 *)_globals->_sceneManager._scene; + Scene4050 *scene = (Scene4050 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -2255,50 +2257,50 @@ void Scene4050::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerQText); _stripManager.addSpeaker(&_speakerGameText); - _globals->_player.postInit(); + g_globals->_player.postInit(); - switch (_globals->_sceneManager._previousScene) { + switch (g_globals->_sceneManager._previousScene) { case 4000: - if (_globals->getFlag(41)) { + if (g_globals->getFlag(41)) { // Using a rope _hotspot15.postInit(); _hotspot15.setVisage(4054); _hotspot15.setPosition(Common::Point(206, 103)); - _globals->_sceneItems.push_back(&_hotspot15); + g_globals->_sceneItems.push_back(&_hotspot15); - _globals->_player.setVisage(4008); - _globals->_player.setPosition(Common::Point(206, 62)); - _globals->_player.changeZoom(130); - _globals->_player.fixPriority(200); - _globals->_player.setStrip(2); + g_globals->_player.setVisage(4008); + g_globals->_player.setPosition(Common::Point(206, 62)); + g_globals->_player.changeZoom(130); + g_globals->_player.fixPriority(200); + g_globals->_player.setStrip(2); setAction(&_action2); - _globals->_soundHandler.play(175); + g_globals->_soundHandler.play(175); } else { // Without the rope - _globals->_player.setVisage(5315); - _globals->_player.setPosition(Common::Point(189, 83)); - _globals->_player.changeZoom(130); - _globals->_player.setStrip2(2); - _globals->_player._moveDiff.y = 10; - _globals->_player.animate(ANIM_MODE_2, NULL); + g_globals->_player.setVisage(5315); + g_globals->_player.setPosition(Common::Point(189, 83)); + g_globals->_player.changeZoom(130); + g_globals->_player.setStrip2(2); + g_globals->_player._moveDiff.y = 10; + g_globals->_player.animate(ANIM_MODE_2, NULL); setAction(&_action4); - _globals->_soundHandler.play(176); + g_globals->_soundHandler.play(176); } break; case 4045: _hotspot15.postInit(); _hotspot15.setVisage(4054); _hotspot15.setPosition(Common::Point(206, 103)); - _globals->_sceneItems.push_back(&_hotspot15); + g_globals->_sceneItems.push_back(&_hotspot15); - _globals->_player.setVisage(4202); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(193, 193)); + g_globals->_player.setVisage(4202); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(193, 193)); - _globals->_soundHandler.play(175); + g_globals->_soundHandler.play(175); break; default: break; @@ -2327,25 +2329,25 @@ void Scene4050::postInit(SceneObjectList *OwnerList) { _hotspot11.setBounds(Rect(263, 105, 279, 147)); _hotspot12.setBounds(Rect(258, 154, 307, 180)); - _globals->_sceneItems.addItems(&_hotspot17, &_hotspot12, &_hotspot11, &_hotspot10, &_hotspot13, + g_globals->_sceneItems.addItems(&_hotspot17, &_hotspot12, &_hotspot11, &_hotspot10, &_hotspot13, &_hotspot2, &_hotspot3, &_hotspot4, &_hotspot5, &_hotspot6, &_hotspot8, &_hotspot9, &_hotspot7, &_hotspot1, NULL); } void Scene4050::signal() { if (_sceneMode == 4050) - _globals->_sceneManager.changeScene(4045); + g_globals->_sceneManager.changeScene(4045); } void Scene4050::dispatch() { if (!_action) { - if ((_globals->_player._canWalk) && (_globals->_player._position.y > 196)) { + if ((g_globals->_player._canWalk) && (g_globals->_player._position.y > 196)) { _sceneMode = 4050; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); Common::Point pt(160, 275); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); } } Scene::dispatch(); @@ -2357,28 +2359,28 @@ void Scene4050::dispatch() { *--------------------------------------------------------------------------*/ void Scene4100::Action1::signal() { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(10); break; case 1: - scene->_stripManager.start(_globals->_stripNum, this); + scene->_stripManager.start(g_globals->_stripNum, this); break; case 2: setDelay(30); break; case 3: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene4100::Action2::signal() { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2409,12 +2411,12 @@ void Scene4100::Action2::signal() { void Scene4100::Action3::signal() { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->clearFlag(43); - _globals->setFlag(36); + g_globals->clearFlag(43); + g_globals->setFlag(36); setDelay(15); break; case 1: @@ -2430,7 +2432,7 @@ void Scene4100::Action3::signal() { setDelay(15); break; case 5: - _globals->_sceneManager.changeScene(4150); + g_globals->_sceneManager.changeScene(4150); break; default: break; @@ -2439,7 +2441,7 @@ void Scene4100::Action3::signal() { void Scene4100::Action4::signal() { // Rock getting drunk - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2454,26 +2456,26 @@ void Scene4100::Action4::signal() { scene->_hotspot1.animate(ANIM_MODE_5, this); break; case 3: - _globals->clearFlag(43); - _globals->setFlag(42); + g_globals->clearFlag(43); + g_globals->setFlag(42); scene->_stripManager.start(4119, this); break; case 4: setDelay(15); break; case 5: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene4100::Action5::signal() { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); ADD_PLAYER_MOVER(58, 151); break; case 1: @@ -2486,10 +2488,10 @@ void Scene4100::Action5::signal() { scene->_ladder.setPosition(Common::Point(49, 144)); RING_INVENTORY._ladder._sceneNumber = 4100; - _globals->_sceneItems.push_front(&scene->_ladder); + g_globals->_sceneItems.push_front(&scene->_ladder); } - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -2497,16 +2499,16 @@ void Scene4100::Action5::signal() { void Scene4100::Action6::signal() { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_stripManager.start(4103, this); ADD_PLAYER_MOVER(245, 167); break; case 1: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -2515,39 +2517,39 @@ void Scene4100::Action6::signal() { /*--------------------------------------------------------------------------*/ void Scene4100::Hotspot1::doAction(int action) { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_STUNNER: SceneItem::display2(4100, 16); break; case OBJECT_ALE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action3); break; case CURSOR_LOOK: - SceneItem::display2(4100, _globals->getFlag(42) ? 24 : 12); + SceneItem::display2(4100, g_globals->getFlag(42) ? 24 : 12); break; case CURSOR_USE: SceneItem::display2(4100, 22); break; case CURSOR_TALK: if (RING_INVENTORY._peg._sceneNumber == 1) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 4109; scene->setAction(&scene->_sequenceManager, scene, 4109, NULL); - } else if (_globals->getFlag(42)) { + } else if (g_globals->getFlag(42)) { scene->_sceneMode = 4102; scene->setAction(&scene->_sequenceManager, scene, 4102, NULL); } else { - if (_globals->getFlag(33)) - _globals->_stripNum = 4077; - else if (_globals->getFlag(82)) { - _globals->clearFlag(82); - _globals->_stripNum = 4100; + if (g_globals->getFlag(33)) + g_globals->_stripNum = 4077; + else if (g_globals->getFlag(82)) { + g_globals->clearFlag(82); + g_globals->_stripNum = 4100; } else { - _globals->_stripNum = 4075; - _globals->setFlag(33); + g_globals->_stripNum = 4075; + g_globals->setFlag(33); } scene->setAction(&scene->_action1); @@ -2571,7 +2573,7 @@ void Scene4100::Hotspot2::doAction(int action) { } void Scene4100::Miranda::doAction(int action) { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -2588,15 +2590,15 @@ void Scene4100::Miranda::doAction(int action) { } void Scene4100::Ladder::doAction(int action) { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4100, 2); break; case CURSOR_USE: - if (_globals->getFlag(42)) { - _globals->_player.disableControl(); + if (g_globals->getFlag(42)) { + g_globals->_player.disableControl(); scene->setAction(&scene->_action5); } else { scene->_sceneMode = 4102; @@ -2613,14 +2615,14 @@ void Scene4100::Ladder::doAction(int action) { Exit hotspot, South */ void Scene4100::Hotspot14::doAction(int action) { - Scene4100 *scene = (Scene4100 *)_globals->_sceneManager._scene; + Scene4100 *scene = (Scene4100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4100, 0); break; case OBJECT_LADDER: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action5); break; default: @@ -2657,13 +2659,13 @@ void Scene4100::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerML); _stripManager.addSpeaker(&_speakerQR); - _globals->_player.postInit(); - _globals->_player.setVisage(4200); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(4); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(88, 180)); - _globals->_player._moveDiff = Common::Point(7, 4); + g_globals->_player.postInit(); + g_globals->_player.setVisage(4200); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setStrip(4); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(88, 180)); + g_globals->_player._moveDiff = Common::Point(7, 4); _hotspot1.postInit(); _hotspot1.setVisage(4102); @@ -2682,18 +2684,18 @@ void Scene4100::postInit(SceneObjectList *OwnerList) { _hotspot4.setStrip2(2); _hotspot4.setPosition(Common::Point(152, 167)); - if (_globals->getFlag(36)) { + if (g_globals->getFlag(36)) { _hotspot1.setVisage(4105); _hotspot1.setStrip(1); _hotspot1.setFrame(4); - } else if (!_globals->getFlag(43)) { + } else if (!g_globals->getFlag(43)) { _miranda.postInit(); _miranda.setVisage(4102); _miranda.setStrip2(3); _miranda.setFrame(2); _miranda.setPosition(Common::Point(65, 188)); - _globals->_sceneItems.push_back(&_miranda); + g_globals->_sceneItems.push_back(&_miranda); } if (RING_INVENTORY._ladder._sceneNumber == 4100) { @@ -2701,7 +2703,7 @@ void Scene4100::postInit(SceneObjectList *OwnerList) { _ladder.setVisage(4101); _ladder.setPosition(Common::Point(49, 144)); - _globals->_sceneItems.push_back(&_ladder); + g_globals->_sceneItems.push_back(&_ladder); } _hotspot14.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); @@ -2713,41 +2715,41 @@ void Scene4100::postInit(SceneObjectList *OwnerList) { _hotspot12.setBounds(Rect(229, 59, 256, 122)); _hotspot13.setBounds(Rect(255, 152, 286, 183)); - _globals->_sceneItems.addItems(&_hotspot3, &_hotspot1, &_hotspot13, &_hotspot12, &_hotspot4, + g_globals->_sceneItems.addItems(&_hotspot3, &_hotspot1, &_hotspot13, &_hotspot12, &_hotspot4, &_hotspot11, &_hotspot9, &_hotspot7, &_hotspot10, &_hotspot8, &_hotspot14, NULL); - if (_globals->_sceneManager._previousScene == 4150) { - _globals->_soundHandler.play(155); + if (g_globals->_sceneManager._previousScene == 4150) { + g_globals->_soundHandler.play(155); - if (!_globals->getFlag(42)) { + if (!g_globals->getFlag(42)) { _hotspot1.setVisage(4104); _hotspot1.setPosition(Common::Point(152, 118)); _hotspot1.setStrip2(-1); _hotspot1.setFrame2(-1); _hotspot1.setFrame(1); - _globals->_player.setStrip(2); - _globals->_player.disableControl(); + g_globals->_player.setStrip(2); + g_globals->_player.disableControl(); setAction(&_action4); - _globals->clearFlag(43); + g_globals->clearFlag(43); } else { // Workaround: In the original, the mouse is hidden when Quinn // goes back to scene 4150 then to scene 4100. This enables everything. - _globals->_player.enableControl(); + g_globals->_player.enableControl(); } - _globals->_player.setPosition(Common::Point(252, 139)); - _globals->_player.setStrip(2); + g_globals->_player.setPosition(Common::Point(252, 139)); + g_globals->_player.setStrip(2); } else { - if ((RING_INVENTORY._ale._sceneNumber == 4100) && !_globals->getFlag(42)) { - _globals->_player.disableControl(); + if ((RING_INVENTORY._ale._sceneNumber == 4100) && !g_globals->getFlag(42)) { + g_globals->_player.disableControl(); setAction(&_action3); } - if (_globals->getFlag(35)) { - _globals->_player.disableControl(); + if (g_globals->getFlag(35)) { + g_globals->_player.disableControl(); _sceneMode = 4101; - setAction(&_sequenceManager, this, 4101, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 4101, &g_globals->_player, NULL); } } } @@ -2755,28 +2757,28 @@ void Scene4100::postInit(SceneObjectList *OwnerList) { void Scene4100::signal() { switch (_sceneMode) { case 4101: - _globals->_sceneManager.changeScene(4000); + g_globals->_sceneManager.changeScene(4000); break; case 4102: case 4103: case 4109: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; } } void Scene4100::dispatch() { if (!_action) { - if ((_globals->_player.getRegionIndex() == 15) && !_globals->getFlag(42)) + if ((g_globals->_player.getRegionIndex() == 15) && !g_globals->getFlag(42)) setAction(&_action6); - if (_globals->_player.getRegionIndex() == 8) - _globals->_sceneManager.changeScene(4150); + if (g_globals->_player.getRegionIndex() == 8) + g_globals->_sceneManager.changeScene(4150); - if (_globals->_player._position.y >= 196) { - _globals->_player.disableControl(); + if (g_globals->_player._position.y >= 196) { + g_globals->_player.disableControl(); _sceneMode = 4101; - setAction(&_sequenceManager, this, 4105, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 4105, &g_globals->_player, NULL); } } @@ -2789,7 +2791,7 @@ void Scene4100::dispatch() { *--------------------------------------------------------------------------*/ void Scene4150::Action1::signal() { - Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; + Scene4150 *scene = (Scene4150 *)g_globals->_sceneManager._scene; byte adjustData[4] = {0, 0, 0, 0}; switch (_actionIndex++) { @@ -2807,7 +2809,7 @@ void Scene4150::Action1::signal() { break; case 4: { for (int idx = 100; idx >= 0; idx -= 5) { - _globals->_scenePalette.fade(adjustData, false, idx); + g_globals->_scenePalette.fade(adjustData, false, idx); g_system->updateScreen(); g_system->delayMillis(10); } @@ -2826,8 +2828,8 @@ void Scene4150::Action1::signal() { break; } case 5: - _globals->_scenePalette.loadPalette(4150); - _globals->_scenePalette.refresh(); + g_globals->_scenePalette.loadPalette(4150); + g_globals->_scenePalette.refresh(); setDelay(60); break; case 6: @@ -2835,7 +2837,7 @@ void Scene4150::Action1::signal() { break; case 7: for (int idx = 100; idx >= 0; idx -= 5) { - _globals->_scenePalette.fade(adjustData, false, idx); + g_globals->_scenePalette.fade(adjustData, false, idx); g_system->updateScreen(); g_system->delayMillis(10); } @@ -2847,28 +2849,28 @@ void Scene4150::Action1::signal() { scene->_hotspot1.setFrame(1); scene->_hotspot1.show(); - _globals->_player.setVisage(4200); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(3); - _globals->_player.setPosition(Common::Point(139, 166)); - _globals->_player._moveDiff = Common::Point(7, 3); - _globals->_player.show(); + g_globals->_player.setVisage(4200); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setStrip(3); + g_globals->_player.setPosition(Common::Point(139, 166)); + g_globals->_player._moveDiff = Common::Point(7, 3); + g_globals->_player.show(); setDelay(120); break; case 8: - _globals->_scenePalette.loadPalette(4150); - _globals->_scenePalette.refresh(); + g_globals->_scenePalette.loadPalette(4150); + g_globals->_scenePalette.refresh(); setDelay(30); break; case 9: scene->_stripManager.start(4523, this); break; case 10: - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player._moveDiff = Common::Point(7, 4); - _globals->_player.setStrip(3); - _globals->_player.enableControl(); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player._moveDiff = Common::Point(7, 4); + g_globals->_player.setStrip(3); + g_globals->_player.enableControl(); remove(); break; @@ -2876,7 +2878,7 @@ void Scene4150::Action1::signal() { } void Scene4150::Action2::signal() { - Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; + Scene4150 *scene = (Scene4150 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -2888,10 +2890,10 @@ void Scene4150::Action2::signal() { scene->_hotspot1.setFrame(1); scene->_hotspot1.animate(ANIM_MODE_5, this); - _globals->_player.animate(ANIM_MODE_5, NULL); + g_globals->_player.animate(ANIM_MODE_5, NULL); break; case 2: - _globals->_player.hide(); + g_globals->_player.hide(); scene->_hotspot1.setVisage(4153); scene->_hotspot1.setStrip(1); scene->_hotspot1.setFrame(1); @@ -2904,15 +2906,15 @@ void Scene4150::Action2::signal() { } void Scene4150::Action3::signal() { - Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; + Scene4150 *scene = (Scene4150 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(15); break; case 1: - _globals->_player.checkAngle(&scene->_hotspot3); + g_globals->_player.checkAngle(&scene->_hotspot3); if (RING_INVENTORY._rope._sceneNumber == 1) { scene->_hotspot3.postInit(); @@ -2920,13 +2922,13 @@ void Scene4150::Action3::signal() { scene->_hotspot3.setPosition(Common::Point(175, 70)); RING_INVENTORY._rope._sceneNumber = 4150; - _globals->_sceneItems.push_front(&scene->_hotspot3); + g_globals->_sceneItems.push_front(&scene->_hotspot3); } else { RING_INVENTORY._rope._sceneNumber = 1; scene->_hotspot3.remove(); } - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -2935,7 +2937,7 @@ void Scene4150::Action3::signal() { /*--------------------------------------------------------------------------*/ void Scene4150::HotspotGroup1::doAction(int action) { - Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; + Scene4150 *scene = (Scene4150 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -2950,8 +2952,8 @@ void Scene4150::HotspotGroup1::doAction(int action) { void Scene4150::HotspotGroup3::doAction(int action) { switch (action) { case CURSOR_LOOK: - SceneItem::display2(4150, _globals->getFlag(46) ? 9 : 8); - _globals->setFlag(46); + SceneItem::display2(4150, g_globals->getFlag(46) ? 9 : 8); + g_globals->setFlag(46); break; case CURSOR_USE: SceneItem::display2(4150, 30); @@ -2962,8 +2964,8 @@ void Scene4150::HotspotGroup3::doAction(int action) { void Scene4150::HotspotGroup6::doAction(int action) { switch (action) { case CURSOR_LOOK: - SceneItem::display2(4150, _globals->getFlag(47) ? 16 : 15); - _globals->setFlag(47); + SceneItem::display2(4150, g_globals->getFlag(47) ? 16 : 15); + g_globals->setFlag(47); break; case CURSOR_USE: SceneItem::display2(4150, 31); @@ -2972,7 +2974,7 @@ void Scene4150::HotspotGroup6::doAction(int action) { } void Scene4150::Hotspot3::doAction(int action) { - Scene4150 *scene = (Scene4150 *)_globals->_sceneManager._scene; + Scene4150 *scene = (Scene4150 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -3029,31 +3031,31 @@ void Scene4150::postInit(SceneObjectList *OwnerList) { _hotspot1.postInit(); _hotspot1.setPosition(Common::Point(177, 201)); - if (_globals->getFlag(44)) { - _globals->_player.postInit(); - _globals->_player.setVisage(4200); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setStrip(2); - _globals->_player.setPosition(Common::Point(328, 160)); - _globals->_player._moveDiff = Common::Point(7, 4); - _globals->_player.disableControl(); + if (g_globals->getFlag(44)) { + g_globals->_player.postInit(); + g_globals->_player.setVisage(4200); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setStrip(2); + g_globals->_player.setPosition(Common::Point(328, 160)); + g_globals->_player._moveDiff = Common::Point(7, 4); + g_globals->_player.disableControl(); _sceneMode = 4151; - setAction(&_sequenceManager, this, 4151, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 4151, &g_globals->_player, NULL); _hotspot1.setVisage(4157); _hotspot1.setPosition(Common::Point(177, 201)); } else { - _globals->_player.postInit(); - _globals->_player.setVisage(4154); - _globals->_player._canWalk = false; - _globals->_player.setPosition(Common::Point(198, 202)); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(4154); + g_globals->_player._canWalk = false; + g_globals->_player.setPosition(Common::Point(198, 202)); + g_globals->_player.disableControl(); _hotspot1.setVisage(4152); setAction(&_action1); - _globals->setFlag(44); + g_globals->setFlag(44); } if (RING_INVENTORY._rope._sceneNumber == 4150) { @@ -3061,10 +3063,10 @@ void Scene4150::postInit(SceneObjectList *OwnerList) { _hotspot3.setVisage(4150); _hotspot3.setPosition(Common::Point(175, 70)); - _globals->_sceneItems.push_back(&_hotspot3); + g_globals->_sceneItems.push_back(&_hotspot3); } - _globals->_sceneItems.push_back(&_hotspot1); + g_globals->_sceneItems.push_back(&_hotspot1); _hotspot5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); _hotspot6.setBounds(Rect(28, 121, 80, 148)); @@ -3089,32 +3091,32 @@ void Scene4150::postInit(SceneObjectList *OwnerList) { _hotspot25.setBounds(Rect(183, 155, 316, 190)); _hotspot26.setBounds(Rect(98, 169, 238, 198)); - _globals->_sceneItems.addItems(&_hotspot24, &_hotspot23, &_hotspot13, &_hotspot25, + g_globals->_sceneItems.addItems(&_hotspot24, &_hotspot23, &_hotspot13, &_hotspot25, &_hotspot26, &_hotspot19, &_hotspot22, &_hotspot20, &_hotspot17, &_hotspot16, &_hotspot15, &_hotspot11, &_hotspot14, &_hotspot18, &_hotspot21, &_hotspot12, &_hotspot10, &_hotspot9, &_hotspot8, &_hotspot7, &_hotspot6, &_hotspot2, &_hotspot5, NULL); - _globals->_soundHandler.play(165); + g_globals->_soundHandler.play(165); _soundHandler.play(311); } void Scene4150::signal() { if (_sceneMode == 4151) - _globals->_player.enableControl(); + g_globals->_player.enableControl(); else if (_sceneMode == 4152) - _globals->_sceneManager.changeScene(4100); + g_globals->_sceneManager.changeScene(4100); } void Scene4150::dispatch() { Scene::dispatch(); - if (!_action && (_globals->_player._position.x >= 316)) { - _globals->_soundHandler.fadeOut(NULL); + if (!_action && (g_globals->_player._position.x >= 316)) { + g_globals->_soundHandler.fadeOut(NULL); _soundHandler.fadeOut(NULL); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 4152; - setAction(&_sequenceManager, this, 4152, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 4152, &g_globals->_player, NULL); } } @@ -3124,15 +3126,15 @@ void Scene4150::dispatch() { *--------------------------------------------------------------------------*/ void Scene4250::Action1::signal() { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: - ADD_MOVER_NULL(_globals->_player, 6, 190); + ADD_MOVER_NULL(g_globals->_player, 6, 190); ADD_MOVER_NULL(scene->_hotspot3, 9, 195); ADD_MOVER(scene->_hotspot1, 12, 185); break; @@ -3155,44 +3157,44 @@ void Scene4250::Action1::signal() { scene->_stripManager.start(4470, this); break; case 8: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene4250::Action2::signal() { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); ADD_PLAYER_MOVER(247, 182); break; case 1: - _globals->_player.setVisage(2670); - _globals->_player.changeZoom(50); - _globals->_player.setStrip(3); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2670); + g_globals->_player.changeZoom(50); + g_globals->_player.setStrip(3); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: - if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) { + if ((g_globals->_stripNum == 9000) || (g_globals->_stripNum == 4300)) { scene->_stripManager.start(4205, this); } else { scene->_stripManager.start(4490, this); } break; case 3: - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 4: - _globals->_player.setVisage(2602); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.changeZoom(70); + g_globals->_player.setVisage(2602); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.changeZoom(70); - if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) { - _globals->_player.enableControl(); + if ((g_globals->_stripNum == 9000) || (g_globals->_stripNum == 4300)) { + g_globals->_player.enableControl(); remove(); } else { ADD_PLAYER_MOVER(6, 180); @@ -3206,19 +3208,19 @@ void Scene4250::Action2::signal() { ADD_MOVER_NULL(scene->_hotspot5, -30, 195); break; case 6: - _globals->clearFlag(59); - _globals->clearFlag(70); - _globals->clearFlag(37); - _globals->clearFlag(114); - _globals->clearFlag(36); - _globals->clearFlag(43); - _globals->_sceneManager.changeScene(2100); + g_globals->clearFlag(59); + g_globals->clearFlag(70); + g_globals->clearFlag(37); + g_globals->clearFlag(114); + g_globals->clearFlag(36); + g_globals->clearFlag(43); + g_globals->_sceneManager.changeScene(2100); break; } } void Scene4250::Action3::signal() { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -3228,46 +3230,46 @@ void Scene4250::Action3::signal() { scene->_stripManager.start(4480, this); break; case 2: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene4250::Action4::signal() { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: - _globals->_player.addMover(NULL); + g_globals->_player.addMover(NULL); scene->_stripManager.start((RING_INVENTORY._helmet._sceneNumber == 4250) ? 4259 : 4256, this); break; case 2: - ADD_PLAYER_MOVER(_globals->_player._position.x + 5, _globals->_player._position.y); + ADD_PLAYER_MOVER(g_globals->_player._position.x + 5, g_globals->_player._position.y); break; case 3: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene4250::Action5::signal() { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: scene->_hotspot4.fixPriority(195); scene->_hotspot1.fixPriority(105); - ADD_MOVER_NULL(_globals->_player, 6, 185); + ADD_MOVER_NULL(g_globals->_player, 6, 185); ADD_MOVER_NULL(scene->_hotspot4, 9, 190); ADD_MOVER(scene->_hotspot1, 12, 180); break; @@ -3280,7 +3282,7 @@ void Scene4250::Action5::signal() { scene->_hotspot4.fixPriority(-1); scene->_hotspot1.setStrip(5); scene->_hotspot4.setStrip(7); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -3289,15 +3291,15 @@ void Scene4250::Action5::signal() { /*--------------------------------------------------------------------------*/ void Scene4250::Hotspot1::doAction(int action) { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 19 : 14); break; case CURSOR_TALK: - _globals->_player.disableControl(); - if (!_globals->_sceneObjects->contains(&scene->_hotspot4)) { + g_globals->_player.disableControl(); + if (!g_globals->_sceneObjects->contains(&scene->_hotspot4)) { scene->setAction(&scene->_action3); } else { scene->_sceneMode = 4260; @@ -3306,7 +3308,7 @@ void Scene4250::Hotspot1::doAction(int action) { scene->setAction(&scene->_sequenceManager, scene, 4265, this, NULL); } else { scene->setAction(&scene->_sequenceManager, scene, - _globals->_sceneObjects->contains(&scene->_hotspot6) ? 4260 : 4262, this, NULL); + g_globals->_sceneObjects->contains(&scene->_hotspot6) ? 4260 : 4262, this, NULL); } } break; @@ -3330,7 +3332,7 @@ void Scene4250::Hotspot1::doAction(int action) { void Scene4250::Hotspot2::doAction(int action) { //Ship with stasis field - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -3338,19 +3340,19 @@ void Scene4250::Hotspot2::doAction(int action) { SceneItem::display2(4250, 16); break; case OBJECT_SCANNER: - if ((_globals->_stripNum == 9000) || (_globals->_stripNum == 4300)) + if ((g_globals->_stripNum == 9000) || (g_globals->_stripNum == 4300)) scene->setAction(&scene->_action2); - else if (_globals->getFlag(55)) + else if (g_globals->getFlag(55)) SceneItem::display2(4250, 17); else { - _globals->setFlag(55); + g_globals->setFlag(55); scene->setAction(&scene->_action2); } break; case OBJECT_STASIS_NEGATOR: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 4252; - scene->setAction(&scene->_sequenceManager, scene, 4252, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 4252, &g_globals->_player, this, NULL); break; default: SceneHotspot::doAction(action); @@ -3359,7 +3361,7 @@ void Scene4250::Hotspot2::doAction(int action) { } void Scene4250::Hotspot4::doAction(int action) { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -3378,8 +3380,8 @@ void Scene4250::Hotspot4::doAction(int action) { SceneHotspot::doAction(action); break; case CURSOR_TALK: - _globals->_player.disableControl(); - if (!_globals->_sceneObjects->contains(&scene->_hotspot6)) { + g_globals->_player.disableControl(); + if (!g_globals->_sceneObjects->contains(&scene->_hotspot6)) { scene->_sceneMode = 4254; scene->setAction(&scene->_sequenceManager, scene, 4263, NULL); } else { @@ -3401,7 +3403,7 @@ void Scene4250::Hotspot4::doAction(int action) { } void Scene4250::Hotspot6::doAction(int action) { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -3414,17 +3416,17 @@ void Scene4250::Hotspot6::doAction(int action) { SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 20 : 3); break; case OBJECT_HELMET: - _globals->_soundHandler.play(354); - _globals->_player.disableControl(); + g_globals->_soundHandler.play(354); + g_globals->_player.disableControl(); RING_INVENTORY._helmet._sceneNumber = 4250; if (RING_INVENTORY._concentrator._sceneNumber == 1) { - if (_globals->getFlag(115)) { + if (g_globals->getFlag(115)) { scene->_sceneMode = 4269; scene->setAction(&scene->_sequenceManager, scene, 4269, this, NULL); } else { - _globals->setFlag(115); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->setFlag(115); + g_globals->_events.setCursor(CURSOR_WALK); scene->_sceneMode = 4256; scene->setAction(&scene->_sequenceManager, scene, 4256, this, NULL); } @@ -3435,20 +3437,20 @@ void Scene4250::Hotspot6::doAction(int action) { scene->_sceneMode = 4268; scene->setAction(&scene->_sequenceManager, scene, 4268, this, NULL); } else { - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); ADD_MOVER_NULL(scene->_hotspot1, 241, 169); scene->_sceneMode = 4261; - scene->setAction(&scene->_sequenceManager, scene, 4261, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 4261, &g_globals->_player, this, NULL); } break; case OBJECT_NULLIFIER: if (RING_INVENTORY._helmet._sceneNumber == 4250) { - _globals->_soundHandler.play(353); - _globals->_player.disableControl(); + g_globals->_soundHandler.play(353); + g_globals->_player.disableControl(); RING_INVENTORY._helmet._sceneNumber = 1; scene->_sceneMode = 4257; - scene->setAction(&scene->_sequenceManager, scene, 4257, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 4257, &g_globals->_player, this, NULL); } else { SceneItem::display2(4250, 4); } @@ -3457,7 +3459,7 @@ void Scene4250::Hotspot6::doAction(int action) { if (RING_INVENTORY._helmet._sceneNumber == 4250) doAction(OBJECT_HELMET); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 4264; scene->setAction(&scene->_sequenceManager, scene, 4264, this, NULL); } @@ -3466,7 +3468,7 @@ void Scene4250::Hotspot6::doAction(int action) { if (RING_INVENTORY._helmet._sceneNumber == 4250) doAction(OBJECT_HELMET); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); if ((RING_INVENTORY._items._sceneNumber != 1) || (RING_INVENTORY._concentrator._sceneNumber != 1)) { scene->_sceneMode = 4258; scene->setAction(&scene->_sequenceManager, scene, 4258, this, NULL); @@ -3478,7 +3480,7 @@ void Scene4250::Hotspot6::doAction(int action) { scene->_hotspot2.hide(); scene->_sceneMode = 4259; - scene->setAction(&scene->_sequenceManager, scene, 4259, &_globals->_player, this, &scene->_hotspot2, NULL); + scene->setAction(&scene->_sequenceManager, scene, 4259, &g_globals->_player, this, &scene->_hotspot2, NULL); } } break; @@ -3489,12 +3491,12 @@ void Scene4250::Hotspot6::doAction(int action) { } void Scene4250::Hotspot8::doAction(int action) { - Scene4250 *scene = (Scene4250 *)_globals->_sceneManager._scene; + Scene4250 *scene = (Scene4250 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: case CURSOR_USE: - _globals->_sceneManager.changeScene(4300); + g_globals->_sceneManager.changeScene(4300); break; case OBJECT_SCANNER: SceneItem::display2(4250, 24); @@ -3503,7 +3505,7 @@ void Scene4250::Hotspot8::doAction(int action) { SceneItem::display2(4250, 25); break; case OBJECT_STASIS_NEGATOR: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 4270; scene->setAction(&scene->_sequenceManager, scene, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 4270 : 4271, NULL); @@ -3520,7 +3522,7 @@ Scene4250::Scene4250() : _hotspot7(0, CURSOR_LOOK, 4250, 0, LIST_END) { } -void Scene4250::postInit(tSage::SceneObjectList *OwnerList) { +void Scene4250::postInit(TsAGE::SceneObjectList *OwnerList) { loadScene(4250); Scene::postInit(); setZoomPercents(160, 90, 185, 100); @@ -3540,13 +3542,13 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) { _speakerPText.setTextPos(Common::Point(40, 100)); _hotspot8._sceneRegionId = 16; - _globals->_player.postInit(); - _globals->_player.setVisage(2602); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(-13, 190)); - _globals->_player.changeZoom(-1); - _globals->_player._moveDiff = Common::Point(4, 1); + g_globals->_player.postInit(); + g_globals->_player.setVisage(2602); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(-13, 190)); + g_globals->_player.changeZoom(-1); + g_globals->_player._moveDiff = Common::Point(4, 1); _hotspot1.postInit(); _hotspot1.setVisage(2801); @@ -3555,9 +3557,9 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) { _hotspot1.setPosition(Common::Point(-18, 185)); _hotspot1.changeZoom(-1); _hotspot1._moveDiff = Common::Point(4, 1); - _globals->_sceneItems.push_back(&_hotspot1); + g_globals->_sceneItems.push_back(&_hotspot1); - if (_globals->_sceneManager._previousScene == 4300) { + if (g_globals->_sceneManager._previousScene == 4300) { _hotspot5.postInit(); _hotspot5.setVisage(4250); _hotspot5.setPosition(Common::Point(268, 168)); @@ -3571,13 +3573,13 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) { _hotspot4.setStrip(2); _hotspot4._moveDiff = Common::Point(4, 1); _hotspot4.changeZoom(70); - _globals->_sceneItems.push_back(&_hotspot4); + g_globals->_sceneItems.push_back(&_hotspot4); _hotspot1.setPosition(Common::Point(197, 173)); _hotspot1.changeZoom(70); - _globals->_player.setPosition(Common::Point(252, 176)); - _globals->_player.changeZoom(70); + g_globals->_player.setPosition(Common::Point(252, 176)); + g_globals->_player.changeZoom(70); _hotspot6.postInit(); _hotspot6.setVisage(4302); @@ -3592,32 +3594,32 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) { _hotspot6.setFrame(_hotspot6.getFrameCount()); } - if (_globals->getFlag(98)) { - _globals->_sceneItems.push_front(&_hotspot6); + if (g_globals->getFlag(98)) { + g_globals->_sceneItems.push_front(&_hotspot6); } else { _hotspot6.hide(); - if ((_globals->_stripNum == 4300) || (_globals->_stripNum == 4301)) { - _globals->setFlag(98); - _globals->_player.setVisage(4302); - _globals->_player.setStrip(5); - _globals->_player.changeZoom(50); - _globals->_player.disableControl(); + if ((g_globals->_stripNum == 4300) || (g_globals->_stripNum == 4301)) { + g_globals->setFlag(98); + g_globals->_player.setVisage(4302); + g_globals->_player.setStrip(5); + g_globals->_player.changeZoom(50); + g_globals->_player.disableControl(); _hotspot4.setPosition(Common::Point(239, 195)); _sceneMode = 4253; - _globals->_sceneItems.push_front(&_hotspot6); + g_globals->_sceneItems.push_front(&_hotspot6); - setAction(&_sequenceManager, this, 4253, &_globals->_player, &_hotspot6, &_hotspot4, NULL); + setAction(&_sequenceManager, this, 4253, &g_globals->_player, &_hotspot6, &_hotspot4, NULL); } } - } else if (_globals->_stripNum == 9000) { + } else if (g_globals->_stripNum == 9000) { _hotspot4.postInit(); _hotspot4.setVisage(2701); _hotspot4.animate(ANIM_MODE_1, NULL); _hotspot4.setObjectWrapper(new SceneObjectWrapper()); _hotspot4.setPosition(Common::Point(-15, 195)); _hotspot4._moveDiff = Common::Point(4, 1); - _globals->_sceneItems.push_back(&_hotspot4); + g_globals->_sceneItems.push_back(&_hotspot4); setAction(&_action5); } else { @@ -3630,13 +3632,13 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) { _hotspot3._moveDiff = Common::Point(4, 1); setAction(&_action1); - _globals->clearFlag(43); - _globals->clearFlag(114); - _globals->clearFlag(36); + g_globals->clearFlag(43); + g_globals->clearFlag(114); + g_globals->clearFlag(36); } - if (_globals->getFlag(17)) { - _globals->_sceneItems.push_back(&_hotspot8); + if (g_globals->getFlag(17)) { + g_globals->_sceneItems.push_back(&_hotspot8); } else { _hotspot2.postInit(); _hotspot2.setVisage(4251); @@ -3645,27 +3647,27 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) { _hotspot2.setFrame(1); _hotspot2.setPosition(Common::Point(267, 172)); - _globals->_sceneItems.push_back(&_hotspot2); + g_globals->_sceneItems.push_back(&_hotspot2); } _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _globals->_sceneItems.push_back(&_hotspot7); - _globals->_soundHandler.play(185); + g_globals->_sceneItems.push_back(&_hotspot7); + g_globals->_soundHandler.play(185); } void Scene4250::signal() { switch (_sceneMode) { case 4252: - _globals->setFlag(17); - _globals->_sceneManager.changeScene(4301); + g_globals->setFlag(17); + g_globals->_sceneManager.changeScene(4301); break; case 4253: - if (_globals->_stripNum == 4301) { + if (g_globals->_stripNum == 4301) { _sceneMode = 4261; ADD_MOVER_NULL(_hotspot1, 241, 169); - setAction(&_sequenceManager, this, 4261, &_globals->_player, &_hotspot6, NULL); + setAction(&_sequenceManager, this, 4261, &g_globals->_player, &_hotspot6, NULL); } else { - _globals->_player.enableControl(); + g_globals->_player.enableControl(); } break; case 4254: @@ -3680,15 +3682,15 @@ void Scene4250::signal() { case 4268: case 4269: case 4270: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 4259: - _globals->_soundHandler.play(360); - _globals->_sceneManager.changeScene(9900); + g_globals->_soundHandler.play(360); + g_globals->_sceneManager.changeScene(9900); break; case 4261: RING_INVENTORY._keyDevice._sceneNumber = 1; - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 4255: case 4262: @@ -3699,13 +3701,13 @@ void Scene4250::signal() { } void Scene4250::dispatch() { - if (_globals->_player.getRegionIndex() == 8) - _globals->_player.changeZoom(90 - (_globals->_player._position.y - 153)); - if (_globals->_player.getRegionIndex() == 12) - _globals->_player.changeZoom(70); - if (_globals->_player.getRegionIndex() == 15) { - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(-1); + if (g_globals->_player.getRegionIndex() == 8) + g_globals->_player.changeZoom(90 - (g_globals->_player._position.y - 153)); + if (g_globals->_player.getRegionIndex() == 12) + g_globals->_player.changeZoom(70); + if (g_globals->_player.getRegionIndex() == 15) { + g_globals->_player.changeZoom(-1); + g_globals->_player.fixPriority(-1); } if (_hotspot1.getRegionIndex() == 8) @@ -3729,11 +3731,11 @@ void Scene4250::dispatch() { Scene::dispatch(); if (!_action) { - if (!_globals->getFlag(55) && (_globals->_player.getRegionIndex() == 12)) { + if (!g_globals->getFlag(55) && (g_globals->_player.getRegionIndex() == 12)) { setAction(&_action4); } - if (_globals->_sceneObjects->contains(&_hotspot6) && (_globals->_player.getRegionIndex() == 12)) + if (g_globals->_sceneObjects->contains(&_hotspot6) && (g_globals->_player.getRegionIndex() == 12)) setAction(&_action4); } } @@ -3744,17 +3746,17 @@ void Scene4250::dispatch() { *--------------------------------------------------------------------------*/ void Scene4300::Action1::signal() { - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->setFlag(56); - _globals->_scenePalette.addRotation(240, 254, -1); + g_globals->setFlag(56); + g_globals->_scenePalette.addRotation(240, 254, -1); scene->_hotspot7.animate(ANIM_MODE_6, this); - _globals->_soundHandler.play(164); + g_globals->_soundHandler.play(164); break; case 1: - _globals->_soundHandler.play(340); + g_globals->_soundHandler.play(340); scene->_soundHandler1.play(341); scene->_hotspot1.remove(); setDelay(3); @@ -3793,10 +3795,10 @@ void Scene4300::Action1::signal() { scene->_stripManager.start(8015, this, scene); break; case 9: - _globals->_soundHandler.play(350); - _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; - _globals->_events.setCursor(CURSOR_USE); - _globals->_player.enableControl(); + g_globals->_soundHandler.play(350); + g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + g_globals->_events.setCursor(CURSOR_USE); + g_globals->_player.enableControl(); remove(); break; @@ -3804,7 +3806,7 @@ void Scene4300::Action1::signal() { } void Scene4300::Action2::signal() { - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -3814,7 +3816,7 @@ void Scene4300::Action2::signal() { scene->_stripManager.start(8016, this, scene); break; case 2: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -3839,11 +3841,11 @@ void Scene4300::Hotspot8::doAction(int action) { break; case OBJECT_KEY_DEVICE: RING_INVENTORY._keyDevice._sceneNumber = 4300; - _globals->_scenePalette.addRotation(240, 254, -1); + g_globals->_scenePalette.addRotation(240, 254, -1); animate(ANIM_MODE_5, NULL); - _globals->setFlag(99); - _globals->_sceneItems.push_back(this); + g_globals->setFlag(99); + g_globals->_sceneItems.push_back(this); break; default: SceneHotspot::doAction(action); @@ -3885,14 +3887,14 @@ void Scene4300::Hotspot9::doAction(int action) { void Scene4300::Hotspot10::doAction(int action) { // Alien - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(4300, 2); break; case CURSOR_TALK: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action2); break; case OBJECT_SCANNER: @@ -3903,9 +3905,9 @@ void Scene4300::Hotspot10::doAction(int action) { break; case CURSOR_USE: case OBJECT_HELMET: - _globals->_stripNum = (action == CURSOR_USE) ? 4300 : 4301; - _globals->_events.setCursor(CURSOR_NONE); - _globals->_sceneManager.changeScene(4250); + g_globals->_stripNum = (action == CURSOR_USE) ? 4300 : 4301; + g_globals->_events.setCursor(CURSOR_NONE); + g_globals->_sceneManager.changeScene(4250); break; default: SceneHotspot::doAction(action); @@ -3914,11 +3916,11 @@ void Scene4300::Hotspot10::doAction(int action) { } void Scene4300::Hotspot15::signal() { - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene; scene->_soundHandler2.play(345); - _strip = (_globals->_randomSource.getRandomNumber(6) < 2) ? 2 : 1; + _strip = (g_globals->_randomSource.getRandomNumber(6) < 2) ? 2 : 1; if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || (RING_INVENTORY._concentrator._sceneNumber == 1)) { setStrip(1); @@ -3930,7 +3932,7 @@ void Scene4300::Hotspot15::signal() { } void Scene4300::Hotspot16::doAction(int action) { - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -3958,7 +3960,7 @@ void Scene4300::Hotspot16::doAction(int action) { } void Scene4300::Hotspot17::doAction(int action) { - Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; + Scene4300 *scene = (Scene4300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -3968,7 +3970,7 @@ void Scene4300::Hotspot17::doAction(int action) { if (RING_INVENTORY._stasisBox2._sceneNumber != 4300) SceneItem::display2(4300, 13); else { - _globals->_scenePalette.clearListeners(); + g_globals->_scenePalette.clearListeners(); remove(); SceneItem::display2(4300, 12); @@ -3983,7 +3985,7 @@ void Scene4300::Hotspot17::doAction(int action) { break; case OBJECT_STASIS_BOX2: scene->_soundHandler1.play(352); - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); scene->_sceneMode = 4303; scene->setAction(&scene->_sequenceManager, scene, 4303, this, NULL); @@ -4031,27 +4033,27 @@ void Scene4300::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerMText); _stripManager.addSpeaker(&_speakerFLText); - _hotspot11.setup(76, 97, 102, 127, 4300, 5, 6); + _hotspot11.setDetails(76, 97, 102, 127, 4300, 5, 6); _hotspot7.postInit(); _hotspot7.setPosition(Common::Point(90, 128)); _hotspot7.setVisage(4303); _hotspot7.fixPriority(250); - _globals->_sceneItems.push_back(&_hotspot7); + g_globals->_sceneItems.push_back(&_hotspot7); - _hotspot9.setup(120, 49, 174, 91, 4300, -1, -1); + _hotspot9.setDetails(120, 49, 174, 91, 4300, -1, -1); _hotspot15.postInit(); _hotspot15.setVisage(4300); _hotspot15.setPosition(Common::Point(149, 79)); _hotspot15.signal(); - if (!_globals->getFlag(99)) { + if (!g_globals->getFlag(99)) { _hotspot8.postInit(); _hotspot8.setVisage(4300); _hotspot8.setStrip(3); _hotspot8.setPosition(Common::Point(196, 47)); - _globals->_sceneItems.push_back(&_hotspot8); + g_globals->_sceneItems.push_back(&_hotspot8); } if (RING_INVENTORY._concentrator._sceneNumber == 4300) { @@ -4064,15 +4066,15 @@ void Scene4300::postInit(SceneObjectList *OwnerList) { if (RING_INVENTORY._stasisBox2._sceneNumber == 4300) _hotspot17.setFrame(_hotspot17.getFrameCount()); - _globals->_sceneItems.push_back(&_hotspot17); + g_globals->_sceneItems.push_back(&_hotspot17); } - if (!_globals->getFlag(98)) { + if (!g_globals->getFlag(98)) { _hotspot10.postInit(); _hotspot10.setVisage(4302); _hotspot10.setPosition(Common::Point(244, 179)); _hotspot10.fixPriority(100); - _globals->_sceneItems.push_back(&_hotspot10); + g_globals->_sceneItems.push_back(&_hotspot10); _hotspot12.postInit(); _hotspot12.setVisage(4302); @@ -4097,11 +4099,11 @@ void Scene4300::postInit(SceneObjectList *OwnerList) { _hotspot16.setPosition(Common::Point(169, 141)); _hotspot16.fixPriority(1); _hotspot16.setStrip(4); - _globals->_sceneItems.push_back(&_hotspot16); + g_globals->_sceneItems.push_back(&_hotspot16); } - if (_globals->_sceneManager._previousScene == 4301) { - _globals->_player.disableControl(); + if (g_globals->_sceneManager._previousScene == 4301) { + g_globals->_player.disableControl(); _hotspot7.setFrame(_hotspot7.getFrameCount()); _hotspot1.postInit(); @@ -4141,15 +4143,15 @@ void Scene4300::postInit(SceneObjectList *OwnerList) { setAction(&_action1); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 4304; setAction(&_sequenceManager, this, 4304, NULL); } _hotspot10.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); _hotspot19._sceneRegionId = 0; - _globals->_sceneItems.push_back(&_hotspot19); - _globals->_sceneItems.push_back(&_hotspot18); + g_globals->_sceneItems.push_back(&_hotspot19); + g_globals->_sceneItems.push_back(&_hotspot18); } void Scene4300::stripCallback(int v) { @@ -4165,7 +4167,7 @@ void Scene4300::stripCallback(int v) { } void Scene4300::remove() { - _globals->_scenePalette.clearListeners(); + g_globals->_scenePalette.clearListeners(); Scene::remove(); } @@ -4174,7 +4176,7 @@ void Scene4300::signal() { case 4302: RING_INVENTORY._items._sceneNumber = 1; _hotspot16.remove(); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 4303: RING_INVENTORY._stasisBox2._sceneNumber = 4300; @@ -4193,8 +4195,8 @@ void Scene4300::signal() { _gfxButton.draw(); _gfxButton._bounds.expandPanes(); - _globals->_player.enableControl(); - _globals->_scenePalette.addRotation(240, 254, -1); + g_globals->_player.enableControl(); + g_globals->_scenePalette.addRotation(240, 254, -1); break; } } @@ -4207,7 +4209,7 @@ void Scene4300::dispatch() { void Scene4300::process(Event &event) { Scene::process(event); if (_gfxButton.process(event)) - _globals->_sceneManager.changeScene(4250); + g_globals->_sceneManager.changeScene(4250); } /*-------------------------------------------------------------------------- @@ -4223,8 +4225,8 @@ void Scene4301::Action1::synchronize(Serializer &s) { } void Scene4301::Action1::remove() { - Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; - _globals->_player.enableControl(); + Scene4301 *scene = (Scene4301 *)g_globals->_sceneManager._scene; + g_globals->_player.enableControl(); for (_state = 0; _state < 6; ++_state) _buttonList[_state].remove(); @@ -4237,7 +4239,7 @@ void Scene4301::Action1::remove() { } void Scene4301::Action1::signal() { - Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; + Scene4301 *scene = (Scene4301 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -4245,8 +4247,8 @@ void Scene4301::Action1::signal() { scene->_hotspot1.animate(ANIM_MODE_5, this); break; case 1: - _globals->_soundHandler.play(335); - _globals->_events.setCursor(CURSOR_USE); + g_globals->_soundHandler.play(335); + g_globals->_events.setCursor(CURSOR_USE); scene->_hotspot2.postInit(); scene->_hotspot2.setVisage(4303); @@ -4269,7 +4271,7 @@ void Scene4301::Action1::signal() { break; case 10: // Puzzle: Wrong code - _globals->_events.setCursor(CURSOR_NONE); + g_globals->_events.setCursor(CURSOR_NONE); scene->_soundHandler.play(337); if (scene->_hotspot3._flags & OBJFLAG_HIDE) scene->_hotspot3.show(); @@ -4290,11 +4292,11 @@ void Scene4301::Action1::signal() { _actionIndex = 2; _state = 0; - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); break; case 20: // Puzzle: Correct code - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_soundHandler.play(339); scene->_hotspot3._frame = 3; if (scene->_hotspot3._flags & OBJFLAG_HIDE) @@ -4317,7 +4319,7 @@ void Scene4301::Action1::signal() { void Scene4301::Action1::process(Event &event) { // Puzzle - Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; + Scene4301 *scene = (Scene4301 *)g_globals->_sceneManager._scene; Rect buttonsRect; Action::process(event); @@ -4372,10 +4374,10 @@ void Scene4301::Action1::process(Event &event) { void Scene4301::Hotspot4::doAction(int action) { // Hatch near door - Scene4301 *scene = (Scene4301 *)_globals->_sceneManager._scene; + Scene4301 *scene = (Scene4301 *)g_globals->_sceneManager._scene; if (action == CURSOR_USE) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action1); } else { NamedHotspot::doAction(action); @@ -4405,14 +4407,14 @@ void Scene4301::Hotspot5::doAction(int action) { /*--------------------------------------------------------------------------*/ void Scene4301::postInit(SceneObjectList *OwnerList) { - _globals->setFlag(50); + g_globals->setFlag(50); loadScene(4301); Scene::postInit(); setZoomPercents(0, 100, 200, 100); _field68E = false; RING_INVENTORY._stasisBox2._sceneNumber = 1; - _hotspot4.setup(97, 76, 127, 102, 4300, 5, 6); + _hotspot4.setDetails(97, 76, 127, 102, 4300, 5, 6); _hotspot1.postInit(); _hotspot1.setPosition(Common::Point(90, 128)); @@ -4422,9 +4424,9 @@ void Scene4301::postInit(SceneObjectList *OwnerList) { _hotspot1.fixPriority(250); _hotspot5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _globals->_sceneItems.push_back(&_hotspot5); + g_globals->_sceneItems.push_back(&_hotspot5); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); } void Scene4301::dispatch() { @@ -4432,10 +4434,12 @@ void Scene4301::dispatch() { _action->dispatch(); } else if (_field68E) { _field68E = 0; - _globals->clearFlag(50); - _globals->_sceneManager._fadeMode = FADEMODE_NONE; - _globals->_sceneManager.setNewScene(4300); + g_globals->clearFlag(50); + g_globals->_sceneManager._fadeMode = FADEMODE_NONE; + g_globals->_sceneManager.setNewScene(4300); } } -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld_scenes5.h b/engines/tsage/ringworld/ringworld_scenes5.h index c3ae9f4aa9..80e67755bd 100644 --- a/engines/tsage/ringworld_scenes5.h +++ b/engines/tsage/ringworld/ringworld_scenes5.h @@ -26,9 +26,14 @@ #include "common/scummsys.h" #include "tsage/core.h" #include "tsage/converse.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/ringworld/ringworld_speakers.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { + +using namespace TsAGE; class Scene4000 : public Scene { /* Actions */ @@ -687,7 +692,8 @@ public: } }; +} // End of namespace Ringworld -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld/ringworld_scenes6.cpp index 68c184196c..57a073caee 100644 --- a/engines/tsage/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld/ringworld_scenes6.cpp @@ -20,12 +20,14 @@ * */ -#include "tsage/ringworld_scenes6.h" +#include "tsage/ringworld/ringworld_scenes6.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { /*-------------------------------------------------------------------------- * Scene 5000 - Caverns - Entrance @@ -34,7 +36,7 @@ namespace tSage { void Scene5000::Action1::signal() { // Ship landing - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -86,7 +88,7 @@ void Scene5000::Action1::signal() { } void Scene5000::Action1::dispatch() { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; Action::dispatch(); if (_actionIndex == 3) { @@ -110,83 +112,83 @@ void Scene5000::Action1::dispatch() { } void Scene5000::Action2::signal() { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.setPosition(Common::Point(217, 76)); + g_globals->_player.setPosition(Common::Point(217, 76)); setDelay(10); break; case 1: - _globals->_player.setStrip2(3); - _globals->_player.animate(ANIM_MODE_1, NULL); - ADD_MOVER(_globals->_player, 214, 89); + g_globals->_player.setStrip2(3); + g_globals->_player.animate(ANIM_MODE_1, NULL); + ADD_MOVER(g_globals->_player, 214, 89); break; case 2: - if (!_globals->getFlag(59)) + if (!g_globals->getFlag(59)) setAction(&scene->_action3, this); - _globals->_player.fixPriority(15); - ADD_MOVER(_globals->_player, 208, 100); + g_globals->_player.fixPriority(15); + ADD_MOVER(g_globals->_player, 208, 100); break; case 3: - ADD_MOVER(_globals->_player, 213, 98); + ADD_MOVER(g_globals->_player, 213, 98); break; case 4: - _globals->_player.fixPriority(20); - ADD_MOVER(_globals->_player, 215, 115); + g_globals->_player.fixPriority(20); + ADD_MOVER(g_globals->_player, 215, 115); break; case 5: - _globals->_player.changeZoom(47); - ADD_MOVER(_globals->_player, 220, 125); + g_globals->_player.changeZoom(47); + ADD_MOVER(g_globals->_player, 220, 125); break; case 6: - ADD_MOVER(_globals->_player, 229, 115); + ADD_MOVER(g_globals->_player, 229, 115); break; case 7: - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(35); - ADD_MOVER(_globals->_player, 201, 166); + g_globals->_player.changeZoom(-1); + g_globals->_player.fixPriority(35); + ADD_MOVER(g_globals->_player, 201, 166); break; case 8: - _globals->_player.updateZoom(); - ADD_MOVER(_globals->_player, 205, 146); + g_globals->_player.updateZoom(); + ADD_MOVER(g_globals->_player, 205, 146); break; case 9: - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(50); - ADD_MOVER(_globals->_player, 220, 182); + g_globals->_player.changeZoom(-1); + g_globals->_player.fixPriority(50); + ADD_MOVER(g_globals->_player, 220, 182); break; case 10: - _globals->_player.updateZoom(); - ADD_MOVER(_globals->_player, 208, 163); + g_globals->_player.updateZoom(); + ADD_MOVER(g_globals->_player, 208, 163); break; case 11: - _globals->_player.changeZoom(-1); - _globals->_player.setStrip2(-1); - _globals->_player.fixPriority(-1); - ADD_MOVER(_globals->_player, 208, 175); + g_globals->_player.changeZoom(-1); + g_globals->_player.setStrip2(-1); + g_globals->_player.fixPriority(-1); + ADD_MOVER(g_globals->_player, 208, 175); break; case 12: - _globals->_player.setStrip(8); - _globals->_player.setFrame(1); + g_globals->_player.setStrip(8); + g_globals->_player.setFrame(1); setDelay(10); break; case 13: - if (!_globals->_sceneObjects->contains(&scene->_hotspot7)) + if (!g_globals->_sceneObjects->contains(&scene->_hotspot7)) setDelay(10); break; case 14: setDelay(30); break; case 15: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene5000::Action3::signal() { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -204,7 +206,7 @@ void Scene5000::Action3::signal() { scene->_hotspot7.animate(ANIM_MODE_1, NULL); ADD_MOVER(scene->_hotspot7, 214, 89); - _globals->_sceneItems.push_front(&scene->_hotspot7); + g_globals->_sceneItems.push_front(&scene->_hotspot7); break; case 2: scene->_hotspot7.changeZoom(-1); @@ -260,116 +262,116 @@ void Scene5000::Action3::signal() { } void Scene5000::Action4::signal() { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(1); break; case 1: - _globals->_player.fixPriority(50); - _globals->_player.setStrip2(4); - ADD_MOVER(_globals->_player, 210, 182); + g_globals->_player.fixPriority(50); + g_globals->_player.setStrip2(4); + ADD_MOVER(g_globals->_player, 210, 182); break; case 2: - ADD_MOVER(_globals->_player, 205, 146); + ADD_MOVER(g_globals->_player, 205, 146); break; case 3: - _globals->_player.fixPriority(35); - ADD_MOVER(_globals->_player, 201, 166); + g_globals->_player.fixPriority(35); + ADD_MOVER(g_globals->_player, 201, 166); break; case 4: - ADD_MOVER(_globals->_player, 229, 115); + ADD_MOVER(g_globals->_player, 229, 115); break; case 5: - _globals->_player.fixPriority(20); - _globals->_player.changeZoom(47); - ADD_MOVER(_globals->_player, 220, 125); + g_globals->_player.fixPriority(20); + g_globals->_player.changeZoom(47); + ADD_MOVER(g_globals->_player, 220, 125); break; case 6: - ADD_MOVER(_globals->_player, 215, 115); + ADD_MOVER(g_globals->_player, 215, 115); break; case 7: - _globals->_player.changeZoom(-1); - ADD_MOVER(_globals->_player, 213, 98); + g_globals->_player.changeZoom(-1); + ADD_MOVER(g_globals->_player, 213, 98); break; case 8: - _globals->_player.fixPriority(15); - ADD_MOVER(_globals->_player, 208, 100); + g_globals->_player.fixPriority(15); + ADD_MOVER(g_globals->_player, 208, 100); break; case 9: - ADD_MOVER(_globals->_player, 214, 89); + ADD_MOVER(g_globals->_player, 214, 89); break; case 10: - ADD_MOVER(_globals->_player, 217, 76); + ADD_MOVER(g_globals->_player, 217, 76); break; case 11: - _globals->_player.hide(); + g_globals->_player.hide(); setDelay(60); break; case 12: - if (!_globals->_sceneObjects->contains(&scene->_hotspot7)) - _globals->_sceneManager.changeScene(2320); + if (!g_globals->_sceneObjects->contains(&scene->_hotspot7)) + g_globals->_sceneManager.changeScene(2320); remove(); break; } } void Scene5000::Action5::signal() { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); - ADD_MOVER(_globals->_player, 91, 155); + g_globals->_player.disableControl(); + ADD_MOVER(g_globals->_player, 91, 155); break; case 1: - _globals->_player.setVisage(2670); - _globals->_player._strip = 4; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2670); + g_globals->_player._strip = 4; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: - SceneItem::display2(5000, _globals->_sceneObjects->contains(&scene->_hotspot7) ? 17 : 13); - _globals->_player.animate(ANIM_MODE_6, this); + SceneItem::display2(5000, g_globals->_sceneObjects->contains(&scene->_hotspot7) ? 17 : 13); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 3: - _globals->_player.setVisage(0); - _globals->_player._strip = 8; - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setVisage(0); + g_globals->_player._strip = 8; + g_globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); } } void Scene5000::Action6::signal() { // Discussion between the hero and Seeker, then the hero goes back to the lander - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(2150, this); break; case 2: - _globals->_events.setCursor(CURSOR_NONE); + g_globals->_events.setCursor(CURSOR_NONE); scene->setAction(&scene->_sequenceManager, this, 5001, &scene->_hotspot7, NULL); break; case 3: ADD_PLAYER_MOVER(208, 163); break; case 4: - _globals->_player.fixPriority(50); - _globals->_player.setStrip2(4); - ADD_MOVER(_globals->_player, 210, 182); + g_globals->_player.fixPriority(50); + g_globals->_player.setStrip2(4); + ADD_MOVER(g_globals->_player, 210, 182); break; case 5: - _globals->_sceneManager.changeScene(2100); + g_globals->_sceneManager.changeScene(2100); break; } } @@ -377,7 +379,7 @@ void Scene5000::Action6::signal() { /*--------------------------------------------------------------------------*/ void Scene5000::Hotspot7::doAction(int action) { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -394,7 +396,7 @@ void Scene5000::Hotspot7::doAction(int action) { void Scene5000::Hotspot8::doAction(int action) { // Cave - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -413,9 +415,9 @@ void Scene5000::Hotspot8::doAction(int action) { } void Scene5000::HotspotGroup1::doAction(int action) { - Scene5000 *scene = (Scene5000 *)_globals->_sceneManager._scene; + Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene; - if (_globals->_sceneObjects->contains(&scene->_hotspot7)) + if (g_globals->_sceneObjects->contains(&scene->_hotspot7)) scene->setAction(&scene->_action6); else SceneItem::display2(5000, 11); @@ -444,13 +446,13 @@ void Scene5000::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerSText); _stripManager.addSpeaker(&_speakerQText); - _globals->_player.postInit(); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player._moveDiff = Common::Point(4, 2); - _globals->_player.changeZoom(-1); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player._moveDiff = Common::Point(4, 2); + g_globals->_player.changeZoom(-1); + g_globals->_player.disableControl(); _hotspot1.postInit(); _hotspot1.setVisage(5001); @@ -516,14 +518,14 @@ void Scene5000::postInit(SceneObjectList *OwnerList) { _hotspot16.setBounds(Rect(0, 86, 319, 200)); _hotspot12.setBounds(Rect(230, 143, 244, 150)); - _globals->_sceneItems.addItems(&_hotspot9, &_hotspot10, &_hotspot11, &_hotspot8, &_hotspot13, + g_globals->_sceneItems.addItems(&_hotspot9, &_hotspot10, &_hotspot11, &_hotspot8, &_hotspot13, &_hotspot14, &_hotspot12, &_hotspot15, &_hotspot17, &_hotspot18, &_hotspot16, NULL); - switch (_globals->_sceneManager._previousScene) { + switch (g_globals->_sceneManager._previousScene) { case 1000: case 2100: case 2320: - if (_globals->getFlag(59)) { + if (g_globals->getFlag(59)) { _hotspot1.setPosition(Common::Point(233, 90)); _hotspot1.changeZoom(100); _hotspot1.show(); @@ -533,21 +535,21 @@ void Scene5000::postInit(SceneObjectList *OwnerList) { _hotspot5.setPosition(Common::Point(218, 76)); _hotspot5.show(); - _globals->_player.setPosition(Common::Point(217, -10)); - _globals->_player.disableControl(); + g_globals->_player.setPosition(Common::Point(217, -10)); + g_globals->_player.disableControl(); setAction(&_action2); } else { - _globals->_player.setPosition(Common::Point(217, -10)); + g_globals->_player.setPosition(Common::Point(217, -10)); _hotspot1.setPosition(Common::Point(320, -10)); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setAction(&_action1); } break; default: - _globals->_player.disableControl(); - _globals->_player.setPosition(Common::Point(0, 146)); + g_globals->_player.disableControl(); + g_globals->_player.setPosition(Common::Point(0, 146)); _hotspot1.changeZoom(100); _hotspot1.setPosition(Common::Point(233, 90)); @@ -557,11 +559,11 @@ void Scene5000::postInit(SceneObjectList *OwnerList) { _hotspot5.show(); _sceneMode = 5004; - setAction(&_sequenceManager, this, 5004, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 5004, &g_globals->_player, NULL); break; } - _globals->_soundHandler.play(190); + g_globals->_soundHandler.play(190); } void Scene5000::signal() { @@ -569,10 +571,10 @@ void Scene5000::signal() { case 5002: case 5003: case 5004: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 5005: - _globals->_sceneManager.changeScene(5100); + g_globals->_sceneManager.changeScene(5100); break; } } @@ -581,29 +583,29 @@ void Scene5000::dispatch() { Scene::dispatch(); if (!_action) { - if (!_globals->_sceneObjects->contains(&_hotspot7) && (_globals->_player.getRegionIndex() == 10)) { - _globals->_player.disableControl(); + if (!g_globals->_sceneObjects->contains(&_hotspot7) && (g_globals->_player.getRegionIndex() == 10)) { + g_globals->_player.disableControl(); _sceneMode = 5005; - setAction(&_sequenceManager, this, 5005, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 5005, &g_globals->_player, NULL); } - if (_globals->_player.getRegionIndex() == 8) { - _globals->_player.disableControl(); + if (g_globals->_player.getRegionIndex() == 8) { + g_globals->_player.disableControl(); - if (_globals->_sceneObjects->contains(&_hotspot7)) { + if (g_globals->_sceneObjects->contains(&_hotspot7)) { _sceneMode = 5003; - _globals->_player.addMover(NULL); - setAction(&_sequenceManager, this, 5003, &_globals->_player, NULL); + g_globals->_player.addMover(NULL); + setAction(&_sequenceManager, this, 5003, &g_globals->_player, NULL); } else { setAction(&_action4); } } - if (_globals->_sceneObjects->contains(&_hotspot7) && (_globals->_player.getRegionIndex() == 15)) { + if (g_globals->_sceneObjects->contains(&_hotspot7) && (g_globals->_player.getRegionIndex() == 15)) { _sceneMode = 5002; - _globals->_player.disableControl(); - _globals->_player.addMover(NULL); - setAction(&_sequenceManager, this, 5002, &_globals->_player, NULL); + g_globals->_player.disableControl(); + g_globals->_player.addMover(NULL); + setAction(&_sequenceManager, this, 5002, &g_globals->_player, NULL); } } } @@ -615,26 +617,26 @@ void Scene5000::dispatch() { void Scene5100::Action1::signal() { // Quinn enters the cave for the first time - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(5); break; case 1: - ADD_MOVER(_globals->_player, 1111, 165); + ADD_MOVER(g_globals->_player, 1111, 165); break; case 2: - _globals->_player.setStrip(6); - _globals->_player.setFrame(1); + g_globals->_player.setStrip(6); + g_globals->_player.setFrame(1); setDelay(60); break; case 3: - if (_globals->getFlag(10)) { - _globals->_player.enableControl(); + if (g_globals->getFlag(10)) { + g_globals->_player.enableControl(); remove(); } else { - _globals->setFlag(10); + g_globals->setFlag(10); scene->_stripManager.start(5102, this); } break; @@ -648,7 +650,7 @@ void Scene5100::Action1::signal() { scene->_hotspot5.animate(ANIM_MODE_1, NULL); scene->_hotspot5.fixPriority(10); - _globals->_sceneItems.push_front(&scene->_hotspot5); + g_globals->_sceneItems.push_front(&scene->_hotspot5); ADD_MOVER(scene->_hotspot5, 999, 14); break; case 5: @@ -657,7 +659,7 @@ void Scene5100::Action1::signal() { scene->_hotspot5.animate(ANIM_MODE_5, this); break; case 6: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -665,11 +667,11 @@ void Scene5100::Action1::signal() { void Scene5100::Action2::signal() { // Quinn and Seeker exit the cave - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(5); break; case 1: @@ -691,13 +693,13 @@ void Scene5100::Action2::signal() { scene->_stripManager.start(5129, this); break; case 3: - if (_globals->_player._position.x >= 966) { + if (g_globals->_player._position.x >= 966) { ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155); } else { ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 966, 185); } - if (_globals->_player._position.x >= 966) { + if (g_globals->_player._position.x >= 966) { setDelay(1); } else { ADD_PLAYER_MOVER(966, 190); @@ -708,40 +710,40 @@ void Scene5100::Action2::signal() { ADD_PLAYER_MOVER(1215, 155); break; case 5: - _globals->_sceneManager.changeScene(2100); + g_globals->_sceneManager.changeScene(2100); break; } } void Scene5100::Action3::signal() { // Quinns shots flesheater - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->setFlag(62); - _globals->_player.disableControl(); - _globals->_player.addMover(NULL); + g_globals->setFlag(62); + g_globals->_player.disableControl(); + g_globals->_player.addMover(NULL); scene->_hotspot2.addMover(NULL); scene->_hotspot3.addMover(NULL); - _globals->_player.setVisage(2672); + g_globals->_player.setVisage(2672); - if (static_cast<SceneObject *>(_owner)->_position.x >= _globals->_player._position.x) - _globals->_player._strip = 4; + if (static_cast<SceneObject *>(_owner)->_position.x >= g_globals->_player._position.x) + g_globals->_player._strip = 4; else - _globals->_player._strip = 3; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player._strip = 3; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_5, this); break; case 1: - _globals->_player.setVisage(2674); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setVisage(2674); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 2: scene->_soundHandler.play(28); - if (static_cast<SceneObject *>(_owner)->_position.x < _globals->_player._position.x) { + if (static_cast<SceneObject *>(_owner)->_position.x < g_globals->_player._position.x) { scene->_hotspot2.setVisage(5130); scene->_hotspot2._strip = 1; scene->_hotspot2._frame = 1; @@ -762,35 +764,35 @@ void Scene5100::Action3::signal() { } - _globals->_player.setVisage(2672); - _globals->_player._frame = _globals->_player.getFrameCount(); - _globals->_player.animate(ANIM_MODE_6, this); + g_globals->_player.setVisage(2672); + g_globals->_player._frame = g_globals->_player.getFrameCount(); + g_globals->_player.animate(ANIM_MODE_6, this); break; case 3: break; case 4: SceneItem::display2(5100, 38); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); - _globals->_player.setVisage(0); - _globals->_player._strip = 8; - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setVisage(0); + g_globals->_player._strip = 8; + g_globals->_player.animate(ANIM_MODE_1, NULL); remove(); break; } } void Scene5100::Action4::signal() { - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_soundHandler.play(208); SceneItem::display2(5100, 15); ObjectMover3 *mover = new ObjectMover3(); - scene->_hotspot2.addMover(mover, &_globals->_player, 20, this); + scene->_hotspot2.addMover(mover, &g_globals->_player, 20, this); break; } case 1: @@ -804,18 +806,18 @@ void Scene5100::Action4::signal() { setDelay(15); break; case 3: - _globals->_sceneManager.changeScene(5200); + g_globals->_sceneManager.changeScene(5200); break; } } void Scene5100::Action5::signal() { // Quinns forgot the statis box in the throne room, and goes back - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(60); break; case 1: @@ -826,7 +828,7 @@ void Scene5100::Action5::signal() { break; case 3: scene->_sceneMode = 5106; - scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5106, &g_globals->_player, &scene->_hotspot14, NULL); break; } } @@ -835,11 +837,11 @@ void Scene5100::Action5::signal() { void Scene5100::HotspotGroup1::doAction(int action) { // Flesh Eaters - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - SceneItem::display2(5100, _globals->getFlag(62) ? 41 : 26); + SceneItem::display2(5100, g_globals->getFlag(62) ? 41 : 26); break; case CURSOR_USE: SceneItem::display2(5100, 11); @@ -848,7 +850,7 @@ void Scene5100::HotspotGroup1::doAction(int action) { SceneItem::display2(5100, 17); break; case OBJECT_STUNNER: - if (_globals->getFlag(62)) + if (g_globals->getFlag(62)) SceneItem::display2(5100, 42); else setAction(&scene->_action3); @@ -860,16 +862,16 @@ void Scene5100::HotspotGroup1::doAction(int action) { } void Scene5100::Hotspot4::doAction(int action) { - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, 31); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 5110; - scene->setAction(&scene->_sequenceManager, scene, 5110, &_globals->_player, this, &scene->_hotspot7, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5110, &g_globals->_player, this, &scene->_hotspot7, NULL); break; case CURSOR_TALK: SceneItem::display2(5100, 34); @@ -888,11 +890,11 @@ void Scene5100::Hotspot4::doAction(int action) { void Scene5100::HotspotGroup2::doAction(int action) { // Bat - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - SceneItem::display2(5100, _globals->getFlag(108) ? 47 : 23); + SceneItem::display2(5100, g_globals->getFlag(108) ? 47 : 23); break; case CURSOR_USE: SceneItem::display2(5100, 29); @@ -901,7 +903,7 @@ void Scene5100::HotspotGroup2::doAction(int action) { if (_position.x >= 600) SceneItem::display2(5100, 28); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 5114; scene->setAction(&scene->_sequenceManager, scene, 5114, NULL); } @@ -917,16 +919,16 @@ void Scene5100::HotspotGroup2::doAction(int action) { void Scene5100::Hotspot9::doAction(int action) { // Rope - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, 32); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 5117; - scene->setAction(&scene->_sequenceManager, scene, 5117, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5117, &g_globals->_player, NULL); break; case OBJECT_STUNNER: SceneItem::display2(5100, 35); @@ -935,9 +937,9 @@ void Scene5100::Hotspot9::doAction(int action) { SceneItem::display2(5100, 44); break; case OBJECT_BONE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 5116; - scene->setAction(&scene->_sequenceManager, scene, 5116, &_globals->_player, this, &scene->_hotspot10, + scene->setAction(&scene->_sequenceManager, scene, 5116, &g_globals->_player, this, &scene->_hotspot10, &scene->_hotspot4, NULL); break; default: @@ -948,19 +950,19 @@ void Scene5100::Hotspot9::doAction(int action) { void Scene5100::Hotspot17::doAction(int action) { // Rock blocking pit entrance - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, 18); break; case CURSOR_USE: - if (_globals->getFlag(67)) + if (g_globals->getFlag(67)) SceneItem::display2(5100, 19); else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 5101; - scene->setAction(&scene->_sequenceManager, scene, 5101, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5101, &g_globals->_player, this, NULL); } break; default: @@ -972,7 +974,7 @@ void Scene5100::Hotspot17::doAction(int action) { void Scene5100::Hotspot18::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->_sceneManager._previousScene != 5000) { + if (g_globals->_sceneManager._previousScene != 5000) { SceneItem::display2(5100, 3); } else { switch (_index1) { @@ -1014,21 +1016,21 @@ void Scene5100::Hotspot18::doAction(int action) { void Scene5100::Hotspot19::doAction(int action) { // Pillar - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - SceneItem::display2(5100, _globals->_sceneObjects->contains(&scene->_hotspot14) ? 27 : 20); + SceneItem::display2(5100, g_globals->_sceneObjects->contains(&scene->_hotspot14) ? 27 : 20); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 5106; - if (_globals->getFlag(66)) - scene->setAction(&scene->_sequenceManager, scene, 5113, &_globals->_player, NULL); + if (g_globals->getFlag(66)) + scene->setAction(&scene->_sequenceManager, scene, 5113, &g_globals->_player, NULL); else { - _globals->setFlag(66); - scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot14, NULL); + g_globals->setFlag(66); + scene->setAction(&scene->_sequenceManager, scene, 5106, &g_globals->_player, &scene->_hotspot14, NULL); } break; default: @@ -1038,21 +1040,21 @@ void Scene5100::Hotspot19::doAction(int action) { } void Scene5100::Hotspot20::doAction(int action) { - Scene5100 *scene = (Scene5100 *)_globals->_sceneManager._scene; + Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5100, 21); break; case CURSOR_USE: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); - if (_globals->getFlag(67)) { + if (g_globals->getFlag(67)) { scene->_sceneMode = 5112; - scene->setAction(&scene->_sequenceManager, scene, 5112, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5112, &g_globals->_player, NULL); } else { scene->_sceneMode = 5101; - scene->setAction(&scene->_sequenceManager, scene, 5106, &_globals->_player, &scene->_hotspot17, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5106, &g_globals->_player, &scene->_hotspot17, NULL); } break; default: @@ -1078,17 +1080,17 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerSText); _stripManager.addSpeaker(&_speakerGameText); _stripManager.addSpeaker(&_speakerBatText); - _speakerQText._npc = &_globals->_player; - _speakerMText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; + _speakerMText._npc = &g_globals->_player; _speakerSText._npc = &_hotspot8; - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(0); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.disableControl(); - if ((!_globals->getFlag(66)) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) { + if ((!g_globals->getFlag(66)) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) { _hotspot14.postInit(); _hotspot14.setVisage(5101); _hotspot14.setPosition(Common::Point(498, 147)); @@ -1101,7 +1103,7 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _hotspot17._strip = 2; _hotspot17.fixPriority(200); - if (_globals->getFlag(67)) + if (g_globals->getFlag(67)) _hotspot17.setPosition(Common::Point(554, 192)); else _hotspot17.setPosition(Common::Point(539, 179)); @@ -1109,26 +1111,26 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _hotspot19.setBounds(Rect(488, 115, 508, 148)); _hotspot21.setBounds(Rect(1150, 85, 1173, 112)); _hotspot20.setBounds(Rect(517, 193, 562, 200)); - _globals->_sceneItems.addItems(&_hotspot19, &_hotspot21, NULL); + g_globals->_sceneItems.addItems(&_hotspot19, &_hotspot21, NULL); - if (_globals->getFlag(67)) { - _globals->_sceneItems.addItems(&_hotspot20, &_hotspot17, NULL); + if (g_globals->getFlag(67)) { + g_globals->_sceneItems.addItems(&_hotspot20, &_hotspot17, NULL); } else { - _globals->_sceneItems.addItems(&_hotspot17, &_hotspot20, NULL); + g_globals->_sceneItems.addItems(&_hotspot17, &_hotspot20, NULL); } - if (!_globals->getFlag(105)) { + if (!g_globals->getFlag(105)) { _hotspot4.postInit(); _hotspot4.setVisage(5363); _hotspot4.setPosition(Common::Point(1025, 65)); _hotspot4.setStrip(4); _hotspot4.animate(ANIM_MODE_7, 0, NULL);; - _globals->_sceneItems.push_back(&_hotspot4); + g_globals->_sceneItems.push_back(&_hotspot4); _hotspot9.postInit(); _hotspot9.setVisage(5363); _hotspot9.setPosition(Common::Point(966, 120)); - _globals->_sceneItems.push_back(&_hotspot9); + g_globals->_sceneItems.push_back(&_hotspot9); _hotspot10.postInit(); _hotspot10.setVisage(5363); @@ -1140,26 +1142,26 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _hotspot6.setPosition(Common::Point(1017, 34)); _hotspot6._strip = 4; _hotspot6._frame = _hotspot6.getFrameCount(); - _globals->_sceneItems.push_back(&_hotspot6); + g_globals->_sceneItems.push_back(&_hotspot6); } _hotspot16._sceneRegionId = 15; - _globals->_sceneItems.push_back(&_hotspot16); + g_globals->_sceneItems.push_back(&_hotspot16); - if (!_globals->getFlag(62)) { + if (!g_globals->getFlag(62)) { _hotspot2.postInit(); _hotspot2.setVisage(5110); _hotspot2.animate(ANIM_MODE_1, NULL); _hotspot2._moveDiff.x = 4; - _globals->_sceneItems.push_back(&_hotspot2); + g_globals->_sceneItems.push_back(&_hotspot2); _hotspot3.postInit(); _hotspot3.setVisage(5110); _hotspot3.animate(ANIM_MODE_1, NULL); _hotspot3._moveDiff.x = 4; - _globals->_sceneItems.push_back(&_hotspot3); + g_globals->_sceneItems.push_back(&_hotspot3); - if (_globals->getFlag(61)) { + if (g_globals->getFlag(61)) { _hotspot2.setPosition(Common::Point(483, 189)); _hotspot3.setPosition(Common::Point(811, 182)); } else { @@ -1168,35 +1170,35 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { } } - if (_globals->getFlag(60) && (RING_INVENTORY._stasisBox._sceneNumber == 1) && - _globals->getFlag(107) && _globals->getFlag(67)) { + if (g_globals->getFlag(60) && (RING_INVENTORY._stasisBox._sceneNumber == 1) && + g_globals->getFlag(107) && g_globals->getFlag(67)) { _hotspot8.postInit(); _hotspot8.setVisage(2806); _hotspot8.setPosition(Common::Point(557, 178)); _hotspot8.animate(ANIM_MODE_1, NULL); _hotspot8.setObjectWrapper(new SceneObjectWrapper()); - _globals->clearFlag(59); + g_globals->clearFlag(59); } - switch (_globals->_sceneManager._previousScene) { + switch (g_globals->_sceneManager._previousScene) { case 5000: default: - _globals->_player.setPosition(Common::Point(1184, 160)); + g_globals->_player.setPosition(Common::Point(1184, 160)); setAction(&_action1); break; case 5200: - if (_globals->_stripNum == 5200) { - _globals->_player.setVisage(5101); - _globals->_player.fixPriority(200); - _globals->_player.setStrip(5); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(513, 199)); + if (g_globals->_stripNum == 5200) { + g_globals->_player.setVisage(5101); + g_globals->_player.fixPriority(200); + g_globals->_player.setStrip(5); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(513, 199)); _sceneMode = 5108; - setAction(&_sequenceManager, this, 5108, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 5108, &g_globals->_player, NULL); } else { - _globals->_player.setPosition(Common::Point(20, 175)); + g_globals->_player.setPosition(Common::Point(20, 175)); _hotspot13.postInit(); _hotspot13.setVisage(5110); @@ -1211,7 +1213,7 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _hotspot11.animate(ANIM_MODE_1, NULL); ObjectMover2 *mover = new ObjectMover2(); - _hotspot11.addMover(mover, 15, 20, &_globals->_player); + _hotspot11.addMover(mover, 15, 20, &g_globals->_player); _hotspot12.postInit(); _hotspot12.setVisage(5110); @@ -1221,51 +1223,51 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _hotspot12.animate(ANIM_MODE_1, NULL); ObjectMover2 *mover2 = new ObjectMover2(); - _hotspot12.addMover(mover2, 25, 50, &_globals->_player); + _hotspot12.addMover(mover2, 25, 50, &g_globals->_player); _hotspot17.setPosition(Common::Point(554, 182)); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 5105; - setAction(&_sequenceManager, this, 5105, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 5105, &g_globals->_player, NULL); } break; case 5300: - switch (_globals->_stripNum) { + switch (g_globals->_stripNum) { case 5300: _sceneMode = 5111; - _globals->_player.setVisage(5101); - _globals->_player.setStrip(6); - _globals->_player.fixPriority(170); - _globals->_player.setPosition(Common::Point(1168, 110)); + g_globals->_player.setVisage(5101); + g_globals->_player.setStrip(6); + g_globals->_player.fixPriority(170); + g_globals->_player.setPosition(Common::Point(1168, 110)); - setAction(&_sequenceManager, this, 5111, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 5111, &g_globals->_player, NULL); _hotspot8.setPosition(Common::Point(1107, 178)); break; case 5302: - _globals->_player.setPosition(Common::Point(512, 190)); + g_globals->_player.setPosition(Common::Point(512, 190)); - if (_globals->_sceneObjects->contains(&_hotspot8)) + if (g_globals->_sceneObjects->contains(&_hotspot8)) setAction(&_action2); else - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 5303: _hotspot8.setVisage(5102); _hotspot8.setPosition(Common::Point(533, 172)); - _globals->_player.setPosition(Common::Point(512, 190)); + g_globals->_player.setPosition(Common::Point(512, 190)); setAction(&_action2); break; } - if (_globals->getFlag(108)) { + if (g_globals->getFlag(108)) { _hotspot6.postInit(); _hotspot6.setVisage(5362); _hotspot6.setPosition(Common::Point(542, 19)); _hotspot6.setStrip(6); _hotspot6.setFrame(1); - _globals->_sceneItems.push_back(&_hotspot6); + g_globals->_sceneItems.push_back(&_hotspot6); } else if (RING_INVENTORY._vial._sceneNumber != 5100) { _hotspot6.postInit(); _hotspot6.setVisage(5362); @@ -1273,13 +1275,13 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _hotspot6.fixPriority(170); _hotspot6.setStrip(6); _hotspot6.setFrame(1); - _globals->_sceneItems.push_back(&_hotspot6); + g_globals->_sceneItems.push_back(&_hotspot6); } break; } _hotspot18.setBounds(Rect(0, 0, 1280, 200)); - _globals->_sceneItems.push_back(&_hotspot18); + g_globals->_sceneItems.push_back(&_hotspot18); _hotspot15.postInit(); _hotspot15.setVisage(5140); @@ -1287,41 +1289,41 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _hotspot15.setPosition(Common::Point(977, 173)); _hotspot15.fixPriority(1); - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); + g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position); loadScene(5100); - _globals->_soundHandler.play(205); + g_globals->_soundHandler.play(205); } void Scene5100::signal() { switch (_sceneMode) { case 5101: case 5112: - _globals->setFlag(67); - _globals->_sceneManager.changeScene(5300); + g_globals->setFlag(67); + g_globals->_sceneManager.changeScene(5300); break; case 5102: case 5114: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 5103: - if (_globals->getFlag(61)) { + if (g_globals->getFlag(61)) { SceneItem::display2(5100, 46); - _globals->_sceneManager.changeScene(5300); + g_globals->_sceneManager.changeScene(5300); } else { SceneItem::display2(5100, 45); - _globals->_sceneManager.changeScene(5200); + g_globals->_sceneManager.changeScene(5200); } break; case 5105: - _globals->_sceneManager.changeScene(5300); + g_globals->_sceneManager.changeScene(5300); break; case 5106: - _globals->_stripNum = 5111; - _globals->_sceneManager.changeScene(5200); + g_globals->_stripNum = 5111; + g_globals->_sceneManager.changeScene(5200); break; case 5108: - if (!_globals->getFlag(60)) - _globals->_player.enableControl(); + if (!g_globals->getFlag(60)) + g_globals->_player.enableControl(); else if (RING_INVENTORY._stasisBox._sceneNumber == 1) setAction(&_action2); else @@ -1329,78 +1331,78 @@ void Scene5100::signal() { break; case 5110: SceneItem::display2(5100, 30); - _globals->_player._angle = 325; - _globals->_player.enableControl(); + g_globals->_player._angle = 325; + g_globals->_player.enableControl(); break; case 5111: - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setVisage(0); - _globals->_player.setStrip(6); - _globals->_player.fixPriority(-1); - _globals->_player.animate(ANIM_MODE_1, NULL); - - if ((RING_INVENTORY._vial._sceneNumber != 5100) && !_globals->getFlag(108)) { - _globals->setFlag(108); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setVisage(0); + g_globals->_player.setStrip(6); + g_globals->_player.fixPriority(-1); + g_globals->_player.animate(ANIM_MODE_1, NULL); + + if ((RING_INVENTORY._vial._sceneNumber != 5100) && !g_globals->getFlag(108)) { + g_globals->setFlag(108); _sceneMode = 5130; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); - _speakerBatText.setTextPos(Common::Point(_globals->_sceneManager._scene->_sceneBounds.left + 20, 30)); - setAction(&_sequenceManager, this, 5130, &_globals->_player, &_hotspot6, NULL); - } else if (_globals->_sceneObjects->contains(&_hotspot8)) { + _speakerBatText.setTextPos(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + 20, 30)); + setAction(&_sequenceManager, this, 5130, &g_globals->_player, &_hotspot6, NULL); + } else if (g_globals->_sceneObjects->contains(&_hotspot8)) { setAction(&_action2); } else { - _globals->_player.enableControl(); + g_globals->_player.enableControl(); } break; case 5116: - _globals->setFlag(105); + g_globals->setFlag(105); RING_INVENTORY._bone._sceneNumber = 0; - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setVisage(0); - _globals->_player.setStrip(6); - _globals->_player.fixPriority(-1); - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setVisage(0); + g_globals->_player.setStrip(6); + g_globals->_player.fixPriority(-1); + g_globals->_player.animate(ANIM_MODE_1, NULL); // No break on purpose case 5117: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 5130: _hotspot6.setVisage(5362); _hotspot6.setPosition(Common::Point(542, 25)); _hotspot6.setStrip(6); _hotspot6.setFrame(1); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 5150: - _globals->clearFlag(60); - _globals->_sceneManager.changeScene(5300); + g_globals->clearFlag(60); + g_globals->_sceneManager.changeScene(5300); break; } } void Scene5100::dispatch() { // Flesheater trap - if (_hotspot15._bounds.contains(_globals->_player._position) && !_globals->_player._visage) { - _globals->_player.disableControl(); - _globals->_player.addMover(NULL); + if (_hotspot15._bounds.contains(g_globals->_player._position) && !g_globals->_player._visage) { + g_globals->_player.disableControl(); + g_globals->_player.addMover(NULL); _soundHandler.play(207); _sceneMode = 5103; - setAction(&_sequenceManager, this, (_globals->_player._position.x >= 966) ? 5104 : 5103, - &_globals->_player, &_hotspot15, NULL); + setAction(&_sequenceManager, this, (g_globals->_player._position.x >= 966) ? 5104 : 5103, + &g_globals->_player, &_hotspot15, NULL); } - if (_globals->getFlag(61) && !_globals->getFlag(62) && - ((_globals->_player._position.x - _hotspot2._position.x) < 160) && - (_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) { + if (g_globals->getFlag(61) && !g_globals->getFlag(62) && + ((g_globals->_player._position.x - _hotspot2._position.x) < 160) && + (g_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) { setAction(NULL); _sceneMode = 5150; _soundHandler.play(208); if (RING_INVENTORY._vial._sceneNumber == 5100) { - _globals->_player.addMover(NULL); - _globals->_player.disableControl(); + g_globals->_player.addMover(NULL); + g_globals->_player.disableControl(); SceneItem::display2(5100, 39); } @@ -1408,28 +1410,28 @@ void Scene5100::dispatch() { _hotspot3.setStrip2(2); ObjectMover3 *mover1 = new ObjectMover3(); - _hotspot2.addMover(mover1, &_globals->_player, 20, this); + _hotspot2.addMover(mover1, &g_globals->_player, 20, this); ObjectMover3 *mover2 = new ObjectMover3(); - _hotspot3.addMover(mover2, &_globals->_player, 20, this); + _hotspot3.addMover(mover2, &g_globals->_player, 20, this); } if (!_action) { - if (((_globals->_player._position.x - _hotspot2._position.x) < 130) && !_globals->getFlag(61)) { - _globals->_player._canWalk = false; - _globals->_player.addMover(NULL); + if (((g_globals->_player._position.x - _hotspot2._position.x) < 130) && !g_globals->getFlag(61)) { + g_globals->_player._canWalk = false; + g_globals->_player.addMover(NULL); Common::Point pt(20, 25); PlayerMover2 *mover = new PlayerMover2(); - _hotspot3.addMover(mover, &pt, &_globals->_player); + _hotspot3.addMover(mover, &pt, &g_globals->_player); setAction(&_action4); } - if ((_globals->_sceneManager._scene->_backgroundBounds.right - 85) <= _globals->_player._position.x) - _globals->_sceneManager.changeScene(5000); + if ((g_globals->_sceneManager._scene->_backgroundBounds.right - 85) <= g_globals->_player._position.x) + g_globals->_sceneManager.changeScene(5000); - if (_globals->_player.getRegionIndex() == 8) { + if (g_globals->_player.getRegionIndex() == 8) { _sceneMode = 5114; - setAction(&_sequenceManager, this, 5115, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 5115, &g_globals->_player, NULL); } } @@ -1442,11 +1444,11 @@ void Scene5100::dispatch() { *--------------------------------------------------------------------------*/ void Scene5200::Action1::signal() { - Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; + Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(59) + 120); + setDelay(g_globals->_randomSource.getRandomNumber(59) + 120); break; case 1: scene->_hotspot3.animate(ANIM_MODE_8, 1, this); @@ -1457,30 +1459,30 @@ void Scene5200::Action1::signal() { void Scene5200::Action2::signal() { // Quinn obtains the stasis box from the flesheater throne room - Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; + Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); ADD_PLAYER_MOVER(92, 52); break; case 1: - _globals->_player.setVisage(5202); - _globals->_player._strip = 4; - _globals->_player._frame = 1; - _globals->_player.animate(ANIM_MODE_4, 3, 1, this); + g_globals->_player.setVisage(5202); + g_globals->_player._strip = 4; + g_globals->_player._frame = 1; + g_globals->_player.animate(ANIM_MODE_4, 3, 1, this); break; case 2: scene->_soundHandler.stop(); scene->_hotspot14.remove(); RING_INVENTORY._stasisBox._sceneNumber = 1; - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 3: - _globals->_player.setVisage(0); - _globals->_player._strip = 3; - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setVisage(0); + g_globals->_player._strip = 3; + g_globals->_player.animate(ANIM_MODE_1, NULL); scene->_hotspot8.animate(ANIM_MODE_2, NULL); ADD_MOVER(scene->_hotspot8, 141, 77); @@ -1493,7 +1495,7 @@ void Scene5200::Action2::signal() { scene->_hotspot8.animate(ANIM_MODE_5, this); break; case 5: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -1502,28 +1504,28 @@ void Scene5200::Action2::signal() { void Scene5200::Action3::signal() { switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(5); break; case 1: ADD_PLAYER_MOVER(285, 62); break; case 2: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene5200::Action4::signal() { - Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; + Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(120); break; case 1: - _globals->_soundHandler.play(209); + g_globals->_soundHandler.play(209); scene->_stripManager.start(5202, this, scene); break; case 2: @@ -1539,7 +1541,7 @@ void Scene5200::Action4::signal() { setDelay(60); break; case 6: - _globals->_sceneManager.changeScene(5100); + g_globals->_sceneManager.changeScene(5100); break; } } @@ -1560,7 +1562,7 @@ void Scene5200::Hotspot9::doAction(int action) { SceneItem::display2(5200, 14); break; default: - SceneItem::doAction(action); + SceneHotspot::doAction(action); break; } } @@ -1582,7 +1584,7 @@ void Scene5200::Hotspot10::doAction(int action) { } void Scene5200::Hotspot14::doAction(int action) { - Scene5200 *scene = (Scene5200 *)_globals->_sceneManager._scene; + Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -1636,33 +1638,33 @@ void Scene5200::postInit(SceneObjectList *OwnerList) { _hotspot8._strip = 1; _hotspot8.setPosition(Common::Point(96, 53)); _hotspot8.fixPriority(90); - _globals->_sceneItems.push_back(&_hotspot14); + g_globals->_sceneItems.push_back(&_hotspot14); } - if (_globals->_stripNum == 5111) { + if (g_globals->_stripNum == 5111) { // Happens when the player enters the throne room via the secret passage, // after talking with the bat. No NPCs are around and the player can // obtain the stasis box. - _globals->_soundHandler.play(205); - _globals->_player.disableControl(); - - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.changeZoom(75); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip(1); - _globals->_player.setFrame(3); - _globals->_player.setPosition(Common::Point(307, 62)); + g_globals->_soundHandler.play(205); + g_globals->_player.disableControl(); + + g_globals->_player.postInit(); + g_globals->_player.setVisage(0); + g_globals->_player.changeZoom(75); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setStrip(1); + g_globals->_player.setFrame(3); + g_globals->_player.setPosition(Common::Point(307, 62)); setAction(&_action3); } else { // Happens when the player is captured by the flesh eaters the first time. - _globals->_player.postInit(); - _globals->_player.setVisage(2640); - _globals->_player._strip = 1; - _globals->_player._frame = 4; - _globals->_player.setPosition(Common::Point(105, 199)); + g_globals->_player.postInit(); + g_globals->_player.setVisage(2640); + g_globals->_player._strip = 1; + g_globals->_player._frame = 4; + g_globals->_player.setPosition(Common::Point(105, 199)); _hotspot5.postInit(); _hotspot5.setVisage(5210); @@ -1706,8 +1708,8 @@ void Scene5200::postInit(SceneObjectList *OwnerList) { _hotspot4.setPosition(Common::Point(146, 110)); _hotspot4.fixPriority(90); - _globals->_player.disableControl(); - _globals->setFlag(61); + g_globals->_player.disableControl(); + g_globals->setFlag(61); setAction(&_action4); } @@ -1718,8 +1720,8 @@ void Scene5200::postInit(SceneObjectList *OwnerList) { _hotspot12._sceneRegionId = 10; _hotspot13._sceneRegionId = 8; - _globals->_sceneItems.addItems(&_hotspot12, &_hotspot13, &_hotspot9, &_hotspot10, &_hotspot11, NULL); - _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); + g_globals->_sceneItems.addItems(&_hotspot12, &_hotspot13, &_hotspot9, &_hotspot10, &_hotspot11, NULL); + g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position); loadScene(5200); } @@ -1737,9 +1739,9 @@ void Scene5200::stripCallback(int v) { void Scene5200::dispatch() { Scene::dispatch(); - if (!_action && (_globals->_player.getRegionIndex() == 12)) { - _globals->_stripNum = 5200; - _globals->_sceneManager.changeScene(5100); + if (!_action && (g_globals->_player.getRegionIndex() == 12)) { + g_globals->_stripNum = 5200; + g_globals->_sceneManager.changeScene(5100); } } @@ -1750,11 +1752,11 @@ void Scene5200::dispatch() { void Scene5300::Action1::signal() { // Seeker waking up - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: @@ -1765,30 +1767,30 @@ void Scene5300::Action1::signal() { case 2: scene->_hotspot2.animate(ANIM_MODE_NONE, NULL); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setStrip2(-1); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - ADD_MOVER(_globals->_player, 85, 170); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setStrip2(-1); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + ADD_MOVER(g_globals->_player, 85, 170); break; case 3: scene->_hotspot2.fixPriority(-1); - _globals->_player.checkAngle(&scene->_hotspot2); + g_globals->_player.checkAngle(&scene->_hotspot2); setAction(&scene->_sequenceManager, this, 5305, &scene->_hotspot2, NULL); break; case 4: scene->_stripManager.start(5316, this); break; case 5: - if (!_globals->getFlag(106) || !_globals->getFlag(107) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) { - _globals->_player.enableControl(); + if (!g_globals->getFlag(106) || !g_globals->getFlag(107) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) { + g_globals->_player.enableControl(); remove(); } else { - _globals->setFlag(60); + g_globals->setFlag(60); scene->_hotspot2._numFrames = 10; - if (_globals->getFlag(67)) { + if (g_globals->getFlag(67)) { scene->_sceneMode = 5310; - scene->setAction(&scene->_sequenceManager, scene, 5310, &_globals->_player, &scene->_hotspot2, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5310, &g_globals->_player, &scene->_hotspot2, NULL); } else { scene->_sceneMode = 5347; scene->setAction(&scene->_sequenceManager, scene, 5347, NULL); @@ -1799,46 +1801,46 @@ void Scene5300::Action1::signal() { } void Scene5300::Action2::signal() { - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(60); break; case 1: - _globals->setFlag(60); + g_globals->setFlag(60); scene->_stripManager.start(5328, this); break; case 2: if (RING_INVENTORY._stasisBox._sceneNumber == 1) { - _globals->_stripNum = 5303; + g_globals->_stripNum = 5303; setDelay(5); } else { - _globals->_stripNum = 5302; + g_globals->_stripNum = 5302; scene->_stripManager.start(5329, this); } break; case 3: - _globals->_sceneManager.changeScene(5100); + g_globals->_sceneManager.changeScene(5100); remove(); break; } } void Scene5300::Action3::signal() { - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(30); break; case 1: - scene->_stripManager.start(_globals->_stripNum, this); + scene->_stripManager.start(g_globals->_stripNum, this); break; case 2: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -1847,14 +1849,14 @@ void Scene5300::Action3::signal() { /*--------------------------------------------------------------------------*/ void Scene5300::Hotspot1::doAction(int action) { - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5300, 24); break; case CURSOR_TALK: - _globals->_stripNum = 5312; + g_globals->_stripNum = 5312; scene->setAction(&scene->_action3); break; default: @@ -1864,37 +1866,37 @@ void Scene5300::Hotspot1::doAction(int action) { } void Scene5300::Hotspot2::doAction(int action) { // Seeker - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(5300, 23); break; case CURSOR_USE: - if (!_globals->getFlag(106)) { - _globals->_player.disableControl(); + if (!g_globals->getFlag(106)) { + g_globals->_player.disableControl(); scene->_sceneMode = 5302; - scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5302, &g_globals->_player, NULL); } else { - SceneItem::display2(5300, _globals->getFlag(107) ? 25 : 20); + SceneItem::display2(5300, g_globals->getFlag(107) ? 25 : 20); } break; case CURSOR_TALK: - if (!_globals->getFlag(106)) { - _globals->_player.disableControl(); + if (!g_globals->getFlag(106)) { + g_globals->_player.disableControl(); scene->_sceneMode = 5302; - scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL); - } else if (!_globals->getFlag(107)) { + scene->setAction(&scene->_sequenceManager, scene, 5302, &g_globals->_player, NULL); + } else if (!g_globals->getFlag(107)) { SceneItem::display2(5300, 11); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); if (RING_INVENTORY._stasisBox._sceneNumber != 1) { scene->_sceneMode = 5316; scene->setAction(&scene->_sequenceManager, scene, 5316, NULL); } else { - _globals->setFlag(60); - if (_globals->getFlag(67)) { + g_globals->setFlag(60); + if (g_globals->getFlag(67)) { scene->_sceneMode = 5315; scene->setAction(&scene->_sequenceManager, scene, 5315, this, NULL); } else { @@ -1905,29 +1907,29 @@ void Scene5300::Hotspot2::doAction(int action) { } break; case OBJECT_SCANNER: - SceneItem::display2(5300, _globals->getFlag(107) ? 10 : 9); + SceneItem::display2(5300, g_globals->getFlag(107) ? 10 : 9); break; case OBJECT_MEDKIT: - if (_globals->getFlag(106)) + if (g_globals->getFlag(106)) SceneItem::display2(5300, 7); else { - _globals->setFlag(106); - _globals->_player.disableControl(); + g_globals->setFlag(106); + g_globals->_player.disableControl(); scene->_sceneMode = 5303; - scene->setAction(&scene->_sequenceManager, scene, 5303, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5303, &g_globals->_player, NULL); } break; case OBJECT_VIAL: - if (_globals->getFlag(107)) { + if (g_globals->getFlag(107)) { SceneItem::display2(5300, 8); } else { RING_INVENTORY._vial._sceneNumber = 5300; - _globals->setFlag(107); - _globals->_player.disableControl(); + g_globals->setFlag(107); + g_globals->_player.disableControl(); scene->_sceneMode = 5304; - scene->setAction(&scene->_sequenceManager, scene, 5304, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5304, &g_globals->_player, NULL); } break; default: @@ -1938,7 +1940,7 @@ void Scene5300::Hotspot2::doAction(int action) { void Scene5300::Hotspot5::doAction(int action) { // Sharp bone - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -1946,10 +1948,10 @@ void Scene5300::Hotspot5::doAction(int action) { break; case CURSOR_USE: RING_INVENTORY._bone._sceneNumber = 1; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 5309; - scene->setAction(&scene->_sequenceManager, scene, 5309, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5309, &g_globals->_player, this, NULL); break; default: SceneHotspot::doAction(action); @@ -1959,26 +1961,26 @@ void Scene5300::Hotspot5::doAction(int action) { void Scene5300::Hotspot6::doAction(int action) { // Left Hole - Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene; + Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - if (!_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber == 1)) + if (!g_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber == 1)) SceneItem::display2(5300, 4); else SceneItem::display2(5300, 26); break; case CURSOR_USE: - if (!_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber != 5100)) { - _globals->_player.disableControl(); + if (!g_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber != 5100)) { + g_globals->_player.disableControl(); scene->_sceneMode = 5301; - scene->setAction(&scene->_sequenceManager, scene, 5301, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 5301, &g_globals->_player, NULL); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 5307; RING_INVENTORY._vial._sceneNumber = 1; - scene->setAction(&scene->_sequenceManager, scene, 5307, &scene->_hotspot1, &_globals->_player, + scene->setAction(&scene->_sequenceManager, scene, 5307, &scene->_hotspot1, &g_globals->_player, &scene->_hotspot4, NULL); } break; @@ -1991,19 +1993,19 @@ void Scene5300::Hotspot6::doAction(int action) { void Scene5300::Hotspot7::doAction(int action) { switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(63)) + if (g_globals->getFlag(63)) SceneItem::display2(5300, 2); else { - _globals->setFlag(63); + g_globals->setFlag(63); SceneItem::display2(5300, 0); SceneItem::display2(5300, 1); } break; case CURSOR_USE: - if (_globals->getFlag(64)) + if (g_globals->getFlag(64)) SceneItem::display2(5300, 15); else { - _globals->setFlag(64); + g_globals->setFlag(64); SceneItem::display2(5300, 14); } break; @@ -2016,7 +2018,7 @@ void Scene5300::Hotspot7::doAction(int action) { void Scene5300::Hotspot8::doAction(int action) { switch (action) { case CURSOR_LOOK: - SceneItem::display2(5300, _globals->getFlag(65) ? 6 : 5); + SceneItem::display2(5300, g_globals->getFlag(65) ? 6 : 5); break; case CURSOR_USE: SceneItem::display2(5300, 18); @@ -2048,7 +2050,7 @@ void Scene5300::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerSText); _stripManager.addSpeaker(&_speakerGameText); - if (_globals->getFlag(106) && _globals->getFlag(107)) { + if (g_globals->getFlag(106) && g_globals->getFlag(107)) { _hotspot2.postInit(); _hotspot2.setVisage(2806); _hotspot2.setObjectWrapper(new SceneObjectWrapper()); @@ -2075,13 +2077,13 @@ void Scene5300::postInit(SceneObjectList *OwnerList) { _hotspot4.animate(ANIM_MODE_2, NULL); _hotspot4.hide(); - if (_globals->getFlag(67)) { - _globals->_player.postInit(); - _globals->_player.setVisage(5316); - _globals->_player.setPosition(Common::Point(191, 27)); - _globals->_player.disableControl(); + if (g_globals->getFlag(67)) { + g_globals->_player.postInit(); + g_globals->_player.setVisage(5316); + g_globals->_player.setPosition(Common::Point(191, 27)); + g_globals->_player.disableControl(); - if (_globals->getFlag(107) && _globals->getFlag(106)) { + if (g_globals->getFlag(107) && g_globals->getFlag(106)) { _hotspot2.setVisage(2806); _hotspot2.postInit(); _hotspot2.setObjectWrapper(new SceneObjectWrapper()); @@ -2089,14 +2091,14 @@ void Scene5300::postInit(SceneObjectList *OwnerList) { setAction(&_action2); } else { - _globals->_player.setVisage(5315); - _globals->_player.setPosition(Common::Point(204, 86)); - _globals->_player.animate(ANIM_MODE_2, NULL); - _globals->_player.setStrip2(1); - _globals->_player._moveDiff.y = 12; + g_globals->_player.setVisage(5315); + g_globals->_player.setPosition(Common::Point(204, 86)); + g_globals->_player.animate(ANIM_MODE_2, NULL); + g_globals->_player.setStrip2(1); + g_globals->_player._moveDiff.y = 12; _sceneMode = 5308; - setAction(&_sequenceManager, this, 5308, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 5308, &g_globals->_player, NULL); } } else { _hotspot3.postInit(); @@ -2105,16 +2107,16 @@ void Scene5300::postInit(SceneObjectList *OwnerList) { _hotspot3.fixPriority(1); _hotspot3.animate(ANIM_MODE_NONE, NULL); - _globals->_player.postInit(); - _globals->_player.setVisage(5315); - _globals->_player.setPosition(Common::Point(204, 86)); - _globals->_player.animate(ANIM_MODE_2, NULL); - _globals->_player.setStrip2(1); - _globals->_player._moveDiff.y = 12; - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(5315); + g_globals->_player.setPosition(Common::Point(204, 86)); + g_globals->_player.animate(ANIM_MODE_2, NULL); + g_globals->_player.setStrip2(1); + g_globals->_player._moveDiff.y = 12; + g_globals->_player.disableControl(); _sceneMode = 5306; - setAction(&_sequenceManager, this, 5306, &_globals->_player, &_hotspot3, NULL); + setAction(&_sequenceManager, this, 5306, &g_globals->_player, &_hotspot3, NULL); } _field1B0A = 1; @@ -2123,22 +2125,22 @@ void Scene5300::postInit(SceneObjectList *OwnerList) { _hotspot5.setVisage(5301); _hotspot5.setStrip(2); _hotspot5.setPosition(Common::Point(190, 147)); - _globals->_sceneItems.push_back(&_hotspot5); + g_globals->_sceneItems.push_back(&_hotspot5); } _hotspot6.setBounds(Rect(74, 51, 114, 69)); _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); _hotspot8._sceneRegionId = 8; - _globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL); - _globals->_soundHandler.play(212); + g_globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL); + g_globals->_soundHandler.play(212); } void Scene5300::signal() { switch (_sceneMode) { case 5301: - _globals->_stripNum = 5300; - _globals->_sceneManager.changeScene(5100); + g_globals->_stripNum = 5300; + g_globals->_sceneManager.changeScene(5100); break; case 5307: _soundHandler.fadeOut(NULL); @@ -2147,31 +2149,31 @@ void Scene5300::signal() { case 5308: case 5316: case 5347: - _globals->_player.setStrip2(-1); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); + g_globals->_player.setStrip2(-1); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.enableControl(); break; case 5303: - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.enableControl(); - if (_globals->getFlag(107)) + if (g_globals->getFlag(107)) setAction(&_action1); else SceneItem::display2(5300, 28); break; case 5304: - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.enableControl(); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.enableControl(); - if (_globals->getFlag(106)) + if (g_globals->getFlag(106)) setAction(&_action1); else SceneItem::display2(5300, 28); break; case 5306: - _globals->clearFlag(67); - _globals->_player.setStrip2(-1); + g_globals->clearFlag(67); + g_globals->_player.setStrip2(-1); if ((RING_INVENTORY._vial._sceneNumber == 1) || (RING_INVENTORY._vial._sceneNumber == 5300)) _stripManager.start(5303, this); @@ -2181,7 +2183,7 @@ void Scene5300::signal() { break; case 5309: _hotspot5.remove(); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 5310: _hotspot2.fixPriority(41); @@ -2190,11 +2192,12 @@ void Scene5300::signal() { setAction(&_sequenceManager, this, 5315, &_hotspot2, NULL); break; case 5315: - _globals->_stripNum = 5302; - _globals->_sceneManager.changeScene(5100); + g_globals->_stripNum = 5302; + g_globals->_sceneManager.changeScene(5100); break; } } +} // End of namespace Ringworld -} // End of namespace tSage +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld_scenes6.h b/engines/tsage/ringworld/ringworld_scenes6.h index 2e99f5ab87..bf353de415 100644 --- a/engines/tsage/ringworld_scenes6.h +++ b/engines/tsage/ringworld/ringworld_scenes6.h @@ -24,13 +24,18 @@ #define TSAGE_RINGWORLD_SCENES6_H #include "common/scummsys.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/ringworld/ringworld_speakers.h" #include "tsage/events.h" #include "tsage/core.h" #include "tsage/scenes.h" #include "tsage/globals.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { + +using namespace TsAGE; class Scene5000 : public Scene { /* Actions */ @@ -324,7 +329,8 @@ public: } }; +} // End of namespace Ringworld -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld_scenes8.cpp b/engines/tsage/ringworld/ringworld_scenes8.cpp index 2b329b958a..f8fb8b01e7 100644 --- a/engines/tsage/ringworld_scenes8.cpp +++ b/engines/tsage/ringworld/ringworld_scenes8.cpp @@ -21,12 +21,14 @@ */ #include "graphics/cursorman.h" -#include "tsage/ringworld_scenes8.h" +#include "tsage/ringworld/ringworld_scenes8.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { void NamedHotspotMult::synchronize(Serializer &s) { SceneHotspot::synchronize(s); @@ -49,11 +51,11 @@ void SceneObject7700::synchronize(Serializer &s) { void Scene7000::Action1::signal() { // Quinn walks from the lander to the seaside (action6) then discuss with Skeenar - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: @@ -67,7 +69,7 @@ void Scene7000::Action1::signal() { scene->_object1.animate(ANIM_MODE_5, this); scene->_object1.setPosition(Common::Point(151, 182)); scene->_object1.fixPriority(205); - _globals->_sceneItems.push_front(&scene->_object1); + g_globals->_sceneItems.push_front(&scene->_object1); break; case 3: scene->_object1._numFrames = 4; @@ -80,7 +82,7 @@ void Scene7000::Action1::signal() { setDelay(3); break; case 5: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } @@ -89,25 +91,25 @@ void Scene7000::Action1::signal() { /*--------------------------------------------------------------------------*/ void Scene7000::Action2::signal() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: - _globals->_player.addMover(NULL); - _globals->_player.setVisage(7006); - _globals->_player.setStrip(1); - _globals->_player.setFrame(1); - _globals->_player.setPosition(Common::Point(_globals->_player._position.x, _globals->_player._position.y + 13)); - _globals->_player.changeZoom(68); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.addMover(NULL); + g_globals->_player.setVisage(7006); + g_globals->_player.setStrip(1); + g_globals->_player.setFrame(1); + g_globals->_player.setPosition(Common::Point(g_globals->_player._position.x, g_globals->_player._position.y + 13)); + g_globals->_player.changeZoom(68); + g_globals->_player.animate(ANIM_MODE_5, this); scene->_object1.remove(); break; case 2: - _globals->_sceneManager.changeScene(7100); + g_globals->_sceneManager.changeScene(7100); remove(); break; } @@ -116,7 +118,7 @@ void Scene7000::Action2::signal() { /*--------------------------------------------------------------------------*/ void Scene7000::Action3::dispatch() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene; Action::dispatch(); if (_actionIndex == 4) @@ -127,7 +129,7 @@ void Scene7000::Action3::dispatch() { void Scene7000::Action3::signal() { // Lander is landing - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -163,7 +165,7 @@ void Scene7000::Action3::signal() { } case 4: scene->_object4.remove(); - _globals->_sceneManager.changeScene(2100); + g_globals->_sceneManager.changeScene(2100); remove(); break; } @@ -172,11 +174,11 @@ void Scene7000::Action3::signal() { /*--------------------------------------------------------------------------*/ void Scene7000::Action4::signal() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_object1.animate(ANIM_MODE_6, this); break; case 1: @@ -184,7 +186,7 @@ void Scene7000::Action4::signal() { setDelay(300); break; case 2: - _globals->_soundHandler.play(252); + g_globals->_soundHandler.play(252); scene->_object1.show(); scene->_object1.setStrip(3); scene->_object1.setFrame(1); @@ -193,8 +195,8 @@ void Scene7000::Action4::signal() { case 3: scene->_object1.setStrip(4); scene->_object1.animate(ANIM_MODE_8, 0, NULL); - _globals->setFlag(81); - _globals->_player.enableControl(); + g_globals->setFlag(81); + g_globals->_player.enableControl(); remove(); break; } @@ -203,18 +205,18 @@ void Scene7000::Action4::signal() { /*--------------------------------------------------------------------------*/ void Scene7000::Action5::signal() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: { NpcMover *playerMover = new NpcMover(); Common::Point pt(88, 121); - _globals->_player.addMover(playerMover, &pt, this); + g_globals->_player.addMover(playerMover, &pt, this); break; } case 1: - _globals->_player.checkAngle(&scene->_object1); - _globals->_soundHandler.play(252); + g_globals->_player.checkAngle(&scene->_object1); + g_globals->_soundHandler.play(252); scene->_object1.setStrip(2); scene->_stripManager.start(7015, this); break; @@ -227,34 +229,34 @@ void Scene7000::Action5::signal() { scene->_object1.remove(); NpcMover *mover = new NpcMover(); Common::Point pt(31, 94); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 4: { NpcMover *mover = new NpcMover(); Common::Point pt(11, 94); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 5: { - _globals->_player.fixPriority(10); + g_globals->_player.fixPriority(10); NpcMover *mover = new NpcMover(); Common::Point pt(11, 89); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 6: { NpcMover *mover = new NpcMover(); Common::Point pt(41, 89); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 7: - _globals->clearFlag(36); - _globals->clearFlag(37); - _globals->clearFlag(72); - _globals->clearFlag(13); - _globals->_sceneManager.changeScene(2100); + g_globals->clearFlag(36); + g_globals->clearFlag(37); + g_globals->clearFlag(72); + g_globals->clearFlag(13); + g_globals->_sceneManager.changeScene(2100); break; } } @@ -265,43 +267,43 @@ void Scene7000::Action6::signal() { // Quinn walks from the lander to the seaside switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: { NpcMover *mover = new NpcMover(); Common::Point pt(12, 91); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: { NpcMover *mover = new NpcMover(); Common::Point pt(8, 91); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 3: { NpcMover *mover = new NpcMover(); Common::Point pt(31, 96); - _globals->_player.addMover(mover, &pt, this); - _globals->_player.fixPriority(-1); + g_globals->_player.addMover(mover, &pt, this); + g_globals->_player.fixPriority(-1); break; } case 4: { NpcMover *mover = new NpcMover(); Common::Point pt(83, 117); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 5: { NpcMover *mover = new NpcMover(); Common::Point pt(95, 121); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 6: - _globals->_player.setStrip(3); - _globals->_player.setFrame(1); + g_globals->_player.setStrip(3); + g_globals->_player.setFrame(1); remove(); break; } @@ -312,7 +314,7 @@ void Scene7000::Action6::signal() { void Scene7000::Action7::signal() { switch (_actionIndex++) { case 0: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); setDelay(3); break; case 1: @@ -321,33 +323,33 @@ void Scene7000::Action7::signal() { case 2: { NpcMover *mover = new NpcMover(); Common::Point pt(31, 94); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 3: { NpcMover *mover = new NpcMover(); Common::Point pt(11, 94); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 4: { - _globals->_player.fixPriority(10); + g_globals->_player.fixPriority(10); NpcMover *mover = new NpcMover(); Common::Point pt(11, 89); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 5: { NpcMover *mover = new NpcMover(); Common::Point pt(41, 89); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 6: - if (_globals->getFlag(13)) - _globals->_sceneManager.changeScene(2280); + if (g_globals->getFlag(13)) + g_globals->_sceneManager.changeScene(2280); else - _globals->_sceneManager.changeScene(2320); + g_globals->_sceneManager.changeScene(2320); break; } } @@ -365,84 +367,84 @@ void Scene7000::Hotspot1::doAction(int action) { void Scene7000::Object1::doAction(int action) { // Skeenar - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_TRANSLATOR: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); RING_INVENTORY._translator._sceneNumber = 7000; if ((RING_INVENTORY._waldos._sceneNumber != 7000) && (RING_INVENTORY._jar._sceneNumber != 7000)) { scene->_sceneMode = 7004; - scene->setAction(&scene->_sequenceManager, scene, 7004, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7004, &g_globals->_player, this, NULL); } else if (RING_INVENTORY._waldos._sceneNumber != 7000) { scene->_sceneMode = 7011; - scene->setAction(&scene->_sequenceManager, scene, 7010, &_globals->_player, &scene->_object1, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7010, &g_globals->_player, &scene->_object1, NULL); } else if (RING_INVENTORY._jar._sceneNumber != 7000) { scene->_sceneMode = 7012; - scene->setAction(&scene->_sequenceManager, scene, 7010, &_globals->_player, &scene->_object1, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7010, &g_globals->_player, &scene->_object1, NULL); } else { scene->_sceneMode = 7015; - scene->setAction(&scene->_sequenceManager, scene, 7017, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7017, &g_globals->_player, NULL); } break; case OBJECT_WALDOS: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); RING_INVENTORY._waldos._sceneNumber = 7000; if (RING_INVENTORY._translator._sceneNumber == 7000) { if (RING_INVENTORY._jar._sceneNumber == 7000) { scene->_sceneMode = 7015; - scene->setAction(&scene->_sequenceManager, scene, 7015, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7015, &g_globals->_player, NULL); } else { scene->_sceneMode = 7006; - scene->setAction(&scene->_sequenceManager, scene, 7006, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7006, &g_globals->_player, NULL); } } else { scene->_sceneMode = 7009; - scene->setAction(&scene->_sequenceManager, scene, 7009, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7009, &g_globals->_player, NULL); } break; case OBJECT_JAR: - _globals->_player.disableControl(); + g_globals->_player.disableControl(); RING_INVENTORY._jar._sceneNumber = 7000; if (RING_INVENTORY._translator._sceneNumber == 7000) { if (RING_INVENTORY._waldos._sceneNumber != 7000) { scene->_sceneMode = 7007; - scene->setAction(&scene->_sequenceManager, scene, 7007, &_globals->_player, &scene->_object1, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7007, &g_globals->_player, &scene->_object1, NULL); } else { scene->_sceneMode = 7015; - scene->setAction(&scene->_sequenceManager, scene, 7016, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7016, &g_globals->_player, NULL); } } else { scene->_sceneMode = 7008; - scene->setAction(&scene->_sequenceManager, scene, 7008, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7008, &g_globals->_player, NULL); } break; case CURSOR_LOOK: - if (_globals->getFlag(81)) + if (g_globals->getFlag(81)) SceneItem::display2(7000, 1); else SceneItem::display2(7000, 0); break; case CURSOR_USE: - if (_globals->getFlag(81)) { + if (g_globals->getFlag(81)) { RING_INVENTORY._stasisBox2._sceneNumber = 1; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action5); } else { SceneItem::display2(7000, 5); } break; case CURSOR_TALK: - if (_globals->getFlag(81)) { + if (g_globals->getFlag(81)) { RING_INVENTORY._stasisBox2._sceneNumber = 1; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action5); - } else if (_globals->getFlag(52)) { + } else if (g_globals->getFlag(52)) { scene->_sceneMode = 7005; scene->setAction(&scene->_sequenceManager, scene, 7013, NULL); - } else if (_globals->getFlag(13)) { + } else if (g_globals->getFlag(13)) { scene->_sceneMode = 7002; scene->setAction(&scene->_sequenceManager, scene, 7014, NULL); } else { @@ -459,25 +461,25 @@ void Scene7000::Object1::doAction(int action) { /*--------------------------------------------------------------------------*/ void Scene7000::dispatch() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene; if (!_action) { - if (_globals->_sceneRegions.indexOf(_globals->_player._position) == 8) { - if (!_globals->getFlag(13)) { - _globals->_player.disableControl(); - _globals->_player.addMover(NULL); + if (g_globals->_sceneRegions.indexOf(g_globals->_player._position) == 8) { + if (!g_globals->getFlag(13)) { + g_globals->_player.disableControl(); + g_globals->_player.addMover(NULL); SceneItem::display2(7000, 3); _sceneMode = 7001; - setAction(&scene->_sequenceManager, this, 7001, &_globals->_player, NULL); - } else if (!_globals->getFlag(52)) { + setAction(&scene->_sequenceManager, this, 7001, &g_globals->_player, NULL); + } else if (!g_globals->getFlag(52)) { setAction(&_action2); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); _sceneMode = 7003; - setAction(&scene->_sequenceManager, this, 7003, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 7003, &g_globals->_player, NULL); } } - if (_globals->_sceneRegions.indexOf(_globals->_player._position) == 9) + if (g_globals->_sceneRegions.indexOf(g_globals->_player._position) == 9) scene->setAction(&scene->_action7); } Scene::dispatch(); @@ -496,7 +498,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_speakerQR); _speakerSKText._npc = &_object1; - _speakerQText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; _object5.postInit(); _object5.setVisage(7001); @@ -526,7 +528,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { _object8.setPosition(Common::Point(176, 175)); _object8.fixPriority(1); - if (_globals->getFlag(72)) { + if (g_globals->getFlag(72)) { _object3.postInit(); _object3.setVisage(5001); _object3.setStrip2(1); @@ -536,7 +538,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { _object1.postInit(); _object1.setVisage(7003); - if (_globals->getFlag(81)) + if (g_globals->getFlag(81)) _object1.setStrip(4); else _object1.setStrip(2); @@ -544,20 +546,20 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { _object1._numFrames = 4; _object1.changeZoom(45); _object1.animate(ANIM_MODE_8, 0, NULL); - _globals->_sceneItems.push_back(&_object1); + g_globals->_sceneItems.push_back(&_object1); } _soundHandler.play(251); - if (_globals->_sceneManager._previousScene == 2100) { - if (_globals->getFlag(72)) { - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); + if (g_globals->_sceneManager._previousScene == 2100) { + if (g_globals->getFlag(72)) { + g_globals->_player.postInit(); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); SceneObjectWrapper *wrapper = new SceneObjectWrapper(); - _globals->_player.setObjectWrapper(wrapper); - _globals->_player.setPosition(Common::Point(57, 94)); - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(10); - if (_globals->getFlag(81)) { + g_globals->_player.setObjectWrapper(wrapper); + g_globals->_player.setPosition(Common::Point(57, 94)); + g_globals->_player.changeZoom(-1); + g_globals->_player.fixPriority(10); + if (g_globals->getFlag(81)) { setAction(&_action4); } else { _object1.setPosition(Common::Point(151, 182)); @@ -565,8 +567,8 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { setAction(&_action1); } } else { - _globals->_soundHandler.play(250); - _globals->setFlag(72); + g_globals->_soundHandler.play(250); + g_globals->setFlag(72); _object3.postInit(); _object3.setVisage(5001); @@ -576,36 +578,36 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { _object3.changeZoom(-1); setAction(&_action3); } - } else if (_globals->_sceneManager._previousScene == 2280) { - _globals->_player.postInit(); - _globals->_player.setVisage(2170); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setPosition(Common::Point(57, 94)); - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(10); - _globals->_player.disableControl(); + } else if (g_globals->_sceneManager._previousScene == 2280) { + g_globals->_player.postInit(); + g_globals->_player.setVisage(2170); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setPosition(Common::Point(57, 94)); + g_globals->_player.changeZoom(-1); + g_globals->_player.fixPriority(10); + g_globals->_player.disableControl(); _sceneMode = 7001; setAction(&_action6, this); - if (!_globals->getFlag(81)) { + if (!g_globals->getFlag(81)) { _object1.setPosition(Common::Point(151, 182)); _object1.changeZoom(100); } _object8.remove(); _object9.remove(); - } else if (_globals->_sceneManager._previousScene == 2320) { - _globals->_player.postInit(); - _globals->_player.setVisage(0); - _globals->_player.animate(ANIM_MODE_1, NULL); + } else if (g_globals->_sceneManager._previousScene == 2320) { + g_globals->_player.postInit(); + g_globals->_player.setVisage(0); + g_globals->_player.animate(ANIM_MODE_1, NULL); SceneObjectWrapper *wrapper = new SceneObjectWrapper(); - _globals->_player.setObjectWrapper(wrapper); - _globals->_player.setPosition(Common::Point(57, 94)); - _globals->_player.changeZoom(-1); - _globals->_player.fixPriority(10); + g_globals->_player.setObjectWrapper(wrapper); + g_globals->_player.setPosition(Common::Point(57, 94)); + g_globals->_player.changeZoom(-1); + g_globals->_player.fixPriority(10); _sceneMode = 7001; setAction(&_action6, this); } else { - _globals->setFlag(72); + g_globals->setFlag(72); _object3.postInit(); _object3.setVisage(5001); @@ -613,18 +615,18 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { _object3.setPosition(Common::Point(307, 0)); _soundHandler.play(151); _soundHandler.holdAt(true); - _globals->_soundHandler.play(250); + g_globals->_soundHandler.play(250); setAction(&_action3); } _hotspot1.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); - _globals->_sceneItems.push_back(&_hotspot1); + g_globals->_sceneItems.push_back(&_hotspot1); } /*--------------------------------------------------------------------------*/ void Scene7000::signal() { - Scene7000 *scene = (Scene7000 *)_globals->_sceneManager._scene; + Scene7000 *scene = (Scene7000 *)g_globals->_sceneManager._scene; switch (_sceneMode) { case 7001: case 7002: @@ -634,19 +636,19 @@ void Scene7000::signal() { case 7007: case 7008: case 7009: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 7003: _sceneMode = 7001; - setAction(&scene->_sequenceManager, this, 7001, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 7001, &g_globals->_player, NULL); break; case 7011: _sceneMode = 7005; - setAction(&scene->_sequenceManager, this, 7005, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 7005, &g_globals->_player, NULL); break; case 7012: _sceneMode = 7005; - setAction(&scene->_sequenceManager, this, 7012, &_globals->_player, NULL); + setAction(&scene->_sequenceManager, this, 7012, &g_globals->_player, NULL); break; case 7015: setAction(&_action4); @@ -661,7 +663,7 @@ void Scene7000::signal() { *--------------------------------------------------------------------------*/ void Scene7100::Action3::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -681,11 +683,11 @@ void Scene7100::Action3::signal() { } void Scene7100::Action4::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(1) + 1); + setDelay(g_globals->_randomSource.getRandomNumber(1) + 1); break; case 1: { scene->_object5.setStrip(3); @@ -709,7 +711,7 @@ void Scene7100::Action4::signal() { } void Scene7100::Action5::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -744,7 +746,7 @@ void Scene7100::Action5::signal() { } void Scene7100::Action6::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -799,7 +801,7 @@ void Scene7100::Action6::signal() { } void Scene7100::Action7::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -827,7 +829,7 @@ void Scene7100::Action7::signal() { } void Scene7100::Action8::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -925,7 +927,7 @@ void Scene7100::Action8::signal() { } void Scene7100::Action9::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -970,7 +972,7 @@ void Scene7100::Action9::signal() { } void Scene7100::Action10::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -990,7 +992,7 @@ void Scene7100::Action10::signal() { } void Scene7100::Action11::signal() { - Scene7100 *scene = (Scene7100 *)_globals->_sceneManager._scene; + Scene7100 *scene = (Scene7100 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -999,19 +1001,19 @@ void Scene7100::Action11::signal() { case 1: { Common::Point pt(154, 175); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); ObjectMover2 *mover2 = new ObjectMover2(); - scene->_object1.addMover(mover2, 25, 35, &_globals->_player); + scene->_object1.addMover(mover2, 25, 35, &g_globals->_player); break; } case 2: { Common::Point pt(700, 155); NpcMover *mover = new NpcMover(); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 3: - _globals->_sceneManager.changeScene(7200); + g_globals->_sceneManager.changeScene(7200); remove(); break; } @@ -1117,14 +1119,14 @@ void Scene7100::postInit(SceneObjectList *OwnerList) { _object25.setAction(&_action10, NULL); // Swimmer 1 - _globals->_player.postInit(); - _globals->_player.setVisage(7101); - _globals->_player.animate(ANIM_MODE_2, NULL); - _globals->_player._moveDiff.x = 4; - _globals->_player._moveDiff.y = 2; - _globals->_player.setPosition(Common::Point(135, 135)); - _globals->_player.fixPriority(200); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(7101); + g_globals->_player.animate(ANIM_MODE_2, NULL); + g_globals->_player._moveDiff.x = 4; + g_globals->_player._moveDiff.y = 2; + g_globals->_player.setPosition(Common::Point(135, 135)); + g_globals->_player.fixPriority(200); + g_globals->_player.disableControl(); // Swimmer 2 _object1.postInit(); @@ -1137,7 +1139,7 @@ void Scene7100::postInit(SceneObjectList *OwnerList) { setAction(&_action11); _soundHandler1.play(270); _soundHandler2.play(275); - _globals->_soundHandler.play(270); + g_globals->_soundHandler.play(270); } /*-------------------------------------------------------------------------- * Scene 7200 - Underwater: Entering the cave @@ -1145,7 +1147,7 @@ void Scene7100::postInit(SceneObjectList *OwnerList) { *--------------------------------------------------------------------------*/ void Scene7200::Action1::signal() { - Scene7200 *scene = (Scene7200 *)_globals->_sceneManager._scene; + Scene7200 *scene = (Scene7200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1157,13 +1159,13 @@ void Scene7200::Action1::signal() { scene->_swimmer.addMover(mover1, &pt1, this); Common::Point pt2(207, 138); PlayerMover *mover2 = new PlayerMover(); - _globals->_player.addMover(mover2, &pt2, this); + g_globals->_player.addMover(mover2, &pt2, this); break; } case 2: break; case 3: - _globals->_sceneManager.changeScene(7300); + g_globals->_sceneManager.changeScene(7300); remove(); break; } @@ -1172,7 +1174,7 @@ void Scene7200::Action1::signal() { /*--------------------------------------------------------------------------*/ void Scene7200::Action2::signal() { - Scene7200 *scene = (Scene7200 *)_globals->_sceneManager._scene; + Scene7200 *scene = (Scene7200 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1286,13 +1288,13 @@ void Scene7200::postInit(SceneObjectList *OwnerList) { _object9._numFrames = 3; // Orange swimmer - _globals->_player.postInit(); - _globals->_player.setVisage(7110); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setZoom(50); - _globals->_player.setPosition(Common::Point(-18, 16)); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(7110); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setZoom(50); + g_globals->_player.setPosition(Common::Point(-18, 16)); + g_globals->_player.disableControl(); _swimmer.postInit(); _swimmer.setVisage(7101); @@ -1311,7 +1313,7 @@ void Scene7200::postInit(SceneObjectList *OwnerList) { *--------------------------------------------------------------------------*/ void Scene7300::Action1::signal() { - Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; + Scene7300 *scene = (Scene7300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1325,18 +1327,18 @@ void Scene7300::Action1::signal() { case 4: { NpcMover *mover = new NpcMover(); Common::Point pt(102, 122); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 5: - _globals->_player.setStrip(2); - _globals->_player.setFrame(1); - _globals->_player.animate(ANIM_MODE_5, this); + g_globals->_player.setStrip(2); + g_globals->_player.setFrame(1); + g_globals->_player.animate(ANIM_MODE_5, this); break; case 6: - _globals->_player.setStrip(3); - _globals->_player._numFrames = 5; - _globals->_player.animate(ANIM_MODE_2, this); + g_globals->_player.setStrip(3); + g_globals->_player._numFrames = 5; + g_globals->_player.animate(ANIM_MODE_2, this); if (RING_INVENTORY._translator._sceneNumber == 1) scene->_stripManager.start(7310, this); else @@ -1344,10 +1346,10 @@ void Scene7300::Action1::signal() { break; case 7: setDelay(3); - _globals->_soundHandler.fadeOut(NULL); + g_globals->_soundHandler.fadeOut(NULL); break; case 8: - _globals->_sceneManager.changeScene(2280); + g_globals->_sceneManager.changeScene(2280); break; } } @@ -1355,7 +1357,7 @@ void Scene7300::Action1::signal() { /*--------------------------------------------------------------------------*/ void Scene7300::Action2::signal() { - Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; + Scene7300 *scene = (Scene7300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1363,7 +1365,7 @@ void Scene7300::Action2::signal() { break; case 1: NpcMover *mover1 = new NpcMover(); - Common::Point pt(_globals->_randomSource.getRandomNumber(3) + 203, _globals->_randomSource.getRandomNumber(3) + 96); + Common::Point pt(g_globals->_randomSource.getRandomNumber(3) + 203, g_globals->_randomSource.getRandomNumber(3) + 96); scene->_object3.addMover(mover1, &pt, this); _actionIndex = 0; break; @@ -1373,7 +1375,7 @@ void Scene7300::Action2::signal() { /*--------------------------------------------------------------------------*/ void Scene7300::Action3::signal() { - Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; + Scene7300 *scene = (Scene7300 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: @@ -1381,7 +1383,7 @@ void Scene7300::Action3::signal() { break; case 1: NpcMover *mover1 = new NpcMover(); - Common::Point pt(_globals->_randomSource.getRandomNumber(5) + 76, _globals->_randomSource.getRandomNumber(5) + 78); + Common::Point pt(g_globals->_randomSource.getRandomNumber(5) + 76, g_globals->_randomSource.getRandomNumber(5) + 78); scene->_object1.addMover(mover1, &pt, this); _actionIndex = 0; break; @@ -1404,7 +1406,7 @@ void Scene7300::Action4::signal() { /*--------------------------------------------------------------------------*/ void Scene7300::dispatch() { - Scene7300 *scene = (Scene7300 *)_globals->_sceneManager._scene; + Scene7300 *scene = (Scene7300 *)g_globals->_sceneManager._scene; scene->_object4.setPosition(Common::Point(scene->_object3._position.x + 15, scene->_object3._position.y + 61)); scene->_object2.setPosition(Common::Point(scene->_object1._position.x + 1, scene->_object1._position.y - 31)); @@ -1419,9 +1421,9 @@ void Scene7300::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(60, 85, 200, 100); - _globals->setFlag(52); - _globals->setFlag(24); - _globals->setFlag(109); + g_globals->setFlag(52); + g_globals->setFlag(24); + g_globals->setFlag(109); _stripManager.addSpeaker(&_speakerPOR); _stripManager.addSpeaker(&_speakerPOText); @@ -1448,11 +1450,11 @@ void Scene7300::postInit(SceneObjectList *OwnerList) { _object3._moveRate = 2; _object3.setAction(&_action2); - _globals->_player.postInit(); - _globals->_player.setVisage(7305); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setPosition(Common::Point(-100, 100)); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.setVisage(7305); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setPosition(Common::Point(-100, 100)); + g_globals->_player.disableControl(); _object1.postInit(); _object1.setVisage(7312); @@ -1497,7 +1499,7 @@ void Scene7300::postInit(SceneObjectList *OwnerList) { _object8._numFrames = 2; setAction(&_action1); - _globals->_soundHandler.play(272); + g_globals->_soundHandler.play(272); } /*-------------------------------------------------------------------------- @@ -1513,11 +1515,11 @@ void Scene7600::Action1::signal() { case 1: { PlayerMover *mover = new PlayerMover(); Common::Point pt(389, 57); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: - _globals->_sceneManager.changeScene(7700); + g_globals->_sceneManager.changeScene(7700); break; } } @@ -1532,11 +1534,11 @@ void Scene7600::Action2::signal() { case 1: { NpcMover *mover = new NpcMover(); Common::Point pt(-30, 195); - _globals->_player.addMover(mover, &pt, this); + g_globals->_player.addMover(mover, &pt, this); break; } case 2: - _globals->_sceneManager.changeScene(2320); + g_globals->_sceneManager.changeScene(2320); remove(); break; } @@ -1583,23 +1585,23 @@ void Scene7600::postInit(SceneObjectList *OwnerList) { _object6.setPosition(Common::Point(379, 191)); _object6.fixPriority(1); - _globals->_player.postInit(); - _globals->_player.setVisage(2333); - _globals->_player.animate(ANIM_MODE_1, NULL); - _globals->_player.setObjectWrapper(new SceneObjectWrapper()); - _globals->_player.setStrip(1); - _globals->_player._moveDiff = Common::Point(16, 16); - _globals->_player.changeZoom(-1); - _globals->_player.disableControl(); - - if (_globals->_sceneManager._previousScene == 7700) { - _globals->_player.setPosition(Common::Point(389, 57)); + g_globals->_player.postInit(); + g_globals->_player.setVisage(2333); + g_globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.setObjectWrapper(new SceneObjectWrapper()); + g_globals->_player.setStrip(1); + g_globals->_player._moveDiff = Common::Point(16, 16); + g_globals->_player.changeZoom(-1); + g_globals->_player.disableControl(); + + if (g_globals->_sceneManager._previousScene == 7700) { + g_globals->_player.setPosition(Common::Point(389, 57)); setAction(&_action2); } else { - _globals->_player.setPosition(Common::Point(-50, 195)); + g_globals->_player.setPosition(Common::Point(-50, 195)); setAction(&_action1); } - _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); + _sceneBounds.center(g_globals->_player._position.x, g_globals->_player._position.y); loadScene(7600); _soundHandler2.play(255); _soundHandler1.play(251); @@ -1616,11 +1618,11 @@ void Scene7700::Action1::signal() { case 0: { PlayerMover *mover1 = new PlayerMover(); Common::Point pt = Common::Point(fmtObj->_position.x, fmtObj->_position.y + 30); - _globals->_player.addMover(mover1, &pt, this); + g_globals->_player.addMover(mover1, &pt, this); break; } case 1: - _globals->_player.checkAngle(fmtObj); + g_globals->_player.checkAngle(fmtObj); if (fmtObj->_state == 0) fmtObj->animate(ANIM_MODE_5, this); else @@ -1633,11 +1635,11 @@ void Scene7700::Action1::signal() { } void Scene7700::Action2::signal() { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: case 2: - setDelay(_globals->_randomSource.getRandomNumber(60) + 60); + setDelay(g_globals->_randomSource.getRandomNumber(60) + 60); break; case 1: scene->_prof.animate(ANIM_MODE_7, 0, NULL); @@ -1651,7 +1653,7 @@ void Scene7700::Action2::signal() { } void Scene7700::Action3::signal() { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: scene->_object15.animate(ANIM_MODE_5, this); @@ -1673,14 +1675,14 @@ void Scene7700::Action3::signal() { scene->_object8._numFrames = 3; break; case 3: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene7700::Action4::signal() { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 2: scene->_object13.remove(); @@ -1699,21 +1701,21 @@ void Scene7700::Action4::signal() { case 3: CursorMan.showMouse(true); SceneItem::display2(7700, 11); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); remove(); break; } } void Scene7700::Action5::signal() { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(240)); + setDelay(g_globals->_randomSource.getRandomNumber(240)); break; case 1: { - scene->_cloud.setFrame(_globals->_randomSource.getRandomNumber(1) + 1); - scene->_cloud.setPosition(Common::Point(133, 145 + _globals->_randomSource.getRandomNumber(54))); + scene->_cloud.setFrame(g_globals->_randomSource.getRandomNumber(1) + 1); + scene->_cloud.setPosition(Common::Point(133, 145 + g_globals->_randomSource.getRandomNumber(54))); Common::Point pt(360, scene->_cloud._position.y); NpcMover *mover = new NpcMover(); @@ -1725,7 +1727,7 @@ void Scene7700::Action5::signal() { } void Scene7700::Action6::signal() { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (_actionIndex++) { case 0: setDelay(5); @@ -1771,7 +1773,7 @@ void Scene7700::SceneHotspot2::doAction(int action) { } void Scene7700::SceneHotspot3::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_KEY: @@ -1785,13 +1787,13 @@ void Scene7700::SceneHotspot3::doAction(int action) { SceneItem::display2(7700, 53); break; case CURSOR_USE: - if (!_globals->getFlag(78)) { + if (!g_globals->getFlag(78)) { scene->_sceneMode = 7712; scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); } else if (RING_INVENTORY._key._sceneNumber == 7700) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 7705; - scene->setAction(&scene->_sequenceManager, scene, 7705, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7705, &g_globals->_player, NULL); } break; default: @@ -1801,14 +1803,14 @@ void Scene7700::SceneHotspot3::doAction(int action) { } void Scene7700::SceneHotspot4::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(7700, 12); break; case CURSOR_USE: - if (!_globals->getFlag(78)) { + if (!g_globals->getFlag(78)) { scene->_sceneMode = 7712; scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); } else { @@ -1822,18 +1824,18 @@ void Scene7700::SceneHotspot4::doAction(int action) { } void Scene7700::SceneHotspot5::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: SceneItem::display2(7700, 28); break; case CURSOR_USE: - if (_globals->getFlag(78)) { + if (g_globals->getFlag(78)) { if (RING_INVENTORY._paper._sceneNumber == 7700) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 7708; - scene->setAction(&scene->_sequenceManager, scene, 7708, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7708, &g_globals->_player, NULL); } } else { scene->_sceneMode = 7712; @@ -1866,7 +1868,7 @@ void Scene7700::SceneItem7::doAction(int action) { } void Scene7700::SceneHotspot8::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -1892,7 +1894,7 @@ void Scene7700::SceneHotspot8::doAction(int action) { } void Scene7700::SceneHotspot9::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -1917,7 +1919,7 @@ void Scene7700::SceneHotspot9::doAction(int action) { } else { scene->_field97B++; if (scene->_field97B == 3) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->setAction(&scene->_action3); } } @@ -1935,13 +1937,13 @@ void Scene7700::SceneItem10::doAction(int action) { } void Scene7700::Object1::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(7700, _lookLineNum); } else if (action == CURSOR_USE) { - if (_globals->getFlag(78)) { - _globals->_player.disableControl(); + if (g_globals->getFlag(78)) { + g_globals->_player.disableControl(); scene->setAction(&scene->_action1, this); } else { scene->_sceneMode = 7712; @@ -1973,20 +1975,20 @@ void Scene7700::Object1::signal() { } else { _state = 0; } - _globals->_player.enableControl(); + g_globals->_player.enableControl(); } void Scene7700::Object3::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(7700, 34); } else if (action == CURSOR_USE) { - if (_globals->getFlag(78)) { + if (g_globals->getFlag(78)) { if (scene->_object3._frame == 1) { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 7707; - scene->setAction(&scene->_sequenceManager, scene, 7707, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7707, &g_globals->_player, this, NULL); } else { SceneItem::display2(7700, 60); } @@ -2000,17 +2002,17 @@ void Scene7700::Object3::doAction(int action) { } void Scene7700::Object7::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: - if (_globals->getFlag(78)) + if (g_globals->getFlag(78)) SceneItem::display2(7700, 45); else SceneItem::display2(7700, 44); break; case CURSOR_USE: - if (_globals->getFlag(78)) { + if (g_globals->getFlag(78)) { SceneItem::display2(7701, 41); } else { scene->_sceneMode = 7712; @@ -2018,10 +2020,10 @@ void Scene7700::Object7::doAction(int action) { } break; case CURSOR_TALK: - if (_globals->getFlag(78)) { + if (g_globals->getFlag(78)) { SceneItem::display2(7702, 1); } else { - _globals->_player.disableControl(); + g_globals->_player.disableControl(); if (_state == 0) { _state = 1; scene->_sceneMode = 7703; @@ -2033,13 +2035,13 @@ void Scene7700::Object7::doAction(int action) { } break; case OBJECT_STUNNER: - if (!_globals->getFlag(78)) { - _globals->_soundHandler.stop(); - _globals->setFlag(78); + if (!g_globals->getFlag(78)) { + g_globals->_soundHandler.stop(); + g_globals->setFlag(78); setAction(NULL); - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 7704; - scene->setAction(&scene->_sequenceManager, scene, 7704, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7704, &g_globals->_player, this, NULL); } break; default: @@ -2049,7 +2051,7 @@ void Scene7700::Object7::doAction(int action) { } void Scene7700::Object8::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) { if (_strip == 3) { @@ -2069,10 +2071,10 @@ void Scene7700::Object8::doAction(int action) { scene->_gfxButton._bounds.center(140, 189); scene->_gfxButton.draw(); - _globals->_sceneItems.push_front(&scene->_sceneItem10); - _globals->_sceneItems.push_front(&scene->_object9); - _globals->_player._canWalk = false; - } else if (_globals->getFlag(78)) { + g_globals->_sceneItems.push_front(&scene->_sceneItem10); + g_globals->_sceneItems.push_front(&scene->_object9); + g_globals->_player._canWalk = false; + } else if (g_globals->getFlag(78)) { scene->_object15.postInit(); scene->_object15.setVisage(7701); scene->_object15.setPosition(Common::Point(140, 165)); @@ -2088,11 +2090,11 @@ void Scene7700::Object8::doAction(int action) { scene->_object19.setStrip(6); scene->_object19.setPosition(Common::Point(140, 192)); - _globals->_sceneItems.push_front(&scene->_sceneItem10); - _globals->_sceneItems.push_front(&scene->_sceneHotspot8); - _globals->_sceneItems.push_front(&scene->_sceneHotspot9); - _globals->_events.setCursor(CURSOR_WALK); - _globals->_player._canWalk = false; + g_globals->_sceneItems.push_front(&scene->_sceneItem10); + g_globals->_sceneItems.push_front(&scene->_sceneHotspot8); + g_globals->_sceneItems.push_front(&scene->_sceneHotspot9); + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_player._canWalk = false; } else { scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); } @@ -2102,7 +2104,7 @@ void Scene7700::Object8::doAction(int action) { } void Scene7700::Object9::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (action) { case CURSOR_LOOK: @@ -2116,19 +2118,19 @@ void Scene7700::Object9::doAction(int action) { break; case OBJECT_KEY: if (_frame == 1) { - if (!_globals->getFlag(80)) { + if (!g_globals->getFlag(80)) { scene->_object10.postInit(); scene->_object10.setVisage(7701); scene->_object10.setStrip(4); scene->_object10.setPosition(Common::Point(159, 136)); - _globals->_sceneItems.push_front(&scene->_object10); + g_globals->_sceneItems.push_front(&scene->_object10); scene->_object10.fixPriority(240); } scene->_soundHandler.play(262); scene->_object14.animate(ANIM_MODE_5, NULL); } - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); break; default: SceneHotspot::doAction(action); @@ -2136,14 +2138,14 @@ void Scene7700::Object9::doAction(int action) { } void Scene7700::Object10::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(7700, 50); } else if (action == CURSOR_USE) { - _globals->_player._canWalk = true; + g_globals->_player._canWalk = true; RING_INVENTORY._translator._sceneNumber = 1; - _globals->setFlag(80); + g_globals->setFlag(80); scene->_sceneItem10.remove(); scene->_gfxButton._bounds.expandPanes(); scene->_object14.remove(); @@ -2155,7 +2157,7 @@ void Scene7700::Object10::doAction(int action) { } void Scene7700::Object11::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; switch (action) { case OBJECT_SCANNER: @@ -2174,18 +2176,18 @@ void Scene7700::Object11::doAction(int action) { if (_frame != 1) { SceneItem::display2(7701, 8); } else { - _globals->setFlag(49); - _globals->_player.disableControl(); + g_globals->setFlag(49); + g_globals->_player.disableControl(); scene->_sceneMode = 7706; - scene->setAction(&scene->_sequenceManager, scene, 7706, &_globals->_player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7706, &g_globals->_player, this, NULL); } break; case OBJECT_EMPTY_JAR: RING_INVENTORY._emptyJar._sceneNumber = 0; RING_INVENTORY._jar._sceneNumber = 1; - _globals->_player.disableControl(); + g_globals->_player.disableControl(); scene->_sceneMode = 7710; - scene->setAction(&scene->_sequenceManager, scene, 7710, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7710, &g_globals->_player, NULL); break; default: SceneHotspot::doAction(action); @@ -2193,14 +2195,14 @@ void Scene7700::Object11::doAction(int action) { } void Scene7700::Object12::doAction(int action) { - Scene7700 *scene = (Scene7700 *)_globals->_sceneManager._scene; + Scene7700 *scene = (Scene7700 *)g_globals->_sceneManager._scene; if (action == CURSOR_LOOK) { SceneItem::display2(7700, 15); } else if (action == CURSOR_USE) { - if (_globals->getFlag(78)) { + if (g_globals->getFlag(78)) { scene->_sceneMode = 7713; - scene->setAction(&scene->_sequenceManager, scene, 7713, &_globals->_player, NULL); + scene->setAction(&scene->_sequenceManager, scene, 7713, &g_globals->_player, NULL); } else { scene->_sceneMode = 7712; scene->setAction(&scene->_sequenceManager, scene, 7715, NULL); @@ -2213,46 +2215,46 @@ void Scene7700::Object12::doAction(int action) { void Scene7700::signal() { switch (_sceneMode) { case 7701: - _globals->_player.fixPriority(-1); - _globals->_player.setStrip2(-1); - if (_globals->getFlag(78)) { - _globals->_player.enableControl(); + g_globals->_player.fixPriority(-1); + g_globals->_player.setStrip2(-1); + if (g_globals->getFlag(78)) { + g_globals->_player.enableControl(); } else { _sceneMode = 7711; setAction(&_sequenceManager, this, 7711, NULL); } break; case 7702: - _soundHandler.fadeOut(0); - _globals->_sceneManager.changeScene(7600); + g_globals->_soundHandler.fadeOut(NULL); + g_globals->_sceneManager.changeScene(7600); break; case 7703: case 7706: case 7707: case 7711: case 7712: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 7704: - _globals->_soundHandler.play(256); + g_globals->_soundHandler.play(256); _prof.setStrip2(4); _prof.setFrame2(1); _prof.setPosition(Common::Point(159, 87)); - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 7705: RING_INVENTORY._key._sceneNumber = 1; - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 7708: RING_INVENTORY._paper._sceneNumber = 1; - _globals->_player.enableControl(); + g_globals->_player.enableControl(); break; case 7709: - _globals->_events.setCursor(CURSOR_USE); + g_globals->_events.setCursor(CURSOR_USE); break; case 7710: - _globals->_player.enableControl(); + g_globals->_player.enableControl(); SceneItem::display2(7700, 62); break; case 7713: @@ -2267,23 +2269,23 @@ void Scene7700::signal() { void Scene7700::process(Event &event) { Scene::process(event); - if (contains<SceneItem *>(_globals->_sceneItems, &_sceneItem10)) { + if (contains<SceneItem *>(g_globals->_sceneItems, &_sceneItem10)) { if (_gfxButton.process(event)) { _sceneItem10.remove(); _object15.remove(); _object9.remove(); - if (_globals->_sceneObjects->contains(&_object10)) + if (g_globals->_sceneObjects->contains(&_object10)) _object10.remove(); - if (_globals->_sceneObjects->contains(&_object14)) + if (g_globals->_sceneObjects->contains(&_object14)) _object14.remove(); _object19.remove(); _gfxButton._bounds.expandPanes(); - _globals->_player._canWalk = true; + g_globals->_player._canWalk = true; } } if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_p)) { event.handled = true; - if (!_globals->_sceneObjects->contains(&_easterEgg1)) { + if (!g_globals->_sceneObjects->contains(&_easterEgg1)) { _easterEgg1.postInit(); _easterEgg1.setVisage(7708); _easterEgg1.setPosition(Common::Point(163, 50)); @@ -2295,15 +2297,15 @@ void Scene7700::process(Event &event) { } void Scene7700::dispatch() { - if ((_globals->_sceneRegions.indexOf(_globals->_player._position) == 6) || (_globals->_player._position.x < 10)) - _globals->_player.changeZoom(100 - ((_globals->_player._position.y - 68) / 2)); + if ((g_globals->_sceneRegions.indexOf(g_globals->_player._position) == 6) || (g_globals->_player._position.x < 10)) + g_globals->_player.changeZoom(100 - ((g_globals->_player._position.y - 68) / 2)); else - _globals->_player.changeZoom(-1); + g_globals->_player.changeZoom(-1); - if ((_action == 0) && (_globals->_sceneRegions.indexOf(_globals->_player._position) == 30)) { - _globals->_player.disableControl(); + if ((_action == 0) && (g_globals->_sceneRegions.indexOf(g_globals->_player._position) == 30)) { + g_globals->_player.disableControl(); _sceneMode = 7702; - setAction(&_sequenceManager, this, 7702, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 7702, &g_globals->_player, NULL); } Scene::dispatch(); } @@ -2312,33 +2314,33 @@ void Scene7700::postInit(SceneObjectList *OwnerList) { loadScene(7700); Scene::postInit(); setZoomPercents(100, 80, 200, 100); - _globals->setFlag(53); + g_globals->setFlag(53); _field97B = 0; _field979 = 0; _field977 = 0; _stripManager.addSpeaker(&_speakerEText); _stripManager.addSpeaker(&_speakerQText); - _speakerQText._npc = &_globals->_player; + _speakerQText._npc = &g_globals->_player; _speakerEText._npc = &_prof; - _globals->_player.postInit(); - _globals->_player.setVisage(4201); - _globals->_player.animate(ANIM_MODE_1, NULL); + g_globals->_player.postInit(); + g_globals->_player.setVisage(4201); + g_globals->_player.animate(ANIM_MODE_1, NULL); SceneObjectWrapper *wrapper = new SceneObjectWrapper(); - _globals->_player.setObjectWrapper(wrapper); - _globals->_player.setPosition(Common::Point(-19, 68)); - _globals->_player.setStrip2(7); - _globals->_player.fixPriority(95); - _globals->_player.changeZoom(80); - _globals->_player._moveDiff.x = 6; - _globals->_player._moveDiff.y = 3; - _globals->_player.disableControl(); + g_globals->_player.setObjectWrapper(wrapper); + g_globals->_player.setPosition(Common::Point(-19, 68)); + g_globals->_player.setStrip2(7); + g_globals->_player.fixPriority(95); + g_globals->_player.changeZoom(80); + g_globals->_player._moveDiff.x = 6; + g_globals->_player._moveDiff.y = 3; + g_globals->_player.disableControl(); _prof.postInit(); _prof.setVisage(7706); - if (_globals->getFlag(78)) { + if (g_globals->getFlag(78)) { _prof.setStrip2(4); _prof.fixPriority(80); _prof.setPosition(Common::Point(159, 87)); @@ -2412,7 +2414,7 @@ void Scene7700::postInit(SceneObjectList *OwnerList) { _cork.setVisage(7703); _cork.setPosition(Common::Point(32, 128)); - if (_globals->getFlag(49)) + if (g_globals->getFlag(49)) _cork.setFrame(_cork.getFrameCount()); if (RING_INVENTORY._emptyJar._sceneNumber == 7700) { @@ -2420,7 +2422,7 @@ void Scene7700::postInit(SceneObjectList *OwnerList) { _emptyJar.setVisage(7700); _emptyJar.setStrip(8); _emptyJar.setPosition(Common::Point(189, 48)); - _globals->_sceneItems.addItems(&_emptyJar, NULL); + g_globals->_sceneItems.addItems(&_emptyJar, NULL); } _sceneHotspot1._sceneRegionId = 28; _sceneHotspot2._sceneRegionId = 6; @@ -2511,16 +2513,16 @@ void Scene7700::postInit(SceneObjectList *OwnerList) { _sceneHotspot36._useLineNum = 39; _sceneHotspot36._lookLineNum = 42; - _globals->_sceneItems.addItems(&_prof, &_sceneHotspot35, &_object8, &_sceneHotspot34, &_sceneHotspot33, &_sceneHotspot32, NULL); - _globals->_sceneItems.addItems(&_sceneHotspot31, &_sceneHotspot30, &_sceneHotspot29, &_sceneHotspot5, &_sceneHotspot28, &_sceneHotspot27, NULL); - _globals->_sceneItems.addItems(&_sceneHotspot26, &_sceneHotspot25, &_sceneHotspot24, &_sceneHotspot23, &_sceneHotspot22, &_sceneHotspot21, NULL); - _globals->_sceneItems.addItems(&_sceneHotspot20, &_sceneHotspot19, &_sceneHotspot18, &_sceneHotspot17, &_sceneHotspot4, &_sceneHotspot3, NULL); - _globals->_sceneItems.addItems(&_sceneHotspot16, &_sceneHotspot15, &_sceneHotspot2, &_sceneHotspot14, &_cork, &_sceneHotspot1, NULL); - _globals->_sceneItems.addItems(&_sceneHotspot13, &_sceneHotspot12, &_sceneHotspot11, &_object2, &_object1, &_object3, NULL); - _globals->_sceneItems.addItems(&_object6, &_object5, &_object4, &_sceneHotspot6, &_sceneHotspot36, &_sceneItem7, NULL); + g_globals->_sceneItems.addItems(&_prof, &_sceneHotspot35, &_object8, &_sceneHotspot34, &_sceneHotspot33, &_sceneHotspot32, NULL); + g_globals->_sceneItems.addItems(&_sceneHotspot31, &_sceneHotspot30, &_sceneHotspot29, &_sceneHotspot5, &_sceneHotspot28, &_sceneHotspot27, NULL); + g_globals->_sceneItems.addItems(&_sceneHotspot26, &_sceneHotspot25, &_sceneHotspot24, &_sceneHotspot23, &_sceneHotspot22, &_sceneHotspot21, NULL); + g_globals->_sceneItems.addItems(&_sceneHotspot20, &_sceneHotspot19, &_sceneHotspot18, &_sceneHotspot17, &_sceneHotspot4, &_sceneHotspot3, NULL); + g_globals->_sceneItems.addItems(&_sceneHotspot16, &_sceneHotspot15, &_sceneHotspot2, &_sceneHotspot14, &_cork, &_sceneHotspot1, NULL); + g_globals->_sceneItems.addItems(&_sceneHotspot13, &_sceneHotspot12, &_sceneHotspot11, &_object2, &_object1, &_object3, NULL); + g_globals->_sceneItems.addItems(&_object6, &_object5, &_object4, &_sceneHotspot6, &_sceneHotspot36, &_sceneItem7, NULL); _sceneMode = 7701; - setAction(&_sequenceManager, this, 7701, &_globals->_player, NULL); + setAction(&_sequenceManager, this, 7701, &g_globals->_player, NULL); _soundHandler.play(256); } @@ -2542,4 +2544,6 @@ void Scene7700::synchronize(Serializer &s) { } } -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld_scenes8.h b/engines/tsage/ringworld/ringworld_scenes8.h index fe9560d9d8..84178c36f9 100644 --- a/engines/tsage/ringworld_scenes8.h +++ b/engines/tsage/ringworld/ringworld_scenes8.h @@ -24,13 +24,18 @@ #define TSAGE_RINGWORLD_SCENES8_H #include "common/scummsys.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" +#include "tsage/ringworld/ringworld_speakers.h" #include "tsage/events.h" #include "tsage/core.h" #include "tsage/scenes.h" #include "tsage/globals.h" -namespace tSage { +namespace TsAGE { + +namespace Ringworld { + +using namespace TsAGE; class NamedHotspotMult : public SceneHotspot { public: @@ -485,6 +490,8 @@ public: virtual void synchronize(Serializer &s); }; -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_speakers.cpp index 58501172af..dc80df40a3 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld/ringworld_speakers.cpp @@ -20,313 +20,15 @@ * */ -#include "common/config-manager.h" -#include "common/translation.h" -#include "gui/saveload.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_speakers.h" #include "tsage/scenes.h" #include "tsage/tsage.h" +#include "tsage/graphics.h" #include "tsage/staticres.h" -#include "tsage/ringworld_demo.h" -#include "tsage/ringworld_scenes1.h" -#include "tsage/ringworld_scenes2.h" -#include "tsage/ringworld_scenes3.h" -#include "tsage/ringworld_scenes4.h" -#include "tsage/ringworld_scenes5.h" -#include "tsage/ringworld_scenes6.h" -#include "tsage/ringworld_scenes8.h" -#include "tsage/ringworld_scenes10.h" - -namespace tSage { - -Scene *RingworldGame::createScene(int sceneNumber) { - switch (sceneNumber) { - /* Scene group 1 */ - // Kziniti Palace (Introduction) - case 10: return new Scene10(); - // Outer Space (Introduction) - case 15: return new Scene15(); - // Cut-scenes for Ch'mee house in distance - case 20: return new Scene20(); - // Outside Ch'mee residence - case 30: return new Scene30(); - // Chmeee Home - case 40: return new Scene40(); - // By Flycycles - case 50: return new Scene50(); - // Flycycle controls - case 60: return new Scene60(); - // Shipyard Entrance - case 90: return new Scene90(); - // Ship Close-up - case 95: return new Scene95(); - // Sunflower navigation sequence - case 6100: return new Scene6100(); - - /* Scene group 2 */ - // Title screen - case 1000: return new Scene1000(); - // Fleeing planet cutscene - case 1001: return new Scene1001(); - // Unused - case 1250: return new Scene1250(); - // Ringworld Wall - case 1400: return new Scene1400(); - // Ringworld Space-port - case 1500: return new Scene1500(); - - /* Scene group 3 - Part #1 */ - // Cockpit cutscenes - case 2000: return new Scene2000(); - // Starcraft - Cockpit - case 2100: return new Scene2100(); - // Encyclopedia - case 2120: return new Scene2120(); - // Starcraft - Level 2 - case 2150: return new Scene2150(); - // Starcraft - AutoDoc - case 2200: return new Scene2200(); - // Stasis Field Map - case 2222: return new Scene2222(); - // Starcraft - Quinn's Room - case 2230: return new Scene2230(); - - /* Scene group 3 - Part #2 */ - // Starcraft - Storage Room - case 2280: return new Scene2280(); - // Starcraft - Hanger Bay - case 2300: return new Scene2300(); - // Starcraft - Copy Protection Screen - case 2310: return new Scene2310(); - // Starcraft - Lander Bay - case 2320: return new Scene2320(); - // Scene 2400 - Descending in Lander - case 2400: return new Scene2400(); - - /* Scene group 4 */ - // Ringworld Scan - case 3500: return new Scene3500(); - // Remote Viewer - case 3700: return new Scene3700(); - - /* Scene group 5 */ - // Village - case 4000: return new Scene4000(); - // Village - Outside Lander - case 4010: return new Scene4010(); - // Village - Puzzle Board - case 4025: return new Scene4025(); - // Village - Temple Antechamber - case 4045: return new Scene4045(); - // Village - Temple - case 4050: return new Scene4050(); - // Village - Hut - case 4100: return new Scene4100(); - // Village - Bedroom - case 4150: return new Scene4150(); - // Village - Near Slaver Ship - case 4250: return new Scene4250(); - // Village - Slaver Ship - case 4300: return new Scene4300(); - // Village - Slaver Ship Keypad - case 4301: return new Scene4301(); - - /* Scene group 6 */ - // Caverns - Entrance - case 5000: return new Scene5000(); - // Caverns - case 5100: return new Scene5100(); - // Caverns - Throne-room - case 5200: return new Scene5200(); - // Caverns - Pit - case 5300: return new Scene5300(); - - /* Scene group 8 */ - // Landing near beach - case 7000: return new Scene7000(); - // Underwater: swimming - case 7100: return new Scene7100(); - // Underwater: Entering the cave - case 7200: return new Scene7200(); - // Underwater: Lord Poria - case 7300: return new Scene7300(); - // Floating Buildings: Outside - case 7600: return new Scene7600(); - // Floating Buildings: In the lab - case 7700: return new Scene7700(); - - /* Scene group 10 */ - // Near beach: Slave washing clothes - case 9100: return new Scene9100(); - // Castle: Outside the bulwarks - case 9150: return new Scene9150(); - // Castle: Near the fountain - case 9200: return new Scene9200(); - // Castle: In front of a large guarded door - case 9300: return new Scene9300(); - // Castle: In a hallway - case 9350: return new Scene9350(); - // Castle: In a hallway - case 9360: return new Scene9360(); - // Castle: Black-Smith room - case 9400: return new Scene9400(); - // Castle: Dining room - case 9450: return new Scene9450(); - // Castle: Bedroom - case 9500: return new Scene9500(); - // Castle: Balcony - case 9700: return new Scene9700(); - // Castle: In the garden - case 9750: return new Scene9750(); - // Castle: Dressing room - case 9850: return new Scene9850(); - // Ending - case 9900: return new Scene9900(); - // Space travel - case 9999: return new Scene9999(); - default: - error("Unknown scene number - %d", sceneNumber); - break; - } -} - -/*--------------------------------------------------------------------------*/ - -DisplayHotspot::DisplayHotspot(int regionId, ...) { - _sceneRegionId = regionId; - - // Load up the actions - va_list va; - va_start(va, regionId); - - int param = va_arg(va, int); - while (param != LIST_END) { - _actions.push_back(param); - param = va_arg(va, int); - } - - va_end(va); -} - -bool DisplayHotspot::performAction(int action) { - for (uint i = 0; i < _actions.size(); i += 3) { - if (_actions[i] == action) { - display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - return true; - } - } - - return false; -} - -/*--------------------------------------------------------------------------*/ - -DisplayObject::DisplayObject(int firstAction, ...) { - // Load up the actions - va_list va; - va_start(va, firstAction); - - int param = firstAction; - while (param != LIST_END) { - _actions.push_back(param); - param = va_arg(va, int); - } - - va_end(va); -} - -bool DisplayObject::performAction(int action) { - for (uint i = 0; i < _actions.size(); i += 3) { - if (_actions[i] == action) { - display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - return true; - } - } - - return false; -} - -/*--------------------------------------------------------------------------*/ - -SceneArea::SceneArea() { - _savedArea = NULL; - _pt.x = _pt.y = 0; -} - -SceneArea::~SceneArea() { - delete _savedArea; -} - -void SceneArea::setup(int resNum, int rlbNum, int subNum, int actionId) { - _resNum = resNum; - _rlbNum = rlbNum; - _subNum = subNum; - _actionId = actionId; - - _surface = surfaceFromRes(resNum, rlbNum, subNum); -} - -void SceneArea::draw2() { - _surface.draw(Common::Point(_bounds.left, _bounds.top)); -} - -void SceneArea::display() { - _bounds.left = _pt.x - (_surface.getBounds().width() / 2); - _bounds.top = _pt.y + 1 - _surface.getBounds().height(); - _bounds.setWidth(_surface.getBounds().width()); - _bounds.setHeight(_surface.getBounds().height()); - - _savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), _bounds); - draw2(); -} - -void SceneArea::restore() { - assert(_savedArea); - _savedArea->draw(Common::Point(_bounds.left, _bounds.top)); - delete _savedArea; - _savedArea = NULL; -} - -void SceneArea::draw(bool flag) { - _surface = surfaceFromRes(_resNum, _rlbNum, flag ? _subNum + 1 : _subNum); - _surface.draw(Common::Point(_bounds.left, _bounds.top)); -} - -void SceneArea::wait() { - // Wait until a mouse or keypress - Event event; - while (!_vm->getEventManager()->shouldQuit() && !_globals->_events.getEvent(event)) { - g_system->updateScreen(); - g_system->delayMillis(10); - } +namespace TsAGE { - SynchronizedList<SceneItem *>::iterator ii; - for (ii = _globals->_sceneItems.begin(); ii != _globals->_sceneItems.end(); ++ii) { - SceneItem *sceneItem = *ii; - if (sceneItem->contains(event.mousePos)) { - sceneItem->doAction(_actionId); - break; - } - } - - _globals->_events.setCursor(CURSOR_ARROW); -} - -void SceneArea::synchronize(Serializer &s) { - if (s.getVersion() >= 2) - SavedObject::synchronize(s); - - s.syncAsSint16LE(_pt.x); - s.syncAsSint16LE(_pt.y); - s.syncAsSint32LE(_resNum); - s.syncAsSint32LE(_rlbNum); - s.syncAsSint32LE(_subNum); - s.syncAsSint32LE(_actionId); - _bounds.synchronize(s); -} - -/*--------------------------------------------------------------------------*/ +namespace Ringworld { SpeakerGText::SpeakerGText() { _speakerName = "GTEXT"; @@ -349,7 +51,7 @@ void SpeakerGText::setText(const Common::String &msg) { // Set the text Rect textRect; - _globals->gfxManager()._font.getStringBounds(msg.c_str(), textRect, _textWidth); + g_globals->gfxManager()._font.getStringBounds(msg.c_str(), textRect, _textWidth); textRect.center(_sceneObject._position.x, _sceneObject._position.y); _textPos.x = textRect.left; Speaker::setText(msg); @@ -372,13 +74,13 @@ SpeakerPOR::SpeakerPOR() { void SpeakerPOR::SpeakerAction1::signal(){ switch (_actionIndex++) { case 0: - setDelay(_globals->_randomSource.getRandomNumber(60) + 60); + setDelay(g_globals->_randomSource.getRandomNumber(60) + 60); break; case 1: static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_5, this, NULL); break; case 2: - setDelay(_globals->_randomSource.getRandomNumber(10)); + setDelay(g_globals->_randomSource.getRandomNumber(10)); _actionIndex = 0; break; default: @@ -1198,293 +900,6 @@ void SpeakerBatR::setText(const Common::String &msg) { Speaker::setText(msg); } -/*--------------------------------------------------------------------------*/ - -RingworldInvObjectList::RingworldInvObjectList() : - _stunner(2280, 1, 2, OBJECT_STUNNER, "This is your stunner."), - _scanner(1, 1, 3, OBJECT_SCANNER, "A combination scanner comm unit."), - _stasisBox(5200, 1, 4, OBJECT_STASIS_BOX, "A stasis box."), - _infoDisk(40, 1, 1, OBJECT_INFODISK, "The infodisk you took from the assassin."), - _stasisNegator(0, 2, 2, OBJECT_STASIS_NEGATOR, "The stasis field negator."), - _keyDevice(4250, 1, 6, OBJECT_KEY_DEVICE, "A magnetic key device."), - _medkit(2280, 1, 7, OBJECT_MEDKIT, "Your medkit."), - _ladder(4100, 1, 8, OBJECT_LADDER, "The chief's ladder."), - _rope(4150, 1, 9, OBJECT_ROPE, "The chief's rope."), - _key(7700, 1, 11, OBJECT_KEY, "A key."), - _translator(7700, 1, 13, OBJECT_TRANSLATOR, "The dolphin translator box."), - _ale(2150, 1, 10, OBJECT_ALE, "A bottle of ale."), - _paper(7700, 1, 12, OBJECT_PAPER, "A slip of paper with the numbers 2,4, and 3 written on it."), - _waldos(0, 1, 14, OBJECT_WALDOS, "A pair of waldos from the ruined probe."), - _stasisBox2(8100, 1, 4, OBJECT_STASIS_BOX2, "A stasis box."), - _ring(8100, 2, 5, OBJECT_RING, "This is a signet ring sent to you by Louis Wu."), - _cloak(9850, 2, 6, OBJECT_CLOAK, "A fine silk cloak."), - _tunic(9450, 2, 7, OBJECT_TUNIC, "The patriarch's soiled tunic."), - _candle(9500, 2, 8, OBJECT_CANDLE, "A tallow candle."), - _straw(9400, 2, 9, OBJECT_STRAW, "Clean, dry straw."), - _scimitar(9850, 1, 18, OBJECT_SCIMITAR, "A scimitar from the Patriarch's closet."), - _sword(9850, 1, 17, OBJECT_SWORD, "A short sword from the Patriarch's closet."), - _helmet(9500, 2, 4, OBJECT_HELMET, "Some type of helmet."), - _items(4300, 2, 10, OBJECT_ITEMS, "Two interesting items from the Tnuctipun vessel."), - _concentrator(4300, 2, 11, OBJECT_CONCENTRATOR, "The Tnuctipun anti-matter concentrator contained in a stasis field."), - _nullifier(5200, 2, 12, OBJECT_NULLIFIER, "A purported neural wave nullifier."), - _peg(4045, 2, 16, OBJECT_PEG, "A peg with a symbol."), - _vial(5100, 2, 17, OBJECT_VIAL, "A vial of the bat creatures anti-pheromone drug."), - _jacket(9850, 3, 1, OBJECT_JACKET, "A natty padded jacket."), - _tunic2(9850, 3, 2, OBJECT_TUNIC2, "A very hairy tunic."), - _bone(5300, 3, 5, OBJECT_BONE, "A very sharp bone."), - _jar(7700, 3, 4, OBJECT_JAR, "An jar filled with a green substance."), - _emptyJar(7700, 3, 3, OBJECT_EMPTY_JAR, "An empty jar.") { - - // Add the items to the list - _itemList.push_back(&_stunner); - _itemList.push_back(&_scanner); - _itemList.push_back(&_stasisBox); - _itemList.push_back(&_infoDisk); - _itemList.push_back(&_stasisNegator); - _itemList.push_back(&_keyDevice); - _itemList.push_back(&_medkit); - _itemList.push_back(&_ladder); - _itemList.push_back(&_rope); - _itemList.push_back(&_key); - _itemList.push_back(&_translator); - _itemList.push_back(&_ale); - _itemList.push_back(&_paper); - _itemList.push_back(&_waldos); - _itemList.push_back(&_stasisBox2); - _itemList.push_back(&_ring); - _itemList.push_back(&_cloak); - _itemList.push_back(&_tunic); - _itemList.push_back(&_candle); - _itemList.push_back(&_straw); - _itemList.push_back(&_scimitar); - _itemList.push_back(&_sword); - _itemList.push_back(&_helmet); - _itemList.push_back(&_items); - _itemList.push_back(&_concentrator); - _itemList.push_back(&_nullifier); - _itemList.push_back(&_peg); - _itemList.push_back(&_vial); - _itemList.push_back(&_jacket); - _itemList.push_back(&_tunic2); - _itemList.push_back(&_bone); - _itemList.push_back(&_jar); - _itemList.push_back(&_emptyJar); - - _selectedItem = NULL; -} - -/*--------------------------------------------------------------------------*/ - -void RingworldGame::restartGame() { - if (MessageDialog::show(RESTART_MSG, CANCEL_BTN_STRING, RESTART_BTN_STRING) == 1) - _globals->_game->restart(); -} - -void RingworldGame::saveGame() { - if (!_vm->canSaveGameStateCurrently()) - MessageDialog::show(SAVING_NOT_ALLOWED_MSG, OK_BTN_STRING); - else { - // Show the save dialog - handleSaveLoad(true, _globals->_sceneHandler._saveGameSlot, _globals->_sceneHandler._saveName); - } -} - -void RingworldGame::restoreGame() { - if (!_vm->canLoadGameStateCurrently()) - MessageDialog::show(RESTORING_NOT_ALLOWED_MSG, OK_BTN_STRING); - else { - // Show the load dialog - handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName); - } -} - -void RingworldGame::quitGame() { - if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) - _vm->quitGame(); -} - -void RingworldGame::handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) { - const EnginePlugin *plugin = 0; - EngineMan.findGame(_vm->getGameId(), &plugin); - GUI::SaveLoadChooser *dialog; - if (saveFlag) - dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save")); - else - dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load")); - - dialog->setSaveMode(saveFlag); - - saveSlot = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); - saveName = dialog->getResultString(); - - delete dialog; -} - -void RingworldGame::start() { - // Set some default flags - _globals->setFlag(12); - _globals->setFlag(34); - - // Set the screen to scroll in response to the player moving off-screen - _globals->_scrollFollower = &_globals->_player; - - // Set the object's that will be in the player's inventory by default - RING_INVENTORY._stunner._sceneNumber = 1; - RING_INVENTORY._scanner._sceneNumber = 1; - RING_INVENTORY._ring._sceneNumber = 1; - - int slot = -1; - - if (ConfMan.hasKey("save_slot")) { - slot = ConfMan.getInt("save_slot"); - Common::String file = _vm->generateSaveName(slot); - Common::InSaveFile *in = _vm->_system->getSavefileManager()->openForLoading(file); - if (in) - delete in; - else - slot = -1; - } - - if (slot >= 0) - _globals->_sceneHandler._loadGameSlot = slot; - else - // Switch to the title screen - _globals->_sceneManager.setNewScene(1000); - - _globals->_events.showCursor(); -} - -void RingworldGame::restart() { - _globals->_scenePalette.clearListeners(); - _globals->_soundHandler.stop(); - - // Reset the flags - _globals->reset(); - _globals->setFlag(34); - - // Clear save/load slots - _globals->_sceneHandler._saveGameSlot = -1; - _globals->_sceneHandler._loadGameSlot = -1; - - _globals->_stripNum = 0; - _globals->_events.setCursor(CURSOR_WALK); - - // Reset item properties - RING_INVENTORY._stunner._sceneNumber = 1; - RING_INVENTORY._scanner._sceneNumber = 1; - RING_INVENTORY._stasisBox._sceneNumber = 5200; - RING_INVENTORY._infoDisk._sceneNumber = 40; - RING_INVENTORY._stasisNegator._sceneNumber = 0; - RING_INVENTORY._keyDevice._sceneNumber = 0; - RING_INVENTORY._medkit._sceneNumber = 2280; - RING_INVENTORY._ladder._sceneNumber = 4100; - RING_INVENTORY._rope._sceneNumber = 4150; - RING_INVENTORY._key._sceneNumber = 7700; - RING_INVENTORY._translator._sceneNumber = 2150; - RING_INVENTORY._paper._sceneNumber = 7700; - RING_INVENTORY._waldos._sceneNumber = 0; - RING_INVENTORY._ring._sceneNumber = 1; - RING_INVENTORY._stasisBox2._sceneNumber = 8100; - RING_INVENTORY._cloak._sceneNumber = 9850; - RING_INVENTORY._tunic._sceneNumber = 9450; - RING_INVENTORY._candle._sceneNumber = 9500; - RING_INVENTORY._straw._sceneNumber = 9400; - RING_INVENTORY._scimitar._sceneNumber = 9850; - RING_INVENTORY._sword._sceneNumber = 9850; - RING_INVENTORY._helmet._sceneNumber = 9500; - RING_INVENTORY._items._sceneNumber = 4300; - RING_INVENTORY._concentrator._sceneNumber = 4300; - RING_INVENTORY._nullifier._sceneNumber = 4300; - RING_INVENTORY._peg._sceneNumber = 4045; - RING_INVENTORY._vial._sceneNumber = 5100; - RING_INVENTORY._jacket._sceneNumber = 9850; - RING_INVENTORY._tunic2._sceneNumber = 9850; - RING_INVENTORY._bone._sceneNumber = 5300; - RING_INVENTORY._jar._sceneNumber = 7700; - RING_INVENTORY._emptyJar._sceneNumber = 7700; - RING_INVENTORY._selectedItem = NULL; - - // Change to the first game scene - _globals->_sceneManager.changeScene(30); -} - -void RingworldGame::endGame(int resNum, int lineNum) { - _globals->_events.setCursor(CURSOR_WALK); - Common::String msg = _resourceManager->getMessage(resNum, lineNum); - bool savesExist = _saver->savegamesExist(); - - if (!savesExist) { - // No savegames exist, so prompt the user to restart or quit - if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0) - _vm->quitGame(); - else - restart(); - } else { - // Savegames exist, so prompt for Restore/Restart - bool breakFlag; - do { - if (_vm->shouldQuit()) { - breakFlag = true; - } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) { - restart(); - breakFlag = true; - } else { - handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName); - breakFlag = _globals->_sceneHandler._loadGameSlot >= 0; - } - } while (!breakFlag); - } - - _globals->_events.setCursorFromFlag(); -} - -void RingworldGame::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 - ConfigDialog *dlg = new ConfigDialog(); - dlg->runModal(); - delete dlg; - _globals->_soundManager.syncSounds(); - _globals->_events.setCursorFromFlag(); - break; - } - - case Common::KEYCODE_F3: - // F3 - Quit - quitGame(); - event.handled = false; - break; - - case Common::KEYCODE_F4: - // F4 - Restart - restartGame(); - _globals->_events.setCursorFromFlag(); - break; - - case Common::KEYCODE_F7: - // F7 - Restore - restoreGame(); - _globals->_events.setCursorFromFlag(); - break; - - case Common::KEYCODE_F10: - // F10 - Pause - GfxDialog::setPalette(); - MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING); - _globals->_events.setCursorFromFlag(); - break; - - default: - break; - } - } -} +} // End of namespace Ringworld -} // End of namespace tSage +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld_logic.h b/engines/tsage/ringworld/ringworld_speakers.h index 19b0f10b42..305984a184 100644 --- a/engines/tsage/ringworld_logic.h +++ b/engines/tsage/ringworld/ringworld_speakers.h @@ -20,87 +20,22 @@ * */ -#ifndef TSAGE_RINGWORLD_LOGIC_H -#define TSAGE_RINGWORLD_LOGIC_H +#ifndef TSAGE_RINGWORLD_SPEAKERS_H +#define TSAGE_RINGWORLD_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/ringworld/ringworld_logic.h" -namespace tSage { +namespace TsAGE { -#define ADD_PLAYER_MOVER(X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ - _globals->_player.addMover(mover, &pt, this); } -#define ADD_PLAYER_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ - OBJ.addMover(mover, &pt, NULL); } -#define ADD_PLAYER_MOVER_THIS(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \ - OBJ.addMover(mover, &pt, this); } +namespace Ringworld { -#define ADD_MOVER(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \ - OBJ.addMover(mover, &pt, this); } -#define ADD_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \ - OBJ.addMover(mover, &pt, NULL); } - - -class SceneFactory { -public: - static Scene *createScene(int sceneNumber); -}; - -class DisplayHotspot : public SceneObject { -private: - Common::Array<int> _actions; - bool performAction(int action); -public: - DisplayHotspot(int regionId, ...); - - virtual void doAction(int action) { - if (!performAction(action)) - SceneHotspot::doAction(action); - } -}; - -class DisplayObject : public SceneObject { -private: - Common::Array<int> _actions; - bool performAction(int action); -public: - DisplayObject(int firstAction, ...); - - virtual void doAction(int action) { - if (!performAction(action)) - SceneHotspot::doAction(action); - } -}; - -class SceneArea : public SavedObject { -public: - GfxSurface _surface; - GfxSurface *_savedArea; - Common::Point _pt; - int _resNum; - int _rlbNum; - int _subNum; - int _actionId; - Rect _bounds; -public: - SceneArea(); - ~SceneArea(); - - void setup(int resNum, int rlbNum, int subNum, int actionId); - void draw2(); - void display(); - void restore(); - - virtual void synchronize(Serializer &s); - virtual void draw(bool flag); - virtual void wait(); -}; - -/*--------------------------------------------------------------------------*/ -// Ringworld specific game speakers +using namespace TsAGE; class SpeakerGText : public Speaker { public: @@ -395,67 +330,8 @@ public: virtual void setText(const Common::String &msg); }; -/*--------------------------------------------------------------------------*/ - -class RingworldInvObjectList : public InvObjectList { -public: - InvObject _stunner; - InvObject _scanner; - InvObject _stasisBox; - InvObject _infoDisk; - InvObject _stasisNegator; - InvObject _keyDevice; - InvObject _medkit; - InvObject _ladder; - InvObject _rope; - InvObject _key; - InvObject _translator; - InvObject _ale; - InvObject _paper; - InvObject _waldos; - InvObject _stasisBox2; - InvObject _ring; - InvObject _cloak; - InvObject _tunic; - InvObject _candle; - InvObject _straw; - InvObject _scimitar; - InvObject _sword; - InvObject _helmet; - InvObject _items; - InvObject _concentrator; - InvObject _nullifier; - InvObject _peg; - InvObject _vial; - InvObject _jacket; - InvObject _tunic2; - InvObject _bone; - InvObject _jar; - InvObject _emptyJar; -public: - RingworldInvObjectList(); - - virtual Common::String getClassName() { return "RingworldInvObjectList"; } -}; - -#define RING_INVENTORY (*((RingworldInvObjectList *)_globals->_inventory)) - -class RingworldGame: public Game { -protected: - virtual void handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName); -public: - virtual void start(); - virtual void restart(); - virtual void restartGame(); - virtual void saveGame(); - virtual void restoreGame(); - virtual void quitGame(); - virtual void endGame(int resNum, int lineNum); - - virtual Scene *createScene(int sceneNumber); - virtual void processEvent(Event &event); -}; - -} // End of namespace tSage +} // End of namespace Ringworld + +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.cpp b/engines/tsage/ringworld2/ringworld2_dialogs.cpp new file mode 100644 index 0000000000..8d4863f332 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_dialogs.cpp @@ -0,0 +1,193 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/translation.h" + +#include "gui/dialog.h" +#include "gui/widget.h" + +#include "tsage/tsage.h" +#include "tsage/core.h" +#include "tsage/dialogs.h" +#include "tsage/staticres.h" +#include "tsage/globals.h" +#include "tsage/ringworld2/ringworld2_dialogs.h" + +namespace TsAGE { + +namespace Ringworld2 { + +/** + * This dialog implements the right-click dialog + */ +RightClickDialog::RightClickDialog() : GfxDialog() { + // Setup button positions + _btnList[0] = Common::Point(48, 12); + _btnList[1] = Common::Point(31, 29); + _btnList[2] = Common::Point(65, 29); + _btnList[3] = Common::Point(14, 47); + _btnList[4] = Common::Point(48, 47); + _btnList[5] = Common::Point(83, 47); + + // Set the palette and change the cursor + BF_GLOBALS._events.setCursor(CURSOR_ARROW); + + setPalette(); + + // Get the dialog image and selected button images + if (R2_GLOBALS._sceneManager._sceneNumber == 2900) { + _surface = surfaceFromRes(2902, 1, 1); + _btnImages.setVisage(2902, 2); + } else { + _surface = surfaceFromRes(1, 1, 1); + _btnImages.setVisage(1, 2); + } + + // Set the dialog position + Rect dialogRect; + dialogRect.resize(_surface, 0, 0, 100); + dialogRect.center(g_globals->_events._mousePos.x, g_globals->_events._mousePos.y); + + // Ensure the dialog will be entirely on-screen + Rect screenRect = g_globals->gfxManager()._bounds; + screenRect.collapse(4, 4); + dialogRect.contain(screenRect); + + _bounds = dialogRect; + _gfxManager._bounds = _bounds; + + _highlightedAction = -1; + _selectedAction = -1; +} + +RightClickDialog::~RightClickDialog() { +} + +void RightClickDialog::draw() { + // Save the covered background area + _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + + // Draw the dialog image + g_globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top); +} + +bool RightClickDialog::process(Event &event) { + switch (event.eventType) { + case EVENT_MOUSE_MOVE: { + // Check whether a button is highlighted + int buttonIndex; + for (buttonIndex = 6; buttonIndex >= 0; --buttonIndex) { + Rect tempRect(0, 0, 28, 29); + tempRect.moveTo(_btnList[buttonIndex].x, _btnList[buttonIndex].y); + + if (tempRect.contains(event.mousePos)) + break; + } + // If selection has changed, handle it + if (buttonIndex != _highlightedAction) { + if (_highlightedAction != -1) { + // Another button was previously selected, so restore dialog + _gfxManager.copyFrom(_surface, 0, 0); + } + + if (buttonIndex != -1) { + // Draw newly selected button + GfxSurface btn = _btnImages.getFrame(buttonIndex + 1); + _gfxManager.copyFrom(btn, _btnList[buttonIndex].x, _btnList[buttonIndex].y); + } + + _highlightedAction = buttonIndex; + } + + event.handled = true; + return true; + } + + case EVENT_BUTTON_DOWN: + // Specify the selected action + _selectedAction = (_highlightedAction == -1) ? 999 : _highlightedAction; + event.handled = true; + return true; + + default: + break; + } + + return false; +} + +void RightClickDialog::execute() { + // Draw the dialog + draw(); + + // Dialog event handler loop + _gfxManager.activate(); + + while (!g_vm->shouldQuit() && (_selectedAction == -1)) { + Event evt; + while (g_globals->_events.getEvent(evt, EVENT_MOUSE_MOVE | EVENT_BUTTON_DOWN)) { + evt.mousePos.x -= _bounds.left; + evt.mousePos.y -= _bounds.top; + + process(evt); + } + + g_system->delayMillis(10); + g_system->updateScreen(); + } + + // Execute the specified action + CursorType cursorNum = CURSOR_NONE; + switch (_selectedAction) { + case 0: + // Look action + cursorNum = CURSOR_LOOK; + break; + case 1: + // Walk action + cursorNum = CURSOR_WALK; + break; + case 2: + // Use action + cursorNum = CURSOR_USE; + break; + case 3: + // Talk action + cursorNum = CURSOR_TALK; + break; + case 4: + // Change player + break; + case 5: + // Options dialog + break; + } + + if (cursorNum != CURSOR_NONE) + BF_GLOBALS._events.setCursor(cursorNum); + + _gfxManager.deactivate(); +} + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE diff --git a/engines/tsage/blueforce_logic.h b/engines/tsage/ringworld2/ringworld2_dialogs.h index 9237e50a13..bbc35da3ea 100644 --- a/engines/tsage/blueforce_logic.h +++ b/engines/tsage/ringworld2/ringworld2_dialogs.h @@ -20,23 +20,47 @@ * */ -#ifndef TSAGE_BLUEFORCE_LOGIC_H -#define TSAGE_BLUEFORCE_LOGIC_H +#ifndef TSAGE_RINGWORLD2_DIALOGS_H +#define TSAGE_RINGWORLD2_DIALOGS_H -#include "common/scummsys.h" +#include "gui/options.h" +#include "tsage/dialogs.h" #include "tsage/events.h" -#include "tsage/core.h" -#include "tsage/scenes.h" -#include "tsage/globals.h" +#include "tsage/graphics.h" +#include "common/list.h" +#include "common/rect.h" +#include "common/system.h" -namespace tSage { +namespace TsAGE { -class BlueForceGame: public Game { +namespace Ringworld2 { + +using namespace TsAGE; + +class RightClickDialog : public GfxDialog { +private: + GfxSurface _surface; + Visage _btnImages; + Common::Point _btnList[6]; + + Rect _rectList1[5]; + Rect _rectList2[5]; + Rect _rectList3[5]; + Rect _rectList4[5]; + + int _highlightedAction; + int _selectedAction; public: - virtual void start(); - virtual Scene *createScene(int sceneNumber); + RightClickDialog(); + ~RightClickDialog(); + + virtual void draw(); + virtual bool process(Event &event); + void execute(); }; -} // End of namespace tSage +} // End of namespace Ringworld2 + +} // End of namespace TsAGE #endif diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp new file mode 100644 index 0000000000..0bdcf36d0c --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_logic.cpp @@ -0,0 +1,761 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/config-manager.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/ringworld2/ringworld2_logic.h" +#include "tsage/ringworld2/ringworld2_dialogs.h" +#include "tsage/ringworld2/ringworld2_scenes0.h" + +namespace TsAGE { + +namespace Ringworld2 { + +Scene *Ringworld2Game::createScene(int sceneNumber) { + switch (sceneNumber) { + /* Scene group #0 */ + // Quinn's room + case 100: return new Scene100(); + + default: + error("Unknown scene number - %d", sceneNumber); + break; + } +} + +/** + * Returns true if it is currently okay to restore a game + */ +bool Ringworld2Game::canLoadGameStateCurrently() { + return true; +} + +/** + * Returns true if it is currently okay to save the game + */ +bool Ringworld2Game::canSaveGameStateCurrently() { + return true; +} + +/*--------------------------------------------------------------------------*/ + +SceneExt::SceneExt(): Scene() { + _stripManager._onBegin = SceneExt::startStrip; + _stripManager._onEnd = SceneExt::endStrip; + + _field372 = _field37A = 0; + _savedPlayerEnabled = false; + _savedUiEnabled = false; + _savedCanWalk = false; + _focusObject = NULL; +} + +void SceneExt::postInit(SceneObjectList *OwnerList) { + Scene::postInit(OwnerList); + + // Exclude the bottom area of the screen to allow room for the UI + T2_GLOBALS._interfaceY = UI_INTERFACE_Y; +} + +void SceneExt::remove() { +/* + R2_GLOBALS._uiElements.hide(); + R2_GLOBALS._uiElements.resetClear(); + + if (_action) { + if (_action->_endHandler) + _action->_endHandler = NULL; + _action->remove(); + } + + _focusObject = NULL; +*/ +} + +void SceneExt::process(Event &event) { + if (!event.handled) + Scene::process(event); +} + +void SceneExt::dispatch() { +/* + _timerList.dispatch(); + + if (_field37A) { + if ((--_field37A == 0) && R2_GLOBALS._dayNumber) { + if (R2_GLOBALS._uiElements._active && R2_GLOBALS._player._enabled) { + R2_GLOBALS._uiElements.show(); + } + + _field37A = 0; + } + } +*/ + Scene::dispatch(); +} + +void SceneExt::loadScene(int sceneNum) { + Scene::loadScene(sceneNum); + + _v51C34.top = 0; + _v51C34.bottom = 300; +} + +bool SceneExt::display(CursorType action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(9000, R2_GLOBALS._randomSource.getRandomNumber(2)); + break; + case CURSOR_USE: + SceneItem::display2(9000, R2_GLOBALS._randomSource.getRandomNumber(2) + 6); + break; + case CURSOR_TALK: + SceneItem::display2(9000, R2_GLOBALS._randomSource.getRandomNumber(2) + 3); + break; + default: + return false; + } + + return true; +} + +void SceneExt::fadeOut() { + uint32 black = 0; + R2_GLOBALS._scenePalette.fade((const byte *)&black, false, 100); +} + +void SceneExt::startStrip() { + SceneExt *scene = (SceneExt *)R2_GLOBALS._sceneManager._scene; + scene->_field372 = 1; + scene->_savedPlayerEnabled = R2_GLOBALS._player._enabled; + + if (scene->_savedPlayerEnabled) { + scene->_savedUiEnabled = R2_GLOBALS._player._uiEnabled; + scene->_savedCanWalk = R2_GLOBALS._player._canWalk; + R2_GLOBALS._player.disableControl(); +/* + if (!R2_GLOBALS._v50696 && R2_GLOBALS._uiElements._active) + R2_GLOBALS._uiElements.hide(); +*/ + } +} + +void SceneExt::endStrip() { + SceneExt *scene = (SceneExt *)R2_GLOBALS._sceneManager._scene; + scene->_field372 = 0; + + if (scene->_savedPlayerEnabled) { + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._uiEnabled = scene->_savedUiEnabled; + R2_GLOBALS._player._canWalk = scene->_savedCanWalk; +/* + if (!R2_GLOBALS._v50696 && R2_GLOBALS._uiElements._active) + R2_GLOBALS._uiElements.show(); +*/ + } +} + +void SceneExt::clearScreen() { + R2_GLOBALS._screenSurface.fillRect(R2_GLOBALS._screenSurface.getBounds(), 0); +} + +void SceneExt::refreshBackground(int xAmount, int yAmount) { + switch (_activeScreenNumber) { + case 700: + case 1020: + case 1100: + case 1700: + case 2600: + case 2950: + case 3100: + case 3101: + case 3275: + case 3600: + // Use traditional style sectioned screen loading + Scene::refreshBackground(xAmount, yAmount); + return; + default: + // Break out to new style screen loading + break; + } + + /* New style background loading */ + + // Get the screen data + byte *dataP = g_resourceManager->getResource(RT18, _activeScreenNumber, 0); + int screenSize = g_vm->_memoryManager.getSize(dataP); + + // Lock the background for update + Graphics::Surface s = _backSurface.lockSurface(); + assert(screenSize == (s.w * s.h)); + + // Copy the data + byte *destP = (byte *)s.getBasePtr(0, 0); + Common::copy(dataP, dataP + (s.w * s.h), destP); + _backSurface.unlockSurface(); + + // Free the resource data + DEALLOCATE(dataP); +} + +/*--------------------------------------------------------------------------*/ + +DisplayHotspot::DisplayHotspot(int regionId, ...) { + _sceneRegionId = regionId; + + // Load up the actions + va_list va; + va_start(va, regionId); + + int param = va_arg(va, int); + while (param != LIST_END) { + _actions.push_back(param); + param = va_arg(va, int); + } + + va_end(va); +} + +bool DisplayHotspot::performAction(int action) { + for (uint i = 0; i < _actions.size(); i += 3) { + if (_actions[i] == action) { + display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return true; + } + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +DisplayObject::DisplayObject(int firstAction, ...) { + // Load up the actions + va_list va; + va_start(va, firstAction); + + int param = firstAction; + while (param != LIST_END) { + _actions.push_back(param); + param = va_arg(va, int); + } + + va_end(va); +} + +bool DisplayObject::performAction(int action) { + for (uint i = 0; i < _actions.size(); i += 3) { + if (_actions[i] == action) { + display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return true; + } + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +Ringworld2InvObjectList::Ringworld2InvObjectList(): + _none(1, 1), + _inv1(1, 2), + _inv2(1, 3), + _inv3(1, 4), + _steppingDisks(1, 5), + _inv5(1, 6), + _inv6(1, 7), + _inv7(1, 8), + _inv8(1, 9), + _inv9(1, 10), + _inv10(1, 11), + _inv11(1, 12), + _inv12(1, 13), + _inv13(1, 14), + _inv14(1, 15), + _inv15(1, 16), + _inv16(1, 17), + _inv17(2, 2), + _inv18(2, 3), + _inv19(2, 4), + _inv20(2, 5), + _inv21(2, 5), + _inv22(2, 6), + _inv23(2, 7), + _inv24(2, 8), + _inv25(2, 9), + _inv26(2, 10), + _inv27(2, 11), + _inv28(2, 12), + _inv29(2, 13), + _inv30(2, 14), + _inv31(2, 15), + _inv32(2, 16), + _inv33(3, 2), + _inv34(3, 3), + _inv35(3, 4), + _inv36(3, 5), + _inv37(3, 6), + _inv38(3, 7), + _inv39(1, 10), + _inv40(3, 8), + _inv41(3, 9), + _inv42(3, 10), + _inv43(3, 11), + _inv44(3, 12), + _inv45(3, 13), + _inv46(3, 17), + _inv47(3, 14), + _inv48(3, 14), + _inv49(3, 15), + _inv50(3, 15), + _inv51(3, 17), + _inv52(4, 2) { + + // Add the items to the list + _itemList.push_back(&_none); + _itemList.push_back(&_inv1); + _itemList.push_back(&_inv2); + _itemList.push_back(&_inv3); + _itemList.push_back(&_steppingDisks); + _itemList.push_back(&_inv5); + _itemList.push_back(&_inv6); + _itemList.push_back(&_inv7); + _itemList.push_back(&_inv8); + _itemList.push_back(&_inv9); + _itemList.push_back(&_inv10); + _itemList.push_back(&_inv11); + _itemList.push_back(&_inv12); + _itemList.push_back(&_inv13); + _itemList.push_back(&_inv14); + _itemList.push_back(&_inv15); + _itemList.push_back(&_inv16); + _itemList.push_back(&_inv17); + _itemList.push_back(&_inv18); + _itemList.push_back(&_inv19); + _itemList.push_back(&_inv20); + _itemList.push_back(&_inv21); + _itemList.push_back(&_inv22); + _itemList.push_back(&_inv23); + _itemList.push_back(&_inv24); + _itemList.push_back(&_inv25); + _itemList.push_back(&_inv26); + _itemList.push_back(&_inv27); + _itemList.push_back(&_inv28); + _itemList.push_back(&_inv29); + _itemList.push_back(&_inv30); + _itemList.push_back(&_inv31); + _itemList.push_back(&_inv32); + _itemList.push_back(&_inv33); + _itemList.push_back(&_inv34); + _itemList.push_back(&_inv35); + _itemList.push_back(&_inv36); + _itemList.push_back(&_inv37); + _itemList.push_back(&_inv38); + _itemList.push_back(&_inv39); + _itemList.push_back(&_inv40); + _itemList.push_back(&_inv41); + _itemList.push_back(&_inv42); + _itemList.push_back(&_inv43); + _itemList.push_back(&_inv44); + _itemList.push_back(&_inv45); + _itemList.push_back(&_inv46); + _itemList.push_back(&_inv47); + _itemList.push_back(&_inv48); + _itemList.push_back(&_inv49); + _itemList.push_back(&_inv50); + _itemList.push_back(&_inv51); + _itemList.push_back(&_inv52); + + _selectedItem = NULL; +} + +void Ringworld2InvObjectList::reset() { + // Reset all object scene numbers + SynchronizedList<InvObject *>::iterator i; + for (i = _itemList.begin(); i != _itemList.end(); ++i) { + (*i)->_sceneNumber = 0; + } + + // Set up default inventory + setObjectScene(R2_1, 800); + setObjectScene(R2_2, 400); + setObjectScene(R2_3, 100); + setObjectScene(R2_STEPPING_DISKS, 100); + setObjectScene(R2_5, 400); + setObjectScene(R2_6, 400); + setObjectScene(R2_7, 500); + setObjectScene(R2_8, 700); + setObjectScene(R2_9, 800); + setObjectScene(R2_10, 100); + setObjectScene(R2_11, 400); + setObjectScene(R2_12, 500); + setObjectScene(R2_13, 1550); + setObjectScene(R2_14, 850); + setObjectScene(R2_15, 850); + setObjectScene(R2_16, 0); + setObjectScene(R2_17, 1550); + setObjectScene(R2_18, 1550); + setObjectScene(R2_19, 1550); + setObjectScene(R2_20, 500); + setObjectScene(R2_21, 500); + setObjectScene(R2_22, 1550); + setObjectScene(R2_23, 1580); + setObjectScene(R2_24, 9999); + setObjectScene(R2_25, 1550); + setObjectScene(R2_26, 1550); + setObjectScene(R2_27, 1580); + setObjectScene(R2_28, 1550); + setObjectScene(R2_29, 2525); + setObjectScene(R2_30, 2440); + setObjectScene(R2_31, 2455); + setObjectScene(R2_32, 2535); + setObjectScene(R2_33, 2530); + setObjectScene(R2_34, 1950); + setObjectScene(R2_35, 1950); + setObjectScene(R2_36, 9999); + setObjectScene(R2_37, 2430); + setObjectScene(R2_38, 9999); + setObjectScene(R2_39, 2); + setObjectScene(R2_40, 9999); + setObjectScene(R2_41, 3150); + setObjectScene(R2_42, 0); + setObjectScene(R2_43, 3260); + setObjectScene(R2_44, 2); + setObjectScene(R2_45, 1550); + setObjectScene(R2_46, 0); + setObjectScene(R2_47, 3150); + setObjectScene(R2_48, 2435); + setObjectScene(R2_49, 2440); + setObjectScene(R2_50, 2435); + setObjectScene(R2_51, 1580); + setObjectScene(R2_52, 3260); +} + +void Ringworld2InvObjectList::setObjectScene(int objectNum, int sceneNumber) { + // Find the appropriate object + int num = objectNum; + SynchronizedList<InvObject *>::iterator i = _itemList.begin(); + while (num-- > 0) ++i; + (*i)->_sceneNumber = sceneNumber; + + // If the item is the currently active one, default back to the use cursor + if (R2_GLOBALS._events.getCursor() == objectNum) + R2_GLOBALS._events.setCursor(CURSOR_USE); + + // Update the user interface if necessary + T2_GLOBALS._uiElements.updateInventory(); +} + +/*--------------------------------------------------------------------------*/ + +void Ringworld2Game::start() { + int slot = -1; + + if (ConfMan.hasKey("save_slot")) { + slot = ConfMan.getInt("save_slot"); + Common::String file = g_vm->generateSaveName(slot); + Common::InSaveFile *in = g_vm->_system->getSavefileManager()->openForLoading(file); + if (in) + delete in; + else + slot = -1; + } + + if (slot >= 0) + g_globals->_sceneHandler->_loadGameSlot = slot; + else { + // Switch to the first game scene + g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_sceneManager.setNewScene(100); + } + + g_globals->_events.showCursor(); +} + +void Ringworld2Game::restart() { + g_globals->_scenePalette.clearListeners(); + g_globals->_soundHandler.stop(); + + // Change to the first game scene + g_globals->_sceneManager.changeScene(100); +} + +void Ringworld2Game::endGame(int resNum, int lineNum) { + g_globals->_events.setCursor(CURSOR_WALK); + Common::String msg = g_resourceManager->getMessage(resNum, lineNum); + bool savesExist = g_saver->savegamesExist(); + + if (!savesExist) { + // No savegames exist, so prompt the user to restart or quit + if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0) + g_vm->quitGame(); + else + restart(); + } else { + // Savegames exist, so prompt for Restore/Restart + bool breakFlag; + do { + if (g_vm->shouldQuit()) { + breakFlag = true; + } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) { + restart(); + breakFlag = true; + } else { + handleSaveLoad(false, g_globals->_sceneHandler->_loadGameSlot, g_globals->_sceneHandler->_saveName); + breakFlag = g_globals->_sceneHandler->_loadGameSlot >= 0; + } + } while (!breakFlag); + } + + g_globals->_events.setCursorFromFlag(); +} + +void Ringworld2Game::processEvent(Event &event) { + if (event.eventType == EVENT_KEYPRESS) { + switch (event.kbd.keycode) { + case Common::KEYCODE_F1: + // F1 - Help +// 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; + } + } +} + +void Ringworld2Game::rightClick() { + RightClickDialog *dlg = new RightClickDialog(); + dlg->execute(); + delete dlg; +} + +/*--------------------------------------------------------------------------*/ + +NamedHotspot::NamedHotspot() : SceneHotspot() { + _resNum = 0; + _lookLineNum = _useLineNum = _talkLineNum = -1; +} + +bool NamedHotspot::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_WALK: + // Nothing + return false; + case CURSOR_LOOK: + if (_lookLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _lookLineNum); + return true; + case CURSOR_USE: + if (_useLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _useLineNum); + return true; + case CURSOR_TALK: + if (_talkLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _talkLineNum); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) { + setBounds(ys, xe, ye, xs); + _resNum = resnum; + _lookLineNum = lookLineNum; + _useLineNum = useLineNum; + _talkLineNum = -1; + g_globals->_sceneItems.addItems(this, NULL); +} + +void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { + setBounds(bounds); + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + switch (mode) { + case 2: + g_globals->_sceneItems.push_front(this); + break; + case 4: + g_globals->_sceneItems.addBefore(item, this); + break; + case 5: + g_globals->_sceneItems.addAfter(item, this); + break; + default: + g_globals->_sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) { + _sceneRegionId = sceneRegionId; + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + // Handle adding hotspot to scene items list as necessary + switch (mode) { + case 2: + GLOBALS._sceneItems.push_front(this); + break; + case 3: + break; + default: + GLOBALS._sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::synchronize(Serializer &s) { + SceneHotspot::synchronize(s); + s.syncAsSint16LE(_resNum); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_useLineNum); + + if (g_vm->getGameID() == GType_BlueForce) + s.syncAsSint16LE(_talkLineNum); +} + +void SceneActor::postInit(SceneObjectList *OwnerList) { + _lookLineNum = _talkLineNum = _useLineNum = -1; + SceneObject::postInit(); +} + +void SceneActor::synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsSint16LE(_resNum); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_talkLineNum); + s.syncAsSint16LE(_useLineNum); + + s.syncAsSint16LE(_effect); + s.syncAsSint16LE(_shade); +} + +bool SceneActor::startAction(CursorType action, Event &event) { + bool handled = true; + + switch (action) { + case CURSOR_LOOK: + if (_lookLineNum == -1) + handled = false; + else + SceneItem::display2(_resNum, _lookLineNum); + break; + case CURSOR_USE: + if (_useLineNum == -1) + handled = false; + else + SceneItem::display2(_resNum, _useLineNum); + break; + case CURSOR_TALK: + if (_talkLineNum == -1) + handled = false; + else + SceneItem::display2(_resNum, _talkLineNum); + break; + default: + handled = false; + break; + } + + if (!handled) + handled = ((SceneExt *)R2_GLOBALS._sceneManager._scene)->display(action); + return handled; +} + +void SceneActor::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + switch (mode) { + case 2: + g_globals->_sceneItems.push_front(this); + break; + case 4: + g_globals->_sceneItems.addBefore(item, this); + break; + case 5: + g_globals->_sceneItems.addAfter(item, this); + break; + default: + g_globals->_sceneItems.push_back(this); + break; + } +} + +void SceneActor::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) { + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; +} + + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h new file mode 100644 index 0000000000..bfb3281d5d --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_logic.h @@ -0,0 +1,250 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_LOGIC_H +#define TSAGE_RINGWORLD2_LOGIC_H + +#include "common/scummsys.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +#define R2_INVENTORY (*((::TsAGE::Ringworld2::Ringworld2InvObjectList *)g_globals->_inventory)) + +class SceneFactory { +public: + static Scene *createScene(int sceneNumber); +}; + +class SceneExt: public Scene { +private: + static void startStrip(); + static void endStrip(); +public: + int _field372; + bool _savedPlayerEnabled; + bool _savedUiEnabled; + bool _savedCanWalk; + int _field37A; + + SceneObject *_focusObject; + Visage _cursorVisage; + + Rect _v51C34; +public: + SceneExt(); + + virtual Common::String getClassName() { return "SceneExt"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void loadScene(int sceneNum); + virtual void refreshBackground(int xAmount, int yAmount); + + bool display(CursorType action); + void fadeOut(); + void clearScreen(); +}; + +class DisplayHotspot : public SceneObject { +private: + Common::Array<int> _actions; + bool performAction(int action); +public: + DisplayHotspot(int regionId, ...); + + virtual void doAction(int action) { + if (!performAction(action)) + SceneHotspot::doAction(action); + } +}; + +class DisplayObject : public SceneObject { +private: + Common::Array<int> _actions; + bool performAction(int action); +public: + DisplayObject(int firstAction, ...); + + virtual void doAction(int action) { + if (!performAction(action)) + SceneHotspot::doAction(action); + } +}; + +class SceneObjectExt : public SceneObject { +public: + int _state; + + virtual void synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsSint16LE(_state); + } + virtual Common::String getClassName() { return "SceneObjectExt"; } +}; + +/*--------------------------------------------------------------------------*/ + +class Ringworld2InvObjectList : public InvObjectList { +public: + InvObject _none; + InvObject _inv1; + InvObject _inv2; + InvObject _inv3; + InvObject _steppingDisks; + InvObject _inv5; + InvObject _inv6; + InvObject _inv7; + InvObject _inv8; + InvObject _inv9; + InvObject _inv10; + InvObject _inv11; + InvObject _inv12; + InvObject _inv13; + InvObject _inv14; + InvObject _inv15; + InvObject _inv16; + InvObject _inv17; + InvObject _inv18; + InvObject _inv19; + InvObject _inv20; + InvObject _inv21; + InvObject _inv22; + InvObject _inv23; + InvObject _inv24; + InvObject _inv25; + InvObject _inv26; + InvObject _inv27; + InvObject _inv28; + InvObject _inv29; + InvObject _inv30; + InvObject _inv31; + InvObject _inv32; + InvObject _inv33; + InvObject _inv34; + InvObject _inv35; + InvObject _inv36; + InvObject _inv37; + InvObject _inv38; + InvObject _inv39; + InvObject _inv40; + InvObject _inv41; + InvObject _inv42; + InvObject _inv43; + InvObject _inv44; + InvObject _inv45; + InvObject _inv46; + InvObject _inv47; + InvObject _inv48; + InvObject _inv49; + InvObject _inv50; + InvObject _inv51; + InvObject _inv52; + + Ringworld2InvObjectList(); + void reset(); + void setObjectScene(int objectNum, int sceneNumber); + + virtual Common::String getClassName() { return "Ringworld2InvObjectList"; } +}; + +#define RING2_INVENTORY (*((::TsAGE::Ringworld2::Ringworld2InvObjectList *)g_globals->_inventory)) + +class Ringworld2Game: public Game { +public: + virtual void start(); + virtual void restart(); + virtual void endGame(int resNum, int lineNum); + + virtual Scene *createScene(int sceneNumber); + virtual void processEvent(Event &event); + virtual void rightClick(); + virtual bool canSaveGameStateCurrently(); + virtual bool canLoadGameStateCurrently(); +}; + +class NamedHotspot : public SceneHotspot { +public: + int _resNum, _lookLineNum, _useLineNum, _talkLineNum; + NamedHotspot(); + + virtual bool startAction(CursorType action, Event &event); + virtual Common::String getClassName() { return "NamedHotspot"; } + virtual void synchronize(Serializer &s); + virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum); + virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item); + virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode = 0); +}; + +class NamedHotspotExt : public NamedHotspot { +public: + int _flag; + NamedHotspotExt() { _flag = 0; } + + virtual Common::String getClassName() { return "NamedHotspot"; } + virtual void synchronize(Serializer &s) { + NamedHotspot::synchronize(s); + s.syncAsSint16LE(_flag); + } +}; + +class SceneActor: public SceneObject { +public: + int _resNum; + int _lookLineNum, _talkLineNum, _useLineNum; + int _effect, _shade; + + virtual Common::String getClassName() { return "SceneActor"; } + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual bool startAction(CursorType action, Event &event); + + void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item); + void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum); +}; + +class SceneActorExt: public SceneActor { +public: + int _state; + + SceneActorExt() { _state = 0; } + virtual Common::String getClassName() { return "SceneActorExt"; } + virtual void synchronize(Serializer &s) { + SceneActor::synchronize(s); + s.syncAsSint16LE(_state); + } +}; + + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp new file mode 100644 index 0000000000..526bf6e3c9 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp @@ -0,0 +1,331 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/ringworld2/ringworld2_scenes0.h" + +namespace TsAGE { + +namespace Ringworld2 { + +/*-------------------------------------------------------------------------- + * Scene 100 - Quinn's Room + * + *--------------------------------------------------------------------------*/ + +bool Scene100::Object7::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (_state) { + SceneItem::display2(100, 6); + } else { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 101; + scene->setAction(&scene->_sequenceManager1, scene, 101, &R2_GLOBALS._player, this, NULL); + } + return true; + case CURSOR_TALK: + if (_state) { + SceneItem::display2(100, 26); + _state = 0; + scene->_object10.setFrame(1); + } else { + SceneItem::display2(100, 27); + _state = 1; + scene->_object10.setFrame(2); + } + return true; + default: + return SceneActor::startAction(action, event); + } +} + +bool Scene100::Object8::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + R2_GLOBALS._player.disableControl(); + if (_strip == 2) { + scene->_sceneMode = 108; + scene->_object3.postInit(); + scene->_object9.postInit(); + + if (R2_INVENTORY.getObjectScene(R2_3) == 1) { + scene->_object9.setup(100, 7, 2); + } else { + scene->_object9.setup(100, 7, 1); + scene->_object9.setDetails(100, 21, 22, 23, 2, NULL); + } + + scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_object3, + &scene->_object9, &R2_GLOBALS._player, NULL); + } else { + scene->_sceneMode = 109; + scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_object3, + &scene->_object9, &R2_GLOBALS._player, NULL); + } + return true; + case CURSOR_TALK: + R2_GLOBALS._player.disableControl(); + + if (_strip == 2) { + SceneItem::display2(100, 18); + scene->_sceneMode = 102; + scene->_object3.postInit(); + scene->_object9.postInit(); + + if (R2_INVENTORY.getObjectScene(R2_3) == 1) { + scene->_object9.setup(100, 7, 2); + } else { + scene->_object9.setup(100, 7, 1); + scene->_object9.setDetails(100, 21, 22, 23, 2, NULL); + } + + scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_object3, + &scene->_object9, NULL); + } else { + SceneItem::display2(100, 19); + scene->_sceneMode = 103; + scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_object3, + &scene->_object9, NULL); + } + return true; + default: + return SceneActor::startAction(action, event); + } +} + +bool Scene100::Object9::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 107; + scene->setAction(&scene->_sequenceManager1, scene, 107, &R2_GLOBALS._player, &scene->_object9, NULL); + return true; + default: + return SceneActor::startAction(action, event); + } +} + +bool Scene100::Object10::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(100, _state ? 24 : 25); + return true; + case CURSOR_TALK: + SceneItem::display2(100, _state ? 26 : 27); + return true; + case CURSOR_USE: + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 110; + scene->setAction(&scene->_sequenceManager1, scene, 110, &R2_GLOBALS._player, NULL); + return true; + default: + return SceneActor::startAction(action, event); + } +} + +bool Scene100::SteppingDisks::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 111; + scene->setAction(&scene->_sequenceManager1, scene, 111, &R2_GLOBALS._player, this, NULL); + return true; + default: + return SceneActor::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene100::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(100); + R2_GLOBALS._scenePalette.loadPalette(0); + + if (R2_GLOBALS._sceneManager._previousScene != 125) + R2_GLOBALS._sound1.play(10); + + _object7.postInit(); + _object7._state = 0; + _object7.setVisage(100); + _object7.setPosition(Common::Point(160, 84)); + _object7.setDetails(100, 3, 4, 5, 1, NULL); + + _object10.postInit(); + _object10.setup(100, 2, 1); + _object10.setDetails(100, -1, -1, -1, 1, NULL); + + _object8.postInit(); + _object8.setup(100, 2, 3); + _object8.setPosition(Common::Point(175, 157)); + _object8.setDetails(100, 17, 18, 20, 1, NULL); + + _object1.postInit(); + _object1.setup(100, 3, 1); + _object1.setPosition(Common::Point(89, 79)); + _object1.fixPriority(250); + _object1.animate(ANIM_MODE_2, NULL); + _object1._numFrames = 3; + + _object2.postInit(); + _object2.setup(100, 3, 1); + _object2.setPosition(Common::Point(89, 147)); + _object2.fixPriority(250); + _object2.animate(ANIM_MODE_7, 0, NULL); + _object2._numFrames = 3; + + _object6.postInit(); + _object6.setVisage(101); + _object6.setPosition(Common::Point(231, 126)); + _object6.fixPriority(10); + _object6.setDetails(100, 37, -1, 39, 1, NULL); + + if (R2_INVENTORY.getObjectScene(R2_STEPPING_DISKS) == 100) { + _steppingDisks.postInit(); + _steppingDisks.setup(100, 8, 1); + _steppingDisks.setPosition(Common::Point(274, 130)); + _steppingDisks.setDetails(100, 40, -1, 42, 1, NULL); + } + + _item5.setDetails(11, 100, 14, 15, 16); + _item4.setDetails(12, 100, 11, -1, 13); + _item3.setDetails(13, 100, 8, 9, 10); + _item2.setDetails(14, 100, 34, -1, 36); + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.setVisage(10); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.disableControl(); + + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 100, 0, 1, -1, 1, NULL); + + switch (R2_GLOBALS._sceneManager._previousScene) { + case 50: + case 180: + _object5.postInit(); + _object4.postInit(); + _sceneMode = 104; + setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_object6, &_object4, &_object5, NULL); + break; + case 125: + _sceneMode = 100; + setAction(&_sequenceManager1, this, 106, &R2_GLOBALS._player, NULL); + break; + case 200: + _sceneMode = 100; + setAction(&_sequenceManager1, this, 100, &R2_GLOBALS._player, &_object7, NULL); + break; + default: + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.setPosition(Common::Point(180, 100)); + R2_GLOBALS._player.enableControl(); + break; + } +} + +void Scene100::remove() { + R2_GLOBALS._sound1.play(10); + SceneExt::remove(); +} + +void Scene100::signal() { + switch (_sceneMode) { + case 101: + R2_GLOBALS._sceneManager.changeScene(200); + break; + case 103: + case 109: + _object8.setStrip(2); + _object8.setFrame(3); + + _object3.remove(); + _object9.remove(); + R2_GLOBALS._player.enableControl(); + break; + case 104: + _sceneMode = 0; + _object5.remove(); + _object4.remove(); + + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player.fixPriority(-1); + R2_GLOBALS._player.enableControl(); + break; + case 105: + R2_GLOBALS._sceneManager.changeScene(125); + break; + case 107: + R2_GLOBALS._sceneItems.remove(&_object9); + + _object9.setFrame(2); + R2_INVENTORY.setObjectScene(3, 1); + R2_GLOBALS._player.enableControl(); + break; + case 110: + if (_object7._state) { + _object7._state = 0; + _object10.setFrame(1); + } else { + _object7._state = 1; + _object10.setFrame(2); + } + R2_GLOBALS._player.enableControl(); + break; + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +void Scene100::dispatch() { +/* + int regionIndex = R2_GLOBALS._player.getRegionIndex(); + if (regionIndex == 13) + R2_GLOBALS._player._shade = 4; + + if ((R2_GLOBALS._player._visage == 13) || (R2_GLOBALS._player._visage == 101)) + (R2_GLOBALS._player._shade = 0; +*/ + SceneExt::dispatch(); + + if ((_sceneMode == 101) && (_object7._frame == 2) && (_object8._strip == 5)) { + _object8.setAction(&_sequenceManager2, NULL, 103, &_object8, &_object3, &_object9, NULL); + } +} + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.h b/engines/tsage/ringworld2/ringworld2_scenes0.h new file mode 100644 index 0000000000..c51b044137 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_scenes0.h @@ -0,0 +1,84 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_SCENES0_H +#define TSAGE_RINGWORLD2_SCENES0_H + +#include "common/scummsys.h" +#include "tsage/converse.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" +#include "tsage/ringworld2/ringworld2_logic.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +class Scene100: public SceneExt { + /* Objects */ + class Object7: public SceneActorExt { + public: + bool startAction(CursorType action, Event &event); + }; + class Object8: public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Object9: public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Object10: public SceneActorExt { + public: + bool startAction(CursorType action, Event &event); + }; + class SteppingDisks: public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; +public: + NamedHotspot _item1, _item2, _item3, _item4, _item5; + SceneActor _object1, _object2, _object3, _object4, _object5; + SceneActor _object6; + Object7 _object7; + Object8 _object8; + Object9 _object9; + Object10 _object10; + SteppingDisks _steppingDisks; + SequenceManager _sequenceManager1, _sequenceManager2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void dispatch(); +}; + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp index 522e40c236..db52050b03 100644 --- a/engines/tsage/saveload.cpp +++ b/engines/tsage/saveload.cpp @@ -21,23 +21,25 @@ */ #include "common/savefile.h" +#include "common/mutex.h" #include "graphics/palette.h" #include "graphics/scaler.h" #include "graphics/thumbnail.h" #include "tsage/globals.h" #include "tsage/saveload.h" +#include "tsage/sound.h" #include "tsage/tsage.h" -namespace tSage { +namespace TsAGE { -Saver *_saver; +Saver *g_saver; SavedObject::SavedObject() { - _saver->addObject(this); + g_saver->addObject(this); } SavedObject::~SavedObject() { - _saver->removeObject(this); + g_saver->removeObject(this); } /*--------------------------------------------------------------------------*/ @@ -50,7 +52,7 @@ Saver::Saver() { Saver::~Saver() { // Internal validation that no saved object is still present int totalLost = 0; - for (SynchronizedList<SavedObject *>::iterator i = _saver->_objList.begin(); i != _saver->_objList.end(); ++i) { + for (SynchronizedList<SavedObject *>::iterator i = g_saver->_objList.begin(); i != g_saver->_objList.end(); ++i) { SavedObject *so = *i; if (so) ++totalLost; @@ -70,7 +72,7 @@ void Serializer::syncPointer(SavedObject **ptr, Common::Serializer::Version minV if (isSaving()) { // Get the object index for the given pointer and write it out if (*ptr) { - idx = _saver->blockIndexOf(*ptr); + idx = g_saver->blockIndexOf(*ptr); assert(idx > 0); } syncAsUint32LE(idx); @@ -80,7 +82,7 @@ void Serializer::syncPointer(SavedObject **ptr, Common::Serializer::Version minV *ptr = NULL; if (idx > 0) // For non-zero (null) pointers, create a record for later resolving it to an address - _saver->addSavedObjectPtr(ptr, idx); + g_saver->addSavedObjectPtr(ptr, idx); } } @@ -101,10 +103,24 @@ void Serializer::validate(int v, Common::Serializer::Version minVersion, error("Savegame is corrupt"); } +#define DOUBLE_PRECISION 1000000000 + +void Serializer::syncAsDouble(double &v) { + int32 num = (int32)(v); + uint32 fraction = (uint32)((v - (int32)v) * DOUBLE_PRECISION); + + syncAsSint32LE(num); + syncAsUint32LE(fraction); + + if (isLoading()) + v = num + (double)fraction / DOUBLE_PRECISION; +} + /*--------------------------------------------------------------------------*/ Common::Error Saver::save(int slot, const Common::String &saveName) { assert(!getMacroRestoreFlag()); + Common::StackLock slock1(g_globals->_soundManager._serverDisabledMutex); // Signal any objects registered for notification _saveNotifiers.notify(false); @@ -113,8 +129,12 @@ Common::Error Saver::save(int slot, const Common::String &saveName) { _macroSaveFlag = true; _saveSlot = slot; + // Try and create the save file + Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(g_vm->generateSaveName(slot)); + if (!saveFile) + return Common::kCreatingFileFailed; + // Set up the serializer - Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(_vm->generateSaveName(slot)); Serializer serializer(NULL, saveFile); serializer.setSaveVersion(TSAGE_SAVEGAME_VERSION); @@ -149,6 +169,7 @@ Common::Error Saver::save(int slot, const Common::String &saveName) { Common::Error Saver::restore(int slot) { assert(!getMacroRestoreFlag()); + Common::StackLock slock1(g_globals->_soundManager._serverDisabledMutex); // Signal any objects registered for notification _loadNotifiers.notify(false); @@ -159,7 +180,10 @@ Common::Error Saver::restore(int slot) { _unresolvedPtrs.clear(); // Set up the serializer - Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(_vm->generateSaveName(slot)); + Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(g_vm->generateSaveName(slot)); + if (!saveFile) + return Common::kReadingFailed; + Serializer serializer(saveFile, NULL); // Read in the savegame header @@ -205,7 +229,7 @@ Common::Error Saver::restore(int slot) { // Final post-restore notifications _macroRestoreFlag = false; - _loadNotifiers.notify(false); + _loadNotifiers.notify(true); return Common::kNoError; } @@ -232,12 +256,9 @@ bool Saver::readSavegameHeader(Common::InSaveFile *in, tSageSavegameHeader &head while ((ch = (char)in->readByte()) != '\0') header.saveName += ch; // Get the thumbnail - header.thumbnail = new Graphics::Surface(); - if (!Graphics::loadThumbnail(*in, *header.thumbnail)) { - delete header.thumbnail; - header.thumbnail = NULL; + header.thumbnail = Graphics::loadThumbnail(*in); + if (!header.thumbnail) return false; - } // Read in save date/time header.saveYear = in->readSint16LE(); @@ -265,10 +286,10 @@ void Saver::writeSavegameHeader(Common::OutSaveFile *out, tSageSavegameHeader &h // Create a thumbnail and save it Graphics::Surface *thumb = new Graphics::Surface(); - Graphics::Surface s = _globals->_screenSurface.lockSurface(); + Graphics::Surface s = g_globals->_screenSurface.lockSurface(); ::createThumbnail(thumb, (const byte *)s.pixels, SCREEN_WIDTH, SCREEN_HEIGHT, thumbPalette); Graphics::saveThumbnail(*out, *thumb); - _globals->_screenSurface.unlockSurface(); + g_globals->_screenSurface.unlockSurface(); delete thumb; // Write out the save date/time @@ -279,7 +300,7 @@ void Saver::writeSavegameHeader(Common::OutSaveFile *out, tSageSavegameHeader &h out->writeSint16LE(td.tm_mday); out->writeSint16LE(td.tm_hour); out->writeSint16LE(td.tm_min); - out->writeUint32LE(_globals->_events.getFrameNumber()); + out->writeUint32LE(g_globals->_events.getFrameNumber()); } /** @@ -321,7 +342,7 @@ void Saver::removeObject(SavedObject *obj) { * Returns true if any savegames exist */ bool Saver::savegamesExist() const { - Common::String slot1Name = _vm->generateSaveName(1); + Common::String slot1Name = g_vm->generateSaveName(1); Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(slot1Name); bool result = saveFile != NULL; @@ -396,4 +417,4 @@ void Saver::resolveLoadPointers() { error("Could not resolve savegame block pointers"); } -} // End of namespace tSage +} // End of namespace TsAGE diff --git a/engines/tsage/saveload.h b/engines/tsage/saveload.h index c1c2851f28..52b23413d4 100644 --- a/engines/tsage/saveload.h +++ b/engines/tsage/saveload.h @@ -29,11 +29,11 @@ #include "common/savefile.h" #include "common/serializer.h" -namespace tSage { +namespace TsAGE { typedef void (*SaveNotifierFn)(bool postFlag); -#define TSAGE_SAVEGAME_VERSION 5 +#define TSAGE_SAVEGAME_VERSION 7 class SavedObject; @@ -77,6 +77,7 @@ public: Common::Serializer::Version maxVersion = kLastVersion); void validate(int v, Common::Serializer::Version minVersion = 0, Common::Serializer::Version maxVersion = kLastVersion); + void syncAsDouble(double &v); }; /*--------------------------------------------------------------------------*/ @@ -137,6 +138,18 @@ public: } } } + + void addBefore(T existingItem, T newItem) { + typename SynchronizedList<T>::iterator i = this->begin(); + while ((i != this->end()) && (*i != existingItem)) ++i; + this->insert(i, newItem); + } + void addAfter(T existingItem, T newItem) { + typename SynchronizedList<T>::iterator i = this->begin(); + while ((i != this->end()) && (*i != existingItem)) ++i; + if (i != this->end()) ++i; + this->insert(i, newItem); + } }; /** @@ -219,8 +232,8 @@ public: void listObjects(); }; -extern Saver *_saver; +extern Saver *g_saver; -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index 6352918e39..686b8725f5 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -20,13 +20,17 @@ * */ +#include "common/config-manager.h" +#include "common/translation.h" +#include "gui/saveload.h" #include "tsage/scenes.h" #include "tsage/globals.h" -#include "tsage/ringworld_logic.h" +#include "tsage/ringworld/ringworld_logic.h" #include "tsage/tsage.h" #include "tsage/saveload.h" +#include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { SceneManager::SceneManager() { _scene = NULL; @@ -36,8 +40,9 @@ SceneManager::SceneManager() { _previousScene = 0; _fadeMode = FADEMODE_GRADUAL; _scrollerRect = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - _saver->addListener(this); + g_saver->addListener(this); _objectCount = 0; + _loadMode = 0; } SceneManager::~SceneManager() { @@ -45,7 +50,7 @@ SceneManager::~SceneManager() { } void SceneManager::setNewScene(int sceneNumber) { - warning("SetNewScene(%d)", sceneNumber); + debug(1, "SetNewScene(%d)", sceneNumber); _nextSceneNumber = sceneNumber; } @@ -55,7 +60,7 @@ void SceneManager::checkScene() { _nextSceneNumber = -1; } - _globals->dispatchSounds(); + g_globals->dispatchSounds(); } void SceneManager::sceneChange() { @@ -68,24 +73,16 @@ void SceneManager::sceneChange() { } // Clear the scene objects - SynchronizedList<SceneObject *>::iterator io = _globals->_sceneObjects->begin(); - while (io != _globals->_sceneObjects->end()) { - SceneObject *sceneObj = *io; - ++io; - sceneObj->removeObject(); - } - - // Clear the secondary scene object list - io = _globals->_sceneManager._altSceneObjects.begin(); - while (io != _globals->_sceneManager._altSceneObjects.end()) { + SynchronizedList<SceneObject *>::iterator io = g_globals->_sceneObjects->begin(); + while (io != g_globals->_sceneObjects->end()) { SceneObject *sceneObj = *io; ++io; sceneObj->removeObject(); } // Clear the hotspot list - SynchronizedList<SceneItem *>::iterator ii = _globals->_sceneItems.begin(); - while (ii != _globals->_sceneItems.end()) { + SynchronizedList<SceneItem *>::iterator ii = g_globals->_sceneItems.begin(); + while (ii != g_globals->_sceneItems.end()) { SceneItem *sceneItem = *ii; ++ii; sceneItem->remove(); @@ -110,47 +107,47 @@ void SceneManager::sceneChange() { // Ensure that the same number of objects are registered now as when the scene started if (_objectCount > 0) { - assert(_objectCount == _saver->getObjectCount()); + assert(_objectCount == g_saver->getObjectCount()); } - _objectCount = _saver->getObjectCount(); - _globals->_sceneHandler._delayTicks = 2; + _objectCount = g_saver->getObjectCount(); + g_globals->_sceneHandler->_delayTicks = 2; // Instantiate and set the new scene _scene = getNewScene(); - if (!_saver->getMacroRestoreFlag()) + if (!g_saver->getMacroRestoreFlag()) _scene->postInit(); else _scene->loadScene(activeScreenNumber); } Scene *SceneManager::getNewScene() { - return _globals->_game->createScene(_nextSceneNumber); + return g_globals->_game->createScene(_nextSceneNumber); } void SceneManager::fadeInIfNecessary() { if (_hasPalette) { uint32 adjustData = 0; for (int percent = 0; percent < 100; percent += 5) { - if (_globals->_sceneManager._fadeMode == FADEMODE_IMMEDIATE) + if (g_globals->_sceneManager._fadeMode == FADEMODE_IMMEDIATE) percent = 100; - _globals->_scenePalette.fade((const byte *)&adjustData, false, percent); + g_globals->_scenePalette.fade((const byte *)&adjustData, false, percent); g_system->updateScreen(); g_system->delayMillis(10); } - _globals->_scenePalette.refresh(); + g_globals->_scenePalette.refresh(); _hasPalette = false; } } void SceneManager::changeScene(int newSceneNumber) { - warning("changeScene(%d)", newSceneNumber); + debug(1, "changeScene(%d)", newSceneNumber); // Fade out the scene ScenePalette scenePalette; uint32 adjustData = 0; - _globals->_scenePalette.clearListeners(); + g_globals->_scenePalette.clearListeners(); scenePalette.getPalette(); for (int percent = 100; percent >= 0; percent -= 5) { @@ -160,7 +157,7 @@ void SceneManager::changeScene(int newSceneNumber) { // Stop any objects that were animating SynchronizedList<SceneObject *>::iterator i; - for (i = _globals->_sceneObjects->begin(); i != _globals->_sceneObjects->end(); ++i) { + for (i = g_globals->_sceneObjects->begin(); i != g_globals->_sceneObjects->end(); ++i) { SceneObject *sceneObj = *i; Common::Point pt(0, 0); sceneObj->addMover(NULL, &pt); @@ -171,37 +168,42 @@ void SceneManager::changeScene(int newSceneNumber) { } // Blank out the screen - _globals->_screenSurface.fillRect(_globals->_screenSurface.getBounds(), 0); + g_globals->_screenSurface.fillRect(g_globals->_screenSurface.getBounds(), 0); + + // If there are any fading sounds, wait until fading is complete + while (g_globals->_soundManager.isFading()) { + g_system->delayMillis(10); + } // Set the new scene to be loaded setNewScene(newSceneNumber); } void SceneManager::setup() { - _saver->addLoadNotifier(SceneManager::loadNotifier); + g_saver->addLoadNotifier(SceneManager::loadNotifier); setBackSurface(); } void SceneManager::setBackSurface() { - int size = _globals->_sceneManager._scene->_backgroundBounds.width() * - _globals->_sceneManager._scene->_backgroundBounds.height(); + int size = g_globals->_sceneManager._scene->_backgroundBounds.width() * + g_globals->_sceneManager._scene->_backgroundBounds.height(); if (size > 96000) { - if (_globals->_sceneManager._scene->_backgroundBounds.width() <= SCREEN_WIDTH) { + if (g_globals->_sceneManager._scene->_backgroundBounds.width() <= SCREEN_WIDTH) { // Standard size creation - _globals->_sceneManager._scene->_backSurface.create(SCREEN_WIDTH, SCREEN_HEIGHT * 3 / 2); - _globals->_sceneManager._scrollerRect = Rect(0, 30, SCREEN_WIDTH, SCREEN_HEIGHT - 30); + g_globals->_sceneManager._scene->_backSurface.create(SCREEN_WIDTH, SCREEN_HEIGHT * 3 / 2); + g_globals->_sceneManager._scrollerRect = Rect(0, 30, SCREEN_WIDTH, SCREEN_HEIGHT - 30); } else { // Wide screen needs extra space to allow for scrolling - _globals->_sceneManager._scene->_backSurface.create(SCREEN_WIDTH * 3 / 2, SCREEN_HEIGHT); - _globals->_sceneManager._scrollerRect = Rect(80, 0, SCREEN_WIDTH - 80, SCREEN_HEIGHT); + g_globals->_sceneManager._scene->_backSurface.create(SCREEN_WIDTH * 3 / 2, SCREEN_HEIGHT); + g_globals->_sceneManager._scrollerRect = Rect(80, 0, SCREEN_WIDTH - 80, SCREEN_HEIGHT); } } else { - _globals->_sceneManager._scene->_backSurface.create( - _globals->_sceneManager._scene->_backgroundBounds.width(), - _globals->_sceneManager._scene->_backgroundBounds.height() + g_globals->_sceneManager._scene->_backSurface.create( + g_globals->_sceneManager._scene->_backgroundBounds.width(), + g_globals->_sceneManager._scene->_backgroundBounds.height() ); - _globals->_sceneManager._scrollerRect = Rect(80, 20, SCREEN_WIDTH - 80, SCREEN_HEIGHT - 20); + g_globals->_sceneManager._scrollerRect = Rect(80, 20, SCREEN_WIDTH - 80, SCREEN_HEIGHT - 20); } } @@ -210,9 +212,9 @@ void SceneManager::saveListener(int saveMode) { void SceneManager::loadNotifier(bool postFlag) { if (postFlag) { - if (_globals->_sceneManager._scene->_activeScreenNumber != -1) - _globals->_sceneManager._scene->loadSceneData(_globals->_sceneManager._scene->_activeScreenNumber); - _globals->_sceneManager._hasPalette = true; + if (g_globals->_sceneManager._scene->_activeScreenNumber != -1) + g_globals->_sceneManager._scene->loadSceneData(g_globals->_sceneManager._scene->_activeScreenNumber); + g_globals->_sceneManager._hasPalette = true; } } @@ -224,22 +226,29 @@ void SceneManager::setBgOffset(const Common::Point &pt, int loadCount) { void SceneManager::listenerSynchronize(Serializer &s) { s.validate("SceneManager"); - if (s.isLoading() && !_globals->_sceneManager._scene) + if (s.isLoading() && !g_globals->_sceneManager._scene) // Loading a savegame straight from the launcher, so instantiate a blank placeholder scene // in order for the savegame loading to work correctly - _globals->_sceneManager._scene = new Scene(); + g_globals->_sceneManager._scene = new Scene(); + + // Depreciated: the background scene objects used to be located here + uint32 unused = 0; + s.syncAsUint32LE(unused); - _altSceneObjects.synchronize(s); s.syncAsSint32LE(_sceneNumber); - s.syncAsUint16LE(_globals->_sceneManager._scene->_activeScreenNumber); + s.syncAsUint16LE(g_globals->_sceneManager._scene->_activeScreenNumber); if (s.isLoading()) { changeScene(_sceneNumber); - checkScene(); + + if (_nextSceneNumber != -1) { + sceneChange(); + _nextSceneNumber = -1; + } } - _globals->_sceneManager._scrollerRect.synchronize(s); - SYNC_POINTER(_globals->_scrollFollower); + g_globals->_sceneManager._scrollerRect.synchronize(s); + SYNC_POINTER(g_globals->_scrollFollower); s.syncAsSint16LE(_loadMode); } @@ -248,6 +257,7 @@ void SceneManager::listenerSynchronize(Serializer &s) { Scene::Scene() : _sceneBounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), _backgroundBounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) { _sceneMode = 0; + _activeScreenNumber = 0; _oldSceneBounds = Rect(4000, 4000, 4100, 4100); Common::set_to(&_zoomPercents[0], &_zoomPercents[256], 0); } @@ -273,6 +283,9 @@ void Scene::synchronize(Serializer &s) { s.syncAsUint16LE(_enabledSections[i]); for (int i = 0; i < 256; ++i) s.syncAsSint16LE(_zoomPercents[i]); + + if (s.getVersion() >= 7) + _bgSceneObjects.synchronize(s); } void Scene::postInit(SceneObjectList *OwnerList) { @@ -292,10 +305,10 @@ void Scene::dispatch() { } void Scene::loadScene(int sceneNum) { - warning("loadScene(%d)", sceneNum); + debug(1, "loadScene(%d)", sceneNum); _screenNumber = sceneNum; - if (_globals->_scenePalette.loadPalette(sceneNum)) - _globals->_sceneManager._hasPalette = true; + if (g_globals->_scenePalette.loadPalette(sceneNum)) + g_globals->_sceneManager._hasPalette = true; loadSceneData(sceneNum); } @@ -303,20 +316,48 @@ void Scene::loadScene(int sceneNum) { void Scene::loadSceneData(int sceneNum) { _activeScreenNumber = sceneNum; - // Get the basic scene size - byte *data = _resourceManager->getResource(RES_BITMAP, sceneNum, 9999); - _backgroundBounds = Rect(0, 0, READ_LE_UINT16(data), READ_LE_UINT16(data + 2)); - _globals->_sceneManager._scene->_sceneBounds.contain(_backgroundBounds); - DEALLOCATE(data); + if (g_vm->getGameID() == GType_Ringworld2) { + // Most scenes in Ringworld 2 don't have a scene size resource, but rather just have + // a standard 320x200 size. Only read the scene size data for the specific few scenes + switch (sceneNum) { + case 700: + case 1020: + case 1100: + case 1700: + case 2600: + case 2950: + case 3100: + case 3101: + case 3275: + case 3600: { + // Get the basic scene size from the resource + byte *data = g_resourceManager->getResource(RES_BITMAP, sceneNum, 9999); + _backgroundBounds = Rect(0, 0, READ_LE_UINT16(data), READ_LE_UINT16(data + 2)); + DEALLOCATE(data); + break; + } + default: + // For all other scenes, use a standard screen size + _backgroundBounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + break; + } + } else { + // Get the basic scene size + byte *data = g_resourceManager->getResource(RES_BITMAP, sceneNum, 9999); + _backgroundBounds = Rect(0, 0, READ_LE_UINT16(data), READ_LE_UINT16(data + 2)); + DEALLOCATE(data); + } + + g_globals->_sceneManager._scene->_sceneBounds.contain(_backgroundBounds); // Set up a surface for storing the scene background SceneManager::setBackSurface(); // Load the data lists for the scene - _globals->_walkRegions.load(sceneNum); + g_globals->_walkRegions.load(sceneNum); // Load the item regions of the scene - _globals->_sceneRegions.load(sceneNum); + g_globals->_sceneRegions.load(sceneNum); // Load the priority regions _priorities.load(sceneNum); @@ -324,13 +365,13 @@ void Scene::loadSceneData(int sceneNum) { // Initialize the section enabled list Common::set_to(&_enabledSections[0], &_enabledSections[16 * 16], 0xffff); - _globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160; - _globals->_sceneOffset.y = (_sceneBounds.top / 100) * 100; - _globals->_paneRefreshFlag[0] = 1; - _globals->_paneRefreshFlag[1] = 1; - _globals->_sceneManager._loadMode = 1; - _globals->_sceneManager._sceneLoadCount = 0; - _globals->_sceneManager._sceneBgOffset = Common::Point(0, 0); + g_globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160; + g_globals->_sceneOffset.y = (_sceneBounds.top / 100) * 100; + g_globals->_paneRefreshFlag[0] = 1; + g_globals->_paneRefreshFlag[1] = 1; + g_globals->_sceneManager._loadMode = 1; + g_globals->_sceneManager._sceneLoadCount = 0; + g_globals->_sceneManager._sceneBgOffset = Common::Point(0, 0); // Load the background for the scene loadBackground(0, 0); @@ -342,35 +383,35 @@ void Scene::loadBackground(int xAmount, int yAmount) { _sceneBounds.contain(_backgroundBounds); _sceneBounds.left &= ~3; _sceneBounds.right &= ~3; - _globals->_sceneOffset.x &= ~3; + g_globals->_sceneOffset.x &= ~3; if ((_sceneBounds.top != _oldSceneBounds.top) || (_sceneBounds.left != _oldSceneBounds.left)) { - if (_globals->_sceneManager._loadMode == 0) { - _globals->_paneRefreshFlag[0] = 2; - _globals->_paneRefreshFlag[1] = 2; - _globals->_sceneManager._loadMode = 2; + if (g_globals->_sceneManager._loadMode == 0) { + g_globals->_paneRefreshFlag[0] = 2; + g_globals->_paneRefreshFlag[1] = 2; + g_globals->_sceneManager._loadMode = 2; } _oldSceneBounds = _sceneBounds; } - _globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160; - _globals->_sceneOffset.y = (_sceneBounds.top / 100) * 100; + g_globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160; + g_globals->_sceneOffset.y = (_sceneBounds.top / 100) * 100; if ((_backgroundBounds.width() / 160) == 3) - _globals->_sceneOffset.x = 0; + g_globals->_sceneOffset.x = 0; if ((_backgroundBounds.height() / 100) == 3) - _globals->_sceneOffset.y = 0; + g_globals->_sceneOffset.y = 0; - if ((_globals->_sceneOffset.x != _globals->_prevSceneOffset.x) || - (_globals->_sceneOffset.y != _globals->_prevSceneOffset.y)) { + if ((g_globals->_sceneOffset.x != g_globals->_prevSceneOffset.x) || + (g_globals->_sceneOffset.y != g_globals->_prevSceneOffset.y)) { // Change has happend, so refresh background - _globals->_prevSceneOffset = _globals->_sceneOffset; + g_globals->_prevSceneOffset = g_globals->_sceneOffset; refreshBackground(xAmount, yAmount); } } void Scene::refreshBackground(int xAmount, int yAmount) { - if (_globals->_sceneManager._scene->_activeScreenNumber == -1) + if (g_globals->_sceneManager._scene->_activeScreenNumber == -1) return; // Set the quadrant ranges @@ -415,6 +456,11 @@ void Scene::refreshBackground(int xAmount, int yAmount) { (xSectionSrc + 1) * 160, (ySectionSrc + 1) * 100); Rect destBounds(xSectionDest * 160, ySectionDest * 100, (xSectionDest + 1) * 160, (ySectionDest + 1) * 100); + if (g_vm->getGameID() == GType_BlueForce) { + // For Blue Force, if the scene has an interface area, exclude it from the copy + srcBounds.bottom = MIN<int16>(srcBounds.bottom, BF_GLOBALS._interfaceY); + destBounds.bottom = MIN<int16>(destBounds.bottom, BF_GLOBALS._interfaceY); + } _backSurface.copyFrom(_backSurface, srcBounds, destBounds); } @@ -427,28 +473,27 @@ void Scene::refreshBackground(int xAmount, int yAmount) { } if (changedFlag) { - drawAltObjects(); + drawBackgroundObjects(); } } -void Scene::drawAltObjects() { +void Scene::drawBackgroundObjects() { Common::Array<SceneObject *> objList; // Initial loop to set the priority for entries in the list - for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneManager._altSceneObjects.begin(); - i != _globals->_sceneManager._altSceneObjects.end(); ++i) { + for (SynchronizedList<SceneObject *>::iterator i = _bgSceneObjects.begin(); i != _bgSceneObjects.end(); ++i) { SceneObject *obj = *i; objList.push_back(obj); // Handle updating object priority if (!(obj->_flags & OBJFLAG_FIXED_PRIORITY)) { obj->_priority = MIN((int)obj->_position.y - 1, - (int)_globals->_sceneManager._scene->_backgroundBounds.bottom); + (int)g_globals->_sceneManager._scene->_backgroundBounds.bottom); } } // Sort the list by priority - _globals->_sceneManager._altSceneObjects.sortList(objList); + _bgSceneObjects.sortList(objList); // Drawing loop for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) { @@ -494,6 +539,51 @@ void Scene::setZoomPercents(int yStart, int minPercent, int yEnd, int maxPercent /*--------------------------------------------------------------------------*/ +void Game::restartGame() { + if (MessageDialog::show(RESTART_MSG, CANCEL_BTN_STRING, RESTART_BTN_STRING) == 1) + g_globals->_game->restart(); +} + +void Game::saveGame() { + if (!g_vm->canSaveGameStateCurrently()) + MessageDialog::show(SAVING_NOT_ALLOWED_MSG, OK_BTN_STRING); + else { + // Show the save dialog + handleSaveLoad(true, g_globals->_sceneHandler->_saveGameSlot, g_globals->_sceneHandler->_saveName); + } +} + +void Game::restoreGame() { + if (!g_vm->canLoadGameStateCurrently()) + MessageDialog::show(RESTORING_NOT_ALLOWED_MSG, OK_BTN_STRING); + else { + // Show the load dialog + handleSaveLoad(false, g_globals->_sceneHandler->_loadGameSlot, g_globals->_sceneHandler->_saveName); + } +} + +void Game::quitGame() { + if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) + g_vm->quitGame(); +} + +void Game::handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) { + const EnginePlugin *plugin = 0; + EngineMan.findGame(g_vm->getGameId(), &plugin); + GUI::SaveLoadChooser *dialog; + if (saveFlag) + dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save")); + else + dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load")); + + dialog->setSaveMode(saveFlag); + + saveSlot = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); + saveName = dialog->getResultString(); + + delete dialog; +} + void Game::execute() { // Main game loop bool activeFlag = false; @@ -507,7 +597,7 @@ void Game::execute() { activeFlag = true; } } - } while (activeFlag && !_vm->getEventManager()->shouldQuit()); + } while (activeFlag && !g_vm->shouldQuit()); } -} // End of namespace tSage +} // End of namespace TsAGE diff --git a/engines/tsage/scenes.h b/engines/tsage/scenes.h index 5845efaec9..2daa71ba98 100644 --- a/engines/tsage/scenes.h +++ b/engines/tsage/scenes.h @@ -29,11 +29,11 @@ #include "tsage/core.h" #include "tsage/saveload.h" -namespace tSage { +namespace TsAGE { class Scene : public StripCallback { private: - void drawAltObjects(); + void drawBackgroundObjects(); public: int _field12; int _screenNumber; @@ -48,6 +48,7 @@ public: int _enabledSections[256]; int _zoomPercents[256]; ScenePriorities _priorities; + SceneObjectList _bgSceneObjects; int _fieldA; int _fieldE; @@ -62,17 +63,18 @@ public: virtual void process(Event &event); virtual void dispatch(); virtual void loadScene(int sceneNum); + virtual void refreshBackground(int xAmount, int yAmount); void setZoomPercents(int yStart, int minPercent, int yEnd, int maxPercent); void loadBackground(int xAmount, int yAmount); - void refreshBackground(int xAmount, int yAmount); + void loadSceneData(int sceneNum); }; class SceneManager : public GameHandler, public SaveListener { private: - void disposeRegions() { - // No need to do anything, since regions will be freed automatically when the scene is + void disposeRegions() { + // No need to do anything, since regions will be freed automatically when the scene is } Scene *getNewScene(); public: @@ -86,7 +88,6 @@ public: Common::Point _sceneBgOffset; int _sceneLoadCount; Rect _scrollerRect; - SceneObjectList _altSceneObjects; int _objectCount; public: SceneManager(); @@ -115,7 +116,7 @@ protected: SynchronizedList<GameHandler *> _handlers; static bool notLockedFn(GameHandler *g); - virtual void handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) {} + virtual void handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName); public: virtual ~Game() {} @@ -125,15 +126,18 @@ public: void execute(); virtual void start() = 0; virtual void restart() {} - virtual void restartGame() {} - virtual void saveGame() {} - virtual void restoreGame() {} - virtual void quitGame() {} + virtual void restartGame(); + virtual void saveGame(); + virtual void restoreGame(); + virtual void quitGame(); virtual void endGame(int resNum, int lineNum) {} virtual Scene *createScene(int sceneNumber) = 0; virtual void processEvent(Event &event) {} + virtual void rightClick() {} + virtual bool canSaveGameStateCurrently() = 0; + virtual bool canLoadGameStateCurrently() = 0; }; -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index dc7b6599ed..b61e63236b 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -20,6 +20,7 @@ * */ +#include "audio/decoders/raw.h" #include "common/config-manager.h" #include "tsage/core.h" #include "tsage/globals.h" @@ -27,7 +28,7 @@ #include "tsage/graphics.h" #include "tsage/tsage.h" -namespace tSage { +namespace TsAGE { static SoundManager *_soundManager = NULL; @@ -44,7 +45,6 @@ SoundManager::SoundManager() { _groupsAvail = 0; _newVolume = _masterVol = 127; - _suspendedCount = 0; _driversDetected = false; _needToRethink = false; @@ -53,6 +53,9 @@ SoundManager::SoundManager() { SoundManager::~SoundManager() { if (__sndmgrReady) { + Common::StackLock slock(_serverDisabledMutex); + g_vm->_mixer->stopAll(); + for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ) { Sound *s = *i; ++i; @@ -64,6 +67,16 @@ SoundManager::~SoundManager() { delete driver; } _sfTerminate(); + +// g_system->getTimerManager()->removeTimerProc(_sfUpdateCallback); + } + + // Free any allocated voice type structures + for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { + if (sfManager()._voiceTypeStructPtrs[idx]) { + delete sfManager()._voiceTypeStructPtrs[idx]; + sfManager()._voiceTypeStructPtrs[idx] = NULL; + } } _soundManager = NULL; @@ -71,9 +84,16 @@ SoundManager::~SoundManager() { void SoundManager::postInit() { if (!__sndmgrReady) { - _saver->addSaveNotifier(&SoundManager::saveNotifier); - _saver->addLoadNotifier(&SoundManager::loadNotifier); - _saver->addListener(this); + g_saver->addSaveNotifier(&SoundManager::saveNotifier); + g_saver->addLoadNotifier(&SoundManager::loadNotifier); + g_saver->addListener(this); + + +// I originally separated the sound manager update method into a separate thread, since +// it handles updates for both music and Fx. However, since Adlib updates also get done in a +// thread, and doesn't get too far ahead, I've left it to the AdlibSoundDriver class to +// call the update method, rather than having it be called separately +// g_system->getTimerManager()->installTimerProc(_sfUpdateCallback, 1000000 / SOUND_FREQUENCY, NULL, "tsageSoundUpdate"); __sndmgrReady = true; } } @@ -119,7 +139,10 @@ Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) { assert(__sndmgrReady); _availableDrivers.clear(); - // Build up a list of available drivers. Currently we only implement an Adlib driver + // Build up a list of available drivers. Currently we only implement an Adlib music + // and SoundBlaster FX driver + + // Adlib driver SoundDriverEntry sd; sd.driverNum = ADLIB_DRIVER_NUM; sd.status = detectFlag ? SNDSTATUS_DETECTED : SNDSTATUS_SKIPPED; @@ -129,12 +152,23 @@ Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) { sd.longDescription = "3812fm"; _availableDrivers.push_back(sd); + // SoundBlaster entry + SoundDriverEntry sdFx; + sdFx.driverNum = SBLASTER_DRIVER_NUM; + sdFx.status = detectFlag ? SNDSTATUS_DETECTED : SNDSTATUS_SKIPPED; + sdFx.field2 = 0; + sdFx.field6 = 15000; + sdFx.shortDescription = "SndBlast"; + sdFx.longDescription = "SoundBlaster"; + _availableDrivers.push_back(sdFx); + _driversDetected = true; return _availableDrivers; } void SoundManager::installConfigDrivers() { installDriver(ADLIB_DRIVER_NUM); + installDriver(SBLASTER_DRIVER_NUM); } Common::List<SoundDriverEntry> &SoundManager::getDriverList(bool detectFlag) { @@ -177,7 +211,7 @@ void SoundManager::installDriver(int driverNum) { case ROLAND_DRIVER_NUM: case ADLIB_DRIVER_NUM: { // Handle loading bank infomation - byte *bankData = _resourceManager->getResource(RES_BANK, driverNum, 0, true); + byte *bankData = g_resourceManager->getResource(RES_BANK, driverNum, 0, true); if (bankData) { // Install the patch bank data _sfInstallPatchBank(driver, bankData); @@ -199,8 +233,14 @@ void SoundManager::installDriver(int driverNum) { * Instantiate a driver class for the specified driver number */ SoundDriver *SoundManager::instantiateDriver(int driverNum) { - assert(driverNum == ADLIB_DRIVER_NUM); - return new AdlibSoundDriver(); + switch (driverNum) { + case ADLIB_DRIVER_NUM: + return new AdlibSoundDriver(); + case SBLASTER_DRIVER_NUM: + return new SoundBlasterDriver(); + default: + error("Unknown sound driver - %d", driverNum); + } } /** @@ -328,9 +368,6 @@ void SoundManager::rethinkVoiceTypes() { } void SoundManager::_sfSoundServer() { - Common::StackLock slock1(sfManager()._serverDisabledMutex); - Common::StackLock slock2(sfManager()._serverSuspendedMutex); - if (sfManager()._needToRethink) { _sfRethinkVoiceTypes(); sfManager()._needToRethink = false; @@ -342,13 +379,25 @@ void SoundManager::_sfSoundServer() { if (sfManager()._newVolume != sfManager()._masterVol) _sfSetMasterVol(sfManager()._newVolume); + // If a time index has been set for any sound, fast forward to it + SynchronizedList<Sound *>::iterator i; + for (i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i) { + Sound *s = *i; + if (s->_newTimeIndex != 0) { + s->mute(true); + s->_soSetTimeIndex(s->_newTimeIndex); + s->mute(false); + s->_newTimeIndex = 0; + } + } + // Handle any fading if necessary _sfProcessFading(); // Poll all sound drivers in case they need it - for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin(); - i != sfManager()._installedDrivers.end(); ++i) { - (*i)->poll(); + for (Common::List<SoundDriver *>::iterator j = sfManager()._installedDrivers.begin(); + j != sfManager()._installedDrivers.end(); ++j) { + (*j)->poll(); } } @@ -410,6 +459,22 @@ void SoundManager::_sfProcessFading() { } } +bool SoundManager::isFading() { + Common::StackLock slock(sfManager()._serverSuspendedMutex); + + // Loop through any active sounds to see if any are being actively faded + Common::List<Sound *>::iterator i = sfManager()._playList.begin(); + while (i != sfManager()._playList.end()) { + Sound *s = *i; + ++i; + + if (s->_fadeDest != -1) + return true; + } + + return false; +} + void SoundManager::_sfUpdateVoiceStructs() { for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; @@ -474,7 +539,7 @@ void SoundManager::saveNotifier(bool postFlag) { } void SoundManager::saveNotifierProc(bool postFlag) { - warning("TODO: SoundManager::saveNotifierProc"); + // Nothing needs to be done when saving the game } void SoundManager::loadNotifier(bool postFlag) { @@ -482,12 +547,37 @@ void SoundManager::loadNotifier(bool postFlag) { } void SoundManager::loadNotifierProc(bool postFlag) { - warning("TODO: SoundManager::loadNotifierProc"); + if (!postFlag) { + // Stop any currently playing sounds + if (__sndmgrReady) { + Common::StackLock slock(_serverDisabledMutex); + + for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ) { + Sound *s = *i; + ++i; + s->stop(); + } + } + } else { + // Savegame is now loaded, so iterate over the sound list to prime any sounds as necessary + for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) { + Sound *s = *i; + s->orientAfterRestore(); + } + } } void SoundManager::listenerSynchronize(Serializer &s) { s.validate("SoundManager"); - warning("TODO: SoundManager listenerSynchronise"); + assert(__sndmgrReady && _driversDetected); + + if (s.getVersion() < 6) + return; + + Common::StackLock slock(_serverDisabledMutex); + _playList.synchronize(s); + + _soundList.synchronize(s); } /*--------------------------------------------------------------------------*/ @@ -626,11 +716,11 @@ void SoundManager::_sfRethinkSoundDrivers() { byteVal = *groupData; groupData += 2; - for (idx = 0; idx < byteVal; ++idx) { + for (int entryIndez = 0; entryIndez < byteVal; ++entryIndez) { VoiceStructEntry ve; memset(&ve, 0, sizeof(VoiceStructEntry)); - ve._voiceNum = idx; + ve._voiceNum = entryIndez; ve._driver = driver; ve._type1._field4 = -1; ve._type1._field5 = 0; @@ -1128,8 +1218,7 @@ void SoundManager::_sfRethinkVoiceTypes() { if (!vse2._sound && (vse2._sound3 == sound) && (vse2._channelNum3 == channelNum)) { vse2._sound = sound; vse2._channelNum = channelNum; - vse._channelNum = vse2._channelNum2; - vse._priority = vse2._priority2; + vse2._priority = vse._priority2; vse._sound2 = NULL; break; } @@ -1150,7 +1239,7 @@ void SoundManager::_sfRethinkVoiceTypes() { vse2._sound = vse._sound2; vse2._channelNum = vse._channelNum2; vse2._priority = vse._priority2; - vse._field4 = -1; + vse2._field4 = -1; vse2._field5 = 0; vse2._field6 = 0; @@ -1175,7 +1264,7 @@ void SoundManager::_sfRethinkVoiceTypes() { SoundDriver *driver = vs->_entries[idx]._driver; assert(driver); - driver->updateVoice(voiceIndex); + driver->updateVoice(vs->_entries[idx]._voiceNum); } } } @@ -1188,7 +1277,7 @@ void SoundManager::_sfUpdateVolume(Sound *sound) { } void SoundManager::_sfDereferenceAll() { - // Orignal used handles for both the driver list and voiceStructPtrs list. This method then refreshed + // Orignal used handles for both the driver list and voiceTypeStructPtrs list. This method then refreshed // pointer lists based on the handles. Since in ScummVM we're just using pointers directly, this // method doesn't need any implementation } @@ -1273,11 +1362,10 @@ void SoundManager::_sfExtractGroupMask() { bool SoundManager::_sfInstallDriver(SoundDriver *driver) { if (!driver->open()) return false; - - driver->setUpdateCallback(_sfUpdateCallback, (void *)&sfManager()); + sfManager()._installedDrivers.push_back(driver); driver->_groupOffset = driver->getGroupData(); - driver->_groupMask = READ_LE_UINT32(driver->_groupOffset); + driver->_groupMask = driver->_groupOffset->groupMask; _sfExtractGroupMask(); _sfRethinkSoundDrivers(); @@ -1295,7 +1383,7 @@ void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { } void SoundManager::_sfInstallPatchBank(SoundDriver *driver, const byte *bankData) { - driver->installPatch(bankData, _vm->_memoryManager.getSize(bankData)); + driver->installPatch(bankData, g_vm->_memoryManager.getSize(bankData)); } /** @@ -1379,6 +1467,7 @@ Sound::Sound() { _fadeCounter = 0; _stopAfterFadeFlag = false; _timer = 0; + _newTimeIndex = 0; _loopTimer = 0; _trackInfo._numTracks = 0; _primed = false; @@ -1411,13 +1500,43 @@ Sound::~Sound() { stop(); } +void Sound::synchronize(Serializer &s) { + if (s.getVersion() < 6) + return; + + assert(!_remoteReceiver); + + s.syncAsSint16LE(_soundResID); + s.syncAsByte(_primed); + s.syncAsByte(_stoppedAsynchronously); + s.syncAsSint16LE(_group); + s.syncAsSint16LE(_sndResPriority); + s.syncAsSint16LE(_fixedPriority); + s.syncAsSint16LE(_sndResLoop); + s.syncAsSint16LE(_fixedLoop); + s.syncAsSint16LE(_priority); + s.syncAsSint16LE(_volume); + s.syncAsSint16LE(_loop); + s.syncAsSint16LE(_pausedCount); + s.syncAsSint16LE(_mutedCount); + s.syncAsSint16LE(_hold); + s.syncAsSint16LE(_cueValue); + s.syncAsSint16LE(_fadeDest); + s.syncAsSint16LE(_fadeSteps); + s.syncAsUint32LE(_fadeTicks); + s.syncAsUint32LE(_fadeCounter); + s.syncAsByte(_stopAfterFadeFlag); + s.syncAsUint32LE(_timer); + s.syncAsSint16LE(_loopTimer); +} + void Sound::play(int soundNum) { prime(soundNum); _soundManager->addToPlayList(this); } void Sound::stop() { - _globals->_soundManager.removeFromPlayList(this); + g_globals->_soundManager.removeFromPlayList(this); _unPrime(); } @@ -1436,11 +1555,12 @@ void Sound::_prime(int soundResID, bool dontQueue) { if (_primed) unPrime(); + _soundResID = soundResID; if (_soundResID != -1) { // Sound number specified _isEmpty = false; _remoteReceiver = NULL; - byte *soundData = _resourceManager->getResource(RES_SOUND, soundResID, 0); + byte *soundData = g_resourceManager->getResource(RES_SOUND, soundResID, 0); _soundManager->checkResVersion(soundData); _group = _soundManager->determineGroup(soundData); _sndResPriority = _soundManager->extractPriority(soundData); @@ -1448,7 +1568,7 @@ void Sound::_prime(int soundResID, bool dontQueue) { _soundManager->extractTrackInfo(&_trackInfo, soundData, _group); for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { - _channelData[idx] = _resourceManager->getResource(RES_SOUND, soundResID, _trackInfo._chunks[idx]); + _channelData[idx] = g_resourceManager->getResource(RES_SOUND, soundResID, _trackInfo._chunks[idx]); } DEALLOCATE(soundData); @@ -1501,12 +1621,13 @@ void Sound::orientAfterDriverChange() { _trackInfo._numTracks = 0; _primed = false; _prime(_soundResID, true); + setTimeIndex(timeIndex); } } void Sound::orientAfterRestore() { - if (_isEmpty) { + if (!_isEmpty) { int timeIndex = getTimeIndex(); _primed = false; _prime(_soundResID, true); @@ -1546,7 +1667,7 @@ bool Sound::isMuted() const { } void Sound::pause(bool flag) { - Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); + Common::StackLock slock(g_globals->_soundManager._serverSuspendedMutex); if (flag) ++_pausedCount; @@ -1557,7 +1678,7 @@ void Sound::pause(bool flag) { } void Sound::mute(bool flag) { - Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); + Common::StackLock slock(g_globals->_soundManager._serverSuspendedMutex); if (flag) ++_mutedCount; @@ -1568,7 +1689,7 @@ void Sound::mute(bool flag) { } void Sound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag) { - Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); + Common::StackLock slock(g_globals->_soundManager._serverSuspendedMutex); if (fadeDest > 127) fadeDest = 127; @@ -1585,11 +1706,8 @@ void Sound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeF } void Sound::setTimeIndex(uint32 timeIndex) { - if (_primed) { - mute(true); - _soSetTimeIndex(timeIndex); - mute(false); - } + if (_primed) + _newTimeIndex = timeIndex; } uint32 Sound::getTimeIndex() const { @@ -1665,12 +1783,13 @@ void Sound::_soPrimeSound(bool dontQueue) { } _timer = 0; + _newTimeIndex = 0; _loopTimer = 0; _soPrimeChannelData(); } void Sound::_soSetTimeIndex(uint timeIndex) { - Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); + Common::StackLock slock(g_globals->_soundManager._serverSuspendedMutex); if (timeIndex != _timer) { _soundManager->_soTimeIndexFlag = true; @@ -1685,6 +1804,8 @@ void Sound::_soSetTimeIndex(uint timeIndex) { _soundManager->_needToRethink = true; break; } + + --timeIndex; } _soundManager->_soTimeIndexFlag = false; @@ -1868,11 +1989,11 @@ void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { b &= 0x7f; if (channelNum != -1) { - if (voiceType == VOICETYPE_1) { + if (voiceType != VOICETYPE_0) { if (chFlags & 0x10) - _soProc42(vtStruct, channelNum, chVoiceType, v); + _soPlaySound2(vtStruct, channelData, channelNum, chVoiceType, v); else - _soProc32(vtStruct, channelNum, chVoiceType, v, b); + _soPlaySound(vtStruct, channelData, channelNum, chVoiceType, v, b); } else if (voiceNum != -1) { assert(driver); driver->proc20(voiceNum, chVoiceType); @@ -2040,7 +2161,7 @@ void Sound::_soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceTyp } } -void Sound::_soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0, int v1) { +void Sound::_soPlaySound(VoiceTypeStruct *vtStruct, const byte *channelData, int channelNum, VoiceType voiceType, int v0, int v1) { int entryIndex = _soFindSound(vtStruct, channelNum); if (entryIndex != -1) { SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; @@ -2050,11 +2171,11 @@ void Sound::_soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voice vtStruct->_entries[entryIndex]._type1._field4 = v0; vtStruct->_entries[entryIndex]._type1._field5 = 0; - driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, _chProgram[channelNum], v0, v1); + driver->playSound(channelData, 0, _chProgram[channelNum], vtStruct->_entries[entryIndex]._voiceNum, v0, v1); } } -void Sound::_soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0) { +void Sound::_soPlaySound2(VoiceTypeStruct *vtStruct, const byte *channelData, int channelNum, VoiceType voiceType, int v0) { for (int trackCtr = 0; trackCtr < _trackInfo._numTracks; ++trackCtr) { const byte *instrument = _channelData[trackCtr]; if ((*(instrument + 13) == v0) && (*instrument == 1)) { @@ -2063,13 +2184,15 @@ void Sound::_soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voice if (entryIndex != -1) { SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; assert(driver); + byte *trackData = _channelData[trackCtr]; vtStruct->_entries[entryIndex]._type1._field6 = 0; vtStruct->_entries[entryIndex]._type1._field4 = v0; vtStruct->_entries[entryIndex]._type1._field5 = 0; - driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, v0, 0x7F); - driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, voiceType, 0); + int v1, v2; + driver->playSound(trackData, 14, -1, vtStruct->_entries[entryIndex]._voiceNum, v0, 0x7F); + driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, voiceType, 0, &v1, &v2); } break; } @@ -2196,11 +2319,34 @@ void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) { vtStruct->_entries[entryIndex]._type1._field4 = *(channelData + 1); vtStruct->_entries[entryIndex]._type1._field5 = 0; - driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, *(channelData + 1), 0x7f); + int v1, v2; + driver->playSound(channelData, 14, -1, vtStruct->_entries[entryIndex]._voiceNum, *(channelData + 1), 0x7f); + driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, *(channelData + 1), _loop ? 1 : 0, + &v1, &v2); + _trkState[trackIndex] = 2; } } else { + for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { + VoiceStructEntry &vte = vtStruct->_entries[entryIndex]; + VoiceStructEntryType1 &vse = vte._type1; + if ((vse._sound == this) && (vse._channelNum == channel) && (vse._field4 == *(channelData + 1))) { + SoundDriver *driver = vte._driver; + + int isEnded, resetTimer; + driver->proc42(vte._voiceNum, vtStruct->_total, _loop ? 1 : 0, &isEnded, &resetTimer); + if (isEnded) { + _trkState[trackIndex] = 0; + } else if (resetTimer) { + _timer = 0; + } + return; + } + } + _trkState[trackIndex] = 0; } + } else { + _trkState[trackIndex] = 0; } } } @@ -2246,13 +2392,13 @@ int Sound::_soFindSound(VoiceTypeStruct *vtStruct, int channelNum) { ASound::ASound(): EventHandler() { _action = NULL; _cueValue = -1; - if (_globals) - _globals->_sounds.push_back(this); + if (g_globals) + g_globals->_sounds.push_back(this); } ASound::~ASound() { - if (_globals) - _globals->_sounds.remove(this); + if (g_globals) + g_globals->_sounds.remove(this); } void ASound::synchronize(Serializer &s) { @@ -2286,7 +2432,7 @@ void ASound::dispatch() { } } -void ASound::play(int soundNum, Action *action, int volume) { +void ASound::play(int soundNum, EventHandler *action, int volume) { _action = action; _cueValue = 0; @@ -2310,13 +2456,47 @@ void ASound::unPrime() { _action = NULL; } -void ASound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, Action *action) { +void ASound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, EventHandler *action) { if (action) _action = action; _sound.fade(fadeDest, fadeSteps, fadeTicks, stopAfterFadeFlag); } +void ASound::fadeSound(int soundNum) { + play(soundNum, NULL, 0); + fade(127, 5, 1, false, NULL); +} + +/*--------------------------------------------------------------------------*/ + +ASoundExt::ASoundExt(): ASound() { + _soundNum = 0; +} + +void ASoundExt::synchronize(Serializer &s) { + ASound::synchronize(s); + s.syncAsSint16LE(_soundNum); +} + +void ASoundExt::signal() { + if (_soundNum != 0) { + fadeSound(_soundNum); + } +} + +void ASoundExt::fadeOut2(EventHandler *action) { + fade(0, 10, 10, true, action); +} + +void ASoundExt::changeSound(int soundNum) { + if (isPlaying()) { + _soundNum = soundNum; + fadeOut2(this); + } else { + fadeSound(soundNum); + } +} /*--------------------------------------------------------------------------*/ @@ -2355,8 +2535,6 @@ const int v440D4[48] = { }; AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { - _upCb = NULL; - _upRef = NULL; _minVersion = 0x102; _maxVersion = 0x10A; _masterVolume = 0; @@ -2366,9 +2544,17 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { _groupData.v2 = 0; _groupData.pData = &adlib_group_data[0]; - _mixer = _vm->_mixer; + _mixer = g_vm->_mixer; _sampleRate = _mixer->getOutputRate(); - _opl = makeAdLibOPL(_sampleRate); + _opl = OPL::Config::create(); + assert(_opl); + _opl->init(_sampleRate); + + _samplesTillCallback = 0; + _samplesTillCallbackRemainder = 0; + _samplesPerCallback = getRate() / CALLBACKS_PER_SECOND; + _samplesPerCallbackRemainder = getRate() % CALLBACKS_PER_SECOND; + _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); Common::set_to(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false); @@ -2387,7 +2573,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { AdlibSoundDriver::~AdlibSoundDriver() { DEALLOCATE(_patchData); _mixer->stopHandle(_soundHandle); - OPLDestroy(_opl); + delete _opl; } bool AdlibSoundDriver::open() { @@ -2413,10 +2599,7 @@ void AdlibSoundDriver::close() { bool AdlibSoundDriver::reset() { write(1, 0x20); - write(4, 0x80); - - write(2, 1); - write(4, 1); + write(1, 0x20); return true; } @@ -2441,7 +2624,7 @@ int AdlibSoundDriver::setMasterVolume(int volume) { return oldVolume; } -void AdlibSoundDriver::proc32(int channel, int program, int v0, int v1) { +void AdlibSoundDriver::playSound(const byte *channelData, int dataOffset, int program, int channel, int v0, int v1) { if (program == -1) return; @@ -2500,7 +2683,16 @@ void AdlibSoundDriver::setPitch(int channel, int pitchBlend) { void AdlibSoundDriver::write(byte reg, byte value) { _portContents[reg] = value; - OPLWriteReg(_opl, reg, value); + _queue.push(RegisterValue(reg, value)); +} + +void AdlibSoundDriver::flush() { + Common::StackLock slock(SoundManager::sfManager()._serverDisabledMutex); + + while (!_queue.empty()) { + RegisterValue v = _queue.pop(); + _opl->writeReg(v._regNum, v._value); + } } void AdlibSoundDriver::updateChannelVolume(int channelNum) { @@ -2624,33 +2816,138 @@ void AdlibSoundDriver::setFrequency(int channel) { } int AdlibSoundDriver::readBuffer(int16 *buffer, const int numSamples) { - update(buffer, numSamples); + Common::StackLock slock1(SoundManager::sfManager()._serverDisabledMutex); + Common::StackLock slock2(SoundManager::sfManager()._serverSuspendedMutex); + + int32 samplesLeft = numSamples; + memset(buffer, 0, sizeof(int16) * numSamples); + while (samplesLeft) { + if (!_samplesTillCallback) { + SoundManager::_sfUpdateCallback(NULL); + flush(); + + _samplesTillCallback = _samplesPerCallback; + _samplesTillCallbackRemainder += _samplesPerCallbackRemainder; + if (_samplesTillCallbackRemainder >= CALLBACKS_PER_SECOND) { + _samplesTillCallback++; + _samplesTillCallbackRemainder -= CALLBACKS_PER_SECOND; + } + } + + int32 render = MIN<int>(samplesLeft, _samplesTillCallback); + samplesLeft -= render; + _samplesTillCallback -= render; + + _opl->readBuffer(buffer, render); + buffer += render; + } return numSamples; } -void AdlibSoundDriver::update(int16 *buf, int len) { - static int samplesLeft = 0; - while (len != 0) { - int count = samplesLeft; - if (count > len) { - count = len; - } - samplesLeft -= count; - len -= count; - YM3812UpdateOne(_opl, buf, count); - if (samplesLeft == 0) { - if (_upCb) { - (*_upCb)(_upRef); - } - samplesLeft = _sampleRate / 50; - } - buf += count; +/*--------------------------------------------------------------------------*/ + + +SoundBlasterDriver::SoundBlasterDriver(): SoundDriver() { + _minVersion = 0x102; + _maxVersion = 0x10A; + _masterVolume = 0; + + _groupData.groupMask = 1; + _groupData.v1 = 0x3E; + _groupData.v2 = 0; + static byte const group_data[] = { 3, 1, 1, 0, 0xff }; + _groupData.pData = group_data; + + _mixer = g_vm->_mixer; + _sampleRate = _mixer->getOutputRate(); + _audioStream = NULL; + _channelData = NULL; +} + +SoundBlasterDriver::~SoundBlasterDriver() { + _mixer->stopHandle(_soundHandle); +} + +bool SoundBlasterDriver::open() { + return true; +} + +void SoundBlasterDriver::close() { +} + +bool SoundBlasterDriver::reset() { + return true; +} + +const GroupData *SoundBlasterDriver::getGroupData() { + return &_groupData; +} + +int SoundBlasterDriver::setMasterVolume(int volume) { + int oldVolume = _masterVolume; + _masterVolume = volume; + + return oldVolume; +} + +void SoundBlasterDriver::playSound(const byte *channelData, int dataOffset, int program, int channel, int v0, int v1) { + if (program != -1) + return; + + assert(channel == 0); + + // If sound data has been previously set, then release it + if (_channelData) + updateVoice(channel); + + // Set the new channel data + _channelData = channelData + dataOffset; + + // Make a copy of the buffer + int dataSize = g_vm->_memoryManager.getSize(channelData); + byte *soundData = (byte *)malloc(dataSize - dataOffset); + Common::copy(_channelData, _channelData + (dataSize - dataOffset), soundData); + + _audioStream = Audio::makeQueuingAudioStream(11025, false); + _audioStream->queueBuffer(soundData, dataSize - dataOffset, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED); + + // Start the new sound + if (!_mixer->isSoundHandleActive(_soundHandle)) + _mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, _audioStream); +} + +void SoundBlasterDriver::updateVoice(int channel) { + // Stop the playing voice + if (_mixer->isSoundHandleActive(_soundHandle)) + _mixer->stopHandle(_soundHandle); + + _audioStream = NULL; + _channelData = NULL; +} + +void SoundBlasterDriver::proc38(int channel, int cmd, int value) { + if (cmd == 7) { + // Set channel volume + _channelVolume = value; + _mixer->setChannelVolume(_soundHandle, (byte)MIN(255, value * 2)); } } -void AdlibSoundDriver::setUpdateCallback(UpdateCallback upCb, void *ref) { - _upCb = upCb; - _upRef = ref; +void SoundBlasterDriver::proc42(int channel, int cmd, int value, int *v1, int *v2) { + // TODO: v2 is used for flagging a reset of the timer. I'm not sure if it's needed + *v1 = 0; + *v2 = 0; + + // Note: Checking whether a playing Fx sound had finished was originally done in another + // method in the sample playing code. But since we're using the ScummVM audio soundsystem, + // it's easier simply to do the check right here + if (_audioStream && (_audioStream->numQueuedStreams() == 0)) { + updateVoice(channel); + } + + if (!_channelData) + // Flag that sound isn't playing + *v1 = 1; } -} // End of namespace tSage +} // End of namespace TsAGE diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 9a8cfb3cfc..2c5d2ac951 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -25,6 +25,7 @@ #include "common/scummsys.h" #include "common/mutex.h" +#include "common/queue.h" #include "audio/audiostream.h" #include "audio/fmopl.h" #include "audio/mixer.h" @@ -32,13 +33,15 @@ #include "tsage/saveload.h" #include "tsage/core.h" -namespace tSage { +namespace TsAGE { class Sound; #define SOUND_ARR_SIZE 16 #define ROLAND_DRIVER_NUM 2 #define ADLIB_DRIVER_NUM 3 +#define SBLASTER_DRIVER_NUM 4 +#define CALLBACKS_PER_SECOND 60 struct trackInfoStruct { int _numTracks; @@ -65,6 +68,15 @@ struct GroupData { const byte *pData; }; +struct RegisterValue { + uint8 _regNum; + uint8 _value; + + RegisterValue(int regNum, int value) { + _regNum = regNum; _value = value; + } +}; + class SoundDriver { public: Common::String _shortDescription, _longDescription; @@ -73,10 +85,6 @@ public: uint32 _groupMask; const GroupData *_groupOffset; int _driverResID; - - typedef void (*UpdateCallback)(void *); - UpdateCallback _upCb; - void *_upRef; public: SoundDriver(); virtual ~SoundDriver() {}; @@ -100,14 +108,12 @@ public: virtual void setProgram(int channel, int program) {} // Method #13 virtual void setVolume1(int channel, int v2, int v3, int volume) {} virtual void setPitchBlend(int channel, int pitchBlend) {} // Method #15 - virtual void proc32(int channel, int program, int v0, int v1) {}// Method #16 + virtual void playSound(const byte *channelData, int dataOffset, int program, int channel, int v0, int v1) {}// Method #16 virtual void updateVoice(int channel) {} // Method #17 virtual void proc36() {} // Method #18 virtual void proc38(int channel, int cmd, int value) {} // Method #19 virtual void setPitch(int channel, int pitchBlend) {} // Method #20 - virtual void proc42(int channel, int v0, int v1) {} // Method #21 - - virtual void setUpdateCallback(UpdateCallback upCb, void *ref) {} + virtual void proc42(int channel, int cmd, int value, int *v1, int *v2) {} // Method #21 }; struct VoiceStructEntryType0 { @@ -123,7 +129,6 @@ struct VoiceStructEntryType0 { int _channelNum3; int _priority3; int _field1A; - int _field1B; }; struct VoiceStructEntryType1 { @@ -166,7 +171,7 @@ private: public: bool __sndmgrReady; int _ourSndResVersion, _ourDrvResVersion; - Common::List<Sound *> _playList; + SynchronizedList<Sound *> _playList; Common::List<SoundDriver *> _installedDrivers; VoiceTypeStruct *_voiceTypeStructPtrs[SOUND_ARR_SIZE]; uint32 _groupsAvail; @@ -174,9 +179,8 @@ public: int _newVolume; Common::Mutex _serverDisabledMutex; Common::Mutex _serverSuspendedMutex; - int _suspendedCount; bool _driversDetected; - Common::List<Sound *> _soundList; + SynchronizedList<Sound *> _soundList; Common::List<SoundDriverEntry> _availableDrivers; bool _needToRethink; // Misc flags @@ -221,6 +225,7 @@ public: int getMasterVol() const; void loadSound(int soundNum, bool showErrors); void unloadSound(int soundNum); + bool isFading(); // _sf methods static SoundManager &sfManager(); @@ -255,7 +260,6 @@ class Sound: public EventHandler { private: void _prime(int soundResID, bool dontQueue); void _unPrime(); - void orientAfterRestore(); public: bool _stoppedAsynchronously; int _soundResID; @@ -276,7 +280,8 @@ public: int _fadeTicks; int _fadeCounter; bool _stopAfterFadeFlag; - uint _timer; + uint32 _timer; + uint32 _newTimeIndex; int _loopTimer; int _chProgram[SOUND_ARR_SIZE]; int _chModulation[SOUND_ARR_SIZE]; @@ -306,6 +311,9 @@ public: Sound(); ~Sound(); + void synchronize(Serializer &s); + void orientAfterRestore(); + void play(int soundResID); void stop(); void prime(int soundResID); @@ -342,8 +350,8 @@ public: void _soRemoteReceive(); void _soServiceTrackType0(int trackIndex, const byte *channelData); void _soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceType mode, int v0); - void _soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0, int v1); - void _soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0); + void _soPlaySound(VoiceTypeStruct *vtStruct, const byte *channelData, int channelNum, VoiceType voiceType, int v0, int v1); + void _soPlaySound2(VoiceTypeStruct *vtStruct, const byte *channelData, int channelNum, VoiceType voiceType, int v0); void _soProc38(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int cmd, int value); void _soProc40(VoiceTypeStruct *vtStruct, int channelNum, int pitchBlend); void _soDoTrackCommand(int channelNum, int command, int value); @@ -357,7 +365,7 @@ public: class ASound: public EventHandler { public: Sound _sound; - Action *_action; + EventHandler *_action; int _cueValue; ASound(); @@ -365,7 +373,7 @@ public: virtual void synchronize(Serializer &s); virtual void dispatch(); - void play(int soundNum, Action *action = NULL, int volume = 127); + void play(int soundNum, EventHandler *action = NULL, int volume = 127); void stop(); void prime(int soundNum, Action *action = NULL); void unPrime(); @@ -377,7 +385,7 @@ public: bool isMuted() const { return _sound.isMuted(); } void pause(bool flag) { _sound.pause(flag); } void mute(bool flag) { _sound.mute(flag); } - void fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, Action *action); + void fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, EventHandler *action); void fadeIn() { fade(127, 5, 10, false, NULL); } void fadeOut(Action *action) { fade(0, 5, 10, true, action); } void setTimeIndex(uint32 timeIndex) { _sound.setTimeIndex(timeIndex); } @@ -390,8 +398,23 @@ public: int getVol() const { return _sound.getVol(); } void holdAt(int v) { _sound.holdAt(v); } void release() { _sound.release(); } + void fadeSound(int soundNum); }; +class ASoundExt: public ASound { +public: + int _soundNum; + + ASoundExt(); + void fadeOut2(EventHandler *action); + void changeSound(int soundNum); + + virtual Common::String getClassName() { return "ASoundExt"; } + virtual void synchronize(Serializer &s); + virtual void signal(); +}; + + #define ADLIB_CHANNEL_COUNT 9 class AdlibSoundDriver: public SoundDriver, Audio::AudioStream { @@ -404,6 +427,11 @@ private: byte _portContents[256]; const byte *_patchData; int _masterVolume; + Common::Queue<RegisterValue> _queue; + int _samplesTillCallback; + int _samplesTillCallbackRemainder; + int _samplesPerCallback; + int _samplesPerCallbackRemainder; bool _channelVoiced[ADLIB_CHANNEL_COUNT]; int _channelVolume[ADLIB_CHANNEL_COUNT]; @@ -417,6 +445,7 @@ private: void write(byte reg, byte value); + void flush(); void updateChannelVolume(int channel); void setVoice(int channel); void clearVoice(int channel); @@ -432,11 +461,10 @@ public: virtual const GroupData *getGroupData(); virtual void installPatch(const byte *data, int size); virtual int setMasterVolume(int volume); - virtual void proc32(int channel, int program, int v0, int v1); + virtual void playSound(const byte *channelData, int dataOffset, int program, int channel, int v0, int v1); virtual void updateVoice(int channel); virtual void proc38(int channel, int cmd, int value); virtual void setPitch(int channel, int pitchBlend); - virtual void setUpdateCallback(UpdateCallback upCb, void *ref); // AudioStream interface virtual int readBuffer(int16 *buffer, const int numSamples); @@ -447,6 +475,33 @@ public: void update(int16 *buf, int len); }; -} // End of namespace tSage +class SoundBlasterDriver: public SoundDriver { +private: + GroupData _groupData; + Audio::Mixer *_mixer; + Audio::SoundHandle _soundHandle; + Audio::QueuingAudioStream *_audioStream; + int _sampleRate; + + byte _masterVolume; + byte _channelVolume; + const byte *_channelData; +public: + SoundBlasterDriver(); + virtual ~SoundBlasterDriver(); + + virtual bool open(); + virtual void close(); + virtual bool reset(); + virtual const GroupData *getGroupData(); + virtual int setMasterVolume(int volume); + virtual void playSound(const byte *channelData, int dataOffset, int program, int channel, int v0, int v1); + virtual void updateVoice(int channel); + virtual void proc38(int channel, int cmd, int value); + virtual void proc42(int channel, int cmd, int value, int *v1, int *v2); +}; + + +} // End of namespace TsAGE #endif diff --git a/engines/tsage/staticres.cpp b/engines/tsage/staticres.cpp index 9f36268ce3..c98d9d2e53 100644 --- a/engines/tsage/staticres.cpp +++ b/engines/tsage/staticres.cpp @@ -22,7 +22,7 @@ #include "tsage/staticres.h" -namespace tSage { +namespace TsAGE { const byte CURSOR_ARROW_DATA[] = { 15, 0, 15, 0, 0, 0, 0, 0, 9, 0, @@ -72,13 +72,8 @@ const char *DEFAULT_SCENE_HOTSPOT = "That accomplishes nothing."; const char *SAVE_ERROR_MSG = "Error occurred saving game. Please do not try to restore this game!"; const char *SAVING_NOT_ALLOWED_MSG = "Saving is not allowed at this time."; const char *RESTORING_NOT_ALLOWED_MSG = "Restoring is not allowed at this time."; -const char *RESTART_CONFIRM_MSG = "Do you want to restart your game?"; -const char *WATCH_INTRO_MSG = "Do you wish to watch the introduction?"; const char *INV_EMPTY_MSG = "You have nothing in your possesion."; -const char *HELP_MSG = "Ringworld\rRevenge of the Patriarch\x14\rScummVM Version\r\r\ -\x01 Keyboard shortcuts...\rF2 - Sound options\rF3 - Quit\r\ -F4 - Restart\rF5 - Save game\rF7 - Restore Game\rF10 - Pause game"; const char *QUIT_CONFIRM_MSG = "Do you want to quit playing this game?"; const char *RESTART_MSG = "Do you want to restart this game?"; const char *GAME_PAUSED_MSG = "Game is paused."; @@ -93,9 +88,19 @@ const char *SOUND_BTN_STRING = "Sound"; const char *RESUME_BTN_STRING = " Resume \rplay"; const char *LOOK_BTN_STRING = "Look"; const char *PICK_BTN_STRING = "Pick"; + + +namespace Ringworld { + +// Dialog resources +const char *HELP_MSG = "Ringworld\rRevenge of the Patriarch\x14\rScummVM Version\r\r\ +\x01 Keyboard shortcuts...\rF2 - Sound options\rF3 - Quit\r\ +F4 - Restart\rF5 - Save game\rF7 - Restore Game\rF10 - Pause game"; +const char *WATCH_INTRO_MSG = "Do you wish to watch the introduction?"; const char *START_PLAY_BTN_STRING = " Start Play "; const char *INTRODUCTION_BTN_STRING = "Introduction"; +// Scene specific resources const char *EXIT_MSG = " EXIT "; const char *SCENE6100_CAREFUL = "Be careful! The probe cannot handle too much of that."; const char *SCENE6100_TOUGHER = "Hey! This is tougher than it looks!"; @@ -118,4 +123,61 @@ const char *EXIT_BTN_STRING = "Exit"; const char *DEMO_BTN_STRING = "Demo"; const char *DEMO_RESUME_BTN_STRING = "Resume"; -} // End of namespace tSage +} // End of namespace Ringworld + +namespace BlueForce { + +// Dialog resources +const char *HELP_MSG = "Blue Force\x14\rScummVM Version\r\r\ +Keyboard shortcuts...\rF2 - Sound options\rF3 - Quit\r\ +F4 - Restart\rF5 - Save game\rF7 - Restore Game\rF10 - Pause game"; +const char *WATCH_INTRO_MSG = "Do you wish to watch the introduction?"; +const char *START_PLAY_BTN_STRING = " Play "; +const char *INTRODUCTION_BTN_STRING = " Watch "; + +// Blue Force general messages +const char *BF_NAME = "Blue Force"; +const char *BF_COPYRIGHT = " Copyright, 1993 Tsunami Media, Inc."; +const char *BF_ALL_RIGHTS_RESERVED = "All Rights Reserved"; +const char *BF_19840518 = "May 18, 1984"; +const char *BF_19840515 = "May 15, 1984"; +const char *BF_3_DAYS = "Three days later"; +const char *BF_11_YEARS = "Eleven years later."; +const char *BF_NEXT_DAY = "The Next Day"; +const char *BF_ACADEMY = "Here we are at the Academy"; + +// Scene 50 hotspots +const char *GRANDMA_FRANNIE = "Grandma Frannie"; +const char *MARINA = "Marina"; +const char *POLICE_DEPARTMENT = "Police Department"; +const char *TONYS_BAR = "Tony's Bar"; +const char *CHILD_PROTECTIVE_SERVICES = "Child Protective Services"; +const char *ALLEY_CAT = "Alley Cat"; +const char *CITY_HALL_JAIL = "City Hall & Jail"; +const char *JAMISON_RYAN = "Jamison & Ryan"; +const char *BIKINI_HUT = "Bikini Hut"; + +// Scene 60 radio messages +const char *RADIO_BTN_LIST[8] = { "10-2 ", "10-4 ", "10-13", "10-15", "10-27", "10-35", "10-97", "10-98" }; + +// Scene 570 computer messageS +const char *SCENE570_PASSWORD = "PASSWORD -> "; +const char *SCENE570_C_DRIVE = "C:\\"; +const char *SCENE570_RING = "RING"; +const char *SCENE570_PROTO = "PROTO"; +const char *SCENE570_WACKY = "WACKY"; +const char *SCENE570_COBB = "COBB"; +const char *SCENE570_LETTER = "LETTER"; +const char *SCENE570_RINGEXE = "RINGEXE"; +const char *SCENE570_RINGDATA = "RINGDATA"; +const char *SCENE570_PROTOEXE = "PROTOEXE"; +const char *SCENE570_PROTODATA = "PROTODATA"; +const char *SCENE570_WACKYEXE = "WACKYEXE"; +const char *SCENE570_WACKYDATA = "WACKYDATA"; + +// Scene 180 messages +const char *THE_NEXT_DAY = "The Next Day"; + +} // End of namespace BlueForce + +} // End of namespace TsAGE diff --git a/engines/tsage/staticres.h b/engines/tsage/staticres.h index fa93511779..203fa1481d 100644 --- a/engines/tsage/staticres.h +++ b/engines/tsage/staticres.h @@ -25,7 +25,7 @@ #include "common/scummsys.h" -namespace tSage { +namespace TsAGE { extern const byte CURSOR_ARROW_DATA[]; @@ -39,11 +39,8 @@ extern const char *DEFAULT_SCENE_HOTSPOT; extern const char *SAVE_ERROR_MSG; extern const char *SAVING_NOT_ALLOWED_MSG; extern const char *RESTORING_NOT_ALLOWED_MSG; -extern const char *RESTART_CONFIRM_MSG; -extern const char *WATCH_INTRO_MSG; // Dialogs -extern const char *HELP_MSG; extern const char *QUIT_CONFIRM_MSG; extern const char *RESTART_MSG; extern const char *GAME_PAUSED_MSG; @@ -59,6 +56,12 @@ extern const char *RESUME_BTN_STRING; extern const char *LOOK_BTN_STRING; extern const char *PICK_BTN_STRING; extern const char *INV_EMPTY_MSG; + +namespace Ringworld { + +// Dialog resources +extern const char *HELP_MSG; +extern const char *WATCH_INTRO_MSG; extern const char *START_PLAY_BTN_STRING; extern const char *INTRODUCTION_BTN_STRING; @@ -86,6 +89,60 @@ extern const char *EXIT_BTN_STRING; extern const char *DEMO_BTN_STRING; extern const char *DEMO_RESUME_BTN_STRING; -} // End of namespace tSage +} // End of namespace Ringworld + +namespace BlueForce { + +// Dialog resources +extern const char *HELP_MSG; +extern const char *WATCH_INTRO_MSG; +extern const char *START_PLAY_BTN_STRING; +extern const char *INTRODUCTION_BTN_STRING; + +// Blue Force messages +extern const char *BF_NAME; +extern const char *BF_COPYRIGHT; +extern const char *BF_ALL_RIGHTS_RESERVED; +extern const char *BF_19840518; +extern const char *BF_19840515; +extern const char *BF_3_DAYS; +extern const char *BF_11_YEARS; +extern const char *BF_NEXT_DAY; +extern const char *BF_ACADEMY; + +// Scene 50 tooltips +extern const char *GRANDMA_FRANNIE; +extern const char *MARINA; +extern const char *POLICE_DEPARTMENT; +extern const char *TONYS_BAR; +extern const char *CHILD_PROTECTIVE_SERVICES; +extern const char *ALLEY_CAT; +extern const char *CITY_HALL_JAIL; +extern const char *JAMISON_RYAN; +extern const char *BIKINI_HUT; + +extern const char *SCENE570_PASSWORD; +extern const char *SCENE570_C_DRIVE; +extern const char *SCENE570_RING; +extern const char *SCENE570_PROTO; +extern const char *SCENE570_WACKY; +extern const char *SCENE570_COBB; +extern const char *SCENE570_LETTER; +extern const char *SCENE570_RINGEXE; +extern const char *SCENE570_RINGDATA; +extern const char *SCENE570_PROTOEXE; +extern const char *SCENE570_PROTODATA; +extern const char *SCENE570_WACKYEXE; +extern const char *SCENE570_WACKYDATA; + +// Scene 60 radio dispatch buttons +extern const char *RADIO_BTN_LIST[8]; + +// Scene 180 message +extern const char *THE_NEXT_DAY; + +} // End of namespace BlueForce + +} // End of namespace TsAGE #endif diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 41f3d58897..7e7198fc2b 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -30,13 +30,13 @@ #include "tsage/resources.h" #include "tsage/globals.h" -namespace tSage { +namespace TsAGE { -TSageEngine *_vm = NULL; +TSageEngine *g_vm = NULL; TSageEngine::TSageEngine(OSystem *system, const tSageGameDescription *gameDesc) : Engine(system), _gameDescription(gameDesc) { - _vm = this; + g_vm = this; DebugMan.addDebugChannel(kRingDebugScripts, "scripts", "Scripts debugging"); _debugger = new Debugger(); } @@ -61,45 +61,64 @@ bool TSageEngine::hasFeature(EngineFeature f) const { } void TSageEngine::initialize() { - _saver = new Saver(); + g_saver = new Saver(); // Set up the resource manager - _resourceManager = new ResourceManager(); - if (_vm->getFeatures() & GF_DEMO) { + g_resourceManager = new ResourceManager(); + if (g_vm->getFeatures() & GF_DEMO) { // Add the single library file associated with the demo - _resourceManager->addLib(getPrimaryFilename()); - } else if (_vm->getGameID() == GType_Ringworld) { - _resourceManager->addLib("RING.RLB"); - _resourceManager->addLib("TSAGE.RLB"); - } else if (_vm->getGameID() == GType_BlueForce) { - _resourceManager->addLib("BLUE.RLB"); - if (_vm->getFeatures() & GF_FLOPPY) { - _resourceManager->addLib("FILES.RLB"); - _resourceManager->addLib("TSAGE.RLB"); + g_resourceManager->addLib(getPrimaryFilename()); + g_globals = new Globals(); + + } else if (g_vm->getGameID() == GType_Ringworld) { + g_resourceManager->addLib("RING.RLB"); + g_resourceManager->addLib("TSAGE.RLB"); + g_globals = new Globals(); + + } else if (g_vm->getGameID() == GType_BlueForce) { + g_resourceManager->addLib("BLUE.RLB"); + if (g_vm->getFeatures() & GF_FLOPPY) { + g_resourceManager->addLib("FILES.RLB"); + g_resourceManager->addLib("TSAGE.RLB"); } + g_globals = new BlueForce::BlueForceGlobals(); + + // Setup the user interface + T2_GLOBALS._uiElements.setup(Common::Point(0, UI_INTERFACE_Y - 2)); + + // Reset all global variables + BF_GLOBALS.reset(); + } else if (g_vm->getGameID() == GType_Ringworld2) { + g_resourceManager->addLib("R2RW.RLB"); + g_globals = new Ringworld2::Ringworld2Globals(); + + // Setup the user interface + T2_GLOBALS._uiElements.setup(Common::Point(0, UI_INTERFACE_Y - 2)); + + // Reset all global variables + R2_GLOBALS.reset(); } - _globals = new Globals(); - _globals->gfxManager().setDefaults(); + g_globals->gfxManager().setDefaults(); // Setup sound settings syncSoundSettings(); } void TSageEngine::deinitialize() { - delete _globals; - delete _resourceManager; - delete _saver; - _resourceManager = NULL; - _saver = NULL; + delete g_globals; + delete g_resourceManager; + delete g_saver; + g_resourceManager = NULL; + g_saver = NULL; } Common::Error TSageEngine::run() { // Basic initialisation initialize(); - _globals->_sceneHandler.registerHandler(); - _globals->_game->execute(); + g_globals->_sceneHandler->registerHandler(); + g_globals->_game->execute(); deinitialize(); return Common::kNoError; @@ -109,28 +128,28 @@ Common::Error TSageEngine::run() { * Returns true if it is currently okay to restore a game */ bool TSageEngine::canLoadGameStateCurrently() { - return (_globals->getFlag(50) == 0); + return (g_globals != NULL) && (g_globals->_game != NULL) && g_globals->_game->canLoadGameStateCurrently(); } /** * Returns true if it is currently okay to save the game */ bool TSageEngine::canSaveGameStateCurrently() { - return (_globals->getFlag(50) == 0); + return (g_globals != NULL) && (g_globals->_game != NULL) && g_globals->_game->canSaveGameStateCurrently(); } /** * Load the savegame at the specified slot index */ Common::Error TSageEngine::loadGameState(int slot) { - return _saver->restore(slot); + return g_saver->restore(slot); } /** * Save the game to the given slot index, and with the given name */ Common::Error TSageEngine::saveGameState(int slot, const Common::String &desc) { - return _saver->save(slot, desc); + return g_saver->save(slot, desc); } /** @@ -144,7 +163,11 @@ Common::String TSageEngine::generateSaveName(int slot) { void TSageEngine::syncSoundSettings() { Engine::syncSoundSettings(); - _globals->_soundManager.syncSounds(); + g_globals->_soundManager.syncSounds(); } -} // End of namespace tSage +bool TSageEngine::shouldQuit() { + return getEventManager()->shouldQuit() || getEventManager()->shouldRTL(); +} + +} // End of namespace TsAGE diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h index f004c7f625..eb36cf0790 100644 --- a/engines/tsage/tsage.h +++ b/engines/tsage/tsage.h @@ -36,11 +36,12 @@ #include "tsage/resources.h" -namespace tSage { +namespace TsAGE { enum { GType_Ringworld = 0, - GType_BlueForce = 1 + GType_BlueForce = 1, + GType_Ringworld2 = 2 }; enum { @@ -62,6 +63,7 @@ struct tSageGameDescription; #define SCREEN_HEIGHT 200 #define SCREEN_CENTER_X 160 #define SCREEN_CENTER_Y 100 +#define UI_INTERFACE_Y 168 class TSageEngine : public Engine { private: @@ -78,6 +80,7 @@ public: uint32 getGameID() const; uint32 getFeatures() const; Common::String getPrimaryFilename() const; + bool shouldQuit(); virtual Common::Error init(); virtual Common::Error run(); @@ -92,12 +95,12 @@ public: void deinitialize(); }; -extern TSageEngine *_vm; +extern TSageEngine *g_vm; -#define ALLOCATE_HANDLE(x) _vm->_memoryManager.allocate(x) -#define ALLOCATE(x) _vm->_memoryManager.allocate2(x) -#define DEALLOCATE(x) _vm->_memoryManager.deallocate(x) +#define ALLOCATE_HANDLE(x) g_vm->_memoryManager.allocate(x) +#define ALLOCATE(x) g_vm->_memoryManager.allocate2(x) +#define DEALLOCATE(x) g_vm->_memoryManager.deallocate(x) -} // End of namespace tSage +} // End of namespace TsAGE #endif diff --git a/engines/tsage/user_interface.cpp b/engines/tsage/user_interface.cpp new file mode 100644 index 0000000000..b7f96b3806 --- /dev/null +++ b/engines/tsage/user_interface.cpp @@ -0,0 +1,529 @@ +/* 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/user_interface.h" +#include "tsage/core.h" +#include "tsage/tsage.h" +#include "tsage/blue_force/blueforce_dialogs.h" +#include "tsage/blue_force/blueforce_logic.h" + +namespace TsAGE { + +void StripProxy::process(Event &event) { + if (_action) + _action->process(event); +} + +/*--------------------------------------------------------------------------*/ + +void UIElement::synchronize(Serializer &s) { + BackgroundSceneObject::synchronize(s); + s.syncAsSint16LE(_field88); + s.syncAsSint16LE(_enabled); + s.syncAsSint16LE(_frameNum); +} + +void UIElement::setup(int visage, int stripNum, int frameNum, int posX, int posY, int priority) { + _field88 = 0; + _frameNum = frameNum; + _enabled = true; + + SceneObject::setup(visage, stripNum, frameNum, posX, posY, priority); +} + +void UIElement::setEnabled(bool flag) { + if (_enabled != flag) { + _enabled = flag; + setFrame(_enabled ? _frameNum : _frameNum + 2); + } +} + +/*--------------------------------------------------------------------------*/ + +void UIQuestion::process(Event &event) { + if (event.eventType == EVENT_BUTTON_DOWN) { + CursorType currentCursor = GLOBALS._events.getCursor(); + GLOBALS._events.hideCursor(); + showDescription(currentCursor); + + event.handled = true; + } +} + +void UIQuestion::showDescription(CursorType cursor) { + if (cursor == INV_FOREST_RAP) { + // Forest rap item has a graphical display + showItem(5, 1, 1); + } else { + // Display object description + SceneItem::display2(9001, (int)cursor); + } +} + +void UIQuestion::setEnabled(bool flag) { + if (_enabled != flag) { + UIElement::setEnabled(flag); + T2_GLOBALS._uiElements.draw(); + } +} + +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, xp, 180, 255); + _digit3.reposition(); + xp += 7; + _digit2.setup(1, 6, 1, xp, 180, 255); + _digit2.reposition(); + xp += 7; + _digit1.setup(1, 6, 1, xp, 180, 255); + _digit1.reposition(); + xp += 7; + _digit0.setup(1, 6, 1, xp, 180, 255); + _digit0.reposition(); +} + +void UIScore::draw() { + _digit3.draw(); + _digit2.draw(); + _digit1.draw(); + _digit0.draw(); +} + +void UIScore::updateScore() { + int score = T2_GLOBALS._uiElements._scoreValue; + + _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; + + // Check if game has a select item handler, and if so, give it a chance to check + // whether something special happens when the item is selected + if (!T2_GLOBALS._onSelectItem || !T2_GLOBALS._onSelectItem((CursorType)_objIndex)) + _object->setCursor(); + } +} + +/*--------------------------------------------------------------------------*/ + +UIInventoryScroll::UIInventoryScroll() { + _isLeft = false; +} + +void UIInventoryScroll::synchronize(Serializer &s) { + UIElement::synchronize(s); + s.syncAsSint16LE(_isLeft); +} + +void UIInventoryScroll::process(Event &event) { + 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 + T2_GLOBALS._uiElements.scrollInventory(_isLeft); + event.handled = true; + break; + default: + break; + } +} + +void UIInventoryScroll::toggle(bool pressed) { + if (_enabled) { + setFrame(pressed ? (_frameNum + 1) : _frameNum); + T2_GLOBALS._uiElements.draw(); + } +} + +/*--------------------------------------------------------------------------*/ + +UICollection::UICollection(): EventHandler() { + _clearScreen = false; + _visible = false; + _cursorChanged = false; +} + +void UICollection::setup(const Common::Point &pt) { + _position = pt; + _bounds.left = _bounds.right = pt.x; + _bounds.top = _bounds.bottom = pt.y; +} + +void UICollection::hide() { + erase(); + _visible = false; +} + +void UICollection::show() { + _visible = true; + draw(); +} + +void UICollection::erase() { + if (_clearScreen) { + Rect tempRect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT); + BF_GLOBALS._screenSurface.fillRect(tempRect, 0); + BF_GLOBALS._sceneManager._scene->_backSurface.fillRect(tempRect, 0); + _clearScreen = false; + } +} + +void UICollection::resetClear() { + _clearScreen = false; +} + +void UICollection::draw() { + if (_visible) { + // Temporarily reset the sceneBounds when drawing UI elements to force them on-screen + Rect savedBounds = g_globals->_sceneManager._scene->_sceneBounds; + g_globals->_sceneManager._scene->_sceneBounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + + // Draw the elements onto the background + for (uint idx = 0; idx < _objList.size(); ++idx) + _objList[idx]->draw(); + + // Draw the resulting UI onto the screen + BF_GLOBALS._screenSurface.copyFrom(BF_GLOBALS._sceneManager._scene->_backSurface, + Rect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT), + Rect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT)); + + _clearScreen = 1; + g_globals->_sceneManager._scene->_sceneBounds = savedBounds; + } +} + +/*--------------------------------------------------------------------------*/ + +UIElements::UIElements(): UICollection() { + _cursorVisage.setVisage(1, 5); + g_saver->addLoadNotifier(&UIElements::loadNotifierProc); + _characterIndex = 0; +} + +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); + } + } + + if (g_vm->getGameID() == GType_Ringworld2) + s.syncAsSint16LE(_characterIndex); +} + +void UIElements::process(Event &event) { + 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; + } + } + + 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->_focusObject) { + GfxSurface surface = _cursorVisage.getFrame(7); + BF_GLOBALS._events.setCursor(surface); + } +*/ + } + } +} + +void UIElements::setup(const Common::Point &pt) { + _slotStart = 0; + _itemList.clear(); + _scoreValue = 0; + _active = true; + UICollection::setup(pt); + hide(); + + _background.setup(1, 3, 1, 0, 0, 255); + add(&_background); + + // Set up the inventory slots + int xp = 0; + for (int idx = 0; idx < 4; ++idx) { + UIElement *item = NULL; + switch (idx) { + case 0: + item = &_slot1; + break; + case 1: + item = &_slot2; + break; + case 2: + item = &_slot3; + break; + case 3: + item = &_slot4; + break; + } + + xp = idx * 63 + 2; + if (g_vm->getGameID() == GType_BlueForce) { + item->setup(9, 1, idx, xp, 4, 255); + } else { + item->setup(7, 1, idx, xp, 4, 255); + } + add(item); + } + + // Setup bottom-right hand buttons + xp += 62; + int yp = (g_vm->getGameID() == GType_BlueForce) ? 16 : 17; + _question.setup(1, 4, 7, xp, yp, 255); + _question.setEnabled(false); + add(&_question); + + xp += 21; + _scrollLeft.setup(1, 4, 1, xp, yp, 255); + add(&_scrollLeft); + _scrollLeft._isLeft = true; + + xp += 22; + _scrollRight.setup(1, 4, 4, xp, yp, 255); + add(&_scrollRight); + _scrollRight._isLeft = false; + + switch (g_vm->getGameID()) { + case GType_BlueForce: + // Set up the score + _score.postInit(); + add(&_score); + case GType_Ringworld2: + // Set up the character display + _character.setup(1, 5, _characterIndex, 285, 11, 255); + add(&_character); + break; + default: + break; + } + + // Set interface area + _bounds = Rect(0, UI_INTERFACE_Y - 1, SCREEN_WIDTH, SCREEN_HEIGHT); + + updateInventory(); +} + +void UIElements::add(UIElement *obj) { + // Add object + assert(_objList.size() < 12); + _objList.push_back(obj); + + obj->setPosition(Common::Point(_bounds.left + obj->_position.x, _bounds.top + obj->_position.y)); + obj->reposition(); + + GfxSurface s = obj->getFrame(); + s.draw(obj->_position); +} + +/** + * Handles updating the visual inventory in the user interface + */ +void UIElements::updateInventory() { + _score.updateScore(); + updateInvList(); + + // Enable scroll buttons if the player has more than four items + if (_itemList.size() > 4) { + _scrollLeft.setEnabled(true); + _scrollRight.setEnabled(true); + } else { + _scrollLeft.setEnabled(false); + _scrollRight.setEnabled(false); + } + + // Handle cropping the slots start within inventory + int lastPage = (_itemList.size() - 1) / 4 + 1; + if (_slotStart < 0) + _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 = 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 * 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); + } + } + } + + // Refresh the display if necessary + if (_active) + draw(); +} + +/** + * Update the list of the indexes of items in the player's inventory + */ +void UIElements::updateInvList() { + // Update the index list of items in the player's inventory + _itemList.clear(); + + SynchronizedList<InvObject *>::iterator i; + int itemIndex = 0; + for (i = BF_GLOBALS._inventory->_itemList.begin(); i != BF_GLOBALS._inventory->_itemList.end(); ++i, ++itemIndex) { + InvObject *invObject = *i; + if (invObject->inInventory()) + _itemList.push_back(itemIndex); + } +} + +/** + * 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 && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.show(); +} + +} // End of namespace TsAGE diff --git a/engines/tsage/user_interface.h b/engines/tsage/user_interface.h new file mode 100644 index 0000000000..94a2444e39 --- /dev/null +++ b/engines/tsage/user_interface.h @@ -0,0 +1,150 @@ +/* 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_USER_INTERFACE_H +#define TSAGE_USER_INTERFACE_H + +#include "common/scummsys.h" +#include "tsage/core.h" +#include "tsage/graphics.h" +#include "tsage/sound.h" + +namespace TsAGE { + +class StripProxy: public EventHandler { +public: + virtual void process(Event &event); +}; + +class UIElement: public BackgroundSceneObject { +public: + int _field88; + bool _enabled; + int _frameNum; + + virtual Common::String getClassName() { return "UIElement"; } + virtual void synchronize(Serializer &s); + + void setup(int visage, int stripNum, int frameNum, int posX, int posY, int priority); + void setEnabled(bool flag); +}; + +// This class implements the Question mark button +class UIQuestion: public UIElement { +private: + void showDescription(CursorType item); + void showItem(int resNum, int rlbNum, int frameNum); +public: + virtual void process(Event &event); + void setEnabled(bool flag); +}; + +// This class implements the score counter +class UIScore: public UIElement { +private: + void showDescription(int lineNum); +public: + UIElement _digit3, _digit2, _digit1, _digit0; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void draw(); + + void updateScore(); +}; + +class UIInventorySlot: public UIElement { +public: + int _objIndex; + InvObject *_object; + + UIInventorySlot(); + virtual Common::String getClassName() { return "UIInventorySlot"; } + virtual void synchronize(Serializer &s); + virtual void process(Event &event); +}; + +class UIInventoryScroll: public UIElement { +private: + void toggle(bool pressed); +public: + bool _isLeft; + + UIInventoryScroll(); + virtual Common::String getClassName() { return "UIInventoryScroll"; } + virtual void synchronize(Serializer &s); + virtual void process(Event &event); +}; + +class UICollection: public EventHandler { +protected: + void erase(); +public: + Common::Point _position; + Rect _bounds; + bool _visible; + bool _clearScreen; + bool _cursorChanged; + Common::Array<UIElement *> _objList; + + UICollection(); + void setup(const Common::Point &pt); + void hide(); + void show(); + void resetClear(); + void draw(); +}; + +class UIElements: public UICollection { +private: + void add(UIElement *obj); + void updateInvList(); +public: + UIElement _background; + UIQuestion _question; + UIScore _score; + UIInventorySlot _slot1, _slot2, _slot3, _slot4; + UIInventoryScroll _scrollLeft, _scrollRight; + ASound _sound; + int _slotStart, _scoreValue; + bool _active; + Common::Array<int> _itemList; + Visage _cursorVisage; + UIElement _character; + int _characterIndex; + + 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 TsAGE + +#endif |