1 /* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 *
21 */
22
23 #include "tsage/blue_force/blueforce_scenes4.h"
24 #include "tsage/scenes.h"
25 #include "tsage/tsage.h"
26 #include "tsage/staticres.h"
27
28 namespace TsAGE {
29
30 namespace BlueForce {
31
32 /*--------------------------------------------------------------------------
33 * Scene 410 - Traffic Stop Gang Members
34 *
35 *--------------------------------------------------------------------------*/
36
37 // Talk to driver with backup
signal()38 void Scene410::Action1::signal() {
39 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
40
41 switch (scene->_action1Count++) {
42 case 0:
43 if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
44 setDelay(3);
45 } else {
46 scene->_sceneMode = 4101;
47 scene->_stripManager.start(4103, scene);
48 }
49 break;
50 case 1:
51 scene->_sceneMode = 0;
52 scene->_stripManager.start(4104, scene);
53 break;
54 case 2:
55 scene->_sceneMode = 0;
56 scene->_stripManager.start(4105, scene);
57 break;
58 default:
59 scene->_sceneMode = 0;
60 scene->_stripManager.start(4106, scene);
61 break;
62 }
63 }
64
65 // Talk to passenger with backup
signal()66 void Scene410::Action2::signal() {
67 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
68 BF_GLOBALS._player.disableControl();
69
70 switch (scene->_talkCount++) {
71 case 0:
72 scene->_sceneMode = 4105;
73 scene->_stripManager.start(BF_GLOBALS.getFlag(fTalkedShooterNoBkup) ? 4123 : 4107, scene);
74 break;
75 case 1:
76 scene->_sceneMode = 4110;
77 scene->_stripManager.start(4102, scene);
78 break;
79 case 2:
80 scene->_sceneMode = 0;
81 scene->_stripManager.start(4108, scene);
82 break;
83 case 3:
84 scene->_sceneMode = 0;
85 scene->_stripManager.start(4109, scene);
86 break;
87 case 4:
88 scene->_sceneMode = 0;
89 scene->_stripManager.start(4110, scene);
90 break;
91 default:
92 SceneItem::display(410, 11, SET_WIDTH, 300,
93 SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 10,
94 SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
95 SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 13, SET_EXT_BGCOLOR, 82,
96 SET_EXT_FGCOLOR, 13, LIST_END);
97 BF_GLOBALS._player.enableControl();
98 break;
99 }
100 }
101
102 // Talk to passenger without backup
signal()103 void Scene410::Action3::signal() {
104 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
105 if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) {
106 BF_GLOBALS._player.disableControl();
107 scene->_sceneMode = 2;
108 scene->setAction(&scene->_sequenceManager1, scene, 4102, &scene->_passenger, &BF_GLOBALS._player, NULL);
109 } else {
110 BF_GLOBALS.setFlag(fTalkedShooterNoBkup);
111 scene->_sceneMode = 0;
112 scene->_stripManager.start(4107, scene);
113 }
114 }
115
116 // Talk to driver without backup
signal()117 void Scene410::Action4::signal() {
118 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
119
120 if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
121 BF_GLOBALS._player.disableControl();
122 scene->_sceneMode = 2;
123 scene->setAction(&scene->_sequenceManager1, scene, 4120, &scene->_passenger, &BF_GLOBALS._player, NULL);
124 } else {
125 BF_GLOBALS._player.disableControl();
126 BF_GLOBALS.setFlag(fTalkedDriverNoBkup);
127 scene->_sceneMode = 4101;
128 scene->_stripManager.start(4103, scene);
129 }
130 }
131
132 // Talk to passenger
signal()133 void Scene410::Action5::signal() {
134 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
135
136 switch (_actionIndex++) {
137 case 0:
138 if (!scene->_harrisonMovedFl) {
139 ADD_PLAYER_MOVER(114, 133);
140 } else {
141 ADD_PLAYER_MOVER(195, 139);
142 }
143 break;
144 case 1:
145 BF_GLOBALS._player.updateAngle(scene->_passenger._position);
146 setDelay(3);
147 break;
148 case 2:
149 setDelay(3);
150 break;
151 case 3:
152 if (BF_GLOBALS.getFlag(fCalledBackup))
153 scene->setAction(&scene->_action2);
154 else
155 scene->setAction(&scene->_action3);
156 remove();
157 break;
158 default:
159 break;
160 }
161 }
162
163 // Talk to driver
signal()164 void Scene410::Action6::signal() {
165 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
166
167 switch (_actionIndex++) {
168 case 0:
169 if (!scene->_harrisonMovedFl) {
170 ADD_PLAYER_MOVER(114, 133);
171 } else {
172 ADD_PLAYER_MOVER(126, 99);
173 }
174 break;
175 case 1:
176 BF_GLOBALS._player.updateAngle(scene->_driver._position);
177 setDelay(3);
178 break;
179 case 2:
180 setDelay(3);
181 break;
182 case 3:
183 if (BF_GLOBALS.getFlag(fCalledBackup))
184 scene->setAction(&scene->_action1);
185 else
186 scene->setAction(&scene->_action4);
187 remove();
188 break;
189 default:
190 break;
191 }
192 }
193
signal()194 void Scene410::Action7::signal() {
195 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
196
197 switch (_actionIndex++) {
198 case 0:
199 BF_GLOBALS._player.disableControl();
200 setDelay(2);
201 break;
202 case 1:
203 BF_GLOBALS._bookmark = bStoppedFrankie;
204 BF_GLOBALS.set2Flags(f1098Frankie);
205 BF_GLOBALS.clearFlag(f1098Marina);
206 scene->_stripManager.start(4113, this);
207 break;
208 case 2:
209 case 4:
210 setDelay(2);
211 break;
212 case 3:
213 BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
214 BF_GLOBALS._player.updateAngle(Common::Point(100, 170));
215 setAction(&scene->_sequenceManager1, this, 4112, &scene->_driver, &scene->_passenger,
216 &scene->_harrison, NULL);
217 break;
218 case 5:
219 T2_GLOBALS._uiElements.addScore(30);
220 setAction(&scene->_sequenceManager1, this, 4118, &BF_GLOBALS._player, NULL);
221 BF_GLOBALS._player.disableControl();
222 break;
223 case 6:
224 scene->_sceneMode = 3;
225 scene->signal();
226 break;
227 default:
228 break;
229 }
230 }
231
232 /*--------------------------------------------------------------------------*/
233
startAction(CursorType action,Event & event)234 bool Scene410::Motorcycle::startAction(CursorType action, Event &event) {
235 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
236
237 switch (action) {
238 case CURSOR_USE:
239 if (!BF_GLOBALS.getFlag(fCalledBackup)) {
240 scene->_sceneMode = 4103;
241 scene->signal();
242 } else if (BF_GLOBALS.getFlag(fSearchedTruck) && !BF_GLOBALS._sceneObjects->contains(&scene->_harrison)) {
243 scene->_sceneMode = 4103;
244 scene->signal();
245 } else if (scene->_cuffedDriverFl) {
246 SceneItem::display2(410, 12);
247 } else {
248 scene->_sceneMode = 4103;
249 scene->signal();
250 }
251 return true;
252 default:
253 return NamedHotspot::startAction(action, event);
254 }
255 }
256
startAction(CursorType action,Event & event)257 bool Scene410::TruckFront::startAction(CursorType action, Event &event) {
258 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
259
260 switch (action) {
261 case CURSOR_USE:
262 if ((BF_GLOBALS._bookmark < bStoppedFrankie) && (!scene->_cuffedDriverFl || !scene->_harrissonTalkFl))
263 break;
264 else if (BF_GLOBALS.getFlag(fSearchedTruck))
265 SceneItem::display2(410, 13);
266 else if (BF_GLOBALS.getFlag(fGangInCar)) {
267 T2_GLOBALS._uiElements.addScore(30);
268 scene->_sceneMode = 4118;
269 scene->signal();
270 } else {
271 scene->setAction(&scene->_action7);
272 }
273 return true;
274 default:
275 break;
276 }
277
278 return NamedHotspot::startAction(action, event);
279 }
280
281
282 /*--------------------------------------------------------------------------*/
283
startAction(CursorType action,Event & event)284 bool Scene410::Driver::startAction(CursorType action, Event &event) {
285 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
286
287 switch (action) {
288 case CURSOR_USE:
289 if (!BF_GLOBALS.getFlag(fCalledBackup)) {
290 if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
291 scene->setAction(&scene->_action4);
292 } else {
293 SceneItem::display2(410, 7);
294 }
295 } else if (!scene->_cuffedDriverFl) {
296 SceneItem::display2(410, 7);
297 } else if (!scene->_getDriverFl) {
298 scene->_sceneMode = 4124;
299 scene->_getDriverFl = true;
300 T2_GLOBALS._uiElements.addScore(30);
301 scene->signal();
302 } else {
303 break;
304 }
305 return true;
306 case CURSOR_TALK:
307 BF_GLOBALS._player.setAction(&scene->_action6);
308 return true;
309 case INV_HANDCUFFS:
310 if (BF_GLOBALS.getFlag(fCalledBackup)) {
311 if ((scene->_talkCount < 5) || (scene->_action1Count < 1) || scene->_cuffedDriverFl)
312 break;
313
314 BF_GLOBALS._player.disableControl();
315 scene->_sceneMode = 4123;
316 scene->_stripManager.start(4125, scene);
317 scene->_cuffedDriverFl = true;
318 T2_GLOBALS._uiElements.addScore(30);
319 } else {
320 if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
321 scene->setAction(&scene->_action4);
322 } else {
323 break;
324 }
325 }
326 return true;
327 case INV_TICKET_BOOK:
328 if (!BF_GLOBALS.getFlag(fDriverOutOfTruck)) {
329 return startAction(CURSOR_TALK, event);
330 } else if (!scene->_harrisonMovedFl) {
331 BF_GLOBALS._player.disableControl();
332 scene->_sceneMode = 2;
333 scene->setAction(&scene->_sequenceManager1, scene, 4120, &scene->_passenger, &BF_GLOBALS._player, NULL);
334 } else if (scene->_cuffedDriverFl || scene->_driverOutOfTruckFl) {
335 break;
336 } else {
337 scene->_driverOutOfTruckFl = true;
338 T2_GLOBALS._uiElements.addScore(30);
339 BF_GLOBALS._player.disableControl();
340 scene->_sceneMode = 4127;
341 scene->setAction(&scene->_sequenceManager1, scene, 4127, &BF_GLOBALS._player, &scene->_driver, NULL);
342 }
343 return true;
344 case INV_MIRANDA_CARD:
345 if (!scene->_cuffedDriverFl)
346 return false;
347
348 if (BF_GLOBALS.getFlag(readFrankRights)) {
349 SceneItem::display2(390, 15);
350 } else {
351 BF_GLOBALS.setFlag(readFrankRights);
352 T2_GLOBALS._uiElements.addScore(30);
353 BF_GLOBALS._player.disableControl();
354 scene->_sceneMode = 0;
355
356 // TODO: Original code pushes a copy of the entirety of object1 onto stack
357 scene->setAction(&scene->_sequenceManager1, scene, 4126, &BF_GLOBALS._player, &scene->_driver, NULL);
358 }
359 return true;
360 default:
361 break;
362 }
363
364 return NamedObject::startAction(action, event);
365 }
366
startAction(CursorType action,Event & event)367 bool Scene410::Passenger::startAction(CursorType action, Event &event) {
368 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
369
370 switch (action) {
371 case CURSOR_USE:
372 if (!BF_GLOBALS.getFlag(fCalledBackup)) {
373 if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup))
374 scene->setAction(&scene->_action3);
375 else
376 SceneItem::display(410, 5, SET_WIDTH, 300,
377 SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left,
378 SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
379 SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 96, SET_EXT_BGCOLOR, 99,
380 SET_EXT_FGCOLOR, 13, LIST_END);
381 } else if (!scene->_harrissonTalkFl) {
382 SceneItem::display(410, 5, SET_WIDTH, 300,
383 SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left,
384 SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
385 SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 96, SET_EXT_BGCOLOR, 99,
386 SET_EXT_FGCOLOR, 13, LIST_END);
387 } else if (!scene->_cuffedPassengerFl) {
388 scene->_sceneMode = 4121;
389 scene->_cuffedPassengerFl = true;
390 T2_GLOBALS._uiElements.addScore(50);
391 scene->signal();
392 } else
393 break;
394 return true;
395 case CURSOR_TALK:
396 scene->setAction(&scene->_action5);
397 return true;
398 case INV_HANDCUFFS:
399 if (BF_GLOBALS.getFlag(fCalledBackup)) {
400 if ((scene->_talkCount < 5) || (scene->_harrissonTalkFl))
401 break;
402
403 BF_GLOBALS._player.disableControl();
404 scene->_sceneMode = 9;
405 Common::Point destPos(195, 139);
406 PlayerMover *mover = new PlayerMover();
407 BF_GLOBALS._player.addMover(mover, &destPos, scene);
408 } else if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) {
409 scene->setAction(&scene->_action3);
410 } else {
411 break;
412 }
413 return true;
414 case INV_MIRANDA_CARD:
415 if (!scene->_harrissonTalkFl)
416 break;
417
418 if (BF_GLOBALS.getFlag(readFrankRights)) {
419 SceneItem::display2(390, 15);
420 } else {
421 BF_GLOBALS.setFlag(readFrankRights);
422 T2_GLOBALS._uiElements.addScore(30);
423 BF_GLOBALS._player.disableControl();
424
425 scene->_sceneMode = 0;
426 scene->setAction(&scene->_sequenceManager1, scene, 4125, &BF_GLOBALS._player,
427 &scene->_passenger, NULL);
428 }
429 return true;
430 default:
431 break;
432 }
433
434 return NamedObject::startAction(action, event);
435 }
436
startAction(CursorType action,Event & event)437 bool Scene410::Harrison::startAction(CursorType action, Event &event) {
438 Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene;
439
440 switch (action) {
441 case CURSOR_TALK:
442 if (BF_GLOBALS._bookmark == bStoppedFrankie) {
443 if (BF_GLOBALS.getFlag(fSearchedTruck)) {
444 BF_GLOBALS._player.disableControl();
445 scene->_sceneMode = 8;
446
447 Common::Point destPos(147, 143);
448 PlayerMover *mover = new PlayerMover();
449 BF_GLOBALS._player.addMover(mover, &destPos, scene);
450 } else {
451 SceneItem::display(350, 13, SET_WIDTH, 300,
452 SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left,
453 SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
454 SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 32, SET_EXT_BGCOLOR, 49,
455 SET_EXT_FGCOLOR, 13, LIST_END);
456 }
457 } else if (scene->_harrissonTalkFl && scene->_cuffedDriverFl) {
458 BF_GLOBALS._player.disableControl();
459 scene->_sceneMode = 4112;
460 scene->_stripManager.start(4113, scene);
461 BF_GLOBALS._bookmark = bStoppedFrankie;
462 BF_GLOBALS.set2Flags(f1098Frankie);
463 BF_GLOBALS.clearFlag(f1098Marina);
464 } else if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) ||
465 (!scene->_harrissonTalkFl && (scene->_talkCount < 5))) {
466 SceneItem::display(350, 13, SET_WIDTH, 300,
467 SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left,
468 SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2,
469 SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 32, SET_EXT_BGCOLOR, 49,
470 SET_EXT_FGCOLOR, 13, LIST_END);
471 } else if (!scene->_harrissonTalkFl) {
472 BF_GLOBALS._player.disableControl();
473 scene->_harrissonTalkFl = true;
474 scene->_cuffedPassengerFl = true;
475 BF_GLOBALS._walkRegions.enableRegion(22);
476 scene->_sceneMode = 4122;
477 scene->_stripManager.start(4112, scene);
478 } else if (scene->_action1Count < 1) {
479 break;
480 } else if (scene->_cuffedDriverFl) {
481 error("Error - want to cuff driver, but he's cuffed already");
482 } else {
483 BF_GLOBALS._player.disableControl();
484 scene->_cuffedDriverFl = true;
485 scene->_getDriverFl = true;
486 BF_GLOBALS._walkRegions.enableRegion(22);
487 scene->_sceneMode = 4109;
488 scene->_stripManager.start(4112, scene);
489 }
490 return true;
491 default:
492 break;
493 }
494
495 return NamedObject::startAction(action, event);
496 }
497
498
499 /*--------------------------------------------------------------------------*/
500
Scene410()501 Scene410::Scene410(): SceneExt() {
502 _cuffedDriverFl = _harrissonTalkFl = _driverOutOfTruckFl = false;
503 _harrisonMovedFl = false;
504
505 _action1Count = _talkCount = 0;
506 _cuffedPassengerFl = false;
507 _getDriverFl = false;
508 }
509
synchronize(Serializer & s)510 void Scene410::synchronize(Serializer &s) {
511 SceneExt::synchronize(s);
512 s.syncAsSint16LE(_action1Count);
513 s.syncAsSint16LE(_talkCount);
514 s.syncAsSint16LE(_harrissonTalkFl);
515 s.syncAsSint16LE(_cuffedDriverFl);
516 s.syncAsSint16LE(_cuffedPassengerFl);
517 s.syncAsSint16LE(_getDriverFl);
518 s.syncAsSint16LE(_driverOutOfTruckFl);
519 s.syncAsSint16LE(_harrisonMovedFl);
520 }
521
postInit(SceneObjectList * OwnerList)522 void Scene410::postInit(SceneObjectList *OwnerList) {
523 SceneExt::postInit();
524 loadScene(410);
525 setZoomPercents(74, 75, 120, 100);
526
527 if (BF_GLOBALS._sceneManager._previousScene != 60)
528 _sound1.fadeSound(11);
529 BF_GLOBALS._driveToScene = 64;
530 BF_GLOBALS._mapLocationId = 64;
531 BF_GLOBALS.setFlag(fArrivedAtGangStop);
532
533 _stripManager.addSpeaker(&_gameTextSpeaker);
534 _stripManager.addSpeaker(&_jakeUniformSpeaker);
535 _stripManager.addSpeaker(&_harrisonSpeaker);
536 _stripManager.addSpeaker(&_shooterSpeaker);
537 _stripManager.addSpeaker(&_driverSpeaker);
538
539 BF_GLOBALS._player.postInit();
540 BF_GLOBALS._player.setVisage(1341);
541 BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
542 BF_GLOBALS._player.changeAngle(90);
543 BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
544 BF_GLOBALS._player.setPosition(Common::Point(114, 133));
545 BF_GLOBALS._player.changeZoom(-1);
546
547 _motorcycle.setDetails(8, 410, 15, -1, -1, 1);
548
549 _passenger.postInit();
550 _passenger.setVisage(415);
551 _passenger.setStrip(1);
552 _passenger.setPosition(Common::Point(278, 92));
553 _passenger.setDetails(410, 4, -1, 5, 1, (SceneItem *)NULL);
554
555 _driver.postInit();
556 _driver.setVisage(416);
557 _driver.setStrip(2);
558 _driver.setPosition(Common::Point(244, 85));
559 _driver.setDetails(410, 6, -1, 7, 1, (SceneItem *)NULL);
560 _driver.changeZoom(-1);
561
562 _object5.postInit();
563 _object5.setVisage(410);
564 _object5.setStrip(2);
565 _object5.setPosition(Common::Point(282, 96));
566
567 _object6.postInit();
568 _object6.setVisage(410);
569 _object6.setStrip(4);
570 _object6.setPosition(Common::Point(240, 43));
571
572 _truckFront.setDetails(6, 410, 3, -1, -1, 1);
573 _truckBack.setDetails(7, 410, 3, -1, -1, 1);
574
575 switch (BF_GLOBALS._sceneManager._previousScene) {
576 case 415:
577 BF_GLOBALS.setFlag(fSearchedTruck);
578 BF_GLOBALS._player.setPosition(Common::Point(210, 90));
579
580 _passenger.remove();
581 _driver.remove();
582 BF_GLOBALS._walkRegions.disableRegion(21);
583 BF_GLOBALS._walkRegions.disableRegion(22);
584
585 _harrison.postInit();
586 _harrison.setVisage(343);
587 _harrison.setObjectWrapper(new SceneObjectWrapper());
588 _harrison.animate(ANIM_MODE_1, NULL);
589 _harrison.setDetails(350, 12, 13, 14, 1, (SceneItem *)NULL);
590 _harrison.setPosition(Common::Point(97, 185));
591 _harrison.changeZoom(-1);
592
593 _patrolCar.postInit();
594 _patrolCar.setVisage(410);
595 _patrolCar.setDetails(410, 8, 9, 10, 1, (SceneItem *)NULL);
596 _patrolCar.fixPriority(148);
597 _patrolCar.setPosition(Common::Point(39, 168));
598
599 _harrisonMovedFl = true;
600 _sceneMode = 0;
601 signal();
602 break;
603 case 60:
604 if (BF_GLOBALS.getFlag(fSearchedTruck)) {
605 _passenger.remove();
606 _driver.remove();
607 _sceneMode = 0;
608 } else {
609 _harrisonMovedFl = BF_GLOBALS._scene410HarrisonMovedFl;
610 _harrissonTalkFl = BF_GLOBALS._scene410HarrisonTalkFl;
611 _talkCount = BF_GLOBALS._scene410TalkCount;
612 _action1Count = BF_GLOBALS._scene410Action1Count;
613
614 _passenger.setVisage(418);
615 _passenger.setStrip(6);
616 _passenger.setPosition(Common::Point(227, 137));
617
618 if (_talkCount > 0) {
619 _passenger.setVisage(415);
620 _passenger.setStrip(2);
621 _passenger.setFrame(5);
622 }
623 if (_harrissonTalkFl) {
624 _passenger.setVisage(415);
625 _passenger.setStrip(6);
626 _passenger.setFrame(8);
627 }
628
629 BF_GLOBALS._walkRegions.disableRegion(16);
630 if (BF_GLOBALS.getFlag(fDriverOutOfTruck)) {
631 _driver.setVisage(417);
632 _driver.setStrip(1);
633 _driver.setPosition(Common::Point(152, 97));
634
635 BF_GLOBALS._walkRegions.disableRegion(7);
636 }
637
638 if (BF_GLOBALS.getFlag(fCalledBackup)) {
639 BF_GLOBALS._walkRegions.disableRegion(21);
640 BF_GLOBALS._walkRegions.disableRegion(22);
641
642 _harrison.postInit();
643 _harrison.setVisage(343);
644 _harrison.setObjectWrapper(new SceneObjectWrapper());
645 _harrison.animate(ANIM_MODE_1, NULL);
646 _harrison.setDetails(350, 12, 13, 14, 1, (SceneItem *)NULL);
647 BF_GLOBALS._sceneItems.addBefore(&_driver, &_harrison);
648
649 _harrison.setPosition(Common::Point(-10, 124));
650 _harrison.changeZoom(-1);
651
652 _patrolCar.postInit();
653 _patrolCar.setVisage(410);
654 _patrolCar.setDetails(410, 8, 9, 10, 1, (SceneItem *)NULL);
655 _patrolCar.fixPriority(148);
656
657 if (_harrisonMovedFl) {
658 _harrison.setPosition(Common::Point(108, 112));
659 _patrolCar.fixPriority(148);
660 _patrolCar.setPosition(Common::Point(39, 168));
661
662 _sceneMode = 0;
663 } else {
664 _sceneMode = 4104;
665 }
666 } else {
667 _sceneMode = 0;
668 }
669
670 _harrisonMovedFl = true;
671 }
672 break;
673 case 50:
674 default:
675 BF_GLOBALS.setFlag(onDuty);
676 _sound1.play(21);
677 _sceneMode = 4100;
678 break;
679 }
680
681 signal();
682
683 _background.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 410, 0, 1, 2, 1, NULL);
684 }
685
signal()686 void Scene410::signal() {
687 switch (_sceneMode) {
688 case 1:
689 BF_GLOBALS.set2Flags(f1097Frankie);
690 BF_GLOBALS.clearFlag(f1097Marina);
691
692 BF_GLOBALS._scene410HarrisonMovedFl = _harrisonMovedFl;
693 BF_GLOBALS._scene410HarrisonTalkFl = _harrissonTalkFl;
694 BF_GLOBALS._scene410TalkCount = _talkCount;
695 BF_GLOBALS._scene410Action1Count = _action1Count;
696 BF_GLOBALS._sceneManager.changeScene(60);
697 break;
698 case 2:
699 BF_GLOBALS._deathReason = 3;
700 BF_GLOBALS._sound1.fadeOut2(NULL);
701 BF_GLOBALS._sceneManager.changeScene(666);
702 break;
703 case 3:
704 BF_GLOBALS._sceneManager.changeScene(415);
705 break;
706 case 5:
707 BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 315);
708 _sceneMode = 0;
709 BF_GLOBALS.set2Flags(f1015Frankie);
710 BF_GLOBALS.clearFlag(f1015Marina);
711 signal();
712 break;
713 case 6:
714 BF_INVENTORY.setObjectScene(INV_22_SNUB, 1);
715 BF_INVENTORY.setObjectScene(INV_FRANKIE_ID, 1);
716 BF_GLOBALS.set2Flags(f1027Frankie);
717 BF_GLOBALS.clearFlag(f1027Marina);
718 _sceneMode = 0;
719 signal();
720 break;
721 case 7:
722 BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 1);
723 _sceneMode = 0;
724 signal();
725 break;
726 case 8:
727 BF_GLOBALS._walkRegions.enableRegion(22);
728 BF_GLOBALS._player.changeAngle(225);
729 _harrison.changeAngle(45);
730 _sceneMode = 4114;
731 _stripManager.start(4120, this);
732 break;
733 case 9:
734 _sceneMode = 4106;
735 _stripManager.start(4111, this);
736 _harrissonTalkFl = true;
737 BF_GLOBALS.setFlag(fCuffedFrankie);
738 T2_GLOBALS._uiElements.addScore(30);
739 break;
740 case 10:
741 BF_GLOBALS._player.updateAngle(_harrison._position);
742 _sceneMode = 0;
743 break;
744 case 4100:
745 BF_GLOBALS._player.disableControl();
746 _sceneMode = 0;
747 setAction(&_sequenceManager1, this, 4100, &_passenger, &_object5, NULL);
748 BF_GLOBALS._walkRegions.disableRegion(16);
749 break;
750 case 4101:
751 // Driver gets out of the car
752 BF_GLOBALS._player.disableControl();
753 _sceneMode = 0;
754 setAction(&_sequenceManager1, this, 4101, &_driver, &_object6, NULL);
755 BF_GLOBALS.setFlag(fDriverOutOfTruck);
756 BF_GLOBALS._walkRegions.disableRegion(7);
757 break;
758 case 4103:
759 // Click on moto to ask for backup
760 BF_GLOBALS._player.disableControl();
761 _sceneMode = 1;
762 setAction(&_sequenceManager1, this, 4103, &BF_GLOBALS._player, NULL);
763 break;
764 case 4104:
765 // After call for backup, patrol car is coming
766 _harrisonMovedFl = true;
767 BF_GLOBALS._player.disableControl();
768 _sceneMode = 0;
769 setAction(&_sequenceManager1, this, 4104, &_patrolCar, &_harrison, NULL);
770 break;
771 case 4105:
772 // Second guy gets nervous
773 BF_GLOBALS._player.disableControl();
774 _sceneMode = 0;
775 setAction(&_sequenceManager1, this, 4105, &_passenger, NULL);
776 break;
777 case 4106:
778 BF_GLOBALS._player.disableControl();
779 _sceneMode = 4119;
780 setAction(&_sequenceManager1, this, 4106, &_passenger, NULL);
781 break;
782 case 4107:
783 BF_GLOBALS._player.disableControl();
784 _sceneMode = 5;
785 setAction(&_sequenceManager1, this, 4107, &BF_GLOBALS._player, &_passenger, NULL);
786 break;
787 case 4108:
788 BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
789 BF_GLOBALS._player.updateAngle(Common::Point(100, 170));
790 BF_GLOBALS._walkRegions.enableRegion(22);
791 BF_GLOBALS._walkRegions.enableRegion(7);
792 BF_GLOBALS._walkRegions.enableRegion(16);
793 BF_GLOBALS._player.disableControl();
794 _sceneMode = 0;
795 setAction(&_sequenceManager1, this, 4108, &_harrison, NULL);
796 break;
797 case 4109:
798 // Harrison puts handcuffs to driver
799 if ((BF_GLOBALS._player._position.x > 116) && (BF_GLOBALS._player._position.x != 195) &&
800 (BF_GLOBALS._player._position.y != 139)) {
801 ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 195, 139);
802 }
803
804 BF_GLOBALS._walkRegions.enableRegion(22);
805 BF_GLOBALS._player.disableControl();
806 _sceneMode = 0;
807 setAction(&_sequenceManager1, this, 4109, &_driver, &_harrison, NULL);
808 break;
809 case 4110:
810 // Harrisson takes care of the driver
811 BF_GLOBALS._player.disableControl();
812 _sceneMode = 0;
813 setAction(&_sequenceManager1, this, 4110, &_harrison, &_driver, NULL);
814 break;
815 case 4112:
816 BF_GLOBALS.setFlag(fGangInCar);
817 BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
818 BF_GLOBALS._player.updateAngle(Common::Point(100, 170));
819 BF_GLOBALS._player.disableControl();
820 _sceneMode = 4108;
821 setAction(&_sequenceManager1, this, 4112, &_driver, &_passenger, &_harrison, NULL);
822 break;
823 case 4114:
824 BF_GLOBALS._walkRegions.enableRegion(22);
825 BF_GLOBALS._player.disableControl();
826 _sceneMode = 4116;
827 setAction(&_sequenceManager1, this, 4114, &_harrison, &_patrolCar, NULL);
828 break;
829 case 4116:
830 BF_GLOBALS._walkRegions.enableRegion(21);
831 BF_GLOBALS._walkRegions.enableRegion(22);
832 _harrison.remove();
833 BF_GLOBALS._player.disableControl();
834 _sceneMode = 0;
835 setAction(&_sequenceManager1, this, 4116, &_patrolCar, NULL);
836 break;
837 case 4118:
838 BF_GLOBALS._player.disableControl();
839 _sceneMode = 3;
840 setAction(&_sequenceManager1, this, 4118, &BF_GLOBALS._player, NULL);
841 break;
842 case 4119:
843 BF_GLOBALS._player.disableControl();
844 _sceneMode = 4107;
845 setAction(&_sequenceManager1, this, 4119, &BF_GLOBALS._player, &_passenger, NULL);
846 break;
847 case 4121:
848 BF_GLOBALS._player.disableControl();
849 _sceneMode = 6;
850 setAction(&_sequenceManager1, this, 4121, &BF_GLOBALS._player, &_passenger, NULL);
851 break;
852 case 4122:
853 BF_GLOBALS._walkRegions.enableRegion(22);
854 BF_INVENTORY.setObjectScene(INV_22_SNUB, 0);
855 BF_GLOBALS._player.disableControl();
856 _sceneMode = 0;
857 setAction(&_sequenceManager1, this, 4122, &_passenger, &_harrison, NULL);
858 break;
859 case 4123:
860 BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 0);
861 BF_GLOBALS._player.disableControl();
862 _sceneMode = 5;
863 setAction(&_sequenceManager1, this, 4123, &_driver, &BF_GLOBALS._player, NULL);
864 break;
865 case 4124:
866 BF_GLOBALS._player.disableControl();
867 _sceneMode = 7;
868 setAction(&_sequenceManager1, this, 4124, &_driver, &BF_GLOBALS._player, NULL);
869 break;
870 case 4127:
871 SceneItem::display2(410, 16);
872 BF_GLOBALS._player.enableControl();
873 break;
874 case 0:
875 default:
876 BF_GLOBALS._player.enableControl();
877 break;
878 }
879 }
880
process(Event & event)881 void Scene410::process(Event &event) {
882 // Check for gun being clicked on player
883 if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) &&
884 BF_GLOBALS._player.contains(event.mousePos) && !BF_GLOBALS.getFlag(fCalledBackup)) {
885 if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) {
886 if (!_action) {
887 event.handled = true;
888 BF_GLOBALS._player.disableControl();
889 _sceneMode = 2;
890 setAction(&_sequenceManager1, this, 4102, &_passenger, &BF_GLOBALS._player, NULL);
891 }
892 } else if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) {
893 if (!_action) {
894 _sceneMode = 1;
895 BF_GLOBALS._player.disableControl();
896 _sceneMode = 2;
897 setAction(&_sequenceManager1, this, 4120, &_passenger, &BF_GLOBALS._player, NULL);
898 }
899 }
900 }
901
902 if (!event.handled)
903 SceneExt::process(event);
904 }
905
dispatch()906 void Scene410::dispatch() {
907 SceneExt::dispatch();
908 if ((_sceneMode == 4112) || (_sceneMode == 4101)) {
909 _harrison.updateAngle(_driver._position);
910 }
911 }
912
913 /*--------------------------------------------------------------------------
914 * Scene 415 - Searching Truck
915 *
916 *--------------------------------------------------------------------------*/
917
startAction(CursorType action,Event & event)918 bool Scene415::GunInset::startAction(CursorType action, Event &event) {
919 Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
920
921 if (action == CURSOR_USE) {
922 if (BF_GLOBALS.getFlag(fGotAutoWeapon)) {
923 FocusObject::startAction(action, event);
924 } else {
925 remove();
926 scene->_gunAndWig.remove();
927 }
928 return true;
929 } else {
930 return FocusObject::startAction(action, event);
931 }
932 }
933
remove()934 void Scene415::GunInset::remove() {
935 Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
936
937 BF_GLOBALS._player.disableControl();
938 scene->_gunAndWig.remove();
939 FocusObject::remove();
940
941 scene->_sceneMode = 0;
942 scene->_animatedSeat.animate(ANIM_MODE_6, scene);
943 }
944
startAction(CursorType action,Event & event)945 bool Scene415::GunAndWig::startAction(CursorType action, Event &event) {
946 Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
947
948 switch (action) {
949 case CURSOR_USE:
950 NamedObject::startAction(action, event);
951 BF_INVENTORY.setObjectScene(INV_AUTO_RIFLE, 1);
952 BF_INVENTORY.setObjectScene(INV_WIG, 1);
953 BF_GLOBALS.setFlag(fGotAutoWeapon);
954 T2_GLOBALS._uiElements.addScore(30);
955
956 remove();
957 return true;
958 case INV_FOREST_RAP:
959 if (scene->_scoreWigRapFlag)
960 break;
961
962 BF_GLOBALS._player.disableControl();
963 scene->_sceneMode = 0;
964 scene->_stripManager.start(4126, scene);
965 T2_GLOBALS._uiElements.addScore(50);
966 scene->_scoreWigRapFlag = true;
967 return true;
968 default:
969 break;
970 }
971
972 return NamedObject::startAction(action, event);
973 }
974
startAction(CursorType action,Event & event)975 bool Scene415::BulletsInset::startAction(CursorType action, Event &event) {
976 Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
977
978 if (action == CURSOR_USE) {
979 if (BF_GLOBALS.getFlag(fGotBulletsFromDash)) {
980 FocusObject::startAction(action, event);
981 } else {
982 remove();
983 scene->_theBullets.remove();
984 }
985 return true;
986 } else {
987 return FocusObject::startAction(action, event);
988 }
989 }
990
remove()991 void Scene415::BulletsInset::remove() {
992 Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
993
994 scene->_theBullets.remove();
995 FocusObject::remove();
996 }
997
startAction(CursorType action,Event & event)998 bool Scene415::DashDrawer::startAction(CursorType action, Event &event) {
999 Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
1000
1001 if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) {
1002 scene->showBullets();
1003 return true;
1004 } else {
1005 return NamedObject::startAction(action, event);
1006 }
1007 }
1008
startAction(CursorType action,Event & event)1009 bool Scene415::TheBullets::startAction(CursorType action, Event &event) {
1010 Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
1011
1012 switch (action) {
1013 case CURSOR_USE:
1014 NamedObject::startAction(action, event);
1015 BF_INVENTORY.setObjectScene(INV_22_BULLET, 1);
1016 BF_GLOBALS.setFlag(fGotBulletsFromDash);
1017 T2_GLOBALS._uiElements.addScore(30);
1018
1019 remove();
1020 scene->_dashDrawer.remove();
1021 return true;
1022 case INV_FOREST_RAP:
1023 if (scene->_scoreBulletRapFlag) {
1024 SceneItem::display2(415, 35);
1025 } else {
1026 BF_GLOBALS._player.disableControl();
1027 scene->_sceneMode = 0;
1028 scene->_stripManager.start(4122, scene);
1029 T2_GLOBALS._uiElements.addScore(50);
1030 scene->_scoreBulletRapFlag = true;
1031 }
1032 return true;
1033 default:
1034 break;
1035 }
1036
1037 return NamedObject::startAction(action, event);
1038 }
1039
1040 /*--------------------------------------------------------------------------*/
1041
startAction(CursorType action,Event & event)1042 bool Scene415::Lever::startAction(CursorType action, Event &event) {
1043 Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene;
1044
1045 switch (action) {
1046 case CURSOR_USE:
1047 if (BF_GLOBALS.getFlag(fGotAutoWeapon)) {
1048 SceneItem::display2(415, 20);
1049 } else {
1050 BF_GLOBALS._player.disableControl();
1051 scene->_sceneMode = 2;
1052 scene->setAction(&scene->_sequenceManager, scene, 4150, &scene->_animatedSeat, NULL);
1053 }
1054 return true;
1055 default:
1056 return NamedHotspot::startAction(action, event);
1057 }
1058 }
1059
1060 /*--------------------------------------------------------------------------*/
1061
Scene415()1062 Scene415::Scene415(): SceneExt() {
1063 _scoreWigRapFlag = _scoreBulletRapFlag = false;
1064 }
1065
synchronize(Serializer & s)1066 void Scene415::synchronize(Serializer &s) {
1067 SceneExt::synchronize(s);
1068 s.syncAsSint16LE(_scoreWigRapFlag);
1069 s.syncAsSint16LE(_scoreBulletRapFlag);
1070 }
1071
postInit(SceneObjectList * OwnerList)1072 void Scene415::postInit(SceneObjectList *OwnerList) {
1073 SceneExt::postInit();
1074 loadScene(415);
1075
1076 _stripManager.addSpeaker(&_jakeRadioSpeaker);
1077
1078 _dashDrawer.postInit();
1079 _dashDrawer.setVisage(411);
1080 _dashDrawer.setStrip(3);
1081 _dashDrawer.setPosition(Common::Point(151, 97));
1082 _dashDrawer.setDetails(415, 22, -1, -1, 1, (SceneItem *)NULL);
1083
1084 _animatedSeat.postInit();
1085 _animatedSeat.setVisage(419);
1086 _animatedSeat.setStrip(1);
1087 _animatedSeat.setPosition(Common::Point(306, 116));
1088 _animatedSeat.fixPriority(80);
1089
1090 _windowLever.setDetails(16, 415, 25, -1, 26, 1);
1091 _item7.setDetails(17, 415, 32, -1, 33, 1);
1092 _seatBelt.setDetails(14, 415, 29, -1, 30, 1);
1093 _lever.setDetails(19, 415, 23, 24, -1, 1);
1094 _seat.setDetails(18, 415, 3, 4, 2, 1);
1095 _dashboard.setDetails(20, 415, 11, 12, 19, 1);
1096 _steeringWheel.setDetails(15, 415, 5, 6, 7, 1);
1097 _horn.setDetails(31, 415, 8, 9, 10, 1);
1098 _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 415, 0, 1, 2, 1, NULL);
1099
1100 BF_GLOBALS._player.enableControl();
1101 BF_GLOBALS._player._canWalk = false;
1102 BF_GLOBALS._events.setCursor(CURSOR_WALK);
1103
1104 signal();
1105 }
1106
signal()1107 void Scene415::signal() {
1108 switch (_sceneMode) {
1109 case 1:
1110 BF_GLOBALS._sceneManager.changeScene(410);
1111 break;
1112 case 2:
1113 showGunAndWig();
1114 _sceneMode = 0;
1115 signal();
1116 break;
1117 case 0:
1118 default:
1119 BF_GLOBALS._player.enableControl();
1120 BF_GLOBALS._player._canWalk = false;
1121 break;
1122 }
1123 }
1124
dispatch()1125 void Scene415::dispatch() {
1126 SceneExt::dispatch();
1127 if (BF_GLOBALS.getFlag(fGotAutoWeapon) && BF_GLOBALS.getFlag(fGotBulletsFromDash)) {
1128 _sceneMode = 1;
1129 signal();
1130 }
1131 }
1132
showBullets()1133 void Scene415::showBullets() {
1134 _bulletsInset.postInit();
1135 _bulletsInset.setVisage(411);
1136 _bulletsInset.setStrip(1);
1137 _bulletsInset.setPosition(Common::Point(158, 100));
1138 _bulletsInset.setDetails(415, -1, -1, -1);
1139
1140 _theBullets.postInit();
1141 _theBullets.setVisage(411);
1142 _theBullets.setStrip(1);
1143 _theBullets.setFrame(2);
1144 _theBullets.setPosition(Common::Point(184, 86));
1145 _theBullets.fixPriority(105);
1146 _theBullets.setDetails(415, 16, 17, 18, 1, (SceneItem *)NULL);
1147 BF_GLOBALS._sceneItems.remove(&_theBullets);
1148 BF_GLOBALS._sceneItems.push_front(&_theBullets);
1149 }
1150
showGunAndWig()1151 void Scene415::showGunAndWig() {
1152 _gunInset.postInit();
1153 _gunInset.setVisage(411);
1154 _gunInset.setStrip(2);
1155 _gunInset.setPosition(Common::Point(158, 100));
1156 _gunInset.setDetails(415, -1, -1, -1);
1157
1158 _gunAndWig.postInit();
1159 _gunAndWig.setVisage(411);
1160 _gunAndWig.setStrip(2);
1161 _gunAndWig.setFrame(2);
1162 _gunAndWig.setPosition(Common::Point(159, 88));
1163 _gunAndWig.fixPriority(105);
1164 _gunAndWig.setDetails(415, 13, 14, 15, 1, (SceneItem *)NULL);
1165
1166 BF_GLOBALS._sceneItems.remove(&_gunAndWig);
1167 BF_GLOBALS._sceneItems.push_front(&_gunAndWig);
1168 }
1169
1170 /*--------------------------------------------------------------------------
1171 * Scene 440 - Outside Alleycat Bowl
1172 *
1173 *--------------------------------------------------------------------------*/
1174
startAction(CursorType action,Event & event)1175 bool Scene440::Doorway::startAction(CursorType action, Event &event) {
1176 Scene440 *scene = (Scene440 *)BF_GLOBALS._sceneManager._scene;
1177
1178 switch (action) {
1179 case CURSOR_LOOK:
1180 SceneItem::display2(440, 1);
1181 return true;
1182 case CURSOR_USE:
1183 BF_GLOBALS._player.disableControl();
1184 scene->_sceneMode = 4400;
1185 scene->setAction(&scene->_sequenceManager, scene, 4400, &BF_GLOBALS._player, this, &scene->_lyle, NULL);
1186 return true;
1187 default:
1188 return NamedObject::startAction(action, event);
1189 }
1190 }
1191
startAction(CursorType action,Event & event)1192 bool Scene440::Vechile::startAction(CursorType action, Event &event) {
1193 Scene440 *scene = (Scene440 *)BF_GLOBALS._sceneManager._scene;
1194
1195 switch (action) {
1196 case CURSOR_LOOK:
1197 if (BF_GLOBALS.getFlag(fWithLyle)) {
1198 SceneItem::display2(440, 3);
1199 } else {
1200 SceneItem::display2(440, 2);
1201 }
1202 return true;
1203 case CURSOR_USE:
1204 if (BF_GLOBALS.getFlag(fWithLyle)) {
1205 BF_GLOBALS._player.disableControl();
1206 scene->_sceneMode = 4403;
1207 scene->setAction(&scene->_sequenceManager, scene, 4403, &BF_GLOBALS._player, &scene->_lyle, NULL);
1208 } else {
1209 BF_GLOBALS._sceneManager.changeScene(60);
1210 }
1211 return true;
1212 default:
1213 return NamedObject::startAction(action, event);
1214 }
1215 }
1216
startAction(CursorType action,Event & event)1217 bool Scene440::Lyle::startAction(CursorType action, Event &event) {
1218 switch (action) {
1219 case CURSOR_LOOK:
1220 SceneItem::display2(440, 4);
1221 return true;
1222 case CURSOR_TALK:
1223 SceneItem::display2(440, 5);
1224 return true;
1225 default:
1226 return NamedObject::startAction(action, event);
1227 }
1228 }
1229
1230 /*--------------------------------------------------------------------------*/
1231
startAction(CursorType action,Event & event)1232 bool Scene440::Item1::startAction(CursorType action, Event &event) {
1233 switch (action) {
1234 case CURSOR_LOOK:
1235 SceneItem::display2(440, 0);
1236 return true;
1237 default:
1238 return NamedHotspot::startAction(action, event);
1239 }
1240 }
1241
1242 /*--------------------------------------------------------------------------*/
1243
postInit(SceneObjectList * OwnerList)1244 void Scene440::postInit(SceneObjectList *OwnerList) {
1245 SceneExt::postInit();
1246 loadScene(440);
1247 setZoomPercents(75, 60, 120, 100);
1248 BF_GLOBALS._sound1.fadeSound(33);
1249
1250 BF_GLOBALS._player.postInit();
1251 BF_GLOBALS._player.setVisage(303);
1252 BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1253 BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
1254 BF_GLOBALS._player.changeZoom(-1);
1255 BF_GLOBALS._player.disableControl();
1256 BF_GLOBALS._player.setPosition(Common::Point(203, 113));
1257
1258 _vechile.postInit();
1259
1260 _lyle.postInit();
1261 _lyle.setVisage(835);
1262 _lyle.animate(ANIM_MODE_1, NULL);
1263 _lyle.setObjectWrapper(new SceneObjectWrapper());
1264 _lyle.setPosition(Common::Point(-40, -10));
1265 _lyle.changeZoom(-1);
1266 _lyle.hide();
1267 BF_GLOBALS._sceneItems.push_back(&_lyle);
1268
1269 if (BF_GLOBALS.getFlag(fWithLyle)) {
1270 _vechile.setVisage(444);
1271 _vechile.setFrame(2);
1272 _vechile.setPosition(Common::Point(147, 128));
1273 _vechile.fixPriority(114);
1274
1275 BF_GLOBALS._player.setVisage(303);
1276 BF_GLOBALS._player.setPosition(Common::Point(187, 104));
1277
1278 _lyle.setPosition(Common::Point(135, 128));
1279 _lyle.show();
1280
1281 BF_GLOBALS._walkRegions.disableRegion(12);
1282 BF_GLOBALS._walkRegions.disableRegion(13);
1283 } else {
1284 _vechile.setPosition(Common::Point(169, 121));
1285 _vechile.fixPriority(117);
1286
1287 if (BF_GLOBALS.getFlag(onDuty)) {
1288 _vechile.setVisage(440);
1289 _vechile.setStrip(1);
1290
1291 BF_GLOBALS._player.setVisage(304);
1292 BF_GLOBALS._player.setStrip(3);
1293 } else {
1294 _vechile.setVisage(580);
1295 _vechile.setStrip(2);
1296 _vechile.setFrame(3);
1297
1298 BF_GLOBALS._player.setVisage(303);
1299 }
1300 }
1301
1302 BF_GLOBALS._sceneItems.push_back(&_vechile);
1303 BF_GLOBALS._walkRegions.disableRegion(11);
1304
1305 _doorway.postInit();
1306 _doorway.setVisage(440);
1307 _doorway.setStrip(5);
1308 _doorway.setPosition(Common::Point(198, 91));
1309 _doorway.fixPriority(80);
1310 BF_GLOBALS._sceneItems.push_back(&_doorway);
1311
1312 if (BF_GLOBALS._sceneManager._previousScene == 450) {
1313 _lyle.setPosition(Common::Point(143, 93));
1314 _lyle.setStrip(5);
1315 _lyle.fixPriority(90);
1316
1317 _doorway.setFrame(_doorway.getFrameCount());
1318 _sceneMode = 4401;
1319 setAction(&_sequenceManager, this, 4401, &BF_GLOBALS._player, &_doorway, NULL);
1320 } else if (BF_GLOBALS.getFlag(fWithLyle)) {
1321 _sceneMode = 4402;
1322 setAction(&_sequenceManager, this, 4402, &_lyle, NULL);
1323 } else {
1324 BF_GLOBALS._player.enableControl();
1325 }
1326
1327 _item1.setBounds(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y - 1));
1328 BF_GLOBALS._sceneItems.push_back(&_item1);
1329 }
1330
signal()1331 void Scene440::signal() {
1332 switch (_sceneMode) {
1333 case 4400:
1334 BF_GLOBALS._sceneManager.changeScene(450);
1335 break;
1336 case 4401:
1337 BF_GLOBALS._player.fixPriority(-1);
1338 BF_GLOBALS._player.enableControl();
1339 break;
1340 case 4402:
1341 BF_GLOBALS._player.enableControl();
1342 break;
1343 case 4403:
1344 BF_GLOBALS._sceneManager.changeScene(60);
1345 break;
1346 default:
1347 break;
1348 }
1349 }
1350
1351 /*--------------------------------------------------------------------------
1352 * Scene 450 - Inside Alleycat Bowl
1353 *
1354 *--------------------------------------------------------------------------*/
1355
startAction(CursorType action,Event & event)1356 bool Scene450::Weasel::startAction(CursorType action, Event &event) {
1357 Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene;
1358
1359 switch (action) {
1360 case CURSOR_LOOK:
1361 SceneItem::display2(450, 0);
1362 return true;
1363 case CURSOR_USE:
1364 SceneItem::display2(450, 1);
1365 return true;
1366 case CURSOR_TALK:
1367 case INV_ID:
1368 BF_GLOBALS._player.disableControl();
1369 scene->_sceneMode = 4504;
1370 if (_flag) {
1371 scene->setAction(&scene->_sequenceManager, scene, 4515, &BF_GLOBALS._player, this, NULL);
1372 } else {
1373 ++_flag;
1374 scene->setAction(&scene->_sequenceManager, scene, 4504, &BF_GLOBALS._player, this, NULL);
1375 }
1376 return true;
1377 case INV_FOREST_RAP:
1378 BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 450);
1379 BF_GLOBALS._player.disableControl();
1380 T2_GLOBALS._uiElements.addScore(30);
1381
1382 scene->_sceneMode = 4505;
1383 scene->setAction(&scene->_sequenceManager, scene, 4505, &BF_GLOBALS._player, this,
1384 &scene->_counterDoor, &scene->_object2, NULL);
1385 return true;
1386 default:
1387 return NamedObjectExt::startAction(action, event);
1388 }
1389 }
1390
startAction(CursorType action,Event & event)1391 bool Scene450::PinBoy::startAction(CursorType action, Event &event) {
1392 Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene;
1393
1394 switch (action) {
1395 case CURSOR_LOOK:
1396 SceneItem::display2(450, 4);
1397 return true;
1398 case CURSOR_USE:
1399 SceneItem::display2(450, 5);
1400 return true;
1401 case CURSOR_TALK:
1402 BF_GLOBALS._player.disableControl();
1403 scene->_sceneMode = 4502;
1404 if (BF_GLOBALS.getFlag(onDuty)) {
1405 scene->setAction(&scene->_sequenceManager, scene, 4516, &BF_GLOBALS._player, this, NULL);
1406 } else {
1407 scene->setAction(&scene->_sequenceManager, scene, 4502, &BF_GLOBALS._player, this, NULL);
1408 }
1409 return true;
1410 case INV_NAPKIN:
1411 BF_GLOBALS._player.disableControl();
1412 scene->_sceneMode = 4509;
1413 scene->setAction(&scene->_sequenceManager, scene, 4509, &BF_GLOBALS._player, this, NULL);
1414 return true;
1415 default:
1416 return NamedObject::startAction(action, event);
1417 }
1418 }
1419
startAction(CursorType action,Event & event)1420 bool Scene450::Manager::startAction(CursorType action, Event &event) {
1421 Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene;
1422
1423 switch (action) {
1424 case CURSOR_LOOK:
1425 SceneItem::display2(450, 6);
1426 return true;
1427 case CURSOR_USE:
1428 SceneItem::display2(450, 7);
1429 return true;
1430 case CURSOR_TALK:
1431 BF_GLOBALS._player.disableControl();
1432 if (BF_GLOBALS.getFlag(takenWeasel) && !BF_GLOBALS.getFlag(gotTrailer450)) {
1433 BF_GLOBALS.setFlag(gotTrailer450);
1434 scene->_sceneMode = 4517;
1435 scene->setAction(&scene->_sequenceManager, scene, 4517, &BF_GLOBALS._player, this,
1436 &scene->_door, NULL);
1437 } else {
1438 animate(ANIM_MODE_8, 1, NULL);
1439
1440 if (scene->_managerCallsWeaselFl) {
1441 scene->_sceneMode = 2;
1442 if (scene->_talkManagerFl) {
1443 scene->_stripManager.start(4521, scene);
1444 } else {
1445 scene->_talkManagerFl = true;
1446 scene->_stripManager.start(4512, scene);
1447 }
1448 } else {
1449 scene->_sceneMode = 4506;
1450 if (scene->_talkManagerFl) {
1451 scene->setAction(&scene->_sequenceManager, scene, 4518, &BF_GLOBALS._player, this, NULL);
1452 } else {
1453 scene->_sceneMode = 4506;
1454 scene->_talkManagerFl = true;
1455 scene->setAction(&scene->_sequenceManager, scene, 4506, &BF_GLOBALS._player, this, NULL);
1456 }
1457 }
1458 }
1459 return true;
1460 case INV_FOREST_RAP:
1461 SceneItem::display2(450, 19);
1462 return true;
1463 case INV_NAPKIN:
1464 animate(ANIM_MODE_8, 1, NULL);
1465 BF_GLOBALS._player.disableControl();
1466
1467 if (BF_GLOBALS.getFlag(showEugeneNapkin)) {
1468 SceneItem::display2(450, 16);
1469 BF_GLOBALS._player.enableControl();
1470 } else {
1471 BF_GLOBALS.setFlag(showEugeneNapkin);
1472
1473 if (!BF_GLOBALS.getFlag(showEugeneID)) {
1474 scene->_sceneMode = 4513;
1475 scene->setAction(&scene->_sequenceManager, scene, 4513, &BF_GLOBALS._player, this, NULL);
1476 } else if (BF_GLOBALS.getFlag(fMgrCallsWeasel)) {
1477 SceneItem::display2(450, 16);
1478 BF_GLOBALS._player.enableControl();
1479 } else {
1480 T2_GLOBALS._uiElements.addScore(30);
1481 scene->_sceneMode = 4510;
1482 BF_INVENTORY.setObjectScene(INV_NAPKIN, 450);
1483 scene->setAction(&scene->_sequenceManager, scene, 4510, &BF_GLOBALS._player, this, NULL);
1484 }
1485 }
1486 return true;
1487 case INV_ID:
1488 if (BF_GLOBALS.getFlag(takenWeasel)) {
1489 return startAction(CURSOR_TALK, event);
1490 } else {
1491 animate(ANIM_MODE_8, 1, NULL);
1492 BF_GLOBALS._player.disableControl();
1493
1494 if (!BF_GLOBALS.getFlag(showEugeneID))
1495 T2_GLOBALS._uiElements.addScore(30);
1496 BF_GLOBALS.setFlag(showEugeneID);
1497
1498 if ((BF_GLOBALS.getFlag(showRapEugene) || BF_GLOBALS.getFlag(showEugeneNapkin)) &&
1499 !BF_GLOBALS.getFlag(fMgrCallsWeasel)) {
1500 T2_GLOBALS._uiElements.addScore(30);
1501 scene->_sceneMode = 4511;
1502 scene->setAction(&scene->_sequenceManager, scene, 4511, &BF_GLOBALS._player, this, NULL);
1503 } else {
1504 scene->_sceneMode = 4506;
1505 scene->setAction(&scene->_sequenceManager, scene, 4512, &BF_GLOBALS._player, this, NULL);
1506 }
1507 }
1508 return true;
1509 default:
1510 return NamedObject::startAction(action, event);
1511 }
1512 }
1513
1514 /*--------------------------------------------------------------------------*/
1515
startAction(CursorType action,Event & event)1516 bool Scene450::Exit::startAction(CursorType action, Event &event) {
1517 Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene;
1518
1519 if (event.eventType == EVENT_BUTTON_DOWN) {
1520 BF_GLOBALS._player.disableControl();
1521 scene->_sceneMode = 4501;
1522 scene->signal();
1523 return true;
1524 } else {
1525 return false;
1526 }
1527 }
1528
1529 /*--------------------------------------------------------------------------*/
1530
Scene450()1531 Scene450::Scene450(): SceneExt() {
1532 _managerCallsWeaselFl = _talkManagerFl = false;
1533 }
1534
synchronize(Serializer & s)1535 void Scene450::synchronize(Serializer &s) {
1536 SceneExt::synchronize(s);
1537 s.syncAsSint16LE(_managerCallsWeaselFl);
1538 s.syncAsSint16LE(_talkManagerFl);
1539 }
1540
postInit(SceneObjectList * OwnerList)1541 void Scene450::postInit(SceneObjectList *OwnerList) {
1542 SceneExt::postInit();
1543 loadScene(450);
1544 setZoomPercents(110, 90, 155, 115);
1545 BF_GLOBALS._sound1.fadeSound(13);
1546
1547 _stripManager.addSpeaker(&_gameTextSpeaker);
1548 _stripManager.addSpeaker(&_eugeneSpeaker);
1549 _stripManager.addSpeaker(&_billySpeaker);
1550 _stripManager.addSpeaker(&_weaselSpeaker);
1551 _stripManager.addSpeaker(&_jakeJacketSpeaker);
1552 _stripManager.addSpeaker(&_lyleHatSpeaker);
1553 _stripManager.addSpeaker(&_jakeUniformSpeaker);
1554
1555 BF_GLOBALS._player.postInit();
1556 BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1341 : 129);
1557 BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1558 BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
1559 BF_GLOBALS._player.setPosition(Common::Point(-30, 155));
1560 BF_GLOBALS._player.changeZoom(-1);
1561 BF_GLOBALS._player.disableControl();
1562
1563 _door.postInit();
1564 _door.setVisage(450);
1565 _door.setStrip(2);
1566 _door.setPosition(Common::Point(72, 80));
1567 _door.setDetails(450, 15, -1, 13, 1, (SceneItem *)NULL);
1568
1569 _counterDoor.postInit();
1570 _counterDoor.setVisage(450);
1571 _counterDoor.setPosition(Common::Point(39, 104));
1572 _counterDoor.fixPriority(100);
1573 _counterDoor.setDetails(450, 12, -1, 13, 1, (SceneItem *)NULL);
1574
1575 if (BF_GLOBALS._dayNumber != 3) {
1576 _pinBoy.postInit();
1577 _pinBoy.setVisage(463);
1578 _pinBoy.setPosition(Common::Point(138, 121));
1579 _pinBoy.fixPriority(100);
1580 _pinBoy.setFrame(_pinBoy.getFrameCount());
1581 BF_GLOBALS._sceneItems.push_back(&_pinBoy);
1582 } else if (!BF_GLOBALS.getFlag(fWithLyle) || !BF_GLOBALS.getFlag(fGivenNapkin) ||
1583 (BF_INVENTORY.getObjectScene(INV_CARAVAN_KEY) == 1)) {
1584 _pinBoy.postInit();
1585 _pinBoy.setVisage(463);
1586 _pinBoy.setPosition(Common::Point(138, 121));
1587 _pinBoy.fixPriority(100);
1588 _pinBoy.setFrame(_pinBoy.getFrameCount());
1589 BF_GLOBALS._sceneItems.push_back(&_pinBoy);
1590 } else {
1591 _manager.postInit();
1592 _manager.setVisage(467);
1593 _manager.setPosition(Common::Point(138, 121));
1594 _manager.changeZoom(-1);
1595 _manager.fixPriority(100);
1596 BF_GLOBALS._sceneItems.push_back(&_manager);
1597
1598 if (!BF_GLOBALS.getFlag(takenWeasel)) {
1599 _object2.postInit();
1600 _object2.setVisage(469);
1601 _object2.animate(ANIM_MODE_1, NULL);
1602 _object2.setObjectWrapper(new SceneObjectWrapper());
1603 _object2.setPosition(Common::Point(-30, 126));
1604 ADD_MOVER_NULL(_object2, 27, 126);
1605 _object2.changeZoom(-1);
1606 _object2.setDetails(450, 2, 18, 3, 1, (SceneItem *)NULL);
1607
1608 BF_GLOBALS._walkRegions.disableRegion(4);
1609
1610 _weasel.postInit();
1611 _weasel.setVisage(466);
1612 _weasel.animate(ANIM_MODE_1, NULL);
1613 _weasel.setObjectWrapper(new SceneObjectWrapper());
1614 _weasel.setPosition(Common::Point(70, 80));
1615 _weasel.setStrip(5);
1616 _weasel.changeZoom(90);
1617 _weasel.fixPriority(65);
1618 _weasel._flag = 0;
1619 BF_GLOBALS._sceneItems.push_back(&_weasel);
1620 }
1621 }
1622
1623 _sceneMode = 4500;
1624 setAction(&_sequenceManager, this, 4500, &BF_GLOBALS._player, NULL);
1625
1626 _exit.setDetails(Rect(0, 100, 4, 167), 450, -1, -1, -1, 1, NULL);
1627 _counter.setDetails(8, 450, 8, -1, 9, 1);
1628 _shelf.setDetails(Rect(114, 10, 179, 77), 450, 10, -1, 11, 1, NULL);
1629 _interior.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 450, 14, -1, -1, 1, NULL);
1630 }
1631
signal()1632 void Scene450::signal() {
1633 switch (_sceneMode) {
1634 case 450:
1635 case 451:
1636 BF_GLOBALS._sceneManager.changeScene(440);
1637 break;
1638 case 4501:
1639 if (BF_GLOBALS._sceneObjects->contains(&_object2)) {
1640 _sceneMode = 450;
1641 ADD_MOVER(_object2, -20, 135);
1642 } else {
1643 _sceneMode = 451;
1644 ADD_PLAYER_MOVER(0, 160);
1645 }
1646 break;
1647 case 4503:
1648 _weasel.fixPriority(100);
1649 BF_GLOBALS._player.enableControl();
1650 break;
1651 case 4505:
1652 BF_GLOBALS.setFlag(takenWeasel);
1653 _weasel.remove();
1654 _object2.remove();
1655 BF_GLOBALS._walkRegions.enableRegion(4);
1656 BF_GLOBALS._player.enableControl();
1657 break;
1658 case 4507:
1659 case 4510:
1660 case 4511:
1661 BF_GLOBALS.setFlag(fMgrCallsWeasel);
1662 _managerCallsWeaselFl = true;
1663 _sceneMode = 4503;
1664 setAction(&_sequenceManager, this, 4503, &_weasel, &_door, &_manager, NULL);
1665 break;
1666 case 4508:
1667 _manager.remove();
1668 BF_GLOBALS._player.enableControl();
1669 BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
1670 break;
1671 case 4517:
1672 BF_GLOBALS.setFlag(gotTrailer450);
1673 BF_INVENTORY.setObjectScene(INV_CARAVAN_KEY, 1);
1674 _sceneMode = 4508;
1675 setAction(&_sequenceManager, this, 4508, &BF_GLOBALS._player, &_manager, &_door, NULL);
1676 break;
1677 default:
1678 BF_GLOBALS._player.enableControl();
1679 break;
1680 }
1681 }
1682
process(Event & event)1683 void Scene450::process(Event &event) {
1684 SceneExt::process(event);
1685
1686 if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
1687 // Check if the cursor is on an exit
1688 if (_exit.contains(event.mousePos)) {
1689 GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
1690 BF_GLOBALS._events.setCursor(surface);
1691 } else {
1692 // In case an exit cursor was being shown, restore the previously selected cursor
1693 CursorType cursorId = BF_GLOBALS._events.getCursor();
1694 BF_GLOBALS._events.setCursor(cursorId);
1695 }
1696 }
1697 }
1698
1699 } // End of namespace BlueForce
1700
1701 } // End of namespace TsAGE
1702