mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-07 18:31:37 +00:00
1150 lines
29 KiB
C++
1150 lines
29 KiB
C++
/* 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->_tsunamiWave.setVisage(22);
|
|
scene->_tsunamiWave._strip = 1;
|
|
scene->_tsunamiWave._frame = 1;
|
|
scene->_tsunamiWave.changeZoom(100);
|
|
|
|
scene->_letterT.setVisage(22);
|
|
scene->_letterT._strip = 2;
|
|
scene->_letterT._frame = 1;
|
|
scene->_letterT.changeZoom(100);
|
|
|
|
scene->_letterS.setVisage(22);
|
|
scene->_letterS._strip = 3;
|
|
scene->_letterS._frame = 1;
|
|
scene->_letterS.changeZoom(100);
|
|
|
|
scene->_letterU.setVisage(22);
|
|
scene->_letterU._strip = 4;
|
|
scene->_letterU._frame = 1;
|
|
scene->_letterU.changeZoom(100);
|
|
|
|
scene->_letterN.setVisage(22);
|
|
scene->_letterN._strip = 5;
|
|
scene->_letterN._frame = 1;
|
|
scene->_letterN.changeZoom(100);
|
|
|
|
scene->_letterA.setVisage(22);
|
|
scene->_letterA._strip = 6;
|
|
scene->_letterA._frame = 1;
|
|
scene->_letterA.changeZoom(100);
|
|
|
|
scene->_letterM.setVisage(22);
|
|
scene->_letterM._strip = 7;
|
|
scene->_letterM._frame = 1;
|
|
scene->_letterM.changeZoom(100);
|
|
|
|
scene->_letterI.setVisage(22);
|
|
scene->_letterI._strip = 8;
|
|
scene->_letterI._frame = 1;
|
|
scene->_letterI.changeZoom(100);
|
|
|
|
setDelay(1);
|
|
break;
|
|
case 3:
|
|
BF_GLOBALS._scenePalette.addFader(scene->_scenePalette._palette, 256, 8, this);
|
|
break;
|
|
case 4:
|
|
setDelay(60);
|
|
break;
|
|
case 5:
|
|
scene->_letterT.animate(ANIM_MODE_5, NULL);
|
|
scene->_letterS.animate(ANIM_MODE_5, NULL);
|
|
scene->_letterU.animate(ANIM_MODE_5, NULL);
|
|
scene->_letterN.animate(ANIM_MODE_5, NULL);
|
|
scene->_letterA.animate(ANIM_MODE_5, NULL);
|
|
scene->_letterM.animate(ANIM_MODE_5, this);
|
|
break;
|
|
case 6:
|
|
setDelay(120);
|
|
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);
|
|
SceneExt::postInit();
|
|
setZoomPercents(60, 85, 200, 100);
|
|
BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
|
|
|
|
_scenePalette.loadPalette(1);
|
|
_scenePalette.loadPalette(22);
|
|
|
|
_tsunamiWave.postInit();
|
|
_tsunamiWave.setVisage(21);
|
|
_tsunamiWave._strip = 1;
|
|
_tsunamiWave._frame = 1;
|
|
_tsunamiWave.animate(ANIM_MODE_NONE, NULL);
|
|
_tsunamiWave.setPosition(Common::Point(62, 85));
|
|
_tsunamiWave.changeZoom(100);
|
|
|
|
_letterT.postInit();
|
|
_letterT.setVisage(21);
|
|
_letterT._strip = 2;
|
|
_letterT._frame = 1;
|
|
_letterT.animate(ANIM_MODE_NONE, NULL);
|
|
_letterT.setPosition(Common::Point(27, 94));
|
|
_letterT.changeZoom(100);
|
|
|
|
_letterS.postInit();
|
|
_letterS.setVisage(21);
|
|
_letterS._strip = 2;
|
|
_letterS._frame = 2;
|
|
_letterS.animate(ANIM_MODE_NONE, NULL);
|
|
_letterS.setPosition(Common::Point(68, 94));
|
|
_letterS.changeZoom(100);
|
|
|
|
_letterU.postInit();
|
|
_letterU.setVisage(21);
|
|
_letterU._strip = 2;
|
|
_letterU._frame = 3;
|
|
_letterU.animate(ANIM_MODE_NONE, NULL);
|
|
_letterU.setPosition(Common::Point(110, 94));
|
|
_letterU.changeZoom(100);
|
|
|
|
_letterN.postInit();
|
|
_letterN.setVisage(21);
|
|
_letterN._strip = 2;
|
|
_letterN._frame = 4;
|
|
_letterN.animate(ANIM_MODE_NONE, NULL);
|
|
_letterN.setPosition(Common::Point(154, 94));
|
|
_letterN.changeZoom(100);
|
|
|
|
_letterA.postInit();
|
|
_letterA.setVisage(21);
|
|
_letterA._strip = 2;
|
|
_letterA._frame = 5;
|
|
_letterA.animate(ANIM_MODE_NONE, NULL);
|
|
_letterA.setPosition(Common::Point(199, 94));
|
|
_letterA.changeZoom(100);
|
|
|
|
_letterM.postInit();
|
|
_letterM.setVisage(21);
|
|
_letterM._strip = 2;
|
|
_letterM._frame = 6;
|
|
_letterM.animate(ANIM_MODE_NONE, NULL);
|
|
_letterM.setPosition(Common::Point(244, 94));
|
|
_letterM.changeZoom(100);
|
|
|
|
_letterI.postInit();
|
|
_letterI.setVisage(21);
|
|
_letterI._strip = 2;
|
|
_letterI._frame = 7;
|
|
_letterI.animate(ANIM_MODE_NONE, NULL);
|
|
_letterI.setPosition(Common::Point(286, 94));
|
|
_letterI.changeZoom(100);
|
|
|
|
setAction(&_action1);
|
|
BF_GLOBALS._dialogCenter.y = 165;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* 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);
|
|
|
|
if (s.getVersion() >= 10) {
|
|
s.syncAsSint16LE(_newSceneNumber);
|
|
s.syncAsSint16LE(_locationId);
|
|
}
|
|
}
|
|
|
|
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 sceneNum, const Common::String &msg, int locationId) {
|
|
_bounds = bounds;
|
|
_newSceneNumber = sceneNum;
|
|
_msg = msg;
|
|
_locationId = locationId;
|
|
}
|
|
|
|
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;
|
|
|
|
// In the original, a variable was used, always set to 0. The check is simplified
|
|
if (_newSceneNumber != 0)
|
|
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() {
|
|
_sceneNumber = 0;
|
|
}
|
|
|
|
|
|
void Scene50::synchronize(Serializer &s) {
|
|
if (s.getVersion() >= 10) {
|
|
SceneExt::synchronize(s);
|
|
s.syncAsSint16LE(_sceneNumber);
|
|
}
|
|
}
|
|
|
|
void Scene50::postInit(SceneObjectList *OwnerList) {
|
|
SceneExt::postInit();
|
|
|
|
BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
|
|
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;
|
|
default:
|
|
error("Unexpected tooltip value %d", selectedTooltip);
|
|
}
|
|
|
|
_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(f1097Frankie);
|
|
}
|
|
|
|
if ((BF_GLOBALS._driveFromScene == 340) && (_sceneNumber != BF_GLOBALS._driveFromScene)) {
|
|
BF_GLOBALS.setFlag(f1097Marina);
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
void Scene50::process(Event &event) {
|
|
SceneExt::process(event);
|
|
Common::Point pt(event.mousePos.x + _sceneBounds.left, event.mousePos.y + _sceneBounds.top);
|
|
bool mouseDown = false;
|
|
|
|
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._subFlagBitArr1 |= 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._subFlagBitArr1 >> 1) & 1)
|
|
BF_GLOBALS.setFlag(fLateToMarina);
|
|
else
|
|
BF_GLOBALS._subFlagBitArr1 |= 2;
|
|
} else {
|
|
int v = (((BF_GLOBALS._subFlagBitArr1 >> 2) & 15) + 1) & 15;
|
|
BF_GLOBALS._subFlagBitArr1 = (BF_GLOBALS._subFlagBitArr1 & 0xC3) | (v << 2);
|
|
|
|
if ((v != 1) && (v != 2)) {
|
|
BF_GLOBALS._deathReason = 19;
|
|
BF_GLOBALS._sceneManager.changeScene(666);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
BF_GLOBALS._subFlagBitArr1 |= 1;
|
|
return false;
|
|
}
|
|
|
|
bool Scene60::Ignition::check2() {
|
|
switch (BF_GLOBALS._bookmark) {
|
|
case bInspectionDone:
|
|
if (BF_GLOBALS._subFlagBitArr2 & 1) {
|
|
BF_GLOBALS.setFlag(fLateToDrunkStop);
|
|
} else {
|
|
BF_GLOBALS._subFlagBitArr2 |= 1;
|
|
}
|
|
break;
|
|
case bCalledToDrunkStop:
|
|
BF_GLOBALS.setFlag(fHasDrivenFromDrunk);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
BF_GLOBALS._subFlagBitArr1 |= 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();
|
|
break;
|
|
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._subFlagBitArr1 & 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._subFlagBitArr1 >> 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
|