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_scenes5.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 550 - Outside Bikini Hut
34  *
35  *--------------------------------------------------------------------------*/
36 
signal()37 void Scene550::Action1::signal() {
38 	Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene;
39 
40 	switch (_actionIndex++) {
41 	case 0:
42 		BF_GLOBALS._player.disableControl();
43 		setDelay(5);
44 		break;
45 	case 1:
46 		scene->_stripManager.start(scene->_sceneMode, this);
47 		break;
48 	case 2:
49 		BF_GLOBALS._player.enableControl();
50 		remove();
51 		break;
52 	default:
53 		break;
54 	}
55 }
56 
57 /*--------------------------------------------------------------------------*/
58 
startAction(CursorType action,Event & event)59 bool Scene550::Lyle::startAction(CursorType action, Event &event) {
60 	Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene;
61 
62 	switch (action) {
63 	case CURSOR_TALK:
64 		if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) ||
65 				(BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) {
66 			if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) &&
67 					(BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) {
68 				BF_GLOBALS.setFlag(fToldLyleOfSchedule);
69 				BF_GLOBALS._player.disableControl();
70 				scene->_sceneMode = 5501;
71 				scene->setAction(&scene->_sequenceManager, scene, 5514, &BF_GLOBALS._player, this, NULL);
72 			} else {
73 				scene->_sceneMode = 0;
74 				scene->_stripManager.start(5509, scene);
75 			}
76 		} else if (BF_GLOBALS._sceneManager._previousScene == 930) {
77 			scene->_sceneMode = 5512;
78 			scene->setAction(&scene->_action1);
79 		} else {
80 			scene->_sceneMode = BF_INVENTORY.getObjectScene(INV_CARAVAN_KEY) == 1 ? 5513 : 5512;
81 			scene->setAction(&scene->_action1);
82 		}
83 		return true;
84 	case INV_SCHEDULE:
85 		BF_GLOBALS.setFlag(fToldLyleOfSchedule);
86 		BF_GLOBALS._player.disableControl();
87 		scene->_sceneMode = 5501;
88 		scene->setAction(&scene->_sequenceManager, scene, 5514, &BF_GLOBALS._player, this, NULL);
89 		return true;
90 	default:
91 		return NamedObject::startAction(action, event);
92 	}
93 }
94 
startAction(CursorType action,Event & event)95 bool Scene550::CaravanDoor::startAction(CursorType action, Event &event) {
96 	Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene;
97 
98 	switch (action) {
99 	case CURSOR_LOOK:
100 		SceneItem::display2(550, 0);
101 		return true;
102 	case CURSOR_USE:
103 		SceneItem::display2(550, 7);
104 		return true;
105 	case INV_CARAVAN_KEY:
106 		if ((BF_GLOBALS._dayNumber != 3) || !BF_GLOBALS.getFlag(fWithLyle))
107 			SceneItem::display2(550, 33);
108 		else {
109 			BF_GLOBALS._player.disableControl();
110 			scene->_sceneMode = 5500;
111 			scene->setAction(&scene->_sequenceManager, scene, 5500, &BF_GLOBALS._player, this, NULL);
112 		}
113 		return true;
114 	default:
115 		return NamedObject::startAction(action, event);
116 	}
117 }
118 
startAction(CursorType action,Event & event)119 bool Scene550::Vechile::startAction(CursorType action, Event &event) {
120 	Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene;
121 
122 	switch (action) {
123 	case CURSOR_LOOK:
124 		SceneItem::display2(550, 3);
125 		return true;
126 	case CURSOR_USE:
127 		if (!BF_GLOBALS.getFlag(fWithLyle)) {
128 			BF_GLOBALS._player.disableControl();
129 			scene->_sceneMode = 5510;
130 			scene->setAction(&scene->_sequenceManager, scene, BF_GLOBALS.getFlag(fWithLyle) ? 5510 : 5515,
131 				&BF_GLOBALS._player, this, NULL);
132 		} else if (BF_GLOBALS.getFlag(fToldLyleOfSchedule)) {
133 			BF_GLOBALS._player.disableControl();
134 			scene->_sceneMode = 2;
135 			scene->setAction(&scene->_sequenceManager, scene, 5501, &BF_GLOBALS._player, NULL);
136 		} else if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) ||
137 					(BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) {
138 			if (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1) {
139 				scene->_sceneMode = 5501;
140 				scene->_stripManager.start(5511, scene);
141 			} else {
142 				scene->_sceneMode = 0;
143 				scene->_stripManager.start(5509, scene);
144 			}
145 		} else if (BF_GLOBALS._sceneManager._previousScene == 930) {
146 			scene->_sceneMode = 5512;
147 			scene->setAction(&scene->_action1);
148 		} else {
149 			BF_GLOBALS._player.disableControl();
150 			scene->_sceneMode = 2;
151 			scene->setAction(&scene->_sequenceManager, scene, 5501, &BF_GLOBALS._player, NULL);
152 		}
153 		return true;
154 	default:
155 		return NamedObject::startAction(action, event);
156 	}
157 }
158 
159 /*--------------------------------------------------------------------------*/
160 
postInit(SceneObjectList * OwnerList)161 void Scene550::postInit(SceneObjectList *OwnerList) {
162 	BF_GLOBALS._sound1.fadeSound(16);
163 
164 	if ((BF_GLOBALS._bookmark == bInspectionDone) && !BF_GLOBALS.getFlag(fHasDrivenFromDrunk)) {
165 		_sceneMode = 1;
166 		signal();
167 		return;
168 	}
169 
170 	SceneExt::postInit();
171 	loadScene(550);
172 
173 	_stripManager.addSpeaker(&_gameTextSpeaker);
174 	_stripManager.addSpeaker(&_lyleHatSpeaker);
175 	_stripManager.addSpeaker(&_jakeJacketSpeaker);
176 
177 	BF_GLOBALS._player.postInit();
178 	BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
179 	BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
180 	BF_GLOBALS._player.setPosition(Common::Point(160, 100));
181 	BF_GLOBALS._player._moveDiff = Common::Point(2, 1);
182 	BF_GLOBALS._player.enableControl();
183 
184 	_caravanDoor.postInit();
185 	_caravanDoor.setVisage(550);
186 	_caravanDoor.setPosition(Common::Point(34, 66));
187 	BF_GLOBALS._sceneItems.push_back(&_caravanDoor);
188 
189 	_vechile.postInit();
190 	_vechile.fixPriority(70);
191 
192 	if (BF_GLOBALS.getFlag(fWithLyle)) {
193 		BF_GLOBALS._walkRegions.disableRegion(10);
194 		BF_GLOBALS._walkRegions.disableRegion(11);
195 
196 		_vechile.setVisage(444);
197 		_vechile.setStrip(4);
198 		_vechile.setFrame2(2);
199 		_vechile.setPosition(Common::Point(110, 85));
200 		_vechile.fixPriority(76);
201 
202 		_lyle.postInit();
203 		_lyle.setVisage(835);
204 		_lyle.setPosition(Common::Point(139, 83));
205 		_lyle.setDetails(550, 29, 30, 31, 1, (SceneItem *)NULL);
206 		_lyle.setStrip(8);
207 
208 		BF_GLOBALS._player.setVisage(303);
209 		BF_GLOBALS._player.setPosition(Common::Point(89, 76));
210 		BF_GLOBALS._player.updateAngle(_lyle._position);
211 	} else {
212 		BF_GLOBALS._walkRegions.disableRegion(12);
213 
214 		_vechile.setPosition(Common::Point(205, 77));
215 		_vechile.changeZoom(80);
216 
217 		if (BF_GLOBALS.getFlag(onDuty)) {
218 			_vechile.setVisage(301);
219 			_vechile.setStrip(1);
220 
221 			BF_GLOBALS._player.setVisage(304);
222 		} else {
223 			_vechile.setVisage(580);
224 			_vechile.setStrip(2);
225 			_vechile.setFrame(2);
226 
227 			BF_GLOBALS._player.setVisage(303);
228 		}
229 	}
230 
231 	BF_GLOBALS._sceneItems.push_back(&_vechile);
232 
233 	if (BF_GLOBALS._sceneManager._previousScene == 930) {
234 		_caravanDoor.setFrame(_caravanDoor.getFrameCount());
235 		BF_GLOBALS._player.disableControl();
236 
237 		_sceneMode = 0;
238 		setAction(&_sequenceManager, this, 5512, &BF_GLOBALS._player, &_caravanDoor, NULL);
239 	} else if (BF_GLOBALS.getFlag(onDuty)) {
240 		BF_GLOBALS._player.disableControl();
241 		_sceneMode = 0;
242 		setAction(&_sequenceManager, this, 5502, &BF_GLOBALS._player, &_vechile, NULL);
243 	} else if (!BF_GLOBALS.getFlag(fWithLyle)) {
244 		BF_GLOBALS._player.setPosition(Common::Point(185, 70));
245 	} else if (BF_GLOBALS._bookmark == bFlashBackOne) {
246 		BF_GLOBALS._player.disableControl();
247 		_sceneMode = 0;
248 		setAction(&_sequenceManager, this, 5513, &_lyle, NULL);
249 	} else {
250 		_sceneMode = 0;
251 	}
252 
253 	_item2.setDetails(Rect(0, 26, 53, 67), 550, 1, -1, 2, 1, NULL);
254 	_item3.setDetails(Rect(53, 12, 173, 65), 550, 4, -1, 5, 1, NULL);
255 	_item1.setDetails(Rect(0, 0, 320, 170), 550, 6, -1, -1, 1, NULL);
256 }
257 
signal()258 void Scene550::signal() {
259 	switch (_sceneMode) {
260 	case 0:
261 		BF_GLOBALS._player.enableControl();
262 		break;
263 	case 1:
264 		BF_GLOBALS._sceneManager.changeScene(551);
265 		break;
266 	case 2:
267 	case 5510:
268 		BF_GLOBALS._sceneManager.changeScene(60);
269 		break;
270 	case 3:
271 		BF_GLOBALS._driveFromScene = 16;
272 		BF_GLOBALS._driveToScene = 128;
273 		BF_GLOBALS._mapLocationId = 128;
274 		BF_GLOBALS._sound1.fadeOut2(NULL);
275 		BF_GLOBALS._sceneManager.changeScene(800);
276 		break;
277 	case 5500:
278 		BF_GLOBALS._sceneManager.changeScene(930);
279 		break;
280 	case 5501:
281 		BF_GLOBALS._player.disableControl();
282 		_sceneMode = 3;
283 		setAction(&_sequenceManager, this, 5501, &BF_GLOBALS._player, NULL);
284 		break;
285 	default:
286 		break;
287 	}
288 }
289 
290 /*--------------------------------------------------------------------------
291  * Scene 551 - Outside Bikini Hut (Drunk Stop)
292  *
293  *--------------------------------------------------------------------------*/
294 
signal()295 void Scene551::Action2::signal() {
296 	Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
297 
298 	switch (_actionIndex++) {
299 	case 0:
300 		BF_GLOBALS._walkRegions.enableRegion(18);
301 		BF_GLOBALS._walkRegions.enableRegion(4);
302 		scene->_field1CD2 = 1;
303 
304 		scene->_harrison.setObjectWrapper(new SceneObjectWrapper());
305 		scene->_harrison.animate(ANIM_MODE_1, NULL);
306 
307 		BF_GLOBALS._player.setVisage(304);
308 		BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
309 
310 		if (scene->_drunkStanding._flag != 1) {
311 			ADD_PLAYER_MOVER_THIS(scene->_harrison, 126, 85);
312 		} else {
313 			ADD_PLAYER_MOVER_THIS(scene->_harrison, 88, 91);
314 		}
315 		break;
316 	case 1:
317 		scene->_harrison.updateAngle(BF_GLOBALS._player._position);
318 
319 		if (scene->_drunkStanding._flag == 1) {
320 			BF_GLOBALS._walkRegions.disableRegion(4);
321 			ADD_PLAYER_MOVER(71, 97);
322 		} else {
323 			ADD_PLAYER_MOVER(141, 87);
324 		}
325 		break;
326 	case 2:
327 		scene->_harrison.updateAngle(BF_GLOBALS._player._position);
328 		BF_GLOBALS._player.updateAngle(scene->_harrison._position);
329 		setDelay(10);
330 		break;
331 	case 3:
332 		scene->_stripManager.start(scene->_harrison._flag, this);
333 		break;
334 	case 4:
335 		scene->_field1CD2 = 0;
336 		BF_GLOBALS._player.enableControl();
337 		remove();
338 		break;
339 	default:
340 		break;
341 	}
342 }
343 
344 /*--------------------------------------------------------------------------*/
345 
startAction(CursorType action,Event & event)346 bool Scene551::Vechile::startAction(CursorType action, Event &event) {
347 	Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
348 
349 	switch (action) {
350 	case CURSOR_LOOK:
351 		SceneItem::display2(550, 3);
352 		return true;
353 	case CURSOR_USE:
354 		if (!BF_GLOBALS.getFlag(didDrunk)) {
355 			BF_GLOBALS._player.disableControl();
356 			scene->_sceneMode = 1;
357 			scene->setAction(&scene->_sequenceManager, scene, 5510, &BF_GLOBALS._player, this, NULL);
358 		} else if (BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) == 1) {
359 			BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 0);
360 			scene->_harrison._flag = 5505;
361 			scene->setAction(&scene->_action2, scene);
362 			scene->_sceneMode = 5509;
363 		} else {
364 			BF_GLOBALS._player.disableControl();
365 			scene->_sceneMode = 1;
366 			scene->setAction(&scene->_sequenceManager, scene, 5510, &BF_GLOBALS._player, this, NULL);
367 		}
368 		return true;
369 	default:
370 		return NamedObject::startAction(action, event);
371 	}
372 }
373 
startAction(CursorType action,Event & event)374 bool Scene551::DrunkStanding::startAction(CursorType action, Event &event) {
375 	Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
376 
377 	switch (action) {
378 	case CURSOR_LOOK:
379 		SceneItem::display2(550, 15);
380 		return true;
381 	case CURSOR_USE:
382 		SceneItem::display2(550, 16);
383 		return true;
384 	case CURSOR_TALK:
385 		SceneItem::display2(550, 17);
386 		return true;
387 	case INV_HANDCUFFS:
388 		scene->_harrison.animate(ANIM_MODE_1, NULL);
389 		BF_GLOBALS.set2Flags(f1098Drunk);
390 		BF_GLOBALS.setFlag(didDrunk);
391 		_flag = 2;
392 		BF_GLOBALS._player.disableControl();
393 		scene->_sceneMode = 5509;
394 
395 		scene->setAction(&scene->_sequenceManager, scene, 5509, &BF_GLOBALS._player, this, &scene->_harrison, NULL);
396 		BF_GLOBALS.set2Flags(f1015Drunk);
397 		return true;
398 	default:
399 		return NamedObjectExt::startAction(action, event);
400 	}
401 }
402 
startAction(CursorType action,Event & event)403 bool Scene551::Drunk::startAction(CursorType action, Event &event) {
404 	Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
405 
406 	switch (action) {
407 	case CURSOR_LOOK:
408 		switch (_flag) {
409 		case 0:
410 			BF_GLOBALS._player.disableControl();
411 			scene->_sceneMode = 0;
412 			scene->setAction(&scene->_sequenceManager, scene, 5505, &BF_GLOBALS._player, &scene->_object15, NULL);
413 			break;
414 		case 1:
415 			SceneItem::display2(550, 11);
416 			break;
417 		case 2:
418 			SceneItem::display2(550, 12);
419 			break;
420 		case 3:
421 			SceneItem::display2(550, 27);
422 			break;
423 		default:
424 			break;
425 		}
426 		return true;
427 	case CURSOR_USE:
428 		switch (_flag) {
429 		case 0:
430 			BF_GLOBALS._player.disableControl();
431 			if (BF_GLOBALS.getFlag(fTalkedToDrunkInCar)) {
432 				scene->_sceneMode = 5508;
433 				scene->setAction(&scene->_sequenceManager, scene, 5508, &BF_GLOBALS._player, NULL);
434 			} else {
435 				BF_GLOBALS.setFlag(fTalkedToDrunkInCar);
436 				scene->_sceneMode = 16;
437 				scene->setAction(&scene->_sequenceManager, scene, 5504, &BF_GLOBALS._player, &scene->_object15, NULL);
438 			}
439 			break;
440 		case 2:
441 			SceneItem::display2(550, 13);
442 			break;
443 		case 3:
444 			SceneItem::display2(550, 27);
445 			break;
446 		default:
447 			break;
448 		}
449 		return true;
450 	case CURSOR_TALK:
451 		if (_flag)
452 			break;
453 		BF_GLOBALS._player.disableControl();
454 
455 		if (BF_GLOBALS.getFlag(fTalkedToDrunkInCar)) {
456 			scene->_sceneMode = 5508;
457 			scene->setAction(&scene->_sequenceManager, scene, 5508, &BF_GLOBALS._player, NULL);
458 		} else {
459 			BF_GLOBALS.setFlag(fTalkedToDrunkInCar);
460 			scene->_sceneMode = 0;
461 			scene->setAction(&scene->_sequenceManager, scene, 5504, &BF_GLOBALS._player, &scene->_object15, NULL);
462 		}
463 		return true;
464 	case INV_CENTER_PUNCH:
465 		if (_flag) {
466 			SceneItem::display2(550, 14);
467 		} else {
468 			BF_GLOBALS.set2Flags(f1098Drunk);
469 			BF_GLOBALS.setFlag(didDrunk);
470 			_flag = 1;
471 			T2_GLOBALS._uiElements.addScore(30);
472 
473 			BF_GLOBALS._player.disableControl();
474 			scene->_sceneMode = 5506;
475 			scene->setAction(&scene->_sequenceManager, scene, 5506, &BF_GLOBALS._player, this,
476 				&scene->_object12, NULL);
477 		}
478 		return true;
479 	default:
480 		break;
481 	}
482 
483 	return NamedObjectExt::startAction(action, event);
484 }
485 
startAction(CursorType action,Event & event)486 bool Scene551::PatrolCarTrunk::startAction(CursorType action, Event &event) {
487 	Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
488 
489 	switch (action) {
490 	case CURSOR_USE:
491 		if (BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) != 1) {
492 			BF_GLOBALS._walkRegions.enableRegion(18);
493 			BF_GLOBALS._player.disableControl();
494 			scene->_sceneMode = 2;
495 			scene->setAction(&scene->_sequenceManager, scene, 5503, &BF_GLOBALS._player, &scene->_harrison, this, NULL);
496 			return true;
497 		}
498 		break;
499 	default:
500 		break;
501 	}
502 
503 	return NamedObject::startAction(action, event);
504 }
505 
remove()506 void Scene551::TrunkInset::remove() {
507 	Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
508 	scene->_trunkKits.remove();
509 	BF_GLOBALS._player.disableControl();
510 
511 	scene->_sceneMode = 0;
512 	scene->setAction(&scene->_sequenceManager, scene, 5516, &scene->_harrison,
513 		&scene->_patrolCarTrunk, NULL);
514 
515 	FocusObject::remove();
516 }
517 
startAction(CursorType action,Event & event)518 bool Scene551::TrunkInset::startAction(CursorType action, Event &event) {
519 	switch (action) {
520 	case CURSOR_LOOK:
521 		SceneItem::display2(550, 18);
522 		return true;
523 	case CURSOR_USE:
524 		return true;
525 	default:
526 		return NamedObject::startAction(action, event);
527 	}
528 }
529 
startAction(CursorType action,Event & event)530 bool Scene551::TrunkKits::startAction(CursorType action, Event &event) {
531 	Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
532 
533 	Rect tempRect = _bounds;
534 	tempRect.collapse(10, 6);
535 	if (!tempRect.contains(event.mousePos))
536 		return false;
537 
538 	switch (action) {
539 	case CURSOR_LOOK:
540 		switch (_frame) {
541 		case 1:
542 			SceneItem::display2(550, 19);
543 			break;
544 		case 2:
545 			SceneItem::display2(550, 20);
546 			break;
547 		case 3:
548 			SceneItem::display2(550, 21);
549 			break;
550 		default:
551 			break;
552 		}
553 		return true;
554 	case CURSOR_USE:
555 		if (event.mousePos.y < _bounds.top) {
556 			setFrame(1);
557 		} else if ((event.mousePos.x < (_bounds.left - 25)) && (_frame > 1)) {
558 			SceneItem::display2(550, 28);
559 		} else {
560 			switch (_frame) {
561 			case 1:
562 				setFrame(BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) == 1 ? 3 : 2);
563 				break;
564 			case 2:
565 				if (!BF_GLOBALS.getFlag(fShowedBluePrint)) {
566 					T2_GLOBALS._uiElements.addScore(30);
567 					BF_GLOBALS.setFlag(fShowedBluePrint);
568 				}
569 
570 				BF_GLOBALS._player.disableControl();
571 				scene->_sceneMode = 5520;
572 				scene->setAction(&scene->_sequenceManager, scene, 5520, &BF_GLOBALS._player, NULL);
573 				BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 1);
574 				setFrame(3);
575 				break;
576 			case 3:
577 				setFrame(1);
578 				break;
579 			default:
580 				break;
581 			}
582 		}
583 		return true;
584 	case INV_CENTER_PUNCH:
585 		SceneItem::display2(550, 22);
586 		BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 0);
587 		setFrame(2);
588 		return true;
589 	default:
590 		return NamedObject::startAction(action, event);
591 	}
592 }
593 
startAction(CursorType action,Event & event)594 bool Scene551::Harrison::startAction(CursorType action, Event &event) {
595 	Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
596 
597 	switch (action) {
598 	case CURSOR_LOOK:
599 		SceneItem::display2(550, 23);
600 		return true;
601 	case CURSOR_USE:
602 		SceneItem::display2(550, 24);
603 		return true;
604 	case CURSOR_TALK:
605 		BF_GLOBALS._player.disableControl();
606 
607 		if (scene->_drunkStanding._flag == 1) {
608 			_flag = 5508;
609 		} else if (!scene->_field1CD0) {
610 			_flag = 5502;
611 		} else {
612 			scene->_field1CD0 = 1;
613 			_flag = 5500;
614 		}
615 		scene->setAction(&scene->_action2);
616 		return true;
617 	default:
618 		return NamedObjectExt::startAction(action, event);
619 	}
620 }
621 
622 /*--------------------------------------------------------------------------*/
623 
startAction(CursorType action,Event & event)624 bool Scene551::Item4::startAction(CursorType action, Event &event) {
625 	Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene;
626 
627 	switch (action) {
628 	case CURSOR_LOOK:
629 		SceneItem::display2(550, 34);
630 		BF_GLOBALS._player.disableControl();
631 		scene->_sceneMode = 1;
632 		scene->setAction(&scene->_sequenceManager, scene, 5510, &BF_GLOBALS._player, &scene->_vechile2, NULL);
633 		return true;
634 	default:
635 		return false;
636 	}
637 }
638 
639 /*--------------------------------------------------------------------------*/
640 
Scene551()641 Scene551::Scene551(): Scene550() {
642 	_field1CD0 = _field1CD2 = 0;
643 }
644 
synchronize(Serializer & s)645 void Scene551::synchronize(Serializer &s) {
646 	Scene550::synchronize(s);
647 	s.syncAsSint16LE(_field1CD0);
648 	s.syncAsSint16LE(_field1CD2);
649 }
650 
postInit(SceneObjectList * OwnerList)651 void Scene551::postInit(SceneObjectList *OwnerList) {
652 	SceneExt::postInit();
653 	loadScene(550);
654 	BF_GLOBALS._walkRegions.load(551);
655 	BF_GLOBALS._sound1.fadeSound(16);
656 
657 	_stripManager.addSpeaker(&_gameTextSpeaker);
658 	_stripManager.addSpeaker(&_jakeUniformSpeaker);
659 	_stripManager.addSpeaker(&_gigglesSpeaker);
660 	_stripManager.addSpeaker(&_drunkSpeaker);
661 
662 	if (BF_GLOBALS.getFlag(fHasLeftDrunk)) {
663 		_item4.setBounds(Rect(0, 0, 320, 170));
664 		BF_GLOBALS._sceneItems.push_back(&_item4);
665 	}
666 
667 	BF_GLOBALS._player.postInit();
668 	BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
669 	BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
670 	BF_GLOBALS._player.setPosition(Common::Point(160, 100));
671 	BF_GLOBALS._player._moveDiff = Common::Point(2, 1);
672 	BF_GLOBALS._player.enableControl();
673 
674 	_caravanDoor.postInit();
675 	_caravanDoor.setVisage(550);
676 	_caravanDoor.setPosition(Common::Point(34, 66));
677 	BF_GLOBALS._sceneItems.push_back(&_caravanDoor);
678 
679 	_vechile2.postInit();
680 	_vechile2.setVisage(301);
681 	_vechile2.setStrip(1);
682 	_vechile2.setPosition(Common::Point(205, 77));
683 	_vechile2.fixPriority(70);
684 	_vechile2.changeZoom(80);
685 	BF_GLOBALS._sceneItems.push_back(&_vechile2);
686 
687 	BF_GLOBALS._walkRegions.disableRegion(14);
688 
689 	_drunk.postInit();
690 	_drunk.setVisage(550);
691 	_drunk.setStrip(3);
692 	_drunk.fixPriority(84);
693 	_drunk.setPosition(Common::Point(29, 92));
694 	_drunk._flag = 0;
695 	BF_GLOBALS._sceneItems.push_back(&_drunk);
696 
697 	_object12.postInit();
698 	_object12.setVisage(550);
699 	_object12.setStrip(7);
700 	_object12.setPosition(Common::Point(29, 92));
701 	_object12.hide();
702 
703 	_object13.postInit();
704 	_object13.setVisage(550);
705 	_object13.setStrip(2);
706 	_object13.setPosition(Common::Point(29, 92));
707 	_object13.fixPriority(82);
708 	_object13.setDetails(550, 8, -1, 9, 1, (SceneItem *)NULL);
709 
710 	if (BF_GLOBALS.getFlag(didDrunk)) {
711 		_drunk._flag = 3;
712 		_drunk.setStrip(3);
713 
714 		_object12.show();
715 		_object12.setDetails(550, 25, -1, 26, 1, (SceneItem *)NULL);
716 		BF_GLOBALS._sceneItems.push_front(&_object12);
717 
718 		_harrison.postInit();
719 		_harrison.setVisage(304);
720 		_harrison.setPosition(Common::Point(67, 102));
721 		_harrison.setStrip(8);
722 		_harrison.setFrame(1);
723 		_harrison._flag = 1;
724 		BF_GLOBALS._sceneItems.push_back(&_harrison);
725 
726 		_object14.postInit();
727 		_object14.setVisage(550);
728 		_object14.setStrip(5);
729 		_object14.animate(ANIM_MODE_2, NULL);
730 		_object14.fixPriority(80);
731 		_object14.setPosition(Common::Point(122, 57));
732 
733 		_object11.postInit();
734 		_object11.setVisage(550);
735 		_object11.setStrip(2);
736 		_object11.setFrame(2);
737 		_object11.setPosition(Common::Point(116, 84));
738 		_object11.fixPriority(77);
739 		_object11.setDetails(550, 32, -1, 10, 1, (SceneItem *)NULL);
740 
741 		_drunkStanding.postInit();
742 		_drunkStanding._flag = 0;
743 		_drunkStanding.setVisage(554);
744 		_drunkStanding.setStrip(7);
745 		_drunkStanding.setFrame(8);
746 		_drunkStanding.fixPriority(83);
747 		_drunkStanding.setPosition(Common::Point(57, 99));
748 	} else {
749 		_harrison.postInit();
750 		_harrison.setVisage(304);
751 		_harrison.setPosition(Common::Point(126, 83));
752 		_harrison.setObjectWrapper(new SceneObjectWrapper());
753 		_harrison._flag = 0;
754 		_harrison._moveDiff = Common::Point(2, 1);
755 		BF_GLOBALS._sceneItems.push_back(&_harrison);
756 
757 		_object14.postInit();
758 		_object14.setVisage(550);
759 		_object14.setStrip(5);
760 		_object14.animate(ANIM_MODE_2, NULL);
761 		_object14.fixPriority(80);
762 		_object14.setPosition(Common::Point(122, 57));
763 
764 		_patrolCarTrunk.postInit();
765 		_patrolCarTrunk.setVisage(550);
766 		_patrolCarTrunk.setStrip(4);
767 		_patrolCarTrunk.setFrame(1);
768 		_patrolCarTrunk.setPosition(Common::Point(149, 69));
769 		_patrolCarTrunk.fixPriority(79);
770 		_patrolCarTrunk.setDetails(550, 18, -1, 9, 1, (SceneItem *)NULL);
771 
772 		_object11.postInit();
773 		_object11.setVisage(550);
774 		_object11.setStrip(2);
775 		_object11.setFrame(2);
776 		_object11.setPosition(Common::Point(116, 84));
777 		_object11.fixPriority(77);
778 		_object11.setDetails(550, 32, -1, 10, 1, (SceneItem *)NULL);
779 
780 		_drunkStanding.postInit();
781 		_drunkStanding._flag = 0;
782 		_drunkStanding.setVisage(554);
783 		_drunkStanding.fixPriority(83);
784 		_drunkStanding.setPosition(Common::Point(47, 93));
785 
786 		_object15.postInit();
787 		_object15.setVisage(552);
788 		_object15.setPosition(Common::Point(59, 94));
789 		_object15.fixPriority(200);
790 		_object15.hide();
791 	}
792 
793 	BF_GLOBALS._player.disableControl();
794 	_sceneMode = 3;
795 	setAction(&_sequenceManager, this, 5502, &BF_GLOBALS._player, &_vechile2, NULL);
796 
797 	_item2.setDetails(Rect(0, 26, 53, 67), 550, 1, -1, 2, 1, NULL);
798 	_item3.setDetails(Rect(53, 12, 173, 65), 550, 4, -1, 5, 1, NULL);
799 	_item1.setDetails(Rect(0, 0, 320, 170), 550, 6, -1, -1, 1, NULL);
800 }
801 
signal()802 void Scene551::signal() {
803 	switch (_sceneMode) {
804 	case 0:
805 		BF_GLOBALS._player.enableControl();
806 		break;
807 	case 1:
808 		BF_GLOBALS._sound1.fadeOut2(NULL);
809 		BF_GLOBALS.set2Flags(f1027Drunk);
810 		BF_GLOBALS.set2Flags(f1097Drunk);
811 
812 		if (BF_GLOBALS.getFlag(didDrunk))
813 			BF_GLOBALS.setFlag(f1098Drunk);
814 
815 		BF_GLOBALS._sceneManager.changeScene(60);
816 		break;
817 	case 2:
818 		BF_GLOBALS._walkRegions.disableRegion(18);
819 
820 		_trunkInset.postInit();
821 		_trunkInset.setVisage(553);
822 		_trunkInset.setPosition(Common::Point(59, 92));
823 		_trunkInset.fixPriority(252);
824 		BF_GLOBALS._sceneItems.push_front(&_trunkInset);
825 
826 		_trunkKits.postInit();
827 		_trunkKits.setVisage(553);
828 		_trunkKits.setStrip(2);
829 		_trunkKits.setPosition(Common::Point(57, 73));
830 		_trunkKits.fixPriority(254);
831 		BF_GLOBALS._sceneItems.push_front(&_trunkKits);
832 		BF_GLOBALS._player.enableControl();
833 		break;
834 	case 3:
835 		if (BF_GLOBALS.getFlag(talkedToHarrisAboutDrunk)) {
836 			BF_GLOBALS._player.enableControl();
837 		} else {
838 			BF_GLOBALS.setFlag(talkedToHarrisAboutDrunk);
839 			_harrison._flag = 5500;
840 			setAction(&_action2);
841 		}
842 		break;
843 	case 5506:
844 		_harrison.setObjectWrapper(new SceneObjectWrapper());
845 		ADD_PLAYER_MOVER_NULL(_harrison, 88, 91);
846 
847 		_object12.show();
848 		_object12.setDetails(550, 25, -1, 26, 1, (SceneItem *)NULL);
849 		BF_GLOBALS._sceneItems.push_front(&_object12);
850 		BF_GLOBALS._player.enableControl();
851 
852 		_sceneMode = 5507;
853 		setAction(&_sequenceManager, this, 5507, &BF_GLOBALS._player, &_drunk, &_drunkStanding, NULL);
854 		break;
855 	case 5507:
856 		BF_GLOBALS._walkRegions.disableRegion(2);
857 		BF_GLOBALS._walkRegions.disableRegion(4);
858 
859 		_drunkStanding._flag = 1;
860 		BF_GLOBALS._sceneItems.push_front(&_drunkStanding);
861 		BF_GLOBALS._player.enableControl();
862 		break;
863 	case 5508:
864 		BF_GLOBALS._player.disableControl();
865 		_sceneMode = 0;
866 		setAction(&_sequenceManager, this, 5505, &BF_GLOBALS._player, &_object15, NULL);
867 		break;
868 	case 5509:
869 		BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 0);
870 		BF_GLOBALS._player.disableControl();
871 		_sceneMode = 5510;
872 		setAction(&_sequenceManager, this, 5510, &BF_GLOBALS._player, &_vechile2, NULL);
873 		break;
874 	case 5510:
875 		BF_GLOBALS._bookmark = bCalledToDrunkStop;
876 		if (BF_GLOBALS.getFlag(didDrunk))
877 			BF_GLOBALS.setFlag(fHasLeftDrunk);
878 
879 		BF_GLOBALS._sceneManager.changeScene(60);
880 		break;
881 	case 5520:
882 		BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
883 		_harrison.animate(ANIM_MODE_1, NULL);
884 		BF_GLOBALS._player.enableControl();
885 		break;
886 	default:
887 		BF_GLOBALS._player.enableControl();
888 		break;
889 	}
890 }
891 
dispatch()892 void Scene551::dispatch() {
893 	SceneExt::dispatch();
894 
895 	if ((_drunkStanding._flag != 2) && !_harrison._mover && !_field1CD2)
896 		_harrison.updateAngle(BF_GLOBALS._player._position);
897 }
898 
899 /*--------------------------------------------------------------------------
900  * Scene 550 - Study
901  *
902  *--------------------------------------------------------------------------*/
903 
signal()904 void Scene560::Action1::signal() {
905 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
906 
907 	switch (_actionIndex++) {
908 	case 0:
909 		setDelay(10);
910 		break;
911 	case 1:
912 		 ADD_MOVER(BF_GLOBALS._player, 105, 140);
913 		 break;
914 	case 2:
915 		scene->_deskChair.hide();
916 
917 		BF_GLOBALS._player.changeZoom(81);
918 		BF_GLOBALS._player.setVisage(561);
919 		BF_GLOBALS._player.setStrip(2);
920 		BF_GLOBALS._player.setFrame(1);
921 		BF_GLOBALS._player.setPosition(Common::Point(96, 138));
922 		BF_GLOBALS._player.animate(ANIM_MODE_5, this);
923 		break;
924 	case 3:
925 		scene->_deskChair.setVisage(561);
926 		scene->_deskChair.setFrame(BF_GLOBALS._player._frame);
927 		scene->_deskChair.setStrip(BF_GLOBALS._player._strip);
928 		scene->_deskChair.setPosition(BF_GLOBALS._player._position);
929 
930 		scene->_field380 = true;
931 		BF_GLOBALS._player.enableControl();
932 		remove();
933 		break;
934 	default:
935 		break;
936 	}
937 }
938 
signal()939 void Scene560::Action2::signal() {
940 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
941 
942 	switch (_actionIndex++) {
943 	case 0:
944 		BF_GLOBALS._player.disableControl();
945 		setDelay(10);
946 		break;
947 	case 1:
948 		scene->_deskChair.hide();
949 
950 		BF_GLOBALS._player.setVisage(561);
951 		BF_GLOBALS._player.setStrip(2);
952 		BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount());
953 		BF_GLOBALS._player.animate(ANIM_MODE_6, this);
954 		break;
955 	case 2:
956 		scene->_field380 = false;
957 		scene->_deskChair.setPosition(Common::Point(81, 149));
958 		scene->_deskChair.setVisage(561);
959 		scene->_deskChair.setStrip(3);
960 		scene->_deskChair.setFrame(1);
961 		scene->_deskChair.fixPriority(151);
962 		scene->_deskChair.show();
963 
964 		BF_GLOBALS._player.setVisage(563);
965 		BF_GLOBALS._player.setPosition(Common::Point(105, 140));
966 		BF_GLOBALS._player.fixPriority(-1);
967 		BF_GLOBALS._player.changeZoom(-1);
968 		BF_GLOBALS._player.animate(ANIM_MODE_1, this);
969 		BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
970 		BF_GLOBALS._player.enableControl();
971 		ADD_PLAYER_MOVER(scene->_destPosition.x, scene->_destPosition.y);
972 		remove();
973 		break;
974 	default:
975 		break;
976 	}
977 }
978 
signal()979 void Scene560::Action3::signal() {
980 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
981 
982 	switch (_actionIndex++) {
983 	case 0:
984 		BF_GLOBALS._player.disableControl();
985 		setDelay(10);
986 		break;
987 	case 1:
988 		if (scene->_field380) {
989 			setDelay(10);
990 		} else {
991 			setAction(&scene->_action1, this);
992 		}
993 		break;
994 	case 2:
995 		BF_GLOBALS._sceneManager.changeScene(570);
996 		break;
997 	default:
998 		break;
999 	}
1000 }
1001 
1002 /*--------------------------------------------------------------------------*/
1003 
startAction(CursorType action,Event & event)1004 bool Scene560::PicturePart::startAction(CursorType action, Event &event) {
1005 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
1006 
1007 	switch (action) {
1008 	case CURSOR_LOOK:
1009 		if (scene->_field380) {
1010 			SceneItem::display2(560, 54);
1011 		} else if ((scene->_sceneMode != 4) && (scene->_sceneMode != 3)) {
1012 			scene->_sceneMode = _flag + 4;
1013 			PlayerMover *mover = new PlayerMover();
1014 			Common::Point destPos(139, 106);
1015 			BF_GLOBALS._player.addMover(mover, &destPos, scene);
1016 		}
1017 		return true;
1018 	default:
1019 		return NamedHotspotExt::startAction(action, event);
1020 	}
1021 }
1022 
1023 /*--------------------------------------------------------------------------*/
1024 
startAction(CursorType action,Event & event)1025 bool Scene560::DeskChair::startAction(CursorType action, Event &event) {
1026 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
1027 
1028 	if ((action == CURSOR_USE) && !scene->_field380) {
1029 		scene->setAction(&scene->_action1);
1030 		return true;
1031 	} else {
1032 		return NamedObject::startAction(action, event);
1033 	}
1034 }
1035 
startAction(CursorType action,Event & event)1036 bool Scene560::Box::startAction(CursorType action, Event &event) {
1037 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
1038 
1039 	switch (action) {
1040 	case CURSOR_USE:
1041 		if (scene->_field380) {
1042 			SceneItem::display2(560, 54);
1043 		} else {
1044 			scene->_sceneMode = 9;
1045 			Common::Point destPos(289, 108);
1046 			PlayerMover *mover = new PlayerMover();
1047 			BF_GLOBALS._player.addMover(mover, &destPos, scene);
1048 		}
1049 		return true;
1050 	default:
1051 		return NamedObjectExt::startAction(action, event);
1052 	}
1053 }
1054 
postInit(SceneObjectList * OwnerList)1055 void Scene560::SafeInset::postInit(SceneObjectList *OwnerList) {
1056 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
1057 	FocusObject::postInit();
1058 
1059 	_cursorVisage.setVisage(1, 5);
1060 
1061 	if (BF_GLOBALS._safeCombination == 172) {
1062 		setFrame(2);
1063 		if (BF_INVENTORY.getObjectScene(INV_NICKEL) == 560) {
1064 			scene->_nickel.postInit();
1065 			scene->_nickel.setVisage(560);
1066 			scene->_nickel.setStrip(2);
1067 			scene->_nickel.setFrame(3);
1068 			scene->_nickel.fixPriority(252);
1069 			scene->_nickel.setPosition(Common::Point(181, 140));
1070 			scene->_nickel.setDetails(560, 47, 48, -1, 1, (SceneItem *)NULL);
1071 			BF_GLOBALS._sceneItems.remove(&scene->_nickel);
1072 			BF_GLOBALS._sceneItems.push_front(&scene->_nickel);
1073 		}
1074 	} else {
1075 		setFrame(1);
1076 		_item1.setDetails(Rect(143, 68, 159, 85), 560, 49, 50, -1, 1, NULL);
1077 		_item2.setDetails(Rect(159, 68, 175, 85), 560, 49, 50, -1, 1, NULL);
1078 		_item3.setDetails(Rect(175, 68, 191, 85), 560, 49, 50, -1, 1, NULL);
1079 		_item4.setDetails(Rect(143, 86, 159, 102), 560, 49, 50, -1, 1, NULL);
1080 		_item5.setDetails(Rect(159, 86, 175, 102), 560, 49, 50, -1, 1, NULL);
1081 		_item6.setDetails(Rect(175, 86, 191, 102), 560, 49, 50, -1, 1, NULL);
1082 
1083 		BF_GLOBALS._sceneItems.remove(&_item1);
1084 		BF_GLOBALS._sceneItems.remove(&_item2);
1085 		BF_GLOBALS._sceneItems.remove(&_item3);
1086 		BF_GLOBALS._sceneItems.remove(&_item4);
1087 		BF_GLOBALS._sceneItems.remove(&_item5);
1088 		BF_GLOBALS._sceneItems.remove(&_item6);
1089 		BF_GLOBALS._sceneItems.push_front(&_item6);
1090 		BF_GLOBALS._sceneItems.push_front(&_item5);
1091 		BF_GLOBALS._sceneItems.push_front(&_item4);
1092 		BF_GLOBALS._sceneItems.push_front(&_item3);
1093 		BF_GLOBALS._sceneItems.push_front(&_item2);
1094 		BF_GLOBALS._sceneItems.push_front(&_item1);
1095 
1096 		_item1._flag = 1;
1097 		_item2._flag = 2;
1098 		_item3._flag = 3;
1099 		_item4._flag = 4;
1100 		_item5._flag = 5;
1101 		_item6._flag = 6;
1102 
1103 		_digit2.postInit();
1104 		_digit2.setVisage(560);
1105 		_digit2.setStrip(3);
1106 		_digit2.setPosition(Common::Point(151, 94));
1107 		_digit2.fixPriority(252);
1108 
1109 		_digit1.postInit();
1110 		_digit1.setVisage(560);
1111 		_digit1.setStrip(3);
1112 		_digit1.setPosition(Common::Point(167, 94));
1113 		_digit1.fixPriority(252);
1114 
1115 		_digit0.postInit();
1116 		_digit0.setVisage(560);
1117 		_digit0.setStrip(3);
1118 		_digit0.setPosition(Common::Point(183, 94));
1119 		_digit0.fixPriority(252);
1120 
1121 		int amount = (BF_GLOBALS._safeCombination != 0) ? BF_GLOBALS._safeCombination : 1000;
1122 
1123 		// Get digit 0 portion
1124 		int remainder = amount % 10;
1125 		amount /= 10;
1126 		_digit0.setFrame(!remainder ? 10 : remainder);
1127 
1128 		// Get digit 1 portion
1129 		remainder = amount % 10;
1130 		amount /= 10;
1131 		_digit1.setFrame(!remainder ? 10 : remainder);
1132 
1133 		// Get digit 2 portion
1134 		remainder = amount % 10;
1135 		_digit2.setFrame(!remainder ? 10 : remainder);
1136 	}
1137 }
1138 
remove()1139 void Scene560::SafeInset::remove() {
1140 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
1141 
1142 	_item1.remove();
1143 	_item2.remove();
1144 	_item3.remove();
1145 	_item4.remove();
1146 	_item5.remove();
1147 	_item6.remove();
1148 	_digit2.remove();
1149 	_digit1.remove();
1150 	_digit0.remove();
1151 
1152 	scene->_nickel.remove();
1153 
1154 	if (BF_GLOBALS._events.getCursor() == CURSOR_USE) {
1155 		GfxSurface cursor = _cursorVisage.getFrame(2);
1156 		BF_GLOBALS._events.setCursor(cursor);
1157 	}
1158 
1159 	FocusObject::remove();
1160 }
1161 
signal()1162 void Scene560::SafeInset::signal() {
1163 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
1164 
1165 	// Recalculate the new total
1166 	int total = 0;
1167 	if (_digit2._frame < 10)
1168 		total = _digit2._frame * 100;
1169 	if (_digit1._frame < 10)
1170 		total += _digit1._frame * 10;
1171 	if (_digit0._frame < 10)
1172 		total += _digit0._frame;
1173 
1174 	BF_GLOBALS._safeCombination = !total ? 1000 : total;
1175 
1176 	// Check if the combination is correct
1177 	if (total == 172) {
1178 		BF_GLOBALS._sceneObjects->draw();
1179 
1180 		if (!BF_GLOBALS.getFlag(fGotPointsForBank)) {
1181 			T2_GLOBALS._uiElements.addScore(50);
1182 			BF_GLOBALS.setFlag(fGotPointsForBank);
1183 		}
1184 
1185 		setFrame(2);
1186 		GfxSurface cursor = _cursorVisage.getFrame(2);
1187 		BF_GLOBALS._events.setCursor(cursor);
1188 
1189 		_item1.remove();
1190 		_item2.remove();
1191 		_item3.remove();
1192 		_item4.remove();
1193 		_item5.remove();
1194 		_item6.remove();
1195 		_digit2.remove();
1196 		_digit1.remove();
1197 		_digit0.remove();
1198 
1199 		if (BF_INVENTORY.getObjectScene(INV_NICKEL) == 560) {
1200 			// Nickel is still in the safe, show it
1201 			scene->_nickel.postInit();
1202 			scene->_nickel.setVisage(560);
1203 			scene->_nickel.setStrip(2);
1204 			scene->_nickel.setFrame(3);
1205 			scene->_nickel.fixPriority(252);
1206 			scene->_nickel.setPosition(Common::Point(181, 140));
1207 			scene->_nickel.setDetails(560, 47, 48, -1, 1, (SceneItem *)NULL);
1208 			BF_GLOBALS._sceneItems.remove(&scene->_nickel);
1209 			BF_GLOBALS._sceneItems.push_front(&scene->_nickel);
1210 		}
1211 	}
1212 }
process(Event & event)1213 void Scene560::SafeInset::process(Event &event) {
1214 	if (_bounds.contains(event.mousePos)) {
1215 		CursorType cursorId = BF_GLOBALS._events.getCursor();
1216 		if (cursorId == CURSOR_USE) {
1217 			// Instead of standard cursor, use special hand cursor
1218 			GfxSurface cursor = _cursorVisage.getFrame(6);
1219 			BF_GLOBALS._events.setCursor(cursor);
1220 		} else {
1221 			// Set cursor again just in case Exit cursor was showing
1222 			BF_GLOBALS._events.setCursor(cursorId);
1223 		}
1224 
1225 		if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
1226 				(event.btnState == BTNSHIFT_RIGHT)) {
1227 			BF_GLOBALS._events.setCursor(CURSOR_USE);
1228 			event.handled = true;
1229 		}
1230 	} else {
1231 		GfxSurface cursor = _cursorVisage.getFrame(7);
1232 		BF_GLOBALS._events.setCursor(cursor);
1233 
1234 		if ((event.mousePos.y < UI_INTERFACE_Y) && (event.eventType == EVENT_BUTTON_DOWN)) {
1235 			// Leave the safe view
1236 			event.handled = true;
1237 			remove();
1238 		}
1239 	}
1240 }
1241 
startAction(CursorType action,Event & event)1242 bool Scene560::SafeInset::Item::startAction(CursorType action, Event &event) {
1243 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
1244 
1245 	switch (action) {
1246 	case CURSOR_USE:
1247 		switch (_flag) {
1248 		case 1: {
1249 			int newFrame = scene->_safeInset._digit2._frame + 1;
1250 			if (newFrame == 11)
1251 				newFrame = 1;
1252 
1253 			scene->_safeInset._digit2.setFrame(newFrame);
1254 			break;
1255 		}
1256 		case 2: {
1257 			int newFrame = scene->_safeInset._digit1._frame + 1;
1258 			if (newFrame == 11)
1259 				newFrame = 1;
1260 
1261 			scene->_safeInset._digit1.setFrame(newFrame);
1262 			break;
1263 		}
1264 		case 3: {
1265 			int newFrame = scene->_safeInset._digit0._frame + 1;
1266 			if (newFrame == 11)
1267 				newFrame = 1;
1268 
1269 			scene->_safeInset._digit0.setFrame(newFrame);
1270 			break;
1271 		}
1272 		case 4: {
1273 			int newFrame = scene->_safeInset._digit2._frame - 1;
1274 			if (newFrame == 0)
1275 				newFrame = 10;
1276 
1277 			scene->_safeInset._digit2.setFrame(newFrame);
1278 			break;
1279 		}
1280 		case 5: {
1281 			int newFrame = scene->_safeInset._digit1._frame - 1;
1282 			if (newFrame == 0)
1283 				newFrame = 10;
1284 
1285 			scene->_safeInset._digit1.setFrame(newFrame);
1286 			break;
1287 		}
1288 		case 6: {
1289 			int newFrame = scene->_safeInset._digit0._frame - 1;
1290 			if (newFrame == 0)
1291 				newFrame = 10;
1292 
1293 			scene->_safeInset._digit0.setFrame(newFrame);
1294 			break;
1295 		}
1296 		default:
1297 			break;
1298 		}
1299 
1300 		scene->_safeInset.signal();
1301 		scene->_sound1.play(75);
1302 		return true;
1303 	default:
1304 		return NamedHotspotExt::startAction(action, event);
1305 	}
1306 }
1307 
startAction(CursorType action,Event & event)1308 bool Scene560::Nickel::startAction(CursorType action, Event &event) {
1309 	if (action == CURSOR_USE) {
1310 		BF_INVENTORY.setObjectScene(INV_NICKEL, 1);
1311 		T2_GLOBALS._uiElements.addScore(10);
1312 		remove();
1313 		return true;
1314 	} else {
1315 		return NamedObject::startAction(action, event);
1316 	}
1317 }
1318 
postInit(SceneObjectList * OwnerList)1319 void Scene560::BoxInset::postInit(SceneObjectList *OwnerList) {
1320 	FocusObject::postInit();
1321 	_item1.setDetails(Rect(110, 48, 189, 102), 560, 43, 44, -1, 1, NULL);
1322 	BF_GLOBALS._sceneItems.remove(&_item1);
1323 	BF_GLOBALS._sceneItems.push_front(&_item1);
1324 }
1325 
remove()1326 void Scene560::BoxInset::remove() {
1327 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
1328 
1329 	if (scene->_sceneMode != 3)
1330 		scene->_sceneMode = 0;
1331 
1332 	_item1.remove();
1333 	FocusObject::remove();
1334 }
1335 
startAction(CursorType action,Event & event)1336 bool Scene560::BoxInset::Item1::startAction(CursorType action, Event &event) {
1337 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
1338 
1339 	if (action == CURSOR_USE) {
1340 		if (!BF_GLOBALS.getFlag(fGotPointsForBox)) {
1341 			T2_GLOBALS._uiElements.addScore(10);
1342 			BF_GLOBALS.setFlag(fGotPointsForBox);
1343 		}
1344 
1345 		scene->_safeInset.postInit();
1346 		scene->_safeInset.setVisage(560);
1347 		scene->_safeInset.setStrip(2);
1348 		scene->_safeInset.setPosition(Common::Point(160, 141));
1349 		scene->_safeInset.fixPriority(251);
1350 		scene->_safeInset.setDetails(560, 45, 46, -1);
1351 
1352 		scene->_sceneMode = 3;
1353 		scene->_boxInset.remove();
1354 
1355 		GfxSurface cursor = surfaceFromRes(1, 5, 6);
1356 		BF_GLOBALS._events.setCursor(cursor);
1357 		return true;
1358 	} else {
1359 		return NamedHotspot::startAction(action, event);
1360 	}
1361 }
1362 
1363 /*--------------------------------------------------------------------------*/
1364 
startAction(CursorType action,Event & event)1365 bool Scene560::Computer::startAction(CursorType action, Event &event) {
1366 	Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene;
1367 
1368 	switch (action) {
1369 	case CURSOR_USE:
1370 		if (BF_GLOBALS._bookmark < bTalkedToGrannyAboutSkipsCard) {
1371 			SceneItem::display2(666, 24);
1372 		} else {
1373 			scene->setAction(&scene->_action3);
1374 		}
1375 		return true;
1376 	default:
1377 		return NamedHotspot::startAction(action, event);
1378 	}
1379 }
1380 
1381 /*--------------------------------------------------------------------------*/
1382 
Scene560()1383 Scene560::Scene560(): SceneExt() {
1384 	_field380 = _field11EA = false;
1385 }
1386 
postInit(SceneObjectList * OwnerList)1387 void Scene560::postInit(SceneObjectList *OwnerList) {
1388 	SceneExt::postInit();
1389 	loadScene(560);
1390 	setZoomPercents(100, 60, 168, 90);
1391 	_stripManager.addSpeaker(&_gameTextSpeaker);
1392 
1393 	_picture1.setDetails(Rect(121, 16, 139, 35), 560, -1, -1, -1, 1, NULL);
1394 	_picture2.setDetails(Rect(139, 16, 157, 35), 560, -1, -1, -1, 1, NULL);
1395 	_picture3.setDetails(Rect(121, 35, 139, 54), 560, -1, -1, -1, 1, NULL);
1396 	_picture4.setDetails(Rect(139, 35, 157, 54), 560, -1, -1, -1, 1, NULL);
1397 	_picture1._flag = 3;
1398 	_picture2._flag = 4;
1399 	_picture3._flag = 2;
1400 	_picture4._flag = 1;
1401 
1402 	if (BF_GLOBALS._dayNumber == 0)
1403 		BF_GLOBALS._dayNumber = 3;
1404 
1405 	if (BF_GLOBALS._bookmark >= bTalkedToGrannyAboutSkipsCard) {
1406 		_box.postInit();
1407 		_box.setVisage(560);
1408 		_box.setStrip(4);
1409 		_box.setFrame(1);
1410 		_box.setPosition(Common::Point(295, 37));
1411 		_box.setDetails(560, 41, 42, -1, 1, (SceneItem *)NULL);
1412 	}
1413 
1414 	_deskChair.postInit();
1415 	_deskChair.setVisage(561);
1416 	_deskChair.setStrip(3);
1417 	_deskChair.setPosition(Common::Point(81, 149));
1418 	_deskChair.fixPriority(151);
1419 	_deskChair.changeZoom(81);
1420 
1421 	if (BF_GLOBALS._sceneManager._previousScene == 570) {
1422 		// Returning from using computer
1423 		BF_GLOBALS._events.setCursor(CURSOR_USE);
1424 
1425 		_deskChair.hide();
1426 
1427 		BF_GLOBALS._player.postInit();
1428 		BF_GLOBALS._player.setVisage(561);
1429 		BF_GLOBALS._player.setStrip(2);
1430 		BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount());
1431 		BF_GLOBALS._player._moveDiff.x = 11;
1432 		BF_GLOBALS._player.setPosition(Common::Point(96, 138));
1433 		BF_GLOBALS._player.changeZoom(81);
1434 
1435 		_deskChair.setFrame(BF_GLOBALS._player._frame);
1436 		_deskChair.setStrip(BF_GLOBALS._player._strip);
1437 		_deskChair.setPosition(BF_GLOBALS._player._position);
1438 
1439 		_field11EA = false;
1440 		_field380 = true;
1441 	} else {
1442 		// Entering study through doorway
1443 		_field11EA = false;
1444 		_field380 = false;
1445 
1446 		BF_GLOBALS._player.postInit();
1447 		BF_GLOBALS._player.setVisage(563);
1448 		BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1449 		BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
1450 		BF_GLOBALS._player.setPosition(Common::Point(79, 110));
1451 		BF_GLOBALS._player._moveDiff.x = 11;
1452 		BF_GLOBALS._player.changeZoom(-1);
1453 		BF_GLOBALS._player.disableControl();
1454 
1455 		_sceneMode = 10;
1456 		ADD_MOVER(BF_GLOBALS._player, 85, 115);
1457 	}
1458 
1459 	_computer.setDetails(Rect(16, 77, 58, 107), 560, 2, -1, -1, 1, NULL);
1460 	_deskChair.setDetails(560, 3, -1, -1, 1, (SceneItem *)NULL);
1461 	_chair.setDetails(Rect(163, 64, 196, 102), 560, 13, 25, 36, 1, NULL);
1462 	_lamp.setDetails(Rect(197, 43, 214, 56), 560, 7, 19, 30, 1, NULL);
1463 	_item4.setDetails(Rect(121, 18, 156, 54), 560, 8, 20, 31, 1, NULL);
1464 	_trophy.setDetails(Rect(259, 52, 275, 63), 560, 10, 22, 33, 1, NULL);
1465 	_waterColors.setDetails(Rect(214, 48, 239, 64), 560, 12, 24, 35, 1, NULL);
1466 	_fileCabinets.setDetails(Rect(0, 47, 49, 100), 560, 14, 26, 37, 1, NULL);
1467 	_certificate.setDetails(Rect(280, 51, 292, 62), 560, 11, 23, 34, 1, NULL);
1468 	_bookcase.setDetails(Rect(176, 0, 319, 103), 560, 9, 21, 32, 1, NULL);
1469 	_desk.setDetails(1, 560, 6, 10, 29, 1);
1470 	_item12.setDetails(Rect(62, 16, 96, 101), 560, 51, 52, 53, 1, NULL);
1471 	_carpet.setDetails(Rect(0, 103, 319, 167), 560, 5, 16, 28, 1, NULL);
1472 	_office.setDetails(Rect(0, 0, 320, 168), 560, 4, -1, -1, 1, NULL);
1473 
1474 	BF_GLOBALS._player.enableControl();
1475 }
1476 
signal()1477 void Scene560::signal() {
1478 	switch (_sceneMode) {
1479 	case 1:
1480 		_object6.hide();
1481 		_object6.remove();
1482 		BF_GLOBALS._player.enableControl();
1483 		break;
1484 	case 5:
1485 	case 6:
1486 	case 7:
1487 	case 8:
1488 		BF_GLOBALS._player._strip = 4;
1489 		BF_GLOBALS._player._frame = 1;
1490 		BF_GLOBALS._player.disableControl();
1491 
1492 		_object6.postInit();
1493 		_object6.setVisage(560);
1494 		_object6.setStrip(1);
1495 		_object6.setFrame(_sceneMode - 4);
1496 		_object6.setPosition(Common::Point(160, 141));
1497 		_object6.fixPriority(250);
1498 		_stripManager.start(_sceneMode + 5595, this);
1499 		_sceneMode = 1;
1500 		break;
1501 	case 9:
1502 		// Clicked on the Baseball Cards Box
1503 		_object6._strip = 4;
1504 		_object6._frame = 1;
1505 
1506 		if (BF_GLOBALS._safeCombination == 172) {
1507 			if (_sceneMode != 3) {
1508 				_safeInset.postInit();
1509 				_safeInset.setVisage(560);
1510 				_safeInset.setStrip(2);
1511 				_safeInset.setPosition(Common::Point(160, 141));
1512 				_safeInset.fixPriority(251);
1513 				_safeInset.setDetails(560, 45, 46, -1);
1514 
1515 				_sceneMode = 3;
1516 			}
1517 		} else if ((_sceneMode != 3) && (_sceneMode != 4)) {
1518 			if (!BF_GLOBALS.getFlag(fGotPointsForPunch)) {
1519 				T2_GLOBALS._uiElements.addScore(10);
1520 				BF_GLOBALS.setFlag(fGotPointsForPunch);
1521 			}
1522 
1523 			_boxInset.postInit();
1524 			_boxInset.setVisage(560);
1525 			_boxInset.setStrip(2);
1526 			_boxInset.setFrame(4);
1527 			_boxInset.setPosition(Common::Point(160, 141));
1528 			_boxInset.fixPriority(251);
1529 			_boxInset.setDetails(560, 43, 44, -1);
1530 
1531 			_sceneMode = 4;
1532 		}
1533 		break;
1534 	case 10:
1535 		_field11EA = false;
1536 		BF_GLOBALS._player.enableControl();
1537 		break;
1538 	case 11:
1539 		BF_GLOBALS._sceneManager.changeScene(270);
1540 		break;
1541 	default:
1542 		break;
1543 	}
1544 }
1545 
process(Event & event)1546 void Scene560::process(Event &event) {
1547 	if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) &&
1548 			(_field380) && !_action) {
1549 		_destPosition = event.mousePos;
1550 		BF_GLOBALS._player.disableControl();
1551 		setAction(&_action2);
1552 
1553 		event.handled = true;
1554 	}
1555 
1556 	SceneExt::process(event);
1557 }
1558 
dispatch()1559 void Scene560::dispatch() {
1560 	if (!_field11EA && (BF_GLOBALS._player._position.y < 105)) {
1561 		_field11EA = true;
1562 		BF_GLOBALS._player.disableControl();
1563 		BF_GLOBALS._sceneManager.changeScene(270);
1564 	}
1565 
1566 	SceneExt::dispatch();
1567 }
1568 
1569 /*--------------------------------------------------------------------------
1570  * Scene 570 - Computer
1571  *
1572  *--------------------------------------------------------------------------*/
1573 
PasswordEntry()1574 Scene570::PasswordEntry::PasswordEntry(): EventHandler() {
1575 	_passwordStr = SCENE570_PASSWORD;
1576 }
1577 
synchronize(Serializer & s)1578 void Scene570::PasswordEntry::synchronize(Serializer &s) {
1579 	EventHandler::synchronize(s);
1580 	s.syncString(_entryBuffer);
1581 }
1582 
postInit(SceneObjectList * OwnerList)1583 void Scene570::PasswordEntry::postInit(SceneObjectList *OwnerList) {
1584 	Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
1585 
1586 	scene->_sceneMode = 10;
1587 	scene->_object3.setStrip(6);
1588 	scene->_object3.setFrame(1);
1589 	scene->_object3.fixPriority(3);
1590 
1591 	_passwordText._color1 = 22;
1592 	_passwordText._color2 = 9;
1593 	_passwordText._color3 = 9;
1594 	_passwordText._width = 128;
1595 	_passwordText._fontNumber = 9000;
1596 	_passwordText.setPosition(Common::Point(165, 40));
1597 	_passwordText.fixPriority(255);
1598 	_passwordText.setup(_passwordStr);
1599 
1600 	_entryText._color1 = 22;
1601 	_entryText._color2 = 9;
1602 	_entryText._color3 = 9;
1603 	_entryText._width = 128;
1604 	_entryText._fontNumber = 9000;
1605 	_entryText.setPosition(Common::Point(220, 40));
1606 	_entryText.fixPriority(255);
1607 	_entryText.setup(_entryBuffer);
1608 }
1609 
process(Event & event)1610 void Scene570::PasswordEntry::process(Event &event) {
1611 	Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
1612 	bool entryChanged = false;
1613 
1614 	switch (event.eventType) {
1615 	case EVENT_KEYPRESS: {
1616 		int key = toupper(event.kbd.ascii);
1617 		scene->_sound1.play(72);
1618 
1619 		if ((event.kbd.keycode == Common::KEYCODE_BACKSPACE) || (event.kbd.keycode == Common::KEYCODE_DELETE)) {
1620 			// Delete a key from the entry
1621 			if (_entryBuffer.size() > 0)
1622 				_entryBuffer.deleteLastChar();
1623 			entryChanged = true;
1624 		} else if (event.kbd.keycode == Common::KEYCODE_RETURN) {
1625 			// Finished entering password
1626 			_passwordText.remove();
1627 			_entryText.remove();
1628 
1629 			checkPassword();
1630 			remove();
1631 		} else if ((key >= 32) && (key <= 126)) {
1632 			// Valid character pressed
1633 			if (_entryBuffer.size() < 10)
1634 				_entryBuffer += (char)key;
1635 			event.handled = true;
1636 			entryChanged = true;
1637 		}
1638 		break;
1639 	}
1640 	case EVENT_BUTTON_DOWN:
1641 		event.handled = true;
1642 		break;
1643 	default:
1644 		break;
1645 	}
1646 
1647 	if (entryChanged) {
1648 		_entryText._color1 = 22;
1649 		_entryText._color2 = 9;
1650 		_entryText._color3 = 9;
1651 		_entryText._width = 128;
1652 		_entryText._fontNumber = 9000;
1653 		_entryText.setPosition(Common::Point(213, 40));
1654 		_entryText.fixPriority(255);
1655 		_entryText.setup(_entryBuffer);
1656 
1657 		// Pad entered text with spaces to make up the allowed width and then display
1658 		Common::String msg = _entryBuffer;
1659 		while (msg.size() < 10)
1660 			msg += " ";
1661 		_entryText.setup(msg);
1662 	}
1663 }
1664 
checkPassword()1665 void Scene570::PasswordEntry::checkPassword() {
1666 	// Check if the password is correctly entered as 'JACKIE' or, as a nod to the
1667 	// reimplementation in ScummVM, as the project name.
1668 	Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
1669 
1670 	if (!_entryBuffer.compareTo("JACKIE") || !_entryBuffer.compareTo("SCUMMVM")) {
1671 		// Password was correct
1672 		T2_GLOBALS._uiElements.addScore(30);
1673 		BF_GLOBALS._player.disableControl();
1674 		scene->_sound1.play(73);
1675 
1676 		T2_GLOBALS._uiElements.hide();
1677 		T2_GLOBALS._uiElements._active = false;
1678 		scene->_sceneMode = 5701;
1679 		scene->setAction(&scene->_sequenceManager, scene, 5701, &scene->_object3, NULL);
1680 	} else {
1681 		// Password was incorrect
1682 		_entryBuffer = "";
1683 
1684 		scene->_object3.fixPriority(1);
1685 		scene->_iconManager.refreshList();
1686 		BF_GLOBALS._events.setCursor(CURSOR_USE);
1687 		scene->_sceneMode = 0;
1688 	}
1689 }
1690 
IconManager()1691 Scene570::IconManager::IconManager(): EventHandler() {
1692 	_mode = _selectedFolder = _fieldAA = _fieldAC = 0;
1693 }
1694 
remove()1695 void Scene570::IconManager::remove() {
1696 	_object1.remove();
1697 	EventHandler::remove();
1698 }
1699 
setup(int mode)1700 void Scene570::IconManager::setup(int mode) {
1701 	_mode = mode;
1702 	_selectedFolder = 0;
1703 
1704 	_object1.postInit();
1705 	_object1.setVisage(572);
1706 	_object1.fixPriority(2);
1707 	_object1.setFrame((mode == 1) ? 4 : 5);
1708 	EventHandler::postInit();
1709 }
1710 
hideList()1711 void Scene570::IconManager::hideList() {
1712 	SynchronizedList<Icon *>::iterator i;
1713 	for (i = _list.begin(); i != _list.end(); ++i) {
1714 		(*i)->_sceneText.remove();
1715 	}
1716 }
1717 
refreshList()1718 void Scene570::IconManager::refreshList() {
1719 	Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
1720 
1721 	_object1.setPosition(Common::Point(163, 19));
1722 	scene->_object3.setStrip(4);
1723 
1724 	// Clear any current icons
1725 	SynchronizedList<Icon *>::iterator i;
1726 	for (i = _list.begin(); i != _list.end(); ++i) {
1727 		Icon *item = *i;
1728 
1729 		item->setVisage(572);
1730 		item->setStrip(1);
1731 		item->fixPriority(2);
1732 		item->setPosition(Common::Point(330, 100));
1733 		item->_sceneText.remove();
1734 	}
1735 
1736 	// Refresh the list
1737 	int iconIndex = 0, folderIndex = 0;
1738 	for (i = _list.begin(); i != _list.end(); ++i) {
1739 		Icon *item = *i;
1740 
1741 		if (item->_iconId == 1) {
1742 			// Folder
1743 			int parentId = item->_parentFolderId;
1744 			item->setFrame((_selectedFolder == (item->_folderId - 1)) ? 1 : 8);
1745 			item->setPosition(Common::Point(168 + parentId * 11, folderIndex * 8 + 27));
1746 			item->_sceneText.setPosition(Common::Point(175 + parentId * 11, folderIndex * 8 + 21));
1747 			item->_sceneText.setup(item->_text);
1748 			++folderIndex;
1749 		} else if (item->_parentFolderId == _selectedFolder) {
1750 			item->setPosition(Common::Point(229, 27 + iconIndex * 12));
1751 
1752 			switch (item->_iconId) {
1753 			case 2:
1754 				item->setFrame(9);
1755 				break;
1756 			case 3:
1757 				item->setFrame(7);
1758 				break;
1759 			case 5:
1760 				item->setFrame(10);
1761 				break;
1762 			case 6:
1763 				item->setFrame(11);
1764 				break;
1765 			case 7:
1766 				item->setFrame(12);
1767 				break;
1768 			default:
1769 				break;
1770 			}
1771 
1772 			item->_sceneText.setPosition(Common::Point(236, iconIndex * 12 + 22));
1773 			item->_sceneText.setup(item->_text);
1774 			++iconIndex;
1775 		}
1776 	}
1777 }
1778 
addItem(Icon * item)1779 void Scene570::IconManager::addItem(Icon *item) {
1780 	_list.push_back(item);
1781 }
1782 
Icon()1783 Scene570::Icon::Icon(): NamedObject() {
1784 	_iconId = _folderId = 0;
1785 	_parentFolderId = 0;
1786 }
1787 
synchronize(Serializer & s)1788 void Scene570::Icon::synchronize(Serializer &s) {
1789 	NamedObject::synchronize(s);
1790 	s.syncAsSint16LE(_iconId);
1791 	s.syncAsSint16LE(_folderId);
1792 	s.syncAsSint16LE(_parentFolderId);
1793 	if (s.getVersion() < 11) {
1794 		int useless = 0;
1795 		s.syncAsSint16LE(useless);
1796 	}
1797 }
1798 
remove()1799 void Scene570::Icon::remove() {
1800 	_sceneText.remove();
1801 	NamedObject::remove();
1802 }
1803 
startAction(CursorType action,Event & event)1804 bool Scene570::Icon::startAction(CursorType action, Event &event) {
1805 	Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
1806 
1807 	switch (action) {
1808 	case CURSOR_LOOK:
1809 		switch (_iconId) {
1810 		case 1:
1811 			SceneItem::display2(570, 9);
1812 			break;
1813 		case 2:
1814 			SceneItem::display2(570, 10);
1815 			break;
1816 		case 3:
1817 			SceneItem::display2(570, 4);
1818 			break;
1819 		case 5:
1820 			SceneItem::display2(570, 11);
1821 			break;
1822 		case 6:
1823 			SceneItem::display2(570, 12);
1824 			break;
1825 		case 7:
1826 			SceneItem::display2(570, 13);
1827 			break;
1828 		default:
1829 			break;
1830 		}
1831 		return true;
1832 	case CURSOR_USE:
1833 		// Select the given icon
1834 		scene->_sound1.play(73);
1835 		switch (_iconId) {
1836 		case 1:
1837 			// Folder, so select it
1838 			scene->_iconManager._selectedFolder = _folderId - 1;
1839 			scene->_iconManager.refreshList();
1840 			break;
1841 		case 2:
1842 			scene->_iconManager.hideList();
1843 			scene->_sceneMode = 5702;
1844 			scene->setAction(&scene->_sequenceManager, scene, 5702, &scene->_object3, NULL);
1845 			break;
1846 		case 3:
1847 			scene->_iconManager.hideList();
1848 			scene->_passwordEntry.postInit();
1849 			break;
1850 		case 5:
1851 			SceneItem::display2(570, 5);
1852 			break;
1853 		case 6:
1854 			scene->_iconManager.hideList();
1855 			switch (_folderId) {
1856 			case 8:
1857 				T2_GLOBALS._uiElements.hide();
1858 				T2_GLOBALS._uiElements._active = false;
1859 				scene->_sceneMode = 5705;
1860 				scene->setAction(&scene->_sequenceManager, scene, 5705, &scene->_object3, NULL);
1861 				break;
1862 			case 10:
1863 				T2_GLOBALS._uiElements.hide();
1864 				T2_GLOBALS._uiElements._active = false;
1865 				scene->_sceneMode = 5706;
1866 				scene->setAction(&scene->_sequenceManager, scene, 5706, &scene->_object3, NULL);
1867 				break;
1868 			case 12:
1869 				T2_GLOBALS._uiElements.hide();
1870 				T2_GLOBALS._uiElements._active = false;
1871 				scene->_sceneMode = 5707;
1872 				scene->setAction(&scene->_sequenceManager, scene, 5707, &scene->_object3, NULL);
1873 				break;
1874 			default:
1875 				break;
1876 			}
1877 			break;
1878 		case 7:
1879 			scene->_iconManager.hideList();
1880 			T2_GLOBALS._uiElements.hide();
1881 			T2_GLOBALS._uiElements._active = false;
1882 			scene->_sceneMode = 5704;
1883 			scene->setAction(&scene->_sequenceManager, scene, 5704, &scene->_object3, NULL);
1884 			break;
1885 		default:
1886 			break;
1887 		}
1888 		return true;
1889 	case CURSOR_TALK:
1890 		SceneItem::display2(570, 15);
1891 		return true;
1892 	case CURSOR_PRINTER:
1893 		switch (_iconId) {
1894 		case 1:
1895 			// Folder - "You can't print that"
1896 			SceneItem::display2(570, 8);
1897 			break;
1898 		case 7:
1899 			scene->_sound1.play(74);
1900 			if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 570) {
1901 				SceneItem::display2(570, 6);
1902 				T2_GLOBALS._uiElements.addScore(30);
1903 				BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 1);
1904 			} else {
1905 				SceneItem::display2(570, 7);
1906 			}
1907 			break;
1908 		default:
1909 			// You don't want to print that
1910 			SceneItem::display2(570, 18);
1911 			break;
1912 		}
1913 		return true;
1914 	default:
1915 		return NamedObject::startAction(action, event);
1916 	}
1917 }
1918 
setDetails(int iconId,int folderId,int parentFolderId,const Common::String & msg)1919 void Scene570::Icon::setDetails(int iconId, int folderId, int parentFolderId, const Common::String &msg) {
1920 	Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
1921 	NamedObject::postInit();
1922 
1923 	_iconId = iconId;
1924 	_folderId = folderId;
1925 	_parentFolderId = parentFolderId;
1926 	_text = msg;
1927 
1928 	_sceneText._color1 = 22;
1929 	_sceneText._color2 = 9;
1930 	_sceneText._color3 = 9;
1931 	_sceneText._width = 128;
1932 	_sceneText._fontNumber = 9000;
1933 	_sceneText.fixPriority(2);
1934 
1935 	BF_GLOBALS._sceneItems.push_front(this);
1936 	scene->_iconManager.addItem(this);
1937 }
1938 
1939 /*--------------------------------------------------------------------------*/
1940 
startAction(CursorType action,Event & event)1941 bool Scene570::PowerSwitch::startAction(CursorType action, Event &event) {
1942 	Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
1943 
1944 	switch (action) {
1945 	case CURSOR_USE:
1946 		if (scene->_object4._flag == 1) {
1947 			setFrame(1);
1948 			scene->_object3.remove();
1949 		} else {
1950 			if (!BF_GLOBALS.getFlag(fGotPointsForCoin)) {
1951 				T2_GLOBALS._uiElements.addScore(10);
1952 				BF_GLOBALS.setFlag(fGotPointsForCoin);
1953 			}
1954 
1955 			scene->_sound1.play(70);
1956 			scene->_object4._flag = 1;
1957 			setFrame(2);
1958 
1959 			scene->_object3.postInit();
1960 			scene->_object3.fixPriority(1);
1961 			scene->_object3.setDetails(570, 16, 15, 17);
1962 			BF_GLOBALS._sceneItems.remove(&scene->_object3);
1963 			BF_GLOBALS._sceneItems.push_front(&scene->_object3);
1964 
1965 			BF_GLOBALS._player.disableControl();
1966 			scene->_sceneMode = 5700;
1967 			setAction(&scene->_sequenceManager, scene, 5700, &scene->_object3, NULL);
1968 		}
1969 		return true;
1970 	default:
1971 		return NamedObject::startAction(action, event);
1972 	}
1973 }
1974 
startAction(CursorType action,Event & event)1975 bool Scene570::PrinterIcon::startAction(CursorType action, Event &event) {
1976 	if (action == CURSOR_USE) {
1977 		BF_GLOBALS._events.setCursor(CURSOR_PRINTER);
1978 		return true;
1979 	} else {
1980 		return NamedObject::startAction(action, event);
1981 	}
1982 }
1983 
remove()1984 void Scene570::Object3::remove() {
1985 	Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
1986 	scene->_object4._flag = 0;
1987 
1988 	scene->_printerIcon.remove();
1989 	scene->_iconManager.remove();
1990 	scene->_folder1.remove();
1991 	scene->_folder2.remove();
1992 	scene->_folder3.remove();
1993 	scene->_folder4.remove();
1994 	scene->_icon1.remove();
1995 	scene->_icon2.remove();
1996 	scene->_icon3.remove();
1997 	scene->_icon4.remove();
1998 	scene->_icon5.remove();
1999 	scene->_icon6.remove();
2000 	scene->_icon7.remove();
2001 	scene->_icon8.remove();
2002 	scene->_icon9.remove();
2003 
2004 	FocusObject::remove();
2005 	BF_GLOBALS._sceneManager.changeScene(560);
2006 }
2007 
2008 /*--------------------------------------------------------------------------*/
2009 
startAction(CursorType action,Event & event)2010 bool Scene570::FloppyDrive::startAction(CursorType action, Event &event) {
2011 	Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene;
2012 
2013 	switch (action) {
2014 	case CURSOR_USE:
2015 		if (BF_INVENTORY.getObjectScene(INV_D_FLOPPY) == 571) {
2016 			BF_INVENTORY.setObjectScene(INV_D_FLOPPY, 1);
2017 			scene->_iconManager.refreshList();
2018 			SceneItem::display2(570, 2);
2019 		} else {
2020 			SceneItem::display2(570, 3);
2021 		}
2022 		return true;
2023 	case INV_D_FLOPPY:
2024 		BF_INVENTORY.setObjectScene(INV_D_FLOPPY, 571);
2025 		scene->_iconManager.refreshList();
2026 		return true;
2027 	default:
2028 		return NamedHotspot::startAction(action, event);
2029 	}
2030 }
2031 
2032 /*--------------------------------------------------------------------------*/
2033 
postInit(SceneObjectList * OwnerList)2034 void Scene570::postInit(SceneObjectList *OwnerList) {
2035 	SceneExt::postInit();
2036 	loadScene(570);
2037 
2038 	_stripManager.addSpeaker(&_gameTextSpeaker);
2039 	if (BF_GLOBALS._dayNumber == 0)
2040 		BF_GLOBALS._dayNumber = 1;
2041 
2042 	_object4._flag = 0;
2043 	BF_GLOBALS._player.postInit();
2044 	BF_GLOBALS._player.enableControl();
2045 	BF_GLOBALS._player.hide();
2046 
2047 	_powerSwitch.postInit();
2048 	_powerSwitch.setVisage(570);
2049 	_powerSwitch.setStrip(4);
2050 	_powerSwitch.setFrame(1);
2051 	_powerSwitch.setPosition(Common::Point(163, 131));
2052 	_powerSwitch.setDetails(570, 1, 15, -1, 1, (SceneItem *)NULL);
2053 
2054 	_floppyDrive.setDetails(Rect(258, 111, 303, 120), 570, 0, 15, -1, 1, NULL);
2055 	_item11.setDetails(0, 570, 15, 15, 15, 1);
2056 	_monitor.setDetails(1, 570, 19, 20, 21, 1);
2057 	_item3.setDetails(2, 570, 22, 23, 24, 1);
2058 	_case.setDetails(3, 570, 25, 26, 27, 1);
2059 	_keyboard.setDetails(4, 570, 28, 29, 30, 1);
2060 	_desk.setDetails(5, 570, 31, 32, 33, 1);
2061 	_printer.setDetails(7, 570, 37, 38, 39, 1);
2062 	_window.setDetails(8, 570, 40, 41, 42, 1);
2063 	_plant.setDetails(9, 570, 43, 44, 45, 1);
2064 
2065 	if ((BF_GLOBALS._dayNumber == 1) && (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1)) {
2066 		_object4.postInit();
2067 		_object4.setVisage(574);
2068 		_object4.setPosition(Common::Point(90, 84));
2069 	}
2070 }
2071 
signal()2072 void Scene570::signal() {
2073 	switch (_sceneMode) {
2074 	case 5700:
2075 		_object3.setStrip(4);
2076 		_object3.setFrame(1);
2077 
2078 		_printerIcon.postInit();
2079 		_printerIcon.setVisage(572);
2080 		_printerIcon.setFrame(3);
2081 		_printerIcon.setPosition(Common::Point(172, 71));
2082 		_printerIcon.fixPriority(2);
2083 		_printerIcon.setDetails(570, 14, 15, -1, 2, (SceneItem *)NULL);
2084 
2085 		_iconManager.setup(2);
2086 		_folder1.setDetails(1, 1, 0, SCENE570_C_DRIVE);
2087 		_folder2.setDetails(1, 2, 1, SCENE570_RING);
2088 		_folder3.setDetails(1, 3, 1, SCENE570_PROTO);
2089 		_folder4.setDetails(1, 4, 1, SCENE570_WACKY);
2090 
2091 		if (!BF_GLOBALS.getFlag(fDecryptedBluePrints))
2092 			_icon1.setDetails(3, 5, 0, SCENE570_COBB);
2093 		_icon2.setDetails(2, 7, 0, SCENE570_LETTER);
2094 		if (BF_GLOBALS.getFlag(fDecryptedBluePrints))
2095 			_icon3.setDetails(7, 6, 0, SCENE570_COBB);
2096 
2097 		_icon4.setDetails(6, 8, 1, SCENE570_RINGEXE);
2098 		_icon5.setDetails(5, 9, 1, SCENE570_RINGDATA);
2099 		_icon6.setDetails(6, 10, 2, SCENE570_PROTOEXE);
2100 		_icon7.setDetails(5, 11, 2, SCENE570_PROTODATA);
2101 		_icon8.setDetails(6, 12, 3, SCENE570_WACKYEXE);
2102 		_icon9.setDetails(5, 13, 3, SCENE570_WACKYDATA);
2103 
2104 		_iconManager.refreshList();
2105 		BF_GLOBALS._player.enableControl();
2106 		break;
2107 	case 5701:
2108 		BF_GLOBALS.setFlag(fDecryptedBluePrints);
2109 		_iconManager._list.remove(&_icon1);
2110 		_icon1.remove();
2111 
2112 		_object3.setVisage(572);
2113 		_object3.setStrip(4);
2114 		_object3.setFrame(1);
2115 		_object3.fixPriority(1);
2116 
2117 		_icon3.setDetails(7, 6, 0, SCENE570_COBB);
2118 		_iconManager.refreshList();
2119 		T2_GLOBALS._uiElements._active = true;
2120 		T2_GLOBALS._uiElements.show();
2121 		BF_GLOBALS._player.enableControl();
2122 		break;
2123 	case 5704:
2124 	case 5705:
2125 	case 5706:
2126 	case 5707:
2127 		T2_GLOBALS._uiElements._active = true;
2128 		T2_GLOBALS._uiElements.show();
2129 		_object3.setPosition(Common::Point(220, 75));
2130 		_object3.setVisage(572);
2131 		_object3.setStrip(4);
2132 		_object3.setFrame(1);
2133 		// fall through
2134 	case 5702:
2135 	case 5703:
2136 		_object3.fixPriority(1);
2137 		_iconManager.refreshList();
2138 		BF_GLOBALS._player.enableControl();
2139 		break;
2140 	default:
2141 		break;
2142 	}
2143 }
2144 
process(Event & event)2145 void Scene570::process(Event &event) {
2146 	SceneExt::process(event);
2147 
2148 	if (!event.handled && (_sceneMode == 10))
2149 		// Password entry active, so pass events to it
2150 		_passwordEntry.process(event);
2151 }
2152 
2153 /*--------------------------------------------------------------------------
2154  * Scene 580 - Child Protective Services Parking Lot
2155  *
2156  *--------------------------------------------------------------------------*/
2157 
startAction(CursorType action,Event & event)2158 bool Scene580::Vechile::startAction(CursorType action, Event &event) {
2159 	Scene580 *scene = (Scene580 *)BF_GLOBALS._sceneManager._scene;
2160 
2161 	if (action == CURSOR_USE) {
2162 		BF_GLOBALS._player.disableControl();
2163 		scene->_sceneMode = 1;
2164 		scene->setAction(&scene->_sequenceManager, scene, 5800, &BF_GLOBALS._player, NULL);
2165 		return true;
2166 	} else {
2167 		return NamedObject::startAction(action, event);
2168 	}
2169 }
2170 
startAction(CursorType action,Event & event)2171 bool Scene580::Door::startAction(CursorType action, Event &event) {
2172 	Scene580 *scene = (Scene580 *)BF_GLOBALS._sceneManager._scene;
2173 
2174 	if (action == CURSOR_USE) {
2175 		BF_GLOBALS._player.disableControl();
2176 		scene->_sceneMode = 5802;
2177 		scene->setAction(&scene->_sequenceManager, scene, 5802, &BF_GLOBALS._player, this, NULL);
2178 		return true;
2179 	} else {
2180 		return NamedObject::startAction(action, event);
2181 	}
2182 }
2183 
startAction(CursorType action,Event & event)2184 bool Scene580::Lyle::startAction(CursorType action, Event &event) {
2185 	if (action == CURSOR_LOOK) {
2186 		SceneItem::display2(580, 7);
2187 		return true;
2188 	} else {
2189 		return NamedObject::startAction(action, event);
2190 	}
2191 }
2192 
2193 /*--------------------------------------------------------------------------*/
2194 
postInit(SceneObjectList * OwnerList)2195 void Scene580::postInit(SceneObjectList *OwnerList) {
2196 	SceneExt::postInit();
2197 	loadScene(580);
2198 	setZoomPercents(45, 95, 55, 100);
2199 	BF_GLOBALS._sound1.changeSound(33);
2200 
2201 	if (BF_GLOBALS._dayNumber == 0)
2202 		BF_GLOBALS._dayNumber = 1;
2203 
2204 	BF_GLOBALS._player.postInit();
2205 	BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
2206 	BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2207 	BF_GLOBALS._player._moveDiff = Common::Point(2, 1);
2208 
2209 	_door.postInit();
2210 	_door.setVisage(580);
2211 	_door.setStrip(4);
2212 	_door.setPosition(Common::Point(168, 41));
2213 	_door.hide();
2214 	_door.setDetails(580, 5, -1, -1, 1, (SceneItem *)NULL);
2215 
2216 	_vechile.postInit();
2217 	_vechile.setVisage(580);
2218 	_vechile.fixPriority(65);
2219 
2220 	if (BF_GLOBALS.getFlag(fWithLyle)) {
2221 		_lyle.postInit();
2222 		_lyle.setVisage(835);
2223 		_lyle.setObjectWrapper(new SceneObjectWrapper());
2224 		_lyle.animate(ANIM_MODE_1, NULL);
2225 		_lyle._moveDiff = Common::Point(2, 1);
2226 		_lyle.setPosition(Common::Point(149, 70));
2227 		BF_GLOBALS._sceneItems.push_back(&_lyle);
2228 
2229 		_vechile.changeZoom(90);
2230 		_vechile.setStrip(3);
2231 		_vechile.setPosition(Common::Point(165, 76));
2232 		_vechile.setDetails(580, 2, 3, -1, 1, (SceneItem *)NULL);
2233 
2234 		BF_GLOBALS._player.setVisage(303);
2235 
2236 		BF_GLOBALS._walkRegions.disableRegion(8);
2237 		BF_GLOBALS._walkRegions.disableRegion(9);
2238 		BF_GLOBALS._walkRegions.disableRegion(10);
2239 		BF_GLOBALS._walkRegions.disableRegion(11);
2240 	} else {
2241 		_vechile.setPosition(Common::Point(159, 72));
2242 
2243 		if (BF_GLOBALS.getFlag(onDuty)) {
2244 			_vechile.setStrip(1);
2245 			_vechile.setFrame(2);
2246 			_vechile.setDetails(300, 11, 13, -1, 1, (SceneItem *)NULL);
2247 
2248 			BF_GLOBALS._player.setVisage(304);
2249 		} else {
2250 			_vechile.setStrip(2);
2251 			_vechile.setFrame(3);
2252 			_vechile.setDetails(580, 0, 1, -1, 1, (SceneItem *)NULL);
2253 
2254 			BF_GLOBALS._player.setVisage(303);
2255 		}
2256 	}
2257 
2258 	BF_GLOBALS._player.updateAngle(_vechile._position);
2259 
2260 	if (BF_GLOBALS._sceneManager._previousScene == 590) {
2261 		// Leaving Services
2262 		BF_GLOBALS._player.disableControl();
2263 		_sceneMode = 0;
2264 		setAction(&_sequenceManager, this, 5801, &BF_GLOBALS._player, NULL);
2265 	} else {
2266 		// Arriving at parking lot
2267 		BF_GLOBALS._player.setPosition(Common::Point(177, 58));
2268 		signal();
2269 	}
2270 
2271 	_item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 580, 6, -1, -1, 1, NULL);
2272 }
2273 
signal()2274 void Scene580::signal() {
2275 	switch (_sceneMode) {
2276 	case 1:
2277 		BF_GLOBALS._sceneManager.changeScene(60);
2278 		break;
2279 	case 5802:
2280 		BF_GLOBALS._sound1.fadeOut2(NULL);
2281 		BF_GLOBALS._sceneManager.changeScene(590);
2282 		break;
2283 	default:
2284 		BF_GLOBALS._player.enableControl();
2285 		break;
2286 	}
2287 }
2288 
process(Event & event)2289 void Scene580::process(Event &event) {
2290 	if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) &&
2291 			BF_GLOBALS._player.contains(event.mousePos)) {
2292 		BF_GLOBALS._player.disableControl();
2293 		SceneItem::display2(350, 26);
2294 
2295 		_sceneMode = 0;
2296 		signal();
2297 		event.handled = true;
2298 	}
2299 }
2300 
2301 /*--------------------------------------------------------------------------
2302  * Scene 590 - Child Protective Services
2303  *
2304  *--------------------------------------------------------------------------*/
2305 
startAction(CursorType action,Event & event)2306 bool Scene590::Laura::startAction(CursorType action, Event &event) {
2307 	Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene;
2308 
2309 	switch (action) {
2310 	case CURSOR_TALK:
2311 		if (!scene->_field17DC)
2312 			scene->_stripNumber = 5905;
2313 		else if (!scene->_field17DE) {
2314 			if (scene->_field17E2) {
2315 				scene->_stripNumber = 5907;
2316 			} else {
2317 				scene->_field17E2 = 1;
2318 				scene->_stripNumber = 5906;
2319 			}
2320 		}
2321 
2322 		scene->setAction(&scene->_action1);
2323 		return true;
2324 	default:
2325 		return NamedObject::startAction(action, event);
2326 	}
2327 }
2328 
startAction(CursorType action,Event & event)2329 bool Scene590::Skip::startAction(CursorType action, Event &event) {
2330 	Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene;
2331 
2332 	switch (action) {
2333 	case CURSOR_TALK:
2334 		if (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) == 1) {
2335 			scene->_stripNumber = !scene->_field17DC ? 5903 : 5902;
2336 		} else {
2337 			scene->_stripNumber = !scene->_field17DC ? 5901 : 5902;
2338 		}
2339 
2340 		scene->setAction(&scene->_action1);
2341 		scene->_field17DC = 1;
2342 		return true;
2343 	case INV_BASEBALL_CARD:
2344 		scene->_field17DE = 1;
2345 		T2_GLOBALS._uiElements.addScore(10);
2346 		BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 2);
2347 		BF_GLOBALS._player.disableControl();
2348 
2349 		scene->_stripNumber = !scene->_field17DC ? 5900 : 5904;
2350 		scene->_field17DC = 1;
2351 		scene->setAction(&scene->_action2);
2352 		return true;
2353 	default:
2354 		return NamedObject::startAction(action, event);
2355 	}
2356 }
2357 
2358 /*--------------------------------------------------------------------------*/
2359 
startAction(CursorType action,Event & event)2360 bool Scene590::Exit::startAction(CursorType action, Event &event) {
2361 	ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 100, BF_GLOBALS._player._position.y + 75);
2362 	return true;
2363 }
2364 
2365 /*--------------------------------------------------------------------------*/
2366 
signal()2367 void Scene590::Action1::signal() {
2368 	Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene;
2369 
2370 	switch (_actionIndex++) {
2371 	case 0:
2372 		BF_GLOBALS._player.disableControl();
2373 		BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2374 		ADD_PLAYER_MOVER(220, 132);
2375 		break;
2376 	case 1:
2377 		scene->_stripManager.start(scene->_stripNumber, this);
2378 		break;
2379 	case 2:
2380 		BF_GLOBALS._player.enableControl();
2381 		remove();
2382 		break;
2383 	default:
2384 		break;
2385 	}
2386 }
2387 
signal()2388 void Scene590::Action2::signal() {
2389 	Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene;
2390 
2391 	switch (_actionIndex++) {
2392 	case 0: {
2393 		BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2394 		ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 220, 132);
2395 		break;
2396 	}
2397 	case 1:
2398 		ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 220, 132);
2399 		break;
2400 	case 2:
2401 		BF_GLOBALS._player.setVisage(381);
2402 		BF_GLOBALS._player.setStrip(2);
2403 		BF_GLOBALS._player.setFrame(1);
2404 		BF_GLOBALS._player.setPosition(Common::Point(257, 130));
2405 		BF_GLOBALS._player.animate(ANIM_MODE_4, 3, 1, this);
2406 
2407 		scene->_skip.setStrip(2);
2408 		scene->_skip.animate(ANIM_MODE_5, NULL);
2409 		break;
2410 	case 3:
2411 		scene->_skip.animate(ANIM_MODE_6, NULL);
2412 		BF_GLOBALS._player.animate(ANIM_MODE_5, this);
2413 		break;
2414 	case 4:
2415 		scene->_skip.setStrip(1);
2416 		scene->_skip.animate(ANIM_MODE_1, NULL);
2417 
2418 		BF_GLOBALS._player.setVisage(368);
2419 		BF_GLOBALS._player.setStrip(7);
2420 		BF_GLOBALS._player.setPosition(Common::Point(238, 131));
2421 		BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2422 		scene->_stripManager.start(scene->_stripNumber, this);
2423 		break;
2424 	case 5:
2425 		scene->_sceneMode = 3;
2426 		scene->signal();
2427 		break;
2428 	default:
2429 		break;
2430 	}
2431 }
2432 
2433 /*--------------------------------------------------------------------------*/
2434 
Scene590()2435 Scene590::Scene590(): PalettedScene() {
2436 	_field17DC = _field17DE = _stripNumber = _field17E2 = 0;
2437 }
2438 
synchronize(Serializer & s)2439 void Scene590::synchronize(Serializer &s) {
2440 	PalettedScene::synchronize(s);
2441 	s.syncAsSint16LE(_field17DC);
2442 	s.syncAsSint16LE(_field17DE);
2443 	s.syncAsSint16LE(_stripNumber);
2444 	s.syncAsSint16LE(_field17E2);
2445 }
2446 
postInit(SceneObjectList * OwnerList)2447 void Scene590::postInit(SceneObjectList *OwnerList) {
2448 	PalettedScene::postInit();
2449 	loadScene(590);
2450 
2451 	BF_GLOBALS._sound1.fadeOut2(NULL);
2452 	_sound1.play(18);
2453 	_sound1.fade(100, 5, 10, false, NULL);
2454 
2455 	if (BF_GLOBALS._dayNumber == 0) {
2456 		BF_GLOBALS._dayNumber = 1;
2457 		BF_GLOBALS._bookmark = bEndOfWorkDayOne;
2458 		BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 1);
2459 	}
2460 
2461 	_exit.setDetails(Rect(0, 157, 182, 167), 590, -1, -1, -1, 1, NULL);
2462 
2463 	BF_GLOBALS._player.postInit();
2464 	BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
2465 	BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2466 	BF_GLOBALS._player.setPosition(Common::Point(0, 190));
2467 
2468 	_stripManager.addSpeaker(&_skipSpeaker);
2469 	_stripManager.addSpeaker(&_lauraSpeaker);
2470 	_stripManager.addSpeaker(&_jakeJacketSpeaker);
2471 
2472 	if (BF_GLOBALS.getFlag(onDuty)) {
2473 		BF_GLOBALS._player.setVisage(361);
2474 		BF_GLOBALS._player._moveDiff = Common::Point(6, 2);
2475 	} else {
2476 		BF_GLOBALS._player.setVisage(368);
2477 		BF_GLOBALS._player._moveDiff = Common::Point(6, 2);
2478 
2479 		if ((BF_GLOBALS._bookmark >= bEndOfWorkDayOne) && (BF_GLOBALS._bookmark < bLyleStoppedBy)) {
2480 			_skip.postInit();
2481 			_skip.setVisage(693);
2482 			_skip.setPosition(Common::Point(271, 117));
2483 			_skip.setDetails(590, 26, -1, 27, 1, (SceneItem *)NULL);
2484 
2485 			_laura.postInit();
2486 			_laura.setVisage(692);
2487 			_laura.setPosition(Common::Point(248, 115));
2488 			_laura.setDetails(590, 24, -1, 25, 1, (SceneItem *)NULL);
2489 		}
2490 	}
2491 
2492 	_item2.setDetails(1, 590, 0, -1, 12, 1);
2493 	_item3.setDetails(3, 590, 2, -1, 14, 1);
2494 	_item4.setDetails(20, 590, 3, -1, 15, 1);
2495 	_item5.setDetails(22, 590, 4, -1, 16, 1);
2496 	_item6.setDetails(7, 590, 6, -1, 17, 1);
2497 	_item7.setDetails(7, 590, 6, -1, 18, 1);
2498 	_item8.setDetails(9, 590, 7, -1, 19, 1);
2499 	_item9.setDetails(11, 590, 8, -1, 20, 1);
2500 	_item10.setDetails(13, 590, 9, -1, 21, 1);
2501 	_item11.setDetails(15, 590, 10, -1, 22, 1);
2502 	_item12.setDetails(17, 590, 11, -1, 23, 1);
2503 
2504 	BF_GLOBALS._player.disableControl();
2505 	_sceneMode = 0;
2506 	setAction(&_sequenceManager, this, 5900, &BF_GLOBALS._player, NULL);
2507 }
2508 
signal()2509 void Scene590::signal() {
2510 	static uint32 black = 0;
2511 
2512 	switch (_sceneMode) {
2513 	case 1:
2514 		_sound1.fadeOut2(NULL);
2515 		BF_GLOBALS._sceneManager.changeScene(271);
2516 		break;
2517 	case 2:
2518 		_sound1.fadeOut2(NULL);
2519 		BF_GLOBALS._sceneManager.changeScene(580);
2520 		break;
2521 	case 3:
2522 		BF_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2523 		ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 0, 170);
2524 
2525 		_skip.animate(ANIM_MODE_1, NULL);
2526 		ADD_MOVER_NULL(_skip, 0, 170);
2527 
2528 		_laura.animate(ANIM_MODE_1, NULL);
2529 		ADD_MOVER_NULL(_laura, 0, 170);
2530 
2531 		_sceneMode = 1;
2532 		addFader((byte *)&black, 2, this);
2533 		break;
2534 	default:
2535 		BF_GLOBALS._player.enableControl();
2536 		break;
2537 	}
2538 }
2539 
process(Event & event)2540 void Scene590::process(Event &event) {
2541 	SceneExt::process(event);
2542 
2543 	if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) {
2544 		// Check if the cursor is on an exit
2545 		if (_exit.contains(event.mousePos)) {
2546 			GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
2547 			BF_GLOBALS._events.setCursor(surface);
2548 		} else {
2549 			// In case an exit cursor was being shown, restore the previously selected cursor
2550 			CursorType cursorId = BF_GLOBALS._events.getCursor();
2551 			BF_GLOBALS._events.setCursor(cursorId);
2552 		}
2553 	}
2554 }
2555 
dispatch()2556 void Scene590::dispatch() {
2557 	if (!_action && (BF_GLOBALS._player._position.x < 182) && (BF_GLOBALS._player._position.y > 158)) {
2558 		BF_GLOBALS._player.disableControl();
2559 		_sceneMode = 2;
2560 		setAction(&_sequenceManager, this, 5901, &BF_GLOBALS._player, NULL);
2561 	}
2562 }
2563 
2564 } // End of namespace BlueForce
2565 
2566 } // End of namespace TsAGE
2567