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_scenes2.h"
24 #include "tsage/scenes.h"
25 #include "tsage/tsage.h"
26 
27 namespace TsAGE {
28 
29 namespace BlueForce {
30 
31 /*--------------------------------------------------------------------------
32  * Scene 200 - Credits - Motorcycle Training
33  *
34  *--------------------------------------------------------------------------*/
35 
signal()36 void Scene200::Action1::signal() {
37 	Scene200 *scene = (Scene200 *)BF_GLOBALS._sceneManager._scene;
38 	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
39 
40 	assert(owner);
41 
42 	switch (_actionIndex++) {
43 	case 0:
44 		setDelay(1);
45 		break;
46 	case 1:
47 		BF_GLOBALS._scenePalette.loadPalette(235);
48 		BF_GLOBALS._scenePalette.refresh();
49 		_state = 0;
50 		setDelay(30);
51 		break;
52 	case 2:
53 		assert(_owner);
54 		owner->animate(ANIM_MODE_5, this);
55 		break;
56 	case 3:
57 		if (++_state < 2) {
58 			scene->_action2.signal();
59 			owner->setFrame(1);
60 			_actionIndex = 2;
61 		}
62 		setDelay(2);
63 		break;
64 	case 4: {
65 		PaletteRotation *rot;
66 		rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
67 		rot->setDelay(10);
68 		rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
69 		rot->setDelay(10);
70 
71 		scene->setAction(&scene->_sequenceManager, this, 201, &scene->_object1, &scene->_object2,
72 			&scene->_object3, &scene->_object4, &scene->_object5, &scene->_object6, NULL);
73 		break;
74 	}
75 	case 5:
76 		BF_GLOBALS._sceneManager.changeScene(210);
77 		break;
78 	default:
79 		break;
80 	}
81 }
82 
signal()83 void Scene200::Action2::signal() {
84 	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
85 	assert(owner);
86 
87 	switch (_actionIndex++) {
88 	case 1:
89 		owner->setPosition(owner->_position, 0);
90 		owner->animate(ANIM_MODE_5, this);
91 		break;
92 	case 2:
93 		owner->setPosition(owner->_position, 1000);
94 		owner->setFrame(1);
95 		_actionIndex = 0;
96 		setDelay(1);
97 		break;
98 	default:
99 		break;
100 	}
101 }
102 
103 
104 /*--------------------------------------------------------------------------*/
105 
postInit(SceneObjectList * OwnerList)106 void Scene200::postInit(SceneObjectList *OwnerList) {
107 	SceneExt::postInit();
108 	loadScene(200);
109 	setZoomPercents(0, 100, 200, 100);
110 	BF_GLOBALS._sound1.play(3);
111 
112 	_object10.postInit();
113 	_object10.setVisage(200);
114 	_object10.setPosition(Common::Point(114, 102));
115 	_object10.setStrip(2);
116 	_object10.setFrame(1);
117 	_object10.changeZoom(100);
118 
119 	_object1.postInit();
120 	_object1.hide();
121 	_object2.postInit();
122 	_object2.hide();
123 	_object3.postInit();
124 	_object3.hide();
125 	_object4.postInit();
126 	_object4.hide();
127 	_object5.postInit();
128 	_object5.hide();
129 	_object6.postInit();
130 	_object6.hide();
131 
132 	_object11.postInit();
133 	_object11.setVisage(200);
134 	_object11.setPosition(Common::Point(96, 112), 1000);
135 	_object11.setStrip(3);
136 	_object11.setFrame(1);
137 	_object11.changeZoom(100);
138 
139 	_object10.setAction(&_action1);
140 	_object11.setAction(&_action2);
141 }
142 
remove()143 void Scene200::remove() {
144 	BF_GLOBALS._scenePalette.clearListeners();
145 	SceneExt::remove();
146 }
147 
148 /*--------------------------------------------------------------------------
149  * Scene 210 - Credits - Car Training
150  *
151  *--------------------------------------------------------------------------*/
152 
signal()153 void Scene210::Action1::signal() {
154 	Scene210 *scene = (Scene210 *)BF_GLOBALS._sceneManager._scene;
155 	SceneObject *owner = static_cast<SceneObject *>(_owner);
156 	assert(owner);
157 
158 	switch (_actionIndex++) {
159 	case 0:
160 		setDelay(1);
161 		break;
162 	case 1:
163 		owner->animate(ANIM_MODE_5, this);
164 		break;
165 	case 2: {
166 		PaletteRotation *rot;
167 		rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
168 		rot->setDelay(10);
169 		rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
170 		rot->setDelay(10);
171 
172 		scene->setAction(&scene->_sequenceManager, this, 210, &scene->_object10, &scene->_object11,
173 			&scene->_object12, &scene->_object13, &scene->_object14, &scene->_object15, NULL);
174 		break;
175 	}
176 	case 3:
177 		BF_GLOBALS._sceneManager.changeScene(220);
178 		break;
179 	default:
180 		break;
181 	}
182 }
183 
184 /*--------------------------------------------------------------------------*/
185 
postInit(SceneObjectList * OwnerList)186 void Scene210::postInit(SceneObjectList *OwnerList) {
187 	SceneExt::postInit();
188 	loadScene(210);
189 
190 // FIXME: This fixes an obvious glitch during scene transition.
191 //        Shouldn't it be included in the 2 previous functions?
192 	clearScreen();
193 //
194 
195 	BF_GLOBALS._scenePalette.loadPalette(235);
196 	BF_GLOBALS._scenePalette.refresh();
197 
198 	_object9.postInit();
199 	_object9.setVisage(210);
200 	_object9.setPosition(Common::Point(146, 151));
201 	_object9.setStrip(1);
202 	_object9.setFrame(1);
203 	_object9.changeZoom(100);
204 	_object9.setAction(&_action1);
205 
206 	_object10.postInit();
207 	_object10.hide();
208 	_object11.postInit();
209 	_object11.hide();
210 	_object12.postInit();
211 	_object12.hide();
212 	_object13.postInit();
213 	_object13.hide();
214 	_object14.postInit();
215 	_object14.hide();
216 	_object15.postInit();
217 	_object15.hide();
218 }
219 
remove()220 void Scene210::remove() {
221 	BF_GLOBALS._scenePalette.clearListeners();
222 	SceneExt::remove();
223 }
224 
225 /*--------------------------------------------------------------------------
226  * Scene 220 - Credits - Martial Arts
227  *
228  *--------------------------------------------------------------------------*/
229 
signal()230 void Scene220::Action1::signal() {
231 	Scene220 *scene = (Scene220 *)BF_GLOBALS._sceneManager._scene;
232 
233 	switch (_actionIndex++) {
234 	case 0:
235 		setDelay(1);
236 		break;
237 	case 1:
238 		BF_GLOBALS._scenePalette.loadPalette(235);
239 		BF_GLOBALS._scenePalette.refresh();
240 		setDelay(30);
241 		break;
242 	case 2:
243 		BF_GLOBALS._scenePalette.clearListeners();
244 		scene->_object2.animate(ANIM_MODE_5, this);
245 		break;
246 	case 3:
247 		scene->_object2.setVisage(221);
248 		scene->_object2.setFrame(1);
249 		scene->_object2.setPosition(Common::Point(178, 122));
250 		scene->_object2.animate(ANIM_MODE_5, this);
251 		break;
252 	case 4:
253 		BF_GLOBALS._scenePalette.loadPalette(2);
254 		BF_GLOBALS._scenePalette.refresh();
255 		BF_GLOBALS._scenePalette.loadPalette(235);
256 		BF_GLOBALS._scenePalette.refresh();
257 		setDelay(5);
258 		break;
259 	case 5:
260 		scene->_object1.remove();
261 
262 		scene->_object2.setVisage(222);
263 		scene->_object2.setFrame(1);
264 		scene->_object2.setPosition(Common::Point(164, 138));
265 		scene->_object2.animate(ANIM_MODE_5, this);
266 		break;
267 	case 6:
268 		scene->_object2.setVisage(223);
269 		scene->_object2.setFrame(1);
270 		scene->_object2.setPosition(Common::Point(164, 139));
271 		scene->_object2.animate(ANIM_MODE_5, this);
272 		break;
273 	case 7:
274 		scene->_object2.setVisage(230);
275 		scene->_object2.setFrame(1);
276 		scene->_object2.setPosition(Common::Point(168, 136));
277 		scene->_object2.animate(ANIM_MODE_4, 13, 1, this);
278 		break;
279 	case 8:
280 		scene->_object2.animate(ANIM_MODE_5, this);
281 
282 		scene->_object3.postInit();
283 		scene->_object3.setVisage(231);
284 		scene->_object3.setPosition(Common::Point(65, 179));
285 		scene->_object3.setStrip(1);
286 		scene->_object3.setFrame(1);
287 		scene->_object3.changeZoom(100);
288 		scene->_object3.setAction(&scene->_action2, this);
289 		break;
290 	case 9:
291 		break;
292 	case 10:
293 		scene->_object2.setVisage(224);
294 		scene->_object2.setFrame(1);
295 		scene->_object2.setPosition(Common::Point(148, 143));
296 		scene->_object2.animate(ANIM_MODE_5, this);
297 		break;
298 	case 11: {
299 		PaletteRotation *rot;
300 		rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
301 		rot->setDelay(10);
302 		rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
303 		rot->setDelay(10);
304 
305 		scene->setAction(&scene->_sequenceManager, this, 220, &scene->_object4, &scene->_object5,
306 			&scene->_object6, &scene->_object7, &scene->_object8, &scene->_object9, NULL);
307 		break;
308 	}
309 	case 12:
310 		scene->_object2.setVisage(232);
311 		scene->_object2.setFrame(1);
312 		scene->_object2.setPosition(Common::Point(146, 143));
313 		scene->_object2._numFrames = 5;
314 		scene->_object2.animate(ANIM_MODE_5, this);
315 		break;
316 	case 13:
317 		scene->_object2.setVisage(228);
318 		scene->_object2.setFrame(1);
319 		scene->_object2.animate(ANIM_MODE_5, this);
320 		break;
321 	case 14:
322 		scene->_object2.setVisage(229);
323 		scene->_object2.setFrame(1);
324 		scene->_object2.animate(ANIM_MODE_5, this);
325 		break;
326 	case 15:
327 		BF_GLOBALS._sceneManager.changeScene(225);
328 		break;
329 	default:
330 		break;
331 	}
332 }
333 
signal()334 void Scene220::Action2::signal() {
335 	Scene220 *scene = (Scene220 *)BF_GLOBALS._sceneManager._scene;
336 
337 	switch (_actionIndex++) {
338 	case 0:
339 		scene->_object3.setPosition(scene->_object3._position);
340 		scene->_object3.animate(ANIM_MODE_5, this);
341 		break;
342 	case 1:
343 		setDelay(50);
344 		break;
345 	case 2:
346 		scene->_object3.remove();
347 		remove();
348 		break;
349 	default:
350 		break;
351 	}
352 }
353 
354 /*--------------------------------------------------------------------------*/
355 
postInit(SceneObjectList * OwnerList)356 void Scene220::postInit(SceneObjectList *OwnerList) {
357 	SceneExt::postInit();
358 	loadScene(220);
359 
360 // FIXME: This fixes an obvious glitch during scene transition.
361 //        Shouldn't it be included in the 2 previous functions?
362 	clearScreen();
363 //
364 
365 	_object2.postInit();
366 	_object2.setVisage(220);
367 	_object2.setPosition(Common::Point(182, 122));
368 	_object2.setStrip(1);
369 	_object2.setFrame(1);
370 	_object2.changeZoom(100);
371 
372 	_object1.postInit();
373 	_object1.setVisage(220);
374 	_object1.setPosition(Common::Point(164, 138));
375 	_object1.setStrip(2);
376 	_object1.setFrame(1);
377 	_object1.changeZoom(100);
378 
379 	_object4.postInit();
380 	_object4.hide();
381 	_object5.postInit();
382 	_object5.hide();
383 	_object6.postInit();
384 	_object6.hide();
385 	_object7.postInit();
386 	_object7.hide();
387 	_object8.postInit();
388 	_object8.hide();
389 	_object9.postInit();
390 	_object9.hide();
391 
392 	_object2.setAction(&_action1);
393 }
394 
remove()395 void Scene220::remove() {
396 	BF_GLOBALS._scenePalette.clearListeners();
397 	SceneExt::remove();
398 }
399 
400 /*--------------------------------------------------------------------------
401  * Scene 225 - Credits - Gun Training
402  *
403  *--------------------------------------------------------------------------*/
404 
signal()405 void Scene225::Action1::signal() {
406 	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
407 	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
408 
409 	switch (_actionIndex++) {
410 	case 0:
411 		setDelay(30);
412 		break;
413 	case 1:
414 		BF_GLOBALS._scenePalette.loadPalette(235);
415 		BF_GLOBALS._scenePalette.refresh();
416 		setDelay(5);
417 		break;
418 	case 2:
419 		owner->animate(ANIM_MODE_4, 7, 1, this);
420 		break;
421 	case 3:
422 		scene->_object8.animate(ANIM_MODE_5, this);
423 		owner->animate(ANIM_MODE_5, this);
424 		break;
425 	case 4:
426 		scene->_object8.remove();
427 		break;
428 	case 5:
429 		scene->_action3.signal();
430 		break;
431 	case 6:
432 		owner->setPosition(Common::Point(owner->_position.x, owner->_position.y - 4));
433 		owner->setStrip(2);
434 		owner->setFrame(1);
435 		owner->animate(ANIM_MODE_5, this);
436 		break;
437 	case 7:
438 		scene->_action2.signal();
439 		break;
440 	case 8:
441 		owner->animate(ANIM_MODE_6, this);
442 		break;
443 	case 9:
444 		owner->setPosition(Common::Point(owner->_position.x - 2, owner->_position.y - 1));
445 		owner->setStrip(3);
446 		owner->setFrame(1);
447 		owner->animate(ANIM_MODE_5, this);
448 		break;
449 	case 10: {
450 		owner->setPosition(Common::Point(owner->_position.x + 10, owner->_position.y + 4));
451 		owner->setStrip(4);
452 		owner->setFrame(1);
453 		owner->fixPriority(116);
454 		owner->animate(ANIM_MODE_1, NULL);
455 
456 		Common::Point destPos(138, 117);
457 		NpcMover *mover = new NpcMover();
458 		owner->addMover(mover, &destPos, this);
459 		break;
460 	}
461 	case 11: {
462 		owner->setPosition(Common::Point(owner->_position.x - 12, owner->_position.y - 1));
463 		owner->setStrip(5);
464 		owner->setFrame(1);
465 		owner->_moveDiff.x = 8;
466 
467 		Common::Point destPos(402, 116);
468 		NpcMover *mover2 = new NpcMover();
469 		owner->addMover(mover2, &destPos, this);
470 
471 		BF_GLOBALS._player.setPosition(Common::Point(owner->_position.x, 0));
472 		ADD_MOVER_NULL(BF_GLOBALS._player, 500, 0);
473 		break;
474 	}
475 	case 12:
476 		owner->setVisage(1227);
477 		owner->setStrip(1);
478 		owner->setFrame(1);
479 		owner->animate(ANIM_MODE_5, this);
480 		break;
481 	case 13:
482 		owner->setStrip(2);
483 		owner->setFrame(4);
484 		scene->_action4.signal();
485 		break;
486 	case 14:
487 		owner->animate(ANIM_MODE_6, this);
488 		break;
489 	case 15:
490 		scene->_action6.signal();
491 		break;
492 	case 16:
493 		owner->animate(ANIM_MODE_4, 4, 1, this);
494 		break;
495 	case 17:
496 		owner->setFrame(6);
497 		owner->animate(ANIM_MODE_5, this);
498 		break;
499 	case 18:
500 		scene->_action5.signal();
501 		break;
502 	case 19:
503 		owner->animate(ANIM_MODE_4, 4, -1, this);
504 		break;
505 	case 20:
506 		PaletteRotation *rot;
507 		rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
508 		rot->setDelay(10);
509 		rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1);
510 		rot->setDelay(10);
511 
512 		scene->setAction(&scene->_sequenceManager, this, 225, &scene->_object15, &scene->_object16,
513 			&scene->_object17, &scene->_object18, &scene->_object19, &scene->_object20, NULL);
514 		break;
515 	case 21:
516 		scene->_object21.hide();
517 		BF_GLOBALS._player._moveDiff.x = 5;
518 		BF_GLOBALS._sceneManager.changeScene(265);
519 		break;
520 	default:
521 		break;
522 	}
523 }
524 
signal()525 void Scene225::Action2::signal() {
526 	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
527 	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
528 
529 	switch (_actionIndex++) {
530 	case 0:
531 		break;
532 	case 1:
533 		owner->animate(ANIM_MODE_5, this);
534 		break;
535 	case 2:
536 		owner->setStrip(3);
537 		owner->setFrame(2);
538 		scene->_action1.signal();
539 		break;
540 	default:
541 		break;
542 	}
543 }
544 
signal()545 void Scene225::Action3::signal() {
546 	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
547 	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
548 
549 	switch (_actionIndex++) {
550 	case 0:
551 		break;
552 	case 1:
553 		owner->animate(ANIM_MODE_5, this);
554 		break;
555 	case 2:
556 		owner->setStrip(3);
557 		owner->setFrame(1);
558 		scene->_action1.signal();
559 		break;
560 	default:
561 		break;
562 	}
563 }
564 
signal()565 void Scene225::Action4::signal() {
566 	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
567 	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
568 
569 	switch (_actionIndex++) {
570 	case 0:
571 		break;
572 	case 1:
573 		owner->animate(ANIM_MODE_5, this);
574 		break;
575 	case 2:
576 		owner->setStrip(5);
577 		owner->setFrame(4);
578 		scene->_action1.signal();
579 		break;
580 	default:
581 		break;
582 	}
583 }
584 
signal()585 void Scene225::Action5::signal() {
586 	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
587 	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
588 
589 	switch (_actionIndex++) {
590 	case 0:
591 		break;
592 	case 1:
593 		owner->animate(ANIM_MODE_5, this);
594 		break;
595 	case 2:
596 		owner->setStrip(3);
597 		owner->setFrame(6);
598 		scene->_action1.signal();
599 		break;
600 	default:
601 		break;
602 	}
603 }
604 
signal()605 void Scene225::Action6::signal() {
606 	Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene;
607 	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
608 
609 	switch (_actionIndex++) {
610 	case 0:
611 		break;
612 	case 1:
613 		owner->animate(ANIM_MODE_5, this);
614 		break;
615 	case 2:
616 		owner->setStrip(3);
617 		owner->setFrame(3);
618 		scene->_action1.signal();
619 		break;
620 	default:
621 		break;
622 	}
623 }
624 
625 /*--------------------------------------------------------------------------*/
626 
postInit(SceneObjectList * OwnerList)627 void Scene225::postInit(SceneObjectList *OwnerList) {
628 	SceneExt::postInit();
629 	loadScene(1225);
630 	loadBackground(-320, 0);
631 
632 	_object8.postInit();
633 	_object8.setVisage(1225);
634 	_object8.setPosition(Common::Point(114, 119));
635 	_object8._frame = 1;
636 	_object8.setStrip(2);
637 	_object8.changeZoom(100);
638 
639 	_object9.postInit();
640 	_object9.setVisage(1226);
641 	_object9.setPosition(Common::Point(83, 128));
642 	_object9.setStrip(1);
643 	_object9.changeZoom(100);
644 
645 	BF_GLOBALS._player.postInit();
646 	BF_GLOBALS._player.setPosition(Common::Point(83, 0));
647 	BF_GLOBALS._player.hide();
648 
649 	_object10.postInit();
650 	_object10.setVisage(1225);
651 	_object10.setPosition(Common::Point(237, 29));
652 	_object10.setStrip(1);
653 	_object10._frame = 1;
654 	_object10.changeZoom(100);
655 	_object10._numFrames = 2;
656 
657 	_object11.postInit();
658 	_object11.setVisage(1225);
659 	_object11.setPosition(Common::Point(290, 47));
660 	_object11.setStrip(1);
661 	_object11._frame = 1;
662 	_object11.changeZoom(100);
663 	_object11._numFrames = 2;
664 
665 	_object12.postInit();
666 	_object12.setVisage(1225);
667 	_object12.setPosition(Common::Point(368, 35));
668 	_object12.setStrip(4);
669 	_object12._frame = 1;
670 	_object12.changeZoom(100);
671 	_object12._numFrames = 2;
672 
673 	_object13.postInit();
674 	_object13.setVisage(1225);
675 	_object13.setPosition(Common::Point(416, 33));
676 	_object13.setStrip(1);
677 	_object13._frame = 1;
678 	_object13.changeZoom(100);
679 	_object13._numFrames = 2;
680 
681 	_object14.postInit();
682 	_object14.setVisage(1225);
683 	_object14.setPosition(Common::Point(476, 30));
684 	_object14.setStrip(1);
685 	_object14._frame = 1;
686 	_object14.changeZoom(100);
687 	_object14._numFrames = 2;
688 
689 	_object21.postInit();
690 	_object21.setVisage(235);
691 	_object21.setStrip(1);
692 	_object21._frame = 1;
693 	_object21.setPosition(Common::Point(498, 41));
694 	_object21.changeZoom(100);
695 	_object21.hide();
696 
697 	_object15.postInit();
698 	_object15.hide();
699 	_object16.postInit();
700 	_object16.hide();
701 	_object17.postInit();
702 	_object17.hide();
703 	_object18.postInit();
704 	_object18.hide();
705 	_object19.postInit();
706 	_object19.hide();
707 	_object20.postInit();
708 	_object20.hide();
709 
710 	_object9.setAction(&_action1);
711 	_object10.setAction(&_action2);
712 	_object11.setAction(&_action3);
713 	_object12.setAction(&_action4);
714 	_object13.setAction(&_action5);
715 	_object14.setAction(&_action6);
716 }
717 
remove()718 void Scene225::remove() {
719 	BF_GLOBALS._scenePalette.clearListeners();
720 	SceneExt::remove();
721 }
722 
723 /*--------------------------------------------------------------------------
724  * Scene 265 - Intro - Graduation Article
725  *
726  *--------------------------------------------------------------------------*/
727 
signal()728 void Scene265::Action1::signal() {
729 	switch (_actionIndex++) {
730 	case 0:
731 		BF_GLOBALS._scenePalette.loadPalette(2);
732 		setDelay(30);
733 		break;
734 	case 1:
735 		BF_GLOBALS._scenePalette.refresh();
736 		setDelay(240);
737 		break;
738 	case 2:
739 		ADD_MOVER(BF_GLOBALS._player, 160, 280);
740 		break;
741 	case 3:
742 		// Wait until sound finishes playing
743 		if (BF_GLOBALS._sound1.isPlaying())
744 			_actionIndex = 3;
745 		setDelay(1);
746 		break;
747 	case 4:
748 		BF_GLOBALS._dayNumber = 1;
749 		BF_GLOBALS._sceneManager.changeScene(190);
750 		break;
751 	default:
752 		break;
753 	}
754 }
755 
756 /*--------------------------------------------------------------------------*/
757 
postInit(SceneObjectList * OwnerList)758 void Scene265::postInit(SceneObjectList *OwnerList) {
759 	SceneExt::postInit();
760 	loadScene(265);
761 
762 	BF_GLOBALS._player.postInit();
763 	BF_GLOBALS._player.setPosition(Common::Point(160, 100));
764 	BF_GLOBALS._player.hide();
765 	setAction(&_action1);
766 }
767 
remove()768 void Scene265::remove() {
769 	clearScreen();
770 	SceneExt::remove();
771 }
772 
773 /*--------------------------------------------------------------------------
774  * Scene 270 - Living Room & Kitchen
775  *
776  *--------------------------------------------------------------------------*/
777 
signal()778 void Scene270::Action1::signal() {
779 	Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;
780 
781 	scene->setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL);
782 }
783 
784 /*--------------------------------------------------------------------------*/
785 
startAction(CursorType action,Event & event)786 bool Scene270::Lyle::startAction(CursorType action, Event &event) {
787 	Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;
788 
789 	switch (action) {
790 	case CURSOR_TALK:
791 		scene->_field21A0 = 1;
792 		BF_GLOBALS._player.disableControl();
793 		scene->_sceneMode = 2706;
794 
795 		if (scene->_field380 == 1) {
796 			scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object2, NULL);
797 		} else {
798 			scene->signal();
799 		}
800 		return true;
801 	case INV_CRATE1:
802 		scene->_field21A0 = 2;
803 		BF_GLOBALS._player.disableControl();
804 		scene->_sceneMode = 2706;
805 
806 		if (scene->_field380 == 1) {
807 			scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, NULL);
808 		} else {
809 			scene->signal();
810 		}
811 		return true;
812 	default:
813 		return NamedObject::startAction(action, event);
814 	}
815 }
816 
startAction(CursorType action,Event & event)817 bool Scene270::Grandma::startAction(CursorType action, Event &event) {
818 	Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;
819 
820 	switch (action) {
821 	case CURSOR_TALK:
822 		switch (BF_GLOBALS._dayNumber) {
823 		case 1:
824 			// Day 1
825 			if (scene->_field380 == 1) {
826 				scene->_stripManager.start((scene->_grandma._position.x == 157) ? 2712 : 2723, &BF_GLOBALS._stripProxy);
827 			} else if (BF_GLOBALS._bookmark == bBookedFrankieEvidence) {
828 				BF_GLOBALS._player.disableControl();
829 				scene->_sceneMode = 2710;
830 				scene->setAction(&scene->_sequenceManager1, scene, 2710, &BF_GLOBALS._player, &scene->_grandma, NULL);
831 			} else if (BF_GLOBALS.getFlag(onDuty) || (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) == 2) ||
832 						(scene->_field386 != 0)) {
833 				scene->_stripManager.start(2723, &BF_GLOBALS._stripProxy);
834 			} else {
835 				BF_GLOBALS._player.disableControl();
836 				scene->_sceneMode = 2715;
837 				scene->setAction(&scene->_sequenceManager1, scene, 2715, &BF_GLOBALS._player, &scene->_grandma, NULL);
838 			}
839 			return true;
840 		case 3:
841 			// Day 3
842 			if (scene->_field380 == 1) {
843 				scene->_stripManager.start(2712, &BF_GLOBALS._stripProxy);
844 			} else if (BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3)) {
845 				scene->_stripManager.start(2714, &BF_GLOBALS._stripProxy);
846 			} else {
847 				BF_GLOBALS._player.disableControl();
848 				scene->_sceneMode = 2713;
849 				scene->setAction(&scene->_sequenceManager1, scene, 2713, &BF_GLOBALS._player, &scene->_grandma, NULL);
850 			}
851 			return true;
852 		default:
853 			break;
854 		}
855 		break;
856 	default:
857 		break;
858 	}
859 
860 	return NamedObject::startAction(action, event);
861 }
862 
863 /*--------------------------------------------------------------------------*/
864 
startAction(CursorType action,Event & event)865 bool Scene270::Item::startAction(CursorType action, Event &event) {
866 	Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;
867 
868 	if ((action == CURSOR_USE) && (scene->_field380 == 0)) {
869 		BF_GLOBALS._player.disableControl();
870 		scene->_object2.postInit();
871 		scene->_object2.hide();
872 		scene->_sceneMode = 2705;
873 		scene->setAction(&scene->_sequenceManager1, scene, 2705, &BF_GLOBALS._player, &scene->_object2, NULL);
874 		return true;
875 	} else {
876 		return NamedHotspot::startAction(action, event);
877 	}
878 }
879 
startAction(CursorType action,Event & event)880 bool Scene270::Exit::startAction(CursorType action, Event &event) {
881 	Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene;
882 
883 	if (!_action && !scene->_field384 && !scene->_field386) {
884 		if (scene->_field380 == 1) {
885 			scene->_tempPos = Common::Point(320, 140);
886 			BF_GLOBALS._player.disableControl();
887 
888 			scene->_sceneMode = 2706;
889 			scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object2, NULL);
890 		} else {
891 			ADD_PLAYER_MOVER(320, 140);
892 		}
893 		return true;
894 	} else {
895 		return false;
896 	}
897 }
898 
899 /*--------------------------------------------------------------------------*/
900 
Scene270()901 Scene270::Scene270(): SceneExt() {
902 	_field380 = _field382 =_field384 = _field386 = 0;
903 	_field219A = _tempPos.x = _tempPos.y = _field21A0 = 0;
904 	_sceneMode = 0;
905 }
906 
synchronize(Serializer & s)907 void Scene270::synchronize(Serializer &s) {
908 	SceneExt::synchronize(s);
909 	s.syncAsSint16LE(_field380);
910 	s.syncAsSint16LE(_field382);
911 	s.syncAsSint16LE(_field384);
912 	s.syncAsSint16LE(_field386);
913 	s.syncAsSint16LE(_field219A);
914 	s.syncAsSint16LE(_tempPos.x);
915 	s.syncAsSint16LE(_tempPos.y);
916 	s.syncAsSint16LE(_field21A0);
917 }
918 
postInit(SceneObjectList * OwnerList)919 void Scene270::postInit(SceneObjectList *OwnerList) {
920 	SceneExt::postInit();
921 	loadScene(270);
922 	setZoomPercents(120, 90, 130, 100);
923 
924 	if (BF_GLOBALS._sceneManager._previousScene != 560)
925 		BF_GLOBALS._sound1.fadeSound(26);
926 
927 	_exit.setDetails(Rect(310, 115, 320, 167), 270, -1, -1, -1, 1, NULL);
928 
929 	if (BF_GLOBALS._dayNumber == 0) {
930 		BF_GLOBALS._dayNumber = 1;
931 		BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 2);
932 		BF_INVENTORY.setObjectScene(INV_CRATE1, 1);
933 		BF_GLOBALS._sceneManager._previousScene = 710;
934 	}
935 
936 	if (((BF_GLOBALS._bookmark >= bLauraToParamedics) && (BF_GLOBALS._dayNumber == 1) &&
937 				(BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 2) &&
938 				(BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 1)) ||
939 			((BF_GLOBALS._dayNumber == 3) && BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3))) {
940 		BF_GLOBALS._walkRegions.disableRegion(6);
941 		BF_GLOBALS._walkRegions.disableRegion(14);
942 		BF_GLOBALS._walkRegions.disableRegion(19);
943 
944 		_grandma.postInit();
945 		_grandma.setVisage(274);
946 		_grandma.setPosition(Common::Point(157, 132));
947 		_grandma._numFrames = 5;
948 		_grandma.animate(ANIM_MODE_2, NULL);
949 		_grandma.fixPriority(129);
950 	}
951 
952 	if (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard) {
953 		_grandma.postInit();
954 	}
955 
956 	if (BF_GLOBALS._sceneManager._previousScene == 710) {
957 		_skip.postInit();
958 		_laura.postInit();
959 		_lyle.postInit();
960 		_grandma.postInit();
961 	}
962 
963 	_stripManager.addSpeaker(&_grandmaSpeaker);
964 	_stripManager.addSpeaker(&_lyleSpeaker);
965 	_stripManager.addSpeaker(&_jakeSpeaker);
966 	_stripManager.addSpeaker(&_skipSpeaker);
967 	_stripManager.addSpeaker(&_lauraSpeaker);
968 	_stripManager.addSpeaker(&_gameTextSpeaker);
969 
970 	_tv.postInit();
971 	_tv.setVisage(270);
972 	_tv.setPosition(Common::Point(264, 74));
973 	_tv.setStrip(5);
974 	_tv.fixPriority(132);
975 	_tv._numFrames = 3;
976 	_tv.setAction(&_action1);
977 
978 	_fireplace.postInit();
979 	_fireplace.setVisage(270);
980 	_fireplace.setStrip(2);
981 	_fireplace.setPosition(Common::Point(302, 121));
982 	_fireplace.fixPriority(132);
983 	_fireplace.animate(ANIM_MODE_2, NULL);
984 
985 	_fridge.setDetails(Rect(0, 56, 56, 130), 270, 9, 10, 11, 1, NULL);
986 	_object3.setDetails(270, 12, 13, 14, 1, (SceneItem *)NULL);
987 	_laura.setDetails(270, 15, -1, -1, 1, (SceneItem *)NULL);
988 	_skip.setDetails(270, 14, -1, -1, 1, (SceneItem *)NULL);
989 	_lyle.setDetails(270, 34, 35, 36, 1, (SceneItem *)NULL);
990 	_tv.setDetails(270, 3, 4, 5, 1, (SceneItem *)NULL);
991 	_fireplace.setDetails(270, 6, 7, 8, 1, (SceneItem *)NULL);
992 
993 	if ((BF_GLOBALS._sceneManager._previousScene == 710) && (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard)) {
994 		_grandma.setDetails(270, 15, 16, 17, 1, (SceneItem *)NULL);
995 	} else {
996 		_grandma.setDetails(270, 40, 16, 17, 1, (SceneItem *)NULL);
997 	}
998 
999 	_afgan.setDetails(4, 270, 27, 28, 29, 1);
1000 	_couch.setDetails(1, 270, 18, 19, 20, 1);
1001 	_photos.setDetails(Rect(278, 50, 318, 72), 270, 21, 22, 23, 1, NULL);
1002 	_appliances.setDetails(3, 270, 24, 25, 26, 1);
1003 	_ivy.setDetails(2, 270, 30, 31, 32, 1);
1004 	_background.setDetails(Rect(0, 0, 320, 168), 270, 0, 1, 2, 1, NULL);
1005 
1006 	BF_GLOBALS._player.postInit();
1007 	BF_GLOBALS._player._moveDiff.x = 8;
1008 	BF_GLOBALS._player.changeZoom(-1);
1009 	BF_GLOBALS._player.disableControl();
1010 
1011 	switch (BF_GLOBALS._sceneManager._previousScene) {
1012 	case 560:
1013 		if (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard) {
1014 			_field219A = 1;
1015 			BF_GLOBALS._player._moveDiff.x = 5;
1016 			_field386 = 0;
1017 
1018 			_grandma.animate(ANIM_MODE_1, NULL);
1019 			setAction(&_sequenceManager1, NULL, 2720, &BF_GLOBALS._player, &_grandma, NULL);
1020 			BF_GLOBALS._bookmark = bLyleStoppedBy;
1021 		} else {
1022 			_sceneMode = 2700;
1023 			setAction(&_sequenceManager1, this, 2700, &BF_GLOBALS._player, NULL);
1024 		}
1025 		break;
1026 	case 690:
1027 		BF_GLOBALS._player.setPosition(Common::Point(-13, 162));
1028 		_sceneMode = 2702;
1029 		setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
1030 		break;
1031 	case 710:
1032 		BF_GLOBALS._player._moveDiff.x = 6;
1033 		_sceneMode = 2717;
1034 		setAction(&_sequenceManager1, this, 2717, &BF_GLOBALS._player, &_laura, &_skip, &_lyle, &_grandma, NULL);
1035 		break;
1036 	default:
1037 		_sceneMode = 2701;
1038 		setAction(&_sequenceManager1, this, 2701, &BF_GLOBALS._player, NULL);
1039 		break;
1040 	}
1041 }
1042 
signal()1043 void Scene270::signal() {
1044 	switch (_sceneMode) {
1045 	case 10:
1046 		_sceneMode = 2702;
1047 		setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
1048 		break;
1049 	case 11:
1050 		BF_GLOBALS._player._strip = 8;
1051 		BF_GLOBALS._player._frame = 1;
1052 
1053 		if (_field382) {
1054 			_sceneMode = 2719;
1055 			_stripManager.start(2720, this);
1056 		} else {
1057 			_field382 = 1;
1058 			_sceneMode = 13;
1059 			_stripManager.start(2718, this);
1060 		}
1061 		break;
1062 	case 12:
1063 		BF_GLOBALS._player._strip = 8;
1064 		BF_GLOBALS._player._frame = 1;
1065 		_sceneMode = 13;
1066 		_stripManager.start(2719, this);
1067 		break;
1068 	case 13:
1069 	case 2713:
1070 	case 2715:
1071 		BF_GLOBALS._player.enableControl();
1072 		break;
1073 	case 2700:
1074 		_field219A = 1;
1075 		BF_GLOBALS._player._strip = 6;
1076 		BF_GLOBALS._player.enableControl();
1077 		break;
1078 	case 2701:
1079 		BF_GLOBALS._player._strip = 2;
1080 		BF_GLOBALS._player.enableControl();
1081 		_field219A = 1;
1082 		break;
1083 	case 2702:
1084 		BF_GLOBALS._player._strip = 1;
1085 		BF_GLOBALS._player.enableControl();
1086 		_field219A = 1;
1087 		break;
1088 	case 2705:
1089 		_field380 = 1;
1090 		BF_GLOBALS._player.enableControl();
1091 		break;
1092 	case 2706:
1093 		BF_GLOBALS._player.changeZoom(-1);
1094 		_object2.remove();
1095 		_field380 = 0;
1096 
1097 		switch (_field21A0) {
1098 		case 1:
1099 			_sceneMode = 11;
1100 			ADD_PLAYER_MOVER(192, 135);
1101 			break;
1102 		case 2:
1103 			if (BF_GLOBALS.getFlag(shownLyleCrate1Day1)) {
1104 				SceneItem::display2(270, 37);
1105 				BF_GLOBALS._player.enableControl();
1106 			} else {
1107 				T2_GLOBALS._uiElements.addScore(30);
1108 				BF_GLOBALS.setFlag(shownLyleCrate1Day1);
1109 				_sceneMode = 12;
1110 				ADD_PLAYER_MOVER(192, 135);
1111 			}
1112 			break;
1113 		default:
1114 			BF_GLOBALS._player.enableControl();
1115 			ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, _tempPos.x, _tempPos.y);
1116 			break;
1117 		}
1118 
1119 		_field21A0 = 0;
1120 		break;
1121 	case 2710:
1122 		BF_GLOBALS._bookmark = bEndOfWorkDayOne;
1123 		BF_GLOBALS._player.enableControl();
1124 		break;
1125 	case 2711:
1126 		BF_GLOBALS._player.setPosition(Common::Point(150, 300));
1127 		BF_GLOBALS._sound1.fadeOut2(NULL);
1128 		BF_GLOBALS._sceneManager.changeScene(180);
1129 		BF_GLOBALS._bookmark = bLyleStoppedBy;
1130 		break;
1131 	case 2712:
1132 		BF_GLOBALS._sound1.fadeOut2(NULL);
1133 		BF_GLOBALS._sceneManager.changeScene(180);
1134 		break;
1135 	case 2714:
1136 		BF_GLOBALS._sceneManager.changeScene(560);
1137 		break;
1138 	case 2717:
1139 		_sceneMode = 2718;
1140 		_lyle.setFrame2(-1);
1141 		setAction(&_sequenceManager1, this, 2718, &BF_GLOBALS._player, &_laura, &_skip,
1142 			&_lyle, &_grandma, NULL);
1143 		break;
1144 	case 2718:
1145 		BF_GLOBALS._walkRegions.disableRegion(6);
1146 		BF_GLOBALS._walkRegions.disableRegion(14);
1147 		BF_GLOBALS._walkRegions.disableRegion(19);
1148 
1149 		_field219A = 1;
1150 		BF_GLOBALS._bookmark = bTalkedToGrannyAboutSkipsCard;
1151 
1152 		_grandma.setStrip(8);
1153 		_grandma._frame = 5;
1154 		_field384 = 1;
1155 		_field386 = 1;
1156 
1157 		BF_GLOBALS._player._moveDiff.x = 8;
1158 		BF_GLOBALS._player.enableControl();
1159 		break;
1160 	case 2719:
1161 		_sceneMode = 13;
1162 		_field384 = 0;
1163 		BF_GLOBALS._player._moveDiff.x = 6;
1164 
1165 		_lyle.setFrame2(-1);
1166 		setAction(&_sequenceManager1, this, 2719, &BF_GLOBALS._player, &_lyle, &_grandma, NULL);
1167 		break;
1168 	default:
1169 		break;
1170 	}
1171 }
1172 
process(Event & event)1173 void Scene270::process(Event &event) {
1174 	if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
1175 			(_field380 == 1) && !_action) {
1176 		_tempPos = event.mousePos;
1177 		BF_GLOBALS._player.disableControl();
1178 		_sceneMode = 2706;
1179 		setAction(&_sequenceManager1, this, 2706, &BF_GLOBALS._player, &_object2, NULL);
1180 		event.handled = true;
1181 	}
1182 
1183 	SceneExt::process(event);
1184 
1185 	if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1)) &&
1186 			!_field384 && !_field386) {
1187 		// Check if the cursor is on an exit
1188 		if (_exit.contains(event.mousePos)) {
1189 			GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E);
1190 			BF_GLOBALS._events.setCursor(surface);
1191 		} else {
1192 			// In case an exit cursor was being shown, restore the previously selected cursor
1193 			CursorType cursorId = BF_GLOBALS._events.getCursor();
1194 			BF_GLOBALS._events.setCursor(cursorId);
1195 		}
1196 	}
1197 }
1198 
dispatch()1199 void Scene270::dispatch() {
1200 	if (_field384) {
1201 		_lyle.updateAngle(BF_GLOBALS._player._position);
1202 
1203 		if (_lyle._angle < 110)
1204 			_lyle.setFrame2(4);
1205 		else if (_lyle._angle < 180)
1206 			_lyle.setFrame2(3);
1207 		else if (_lyle._angle < 250)
1208 			_lyle.setFrame2(2);
1209 		else
1210 			_lyle.setFrame2(1);
1211 	}
1212 
1213 	if (_field386) {
1214 		if (BF_GLOBALS._player._position.x > 290) {
1215 			_grandma.setFrame(6);
1216 		} else if (BF_GLOBALS._player._position.x > 274) {
1217 			_grandma.setFrame(5);
1218 		} else if (BF_GLOBALS._player._position.x > 258) {
1219 			_grandma.setFrame(4);
1220 		} else if (BF_GLOBALS._player._position.x > 242) {
1221 			_grandma.setFrame(3);
1222 		} else if (BF_GLOBALS._player._position.x > 226) {
1223 			_grandma.setFrame(2);
1224 		} else if (BF_GLOBALS._player._position.x > 210) {
1225 			if ((_grandma._animateMode == ANIM_MODE_NONE) && (_grandma._frame > 1))
1226 				_grandma.animate(ANIM_MODE_6, NULL);
1227 		} else {
1228 			if ((_grandma._animateMode == ANIM_MODE_NONE) && (_grandma._frame < 3))
1229 				_grandma.animate(ANIM_MODE_4, 3, 1, NULL);
1230 		}
1231 	}
1232 
1233 	if (!_action && _field219A) {
1234 		if ((BF_GLOBALS._player._position.x > 236) && (BF_GLOBALS._player._position.y < 125)) {
1235 			_field219A = 0;
1236 			BF_GLOBALS._player.disableControl();
1237 			if (!_field384) {
1238 				BF_GLOBALS._sceneManager.changeScene(560);
1239 			} else {
1240 				BF_GLOBALS._player.addMover(NULL);
1241 				SceneItem::display2(270, 38);
1242 				_sceneMode = 2700;
1243 				ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 10, BF_GLOBALS._player._position.y + 15);
1244 			}
1245 		}
1246 
1247 		if (BF_GLOBALS._player._position.x <= 20) {
1248 			_field219A = 0;
1249 			BF_GLOBALS._player.disableControl();
1250 			BF_GLOBALS._player.addMover(NULL);
1251 			BF_GLOBALS._player._strip = 3;
1252 			BF_GLOBALS._player._frame = 1;
1253 
1254 			if (BF_GLOBALS._sceneObjects->contains(&_grandma)) {
1255 				_sceneMode = 10;
1256 				_stripManager.start(2711, this);
1257 			} else {
1258 				SceneItem::display2(270, 33);
1259 				_sceneMode = 2702;
1260 				setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
1261 			}
1262 		}
1263 
1264 		if (BF_GLOBALS._player._position.x > 310) {
1265 			_field219A = 0;
1266 			BF_GLOBALS._player.disableControl();
1267 			if (!_field384 && !_field386) {
1268 				_sceneMode = 2712;
1269 				setAction(&_sequenceManager1, this, 2712, &BF_GLOBALS._player, NULL);
1270 			} else {
1271 				BF_GLOBALS._player.addMover(NULL);
1272 				BF_GLOBALS._player._strip = 2;
1273 				BF_GLOBALS._player._frame = 1;
1274 				SceneItem::display2(270, !_field384 ? 39 : 38);
1275 				_sceneMode = 2701;
1276 
1277 				ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 10, BF_GLOBALS._player._position.y);
1278 			}
1279 		}
1280 	}
1281 
1282 	SceneExt::dispatch();
1283 }
1284 
1285 /*--------------------------------------------------------------------------
1286  * Scene 271 - Living Room & Kitchen #2
1287  *
1288  *--------------------------------------------------------------------------*/
1289 
signal()1290 void Scene271::Action1::signal() {
1291 	Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;
1292 
1293 	setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL);
1294 }
1295 
1296 /*--------------------------------------------------------------------------*/
1297 
startAction(CursorType action,Event & event)1298 bool Scene271::Object12::startAction(CursorType action, Event &event) {
1299 	Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;
1300 
1301 	switch (action) {
1302 	case CURSOR_TALK:
1303 		if (BF_GLOBALS._dayNumber == 1) {
1304 			if (!BF_GLOBALS.getFlag(onDuty) && (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 2)) {
1305 				scene->_sceneMode = 2715;
1306 				scene->setAction(&scene->_sequenceManager1, scene, 2715, &BF_GLOBALS._player, NULL);
1307 				return true;
1308 			}
1309 		} else if (BF_GLOBALS._dayNumber == 3) {
1310 			if (scene->_field796 == 1) {
1311 				scene->_stripManager.start(2712, &BF_GLOBALS._stripProxy);
1312 				return true;
1313 			} else if (BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3)) {
1314 				scene->_stripManager.start(2714, &BF_GLOBALS._stripProxy);
1315 				return true;
1316 			} else {
1317 				BF_GLOBALS._player.disableControl();
1318 				scene->_sceneMode = 2713;
1319 				scene->setAction(&scene->_sequenceManager1, scene, 2713, &BF_GLOBALS._player, &scene->_object12, NULL);
1320 				BF_GLOBALS.setFlag(fGotGreen355fTalkedToGrannyDay3);
1321 				return true;
1322 			}
1323 		}
1324 		break;
1325 	default:
1326 		break;
1327 	}
1328 
1329 	return NamedObject::startAction(action, event);
1330 }
1331 
1332 /*--------------------------------------------------------------------------*/
1333 
startAction(CursorType action,Event & event)1334 bool Scene271::Item::startAction(CursorType action, Event &event) {
1335 	Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;
1336 
1337 	if ((action == CURSOR_USE) && !scene->_field796) {
1338 		BF_GLOBALS._player.disableControl();
1339 		scene->_object1.postInit();
1340 		scene->_object1.hide();
1341 
1342 		scene->_sceneMode = 2705;
1343 		scene->setAction(&scene->_sequenceManager1, scene, 2705, &BF_GLOBALS._player, &scene->_object1, NULL);
1344 		return true;
1345 	} else {
1346 		return NamedHotspot::startAction(action, event);
1347 	}
1348 }
1349 
startAction(CursorType action,Event & event)1350 bool Scene271::Exit::startAction(CursorType action, Event &event) {
1351 	Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene;
1352 
1353 	if (!scene->_action) {
1354 		if (scene->_field796 == 1) {
1355 			scene->_tempPos = Common::Point(320, 140);
1356 			BF_GLOBALS._player.disableControl();
1357 			scene->_sceneMode = 2706;
1358 			scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object1, NULL);
1359 		} else {
1360 			ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 320, 140);
1361 		}
1362 	}
1363 
1364 	return true;
1365 }
1366 
1367 /*--------------------------------------------------------------------------*/
1368 
Scene271()1369 Scene271::Scene271() {
1370 	_field796 = _field2E16 = 0;
1371 	_tempPos.x = _tempPos.y = 0;
1372 	_rect1 = Rect(236, 120, 266, 130);
1373 }
1374 
synchronize(Serializer & s)1375 void Scene271::synchronize(Serializer &s) {
1376 	PalettedScene::synchronize(s);
1377 
1378 	s.syncAsSint16LE(_field796);
1379 	s.syncAsSint16LE(_field2E16);
1380 	s.syncAsSint16LE(_tempPos.x);
1381 	s.syncAsSint16LE(_tempPos.y);
1382 	_rect1.synchronize(s);
1383 }
1384 
postInit(SceneObjectList * OwnerList)1385 void Scene271::postInit(SceneObjectList *OwnerList) {
1386 	PalettedScene::postInit();
1387 	loadScene(270);
1388 	setZoomPercents(120, 80, 140, 100);
1389 	BF_GLOBALS._sound1.fadeSound(26);
1390 
1391 	_stripManager.addSpeaker(&_grandmaSpeaker);
1392 	_stripManager.addSpeaker(&_lyleSpeaker);
1393 	_stripManager.addSpeaker(&_jakeSpeaker);
1394 	_stripManager.addSpeaker(&_skipSpeaker);
1395 	_stripManager.addSpeaker(&_lauraSpeaker);
1396 	_stripManager.addSpeaker(&_gameTextSpeaker);
1397 	_stripManager.addSpeaker(&_granTextSpeaker);
1398 	_stripManager.addSpeaker(&_lyleTextSpeaker);
1399 
1400 	_exit.setDetails(Rect(310, 115, 320, 167), 270, -1, -1, -1, 1, NULL);
1401 
1402 	_tv.postInit();
1403 	_tv.setVisage(270);
1404 	_tv.setPosition(Common::Point(264, 74));
1405 	_tv.setStrip(5);
1406 	_tv.fixPriority(132);
1407 	_tv._numFrames = 3;
1408 	_tv.setAction(&_action1);
1409 
1410 	if ((BF_GLOBALS._sceneManager._previousScene != 280) && (BF_GLOBALS._sceneManager._previousScene != 620)) {
1411 		_object10.postInit();
1412 		_object10.setVisage(270);
1413 		_object10.setStrip(2);
1414 		_object10.setPosition(Common::Point(302, 121));
1415 		_object10.fixPriority(132);
1416 		_object10.animate(ANIM_MODE_2, NULL);
1417 	}
1418 
1419 	_object5.postInit();
1420 	_object5.hide();
1421 
1422 	_item5.setDetails(Rect(0, 56, 56, 130), 270, 9, 10, 11, 1, NULL);
1423 	_object6.setDetails(270, 12, 13, 14, 1, (SceneItem *)NULL);
1424 	_object7.setDetails(270, 15, -1, -1, 1, (SceneItem *)NULL);
1425 	_object8.setDetails(270, 14, -1, -1, 1, (SceneItem *)NULL);
1426 	_object11.setDetails(270, -1, -1, -1, 1, (SceneItem *)NULL);
1427 	_tv.setDetails(270, 3, 4, 5, 1, (SceneItem *)NULL);
1428 	_object10.setDetails(270, 6, 7, 8, 1, (SceneItem *)NULL);
1429 	_object12.setDetails(270, 15, 16, 17, 1, (SceneItem *)NULL);
1430 	_item3.setDetails(4, 270, 27, 28, 29, 1);
1431 	_item1.setDetails(1, 270, 18, 19, 20, 1);
1432 	_item6.setDetails(Rect(278, 50, 318, 72), 270, 21, 22, 23, 1, NULL);
1433 	_item2.setDetails(3, 270, 24, 25, 26, 1);
1434 	_item4.setDetails(2, 270, 30, 31, 32, 1);
1435 	_item11.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 270, 0, 1, 2, 1, NULL);
1436 
1437 	BF_GLOBALS._player.postInit();
1438 	BF_GLOBALS._player._moveDiff.x = 8;
1439 	BF_GLOBALS._player.changeZoom(-1);
1440 	BF_GLOBALS._player.disableControl();
1441 
1442 	_field796 = 0;
1443 	_sceneMode = 0;
1444 	_field2E16 = 0;
1445 
1446 	if (BF_GLOBALS._dayNumber == 0) {
1447 		BF_GLOBALS._dayNumber = 1;
1448 		BF_GLOBALS._sceneManager.changeScene(180);
1449 	}
1450 
1451 	switch (BF_GLOBALS._sceneManager._previousScene) {
1452 	case 180:
1453 		BF_GLOBALS._walkRegions.disableRegion(6);
1454 		BF_GLOBALS._walkRegions.disableRegion(14);
1455 		BF_GLOBALS._walkRegions.disableRegion(19);
1456 
1457 		BF_GLOBALS._player.setVisage(275);
1458 		BF_GLOBALS._player.setPosition(Common::Point(348, 151));
1459 
1460 		_object12.postInit();
1461 		_object12.setVisage(274);
1462 		_object12.setPosition(Common::Point(157, 132));
1463 		_object12._numFrames = 5;
1464 		_object12.animate(ANIM_MODE_2, NULL);
1465 		break;
1466 	case 280:
1467 		BF_GLOBALS._player.setVisage(271);
1468 		BF_GLOBALS._player.setStrip(5);
1469 		BF_GLOBALS._player._frame = 6;
1470 		BF_GLOBALS._player.setPosition(Common::Point(228, 138));
1471 
1472 		_object1.postInit();
1473 		_object1.setPosition(Common::Point(340, 100));
1474 
1475 		_object11.postInit();
1476 		_object11.setVisage(272);
1477 		_object11.setStrip(1);
1478 		_object11._frame = 2;
1479 		_object11.setPosition(Common::Point(35, 136));
1480 
1481 		_object6.postInit();
1482 		_object6.hide();
1483 
1484 		BF_GLOBALS._walkRegions.disableRegion(6);
1485 		BF_GLOBALS._walkRegions.disableRegion(14);
1486 		BF_GLOBALS._walkRegions.disableRegion(19);
1487 
1488 		_object12.postInit();
1489 		_object12.setVisage(274);
1490 		_object12.setPosition(Common::Point(157, 132));
1491 		_object12.animate(ANIM_MODE_2, NULL);
1492 		_object12._numFrames = 5;
1493 		_object12.fixPriority(120);
1494 		_field796 = 1;
1495 		break;
1496 	case 590:
1497 		BF_GLOBALS._player.setVisage(275);
1498 		BF_GLOBALS._player.setStrip(5);
1499 		BF_GLOBALS._player.setPosition(Common::Point(58, 133));
1500 		BF_GLOBALS._player.changeZoom(-1);
1501 
1502 		_object8.postInit();
1503 		_object8.setVisage(279);
1504 		_object8.setPosition(Common::Point(87, 127));
1505 		_object8.fixPriority(146);
1506 
1507 		_object7.postInit();
1508 		_object7.setVisage(277);
1509 		_object7.setStrip(7);
1510 		_object7.setPosition(Common::Point(48, 149));
1511 
1512 		BF_GLOBALS._walkRegions.disableRegion(6);
1513 		BF_GLOBALS._walkRegions.disableRegion(14);
1514 		BF_GLOBALS._walkRegions.disableRegion(19);
1515 
1516 		_object12.postInit();
1517 		_object12.setVisage(276);
1518 		_object12.setPosition(Common::Point(129, 130));
1519 
1520 		_object2.postInit();
1521 		_object2.setVisage(270);
1522 		_object2.setStrip(3);
1523 		_object2.setFrame(2);
1524 		_object2.setPosition(Common::Point(62, 101));
1525 		_object2.fixPriority(145);
1526 
1527 		_object3.postInit();
1528 		_object3.setVisage(270);
1529 		_object3.setStrip(3);
1530 		_object3.setFrame(3);
1531 		_object3.setPosition(Common::Point(90, 104));
1532 		_object3.fixPriority(132);
1533 
1534 		_object4.postInit();
1535 		_object4.setVisage(270);
1536 		_object4.setStrip(3);
1537 		_object4.setFrame(4);
1538 		_object4.setPosition(Common::Point(132, 87));
1539 		_object4.fixPriority(1);
1540 		break;
1541 	default:
1542 		BF_GLOBALS._player.setVisage(271);
1543 		BF_GLOBALS._player.setFrame(1);
1544 		BF_GLOBALS._player.setPosition(Common::Point(239, 145));
1545 
1546 		BF_GLOBALS._walkRegions.disableRegion(6);
1547 		BF_GLOBALS._walkRegions.disableRegion(14);
1548 		BF_GLOBALS._walkRegions.disableRegion(19);
1549 
1550 		_object12.postInit();
1551 		_object12.setVisage(274);
1552 		_object12.setPosition(Common::Point(157, 132));
1553 		_object12.animate(ANIM_MODE_2, NULL);
1554 		_object12._numFrames = 5;
1555 
1556 		_object1.postInit();
1557 		_object1.setVisage(271);
1558 		_object1.setStrip(4);
1559 		_object1.setPosition(Common::Point(220, 117));
1560 		_object1.fixPriority(145);
1561 		break;
1562 	}
1563 
1564 	_sceneMode = 11;
1565 
1566 	static uint32 black = 0;
1567 	add2Faders((const byte *)&black, 2, 270, this);
1568 }
1569 
signal()1570 void Scene271::signal() {
1571 	static uint32 black = 0;
1572 
1573 	switch (_sceneMode) {
1574 	case 10:
1575 		_sceneMode = 2702;
1576 		setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
1577 		break;
1578 	case 11:
1579 		switch (BF_GLOBALS._sceneManager._previousScene) {
1580 		case 180:
1581 			_sceneMode = 2716;
1582 			setAction(&_sequenceManager1, this, 2716, &BF_GLOBALS._player, &_object12, NULL);
1583 			break;
1584 		case 280:
1585 			BF_GLOBALS._dayNumber = 3;
1586 			BF_INVENTORY.alterInventory(3);
1587 
1588 			_sceneMode = 2707;
1589 			setAction(&_sequenceManager1, this, 2707, &BF_GLOBALS._player, &_object1, &_object11, &_object5, &_object6, NULL);
1590 			break;
1591 		case 590:
1592 			_sceneMode = 2704;
1593 			setAction(&_sequenceManager1, this, 2704, &BF_GLOBALS._player, &_object12, &_object7, &_object8, NULL);
1594 			break;
1595 		default:
1596 			_object11.postInit();
1597 			_object11.setPosition(Common::Point(340, 100));
1598 			BF_GLOBALS._sound1.play(36);
1599 
1600 			_sceneMode = 2709;
1601 			setAction(&_sequenceManager1, this, 2709, &BF_GLOBALS._player, &_object1, &_object12, &_object11, NULL);
1602 			break;
1603 		}
1604 		break;
1605 	case 12:
1606 		BF_GLOBALS._sound1.changeSound(67);
1607 		BF_GLOBALS._sceneManager.changeScene(280);
1608 		break;
1609 	case 13:
1610 		BF_GLOBALS._sound1.fadeOut2(NULL);
1611 		BF_GLOBALS._sceneManager.changeScene(666);
1612 		break;
1613 	case 2702:
1614 		BF_GLOBALS._player._strip = 1;
1615 		BF_GLOBALS._player.enableControl();
1616 		_field2E16 = 1;
1617 		break;
1618 	case 2704:
1619 		BF_GLOBALS._sound1.fadeOut2(NULL);
1620 		BF_GLOBALS._sceneManager.changeScene(690);
1621 		break;
1622 	case 2705:
1623 		_field796 = 1;
1624 		BF_GLOBALS._player.enableControl();
1625 		break;
1626 	case 2706:
1627 		BF_GLOBALS._player.changeZoom(-1);
1628 		BF_GLOBALS._player.enableControl();
1629 
1630 		_object1.remove();
1631 		_field796 = 0;
1632 		ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, _tempPos.x, _tempPos.y);
1633 		break;
1634 	case 2707:
1635 		BF_GLOBALS._player.enableControl();
1636 		_field796 = 1;
1637 		_field2E16 = 1;
1638 
1639 		_object1.remove();
1640 		_object11.remove();
1641 
1642 		BF_INVENTORY.setObjectScene(INV_LYLE_CARD, 1);
1643 		break;
1644 	case 2709:
1645 		BF_GLOBALS._sound1.play(68);
1646 		_sceneMode = 12;
1647 		addFader((const byte *)&black, 2, this);
1648 		break;
1649 	case 2712:
1650 		BF_GLOBALS._sound1.fadeOut2(NULL);
1651 		BF_GLOBALS._sceneManager.changeScene(180);
1652 		break;
1653 	case 2713:
1654 		BF_GLOBALS._player.enableControl();
1655 		break;
1656 	case 2714:
1657 		BF_GLOBALS._sceneManager.changeScene(560);
1658 		break;
1659 	case 2715:
1660 		break;
1661 	case 2716:
1662 		BF_GLOBALS._deathReason = 24;
1663 		_sceneMode = 13;
1664 		addFader((const byte *)&black, 2, this);
1665 		break;
1666 	default:
1667 		break;
1668 	}
1669 }
1670 
process(Event & event)1671 void Scene271::process(Event &event) {
1672 	if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
1673 			(_field796 == 1)  && (!_action)) {
1674 		_tempPos = event.mousePos;
1675 		BF_GLOBALS._player.disableControl();
1676 
1677 		_sceneMode = 2706;
1678 		setAction(&_sequenceManager1, this, 2706, &BF_GLOBALS._player, &_object1, NULL);
1679 		event.handled = true;
1680 	}
1681 
1682 	SceneExt::process(event);
1683 
1684 	if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < UI_INTERFACE_Y)) {
1685 		if (_exit.contains(event.mousePos)) {
1686 			GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_E);
1687 			BF_GLOBALS._events.setCursor(cursor);
1688 		} else {
1689 			CursorType cursorId = BF_GLOBALS._events.getCursor();
1690 			BF_GLOBALS._events.setCursor(cursorId);
1691 		}
1692 	}
1693 }
1694 
dispatch()1695 void Scene271::dispatch() {
1696 	if (!_action && (_field2E16 == 1)) {
1697 		if ((BF_GLOBALS._player._position.x > 236) && (BF_GLOBALS._player._position.y < 120)) {
1698 			_field2E16 = 0;
1699 			BF_GLOBALS._sceneManager.changeScene(560);
1700 		}
1701 
1702 		if (BF_GLOBALS._player._position.x <= 20) {
1703 			_field2E16 = 0;
1704 			BF_GLOBALS._player.disableControl();
1705 			BF_GLOBALS._player._mover->remove();
1706 			BF_GLOBALS._player._strip = 3;
1707 			BF_GLOBALS._player._frame = 1;
1708 
1709 			if (BF_GLOBALS._sceneObjects->contains(&_object12)) {
1710 				_sceneMode = 10;
1711 				_stripManager.start(2711, this);
1712 			} else {
1713 				SceneItem::display2(270, 33);
1714 				_sceneMode = 2702;
1715 				setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL);
1716 			}
1717 		}
1718 
1719 		if (BF_GLOBALS._player._position.x >= 300) {
1720 			_field2E16 = 0;
1721 			BF_GLOBALS._player.disableControl();
1722 			_sceneMode = 2712;
1723 			setAction(&_sequenceManager1, this, 2712, &BF_GLOBALS._player, NULL);
1724 		}
1725 	}
1726 
1727 	SceneExt::dispatch();
1728 }
1729 
1730 /*--------------------------------------------------------------------------
1731  * Scene 280 - Bedroom Flashback cut-scene
1732  *
1733  *--------------------------------------------------------------------------*/
1734 
signal()1735 void Scene280::Action1::signal() {
1736 	Scene280 *scene = (Scene280 *)BF_GLOBALS._sceneManager._scene;
1737 	static uint32 black = 0;
1738 
1739 	switch (_actionIndex++) {
1740 	case 0:
1741 		scene->_jake.postInit();
1742 		scene->_jake.setVisage(283);
1743 		scene->_jake.setPosition(Common::Point(331, 200));
1744 		scene->_jake.animate(ANIM_MODE_1, NULL);
1745 		scene->_jake.setStrip(1);
1746 		ADD_MOVER(scene->_jake, 189, 131);
1747 		break;
1748 	case 1:
1749 		scene->_jake.setStrip(2);
1750 		scene->_jake.setFrame(1);
1751 		scene->_jake.animate(ANIM_MODE_8, 0, NULL);
1752 		scene->_jake._numFrames = 5;
1753 
1754 		scene->_stripManager.start(2800, this);
1755 		break;
1756 	case 2:
1757 		scene->_jake.animate(ANIM_MODE_5, NULL);
1758 		scene->_dad.animate(ANIM_MODE_5, this);
1759 		break;
1760 	case 3:
1761 		scene->_jake.setStrip(4);
1762 		scene->_jake.setFrame(1);
1763 		scene->_dad.setStrip(2);
1764 		scene->_jake.setFrame(1);
1765 		scene->_dad.animate(ANIM_MODE_5, this);
1766 		break;
1767 	case 4:
1768 		scene->_dad.setStrip(3);
1769 		scene->_dad.setFrame(1);
1770 		scene->_dad.animate(ANIM_MODE_5, this);
1771 		break;
1772 	case 5:
1773 		scene->_object4.hide();
1774 		scene->_dad.setVisage(282);
1775 		scene->_dad.setStrip(1);
1776 		scene->_dad.setFrame(1);
1777 		scene->_dad._numFrames = 5;
1778 		scene->_dad.animate(ANIM_MODE_5, this);
1779 		break;
1780 	case 6:
1781 		scene->_stripManager.start(2801, this);
1782 		break;
1783 	case 7:
1784 		scene->_mum.postInit();
1785 		scene->_mum.setVisage(282);
1786 		scene->_mum.setStrip(2);
1787 		scene->_mum.setFrame(1);
1788 		scene->_mum.fixPriority(1);
1789 		scene->_mum.setPosition(Common::Point(160, 138));
1790 
1791 		scene->_jake.setStrip(3);
1792 		scene->_jake.setFrame(1);
1793 		scene->_jake.animate(ANIM_MODE_5, this);
1794 
1795 		scene->_dad._numFrames = 10;
1796 		scene->_dad.setVisage(284);
1797 		scene->_dad.setStrip(1);
1798 		scene->_dad.fixPriority(-1);
1799 		scene->_dad.setPosition(Common::Point(174, 136));
1800 		scene->_dad.setFrame(1);
1801 		scene->_dad.animate(ANIM_MODE_1, NULL);
1802 		ADD_MOVER(scene->_dad, 438, 320);
1803 		break;
1804 	case 8:
1805 		scene->_mum.animate(ANIM_MODE_4, 5, 1, this);
1806 		break;
1807 	case 9:
1808 		scene->_sceneMode = 2;
1809 		BF_GLOBALS._sound1.fadeOut2(NULL);
1810 		scene->addFader((const byte *)&black, 2, scene);
1811 
1812 		scene->_jake.remove();
1813 		scene->_mum.animate(ANIM_MODE_5, NULL);
1814 		break;
1815 	}
1816 }
1817 
1818 /*--------------------------------------------------------------------------*/
1819 
postInit(SceneObjectList * OwnerList)1820 void Scene280::postInit(SceneObjectList *OwnerList) {
1821 	PalettedScene::postInit();
1822 	BF_GLOBALS._interfaceY = SCREEN_HEIGHT;
1823 	loadScene(280);
1824 
1825 	_stripManager.addSpeaker(&_gameTextSpeaker);
1826 
1827 	_dad.postInit();
1828 	_dad.setVisage(281);
1829 	_dad.setPosition(Common::Point(160, 138));
1830 	_dad.fixPriority(1);
1831 
1832 	_object4.postInit();
1833 	_object4.setVisage(280);
1834 	_object4.setPosition(Common::Point(139, 141));
1835 
1836 	const uint32 black = 0;
1837 	add2Faders((const byte *)&black, 2, 280, this);
1838 	_sceneMode = 1;
1839 	setAction(&_action1);
1840 }
1841 
signal()1842 void Scene280::signal() {
1843 	if (_sceneMode == 2)
1844 		BF_GLOBALS._sceneManager.changeScene(271);
1845 }
1846 
1847 } // End of namespace BlueForce
1848 
1849 } // End of namespace TsAGE
1850