diff options
Diffstat (limited to 'engines/tsage/blue_force/blueforce_scenes4.cpp')
-rw-r--r-- | engines/tsage/blue_force/blueforce_scenes4.cpp | 1659 |
1 files changed, 1659 insertions, 0 deletions
diff --git a/engines/tsage/blue_force/blueforce_scenes4.cpp b/engines/tsage/blue_force/blueforce_scenes4.cpp new file mode 100644 index 0000000000..07445a7e76 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes4.cpp @@ -0,0 +1,1659 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "tsage/blue_force/blueforce_scenes4.h" +#include "tsage/blue_force/blueforce_dialogs.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace TsAGE { + +namespace BlueForce { + +/*-------------------------------------------------------------------------- + * Scene 410 - Traffic Stop Gang Members + * + *--------------------------------------------------------------------------*/ + +void Scene410::Action1::signal() { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (scene->_field1FB6++) { + case 0: + if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) { + setDelay(3); + } else { + scene->_sceneMode = 4101; + scene->_stripManager.start(4103, scene); + } + break; + case 1: + scene->_sceneMode = 0; + scene->_stripManager.start(4104, scene); + break; + case 2: + scene->_sceneMode = 0; + scene->_stripManager.start(4105, scene); + break; + default: + scene->_sceneMode = 0; + scene->_stripManager.start(4106, scene); + break; + } +} + +void Scene410::Action2::signal() { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + BF_GLOBALS._player.disableControl(); + + switch (scene->_field1FB8++) { + case 0: + scene->_sceneMode = 4105; + scene->_stripManager.start(BF_GLOBALS.getFlag(fTalkedShooterNoBkup) ? 4123 : 4107, scene); + break; + case 1: + scene->_sceneMode = 4110; + scene->_stripManager.start(4102, scene); + break; + case 2: + scene->_sceneMode = 0; + scene->_stripManager.start(4108, scene); + break; + case 3: + scene->_sceneMode = 0; + scene->_stripManager.start(4109, scene); + break; + case 4: + scene->_sceneMode = 0; + scene->_stripManager.start(4110, scene); + break; + default: + SceneItem::display(410, 11, SET_WIDTH, 300, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 10, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + BF_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 13, SET_EXT_BGCOLOR, 82, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene410::Action3::signal() { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager1, scene, 4102, &scene->_object2, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS.setFlag(fTalkedShooterNoBkup); + scene->_sceneMode = 0; + scene->_stripManager.start(4107, scene); + } +} + +void Scene410::Action4::signal() { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (scene->_field1FC4 == 0) { + ADD_PLAYER_MOVER(114, 133); + } else { + ADD_PLAYER_MOVER(195, 139); + } + break; + case 1: + BF_GLOBALS._player.updateAngle(scene->_object2._position); + setDelay(3); + break; + case 2: + setDelay(3); + break; + case 3: + if (BF_GLOBALS.getFlag(fCalledBackup)) + scene->setAction(&scene->_action2); + else + scene->setAction(&scene->_action3); + remove(); + break; + default: + break; + } +} + +void Scene410::Action5::signal() { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (scene->_field1FC4 == 0) { + ADD_PLAYER_MOVER(114, 133); + } else { + ADD_PLAYER_MOVER(195, 139); + } + break; + case 1: + BF_GLOBALS._player.updateAngle(scene->_object2._position); + setDelay(3); + break; + case 2: + setDelay(3); + break; + case 3: + if (BF_GLOBALS.getFlag(fCalledBackup)) + scene->setAction(&scene->_action2); + else + scene->setAction(&scene->_action3); + remove(); + break; + default: + break; + } +} + +void Scene410::Action6::signal() { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (scene->_field1FC4 == 0) { + ADD_PLAYER_MOVER(114, 133); + } else { + ADD_PLAYER_MOVER(126, 99); + } + break; + case 1: + BF_GLOBALS._player.updateAngle(scene->_object1._position); + setDelay(3); + break; + case 2: + setDelay(3); + break; + case 3: + if (BF_GLOBALS.getFlag(fCalledBackup)) + scene->setAction(&scene->_action1); + else + scene->setAction(&scene->_action4); + remove(); + break; + default: + break; + } +} + +void Scene410::Action7::signal() { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setDelay(2); + break; + case 1: + BF_GLOBALS._bookmark = bStoppedFrankie; + BF_GLOBALS.set2Flags(f1098Frankie); + BF_GLOBALS.clearFlag(f1098Marina); + scene->_stripManager.start(4113, this); + break; + case 2: + case 4: + setDelay(2); + break; + case 3: + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.updateAngle(Common::Point(100, 170)); + scene->setAction(&scene->_sequenceManager1, this, 4112, &scene->_object1, &scene->_object2, + &scene->_object3, NULL); + break; + case 5: + BF_GLOBALS._uiElements.addScore(30); + setAction(&scene->_sequenceManager1, this, 4118, &BF_GLOBALS._player, NULL); + BF_GLOBALS._player.disableControl(); + break; + case 6: + scene->_sceneMode = 3; + scene->signal(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene410::Item2::startAction(CursorType action, Event &event) { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(fCalledBackup)) { + scene->_sceneMode = 4103; + scene->signal(); + } else if (BF_GLOBALS.getFlag(fSearchedTruck) && !BF_GLOBALS._sceneObjects->contains(&scene->_object3)) { + scene->_sceneMode = 4103; + scene->signal(); + } else if (scene->_field1FBC != 0) { + SceneItem::display2(410, 12); + } else { + scene->_sceneMode = 4103; + scene->signal(); + } + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +bool Scene410::Item4::startAction(CursorType action, Event &event) { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if ((BF_GLOBALS._bookmark < bStoppedFrankie) && (!scene->_field1FBC || !scene->_field1FBA)) + break; + else if (BF_GLOBALS.getFlag(fSearchedTruck)) + SceneItem::display2(410, 13); + else if (BF_GLOBALS.getFlag(fGangInCar)) { + BF_GLOBALS._uiElements.addScore(30); + scene->_sceneMode = 4118; + scene->signal(); + } else { + scene->setAction(&scene->_action7); + } + return true; + default: + break; + } + + return NamedHotspot::startAction(action, event); +} + + +/*--------------------------------------------------------------------------*/ + +bool Scene410::Object1::startAction(CursorType action, Event &event) { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(fCalledBackup)) { + if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) { + scene->setAction(&scene->_action4); + } else { + SceneItem::display2(410, 7); + } + } else if (!scene->_field1FBC) { + SceneItem::display2(410, 7); + } else if (!scene->_field1FC0) { + scene->_sceneMode = 4124; + scene->_field1FC0 = 1; + BF_GLOBALS._uiElements.addScore(30); + scene->signal(); + } else { + break; + } + return true; + case CURSOR_TALK: + BF_GLOBALS._player.setAction(&scene->_action6); + return true; + case INV_HANDCUFFS: + if (BF_GLOBALS.getFlag(fCalledBackup)) { + if ((scene->_field1FB8 < 5) || (scene->_field1FB6 < 1) || (scene->_field1FBC != 0)) + break; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4123; + scene->_stripManager.start(4125, scene); + scene->_field1FBC = 1; + BF_GLOBALS._uiElements.addScore(30); + } else { + if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) { + scene->setAction(&scene->_action4); + } else { + break; + } + } + return true; + case INV_TICKET_BOOK: + if (!BF_GLOBALS.getFlag(fDriverOutOfTruck)) { + return startAction(CURSOR_TALK, event); + } else if (!scene->_field1FC4) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager1, scene, 4120, &scene->_object2, &BF_GLOBALS._player, NULL); + } else if ((scene->_field1FBC != 0) || (scene->_field1FC2 != 0)) { + break; + } else { + scene->_field1FC2 = 1; + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4127; + scene->setAction(&scene->_sequenceManager1, scene, 4127, &scene->_object1, NULL); + } + return true; + case INV_MIRANDA_CARD: + if (scene->_field1FBC == 0) + return false; + + if (BF_GLOBALS.getFlag(readFrankRights)) { + SceneItem::display2(390, 15); + } else { + BF_GLOBALS.setFlag(readFrankRights); + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + + // TODO: Original code pushes a copy of the entirety of object1 onto stack + scene->setAction(&scene->_sequenceManager1, scene, 4126, &BF_GLOBALS._player, &scene->_object1, NULL); + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene410::Object2::startAction(CursorType action, Event &event) { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(fCalledBackup)) { + if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { + scene->setAction(&scene->_action3); + } else { + SceneItem::display2(410, 5); + } + } else if (!scene->_field1FBA) { + SceneItem::display2(410, 5); + } else if (!scene->_field1FBE) { + scene->_sceneMode = 4121; + scene->_field1FBE = 1; + BF_GLOBALS._uiElements.addScore(50); + scene->signal(); + } else { + break; + } + return true; + case CURSOR_TALK: + scene->setAction(&scene->_action5); + return true; + case INV_HANDCUFFS: + if (BF_GLOBALS.getFlag(fCalledBackup)) { + if ((scene->_field1FB8 < 5) || (scene->_field1FBA != 0)) + break; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9; + ADD_PLAYER_MOVER(195, 139); + } else if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { + scene->setAction(&scene->_action3); + } else { + break; + } + return true; + case INV_MIRANDA_CARD: + if (!scene->_field1FBA) + break; + + if (BF_GLOBALS.getFlag(readFrankRights)) { + SceneItem::display2(390, 15); + } else { + BF_GLOBALS.setFlag(readFrankRights); + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 0; + scene->setAction(&scene->_sequenceManager1, scene, 4125, &BF_GLOBALS._player, + &scene->_object2, NULL); + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene410::Object3::startAction(CursorType action, Event &event) { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (BF_GLOBALS._bookmark == bStoppedFrankie) { + if (BF_GLOBALS.getFlag(fSearchedTruck)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8; + ADD_PLAYER_MOVER(147, 143); + } else { + SceneItem::display2(350, 13); + } + } else if ((scene->_field1FBA != 0) && (scene->_field1FBC != 0)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4112; + scene->_stripManager.start(4113, scene); + BF_GLOBALS._bookmark = bStoppedFrankie; + BF_GLOBALS.set2Flags(f1098Frankie); + BF_GLOBALS.clearFlag(f1098Marina); + } else if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) || + (!scene->_field1FBA && (scene->_field1FB8 < 5))) { + SceneItem::display2(350, 13); + } else if (!scene->_field1FBA) { + if (scene->_field1FBA) + error("Error - want to cuff shooter, but he's cuffed already"); + + BF_GLOBALS._player.disableControl(); + scene->_field1FBA = 1; + scene->_field1FBE = 1; + BF_GLOBALS._walkRegions.proc2(22); + scene->_sceneMode = 4122; + scene->_stripManager.start(4112, scene); + } else if (scene->_field1FB6 < 1) { + break; + } else if (scene->_field1FBC != 0) { + error("Error - want to cuff driver, but he's cuffed already"); + } else { + BF_GLOBALS._player.disableControl(); + scene->_field1FBC = 1; + scene->_field1FC0 = 1; + BF_GLOBALS._walkRegions.proc2(22); + scene->_sceneMode = 4109; + scene->_stripManager.start(4112, scene); + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + + +/*--------------------------------------------------------------------------*/ + +Scene410::Scene410(): SceneExt() { + _field1FB6 = _field1FB8 = _field1FBA = _field1FBC = 0; + _field1FBE = _field1FC0 = _field1FC2 = _field1FC4 = 0; +} + +void Scene410::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field1FB6); + s.syncAsSint16LE(_field1FB8); + s.syncAsSint16LE(_field1FBA); + s.syncAsSint16LE(_field1FBC); + s.syncAsSint16LE(_field1FBE); + s.syncAsSint16LE(_field1FC0); + s.syncAsSint16LE(_field1FC2); + s.syncAsSint16LE(_field1FC4); +} + +void Scene410::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(410); + setZoomPercents(74, 75, 120, 100); + + if (BF_GLOBALS._sceneManager._previousScene != 60) + _sound1.fadeSound(11); + BF_GLOBALS._driveToScene = 64; + BF_GLOBALS._mapLocationId = 64; + BF_GLOBALS.setFlag(fArrivedAtGangStop); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_harrisonSpeaker); + _stripManager.addSpeaker(&_shooterSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(1341); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.changeAngle(90); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setPosition(Common::Point(114, 133)); + BF_GLOBALS._player.changeZoom(-1); + + _item2.setDetails(8, 410, 15, -1, -1, 1); + + _object2.postInit(); + _object2.setVisage(415); + _object2.setStrip(1); + _object2.setPosition(Common::Point(278, 92)); + _object2.setDetails(410, 4, -1, 5, 1, NULL); + + _object1.postInit(); + _object1.setVisage(416); + _object1.setStrip(2); + _object1.setPosition(Common::Point(244, 85)); + _object1.setDetails(410, 6, -1, 7, 1, NULL); + _object1.changeZoom(-1); + + _object5.postInit(); + _object5.setVisage(410); + _object5.setStrip(2); + _object5.setPosition(Common::Point(282, 96)); + + _object6.postInit(); + _object6.setVisage(410); + _object6.setStrip(4); + _object6.setPosition(Common::Point(240, 43)); + + _item4.setDetails(6, 410, 3, -1, -1, 1); + _item3.setDetails(7, 410, 3, -1, -1, 1); + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 415: + BF_GLOBALS.setFlag(fSearchedTruck); + BF_GLOBALS._player.setPosition(Common::Point(210, 90)); + + _object2.remove(); + _object1.remove(); + BF_GLOBALS._walkRegions.proc1(21); + BF_GLOBALS._walkRegions.proc1(22); + + _object3.postInit(); + _object3.setVisage(343); + _object3.setObjectWrapper(new SceneObjectWrapper()); + _object3.animate(ANIM_MODE_1, NULL); + _object3.setDetails(350, 12, 13, 14, 1, NULL); + _object3.setPosition(Common::Point(97, 185)); + _object3.changeZoom(-1); + + _object4.postInit(); + _object4.setVisage(410); + _object4.setDetails(410, 8, 9, 10, 1, NULL); + _object4.fixPriority(148); + _object4.setPosition(Common::Point(39, 168)); + + _field1FC4 = 1; + _sceneMode = 0; + signal(); + break; + case 60: + if (BF_GLOBALS.getFlag(fSearchedTruck)) { + _object2.remove(); + _object1.remove(); + _sceneMode = 0; + } else { + _field1FC4 = BF_GLOBALS._v50CC8; + _field1FBA = BF_GLOBALS._v50CC2; + _field1FB8 = BF_GLOBALS._v50CC6; + _field1FB6 = BF_GLOBALS._v50CC4; + + _object2.setVisage(418); + _object2.setStrip(6); + _object2.setPosition(Common::Point(227, 137)); + + if (_field1FB8 > 0) { + _object2.setVisage(415); + _object2.setStrip(2); + _object2.setFrame(5); + } + if (_field1FBA) { + _object2.setVisage(415); + _object2.setStrip(6); + _object2.setFrame(8); + } + + BF_GLOBALS._walkRegions.proc1(16); + if (BF_GLOBALS.getFlag(fDriverOutOfTruck)) { + _object1.setVisage(417); + _object1.setStrip(1); + _object1.setPosition(Common::Point(152, 97)); + + BF_GLOBALS._walkRegions.proc1(7); + } + + if (BF_GLOBALS.getFlag(fCalledBackup)) { + BF_GLOBALS._walkRegions.proc1(21); + BF_GLOBALS._walkRegions.proc1(22); + + _object3.postInit(); + _object3.setVisage(343); + _object3.setObjectWrapper(new SceneObjectWrapper()); + _object3.animate(ANIM_MODE_1, NULL); + _object3.setDetails(350, 12, 13, 14, 1, NULL); + BF_GLOBALS._sceneItems.addBefore(&_object1, &_object3); + + _object3.setPosition(Common::Point(-10, 124)); + _object3.changeZoom(-1); + + _object4.postInit(); + _object4.setVisage(410); + _object4.setDetails(410, 8, 9, 10, 1, NULL); + _object4.fixPriority(148); + + if (_field1FC4) { + _object3.setPosition(Common::Point(108, 112)); + _object4.fixPriority(148); + _object4.setPosition(Common::Point(39, 168)); + + _sceneMode = 0; + } else { + _sceneMode = 4104; + } + } else { + _sceneMode = 0; + } + + _field1FC4 = 1; + } + break; + case 50: + default: + BF_GLOBALS.setFlag(onDuty); + _sound1.play(21); + _sceneMode = 4100; + break; + } + + signal(); + + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y), 410, 0, 1, 2, 1, NULL); +} + +void Scene410::signal() { + switch (_sceneMode) { + case 1: + BF_GLOBALS.set2Flags(f1097Frankie); + BF_GLOBALS.clearFlag(f1097Marina); + + BF_GLOBALS._v50CC8 = _field1FC4; + BF_GLOBALS._v50CC2 = _field1FBA; + BF_GLOBALS._v50CC6 = _field1FB8; + BF_GLOBALS._v50CC4 = _field1FB6; + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 2: + BF_GLOBALS._deathReason = 3; + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 3: + BF_GLOBALS._sceneManager.changeScene(415); + break; + case 5: + BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 315); + _sceneMode = 0; + BF_GLOBALS.set2Flags(f1015Frankie); + BF_GLOBALS.clearFlag(f1015Marina); + signal(); + break; + case 6: + BF_INVENTORY.setObjectScene(INV_22_SNUB, 1); + BF_INVENTORY.setObjectScene(INV_FRANKIE_ID, 1); + BF_GLOBALS.set2Flags(f1027Frankie); + BF_GLOBALS.clearFlag(f1027Marina); + _sceneMode = 0; + signal(); + break; + case 7: + BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 1); + signal(); + break; + case 8: + BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._player.changeAngle(225); + _object3.changeAngle(45); + _sceneMode = 4114; + _stripManager.start(4120, this); + break; + case 9: + _sceneMode = 4106; + _stripManager.start(4111, this); + _field1FBA = 1; + BF_GLOBALS.setFlag(fCuffedFrankie); + BF_GLOBALS._uiElements.addScore(30); + break; + case 10: + BF_GLOBALS._player.updateAngle(_object3._position); + _sceneMode = 0; + break; + case 4100: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4100, &_object2, &_object5, NULL); + BF_GLOBALS._walkRegions.proc1(16); + break; + case 4101: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4100, &_object1, &_object6, NULL); + BF_GLOBALS.setFlag(fDriverOutOfTruck); + BF_GLOBALS._walkRegions.proc1(7); + break; + case 4103: + BF_GLOBALS._player.disableControl(); + _sceneMode = 1; + setAction(&_sequenceManager1, this, 4103, &BF_GLOBALS._player, NULL); + break; + case 4104: + _field1FC4 = 1; + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4104, &_object4, &_object3, NULL); + break; + case 4105: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4105, &_object2, NULL); + case 4106: + BF_GLOBALS._player.disableControl(); + _sceneMode = 4119; + setAction(&_sequenceManager1, this, 4106, &_object2, NULL); + break; + case 4107: + BF_GLOBALS._player.disableControl(); + _sceneMode = 5; + setAction(&_sequenceManager1, this, 4107, &_object2, NULL); + break; + case 4108: + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.updateAngle(Common::Point(100, 170)); + BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._walkRegions.proc2(16); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4108, &_object3, NULL); + break; + case 4109: + if ((BF_GLOBALS._player._position.x > 116) && (BF_GLOBALS._player._position.x != 195) && + (BF_GLOBALS._player._position.y != 139)) { + ADD_PLAYER_MOVER(195, 139); + } + + BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4109, &_object1, &_object3, NULL); + break; + case 4110: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4110, &_object3, &_object1, NULL); + break; + case 4112: + BF_GLOBALS.setFlag(fGangInCar); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.updateAngle(Common::Point(100, 170)); + BF_GLOBALS._player.disableControl(); + _sceneMode = 4108; + setAction(&_sequenceManager1, this, 4112, &_object1, &_object2, &_object3, NULL); + break; + case 4114: + BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._player.disableControl(); + _sceneMode = 4116; + setAction(&_sequenceManager1, this, 4114, &_object3, &_object4, NULL); + break; + case 4116: + BF_GLOBALS._walkRegions.proc2(21); + BF_GLOBALS._walkRegions.proc2(22); + _object3.remove(); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4116, &_object4, NULL); + break; + case 4118: + BF_GLOBALS._player.disableControl(); + _sceneMode = 3; + setAction(&_sequenceManager1, this, 4118, &BF_GLOBALS._player, NULL); + break; + case 4119: + BF_GLOBALS._player.disableControl(); + _sceneMode = 4107; + setAction(&_sequenceManager1, this, 4119, &_object2, NULL); + break; + case 4121: + BF_GLOBALS._player.disableControl(); + _sceneMode = 6; + setAction(&_sequenceManager1, this, 4121, &BF_GLOBALS._player, &_object2, NULL); + break; + case 4122: + BF_GLOBALS._walkRegions.proc2(22); + BF_INVENTORY.setObjectScene(INV_22_SNUB, 0); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4122, &_object2, &_object3, NULL); + break; + case 4123: + BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 0); + BF_GLOBALS._player.disableControl(); + _sceneMode = 5; + setAction(&_sequenceManager1, this, 4123, &_object1, &BF_GLOBALS._player, NULL); + break; + case 4124: + BF_GLOBALS._player.disableControl(); + _sceneMode = 7; + setAction(&_sequenceManager1, this, 4124, &_object1, &BF_GLOBALS._player, NULL); + break; + case 4127: + SceneItem::display2(410, 16); + BF_GLOBALS._player.enableControl(); + break; + case 0: + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene410::process(Event &event) { + // Check for gun being clicked on player + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) && + BF_GLOBALS._player.contains(event.mousePos) && !BF_GLOBALS.getFlag(fCalledBackup)) { + if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { + if (!_action) { + event.handled = true; + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager1, this, 4102, &_object2, &BF_GLOBALS._player, NULL); + } + } else if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) { + if (!_action) { + _sceneMode = 1; + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager1, this, 4120, &_object2, &BF_GLOBALS._player, NULL); + } + } + } + + if (!event.handled) + SceneExt::process(event); +} + +void Scene410::dispatch() { + SceneExt::dispatch(); + if ((_sceneMode == 4112) || (_sceneMode == 4101)) { + _object3.updateAngle(_object1._position); + } +} + +/*-------------------------------------------------------------------------- + * Scene 415 - Searching Truck + * + *--------------------------------------------------------------------------*/ + +bool Scene415::GunInset::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (BF_GLOBALS.getFlag(fGotAutoWeapon)) { + FocusObject::startAction(action, event); + } else { + remove(); + scene->_gunAndWig.remove(); + } + return true; + } else { + return FocusObject::startAction(action, event); + } +} + +bool Scene415::GunAndWig::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + NamedObject::startAction(action, event); + BF_INVENTORY.setObjectScene(INV_AUTO_RIFLE, 1); + BF_INVENTORY.setObjectScene(INV_WIG, 1); + BF_GLOBALS.setFlag(fGotAutoWeapon); + BF_GLOBALS._uiElements.addScore(30); + + remove(); + return true; + case INV_FOREST_RAP: + if (scene->_fieldE14) + break; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(4126, scene); + BF_GLOBALS._uiElements.addScore(50); + scene->_fieldE14 = true; + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene415::BulletsInset::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (BF_GLOBALS.getFlag(fGotAutoWeapon)) { + FocusObject::startAction(action, event); + } else { + remove(); + scene->_theBullets.remove(); + } + return true; + } else { + return FocusObject::startAction(action, event); + } +} + +bool Scene415::DashDrawer::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) { + scene->showBullets(); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene415::TheBullets::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + NamedObject::startAction(action, event); + BF_INVENTORY.setObjectScene(INV_22_BULLET, 1); + BF_GLOBALS.setFlag(fGotBulletsFromDash); + BF_GLOBALS._uiElements.addScore(30); + + remove(); + scene->_dashDrawer.remove(); + return true; + case INV_FOREST_RAP: + if (scene->_fieldE16) { + SceneItem::display2(415, 35); + return true; + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(4122, scene); + BF_GLOBALS._uiElements.addScore(50); + scene->_fieldE16 = true; + } + break; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene415::Lever::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (BF_GLOBALS.getFlag(fGotAutoWeapon)) { + SceneItem::display2(415, 20); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager, scene, 4150, &scene->_object6, NULL); + } + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +Scene415::Scene415(): SceneExt() { + _fieldE14 = _fieldE16 = false; +} + +void Scene415::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_fieldE14); + s.syncAsSint16LE(_fieldE16); +} + +void Scene415::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(415); + + _stripManager.addSpeaker(&_jakeRadioSpeaker); + + _dashDrawer.postInit(); + _dashDrawer.setVisage(411); + _dashDrawer.setStrip(3); + _dashDrawer.setPosition(Common::Point(151, 97)); + _dashDrawer.setDetails(415, 22, -1, -1, 1, NULL); + + _object6.postInit(); + _object6.setVisage(419); + _object6.setStrip(1); + _object6.setPosition(Common::Point(306, 116)); + _object6.fixPriority(80); + + _windowLever.setDetails(16, 415, 25, -1, 26, 1); + _item7.setDetails(17, 415, 32, -1, 33, 1); + _seatBelt.setDetails(14, 415, 29, -1, 30, 1); + _lever.setDetails(19, 415, 23, 24, -1, 1); + _seat.setDetails(18, 415, 3, 4, 2, 1); + _dashboard.setDetails(20, 415, 11, 12, 19, 1); + _steeringWheel.setDetails(15, 415, 5, 6, 7, 1); + _horn.setDetails(31, 415, 8, 9, 10, 1); + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y), 415, 0, 1, 2, 1, NULL); + + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + BF_GLOBALS._events.setCursor(CURSOR_WALK); + + signal(); +} + +void Scene415::signal() { + switch (_sceneMode) { + case 1: + BF_GLOBALS._sceneManager.changeScene(410); + break; + case 2: + showGunAndWig(); + _sceneMode = 0; + signal(); + break; + case 0: + default: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + break; + } +} + +void Scene415::dispatch() { + SceneExt::dispatch(); + if (BF_GLOBALS.getFlag(fGotAutoWeapon) && BF_GLOBALS.getFlag(fGotBulletsFromDash)) { + _sceneMode = 1; + signal(); + } +} + +void Scene415::showBullets() { + _bulletsInset.postInit(); + _bulletsInset.setVisage(411); + _bulletsInset.setStrip(1); + _bulletsInset.setPosition(Common::Point(158, 100)); + _bulletsInset.setDetails(415, -1, -1, -1); + + _theBullets.postInit(); + _theBullets.setVisage(411); + _theBullets.setStrip(1); + _theBullets.setFrame(2); + _theBullets.setPosition(Common::Point(184, 86)); + _theBullets.fixPriority(105); + _theBullets.setDetails(415, 16, 17, 18, 1, NULL); + BF_GLOBALS._sceneItems.remove(&_theBullets); + BF_GLOBALS._sceneItems.push_front(&_theBullets); +} + +void Scene415::showGunAndWig() { + _gunInset.postInit(); + _gunInset.setVisage(411); + _gunInset.setStrip(2); + _gunInset.setPosition(Common::Point(158, 100)); + _gunInset.setDetails(415, -1, -1, -1); + + _gunAndWig.postInit(); + _gunAndWig.setVisage(411); + _gunAndWig.setStrip(2); + _gunAndWig.setFrame(2); + _gunAndWig.setPosition(Common::Point(159, 88)); + _gunAndWig.fixPriority(105); + _gunAndWig.setDetails(415, 13, 14, 15, 1, NULL); + + BF_GLOBALS._sceneItems.remove(&_gunAndWig); + BF_GLOBALS._sceneItems.push_front(&_gunAndWig); +} + +/*-------------------------------------------------------------------------- + * Scene 440 - Outside Alleycat Bowl + * + *--------------------------------------------------------------------------*/ + +bool Scene440::Doorway::startAction(CursorType action, Event &event) { + Scene440 *scene = (Scene440 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(440, 1); + return true; + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4400; + scene->setAction(&scene->_sequenceManager, scene, 4400, &BF_GLOBALS._player, this, &scene->_lyle, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene440::Vechile::startAction(CursorType action, Event &event) { + Scene440 *scene = (Scene440 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (BF_GLOBALS.getFlag(fWithLyle)) { + SceneItem::display2(440, 3); + } else { + SceneItem::display2(440, 2); + } + return true; + case CURSOR_USE: + if (BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4403; + scene->setAction(&scene->_sequenceManager, scene, 4403, &BF_GLOBALS._player, &scene->_lyle, NULL); + } else { + BF_GLOBALS._sceneManager.changeScene(60); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene440::Lyle::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(440, 4); + return true; + case CURSOR_TALK: + SceneItem::display2(440, 5); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene440::Item1::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(440, 0); + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene440::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(440); + setZoomPercents(75, 60, 120, 100); + BF_GLOBALS._sound1.fadeSound(33); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(303); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.setPosition(Common::Point(203, 113)); + + _vechile.postInit(); + + _lyle.postInit(); + _lyle.setVisage(835); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.setPosition(Common::Point(-40, -10)); + _lyle.changeZoom(-1); + _lyle.hide(); + BF_GLOBALS._sceneItems.push_back(&_lyle); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _vechile.setVisage(444); + _vechile.setFrame(2); + _vechile.setPosition(Common::Point(147, 128)); + _vechile.fixPriority(114); + + BF_GLOBALS._player.setVisage(303); + BF_GLOBALS._player.setPosition(Common::Point(187, 104)); + + _lyle.setPosition(Common::Point(135, 128)); + _lyle.show(); + + BF_GLOBALS._walkRegions.proc1(12); + BF_GLOBALS._walkRegions.proc1(13); + } else { + _vechile.setPosition(Common::Point(169, 121)); + _vechile.fixPriority(117); + + if (BF_GLOBALS.getFlag(onDuty)) { + _vechile.setVisage(440); + _vechile.setStrip(1); + + BF_GLOBALS._player.setVisage(304); + BF_GLOBALS._player.setStrip(3); + } else { + _vechile.setVisage(580); + _vechile.setStrip(2); + _vechile.setFrame(3); + + BF_GLOBALS._player.setVisage(303); + } + } + + BF_GLOBALS._sceneItems.push_back(&_vechile); + BF_GLOBALS._walkRegions.proc1(11); + + _doorway.postInit(); + _doorway.setVisage(440); + _doorway.setStrip(5); + _doorway.setPosition(Common::Point(198, 91)); + _doorway.fixPriority(80); + BF_GLOBALS._sceneItems.push_back(&_doorway); + + if (BF_GLOBALS._sceneManager._previousScene == 450) { + _lyle.setPosition(Common::Point(143, 93)); + _lyle.setStrip(5); + _lyle.fixPriority(90); + + _doorway.setFrame(_doorway.getFrameCount()); + _sceneMode = 4401; + setAction(&_sequenceManager, this, 4401, &BF_GLOBALS._player, &_doorway, NULL); + } else if (BF_GLOBALS.getFlag(fWithLyle)) { + _sceneMode = 4402; + setAction(&_sequenceManager, this, 4402, &_lyle, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + + _item1.setBounds(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y - 1)); + BF_GLOBALS._sceneItems.push_back(&_item1); +} + +void Scene440::signal() { + switch (_sceneMode) { + case 4400: + BF_GLOBALS._sceneManager.changeScene(450); + break; + case 4401: + BF_GLOBALS._player.fixPriority(-1); + BF_GLOBALS._player.enableControl(); + break; + case 4402: + BF_GLOBALS._player.enableControl(); + break; + case 4403: + BF_GLOBALS._sceneManager.changeScene(60); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 450 - Inside Alleycat Bowl + * + *--------------------------------------------------------------------------*/ + +bool Scene450::Object1::startAction(CursorType action, Event &event) { + Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(450, 0); + return true; + case CURSOR_USE: + SceneItem::display2(450, 1); + return true; + case CURSOR_TALK: + case INV_ID: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4504; + if (_flag) { + scene->setAction(&scene->_sequenceManager, scene, 4515, &BF_GLOBALS._player, this, NULL); + } else { + ++_flag; + scene->setAction(&scene->_sequenceManager, scene, 4504, &BF_GLOBALS._player, this, NULL); + } + return true; + case INV_FOREST_RAP: + BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 450); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._uiElements.addScore(30); + + scene->_sceneMode = 4505; + scene->setAction(&scene->_sequenceManager, scene, 4505, &BF_GLOBALS._player, this, + &scene->_counterDoor, &scene->_object2, NULL); + return true; + default: + return NamedObjectExt::startAction(action, event); + } +} + +bool Scene450::Object3::startAction(CursorType action, Event &event) { + Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(450, 4); + return true; + case CURSOR_USE: + SceneItem::display2(450, 5); + return true; + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4502; + if (BF_GLOBALS.getFlag(onDuty)) { + scene->setAction(&scene->_sequenceManager, scene, 4516, &BF_GLOBALS._player, this, NULL); + } else { + scene->setAction(&scene->_sequenceManager, scene, 4502, &BF_GLOBALS._player, this, NULL); + } + return true; + case INV_NAPKIN: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4509; + scene->setAction(&scene->_sequenceManager, scene, 4509, &BF_GLOBALS._player, this, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene450::Object4::startAction(CursorType action, Event &event) { + Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(450, 6); + return true; + case CURSOR_USE: + SceneItem::display2(450, 7); + return true; + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS.getFlag(takenWeasel) && !BF_GLOBALS.getFlag(gotTrailer450)) { + BF_GLOBALS.setFlag(gotTrailer450); + scene->_sceneMode = 4517; + scene->setAction(&scene->_sequenceManager, scene, 4517, &BF_GLOBALS._player, this, + &scene->_door, NULL); + } else { + animate(ANIM_MODE_8, 1, NULL); + + if (scene->_field19AC) { + scene->_sceneMode = 2; + if (scene->_field19AE) { + scene->_stripManager.start(4521, scene); + } else { + scene->_field19AE = 1; + scene->_stripManager.start(4512, scene); + } + } else { + scene->_sceneMode = 4506; + if (scene->_field19AE) { + scene->setAction(&scene->_sequenceManager, scene, 4518, &BF_GLOBALS._player, this, NULL); + } else { + scene->_sceneMode = 4506; + scene->_field19AE = 1; + scene->setAction(&scene->_sequenceManager, scene, 4506, &BF_GLOBALS._player, this, NULL); + } + } + } + return true; + case INV_FOREST_RAP: + SceneItem::display2(450, 19); + return true; + case INV_NAPKIN: + animate(ANIM_MODE_8, 1, NULL); + BF_GLOBALS._player.disableControl(); + + if (BF_GLOBALS.getFlag(showEugeneNapkin)) { + SceneItem::display2(450, 16); + BF_GLOBALS._player.enableControl(); + } else { + BF_GLOBALS.setFlag(showEugeneNapkin); + + if (!BF_GLOBALS.getFlag(showEugeneID)) { + scene->_sceneMode = 4513; + scene->setAction(&scene->_sequenceManager, scene, 4513, &BF_GLOBALS._player, this, NULL); + } else if (BF_GLOBALS.getFlag(fMgrCallsWeasel)) { + SceneItem::display2(450, 16); + BF_GLOBALS._player.enableControl(); + } else { + BF_GLOBALS._uiElements.addScore(30); + scene->_sceneMode = 4510; + BF_INVENTORY.setObjectScene(INV_NAPKIN, 450); + scene->setAction(&scene->_sequenceManager, scene, 4510, &BF_GLOBALS._player, this, NULL); + } + } + return true; + case INV_ID: + if (BF_GLOBALS.getFlag(takenWeasel)) { + return startAction(CURSOR_TALK, event); + } else { + animate(ANIM_MODE_8, 1, NULL); + BF_GLOBALS._player.disableControl(); + + if (!BF_GLOBALS.getFlag(showEugeneID)) + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(showEugeneID); + + if ((BF_GLOBALS.getFlag(showRapEugene) || BF_GLOBALS.getFlag(showEugeneNapkin)) && + !BF_GLOBALS.getFlag(fMgrCallsWeasel)) { + BF_GLOBALS._uiElements.addScore(30); + scene->_sceneMode = 4511; + scene->setAction(&scene->_sequenceManager, scene, 4511, &BF_GLOBALS._player, this, NULL); + } else { + scene->_sceneMode = 4506; + scene->setAction(&scene->_sequenceManager, scene, 4512, &BF_GLOBALS._player, this, NULL); + } + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene450::Item1::startAction(CursorType action, Event &event) { + Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; + + if (event.eventType == EVENT_BUTTON_DOWN) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4501; + scene->signal(); + return true; + } else { + return false; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene450::Scene450(): SceneExt() { + _field19AC = _field19AE = 0; +} + +void Scene450::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field19AC); + s.syncAsSint16LE(_field19AE); +} + +void Scene450::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(450); + setZoomPercents(110, 90, 155, 115); + BF_GLOBALS._sound1.fadeSound(13); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_eugeneSpeaker); + _stripManager.addSpeaker(&_billySpeaker); + _stripManager.addSpeaker(&_weaselSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1341 : 129); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setPosition(Common::Point(-30, 155)); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.disableControl(); + + _door.postInit(); + _door.setVisage(450); + _door.setStrip(2); + _door.setPosition(Common::Point(72, 80)); + _door.setDetails(450, 15, -1, 13, 1, NULL); + + _counterDoor.postInit(); + _counterDoor.setVisage(450); + _counterDoor.setPosition(Common::Point(39, 104)); + _counterDoor.fixPriority(100); + _counterDoor.setDetails(450, 12, -1, 13, 1, NULL); + + if (BF_GLOBALS._dayNumber != 3) { + _object3.postInit(); + _object3.setVisage(463); + _object3.setPosition(Common::Point(138, 121)); + _object3.fixPriority(100); + _object3.setFrame(_object3.getFrameCount()); + BF_GLOBALS._sceneItems.push_back(&_object3); + } else if (!BF_GLOBALS.getFlag(fWithLyle) || !BF_GLOBALS.getFlag(fGivenNapkin) || + (BF_INVENTORY.getObjectScene(BF_ITEM_67) == 1)) { + _object3.postInit(); + _object3.setVisage(463); + _object3.setPosition(Common::Point(138, 121)); + _object3.fixPriority(100); + _object3.setFrame(_object3.getFrameCount()); + BF_GLOBALS._sceneItems.push_back(&_object3); + } else { + _object4.postInit(); + _object4.setVisage(467); + _object4.setPosition(Common::Point(138, 121)); + _object4.changeZoom(-1); + BF_GLOBALS._sceneItems.push_back(&_object4); + + if (!BF_GLOBALS.getFlag(takenWeasel)) { + _object2.postInit(); + _object2.setVisage(469); + _object2.animate(ANIM_MODE_1, NULL); + _object2.setObjectWrapper(new SceneObjectWrapper()); + _object2.setPosition(Common::Point(-30, 126)); + ADD_MOVER_NULL(_object2, 27, 126); + _object2.changeZoom(-1); + _object2.setDetails(450, 2, 18, 3, 1, NULL); + + BF_GLOBALS._walkRegions.proc1(4); + + _object1.postInit(); + _object1.setVisage(466); + _object1.animate(ANIM_MODE_1, NULL); + _object1.setObjectWrapper(new SceneObjectWrapper()); + _object1.setPosition(Common::Point(70, 80)); + _object1.setStrip(5); + _object1.changeZoom(90); + _object1.fixPriority(65); + _object1._flag = 0; + BF_GLOBALS._sceneItems.push_back(&_object1); + } + } + + _sceneMode = 4500; + setAction(&_sequenceManager, this, 4500, &BF_GLOBALS._player, NULL); + + _exit.setDetails(Rect(0, 100, 4, 167), 450, -1, -1, -1, 1, NULL); + _counter.setDetails(8, 450, 8, -1, 9, 1); + _shelf.setDetails(Rect(114, 10, 179, 77), 450, 10, -1, 11, 1, NULL); + _interior.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 450, 14, -1, -1, 1, NULL); +} + +void Scene450::signal() { + switch (_sceneMode) { + case 450: + case 451: + BF_GLOBALS._sceneManager.changeScene(440); + break; + case 4501: + if (BF_GLOBALS._sceneObjects->contains(&_object2)) { + ADD_MOVER(_object2, -20, 135); + } else { + ADD_PLAYER_MOVER(0, 160); + } + break; + case 4503: + _object1.fixPriority(100); + BF_GLOBALS._player.enableControl(); + break; + case 4505: + BF_GLOBALS.setFlag(takenWeasel); + _object1.remove(); + _object2.remove(); + BF_GLOBALS._walkRegions.proc2(4); + BF_GLOBALS._player.enableControl(); + break; + case 4507: + case 4510: + case 4511: + BF_GLOBALS.setFlag(fMgrCallsWeasel); + _field19AC = 1; + _sceneMode = 4503; + setAction(&_sequenceManager, this, 4503, &_object1, &_door, &_object4, NULL); + break; + case 4508: + _object4.remove(); + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + break; + case 4517: + BF_GLOBALS.setFlag(gotTrailer450); + BF_INVENTORY.setObjectScene(BF_ITEM_67, 1); + _sceneMode = 4508; + setAction(&_sequenceManager, this, 4508, &BF_GLOBALS._player, &_object4, &_door, NULL); + break; + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene450::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_exit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + BF_GLOBALS._events.setCursor(surface); + } else { + // In case an exit cursor was being shown, restore the previously selected cursor + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } +} + +} // End of namespace BlueForce + +} // End of namespace TsAGE |