diff options
Diffstat (limited to 'engines/tsage/blue_force/blueforce_logic.cpp')
-rw-r--r-- | engines/tsage/blue_force/blueforce_logic.cpp | 1247 |
1 files changed, 940 insertions, 307 deletions
diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp index 31ebab3c47..b8895add0a 100644 --- a/engines/tsage/blue_force/blueforce_logic.cpp +++ b/engines/tsage/blue_force/blueforce_logic.cpp @@ -24,7 +24,14 @@ #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" @@ -36,9 +43,7 @@ namespace BlueForce { void BlueForceGame::start() { // Start the game - _globals->_sceneManager.changeScene(300); - - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_sceneManager.changeScene(20); } Scene *BlueForceGame::createScene(int sceneNumber) { @@ -48,100 +53,265 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Tsunami Title Screen return new Scene20(); case 50: + // Map screen return new Scene50(); case 60: - error("Scene group 0 not implemented"); + // Motorcycle + return new Scene60(); /* Scene Group #1 */ case 100: // Tsnunami Title Screen #2 return new Scene100(); case 109: - // Introduction Bar Room + // Introduction - Bar Room return new Scene109(); case 110: - + // Introduction - Outside the bar + return new Scene110(); case 114: + // Outside Tony's Bar + return new Scene114(); case 115: + // Inside Tony's Bar + return new Scene115(); case 125: + // Intro - Chase in the city + return new Scene125(); case 140: + // Intro - Burglar near the House + return new Scene140(); case 150: + // Intro - Burglar inside the house + return new Scene150(); case 160: + error("Scene group 1 not implemented"); case 180: + // Front of Home + return new Scene180(); case 190: - error("Scene group 1 not implemented"); + // Front of Police Station + return new Scene190(); case 200: + // Credits - Motorcycle Training + return new Scene200(); case 210: + // Credits - Car Training + return new Scene210(); case 220: + // Credits - Martial Arts + return new Scene220(); case 225: + // Credits - Gun Training + return new Scene225(); case 265: + // Graduation Article + return new Scene265(); case 270: + // Living Room & Kitchen + return new Scene270(); case 271: + // Living Room & Kitchen #2 + return new Scene271(); case 280: - error("Scene group 2 not implemented"); + // 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: - error("Scene group 3 not implemented"); + // City Jail + return new Scene390(); case 410: + // Traffic Stop Gang Members + return new Scene410(); case 415: + // Searching Truck + return new Scene415(); case 440: + // Outside Alleycat Bowl + return new Scene440(); case 450: - error("Scene group 4 not implemented"); + // Inside Alleycat Bowl + return new Scene450(); case 550: + // Outside Bikini Hut + return new Scene550(); case 551: + // Outside Bikini Hut (Drunk Stop) + return new Scene551(); case 560: + // Study + return new Scene560(); case 570: + // Computer + return new Scene570(); case 580: + // Child Protective Services Parking Lot + return new Scene580(); case 590: - error("Scene group 5 not implemented"); + // Child Protective Services + return new Scene590(); case 600: + // Crash cut-scene + return new Scene600(); case 620: + // Hospital cut-scene + return new Scene620(); case 666: + // Death scene + return new Scene666(); case 690: - error("Scene group 6 not implemented"); + // Decking + return new Scene690(); case 710: - error("Scene group 7 not implemented"); + // 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: - error("Scene group 8 not implemented"); + // Beach Path + return new Scene880(); case 900: + // Outside Warehouse + return new Scene900(); case 910: + return new Scene910(); case 920: + // Inside Warehouse: Secret room + return new Scene920(); case 930: + // Inside the caravan + return new Scene930(); case 935: + // Hidden in the wardrobe + return new Scene935(); case 940: - error("Scene group 9 not implemented"); + return new Scene940(); default: error("Unknown scene number - %d", sceneNumber); break; } } +/** + * 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() { @@ -157,7 +327,7 @@ void AObjectArray::clear() { void AObjectArray::synchronize(Serializer &s) { EventHandler::synchronize(s); for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) - SYNC_POINTER(_objList[i]); + SYNC_POINTER(_objList[i]); } void AObjectArray::process(Event &event) { @@ -212,13 +382,13 @@ void AObjectArray::remove(EventHandler *obj) { Timer::Timer() { _endFrame = 0; - _endAction = NULL; + _endHandler = NULL; _tickAction = NULL; } void Timer::remove() { _endFrame = 0; - _endAction = NULL; + _endHandler = NULL; ((Scene100 *)BF_GLOBALS._sceneManager._scene)->removeTimer(this); } @@ -226,15 +396,15 @@ void Timer::remove() { void Timer::synchronize(Serializer &s) { EventHandler::synchronize(s); SYNC_POINTER(_tickAction); - SYNC_POINTER(_endAction); + SYNC_POINTER(_endHandler); s.syncAsUint32LE(_endFrame); } void Timer::signal() { - assert(_endAction); - Action *action = _endAction; + assert(_endHandler); + EventHandler *item = _endHandler; remove(); - action->signal(); + item->signal(); } void Timer::dispatch() { @@ -249,11 +419,11 @@ void Timer::dispatch() { } } -void Timer::set(uint32 delay, Action *endAction) { +void Timer::set(uint32 delay, EventHandler *endHandler) { assert(delay != 0); _endFrame = BF_GLOBALS._sceneHandler->getFrameDifference() + delay; - _endAction = endAction; + _endHandler = endHandler; ((SceneExt *)BF_GLOBALS._sceneManager._scene)->addTimer(this); } @@ -264,9 +434,9 @@ TimerExt::TimerExt(): Timer() { _action = NULL; } -void TimerExt::set(uint32 delay, Action *endAction, Action *newAction) { +void TimerExt::set(uint32 delay, EventHandler *endHandler, Action *newAction) { _newAction = newAction; - Timer::set(delay, endAction); + Timer::set(delay, endHandler); } void TimerExt::synchronize(Serializer &s) { @@ -276,22 +446,18 @@ void TimerExt::synchronize(Serializer &s) { void TimerExt::remove() { _action = NULL; - remove(); + Timer::remove(); } void TimerExt::signal() { - Action *endAction = _endAction; + EventHandler *endHandler = _endHandler; Action *newAction = _newAction; remove(); // If the end action doesn't have an action anymore, set it to the specified new action - assert(endAction); - if (!endAction->_action) - endAction->setAction(newAction); -} - -void TimerExt::dispatch() { - + assert(endHandler); + if (!endHandler->_action) + endHandler->setAction(newAction); } /*--------------------------------------------------------------------------*/ @@ -314,7 +480,7 @@ void NamedObject::synchronize(Serializer &s) { s.syncAsSint16LE(_useLineNum); } -void NamedObject::startAction(CursorType action) { +bool NamedObject::startAction(CursorType action, Event &event) { bool handled = true; switch (action) { @@ -340,13 +506,13 @@ void NamedObject::startAction(CursorType action) { handled = false; break; } -/* + if (!handled) - ((SceneExt *)BF_GLOBALS._sceneManager._scene)->display(action); -*/ + handled = ((SceneExt *)BF_GLOBALS._sceneManager._scene)->display(action); + return handled; } -void NamedObject::setup(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { +void NamedObject::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { _resNum = resNum; _lookLineNum = lookLineNum; _talkLineNum = talkLineNum; @@ -354,20 +520,26 @@ void NamedObject::setup(int resNum, int lookLineNum, int talkLineNum, int useLin switch (mode) { case 2: - _globals->_sceneItems.push_front(this); + g_globals->_sceneItems.push_front(this); break; case 4: - _globals->_sceneItems.addBefore(item, this); + g_globals->_sceneItems.addBefore(item, this); break; case 5: - _globals->_sceneItems.addAfter(item, this); + g_globals->_sceneItems.addAfter(item, this); break; default: - _globals->_sceneItems.push_back(this); + g_globals->_sceneItems.push_back(this); break; } } +void NamedObject::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) { + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; +} /*--------------------------------------------------------------------------*/ @@ -437,7 +609,7 @@ void FollowerObject::reposition() { assert(_object); setStrip(_object->_strip); setPosition(_object->_position, _object->_yDiff); - reposition(); + NamedObject::reposition(); } void FollowerObject::setup(SceneObject *object, int visage, int frameNum, int yDiff) { @@ -452,12 +624,79 @@ void FollowerObject::setup(SceneObject *object, int visage, int frameNum, int yD /*--------------------------------------------------------------------------*/ -SceneExt::SceneExt(): Scene() { - warning("TODO: dword_503AA/dword_503AE/dword_53030"); +FocusObject::FocusObject(): NamedObject() { + _img = surfaceFromRes(1, 5, 7); +} - _field372 = 0; - _field37A = 0; - _eventHandler = NULL; +void FocusObject::postInit(SceneObjectList *OwnerList) { + NamedObject::postInit(OwnerList); + _resNum = 560; + _lookLineNum = 43; + _talkLineNum = 44; + _useLineNum = -1; + _v90 = 0; + _v92 = 1; + + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + scene->_focusObject = this; + BF_GLOBALS._sceneItems.push_front(this); +} + +void FocusObject::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_v90); + s.syncAsSint16LE(_v92); +} + +void FocusObject::remove() { + BF_GLOBALS._sceneItems.remove(this); + + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + if (scene->_focusObject == this) + scene->_focusObject = NULL; + + BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor()); + NamedObject::remove(); +} + +void FocusObject::process(Event &event) { + if (BF_GLOBALS._player._enabled) { + if (_bounds.contains(event.mousePos)) { + // Reset the cursor back to normal + BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor()); + + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && + (event.btnState == 3)) { + BF_GLOBALS._events.setCursor(CURSOR_USE); + event.handled = true; + } + } else if (event.mousePos.y < 168) { + // Change the cursor to an 'Exit' image + BF_GLOBALS._events.setCursor(_img); + if (event.eventType == EVENT_BUTTON_DOWN) { + // Remove the object from display + event.handled = true; + remove(); + } + } + } + + if (_action) + _action->process(event); +} + +/*--------------------------------------------------------------------------*/ + +SceneExt::SceneExt(): Scene() { + _stripManager._onBegin = SceneExt::startStrip; + _stripManager._onEnd = SceneExt::endStrip; + + _field372 = _field37A = 0; + _savedPlayerEnabled = false; + _savedUiEnabled = false; + _savedCanWalk = false; + _focusObject = NULL; + _cursorVisage.setVisage(1, 8); } void SceneExt::postInit(SceneObjectList *OwnerList) { @@ -471,6 +710,21 @@ void SceneExt::postInit(SceneObjectList *OwnerList) { } } +void SceneExt::remove() { + BF_GLOBALS._uiElements.hide(); + BF_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) @@ -482,10 +736,10 @@ void SceneExt::dispatch() { if (_field37A) { if ((--_field37A == 0) && BF_GLOBALS._dayNumber) { - if (BF_GLOBALS._v4E238 && (BF_GLOBALS._v4CF9E == 1)) { - warning("sub_1B052"); + if (BF_GLOBALS._uiElements._active && BF_GLOBALS._player._enabled) { + BF_GLOBALS._uiElements.show(); } - + _field37A = 0; } } @@ -495,54 +749,180 @@ void SceneExt::dispatch() { void SceneExt::loadScene(int sceneNum) { Scene::loadScene(sceneNum); - + _v51C34.top = 0; _v51C34.bottom = 300; } void SceneExt::checkGun() { - if (BF_GLOBALS.getFlag(fLoadedSpare) && (BF_GLOBALS._v4CEBA > 0)) { - if (--BF_GLOBALS._v4CEBA == 0) + // 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._v4CEB8 > 0) - --BF_GLOBALS._v4CEB8; + if (BF_GLOBALS._clip1Bullets > 0) + --BF_GLOBALS._clip1Bullets; - if (!BF_GLOBALS._v4CEB8) + if (!BF_GLOBALS._clip1Bullets) BF_GLOBALS.clearFlag(fGunLoaded); } BF_GLOBALS._sound3.play(4); } +bool SceneExt::display(CursorType action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(9000, BF_GLOBALS._randomSource.getRandomNumber(2)); + break; + case CURSOR_USE: + SceneItem::display2(9000, BF_GLOBALS._randomSource.getRandomNumber(2) + 6); + break; + case CURSOR_TALK: + SceneItem::display2(9000, BF_GLOBALS._randomSource.getRandomNumber(2) + 3); + break; + case INV_COLT45: + gunDisplay(); + break; + default: + if (action < BF_LAST_INVENT) + SceneItem::display2(9002, (int)action); + else + return false; + break; + } + + return true; +} + +void SceneExt::fadeOut() { + uint32 black = 0; + BF_GLOBALS._scenePalette.fade((const byte *)&black, false, 100); +} + +void SceneExt::gunDisplay() { + if (!BF_GLOBALS.getFlag(gunDrawn)) { + // Gun not drawn + SceneItem::display2(1, BF_GLOBALS.getFlag(fCanDrawGun) ? 0 : 4); + } else if (!BF_GLOBALS.getFlag(fGunLoaded)) { + // Gun not loaded + SceneItem::display2(1, 1); + } else if (!BF_GLOBALS.getHasBullets()) { + // Out of ammunition + SceneItem::display2(1, 2); + } else { + // Check scene for whether gun can fire + checkGun(); + } +} + +void SceneExt::startStrip() { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + scene->_field372 = 1; + scene->_savedPlayerEnabled = BF_GLOBALS._player._enabled; + + if (scene->_savedPlayerEnabled) { + scene->_savedUiEnabled = BF_GLOBALS._player._uiEnabled; + scene->_savedCanWalk = BF_GLOBALS._player._canWalk; + BF_GLOBALS._player.disableControl(); + + if (!BF_GLOBALS._v50696 && BF_GLOBALS._uiElements._active) + BF_GLOBALS._uiElements.hide(); + } +} + +void SceneExt::endStrip() { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + scene->_field372 = 0; + + if (scene->_savedPlayerEnabled) { + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._uiEnabled = scene->_savedUiEnabled; + BF_GLOBALS._player._canWalk = scene->_savedCanWalk; + + if (!BF_GLOBALS._v50696 && BF_GLOBALS._uiElements._active) + BF_GLOBALS._uiElements.show(); + } +} + +void SceneExt::clearScreen() { + BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0); +} + /*--------------------------------------------------------------------------*/ -GameScene::GameScene() { +PalettedScene::PalettedScene(): SceneExt() { + _field794 = 0; +} +void PalettedScene::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field794); } -void GameScene::postInit(SceneObjectList *OwnerList) { +void PalettedScene::postInit(SceneObjectList *OwnerList) { _field794 = 0; - _field412 = 1; + _palette._field412 = 1; SceneExt::postInit(OwnerList); } -void GameScene::remove() { +void PalettedScene::remove() { SceneExt::remove(); if (_field794 == 1) { for (SynchronizedList<SceneObject *>::iterator i = BF_GLOBALS._sceneObjects->begin(); i != BF_GLOBALS._sceneObjects->end(); ++i) (*i)->remove(); - + BF_GLOBALS._sceneObjects->draw(); BF_GLOBALS._scenePalette.loadPalette(2); BF_GLOBALS._v51C44 = 1; - BF_GLOBALS._v51C42 = 1; + BF_GLOBALS._sceneManager._hasPalette = true; + } + + BF_GLOBALS._scenePalette._field412 = 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::sub15E4F(const byte *arrBufferRGB, int arg8, 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]; + } } - BF_GLOBALS._scenePalette._field412 = 1; + for (int i = toColor1; i <= toColor2; i++) { + tmpPalette[i] = _palette._palette[i] - ((_palette._palette[i] - arrBufferRGB[0]) * (100 - arg8)) / 100; + tmpPalette[i + 1] = _palette._palette[i + 1] - ((_palette._palette[i + 1] - arrBufferRGB[1]) * (100 - arg8)) / 100; + tmpPalette[i + 2] = _palette._palette[i + 2] - ((_palette._palette[i + 2] - arrBufferRGB[2]) * (100 - arg8)) / 100; + } + + BF_GLOBALS._scenePalette.addFader((const byte *)tmpPalette, 256, 100, action); } + /*--------------------------------------------------------------------------*/ void SceneHandlerExt::postInit(SceneObjectList *OwnerList) { @@ -551,292 +931,545 @@ void SceneHandlerExt::postInit(SceneObjectList *OwnerList) { // Load the low end palette data BF_GLOBALS._scenePalette.loadPalette(2); BF_GLOBALS._scenePalette.refresh(); - - // Setup the user interface - BF_GLOBALS._uiElements.setup(Common::Point(0, BF_INTERFACE_Y - 2)); } void SceneHandlerExt::process(Event &event) { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + if (scene && scene->_focusObject) + scene->_focusObject->process(event); + + if (BF_GLOBALS._uiElements._active) { + BF_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); +} - // TODO: All the new stuff from Blue Force +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; + } } /*--------------------------------------------------------------------------*/ -VisualSpeaker::VisualSpeaker(): Speaker() { - _textWidth = 312; - _color1 = 19; - _hideObjects = false; - _removeObject1 = false; - _removeObject2 = false; - _field20E = 160; - _fontNumber = 4; - _color2 = 82; - _offsetPos = Common::Point(4, 170); - _numFrames = 0; +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); } -void VisualSpeaker::remove() { - if (_removeObject2) - _object2.remove(); - if (_removeObject1) - _object1.remove(); +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); - Speaker::remove(); + // Update the user interface if necessary + BF_GLOBALS._uiElements.updateInventory(); } -void VisualSpeaker::synchronize(Serializer &s) { - Speaker::synchronize(s); - - s.syncAsByte(_removeObject1); - s.syncAsByte(_removeObject2); - s.syncAsSint16LE(_field20C); - s.syncAsSint16LE(_field20E); - s.syncAsSint16LE(_numFrames); - s.syncAsSint16LE(_offsetPos.x); - s.syncAsSint16LE(_offsetPos.y); -} - -void VisualSpeaker::proc12(Action *action) { - Speaker::proc12(action); - _textPos = Common::Point(_offsetPos.x + BF_GLOBALS._sceneManager._scene->_sceneBounds.left, - _offsetPos.y + BF_GLOBALS._sceneManager._scene->_sceneBounds.top); - _numFrames = 0; -} - -void VisualSpeaker::setText(const Common::String &msg) { - _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); +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 ALIGN_CENTER: - _sceneText.setPosition(Common::Point(_textPos.x + (_textWidth - bounds.width()) / 2, _textPos.y)); + case 4: + if (hasNickel) + setObjectScene(INV_NICKEL, 1); + if (hasRentalCoupon) + setObjectScene(INV_RENTAL_COUPON, 1); + if (hasHook) + setObjectScene(INV_HOOK, 1); break; - case ALIGN_RIGHT: - _sceneText.setPosition(Common::Point(_textPos.x + _textWidth - bounds.width(), _textPos.y)); + 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; } +} + +/*--------------------------------------------------------------------------*/ + +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); - // Ensure the text is in the foreground - _sceneText.fixPriority(256); + 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); - // Count the number of words (by spaces) in the string - const char *s = msg.c_str(); - int spaceCount = 0; - while (*s) { - if (*s++ == ' ') - ++spaceCount; + SceneItem::display2(_resNum, _talkLineNum); + return true; + default: + return SceneHotspot::startAction(action, event); } +} - _numFrames = spaceCount * 3 + 2; +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; -SpeakerSutter::SpeakerSutter() { - _speakerName = "SUTTER"; - _color1 = 20; - _color2 = 22; - _textMode = ALIGN_CENTER; + 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 SpeakerSutter::setText(const Common::String &msg) { - _removeObject1 = _removeObject2 = true; +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; - _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)); + // 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; + } +} - _object2.postInit(); - _object2.setVisage(329); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45, - BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); +void NamedHotspot::synchronize(Serializer &s) { + SceneHotspot::synchronize(s); + s.syncAsSint16LE(_resNum); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_useLineNum); - VisualSpeaker::setText(msg); - _object2.fixCountdown(8, _numFrames); + if (g_vm->getGameID() == GType_BlueForce) + s.syncAsSint16LE(_talkLineNum); } /*--------------------------------------------------------------------------*/ -SpeakerDoug::SpeakerDoug(): VisualSpeaker() { - _color1 = 32; - _speakerName = "DOUG"; +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; -SpeakerJakeNoHead::SpeakerJakeNoHead(): VisualSpeaker() { - _color1 = 13; - _speakerName = "JAKE_NO_HEAD"; + 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(); + } +} -BlueForceInvObjectList::BlueForceInvObjectList(): - _business_card(9, 4, 2, 0), - _lauras_sweater(9, 4, 3, 0), - _handcuffs(9, 1, 4, 0), - _magnum(9, 1, 5, 0), - _ticket_book(9, 1, 6, 0), - _miranda_card(9, 1, 7, 0), - _forest_follet(9, 1, 8, 0), - _bradford_id(9, 1, 9, 0), - _baseball_card(9, 1, 10, 0), - _slip_bradford(9, 1, 11, 0), - _flare(9, 1, 12, 0), - _rap_sheet(9, 1, 13, 0), - _cartridges(9, 1, 14, 0), - _rifle(9, 1, 15, 0), - _wig(9, 1, 16, 0), - _frankies_id(9, 1, 17, 0), - _tyrones_id(9, 1, 18, 0), - _pistol22(9, 1, 19, 0), - _unused(1, 1, 1, 0), - _slip_frankie(9, 2, 1, 0), - _slip_tyrone(9, 2, 2, 0), - _atf_teletype(9, 2, 3, 0), - _da_note(9, 2, 4, 0), - _blueprints(9, 2, 5, 0), - _planter_key(9, 2, 6, 0), - _center_punch(9, 2, 7, 0), - _tranquilizer(9, 2, 8, 0), - _boat_hook(9, 2, 9, 0), - _oily_rags(9, 2, 10, 0), - _fuel_jar(9, 2, 11, 0), - _screwdriver(9, 2, 12, 0), - _floppy_disk1(9, 2, 13, 0), - _floppy_disk2(9, 2, 14, 0), - _driftwood(9, 2, 15, 0), - _crate_piece1(9, 2, 16, 0), - _crate_piece2(9, 2, 17, 0), - _shoebox(9, 2, 18, 0), - _badge(9, 2, 19, 0), - _unused2(1, 1, 1, 0), - _rental_coupons(9, 3, 1, 0), - _nickel(9, 3, 2, 0), - _calendar(9, 3, 3, 0), - _dixon_note(9, 3, 4, 0), - _cobb_mugshot(9, 3, 5, 0), - _murder_article(9, 3, 6, 0), - _microfiche(9, 3, 7, 0), - _future_wave_keys(9, 3, 8, 0), - _rental_boat_keys(9, 3, 9, 0), - _napkin(9, 3, 10, 0), - _cobb_printout(9, 3, 11, 0), - _fishing_net(9, 3, 12, 0), - _id(9, 3, 13, 0), - _rounds_9mm(9, 3, 14, 0), - _dates_note(9, 3, 15, 0), - _hand_grenade(9, 3, 16, 0), - _cord_110(9, 3, 17, 0), - _cord_110_plug(9, 3, 18, 0), - _cord_220(9, 3, 19, 0), - _unused3(1, 1, 1, 0), - _cord_220_plug(9, 4, 1, 0), - _official_document(9, 4, 2, 0), - _red_sweater(9, 4, 3, 0), - _jackknife(9, 4, 4, 0), - _whistle(9, 4, 5, 0), - _gun(9, 1, 2, 0), - _alley_cat_key(9, 4, 7, 0) { - // Add the items to the list - _itemList.push_back(&_business_card); - _itemList.push_back(&_lauras_sweater); - _itemList.push_back(&_handcuffs); - _itemList.push_back(&_magnum); - _itemList.push_back(&_ticket_book); - _itemList.push_back(&_miranda_card); - _itemList.push_back(&_forest_follet); - _itemList.push_back(&_bradford_id); - _itemList.push_back(&_baseball_card); - _itemList.push_back(&_slip_bradford); - _itemList.push_back(&_flare); - _itemList.push_back(&_rap_sheet); - _itemList.push_back(&_cartridges); - _itemList.push_back(&_rifle); - _itemList.push_back(&_wig); - _itemList.push_back(&_frankies_id); - _itemList.push_back(&_tyrones_id); - _itemList.push_back(&_pistol22); - _itemList.push_back(&_unused); - _itemList.push_back(&_slip_frankie); - _itemList.push_back(&_slip_tyrone); - _itemList.push_back(&_atf_teletype); - _itemList.push_back(&_da_note); - _itemList.push_back(&_blueprints); - _itemList.push_back(&_planter_key); - _itemList.push_back(&_center_punch); - _itemList.push_back(&_tranquilizer); - _itemList.push_back(&_boat_hook); - _itemList.push_back(&_oily_rags); - _itemList.push_back(&_fuel_jar); - _itemList.push_back(&_screwdriver); - _itemList.push_back(&_floppy_disk1); - _itemList.push_back(&_floppy_disk2); - _itemList.push_back(&_driftwood); - _itemList.push_back(&_crate_piece1); - _itemList.push_back(&_crate_piece2); - _itemList.push_back(&_shoebox); - _itemList.push_back(&_badge); - _itemList.push_back(&_unused2); - _itemList.push_back(&_rental_coupons); - _itemList.push_back(&_nickel); - _itemList.push_back(&_calendar); - _itemList.push_back(&_dixon_note); - _itemList.push_back(&_cobb_mugshot); - _itemList.push_back(&_murder_article); - _itemList.push_back(&_microfiche); - _itemList.push_back(&_future_wave_keys); - _itemList.push_back(&_rental_boat_keys); - _itemList.push_back(&_napkin); - _itemList.push_back(&_cobb_printout); - _itemList.push_back(&_fishing_net); - _itemList.push_back(&_id); - _itemList.push_back(&_rounds_9mm); - _itemList.push_back(&_dates_note); - _itemList.push_back(&_hand_grenade); - _itemList.push_back(&_cord_110); - _itemList.push_back(&_cord_110_plug); - _itemList.push_back(&_cord_220); - _itemList.push_back(&_unused3); - _itemList.push_back(&_cord_220_plug); - _itemList.push_back(&_official_document); - _itemList.push_back(&_red_sweater); - _itemList.push_back(&_jackknife); - _itemList.push_back(&_whistle); - _itemList.push_back(&_gun); - _itemList.push_back(&_alley_cat_key); +void SceneMessage::draw() { + GfxSurface &surface = BF_GLOBALS._screenSurface; + + // Clear the game area + surface.fillRect(Rect(0, 0, SCREEN_WIDTH, BF_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, BF_INTERFACE_Y / 2 - (font.getHeight() / 2), SCREEN_WIDTH, + BF_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; +} } // End of namespace BlueForce |