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/scenes.h"
24 #include "tsage/tsage.h"
25 #include "tsage/staticres.h"
26 #include "tsage/ringworld2/ringworld2_scenes3.h"
27 
28 namespace TsAGE {
29 
30 namespace Ringworld2 {
31 
32 /*--------------------------------------------------------------------------
33  * Scene 3100 - ARM Base Hanager
34  *
35  *--------------------------------------------------------------------------*/
36 
Scene3100()37 Scene3100::Scene3100() {
38 	_fadeSound = false;
39 }
40 
synchronize(Serializer & s)41 void Scene3100::synchronize(Serializer &s) {
42 	SceneExt::synchronize(s);
43 
44 	s.syncAsSint16LE(_fadeSound);
45 }
46 
startAction(CursorType action,Event & event)47 bool Scene3100::Guard::startAction(CursorType action, Event &event) {
48 	if (action != CURSOR_TALK)
49 		return SceneActor::startAction(action, event);
50 
51 	Scene3100 *scene = (Scene3100 *)R2_GLOBALS._sceneManager._scene;
52 
53 	R2_GLOBALS._player.disableControl();
54 	scene->_sceneMode = 10;
55 	R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
56 	scene->_stripManager.start(606, scene);
57 	return true;
58 }
59 
postInit(SceneObjectList * OwnerList)60 void Scene3100::postInit(SceneObjectList *OwnerList) {
61 	if (R2_GLOBALS._sceneManager._previousScene == 1000) {
62 		if (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100) {
63 			loadScene(3101);
64 			R2_GLOBALS._uiElements._active = false;
65 		} else {
66 			loadScene(3100);
67 			_sceneBounds = Rect(160, 0, 480, SCREEN_HEIGHT);
68 		}
69 	} else {
70 		loadScene(3100);
71 	}
72 	// Original was doing it twice in a row. Skipped.
73 
74 	if (R2_GLOBALS._sceneManager._previousScene == 3255)
75 		R2_GLOBALS._uiElements._active = false;
76 
77 	SceneExt::postInit();
78 	_stripManager.addSpeaker(&_guardSpeaker);
79 
80 	if (R2_GLOBALS._sceneManager._previousScene == -1)
81 		R2_GLOBALS._sceneManager._previousScene = 1000;
82 
83 	R2_GLOBALS._player.postInit();
84 	R2_GLOBALS._player._characterIndex = R2_QUINN;
85 	R2_GLOBALS._player.disableControl();
86 
87 	_hammerHead.postInit();
88 	_hammerHead2.setDetails(Rect(212, 97, 320, 114), 3100, 3, -1, -1, 1, NULL);
89 	_background.setDetails(Rect(0, 0, 480, 200), 3100, 0, -1, -1, 1, NULL);
90 	_fadeSound = false;
91 
92 	if (R2_GLOBALS._sceneManager._previousScene == 1000) {
93 		if (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100) {
94 			_sceneMode = 3102;
95 			_ghoul.postInit();
96 			_technicians.postInit();
97 			_deadBodies.postInit();
98 			R2_GLOBALS._sound1.play(274);
99 			_sound1.fadeSound(130);
100 			setAction(&_sequenceManager, this, 3102, &_hammerHead, &R2_GLOBALS._player,
101 				&_ghoul, &_technicians, &_deadBodies, NULL);
102 		} else {
103 			_guard.postInit();
104 			_guard.setup(3110, 5, 1);
105 			_guard.changeZoom(50);
106 			_guard.setPosition(Common::Point(10, 149));
107 			_guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);
108 
109 			_technicians.postInit();
110 			_technicians.setup(3103, 1, 1);
111 			_technicians.setPosition(Common::Point(278, 113));
112 			_technicians.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
113 			_technicians.animate(ANIM_MODE_2, NULL);
114 
115 			_fadeSound = true;
116 			_hammerHead.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
117 			R2_GLOBALS._sound1.play(243);
118 			R2_GLOBALS._sound2.play(130);
119 			_sceneMode = 3100;
120 
121 			setAction(&_sequenceManager, this, 3100, &R2_GLOBALS._player, &_hammerHead, NULL);
122 		}
123 	} else if (R2_GLOBALS._sceneManager._previousScene == 3255) {
124 		_sceneMode = 3101;
125 		_miranda.postInit();
126 		_ghoul.postInit();
127 		_fadeSound = true;
128 
129 		setAction(&_sequenceManager, this, 3101, &R2_GLOBALS._player, &_hammerHead,
130 			&_miranda, &_ghoul, NULL);
131 	} else {
132 		_guard.postInit();
133 		_guard.setup(3110, 5, 1);
134 		_guard.changeZoom(50);
135 		_guard.setPosition(Common::Point(10, 149));
136 		_guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);
137 
138 		_technicians.postInit();
139 		_technicians.setup(3103, 1, 1);
140 		_technicians.setPosition(Common::Point(278, 113));
141 		_technicians.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
142 		_technicians.animate(ANIM_MODE_2, NULL);
143 
144 		_hammerHead.postInit();
145 		_hammerHead.setup(3104, 4, 1);
146 		_hammerHead.setPosition(Common::Point(143, 104));
147 		_hammerHead.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
148 
149 		R2_GLOBALS._player.setup(3110, 3, 1);
150 		R2_GLOBALS._player.changeZoom(50);
151 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
152 		R2_GLOBALS._player.setPosition(Common::Point(160, 150));
153 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
154 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
155 
156 		R2_GLOBALS._sound1.play(243);
157 	}
158 
159 	R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 3100;
160 }
161 
remove()162 void Scene3100::remove() {
163 	R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
164 	R2_GLOBALS._sound1.fadeOut2(NULL);
165 	R2_GLOBALS._sound2.fadeOut2(NULL);
166 	_sound1.fadeOut2(NULL);
167 	SceneExt::remove();
168 }
169 
signal()170 void Scene3100::signal() {
171 	switch (_sceneMode) {
172 	case 10:
173 		R2_GLOBALS._player.enableControl(CURSOR_TALK);
174 		break;
175 	case 3100:
176 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
177 		R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
178 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
179 		break;
180 	case 3101:
181 		R2_GLOBALS._sceneManager.changeScene(1000);
182 		break;
183 	case 3102:
184 		R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1000;
185 		R2_GLOBALS._sceneManager.changeScene(1000);
186 		break;
187 	default:
188 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
189 		break;
190 	}
191 }
192 
dispatch()193 void Scene3100::dispatch() {
194 	if ((_sceneMode == 3100) && _fadeSound && (R2_GLOBALS._player._position.y == 104)) {
195 		_fadeSound = false;
196 		R2_GLOBALS._sound2.fadeOut2(NULL);
197 	}
198 
199 	if ((_sceneMode == 3101) && _fadeSound && (R2_GLOBALS._player._position.y < 104)) {
200 		_fadeSound = false;
201 		_sound1.fadeSound(130);
202 	}
203 
204 	Scene::dispatch();
205 }
206 
207 /*--------------------------------------------------------------------------
208  * Scene 3125 - Ghouls dormitory
209  *
210  *--------------------------------------------------------------------------*/
211 
Scene3125()212 Scene3125::Scene3125() {
213 	_soundPlayed = false;
214 }
215 
synchronize(Serializer & s)216 void Scene3125::synchronize(Serializer &s) {
217 	SceneExt::synchronize(s);
218 
219 	s.syncAsSint16LE(_soundPlayed);
220 }
221 
startAction(CursorType action,Event & event)222 bool Scene3125::Background::startAction(CursorType action, Event &event) {
223 	switch (action) {
224 	case CURSOR_USE:
225 		if (_useLineNum != -1)
226 			SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
227 		break;
228 	case CURSOR_LOOK:
229 		if (_lookLineNum != -1)
230 			SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
231 		break;
232 	case CURSOR_TALK:
233 		if (_talkLineNum != -1)
234 			SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
235 		break;
236 	default: {
237 		Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
238 		return scene->display(action, event);
239 		}
240 		break;
241 	}
242 
243 	return true;
244 }
245 
startAction(CursorType action,Event & event)246 bool Scene3125::Table::startAction(CursorType action, Event &event) {
247 	switch (action) {
248 	case CURSOR_USE: {
249 		Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
250 
251 		R2_GLOBALS._player.disableControl();
252 		scene->_sceneMode = 3125;
253 		scene->setAction(&scene->_sequenceManager, scene, 3125, &R2_GLOBALS._player, NULL);
254 		}
255 		break;
256 	case CURSOR_LOOK:
257 		SceneItem::display(3125, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
258 		break;
259 	case CURSOR_TALK:
260 		SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
261 		break;
262 	default:
263 		return SceneHotspot::startAction(action, event);
264 		break;
265 	}
266 
267 	return true;
268 }
269 
startAction(CursorType action,Event & event)270 bool Scene3125::Computer::startAction(CursorType action, Event &event) {
271 	switch (action) {
272 	case CURSOR_USE: {
273 		Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
274 
275 		R2_GLOBALS._player.disableControl();
276 		scene->_ghoul4.postInit();
277 		scene->_sceneMode = 3126;
278 		scene->setAction(&scene->_sequenceManager, scene, 3126, &R2_GLOBALS._player,
279 			&scene->_ghoul1, &scene->_ghoul2, &scene->_ghoul3, &scene->_door,
280 			&scene->_ghoul4, NULL);
281 		}
282 		break;
283 	case CURSOR_LOOK:
284 		SceneItem::display(3125, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
285 		break;
286 	case CURSOR_TALK:
287 		SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
288 		break;
289 	default:
290 		return SceneHotspot::startAction(action, event);
291 		break;
292 	}
293 
294 	return true;
295 }
296 
startAction(CursorType action,Event & event)297 bool Scene3125::Door::startAction(CursorType action, Event &event) {
298 	if (action != CURSOR_USE)
299 		return SceneActor::startAction(action, event);
300 
301 	Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
302 
303 	R2_GLOBALS._player.disableControl();
304 	scene->_sceneMode = 3176;
305 	scene->setAction(&scene->_sequenceManager, scene, 3176, &R2_GLOBALS._player, &scene->_door, NULL);
306 	return true;
307 }
308 
postInit(SceneObjectList * OwnerList)309 void Scene3125::postInit(SceneObjectList *OwnerList) {
310 	loadScene(3125);
311 	SceneExt::postInit();
312 	_soundPlayed = false;
313 
314 	_door.postInit();
315 	_door.setup(3175, 1, 1);
316 	_door.setPosition(Common::Point(35, 72));
317 	_door.setDetails(3125, 12, 13, -1, 1, (SceneItem *)NULL);
318 
319 	_ghoul1.postInit();
320 	_ghoul1.setup(3126, 4, 1);
321 	_ghoul1.setPosition(Common::Point(71, 110));
322 	_ghoul1._numFrames = 20;
323 
324 	_ghoul2.postInit();
325 	_ghoul2.setup(3126, 1, 1);
326 	_ghoul2.setPosition(Common::Point(215, 62));
327 	_ghoul2.fixPriority(71);
328 
329 	_ghoul3.postInit();
330 	_ghoul3.setup(3126, 1, 1);
331 	_ghoul3.setPosition(Common::Point(171, 160));
332 	_ghoul3.fixPriority(201);
333 
334 	_computer.setDetails(12, 3125, 9, 13, -1);
335 	_table.setDetails(11, 3125, 15, 13, -1);
336 	_background.setDetails(Rect(0, 0, 320, 200), 3125, 0, 1, 2, 1, NULL);
337 
338 	R2_GLOBALS._sound1.play(262);
339 	R2_GLOBALS._player.postInit();
340 
341 	if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3250) {
342 		_sceneMode = 3175;
343 		setAction(&_sequenceManager, this, 3175, &R2_GLOBALS._player, &_door, NULL);
344 	} else {
345 		R2_GLOBALS._player.setup(30, 5, 1);
346 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
347 		R2_GLOBALS._player.setPosition(Common::Point(89, 76));
348 		R2_GLOBALS._player.enableControl();
349 	}
350 	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3125;
351 }
352 
signal()353 void Scene3125::signal() {
354 	switch (_sceneMode) {
355 	case 3125:
356 		SceneItem::display(3125, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
357 		_sceneMode = 3127;
358 		setAction(&_sequenceManager, this, 3127, &R2_GLOBALS._player, NULL);
359 		break;
360 	case 3126:
361 		R2_GLOBALS.setFlag(79);
362 		// fall through
363 	case 3176:
364 		R2_GLOBALS._sceneManager.changeScene(3250);
365 		break;
366 	default:
367 		R2_GLOBALS._player.enableControl();
368 		break;
369 	}
370 }
371 
dispatch()372 void Scene3125::dispatch() {
373 	if ((_sceneMode == 3126) && (_ghoul1._frame == 2) && !_soundPlayed) {
374 		R2_GLOBALS._sound1.play(265);
375 		_soundPlayed = true;
376 	}
377 	Scene::dispatch();
378 }
379 
380 /*--------------------------------------------------------------------------
381  * Scene 3150 - Jail
382  *
383  *--------------------------------------------------------------------------*/
384 
startAction(CursorType action,Event & event)385 bool Scene3150::LightFixture::startAction(CursorType action, Event &event) {
386 	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
387 
388 	switch (action) {
389 	case CURSOR_USE:
390 		if (R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150)
391 			return SceneHotspot::startAction(action, event);
392 
393 		R2_GLOBALS._player.disableControl();
394 		scene->_sceneMode = 3154;
395 		scene->setAction(&scene->_sequenceManager, scene, 3154, &R2_GLOBALS._player, &scene->_bulbOrWire, NULL);
396 		return true;
397 	case R2_SUPERCONDUCTOR_WIRE:
398 		if ((R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150) && (R2_GLOBALS.getFlag(75))) {
399 			R2_GLOBALS._player.disableControl();
400 			scene->_bulbOrWire.postInit();
401 			scene->_bulbOrWire._effect = EFFECT_SHADED2;
402 			scene->_bulbOrWire._shade = 5;
403 			scene->_sceneMode = 3155;
404 			scene->setAction(&scene->_sequenceManager, scene, 3155, &R2_GLOBALS._player, &scene->_bulbOrWire, NULL);
405 		} else {
406 			SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
407 		}
408 		return true;
409 	default:
410 		return SceneHotspot::startAction(action, event);
411 		break;
412 	}
413 }
414 
startAction(CursorType action,Event & event)415 bool Scene3150::Toilet::startAction(CursorType action, Event &event) {
416 	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
417 
418 	switch (action) {
419 	case R2_PILLOW:
420 		R2_GLOBALS._player.disableControl();
421 		scene->_water.postInit();
422 		scene->_water._effect = EFFECT_SHADED2;
423 		scene->_water._shade = 3;
424 		R2_GLOBALS._player.disableControl();
425 		scene->_sceneMode = 3158;
426 		scene->setAction(&scene->_sequenceManager, scene, 3158, &R2_GLOBALS._player, &scene->_water, NULL);
427 		return true;
428 	case R2_FOOD_TRAY:
429 		if ((R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150) &&
430 				(R2_INVENTORY.getObjectScene(R2_SUPERCONDUCTOR_WIRE) == 3150)
431 				&& (R2_GLOBALS.getFlag(75))) {
432 			scene->_foodTray.postInit();
433 			scene->_foodTray._effect = EFFECT_SHADED2;
434 			scene->_foodTray._shade = 3;
435 			scene->_foodTray.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
436 
437 			R2_GLOBALS._player.disableControl();
438 			scene->_sceneMode = 3159;
439 			scene->setAction(&scene->_sequenceManager, scene, 3159, &R2_GLOBALS._player, &scene->_foodTray, NULL);
440 		} else {
441 			SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
442 		}
443 		return true;
444 	default:
445 		return SceneHotspot::startAction(action, event);
446 		break;
447 	}
448 }
449 
startAction(CursorType action,Event & event)450 bool Scene3150::Water::startAction(CursorType action, Event &event) {
451 	switch (action) {
452 	case CURSOR_USE: {
453 		if (R2_GLOBALS.getFlag(75))
454 			return SceneActor::startAction(action, event);
455 
456 		Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
457 
458 		R2_GLOBALS._player.disableControl();
459 		scene->_sceneMode = 3151;
460 		scene->setAction(&scene->_sequenceManager, scene, 3151, &R2_GLOBALS._player, &scene->_water, NULL);
461 		return true;
462 		}
463 	case R2_FOOD_TRAY:
464 		return false;
465 	default:
466 		return SceneActor::startAction(action, event);
467 		break;
468 	}
469 }
470 
startAction(CursorType action,Event & event)471 bool Scene3150::FoodTray::startAction(CursorType action, Event &event) {
472 	if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(77)))
473 		return SceneActor::startAction(action, event);
474 
475 	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
476 
477 	R2_GLOBALS._player.disableControl();
478 	scene->_sceneMode = 3157;
479 	scene->setAction(&scene->_sequenceManager, scene, 3157, &R2_GLOBALS._player, &scene->_foodTray, NULL);
480 	return true;
481 }
482 
startAction(CursorType action,Event & event)483 bool Scene3150::ToiletFlush::startAction(CursorType action, Event &event) {
484 	if (action == CURSOR_USE) {
485 		Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
486 
487 		if (R2_GLOBALS.getFlag(75)) {
488 			if (R2_GLOBALS.getFlag(77)) {
489 				R2_GLOBALS._player.disableControl();
490 				if (R2_GLOBALS.getFlag(76)) {
491 					scene->_sceneMode = 3152;
492 					scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
493 				} else {
494 					scene->_sceneMode = 3153;
495 					scene->setAction(&scene->_sequenceManager, scene, 3153, &R2_GLOBALS._player, &scene->_water, NULL);
496 				}
497 			} else {
498 				SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
499 			}
500 		} else {
501 			R2_GLOBALS._player.disableControl();
502 			scene->_sceneMode = 3152;
503 			scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
504 		}
505 		return true;
506 	} else {
507 		return SceneActor::startAction(action, event);
508 	}
509 }
510 
startAction(CursorType action,Event & event)511 bool Scene3150::AirVent::startAction(CursorType action, Event &event) {
512 	if ((action == R2_LASER_HACKSAW) && (!R2_GLOBALS.getFlag(80))) {
513 		Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
514 
515 		R2_GLOBALS._player.disableControl();
516 		scene->_sceneMode = 3160;
517 		scene->setAction(&scene->_sequenceManager, scene, 3160, &R2_GLOBALS._player, &scene->_airVent, NULL);
518 		return true;
519 	}
520 
521 	return SceneActor::startAction(action, event);
522 }
523 
changeScene()524 void Scene3150::DoorExit::changeScene() {
525 	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
526 
527 	_enabled = false;
528 	g_globals->_events.setCursor(CURSOR_ARROW);
529 	R2_GLOBALS._player.disableControl();
530 	scene->_sceneMode = 11;
531 
532 	Common::Point pt(-20, 180);
533 	NpcMover *mover = new NpcMover();
534 	R2_GLOBALS._player.addMover(mover, &pt, scene);
535 }
536 
changeScene()537 void Scene3150::VentExit::changeScene() {
538 	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
539 
540 	_enabled = false;
541 	g_globals->_events.setCursor(CURSOR_ARROW);
542 	R2_GLOBALS._player.disableControl();
543 	scene->_sceneMode = 12;
544 
545 	scene->setAction(&scene->_sequenceManager, scene, 3163, &R2_GLOBALS._player, NULL);
546 }
547 
postInit(SceneObjectList * OwnerList)548 void Scene3150::postInit(SceneObjectList *OwnerList) {
549 	loadScene(3150);
550 	if (R2_GLOBALS._sceneManager._previousScene == -1) {
551 		R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2000);
552 		R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 3100;
553 		R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 0;
554 		R2_GLOBALS._player._characterIndex = R2_MIRANDA;
555 	}
556 	SceneExt::postInit();
557 
558 	if (R2_GLOBALS.getFlag(78)) {
559 		_doorExit.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
560 		_doorExit.setDest(Common::Point(70, 125));
561 	}
562 
563 	if (R2_GLOBALS.getFlag(80)) {
564 		_ventExit.setDetails(Rect(249, 36, 279, 60), EXITCURSOR_NE, 3150);
565 		_ventExit.setDest(Common::Point(241, 106));
566 	}
567 
568 	R2_GLOBALS._player.postInit();
569 	R2_GLOBALS._player.disableControl();
570 
571 	_doorBars.postInit();
572 	_doorBars.setPosition(Common::Point(64, 139));
573 	if (R2_GLOBALS.getFlag(78)) {
574 		_doorBars.setup(3151, 1, 5);
575 		_doorBars.fixPriority(125);
576 	} else {
577 		_doorBars.setup(3151, 1, 1);
578 		_doorBars.setDetails(3150, 8, -1, 9, 1, (SceneItem *)NULL);
579 	}
580 
581 	if (R2_GLOBALS.getFlag(78)) {
582 		_guard.postInit();
583 		_guard.setup(3154, 1, 16);
584 		_guard.setPosition(Common::Point(104, 129));
585 		_guard._effect = EFFECT_SHADED2;
586 		_guard._shade = 3;
587 		_guard.setDetails(3150, 24, -1, -1, -1, (SceneItem *)NULL);
588 	}
589 
590 	_airVent.postInit();
591 	_airVent.setup(3154, 5, 1);
592 	if (R2_GLOBALS.getFlag(80))
593 		_airVent.setPosition(Common::Point(264, 108));
594 	else
595 		_airVent.setPosition(Common::Point(264, 58));
596 	_airVent.fixPriority(50);
597 	_airVent.setDetails(3150, 17, -1, 19, 1, (SceneItem *)NULL);
598 
599 	if (R2_INVENTORY.getObjectScene(R2_PILLOW) == 3150) {
600 		_water.postInit();
601 		if (R2_GLOBALS.getFlag(75)) {
602 			if (R2_GLOBALS.getFlag(76)) {
603 				R2_GLOBALS._walkRegions.disableRegion(1);
604 				R2_GLOBALS._walkRegions.disableRegion(4);
605 				R2_GLOBALS._walkRegions.disableRegion(5);
606 				R2_GLOBALS._walkRegions.disableRegion(6);
607 				_water.setup(3152, 4, 10);
608 				_water.setDetails(3150, 14, -1, -1, 1, (SceneItem *)NULL);
609 			} else {
610 				_water.setup(3152, 7, 4);
611 				_water.setDetails(3150, 13, -1, -1, 1, (SceneItem *)NULL);
612 			}
613 			_water.fixPriority(110);
614 			_water.setPosition(Common::Point(83, 88));
615 			_water._effect = EFFECT_SHADED2;
616 			_water._shade = 3;
617 		} else {
618 			_water.setup(3152, 7, 3);
619 			_water.setPosition(Common::Point(143, 70));
620 			_water.setDetails(3150, 15, -1, -1, 1, (SceneItem *)NULL);
621 		}
622 	}
623 
624 	if (R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) == 3150) {
625 		_bulbOrWire.postInit();
626 		_bulbOrWire.setup(3152, 7, 1);
627 		_bulbOrWire.setPosition(Common::Point(73, 83));
628 	}
629 
630 	if (R2_INVENTORY.getObjectScene(R2_SUPERCONDUCTOR_WIRE) == 3150) {
631 		_bulbOrWire.postInit();
632 		_bulbOrWire.setup(3152, 7, 2);
633 		_bulbOrWire.setPosition(Common::Point(70, 55));
634 		_bulbOrWire.fixPriority(111);
635 		_bulbOrWire._effect = EFFECT_SHADED2;
636 		_bulbOrWire._shade = 5;
637 	}
638 
639 	if (R2_INVENTORY.getObjectScene(R2_FOOD_TRAY) == 3150) {
640 		_foodTray.postInit();
641 		if (R2_GLOBALS.getFlag(77)) {
642 			_foodTray.setup(3152, 7, 8);
643 			_foodTray.setPosition(Common::Point(82, 92));
644 			_foodTray.fixPriority(111);
645 			_foodTray._effect = EFFECT_SHADED2;
646 			_foodTray._shade = 3;
647 		} else {
648 			_foodTray.setup(3152, 7, 7);
649 			_foodTray.setPosition(Common::Point(155, 79));
650 		}
651 		_foodTray.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
652 	}
653 
654 	_toiletFlush.postInit();
655 	_toiletFlush.setup(3152, 7, 6);
656 	_toiletFlush.setPosition(Common::Point(98, 73));
657 	_toiletFlush.setDetails(3150, 43, -1, -1, 1, (SceneItem *)NULL);
658 
659 	_bed.setDetails(12, 3150, 10, -1, 12);
660 	_lightFixture2.setDetails(Rect(186, 17, 210, 36), 3150, 6, -1, -1, 1, NULL);
661 	_bars.setDetails(Rect(61, 21, 92, 41), 3150, 7, -1, -1, 1, NULL);
662 	_lightFixture.setDetails(Rect(63, 48, 78, 58), 3150, 6, -1, -1, 1, NULL);
663 	_toilet.setDetails(Rect(63, 81, 100, 95), 3150, 3, 4, -1, 1, NULL);
664 	_background.setDetails(Rect(0, 0, 200, 320), 3150, 0, 1, 2, 1, NULL);
665 
666 	switch (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA]) {
667 	case 0:
668 		_sceneMode = 3150;
669 		_guard.postInit();
670 		_guard._effect = EFFECT_SHADED2;
671 		_guard._shade = 5;
672 		setAction(&_sequenceManager, this, 3150, &R2_GLOBALS._player, &_guard, &_doorBars, NULL);
673 		break;
674 	case 1200:
675 		_sceneMode = 3162;
676 		setAction(&_sequenceManager, this, 3162, &R2_GLOBALS._player, NULL);
677 		break;
678 	case 3275: {
679 		_sceneMode = 10;
680 		R2_GLOBALS._player.setup(30, 3, 1);
681 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
682 		R2_GLOBALS._player.setPosition(Common::Point(-20, 180));
683 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
684 
685 		Common::Point pt(80, 125);
686 		NpcMover *mover = new NpcMover();
687 		R2_GLOBALS._player.addMover(mover, &pt, this);
688 		break;
689 		}
690 	default:
691 		if ((R2_GLOBALS._mirandaJailState == 1) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2000)
692 				&& (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100)) {
693 			// Moving story on to Miranda getting food delivered
694 			++R2_GLOBALS._mirandaJailState;
695 			_sceneMode = 3156;
696 			_guard.postInit();
697 			_guard._effect = EFFECT_SHADED2;
698 			_guard._shade = 3;
699 
700 			_doorBars.postInit();
701 			_foodTray.postInit();
702 			_foodTray._effect = EFFECT_SHADED2;
703 			_foodTray._shade = 3;
704 
705 			setAction(&_sequenceManager, this, 3156, &R2_GLOBALS._player, &_guard, &_doorBars, &_foodTray, NULL);
706 		} else {
707 			if ((R2_GLOBALS._mirandaJailState != 1) && (R2_GLOBALS._mirandaJailState != 2))
708 				++R2_GLOBALS._mirandaJailState;
709 
710 			R2_GLOBALS._player.setup(30, 3, 1);
711 			R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
712 			R2_GLOBALS._player.setPosition(Common::Point(155, 120));
713 			R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
714 			R2_GLOBALS._player.enableControl();
715 		}
716 	}
717 
718 	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150;
719 }
720 
signal()721 void Scene3150::signal() {
722 	switch (_sceneMode) {
723 	case 11:
724 		R2_GLOBALS._sceneManager.changeScene(3275);
725 		break;
726 	case 12:
727 		R2_GLOBALS._sceneManager.changeScene(1200);
728 		break;
729 	case 3151:
730 		_guard.remove();
731 		R2_INVENTORY.setObjectScene(R2_PILLOW, 3);
732 		R2_GLOBALS._player.enableControl();
733 		break;
734 	case 3153:
735 		R2_GLOBALS.setFlag(76);
736 		_water.setDetails(3150, 14, -1, -1, 3, (SceneItem *)NULL);
737 		_guard.postInit();
738 		_guard.setDetails(3150, 24, -1, -1, 2, (SceneItem *)NULL);
739 		_sceneMode = 3161;
740 		setAction(&_sequenceManager, this, 3161, &_guard, &_doorBars, NULL);
741 		break;
742 	case 3154:
743 		_bulbOrWire.remove();
744 		R2_INVENTORY.setObjectScene(R2_LIGHT_BULB, 3);
745 		R2_GLOBALS._player.enableControl();
746 		break;
747 	case 3155:
748 		R2_INVENTORY.setObjectScene(R2_SUPERCONDUCTOR_WIRE, 3150);
749 		R2_GLOBALS._player.enableControl();
750 		break;
751 	case 3156:
752 		_foodTray.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
753 		R2_INVENTORY.setObjectScene(R2_FOOD_TRAY, 3150);
754 		R2_GLOBALS._player.enableControl();
755 		break;
756 	case 3157:
757 		_foodTray.remove();
758 		R2_INVENTORY.setObjectScene(R2_FOOD_TRAY, 3);
759 		R2_GLOBALS._player.enableControl();
760 		break;
761 	case 3158:
762 		R2_GLOBALS.setFlag(75);
763 		R2_INVENTORY.setObjectScene(R2_PILLOW, 3150);
764 		_water.fixPriority(110);
765 		_water.setDetails(3150, 13, -1, -1, 2, (SceneItem *)NULL);
766 		R2_GLOBALS._player.enableControl();
767 		break;
768 	case 3159:
769 		R2_GLOBALS.setFlag(77);
770 		R2_INVENTORY.setObjectScene(R2_FOOD_TRAY, 3150);
771 		R2_GLOBALS._player.enableControl();
772 		break;
773 	case 3160:
774 		R2_INVENTORY.setObjectScene(R2_TOOLBOX, 3150);
775 		R2_GLOBALS.setFlag(80);
776 		R2_GLOBALS._sceneManager.changeScene(1200);
777 		break;
778 	case 3161:
779 		R2_GLOBALS._sceneItems.remove(&_doorBars);
780 		_doorExit.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
781 		_doorExit.setDest(Common::Point(70, 125));
782 		R2_GLOBALS._walkRegions.disableRegion(1);
783 		R2_GLOBALS._walkRegions.disableRegion(4);
784 		R2_GLOBALS._walkRegions.disableRegion(5);
785 		R2_GLOBALS._walkRegions.disableRegion(6);
786 		R2_GLOBALS.setFlag(78);
787 		R2_GLOBALS._player.enableControl();
788 		break;
789 	default:
790 		R2_GLOBALS._player.enableControl();
791 		break;
792 	}
793 }
794 
dispatch()795 void Scene3150::dispatch() {
796 	if (_foodTray._position.x == 155) {
797 		_foodTray._effect = EFFECT_NONE;
798 		_foodTray._shade = 0;
799 	}
800 
801 	if (_guard._visage == 3154) {
802 		_guard._effect = EFFECT_NONE;
803 		_guard._shade = 0;
804 	}
805 
806 	Scene::dispatch();
807 }
808 
809 /*--------------------------------------------------------------------------
810  * Scene 3175 - Autopsy room
811  *
812  *--------------------------------------------------------------------------*/
813 
startAction(CursorType action,Event & event)814 bool Scene3175::RoomItem::startAction(CursorType action, Event &event) {
815 	switch (action) {
816 	case CURSOR_USE:
817 		if (_useLineNum != -1) {
818 			SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
819 			return true;
820 		}
821 		break;
822 	case CURSOR_LOOK:
823 		if (_lookLineNum != -1) {
824 			SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
825 			return true;
826 		}
827 		break;
828 	case CURSOR_TALK:
829 		if (_talkLineNum != -1) {
830 			SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
831 			return true;
832 		}
833 		break;
834 	default:
835 		break;
836 	}
837 
838 	Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
839 	return scene->display(action, event);
840 }
841 
startAction(CursorType action,Event & event)842 bool Scene3175::Corpse::startAction(CursorType action, Event &event) {
843 	switch (action) {
844 	case CURSOR_USE:
845 		if (_useLineNum != -1) {
846 			SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
847 			return true;
848 		}
849 		break;
850 	case CURSOR_LOOK:
851 		if (_lookLineNum != -1) {
852 			SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
853 			return true;
854 		}
855 		break;
856 	case CURSOR_TALK:
857 		if (_talkLineNum != -1) {
858 			SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
859 			return true;
860 		}
861 		break;
862 	default:
863 		break;
864 	}
865 
866 	Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
867 	return scene->display(action, event);
868 }
869 
startAction(CursorType action,Event & event)870 bool Scene3175::Door::startAction(CursorType action, Event &event) {
871 	switch (action) {
872 	case CURSOR_USE: {
873 		Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
874 
875 		R2_GLOBALS._player.disableControl();
876 		scene->_sceneMode = 3176;
877 		scene->setAction(&scene->_sequenceManager, scene, 3176, &R2_GLOBALS._player, &scene->_door, NULL);
878 		return true;
879 		}
880 		break;
881 	case CURSOR_LOOK:
882 		SceneItem::display(3175, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
883 		return true;
884 		break;
885 	case CURSOR_TALK:
886 		SceneItem::display(3175, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
887 		return true;
888 		break;
889 	default:
890 		return SceneActor::startAction(action, event);
891 		break;
892 	}
893 }
894 
postInit(SceneObjectList * OwnerList)895 void Scene3175::postInit(SceneObjectList *OwnerList) {
896 	loadScene(3175);
897 	SceneExt::postInit();
898 
899 	_door.postInit();
900 	_door.setup(3175, 1, 1);
901 	_door.setPosition(Common::Point(35, 72));
902 	_door.setDetails(3175, 9, 10, -1, 1, (SceneItem *)NULL);
903 
904 	_computer.postInit();
905 	_computer.setup(3175, 2, 1);
906 	_computer.setPosition(Common::Point(87, 148));
907 
908 	_corpse.postInit();
909 	_corpse.setup(3175, 3, 1);
910 	_corpse.setPosition(Common::Point(199, 117));
911 	_corpse.setDetails(3175, 15, 16, 17, 1, (SceneItem *)NULL);
912 
913 	_table.setDetails(12, 3175, 3, 1, 5);
914 	_autopsies.setDetails(11, 3175, 6, 7, 8);
915 	_background.setDetails(Rect(0, 0, 320, 200), 3175, 0, 1, 2, 1, NULL);
916 
917 	R2_GLOBALS._player.postInit();
918 
919 	if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3250) {
920 		R2_GLOBALS._player.setup(30, 5, 1);
921 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
922 		R2_GLOBALS._player.setPosition(Common::Point(126, 77));
923 		R2_GLOBALS._player.enableControl();
924 	} else {
925 		_sceneMode = 3175;
926 		setAction(&_sequenceManager, this, 3175, &R2_GLOBALS._player, &_door, NULL);
927 	}
928 
929 	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3175;
930 }
931 
signal()932 void Scene3175::signal() {
933 	if (_sceneMode == 3176)
934 		R2_GLOBALS._sceneManager.changeScene(3250);
935 	else
936 		R2_GLOBALS._player.enableControl();
937 }
938 
939 /*--------------------------------------------------------------------------
940  * Scene 3200 - Cutscene : Guards - Discussion
941  *
942  *--------------------------------------------------------------------------*/
943 
postInit(SceneObjectList * OwnerList)944 void Scene3200::postInit(SceneObjectList *OwnerList) {
945 	loadScene(3200);
946 	R2_GLOBALS._uiElements._active = false;
947 	SceneExt::postInit();
948 
949 	_stripManager.addSpeaker(&_rockoSpeaker);
950 	_stripManager.addSpeaker(&_jockoSpeaker);
951 	_stripManager.addSpeaker(&_sockoSpeaker);
952 
953 	R2_GLOBALS._player.postInit();
954 	R2_GLOBALS._player.hide();
955 	R2_GLOBALS._player.disableControl();
956 
957 	_rocko.postInit();
958 	_jocko.postInit();
959 	_socko.postInit();
960 
961 	setAction(&_sequenceManager, this, 3200 + R2_GLOBALS._randomSource.getRandomNumber(1),
962 		&_rocko, &_jocko, &_socko, NULL);
963 }
964 
signal()965 void Scene3200::signal() {
966 	R2_GLOBALS._sceneManager.changeScene(1200);
967 }
968 
969 /*--------------------------------------------------------------------------
970  * Scene 3210 - Cutscene : Captain and Private - Discussion
971  *
972  *--------------------------------------------------------------------------*/
973 
postInit(SceneObjectList * OwnerList)974 void Scene3210::postInit(SceneObjectList *OwnerList) {
975 	loadScene(3210);
976 	R2_GLOBALS._uiElements._active = false;
977 	SceneExt::postInit();
978 
979 	_stripManager.addSpeaker(&_privateSpeaker);
980 	_stripManager.addSpeaker(&_captainSpeaker);
981 
982 	R2_GLOBALS._player.postInit();
983 	R2_GLOBALS._player.hide();
984 	R2_GLOBALS._player.disableControl();
985 
986 	_captain.postInit();
987 	_private.postInit();
988 
989 	setAction(&_sequenceManager, this, 3210 + R2_GLOBALS._randomSource.getRandomNumber(1),
990 		&_captain, &_private, NULL);
991 }
992 
signal()993 void Scene3210::signal() {
994 	R2_GLOBALS._sceneManager.changeScene(1200);
995 }
996 
997 /*--------------------------------------------------------------------------
998  * Scene 3220 - Cutscene : Guards in cargo zone
999  *
1000  *--------------------------------------------------------------------------*/
1001 
postInit(SceneObjectList * OwnerList)1002 void Scene3220::postInit(SceneObjectList *OwnerList) {
1003 	loadScene(3220);
1004 	R2_GLOBALS._uiElements._active = false;
1005 	SceneExt::postInit();
1006 
1007 	_stripManager.addSpeaker(&_rockoSpeaker);
1008 	_stripManager.addSpeaker(&_jockoSpeaker);
1009 
1010 	R2_GLOBALS._player.postInit();
1011 	R2_GLOBALS._player.hide();
1012 	R2_GLOBALS._player.disableControl();
1013 
1014 	_rocko.postInit();
1015 	_jocko.postInit();
1016 
1017 	setAction(&_sequenceManager, this, 3220 + R2_GLOBALS._randomSource.getRandomNumber(1),
1018 		&_rocko, &_jocko, NULL);
1019 }
1020 
signal()1021 void Scene3220::signal() {
1022 	R2_GLOBALS._sceneManager.changeScene(1200);
1023 }
1024 
1025 /*--------------------------------------------------------------------------
1026  * Scene 3230 - Cutscene : Guards on duty
1027  *
1028  *--------------------------------------------------------------------------*/
1029 
postInit(SceneObjectList * OwnerList)1030 void Scene3230::postInit(SceneObjectList *OwnerList) {
1031 	loadScene(3230);
1032 	R2_GLOBALS._uiElements._active = false;
1033 	SceneExt::postInit();
1034 
1035 	_stripManager.addSpeaker(&_rockoSpeaker);
1036 	_stripManager.addSpeaker(&_jockoSpeaker);
1037 
1038 	R2_GLOBALS._player.postInit();
1039 	R2_GLOBALS._player.hide();
1040 	R2_GLOBALS._player.disableControl();
1041 
1042 	_rocko.postInit();
1043 	_jocko.postInit();
1044 	_ghoul.postInit();
1045 
1046 	setAction(&_sequenceManager, this, 3230 + R2_GLOBALS._randomSource.getRandomNumber(1),
1047 		&_rocko, &_jocko, &_ghoul, NULL);
1048 }
1049 
signal()1050 void Scene3230::signal() {
1051 	R2_GLOBALS._sceneManager.changeScene(1200);
1052 }
1053 
1054 /*--------------------------------------------------------------------------
1055  * Scene 3240 - Cutscene : Teal monolog
1056  *
1057  *--------------------------------------------------------------------------*/
1058 
postInit(SceneObjectList * OwnerList)1059 void Scene3240::postInit(SceneObjectList *OwnerList) {
1060 	loadScene(3240);
1061 	R2_GLOBALS._uiElements._active = false;
1062 	SceneExt::postInit();
1063 
1064 	_stripManager.addSpeaker(&_tealSpeaker);
1065 	_stripManager.addSpeaker(&_webbsterSpeaker);
1066 	_stripManager.addSpeaker(&_mirandaSpeaker);
1067 
1068 	R2_GLOBALS._player.postInit();
1069 	R2_GLOBALS._player.hide();
1070 	R2_GLOBALS._player.disableControl();
1071 
1072 	_teal.postInit();
1073 	_webbster.postInit();
1074 
1075 	setAction(&_sequenceManager, this, 3240 + R2_GLOBALS._randomSource.getRandomNumber(1),
1076 		&_teal, &_webbster, NULL);
1077 }
1078 
signal()1079 void Scene3240::signal() {
1080 	R2_GLOBALS._sceneManager.changeScene(1200);
1081 }
1082 
1083 /*--------------------------------------------------------------------------
1084  * Scene 3245 - Cutscene : Discussions with Dr. Tomko
1085  *
1086  *--------------------------------------------------------------------------*/
1087 
postInit(SceneObjectList * OwnerList)1088 void Scene3245::postInit(SceneObjectList *OwnerList) {
1089 	loadScene(3245);
1090 	R2_GLOBALS._uiElements._active = false;
1091 	SceneExt::postInit();
1092 
1093 	_stripManager.addSpeaker(&_ralfSpeaker);
1094 	_stripManager.addSpeaker(&_tomkoSpeaker);
1095 
1096 	R2_GLOBALS._player.postInit();
1097 	R2_GLOBALS._player.hide();
1098 	R2_GLOBALS._player.disableControl();
1099 
1100 	_ralf.postInit();
1101 	_tomko.postInit();
1102 
1103 	if (R2_GLOBALS._scientistConvIndex < 4)
1104 		++R2_GLOBALS._scientistConvIndex;
1105 
1106 	if (R2_GLOBALS._scientistConvIndex >= 4) {
1107 		SceneItem::display(1200, 7, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1108 		signal();
1109 	} else {
1110 		setAction(&_sequenceManager, this, 3244 + R2_GLOBALS._scientistConvIndex,
1111 			&_ralf, &_tomko, NULL);
1112 	}
1113 }
1114 
signal()1115 void Scene3245::signal() {
1116 	R2_GLOBALS._sceneManager.changeScene(1200);
1117 }
1118 
1119 /*--------------------------------------------------------------------------
1120  * Scene 3250 - Room with large stasis field negator
1121  *
1122  *--------------------------------------------------------------------------*/
1123 
startAction(CursorType action,Event & event)1124 bool Scene3250::Item::startAction(CursorType action, Event &event) {
1125 	switch (action) {
1126 	case CURSOR_USE:
1127 		if (_useLineNum != -1) {
1128 			SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
1129 			return true;
1130 		}
1131 		break;
1132 	case CURSOR_LOOK:
1133 		if (_lookLineNum != -1) {
1134 			SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
1135 			return true;
1136 		}
1137 		break;
1138 	case CURSOR_TALK:
1139 		if (_talkLineNum != -1) {
1140 			SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
1141 			return true;
1142 		}
1143 		break;
1144 	default:
1145 		break;
1146 	}
1147 
1148 	Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
1149 	return scene->display(action, event);
1150 }
1151 
startAction(CursorType action,Event & event)1152 bool Scene3250::Door::startAction(CursorType action, Event &event) {
1153 	if (action != CURSOR_USE)
1154 		return SceneActor::startAction(action, event);
1155 
1156 	Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
1157 	R2_GLOBALS._player.disableControl();
1158 
1159 	switch(_position.x) {
1160 	case 25:
1161 		scene->_sceneMode = 3262;
1162 		scene->setAction(&scene->_sequenceManager, scene, 3262, &R2_GLOBALS._player, &scene->_leftDoor, NULL);
1163 		break;
1164 	case 259:
1165 		scene->_sceneMode = 3260;
1166 		scene->setAction(&scene->_sequenceManager, scene, 3260, &R2_GLOBALS._player, &scene->_topDoor, NULL);
1167 		break;
1168 	case 302:
1169 		scene->_sceneMode = 3261;
1170 		scene->setAction(&scene->_sequenceManager, scene, 3261, &R2_GLOBALS._player, &scene->_rightDoor, NULL);
1171 		break;
1172 	default:
1173 		break;
1174 	}
1175 	return true;
1176 }
1177 
postInit(SceneObjectList * OwnerList)1178 void Scene3250::postInit(SceneObjectList *OwnerList) {
1179 	loadScene(3250);
1180 
1181 	if (R2_GLOBALS._sceneManager._previousScene == -1) {
1182 		R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1200;
1183 		R2_GLOBALS._player._characterIndex = R2_MIRANDA;
1184 	}
1185 
1186 	SceneExt::postInit();
1187 	_leftDoor.postInit();
1188 	_leftDoor.setup(3250, 6, 1);
1189 	_leftDoor.setPosition(Common::Point(25, 148));
1190 	_leftDoor.fixPriority(10);
1191 	_leftDoor.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
1192 
1193 	_topDoor.postInit();
1194 	_topDoor.setup(3250, 4, 1);
1195 	_topDoor.setPosition(Common::Point(259, 126));
1196 	_topDoor.fixPriority(10);
1197 	_topDoor.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
1198 
1199 	_rightDoor.postInit();
1200 	_rightDoor.setup(3250, 5, 1);
1201 	_rightDoor.setPosition(Common::Point(302, 138));
1202 	_rightDoor.fixPriority(10);
1203 	_rightDoor.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
1204 
1205 	_floodLights.setDetails(Rect(119, 111, 149, 168), 3250, 6, 7, 2, 1, NULL);
1206 	_tnuctipunShip.setDetails(Rect(58, 85, 231, 138), 3250, 12, 7, 2, 1, NULL);
1207 	_negator.setDetails(12, 3250, 3, 1, 2);
1208 	_background.setDetails(Rect(0, 0, 320, 200), 3250, 0, 1, 2, 1, NULL);
1209 
1210 	R2_GLOBALS._player.postInit();
1211 
1212 	switch (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA]) {
1213 	case 1200:
1214 		_sceneMode = 3250;
1215 		_grate.postInit();
1216 		R2_GLOBALS._player._effect = EFFECT_NONE;
1217 		setAction(&_sequenceManager, this, 3250, &R2_GLOBALS._player, &_grate, NULL);
1218 		break;
1219 	case 3125:
1220 		if (R2_GLOBALS.getFlag(79)) {
1221 			_sceneMode = 3254;
1222 			_ghoul1.postInit();
1223 			_ghoul1._effect = EFFECT_SHADED;
1224 			_ghoul2.postInit();
1225 			_ghoul2._effect = EFFECT_SHADED;
1226 			_ghoul3.postInit();
1227 			_ghoul3._effect = EFFECT_SHADED;
1228 			setAction(&_sequenceManager, this, 3254, &R2_GLOBALS._player, &_rightDoor,
1229 				&_ghoul1, &_ghoul2, &_ghoul3, &_leftDoor, NULL);
1230 		} else {
1231 			_sceneMode = 3252;
1232 			setAction(&_sequenceManager, this, 3252, &R2_GLOBALS._player, &_rightDoor, NULL);
1233 		}
1234 		break;
1235 	case 3175:
1236 		_sceneMode = 3251;
1237 		setAction(&_sequenceManager, this, 3251, &R2_GLOBALS._player, &_topDoor, NULL);
1238 		break;
1239 	case 3255:
1240 		_sceneMode = 3253;
1241 		setAction(&_sequenceManager, this, 3253, &R2_GLOBALS._player, &_leftDoor, NULL);
1242 		break;
1243 	default:
1244 		R2_GLOBALS._player.setup(31, 3, 1);
1245 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1246 		R2_GLOBALS._player.setPosition(Common::Point(185, 150));
1247 		R2_GLOBALS._player.enableControl();
1248 		break;
1249 	}
1250 
1251 	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3250;
1252 }
1253 
signal()1254 void Scene3250::signal() {
1255 	switch(_sceneMode) {
1256 	case 3250:
1257 		R2_GLOBALS._player._effect = EFFECT_SHADED;
1258 		R2_GLOBALS._player.enableControl();
1259 		break;
1260 	case 3254:
1261 	//No break on purpose
1262 	case 3262:
1263 		R2_GLOBALS._sceneManager.changeScene(3255);
1264 		break;
1265 	case 3260:
1266 		R2_GLOBALS._sceneManager.changeScene(3175);
1267 		break;
1268 	case 3261:
1269 		R2_GLOBALS._sceneManager.changeScene(3125);
1270 		break;
1271 	default:
1272 		R2_GLOBALS._player.enableControl();
1273 		break;
1274 	}
1275 }
1276 
dispatch()1277 void Scene3250::dispatch() {
1278 	if ((R2_GLOBALS._player._visage == 3250) && (R2_GLOBALS._player._strip == 3) && (R2_GLOBALS._player._effect == EFFECT_NONE)) {
1279 		R2_GLOBALS._player._effect = EFFECT_SHADED2;
1280 		R2_GLOBALS._player._shade = 6;
1281 	}
1282 
1283 	Scene::dispatch();
1284 }
1285 
1286 /*--------------------------------------------------------------------------
1287  * Scene 3255 - Guard Post
1288  *
1289  *--------------------------------------------------------------------------*/
1290 
postInit(SceneObjectList * OwnerList)1291 void Scene3255::postInit(SceneObjectList *OwnerList) {
1292 	loadScene(3255);
1293 	SceneExt::postInit();
1294 
1295 	_stripManager.addSpeaker(&_quinnSpeaker);
1296 	_stripManager.addSpeaker(&_mirandaSpeaker);
1297 
1298 	if (R2_GLOBALS._sceneManager._previousScene == -1)
1299 		R2_GLOBALS.setFlag(79);
1300 
1301 	R2_GLOBALS._player.postInit();
1302 	R2_GLOBALS._player.disableControl();
1303 
1304 	if (R2_GLOBALS.getFlag(79)) {
1305 		R2_GLOBALS._sound1.play(267);
1306 		R2_GLOBALS._sound2.play(268);
1307 		_sceneMode = 3257;
1308 		_door.postInit();
1309 		_quinn.postInit();
1310 		_quinn._effect = EFFECT_SHADED;
1311 		setAction(&_sequenceManager, this, 3257, &R2_GLOBALS._player, &_quinn, &_door, NULL);
1312 	} else {
1313 		_teal.postInit();
1314 		_teal.setup(303, 1, 1);
1315 		_teal.setPosition(Common::Point(208, 128));
1316 		_guard.postInit();
1317 		_guard.setup(3107, 3, 1);
1318 		_guard.setPosition(Common::Point(230, 127));
1319 		_sceneMode = 3255;
1320 		setAction(&_sequenceManager, this, 3255, &R2_GLOBALS._player, NULL);
1321 	}
1322 	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3255;
1323 }
1324 
signal()1325 void Scene3255::signal() {
1326 	switch (_sceneMode) {
1327 	case 10:
1328 		_sceneMode = 3258;
1329 		_ghoul1.postInit();
1330 		_ghoul2.postInit();
1331 		_ghoul3.postInit();
1332 		setAction(&_sequenceManager, this, 3258, &R2_GLOBALS._player, &_quinn,
1333 			&_door, &_ghoul1, &_ghoul2, &_ghoul3, NULL);
1334 		break;
1335 	case 3256:
1336 		R2_GLOBALS._sceneManager.changeScene(3250);
1337 		break;
1338 	case 3257:
1339 		_sceneMode = 10;
1340 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1341 		_stripManager.start(607, this);
1342 		break;
1343 	case 3258:
1344 		R2_GLOBALS._sceneManager.changeScene(3100);
1345 		break;
1346 	default:
1347 		SceneItem::display(3255, 0, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1348 		_sceneMode = 3256;
1349 		setAction(&_sequenceManager, this, 3256, &R2_GLOBALS._player, NULL);
1350 	}
1351 }
1352 
dispatch()1353 void Scene3255::dispatch() {
1354 	if (R2_GLOBALS.getFlag(79)) {
1355 		if (_ghoul1._position.y >= 95) {
1356 			if (_ghoul1._position.y <= 110)
1357 				_ghoul1._shade = 6 - (_ghoul1._position.y - 95) / 3;
1358 			else
1359 				_ghoul1._effect = EFFECT_SHADED;
1360 		} else {
1361 			_ghoul1._effect = EFFECT_SHADED2;
1362 			_ghoul1._shade = 6;
1363 		}
1364 
1365 		if (_ghoul2._position.y >= 95) {
1366 			if (_ghoul2._position.y <= 110)
1367 				_ghoul2._shade = 6 - (_ghoul2._position.y - 95) / 3;
1368 			else
1369 				_ghoul2._effect = EFFECT_SHADED;
1370 		} else {
1371 			_ghoul2._effect = EFFECT_SHADED2;
1372 			_ghoul2._shade = 6;
1373 		}
1374 
1375 		if (_ghoul3._position.y >= 95) {
1376 			if (_ghoul3._position.y <= 110)
1377 				_ghoul3._shade = 6 - (_ghoul3._position.y - 95) / 3;
1378 			else
1379 				_ghoul3._effect = EFFECT_SHADED;
1380 		} else {
1381 			_ghoul3._effect = EFFECT_SHADED2;
1382 			_ghoul3._shade = 6;
1383 		}
1384 	}
1385 
1386 	if ((R2_GLOBALS._player._position.x > 250) && (R2_GLOBALS._player._shade == 1)) {
1387 		R2_GLOBALS._player._effect = EFFECT_SHADED2;
1388 		_quinn._effect = EFFECT_SHADED2;
1389 	}
1390 	Scene::dispatch();
1391 }
1392 
1393 /*--------------------------------------------------------------------------
1394  * Scene 3260 - Computer room
1395  *
1396  *--------------------------------------------------------------------------*/
1397 
startAction(CursorType action,Event & event)1398 bool Scene3260::Door::startAction(CursorType action, Event &event) {
1399 	if (action != CURSOR_USE)
1400 		return SceneActor::startAction(action, event);
1401 
1402 	Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
1403 
1404 	R2_GLOBALS._player.disableControl();
1405 	scene->_sceneMode = 3271;
1406 	scene->setAction(&scene->_sequenceManager, scene, 3271, &R2_GLOBALS._player, &scene->_door, NULL);
1407 	return true;
1408 }
1409 
startAction(CursorType action,Event & event)1410 bool Scene3260::Toolbox::startAction(CursorType action, Event &event) {
1411 	if (action != CURSOR_USE)
1412 		return SceneActor::startAction(action, event);
1413 
1414 	Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
1415 
1416 	R2_GLOBALS._player.disableControl();
1417 	scene->_sceneMode = 3272;
1418 	scene->setAction(&scene->_sequenceManager, scene, 3272, &R2_GLOBALS._player, &scene->_toolbox, NULL);
1419 	return true;
1420 }
1421 
signal()1422 void Scene3260::Action1::signal() {
1423 	SceneObjectExt *fmtObj = (SceneObjectExt *) _endHandler;
1424 
1425 	fmtObj->setFrame(R2_GLOBALS._randomSource.getRandomNumber(6));
1426 	setDelay(120 + R2_GLOBALS._randomSource.getRandomNumber(179));
1427 }
1428 
postInit(SceneObjectList * OwnerList)1429 void Scene3260::postInit(SceneObjectList *OwnerList) {
1430 	loadScene(3260);
1431 	R2_GLOBALS._player._characterIndex = R2_MIRANDA;
1432 	SceneExt::postInit();
1433 	R2_GLOBALS._sound1.play(285);
1434 
1435 	_door.postInit();
1436 	_door.setup(3260, 6, 1);
1437 	_door.setPosition(Common::Point(40, 106));
1438 	_door.setDetails(3260, 18, 1, -1, 1, (SceneItem *)NULL);
1439 
1440 	if (R2_INVENTORY.getObjectScene(R2_TOOLBOX) == 3260) {
1441 		_toolbox.postInit();
1442 		_toolbox.setup(3260, 7, 1);
1443 		_toolbox.setPosition(Common::Point(202, 66));
1444 		_toolbox.setDetails(3260, 12, 1, -1, 1, (SceneItem *)NULL);
1445 	}
1446 
1447 	_sceeen1.postInit();
1448 	_sceeen1.setup(3260, 1, 1);
1449 	_sceeen1.setPosition(Common::Point(93, 73));
1450 	_sceeen1.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1451 	_sceeen1.setAction(&_action1, &_sceeen1);
1452 
1453 	_screen2.postInit();
1454 	_screen2.setup(3260, 2, 1);
1455 	_screen2.setPosition(Common::Point(142, 63));
1456 	_screen2.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1457 	_screen2.setAction(&_action2, &_screen2);
1458 
1459 	_screen3.postInit();
1460 	_screen3.setup(3260, 2, 1);
1461 	_screen3.setPosition(Common::Point(166, 54));
1462 	_screen3.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1463 	_screen3.setAction(&_action3, &_screen3);
1464 
1465 	_screen4.postInit();
1466 	_screen4.setup(3260, 2, 1);
1467 	_screen4.setPosition(Common::Point(190, 46));
1468 	_screen4.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1469 	_screen4.setAction(&_action4, &_screen4);
1470 
1471 	_screen5.postInit();
1472 	_screen5.setup(3260, 2, 1);
1473 	_screen5.setPosition(Common::Point(142, 39));
1474 	_screen5.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1475 	_screen5.setAction(&_action5, &_screen5);
1476 
1477 	_screen6.postInit();
1478 	_screen6.setup(3260, 2, 1);
1479 	_screen6.setPosition(Common::Point(166, 30));
1480 	_screen6.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1481 	_screen6.setAction(&_action6, &_screen6);
1482 
1483 	_screen7.postInit();
1484 	_screen7.setup(3260, 2, 1);
1485 	_screen7.setPosition(Common::Point(190, 22));
1486 	_screen7.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1487 	_screen7.setAction(&_action7, &_screen7);
1488 
1489 	_screen8.postInit();
1490 	_screen8.setup(3260, 2, 1);
1491 	_screen8.setPosition(Common::Point(142, 14));
1492 	_screen8.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1493 	_screen8.setAction(&_action8, &_screen8);
1494 
1495 	_screen9.postInit();
1496 	_screen9.setup(3260, 2, 1);
1497 	_screen9.setPosition(Common::Point(166, 6));
1498 	_screen9.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1499 	_screen9.setAction(&_action9, &_screen9);
1500 
1501 	_securityConsole.postInit();
1502 	_securityConsole.setup(3260, 3, 1);
1503 	_securityConsole.setPosition(Common::Point(265, 163));
1504 	_securityConsole.fixPriority(180);
1505 	_securityConsole._numFrames = 10;
1506 	_securityConsole.setDetails(3260, 6, 1, 8, 1, (SceneItem *)NULL);
1507 	_securityConsole.animate(ANIM_MODE_2, NULL);
1508 
1509 	_computerConsole.postInit();
1510 	_computerConsole.setup(3260, 4, 1);
1511 	_computerConsole.setPosition(Common::Point(127, 108));
1512 	_computerConsole.fixPriority(120);
1513 	_computerConsole.setAction(&_action11, &_computerConsole);
1514 	_computerConsole._numFrames = 15;
1515 	_computerConsole.setDetails(3260, 6, 1, 8, 1, (SceneItem *)NULL);
1516 	_computerConsole.animate(ANIM_MODE_2, NULL);
1517 
1518 	_lightingConsole.postInit();
1519 	_lightingConsole.setup(3260, 5, 1);
1520 	_lightingConsole.setPosition(Common::Point(274, 65));
1521 	_lightingConsole.setAction(&_action12, &_lightingConsole);
1522 	_lightingConsole._numFrames = 5;
1523 	_lightingConsole.setDetails(3260, 9, 1, 11, 1, (SceneItem *)NULL);
1524 	_lightingConsole.animate(ANIM_MODE_2, NULL);
1525 
1526 	_background.setDetails(Rect(0, 0, 320, 200), 3260, 0, 1, 2, 1, NULL);
1527 	R2_GLOBALS._player.postInit();
1528 
1529 	if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3275) {
1530 		_sceneMode = 3270;
1531 		setAction(&_sequenceManager, this, 3270, &R2_GLOBALS._player, &_door, NULL);
1532 	} else {
1533 		R2_GLOBALS._player.setup(30, 5, 1);
1534 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1535 		R2_GLOBALS._player.setPosition(Common::Point(53, 113));
1536 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1537 		R2_GLOBALS._player.enableControl();
1538 	}
1539 	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3260;
1540 }
1541 
remove()1542 void Scene3260::remove() {
1543 	R2_GLOBALS._sound1.fadeOut2(NULL);
1544 	SceneExt::remove();
1545 }
1546 
signal()1547 void Scene3260::signal() {
1548 	switch (_sceneMode) {
1549 	case 3271:
1550 		R2_GLOBALS._sceneManager.changeScene(3275);
1551 		break;
1552 	case 3272:
1553 		_sceneMode = 3273;
1554 		R2_GLOBALS._events.setCursor(CURSOR_WALK);
1555 		SceneItem::display(3260, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
1556 		R2_GLOBALS._player.disableControl();
1557 		R2_INVENTORY.setObjectScene(R2_TOOLBOX, 3);
1558 		R2_INVENTORY.setObjectScene(R2_LASER_HACKSAW, 3);
1559 		setAction(&_sequenceManager, this, 3273, &R2_GLOBALS._player, &_toolbox, NULL);
1560 		break;
1561 	case 3273:
1562 		_screen4.remove();
1563 		R2_GLOBALS._player.enableControl();
1564 		break;
1565 	default:
1566 		R2_GLOBALS._player.enableControl();
1567 		break;
1568 	}
1569 }
1570 
1571 /*--------------------------------------------------------------------------
1572  * Scene 3275 - Hall
1573  *
1574  *--------------------------------------------------------------------------*/
1575 
startAction(CursorType action,Event & event)1576 bool Scene3275::Door::startAction(CursorType action, Event &event) {
1577 	if (action != CURSOR_USE)
1578 		return SceneActor::startAction(action, event);
1579 
1580 	Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;
1581 
1582 	R2_GLOBALS._player.disableControl();
1583 	scene->_sceneMode = 3275;
1584 	scene->setAction(&scene->_sequenceManager, scene, 3275, &R2_GLOBALS._player, &scene->_door, NULL);
1585 	return true;
1586 }
1587 
changeScene()1588 void Scene3275::CellExit::changeScene() {
1589 	Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;
1590 
1591 	scene->_sceneMode = 0;
1592 	g_globals->_events.setCursor(CURSOR_ARROW);
1593 	R2_GLOBALS._player.disableControl();
1594 	scene->_sceneMode = 10;
1595 	Common::Point pt(418, 118);
1596 	NpcMover *mover = new NpcMover();
1597 	R2_GLOBALS._player.addMover(mover, &pt, scene);
1598 }
1599 
postInit(SceneObjectList * OwnerList)1600 void Scene3275::postInit(SceneObjectList *OwnerList) {
1601 	loadScene(3275);
1602 
1603 	if (R2_GLOBALS._sceneManager._previousScene == -1)
1604 		R2_GLOBALS._sceneManager._previousScene = 3260;
1605 
1606 	if (R2_GLOBALS._sceneManager._previousScene == 3150)
1607 		_sceneBounds = Rect(160, 0, 480, 200);
1608 
1609 	SceneExt::postInit();
1610 	_cellExit.setDetails(Rect(398, 60, 439, 118), SHADECURSOR_UP, 3150);
1611 	_cellExit.setDest(Common::Point(418, 128));
1612 
1613 	_doorFrame.postInit();
1614 	_doorFrame.setup(3275, 1, 7);
1615 	_doorFrame.setPosition(Common::Point(419, 119));
1616 
1617 	_door.postInit();
1618 	_door.setup(3275, 2, 1);
1619 	_door.setPosition(Common::Point(56, 118));
1620 	_door.setDetails(3275, 3, 4, -1, 1, (SceneItem *)NULL);
1621 
1622 	_emptyCell1.setDetails(Rect(153, 58, 200, 120), 3275, 6, 7, 8, 1, NULL);
1623 	_emptyCell2.setDetails(Rect(275, 58, 331, 120), 3275, 6, 7, 8, 1, NULL);
1624 	_securityBeams1.setDetails(Rect(0, 66, 22, 127), 3275, 9, 10, 11, 1, NULL);
1625 	_securityBeams2.setDetails(Rect(457, 66, 480, 127), 3275, 9, 10, 11, 1, NULL);
1626 	_background.setDetails(Rect(0, 0, 480, 200), 3275, 0, 1, 2, 1, NULL);
1627 
1628 	R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
1629 	R2_GLOBALS._player.postInit();
1630 	R2_GLOBALS._player.disableControl();
1631 	if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3150) {
1632 		_sceneMode = 11;
1633 		R2_GLOBALS._player.setup(30, 3, 1);
1634 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1635 		R2_GLOBALS._player.setPosition(Common::Point(418, 118));
1636 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1637 		Common::Point pt(418, 128);
1638 		NpcMover *mover = new NpcMover();
1639 		R2_GLOBALS._player.addMover(mover, &pt, this);
1640 	} else if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3260) {
1641 		_sceneMode = 3276;
1642 		setAction(&_sequenceManager, this, 3276, &R2_GLOBALS._player, &_door, NULL);
1643 	} else {
1644 		R2_GLOBALS._player.setup(30, 3, 1);
1645 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1646 		R2_GLOBALS._player.setPosition(Common::Point(245, 135));
1647 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1648 		R2_GLOBALS._player.enableControl();
1649 	}
1650 	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3275;
1651 }
1652 
signal()1653 void Scene3275::signal() {
1654 	switch (_sceneMode) {
1655 	case 10:
1656 		R2_GLOBALS._sceneManager.changeScene(3150);
1657 		break;
1658 	case 3275:
1659 		R2_GLOBALS._sceneManager.changeScene(3260);
1660 		break;
1661 	default:
1662 		R2_GLOBALS._player.enableControl();
1663 		break;
1664 	}
1665 }
1666 
1667 /*--------------------------------------------------------------------------
1668  * Scene 3350 - Cutscene - Ship landing
1669  *
1670  *--------------------------------------------------------------------------*/
1671 
postInit(SceneObjectList * OwnerList)1672 void Scene3350::postInit(SceneObjectList *OwnerList) {
1673 	loadScene(3350);
1674 	R2_GLOBALS._uiElements._active = false;
1675 	SceneExt::postInit();
1676 	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
1677 	R2_GLOBALS._sound2.play(310);
1678 
1679 	_rotation = R2_GLOBALS._scenePalette.addRotation(176, 203, 1);
1680 	_rotation->setDelay(3);
1681 
1682 	R2_GLOBALS._player.postInit();
1683 	R2_GLOBALS._player.hide();
1684 	R2_GLOBALS._player.disableControl();
1685 
1686 	_miranda.postInit();
1687 	_miranda.hide();
1688 	_seeker.postInit();
1689 	_seeker.hide();
1690 	_webbster.postInit();
1691 	_webbster.hide();
1692 	_seatedPeople.postInit();
1693 	_seatedPeople.hide();
1694 	_shipFront.postInit();
1695 	_shipFront.hide();
1696 	_canopy.postInit();
1697 	_canopy.hide();
1698 	_ship.postInit();
1699 	_ship.hide();
1700 	_landedShip.postInit();
1701 	_landedShip.hide();
1702 	_shipShadow.postInit();
1703 	_shipShadow.hide();
1704 
1705 	_sceneMode = 3350;
1706 	setAction(&_sequenceManager, this, _sceneMode, &_ship, &_landedShip, &_shipShadow, NULL);
1707 }
1708 
remove()1709 void Scene3350::remove() {
1710 	R2_GLOBALS._sound2.fadeOut2(NULL);
1711 	SceneExt::remove();
1712 }
1713 
signal()1714 void Scene3350::signal() {
1715 	switch (_sceneMode) {
1716 	case 3350:
1717 		_sceneMode = 3351;
1718 		setAction(&_sequenceManager, this, 3351, &_seatedPeople, &_shipFront, &_canopy, NULL);
1719 		break;
1720 	case 3351:
1721 		_sceneMode = 3352;
1722 		setAction(&_sequenceManager, this, 3352, &_seatedPeople, &R2_GLOBALS._player,
1723 			&_miranda, &_seeker, &_webbster, NULL);
1724 		break;
1725 	case 3352:
1726 		R2_GLOBALS._sceneManager.changeScene(3395);
1727 		break;
1728 	default:
1729 		R2_GLOBALS._player.enableControl();
1730 		break;
1731 	}
1732 }
1733 
1734 /*--------------------------------------------------------------------------
1735  * Scene 3375 - Circular Walkway
1736  *
1737  *--------------------------------------------------------------------------*/
1738 
synchronize(Serializer & s)1739 void Scene3375::synchronize(Serializer &s) {
1740 	SceneExt::synchronize(s);
1741 
1742 	s.syncAsSint16LE(_newSceneMode);
1743 	for (int i = 0; i < 4; ++i)
1744 		s.syncAsSint16LE(_sceneAreas[i]);
1745 }
1746 
enterArea(int sceneMode)1747 void Scene3375::enterArea(int sceneMode) {
1748 	switch (sceneMode) {
1749 	case 3379:
1750 		R2_GLOBALS._player.setPosition(Common::Point(0, 155));
1751 		_companion1.setPosition(Common::Point(-20, 163));
1752 		_companion2.setPosition(Common::Point(-5, 150));
1753 		_webbster.setPosition(Common::Point(-20, 152));
1754 		break;
1755 	case 3380:
1756 		++R2_GLOBALS._walkwaySceneNumber;
1757 		if (R2_GLOBALS._walkwaySceneNumber >= 4)
1758 			R2_GLOBALS._walkwaySceneNumber = 0;
1759 
1760 		loadScene(_sceneAreas[R2_GLOBALS._walkwaySceneNumber]);
1761 
1762 		R2_GLOBALS._uiElements.show();
1763 		R2_GLOBALS._player.setStrip(4);
1764 		R2_GLOBALS._player.setPosition(Common::Point(148, 230));
1765 
1766 		_companion1.setPosition(Common::Point(191, 274));
1767 		_companion1._effect = EFFECT_SHADED;
1768 		_companion2.setPosition(Common::Point(124, 255));
1769 		_companion2._effect = EFFECT_SHADED;
1770 		_webbster.setPosition(Common::Point(155, 245));
1771 		_webbster._effect = EFFECT_SHADED;
1772 		break;
1773 	case 3381:
1774 		--R2_GLOBALS._walkwaySceneNumber;
1775 		if (R2_GLOBALS._walkwaySceneNumber < 0)
1776 			R2_GLOBALS._walkwaySceneNumber = 3;
1777 
1778 		loadScene(_sceneAreas[R2_GLOBALS._walkwaySceneNumber]);
1779 
1780 		R2_GLOBALS._uiElements.show();
1781 		R2_GLOBALS._player.setStrip(6);
1782 		R2_GLOBALS._player.setPosition(Common::Point(201, 131));
1783 
1784 		_companion1.setPosition(Common::Point(231, 127));
1785 		_companion1._effect = EFFECT_SHADED;
1786 		_companion2.setPosition(Common::Point(231, 127));
1787 		_companion2._effect = EFFECT_SHADED;
1788 		_webbster.setPosition(Common::Point(231, 127));
1789 		_webbster._effect = EFFECT_SHADED;
1790 		break;
1791 	default:
1792 		R2_GLOBALS._player.setPosition(Common::Point(192, 155));
1793 
1794 		_companion1.setPosition(Common::Point(138, 134));
1795 		_companion2.setPosition(Common::Point(110, 139));
1796 		_webbster.setPosition(Common::Point(125, 142));
1797 		break;
1798 	}
1799 
1800 	if (R2_GLOBALS._walkwaySceneNumber == 2) {
1801 		R2_GLOBALS._sceneItems.remove(&_door);
1802 		for (int i = 0; i <= 12; i++)
1803 			R2_GLOBALS._sceneItems.remove(&_itemArray[i]);
1804 		R2_GLOBALS._sceneItems.remove(&_background);
1805 
1806 		_door.show();
1807 		_door.setDetails(3375, 9, 10, -1, 1, (SceneItem *)NULL);
1808 
1809 		for (int i = 0; i <= 12; i++)
1810 			_itemArray[i].setDetails(3375, 3, -1, -1);
1811 
1812 		_background.setDetails(Rect(0, 0, 320, 200), 3375, 0, -1, -1, 1, NULL);
1813 	} else {
1814 		_door.hide();
1815 		R2_GLOBALS._sceneItems.remove(&_door);
1816 	}
1817 
1818 	if (_sceneMode == 0)
1819 		signal();
1820 	else
1821 		setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
1822 }
1823 
startAction(CursorType action,Event & event)1824 bool Scene3375::Companion2::startAction(CursorType action, Event &event) {
1825 	if (action != CURSOR_TALK)
1826 		return SceneActor::startAction(action, event);
1827 
1828 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1829 
1830 	scene->_sceneMode = 9999;
1831 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
1832 		scene->_stripManager.start(3302, scene);
1833 	else
1834 		scene->_stripManager.start(3304, scene);
1835 
1836 	return true;
1837 }
1838 
startAction(CursorType action,Event & event)1839 bool Scene3375::Companion1::startAction(CursorType action, Event &event) {
1840 	if (action != CURSOR_TALK)
1841 		return SceneActor::startAction(action, event);
1842 
1843 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1844 
1845 	scene->_sceneMode = 9999;
1846 	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
1847 		scene->_stripManager.start(3302, scene);
1848 	else
1849 		scene->_stripManager.start(3301, scene);
1850 
1851 	return true;
1852 }
1853 
startAction(CursorType action,Event & event)1854 bool Scene3375::Webbster::startAction(CursorType action, Event &event) {
1855 	if (action != CURSOR_TALK)
1856 		return SceneActor::startAction(action, event);
1857 
1858 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1859 
1860 	scene->_sceneMode = 9999;
1861 	scene->_stripManager.start(3303, scene);
1862 
1863 	return true;
1864 }
1865 
startAction(CursorType action,Event & event)1866 bool Scene3375::Door::startAction(CursorType action, Event &event) {
1867 	if (action != CURSOR_USE)
1868 		return SceneActor::startAction(action, event);
1869 
1870 	if (R2_GLOBALS._walkwaySceneNumber != 0) {
1871 		R2_GLOBALS._walkRegions.enableRegion(2);
1872 		R2_GLOBALS._walkRegions.enableRegion(3);
1873 	} else {
1874 		R2_GLOBALS._walkRegions.enableRegion(1);
1875 		R2_GLOBALS._walkRegions.enableRegion(3);
1876 		R2_GLOBALS._walkRegions.enableRegion(4);
1877 	}
1878 	R2_GLOBALS._walkRegions.enableRegion(6);
1879 	R2_GLOBALS._walkRegions.enableRegion(7);
1880 	R2_GLOBALS._walkRegions.enableRegion(8);
1881 
1882 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
1883 
1884 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1885 
1886 	scene->_sceneMode = 3375;
1887 	scene->setAction(&scene->_sequenceManager, scene, 3375, &R2_GLOBALS._player,
1888 		&scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door, NULL);
1889 
1890 	return true;
1891 }
1892 
changeScene()1893 void Scene3375::LeftExit::changeScene() {
1894 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1895 
1896 	_moving = false;
1897 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
1898 	scene->_sceneMode = 3376;
1899 	if (R2_GLOBALS._walkwaySceneNumber != 0) {
1900 		R2_GLOBALS._walkRegions.enableRegion(2);
1901 		R2_GLOBALS._walkRegions.enableRegion(3);
1902 	} else {
1903 		R2_GLOBALS._walkRegions.enableRegion(1);
1904 		R2_GLOBALS._walkRegions.enableRegion(3);
1905 		R2_GLOBALS._walkRegions.enableRegion(4);
1906 	}
1907 	if (scene->_companion1._position.y != 163) {
1908 		R2_GLOBALS._player.setStrip2(-1);
1909 		scene->_companion1.setStrip2(-1);
1910 		scene->_companion2.setStrip2(-1);
1911 		scene->_webbster.setStrip2(-1);
1912 		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2, &scene->_webbster, NULL);
1913 	} else {
1914 		R2_GLOBALS._player.setStrip2(2);
1915 		scene->_companion1.setStrip2(2);
1916 		scene->_companion2.setStrip2(2);
1917 		scene->_webbster.setStrip2(2);
1918 		R2_GLOBALS._sound2.play(314);
1919 
1920 		Common::Point pt(50, 150);
1921 		NpcMover *mover = new NpcMover();
1922 		R2_GLOBALS._player.addMover(mover, &pt, scene);
1923 	}
1924 }
1925 
changeScene()1926 void Scene3375::DownExit::changeScene() {
1927 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1928 
1929 	_moving = false;
1930 	R2_GLOBALS._player._effect = EFFECT_SHADED2;
1931 	R2_GLOBALS._player._shade = 4;
1932 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
1933 
1934 	scene->_sceneMode = 3377;
1935 	scene->_newSceneMode = 3381;
1936 
1937 	if (R2_GLOBALS._walkwaySceneNumber != 0) {
1938 		R2_GLOBALS._walkRegions.enableRegion(2);
1939 		R2_GLOBALS._walkRegions.enableRegion(3);
1940 	} else {
1941 		R2_GLOBALS._walkRegions.enableRegion(1);
1942 		R2_GLOBALS._walkRegions.enableRegion(3);
1943 		R2_GLOBALS._walkRegions.enableRegion(4);
1944 	}
1945 	scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2, &scene->_webbster, NULL);
1946 }
1947 
changeScene()1948 void Scene3375::RightExit::changeScene() {
1949 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1950 
1951 	_moving = false;
1952 	R2_GLOBALS._player._effect = EFFECT_SHADED2;
1953 	R2_GLOBALS._player._shade = 4;
1954 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
1955 
1956 	scene->_sceneMode = 3378;
1957 	scene->_newSceneMode = 3380;
1958 
1959 	if (R2_GLOBALS._walkwaySceneNumber != 0) {
1960 		R2_GLOBALS._walkRegions.enableRegion(2);
1961 		R2_GLOBALS._walkRegions.enableRegion(3);
1962 	} else {
1963 		R2_GLOBALS._walkRegions.enableRegion(1);
1964 		R2_GLOBALS._walkRegions.enableRegion(3);
1965 		R2_GLOBALS._walkRegions.enableRegion(4);
1966 	}
1967 	scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2, &scene->_webbster, NULL);
1968 }
1969 
Scene3375()1970 Scene3375::Scene3375() {
1971 	_newSceneMode = 0;
1972 
1973 	_sceneAreas[0] = 3376;
1974 	_sceneAreas[1] = 3377;
1975 	_sceneAreas[2] = 3375;
1976 	_sceneAreas[3] = 3378;
1977 }
1978 
postInit(SceneObjectList * OwnerList)1979 void Scene3375::postInit(SceneObjectList *OwnerList) {
1980 	loadScene(_sceneAreas[R2_GLOBALS._walkwaySceneNumber]);
1981 	SceneExt::postInit();
1982 
1983 	R2_GLOBALS._sound1.play(313);
1984 
1985 	_stripManager.setColors(60, 255);
1986 	_stripManager.setFontNumber(3);
1987 	_stripManager.addSpeaker(&_quinnSpeaker);
1988 	_stripManager.addSpeaker(&_seekerSpeaker);
1989 	_stripManager.addSpeaker(&_mirandaSpeaker);
1990 	_stripManager.addSpeaker(&_webbsterSpeaker);
1991 
1992 	R2_GLOBALS._player._characterScene[R2_QUINN] = 3375;
1993 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 3375;
1994 	R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3375;
1995 
1996 	setZoomPercents(126, 55, 200, 167);
1997 	R2_GLOBALS._player.postInit();
1998 
1999 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2000 		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2001 	else
2002 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2003 
2004 	R2_GLOBALS._player.changeZoom(-1);
2005 
2006 	switch (R2_GLOBALS._player._characterIndex) {
2007 	case R2_SEEKER:
2008 		if (R2_GLOBALS._sceneManager._previousScene == 3385)
2009 			R2_GLOBALS._player.setup(20, 1, 1);
2010 		else
2011 			R2_GLOBALS._player.setup(20, 3, 1);
2012 		break;
2013 	case R2_MIRANDA:
2014 		if (R2_GLOBALS._sceneManager._previousScene == 3385)
2015 			R2_GLOBALS._player.setup(30, 1, 1);
2016 		else
2017 			R2_GLOBALS._player.setup(30, 3, 1);
2018 		break;
2019 	default:
2020 		if (R2_GLOBALS._sceneManager._previousScene == 3385)
2021 			R2_GLOBALS._player.setup(10, 1, 1);
2022 		else
2023 			R2_GLOBALS._player.setup(10, 3, 1);
2024 		break;
2025 	}
2026 
2027 	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2028 	R2_GLOBALS._player.disableControl();
2029 
2030 	_companion1.postInit();
2031 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2032 		_companion1._moveRate = 10;
2033 		_companion1._moveDiff = Common::Point(3, 2);
2034 	} else {
2035 		_companion1._moveRate = 7;
2036 		_companion1._moveDiff = Common::Point(5, 3);
2037 	}
2038 	_companion1.changeZoom(-1);
2039 	_companion1._effect = EFFECT_SHADED;
2040 
2041 	int tmpStrip, tmpVisage;
2042 	if (R2_GLOBALS._sceneManager._previousScene == 3385)
2043 		tmpStrip = 1;
2044 	else
2045 		tmpStrip = 4;
2046 
2047 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2048 		tmpVisage = 10;
2049 	else
2050 		tmpVisage = 20;
2051 
2052 	_companion1.setup(tmpVisage, tmpStrip, 1);
2053 	_companion1.animate(ANIM_MODE_1, NULL);
2054 
2055 	_companion2.postInit();
2056 	_companion2._moveDiff = Common::Point(3, 2);
2057 	_companion2.changeZoom(-1);
2058 	_companion2._effect = EFFECT_SHADED;
2059 	if (R2_GLOBALS._sceneManager._previousScene == 3385)
2060 		tmpStrip = 1;
2061 	else
2062 		tmpStrip = 8;
2063 
2064 	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2065 		tmpVisage = 10;
2066 	else
2067 		tmpVisage = 30;
2068 
2069 	_companion2.setup(tmpVisage, tmpStrip, 1);
2070 	_companion2.animate(ANIM_MODE_1, NULL);
2071 
2072 	_webbster.postInit();
2073 	_webbster._moveRate = 7;
2074 	_webbster._moveDiff = Common::Point(5, 3);
2075 	_webbster.changeZoom(-1);
2076 	_webbster._effect = EFFECT_SHADED;
2077 	if (R2_GLOBALS._sceneManager._previousScene == 3385)
2078 		tmpStrip = 1;
2079 	else
2080 		tmpStrip = 4;
2081 
2082 	_webbster.setup(40, tmpStrip, 1);
2083 	_webbster.animate(ANIM_MODE_1, NULL);
2084 
2085 	_companion2.setDetails(3375, -1, -1, -1, 1, (SceneItem *)NULL);
2086 	_webbster.setDetails(3375, 21, -1, -1, 1, (SceneItem *)NULL);
2087 	_companion1.setDetails(3375, -1, -1, -1, 1, (SceneItem *)NULL);
2088 
2089 	_door.postInit();
2090 	_door.setup(3375, 1, 1);
2091 	_door.setPosition(Common::Point(254, 166));
2092 	_door.fixPriority(140);
2093 	_door.hide();
2094 
2095 	_leftExit.setDetails(Rect(0, 84, 24, 167), EXITCURSOR_W, 3375);
2096 	_leftExit.setDest(Common::Point(65, 155));
2097 	_downExit.setDetails(Rect(103, 152, 183, 170), SHADECURSOR_DOWN, 3375);
2098 	_downExit.setDest(Common::Point(158, 151));
2099 	_rightExit.setDetails(Rect(180, 75, 213, 132), EXITCURSOR_E, 3375);
2100 	_rightExit.setDest(Common::Point(201, 131));
2101 
2102 	for (int i = 0; i <= 12; ++i)
2103 		_itemArray[i].setDetails(i, 3375, 3, -1, -1);
2104 
2105 	_background.setDetails(Rect(0, 0, 320, 200), 3375, 0, -1, 1, 1, NULL);
2106 
2107 	if (R2_GLOBALS._sceneManager._previousScene == 3385)
2108 		_sceneMode = 3379;
2109 	else
2110 		_sceneMode = 0;
2111 
2112 	enterArea(_sceneMode);
2113 }
2114 
remove()2115 void Scene3375::remove() {
2116 	R2_GLOBALS._sound1.fadeOut2(NULL);
2117 	SceneExt::remove();
2118 }
2119 
signalCase3379()2120 void Scene3375::signalCase3379() {
2121 	switch (R2_GLOBALS._walkwaySceneNumber) {
2122 	case 0:
2123 		_leftExit._enabled = true;
2124 		if (R2_GLOBALS._sceneManager._previousScene == 3385) {
2125 			// WORKAROUND: The original disables the left entry region here for
2126 			// some reason. But there's also some walk issue even I leave it enabled.
2127 			// Instead, for now, add an extra walk into the properly enabled regions
2128 			_sceneMode = 1;
2129 			ADD_MOVER(R2_GLOBALS._player, 70, R2_GLOBALS._player._position.y);
2130 			R2_GLOBALS._sceneManager._previousScene = 3375;
2131 			R2_GLOBALS._player._effect = EFFECT_SHADED;
2132 			_companion1._effect = EFFECT_SHADED;
2133 			_companion2._effect = EFFECT_SHADED;
2134 			_webbster._effect = EFFECT_SHADED;
2135 
2136 			return;
2137 			//R2_GLOBALS._walkRegions.disableRegion(1);
2138 		} else {
2139 			R2_GLOBALS._walkRegions.disableRegion(3);
2140 			R2_GLOBALS._walkRegions.disableRegion(4);
2141 		}
2142 		R2_GLOBALS._walkRegions.disableRegion(6);
2143 		R2_GLOBALS._walkRegions.disableRegion(7);
2144 		break;
2145 	case 2:
2146 		_leftExit._enabled = false;
2147 		R2_GLOBALS._walkRegions.disableRegion(2);
2148 		R2_GLOBALS._walkRegions.disableRegion(3);
2149 		R2_GLOBALS._walkRegions.disableRegion(5);
2150 		R2_GLOBALS._walkRegions.disableRegion(6);
2151 		R2_GLOBALS._walkRegions.disableRegion(7);
2152 		R2_GLOBALS._walkRegions.disableRegion(8);
2153 		R2_GLOBALS._walkRegions.disableRegion(9);
2154 		break;
2155 	default:
2156 		_leftExit._enabled = false;
2157 		R2_GLOBALS._walkRegions.disableRegion(2);
2158 		R2_GLOBALS._walkRegions.disableRegion(3);
2159 		R2_GLOBALS._walkRegions.disableRegion(5);
2160 		R2_GLOBALS._walkRegions.disableRegion(6);
2161 		break;
2162 	}
2163 	R2_GLOBALS._sceneManager._previousScene = 3375;
2164 	R2_GLOBALS._player._effect = EFFECT_SHADED;
2165 	_companion1._effect = EFFECT_SHADED;
2166 	_companion2._effect = EFFECT_SHADED;
2167 	_webbster._effect = EFFECT_SHADED;
2168 	R2_GLOBALS._player.enableControl(CURSOR_WALK);
2169 }
2170 
signal()2171 void Scene3375::signal() {
2172 	switch (_sceneMode) {
2173 	case 1:
2174 		R2_GLOBALS._player.enableControl();
2175 		break;
2176 	case 3375:
2177 		R2_GLOBALS._sceneManager.changeScene(3400);
2178 		break;
2179 	case 3376:
2180 		R2_GLOBALS._sceneManager.changeScene(3385);
2181 		break;
2182 	case 3377:
2183 		// No break on purpose
2184 	case 3378:
2185 		_sceneMode = _newSceneMode;
2186 		_newSceneMode = 0;
2187 
2188 		_companion1._effect = EFFECT_SHADED2;
2189 		_companion1._shade = 4;
2190 		_companion2._effect = EFFECT_SHADED2;
2191 		_companion2._shade = 4;
2192 		_webbster._effect = EFFECT_SHADED2;
2193 		_webbster._shade = 4;
2194 
2195 		// HACK: Reset zooms in order to avoid giant characters on the upper right of the screen
2196 		R2_GLOBALS._player.setZoom(-1);
2197 		_companion1.setZoom(-1);
2198 		_companion2.setZoom(-1);
2199 		_webbster.setZoom(-1);
2200 		//
2201 
2202 		enterArea(_sceneMode);
2203 		break;
2204 	case 3379:
2205 		signalCase3379();
2206 		break;
2207 	case 9999:
2208 		if (_companion1._position.y == 163)
2209 			R2_GLOBALS._player.setStrip(1);
2210 		else
2211 			R2_GLOBALS._player.setStrip(3);
2212 		R2_GLOBALS._player.enableControl(CURSOR_TALK);
2213 		break;
2214 	default:
2215 		_companion1.setPriority(130);
2216 		_companion2.setPriority(132);
2217 		_webbster.setPriority(134);
2218 		signalCase3379();
2219 		break;
2220 	}
2221 }
2222 
dispatch()2223 void Scene3375::dispatch() {
2224 	if ((R2_GLOBALS._player._position.y >= 168) && (R2_GLOBALS._player._effect == EFFECT_SHADED))
2225 		R2_GLOBALS._player._effect = EFFECT_SHADED2;
2226 	else if ((R2_GLOBALS._player._position.y < 168) && (R2_GLOBALS._player._effect == EFFECT_SHADED2))
2227 		R2_GLOBALS._player._effect = EFFECT_SHADED;
2228 
2229 	if ((_companion1._position.y >= 168) && (_companion1._effect == EFFECT_SHADED))
2230 		_companion1._effect = EFFECT_SHADED2;
2231 	else if ((_companion1._position.y < 168) && (_companion1._effect == EFFECT_SHADED2))
2232 		_companion1._effect = EFFECT_SHADED;
2233 
2234 	if ((_companion2._position.y >= 168) && (_companion2._effect == EFFECT_SHADED))
2235 		_companion2._effect = EFFECT_SHADED2;
2236 	else if ((_companion2._position.y < 168) && (_companion2._effect == EFFECT_SHADED2))
2237 		_companion2._effect = EFFECT_SHADED;
2238 
2239 	if ((_webbster._position.y >= 168) && (_webbster._effect == EFFECT_SHADED))
2240 		_webbster._effect = EFFECT_SHADED2;
2241 	else if ((_webbster._position.y < 168) && (_webbster._effect == EFFECT_SHADED2))
2242 		_webbster._effect = EFFECT_SHADED;
2243 
2244 	Scene::dispatch();
2245 }
2246 
2247 /*--------------------------------------------------------------------------
2248  * Scene 3385 - Corridor
2249  *
2250  *--------------------------------------------------------------------------*/
2251 
Scene3385()2252 Scene3385::Scene3385() {
2253 	_playerStrip = 0;
2254 }
2255 
synchronize(Serializer & s)2256 void Scene3385::synchronize(Serializer &s) {
2257 	SceneExt::synchronize(s);
2258 
2259 	s.syncAsSint16LE(_playerStrip);
2260 }
2261 
startAction(CursorType action,Event & event)2262 bool Scene3385::Companion1::startAction(CursorType action, Event &event) {
2263 	if (action != CURSOR_TALK)
2264 		return SceneActor::startAction(action, event);
2265 
2266 	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2267 
2268 	scene->_sceneMode = 9999;
2269 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2270 		scene->_stripManager.start(3302, scene);
2271 	else
2272 		scene->_stripManager.start(3304, scene);
2273 
2274 	return true;
2275 }
2276 
startAction(CursorType action,Event & event)2277 bool Scene3385::Companion2::startAction(CursorType action, Event &event) {
2278 	if (action != CURSOR_TALK)
2279 		return SceneActor::startAction(action, event);
2280 
2281 	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2282 
2283 	scene->_sceneMode = 9999;
2284 	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2285 		scene->_stripManager.start(3302, scene);
2286 	else
2287 		scene->_stripManager.start(3301, scene);
2288 
2289 	return true;
2290 }
2291 
startAction(CursorType action,Event & event)2292 bool Scene3385::Webbster::startAction(CursorType action, Event &event) {
2293 	if (action != CURSOR_TALK)
2294 		return SceneActor::startAction(action, event);
2295 
2296 	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2297 
2298 	scene->_sceneMode = 9999;
2299 	scene->_stripManager.start(3303, scene);
2300 
2301 	return true;
2302 }
2303 
startAction(CursorType action,Event & event)2304 bool Scene3385::Door::startAction(CursorType action, Event &event) {
2305 	if (action != CURSOR_USE)
2306 		return SceneActor::startAction(action, event);
2307 
2308 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
2309 	if (R2_GLOBALS._sceneManager._previousScene == 3375)
2310 		R2_GLOBALS._sound2.play(314);
2311 
2312 	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2313 
2314 	scene->_sceneMode = 3386;
2315 	scene->setAction(&scene->_sequenceManager, scene, 3386, &R2_GLOBALS._player,
2316 		&scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door,
2317 		NULL);
2318 
2319 	return true;
2320 }
2321 
changeScene()2322 void Scene3385::SouthExit::changeScene() {
2323 	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2324 
2325 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
2326 	scene->_sceneMode = 3387;
2327 
2328 	if (R2_GLOBALS._sceneManager._previousScene == 3375)
2329 		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
2330 		&R2_GLOBALS._player, &scene->_companion1, &scene->_companion2,
2331 		&scene->_webbster, NULL);
2332 	else
2333 		scene->signal();
2334 }
2335 
signal()2336 void Scene3385::Action1::signal() {
2337 	int v = _actionIndex;
2338 	++_actionIndex;
2339 
2340 	if (v == 0)
2341 		setDelay(1);
2342 	else if (v == 1)
2343 		R2_GLOBALS._sound2.play(314);
2344 }
2345 
postInit(SceneObjectList * OwnerList)2346 void Scene3385::postInit(SceneObjectList *OwnerList) {
2347 	loadScene(3385);
2348 	SceneExt::postInit();
2349 
2350 	R2_GLOBALS._sound1.play(313);
2351 
2352 	_stripManager.setColors(60, 255);
2353 	_stripManager.setFontNumber(3);
2354 	_stripManager.addSpeaker(&_quinnSpeaker);
2355 	_stripManager.addSpeaker(&_seekerSpeaker);
2356 	_stripManager.addSpeaker(&_mirandaSpeaker);
2357 	_stripManager.addSpeaker(&_webbsterSpeaker);
2358 
2359 	R2_GLOBALS._player._characterScene[R2_QUINN] = 3385;
2360 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 3385;
2361 	R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3385;
2362 
2363 	if (R2_GLOBALS._sceneManager._previousScene == 3375)
2364 		_playerStrip = 3;
2365 	else
2366 		_playerStrip = 4;
2367 
2368 	setZoomPercents(102, 40, 200, 160);
2369 	R2_GLOBALS._player.postInit();
2370 
2371 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2372 		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2373 	else
2374 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2375 
2376 	R2_GLOBALS._player.changeZoom(-1);
2377 
2378 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2379 		R2_GLOBALS._player.setup(20, _playerStrip, 1);
2380 	else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2381 		R2_GLOBALS._player.setup(30, _playerStrip, 1);
2382 	else
2383 		R2_GLOBALS._player.setup(10, _playerStrip, 1);
2384 
2385 	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2386 	R2_GLOBALS._player.disableControl();
2387 
2388 	_companion1.postInit();
2389 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2390 		_companion1._moveRate = 10;
2391 		_companion1._moveDiff = Common::Point(3, 2);
2392 	} else {
2393 		_companion1._moveRate = 7;
2394 		_companion1._moveDiff = Common::Point(5, 3);
2395 	}
2396 	_companion1.changeZoom(-1);
2397 	_companion1._effect = EFFECT_SHADED;
2398 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2399 		_companion1.setup(10, _playerStrip, 1);
2400 	else
2401 		_companion1.setup(20, _playerStrip, 1);
2402 	_companion1.animate(ANIM_MODE_1, NULL);
2403 	_companion1.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);
2404 
2405 	_companion2.postInit();
2406 	_companion2._moveDiff = Common::Point(3, 2);
2407 	_companion2.changeZoom(-1);
2408 	_companion2._effect = EFFECT_SHADED;
2409 	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2410 		_companion2.setup(10, _playerStrip, 1);
2411 	else
2412 		_companion2.setup(30, _playerStrip, 1);
2413 	_companion2.animate(ANIM_MODE_1, NULL);
2414 	_companion2.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);
2415 
2416 	_webbster.postInit();
2417 	_webbster._moveDiff = Common::Point(3, 2);
2418 	_webbster.changeZoom(-1);
2419 	_webbster._effect = EFFECT_SHADED;
2420 	_webbster.setup(40, _playerStrip, 1);
2421 	_webbster.animate(ANIM_MODE_1, NULL);
2422 	_webbster.setDetails(3385, 15, -1, -1, 1, (SceneItem *) NULL);
2423 
2424 	_southExit.setDetails(Rect(103, 152, 217, 170), SHADECURSOR_DOWN, 3395);
2425 	_southExit.setDest(Common::Point(158, 151));
2426 
2427 	_door.postInit();
2428 	_door.setPosition(Common::Point(160, 100));
2429 	_door.fixPriority(90);
2430 	_door.setDetails(3385, 3, 4, -1, 1, (SceneItem *) NULL);
2431 
2432 	if (R2_GLOBALS._sceneManager._previousScene == 3375) {
2433 		R2_GLOBALS._player.setPosition(Common::Point(158, 102));
2434 		_companion1.setPosition(Common::Point(164, 100));
2435 		_companion1.fixPriority(98);
2436 		_companion2.setPosition(Common::Point(150, 100));
2437 		_companion2.fixPriority(97);
2438 		_webbster.setPosition(Common::Point(158, 100));
2439 		_webbster.fixPriority(96);
2440 		_sceneMode = 3384;
2441 		_door.setup(3385, 1, 6);
2442 		_door.animate(ANIM_MODE_6, this);
2443 		setAction(&_action1, &_door);
2444 	} else {
2445 		R2_GLOBALS._player.setPosition(Common::Point(158, 230));
2446 		_companion1.setPosition(Common::Point(191, 270));
2447 		_companion2.setPosition(Common::Point(124, 255));
2448 		_webbster.setPosition(Common::Point(155, 245));
2449 		_door.setup(3385, 1, 1);
2450 		_sceneMode = 3385;
2451 		setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
2452 	}
2453 
2454 	_background.setDetails(Rect(0, 0, 320, 200), 3385, 0, -1, -1, 1, NULL);
2455 	R2_GLOBALS._walkwaySceneNumber = 0;
2456 }
2457 
remove()2458 void Scene3385::remove() {
2459 	R2_GLOBALS._sound1.fadeOut2(NULL);
2460 	SceneExt::remove();
2461 }
2462 
signal()2463 void Scene3385::signal() {
2464 	switch (_sceneMode) {
2465 	case 3386:
2466 		R2_GLOBALS._sceneManager.changeScene(3375);
2467 		break;
2468 	case 3387:
2469 		R2_GLOBALS._sceneManager.changeScene(3395);
2470 		break;
2471 	case 9999:
2472 		if (R2_GLOBALS._sceneManager._previousScene == 3375)
2473 			R2_GLOBALS._player.setStrip(3);
2474 		else
2475 			R2_GLOBALS._player.setStrip(4);
2476 		R2_GLOBALS._player.enableControl(CURSOR_TALK);
2477 		break;
2478 	default:
2479 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
2480 		break;
2481 	}
2482 }
2483 
2484 /*--------------------------------------------------------------------------
2485  * Scene 3395 - Walkway
2486  *
2487  *--------------------------------------------------------------------------*/
2488 
Scene3395()2489 Scene3395::Scene3395() {
2490 	_playerStrip = 0;
2491 }
2492 
synchronize(Serializer & s)2493 void Scene3395::synchronize(Serializer &s) {
2494 	SceneExt::synchronize(s);
2495 
2496 	s.syncAsSint16LE(_playerStrip);
2497 }
2498 
startAction(CursorType action,Event & event)2499 bool Scene3395::Companion1::startAction(CursorType action, Event &event) {
2500 	if (action != CURSOR_TALK)
2501 		return SceneActor::startAction(action, event);
2502 
2503 	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
2504 
2505 	scene->_sceneMode = 9999;
2506 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2507 		scene->_stripManager.start(3302, scene);
2508 	else
2509 		scene->_stripManager.start(3304, scene);
2510 
2511 	return true;
2512 }
2513 
startAction(CursorType action,Event & event)2514 bool Scene3395::Companion2::startAction(CursorType action, Event &event) {
2515 	if (action != CURSOR_TALK)
2516 		return SceneActor::startAction(action, event);
2517 
2518 	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
2519 
2520 	scene->_sceneMode = 9999;
2521 	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2522 		scene->_stripManager.start(3302, scene);
2523 	else
2524 		scene->_stripManager.start(3301, scene);
2525 
2526 	return true;
2527 }
2528 
startAction(CursorType action,Event & event)2529 bool Scene3395::Webbster::startAction(CursorType action, Event &event) {
2530 	if (action != CURSOR_TALK)
2531 		return SceneActor::startAction(action, event);
2532 
2533 	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
2534 
2535 	scene->_sceneMode = 9999;
2536 	scene->_stripManager.start(3303, scene);
2537 
2538 	return true;
2539 }
2540 
startAction(CursorType action,Event & event)2541 bool Scene3395::Door::startAction(CursorType action, Event &event) {
2542 	if (action != CURSOR_USE)
2543 		return SceneActor::startAction(action, event);
2544 
2545 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
2546 	if (R2_GLOBALS._sceneManager._previousScene == 3385)
2547 		R2_GLOBALS._sound2.play(314);
2548 
2549 	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
2550 
2551 	scene->_sceneMode = 3396;
2552 	scene->setAction(&scene->_sequenceManager, scene, 3396, &R2_GLOBALS._player,
2553 		&scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door,
2554 		NULL);
2555 
2556 	return true;
2557 }
2558 
signal()2559 void Scene3395::Action1::signal() {
2560 	int v = _actionIndex;
2561 	++_actionIndex;
2562 
2563 	if (v == 0)
2564 		setDelay(2);
2565 	else if (v == 1)
2566 		R2_GLOBALS._sound2.play(314);
2567 }
2568 
postInit(SceneObjectList * OwnerList)2569 void Scene3395::postInit(SceneObjectList *OwnerList) {
2570 	loadScene(3395);
2571 	SceneExt::postInit();
2572 
2573 	R2_GLOBALS._sound1.play(313);
2574 
2575 	_stripManager.setColors(60, 255);
2576 	_stripManager.setFontNumber(3);
2577 	_stripManager.addSpeaker(&_quinnSpeaker);
2578 	_stripManager.addSpeaker(&_seekerSpeaker);
2579 	_stripManager.addSpeaker(&_mirandaSpeaker);
2580 	_stripManager.addSpeaker(&_webbsterSpeaker);
2581 
2582 	R2_GLOBALS._player._characterScene[R2_QUINN] = 3395;
2583 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 3395;
2584 	R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3395;
2585 
2586 	if (R2_GLOBALS._sceneManager._previousScene == 3385)
2587 		_playerStrip = 3;
2588 	else
2589 		_playerStrip = 4;
2590 
2591 	setZoomPercents(51, 40, 200, 137);
2592 	R2_GLOBALS._player.postInit();
2593 
2594 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2595 		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2596 	else
2597 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2598 
2599 	R2_GLOBALS._player.changeZoom(-1);
2600 
2601 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2602 		R2_GLOBALS._player.setup(20, _playerStrip, 1);
2603 	else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2604 		R2_GLOBALS._player.setup(30, _playerStrip, 1);
2605 	else
2606 		R2_GLOBALS._player.setup(10, _playerStrip, 1);
2607 
2608 	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2609 	R2_GLOBALS._player.disableControl();
2610 
2611 	_companion1.postInit();
2612 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2613 		_companion1._moveRate = 10;
2614 		_companion1._moveDiff = Common::Point(3, 2);
2615 	} else {
2616 		_companion1._moveRate = 7;
2617 		_companion1._moveDiff = Common::Point(5, 3);
2618 	}
2619 	_companion1.changeZoom(-1);
2620 	_companion1._effect = EFFECT_SHADED;
2621 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2622 		_companion1.setup(10, _playerStrip, 1);
2623 	else
2624 		_companion1.setup(20, _playerStrip, 1);
2625 	_companion1.animate(ANIM_MODE_1, NULL);
2626 	_companion1.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);
2627 
2628 	_companion2.postInit();
2629 	_companion2._moveDiff = Common::Point(3, 2);
2630 	_companion2.changeZoom(-1);
2631 	_companion2._effect = EFFECT_SHADED;
2632 	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2633 		_companion2.setup(10, _playerStrip, 1);
2634 	else
2635 		_companion2.setup(30, _playerStrip, 1);
2636 	_companion2.animate(ANIM_MODE_1, NULL);
2637 	_companion2.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);
2638 
2639 	_webbster.postInit();
2640 	_webbster._moveDiff = Common::Point(3, 2);
2641 	_webbster.changeZoom(-1);
2642 	_webbster._effect = EFFECT_SHADED;
2643 	_webbster.setup(40, _playerStrip, 1);
2644 	_webbster.animate(ANIM_MODE_1, NULL);
2645 	_webbster.setDetails(3395, 18, -1, -1, 1, (SceneItem *) NULL);
2646 
2647 	_door.postInit();
2648 	_door.setPosition(Common::Point(159, 50));
2649 	_door.fixPriority(40);
2650 	_door.setDetails(3395, 6, 7, -1, 1, (SceneItem *) NULL);
2651 
2652 	if (R2_GLOBALS._sceneManager._previousScene == 3385) {
2653 		R2_GLOBALS._player.setPosition(Common::Point(158, 53));
2654 		_companion1.setPosition(Common::Point(164, 51));
2655 		_companion1.fixPriority(48);
2656 		_companion2.setPosition(Common::Point(150, 51));
2657 		_companion2.fixPriority(47);
2658 		_webbster.setPosition(Common::Point(158, 51));
2659 		_webbster.fixPriority(46);
2660 		_sceneMode = 3394;
2661 		_door.setup(3395, 1, 7);
2662 		_door.animate(ANIM_MODE_6, this);
2663 		setAction(&_action1, &_door);
2664 	} else {
2665 		R2_GLOBALS._player.setPosition(Common::Point(158, 200));
2666 		_companion1.setPosition(Common::Point(191, 255));
2667 		_companion2.setPosition(Common::Point(124, 240));
2668 		_webbster.setPosition(Common::Point(155, 242));
2669 		_door.setup(3395, 1, 1);
2670 
2671 		R2_GLOBALS._walkRegions.disableRegion(1);
2672 
2673 		_sceneMode = 3395;
2674 		setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
2675 	}
2676 
2677 	for (int i = 0; i <= 12; i++) {
2678 		_itemArray[i].setDetails(i, 3395, 0, -1, -1);
2679 	}
2680 
2681 	_background.setDetails(Rect(0, 0, 320, 200), 3395, 3, -1, -1, 1, NULL);
2682 }
2683 
remove()2684 void Scene3395::remove() {
2685 	R2_GLOBALS._sound1.fadeOut2(NULL);
2686 	SceneExt::remove();
2687 }
2688 
signal()2689 void Scene3395::signal() {
2690 	switch (_sceneMode) {
2691 	case 3396:
2692 		R2_GLOBALS._sceneManager.changeScene(3385);
2693 		break;
2694 	case 9999:
2695 		if (R2_GLOBALS._sceneManager._previousScene == 3385)
2696 			R2_GLOBALS._player.setStrip(3);
2697 		else
2698 			R2_GLOBALS._player.setStrip(4);
2699 		R2_GLOBALS._player.enableControl(CURSOR_TALK);
2700 		break;
2701 	default:
2702 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
2703 		break;
2704 	}
2705 }
2706 
2707 /*--------------------------------------------------------------------------
2708  * Scene 3400 - Confrontation
2709  *
2710  *--------------------------------------------------------------------------*/
2711 
Scene3400()2712 Scene3400::Scene3400() {
2713 	_soundFaded = false;
2714 }
2715 
synchronize(Serializer & s)2716 void Scene3400::synchronize(Serializer &s) {
2717 	SceneExt::synchronize(s);
2718 
2719 	s.syncAsSint16LE(_soundFaded);
2720 }
2721 
postInit(SceneObjectList * OwnerList)2722 void Scene3400::postInit(SceneObjectList *OwnerList) {
2723 	R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
2724 	_sceneBounds = Rect(160, 0, 480, 200);
2725 
2726 	loadScene(3400);
2727 	_soundFaded = false;
2728 	SceneExt::postInit();
2729 	R2_GLOBALS._sound1.play(317);
2730 
2731 	_stripManager.setColors(60, 255);
2732 	_stripManager.setFontNumber(3);
2733 	_stripManager.addSpeaker(&_quinnSpeaker);
2734 	_stripManager.addSpeaker(&_seekerSpeaker);
2735 	_stripManager.addSpeaker(&_mirandaSpeaker);
2736 	_stripManager.addSpeaker(&_webbsterSpeaker);
2737 	_stripManager.addSpeaker(&_tealSpeaker);
2738 
2739 	setZoomPercents(51, 46, 180, 200);
2740 	R2_GLOBALS._player._characterScene[R2_QUINN] = 3400;
2741 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 3400;
2742 	R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3400;
2743 
2744 	_manholeCover.postInit();
2745 	_manholeCover.setup(3403, 1, 1);
2746 	_manholeCover.setPosition(Common::Point(190, 103));
2747 	_manholeCover.fixPriority(89);
2748 
2749 	R2_GLOBALS._player.postInit();
2750 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2751 		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2752 	else
2753 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2754 	R2_GLOBALS._player.changeZoom(-1);
2755 	R2_GLOBALS._player.setPosition(Common::Point(239, 64));
2756 
2757 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2758 		R2_GLOBALS._player.setup(20, 5, 1);
2759 	else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2760 		R2_GLOBALS._player.setup(30, 5, 1);
2761 	else
2762 		R2_GLOBALS._player.setup(10, 5, 1);
2763 
2764 	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2765 	R2_GLOBALS._player.disableControl();
2766 
2767 	_companion1.postInit();
2768 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2769 		_companion1._numFrames = 10;
2770 		_companion1._moveDiff = Common::Point(3, 2);
2771 	} else {
2772 		_companion1._numFrames = 7;
2773 		_companion1._moveDiff = Common::Point(5, 3);
2774 	}
2775 	_companion1.changeZoom(-1);
2776 	_companion1._effect = EFFECT_SHADED;
2777 	_companion1.setPosition(Common::Point(247, 63));
2778 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2779 		_companion1.setup(10, 5, 1);
2780 	else
2781 		_companion1.setup(20, 5, 1);
2782 	_companion1.animate(ANIM_MODE_1, NULL);
2783 
2784 	_companion2.postInit();
2785 	_companion2._moveDiff = Common::Point(3, 2);
2786 	_companion2.changeZoom(-1);
2787 	_companion2._effect = EFFECT_SHADED;
2788 	_companion2.setPosition(Common::Point(225, 63));
2789 	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2790 		_companion2.setup(10, 5, 1);
2791 	else
2792 		_companion2.setup(30, 5, 1);
2793 	_companion2.animate(ANIM_MODE_1, NULL);
2794 
2795 	_webbster.postInit();
2796 	_webbster._numFrames = 7;
2797 	_webbster._moveDiff = Common::Point(5, 3);
2798 	_webbster.changeZoom(-1);
2799 	_webbster._effect = EFFECT_SHADED;
2800 	_webbster.setPosition(Common::Point(235, 61));
2801 	_webbster.setup(40, 3, 1);
2802 	_webbster.animate(ANIM_MODE_1, NULL);
2803 
2804 	_door.postInit();
2805 	_door.setup(3400, 1, 6);
2806 	_door.setPosition(Common::Point(236, 51));
2807 	_door.fixPriority(51);
2808 	_door.animate(ANIM_MODE_6, NULL);
2809 
2810 	R2_GLOBALS.clearFlag(71);
2811 	_sceneMode = 3400;
2812 	setAction(&_sequenceManager, this, 3400, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
2813 }
2814 
remove()2815 void Scene3400::remove() {
2816 	R2_GLOBALS._sound2.fadeOut2(NULL);
2817 	R2_GLOBALS._sound1.fadeOut2(NULL);
2818 	SceneExt::remove();
2819 }
2820 
signal()2821 void Scene3400::signal() {
2822 	switch (_sceneMode) {
2823 	case 3305: {
2824 		// First part of discussion
2825 		_tealSpeaker._object1.hide();
2826 		_teal.show();
2827 		_teal.setStrip(1);
2828 		Common::Point pt(158, 190);
2829 		NpcMover *mover = new NpcMover();
2830 		_teal.addMover(mover, &pt, this);
2831 		_sceneMode = 3402;
2832 		setAction(&_sequenceManager, this, 3402, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
2833 		}
2834 		break;
2835 	case 3306:
2836 		// Teal picks up the sapphire
2837 		R2_GLOBALS._sound2.play(318);
2838 		_companion1.setStrip(2);
2839 		R2_GLOBALS._player.setStrip(6);
2840 		_companion2.setStrip(6);
2841 		_webbster.setStrip(3);
2842 		_teal.setStrip(1);
2843 		R2_INVENTORY.setObjectScene(R2_SAPPHIRE_BLUE, 0);
2844 		_stripManager.start(3307, this);
2845 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2846 			_sceneMode = 3404;
2847 			R2_GLOBALS._player.setAction(&_sequenceManager, this, 3404, &R2_GLOBALS._player, &_teal, &_sapphire, NULL);
2848 		} else {
2849 			_sceneMode = 3408;
2850 			_companion1.setAction(&_sequenceManager, this, 3408, &_companion1, &_teal, &_sapphire, NULL);
2851 		}
2852 		break;
2853 	case 3307:
2854 	case 3404:
2855 	case 3408:
2856 		// A tasp!
2857 		if (!_soundFaded) {
2858 			R2_GLOBALS._sound2.fadeOut2(NULL);
2859 			_soundFaded = true;
2860 		} else {
2861 			_sceneMode = 3308;
2862 			_stripManager.start(3308, this);
2863 		}
2864 		break;
2865 	case 3308:
2866 		// Characters teleport one after the other
2867 		_companion1.setStrip(2);
2868 		R2_GLOBALS._player.setStrip(6);
2869 		_companion2.setStrip(6);
2870 		_webbster.setStrip(3);
2871 		_teal.setStrip(1);
2872 		_sceneMode = 3403;
2873 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2874 			setAction(&_sequenceManager, this, 3403, &R2_GLOBALS._player, &_webbster, &_manholeCover, NULL);
2875 		else
2876 			setAction(&_sequenceManager, this, 3403, &_companion1, &_webbster, &_manholeCover, NULL);
2877 		break;
2878 	case 3309:
2879 		// Miranda teleports away
2880 		_teal.setStrip(1);
2881 		_sceneMode = 3405;
2882 		if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2883 			setAction(&_sequenceManager, this, 3405, &R2_GLOBALS._player, &_manholeCover, NULL);
2884 		else
2885 			setAction(&_sequenceManager, this, 3405, &_companion2, &_manholeCover, NULL);
2886 		break;
2887 	case 3310:
2888 		// Quinn teleports away
2889 		_teal.setStrip(1);
2890 		_sceneMode = 3406;
2891 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2892 			setAction(&_sequenceManager, this, 3406, &R2_GLOBALS._player, &_manholeCover, NULL);
2893 		else if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2894 			setAction(&_sequenceManager, this, 3406, &_companion1, &_manholeCover, NULL);
2895 		else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2896 			setAction(&_sequenceManager, this, 3406, &_companion2, &_manholeCover, NULL);
2897 		break;
2898 	case 3311:
2899 		// Teal teleports away
2900 		_tealSpeaker._object1.hide();
2901 		_teal.show();
2902 		_teal.setStrip(1);
2903 		_sceneMode = 3407;
2904 		setAction(&_sequenceManager, this, 3407, &_teal, &_manholeCover, NULL);
2905 		break;
2906 	case 3400: {
2907 		// Teal enters the room
2908 		_sapphire.postInit();
2909 		_sapphire.hide();
2910 		_teal.postInit();
2911 		_teal._numFrames = 7;
2912 		_teal._moveDiff = Common::Point(3, 2);
2913 		_teal.changeZoom(-1);
2914 		_teal._effect = EFFECT_SHADED;
2915 		_teal.setPosition(Common::Point(-15, 90));
2916 		_teal.setup(3402, 1, 1);
2917 		_teal.animate(ANIM_MODE_1, NULL);
2918 		Common::Point pt1(115, 90);
2919 		NpcMover *mover1 = new NpcMover();
2920 		_teal.addMover(mover1, &pt1, this);
2921 		R2_GLOBALS._scrollFollower = &_teal;
2922 		Common::Point pt2(203, 76);
2923 		NpcMover *mover2 = new NpcMover();
2924 		_webbster.addMover(mover2, &pt2, NULL);
2925 		_sceneMode = 3401;
2926 		}
2927 		break;
2928 	case 3401:
2929 		// Teal first speech
2930 		_sceneMode = 3305;
2931 		_stripManager.start(3305, this);
2932 		break;
2933 	case 3402:
2934 		// Betrayal of Webbster
2935 		_sceneMode = 3306;
2936 		_stripManager.start(3306, this);
2937 		break;
2938 	case 3403:
2939 		// Teal: "Miranda..."
2940 		R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
2941 		_sceneMode = 3309;
2942 		_stripManager.start(3309, this);
2943 		break;
2944 	case 3405:
2945 		// Teal: "And Quinn..."
2946 		_sceneMode = 3310;
2947 		_stripManager.start(3310, this);
2948 		break;
2949 	case 3406:
2950 		// Teal final sentence before teleporting
2951 		_sceneMode = 3311;
2952 		_stripManager.start(3311, this);
2953 		break;
2954 	case 3407:
2955 		// End of scene
2956 		R2_GLOBALS._sceneManager.changeScene(3600);
2957 		break;
2958 	default:
2959 		// Unexpected scene mode
2960 		R2_GLOBALS._player.enableControl();
2961 		break;
2962 	}
2963 }
2964 
2965 /*--------------------------------------------------------------------------
2966  * Scene 3500 - Flub tube maze
2967  *
2968  *--------------------------------------------------------------------------*/
2969 
Action1()2970 Scene3500::Action1::Action1() {
2971 	_direction = 0;
2972 	_headingRightFl = false;
2973 	_turningFl = false;
2974 }
2975 
synchronize(Serializer & s)2976 void Scene3500::Action1::synchronize(Serializer &s) {
2977 	Action::synchronize(s);
2978 
2979 	s.syncAsSint16LE(_direction);
2980 	s.syncAsSint16LE(_headingRightFl);
2981 	if (s.getVersion() < 13) {
2982 		int useless = 0;
2983 		s.syncAsSint32LE(useless);
2984 	}
2985 	s.syncAsSint16LE(_turningFl);
2986 }
2987 
handleHorzButton(int direction)2988 void Scene3500::Action1::handleHorzButton(int direction) {
2989 	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
2990 
2991 	// Direction: -1 == Left, 1 == Right
2992 	_direction = direction;
2993 	_headingRightFl = true;
2994 	_turningFl = true;
2995 
2996 	scene->_tunnelHorzCircle.setStrip(2);
2997 	scene->_tunnelHorzCircle.show();
2998 
2999 	if (_direction == 1)
3000 		scene->_symbolRight.show();
3001 	else
3002 		scene->_symbolLeft.show();
3003 
3004 	if (scene->_shuttle._frame % 2 == 0) {
3005 		scene->_shuttle._frameChange = _direction;
3006 		scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3007 	}
3008 
3009 	setActionIndex(0);
3010 }
3011 
turnShuttle(bool arg1)3012 void Scene3500::Action1::turnShuttle(bool arg1) {
3013 	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3014 
3015 	_headingRightFl = arg1;
3016 	_direction = -_direction;
3017 
3018 	if (_direction == 1) {
3019 		scene->_symbolRight.show();
3020 		scene->_symbolLeft.hide();
3021 	} else {
3022 		scene->_symbolLeft.show();
3023 		scene->_symbolRight.hide();
3024 	}
3025 
3026 	switch (_actionIndex) {
3027 	case 4:
3028 		scene->_shuttle._frameChange = _direction;
3029 		scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3030 		// fall through
3031 	case 3:
3032 		_actionIndex = 10;
3033 		setDelay(0);
3034 		break;
3035 	case 5: {
3036 		scene->_moverVertX = 160;
3037 		Common::Point pt(160, 73);
3038 		NpcMover *mover = new NpcMover();
3039 		scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
3040 
3041 		scene->_moverHorzX = 160 - (_direction * 2 * 160);
3042 		Common::Point pt2(scene->_moverHorzX, 73);
3043 		NpcMover *mover2 = new NpcMover();
3044 		scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
3045 
3046 		_actionIndex = 11;
3047 		}
3048 		break;
3049 	case 6:
3050 		scene->_shuttle._frameChange = _direction;
3051 		scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3052 		setDelay(1);
3053 		// fall through
3054 	case 8:
3055 		scene->_tunnelHorzCircle.setStrip(2);
3056 		_actionIndex = 1;
3057 		break;
3058 	default:
3059 		break;
3060 	}
3061 }
3062 
signal()3063 void Scene3500::Action1::signal() {
3064 	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3065 
3066 	switch(_actionIndex++) {
3067 	case 0:
3068 		R2_GLOBALS._player.disableControl();
3069 		scene->_directionChangesEnabled = false;
3070 		if (scene->_speed != 0) {
3071 			scene->_speed = 0;
3072 			scene->_mazeChangeAmount = 0;
3073 			scene->_updateIdxChangeFl = false;
3074 			scene->_rotation->_idxChange = 0;
3075 		}
3076 		break;
3077 	case 1:
3078 		if ((scene->_shuttle._frame % 2) == 1) {
3079 			setDelay(1);
3080 			return;
3081 		}
3082 		// fall through
3083 	case 3:
3084 		scene->_shuttle._frameChange = _direction;
3085 		scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3086 		setDelay(1);
3087 		break;
3088 	case 4: {
3089 		int cellId = scene->_mazeUI.getCellFromMapXY(Common::Point(scene->_mazePosition.x + 70, scene->_mazePosition.y + 46));
3090 		int var2 = scene->_mazeUI.cellFromX(scene->_mazePosition.x + 70) - 70;
3091 		int var4 = scene->_mazeUI.cellFromY(scene->_mazePosition.y + 46) - 46;
3092 		int di = abs(var2 - scene->_mazePosition.x);
3093 		int var6 = abs(var4 - scene->_mazePosition.y);
3094 
3095 		if ((scene->_shuttle._frame % 2) != 0) {
3096 			scene->_shuttle._frameChange = _direction;
3097 			scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3098 		}
3099 
3100 		// Get the new direction starting on
3101 		int direction = (scene->_action1._direction * 2 + scene->_mazeDirection);
3102 		if (direction > MAZEDIR_NORTHWEST)
3103 			direction = MAZEDIR_NORTH;
3104 		else if (direction < MAZEDIR_NORTH)
3105 			direction = MAZEDIR_WEST;
3106 
3107 		// Check whether movement is allowed in that direction. If so, then
3108 		// movement is started again
3109 		switch (direction) {
3110 		case MAZEDIR_NORTH:
3111 			if ( ((cellId != 2)  && (cellId != 3)  && (cellId != 6) && (cellId != 1) && (cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 11))
3112 				|| (var6 != 0)) {
3113 				if ((cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 14) && (cellId != 15))
3114 					_headingRightFl = false;
3115 				else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
3116 					_headingRightFl = false;
3117 				else
3118 					_headingRightFl = true;
3119 			} else
3120 				_headingRightFl = true;
3121 			break;
3122 		case MAZEDIR_EAST:
3123 			if ( ((cellId != 12)  && (cellId != 13)  && (cellId != 11) && (cellId != 16) && (cellId != 26) && (cellId != 24) && (cellId != 15) && (cellId != 6) && (cellId != 31))
3124 				|| (di != 0)) {
3125 				if ((cellId != 25) && (cellId != 23) && (cellId != 14) && (cellId != 5) && (cellId != 4))
3126 					_headingRightFl = false;
3127 				else if ((di != 0) || (var6 <= 3)) // useless, skipped: "|| (var6 == 0)"
3128 					_headingRightFl = false;
3129 				else
3130 					_headingRightFl = true;
3131 			} else
3132 				_headingRightFl = true;
3133 			break;
3134 		case MAZEDIR_SOUTH:
3135 			if ( ((cellId != 2)  && (cellId != 3)  && (cellId != 6) && (cellId != 1) && (cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 16) && (cellId != 31))
3136 				|| (var6 != 0)) {
3137 					if ((cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 14) && (cellId != 15))
3138 						_headingRightFl = false;
3139 					else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
3140 						_headingRightFl = false;
3141 					else
3142 						_headingRightFl = true;
3143 			} else
3144 				_headingRightFl = true;
3145 			break;
3146 		case MAZEDIR_WEST:
3147 			if ( ((cellId != 12)  && (cellId != 13)  && (cellId != 11) && (cellId != 16) && (cellId != 25) && (cellId != 23) && (cellId != 14) && (cellId != 1) && (cellId != 31))
3148 				|| (var6 != 0)) {
3149 					if ((cellId != 26) && (cellId != 24) && (cellId != 15) && (cellId != 5) && (cellId != 4))
3150 						_headingRightFl = false;
3151 					else if ((var6 <= 0) || (di != 0)) // useless, skipped: "|| (var6 == 0)"
3152 						_headingRightFl = false;
3153 					else
3154 						_headingRightFl = true;
3155 			} else
3156 				_headingRightFl = true;
3157 		default:
3158 			break;
3159 		}
3160 		}
3161 		// fall through
3162 	case 2: {
3163 		scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
3164 		scene->_tunnelVertCircle._moveDiff.x = 160 - scene->_mazeChangeAmount;
3165 		scene->_moverVertX = 160 - ((_direction * 2) * 160);
3166 		Common::Point pt(scene->_moverVertX, 73);
3167 		NpcMover *mover = new NpcMover();
3168 		scene->_tunnelVertCircle.addMover(mover, &pt, this);
3169 
3170 		scene->_tunnelHorzCircle.setPosition(Common::Point(160 + ((_direction * 2) * 160), 73));
3171 		scene->_tunnelHorzCircle._moveDiff.x = 160 - scene->_mazeChangeAmount;
3172 		scene->_moverHorzX = 160;
3173 		Common::Point pt2(scene->_moverHorzX, 73);
3174 		NpcMover *mover2 = new NpcMover();
3175 		scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
3176 		}
3177 		break;
3178 	case 5:
3179 		scene->_shuttle._frameChange = _direction;
3180 		scene->_mazeDirection = scene->_shuttle.changeFrame();
3181 		scene->_shuttle.setFrame(scene->_mazeDirection);
3182 		setDelay(1);
3183 		break;
3184 	case 6:
3185 		scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
3186 		if (!_headingRightFl)
3187 			scene->_tunnelVertCircle.setStrip(1);
3188 		else
3189 			scene->_tunnelVertCircle.setStrip(2);
3190 		scene->_tunnelVertCircle.fixPriority(1);
3191 
3192 		scene->_tunnelHorzCircle.setPosition(Common::Point(-160, 73));
3193 		scene->_tunnelHorzCircle.setStrip(9);
3194 		scene->_tunnelHorzCircle.fixPriority(11);
3195 		scene->_tunnelHorzCircle.hide();
3196 		setDelay(1);
3197 		break;
3198 	case 7:
3199 		if ((scene->_shuttle._frame % 2) == 0) {
3200 			scene->_shuttle._frameChange = _direction;
3201 			scene->_mazeDirection = scene->_shuttle.changeFrame();
3202 			scene->_shuttle.setFrame(scene->_mazeDirection);
3203 		}
3204 		setDelay(1);
3205 		break;
3206 	case 8: {
3207 		R2_GLOBALS._player.enableControl();
3208 		R2_GLOBALS._player._canWalk = false;
3209 		scene->_directionChangesEnabled = true;
3210 		if ((scene->_shuttle._frame % 2) == 0) {
3211 			scene->_shuttle._frameChange = _direction;
3212 			scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3213 		}
3214 		// CHECKME: All the var_8 initialization was missing in the original
3215 		// but it's clearly a cut and paste error from case 4.
3216 		// The following code allows the switch to work properly.
3217 		int var_8 = (_direction * 2 + scene->_mazeDirection);
3218 		if (var_8 > 7)
3219 			var_8 = 1;
3220 		else if (var_8 < 1)
3221 			var_8 = 7;
3222 		//
3223 
3224 		switch (var_8 - 1) {
3225 		case 0:
3226 		// No break on purpose
3227 		case 4:
3228 			scene->_mazePosition.x = scene->_mazeUI.cellFromX(scene->_mazePosition.x + 70) - 70;
3229 			break;
3230 		case 2:
3231 		// No break on purpose
3232 		case 6:
3233 			scene->_mazePosition.y = scene->_mazeUI.cellFromY(scene->_mazePosition.y + 46) - 46;
3234 			break;
3235 		default:
3236 			break;
3237 		}
3238 		scene->_symbolLeft.hide();
3239 		scene->_symbolRight.hide();
3240 		_turningFl = false;
3241 		if (!_headingRightFl) {
3242 			scene->_throttle.updateSpeed();
3243 			if (scene->_mazeChangeAmount == scene->_speed)
3244 				scene->_aSound1.play(276);
3245 		}
3246 		break;
3247 		}
3248 	case 10: {
3249 		scene->_moverVertX = 160;
3250 		Common::Point pt(160, 73);
3251 		NpcMover *mover = new NpcMover();
3252 		scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
3253 
3254 		scene->_moverHorzX = 160 - (_direction * 2 * 160);
3255 		Common::Point pt2(scene->_moverHorzX, 73);
3256 		NpcMover *mover2 = new NpcMover();
3257 		scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
3258 		_actionIndex = 6;
3259 		}
3260 		break;
3261 	case 11: {
3262 		scene->_tunnelVertCircle.setStrip(2);
3263 		scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
3264 		scene->_moverVertX = 160 - (_direction * 2 * 160);
3265 		Common::Point pt(scene->_moverVertX, 73);
3266 		NpcMover *mover = new NpcMover();
3267 		scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
3268 		scene->_tunnelVertCircle.fixPriority(11);
3269 		if (!_headingRightFl)
3270 			scene->_tunnelHorzCircle.setStrip(1);
3271 		else
3272 			scene->_tunnelHorzCircle.setStrip(2);
3273 		scene->_tunnelHorzCircle.setPosition(Common::Point(160 - (_direction * 2 * 160), 73));
3274 		scene->_moverHorzX = 160;
3275 		Common::Point pt2(scene->_moverHorzX, 73);
3276 		NpcMover *mover2 = new NpcMover();
3277 		scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
3278 		scene->_tunnelHorzCircle.fixPriority(1);
3279 		_actionIndex = 5;
3280 		}
3281 		break;
3282 	default:
3283 		break;
3284 	}
3285 }
3286 
dispatch()3287 void Scene3500::Action1::dispatch() {
3288 	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3289 
3290 	Action::dispatch();
3291 	if ((_actionIndex == 1) && (scene->_mazeChangeAmount <= 4)) {
3292 		scene->_rotation->_idxChange = 0;
3293 		signal();
3294 	}
3295 }
3296 
3297 /*--------------------------------------------------------------------------*/
3298 
Action2()3299 Scene3500::Action2::Action2() {
3300 	_direction = 0;
3301 }
3302 
synchronize(Serializer & s)3303 void Scene3500::Action2::synchronize(Serializer &s) {
3304 	Action::synchronize(s);
3305 
3306 	s.syncAsSint16LE(_direction);
3307 }
3308 
handleVertButton(int direction)3309 void Scene3500::Action2::handleVertButton(int direction) {
3310 	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3311 
3312 	// Directions : 2 == up, -1 == down
3313 	_direction = direction;
3314 	if (_direction == -1)
3315 		scene->_horizontalSpeedDisplay.setFrame2(3);
3316 	else
3317 		scene->_horizontalSpeedDisplay.setFrame2(1);
3318 
3319 	setActionIndex(0);
3320 }
3321 
signal()3322 void Scene3500::Action2::signal() {
3323 	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3324 
3325 	int vertX;
3326 	int horzX;
3327 
3328 	switch (_actionIndex++) {
3329 	case 0: {
3330 		if (scene->_tunnelVertCircle._mover) {
3331 			vertX = scene->_moverVertX;
3332 			horzX = scene->_moverHorzX;
3333 		} else {
3334 			scene->_moverVertX = scene->_tunnelVertCircle._position.x;
3335 			vertX = scene->_moverVertX;
3336 			scene->_moverHorzX = scene->_tunnelHorzCircle._position.y;
3337 			horzX = scene->_moverHorzX;
3338 		}
3339 
3340 		scene->_tunnelVertCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
3341 		Common::Point pt(vertX, 73 - (_direction * 12));
3342 		NpcMover *mover = new NpcMover();
3343 		scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
3344 
3345 		scene->_tunnelHorzCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
3346 		Common::Point pt2(horzX, 73 - (_direction * 12));
3347 		NpcMover *mover2 = new NpcMover();
3348 		scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
3349 		scene->_mazeChangeAmount = (scene->_mazeChangeAmount / 2) + (scene->_mazeChangeAmount % 2);
3350 		setDelay(17 - scene->_mazeChangeAmount);
3351 		}
3352 		break;
3353 	case 1: {
3354 		R2_GLOBALS._sound2.play(339);
3355 		if (scene->_tunnelVertCircle._mover) {
3356 			vertX = scene->_moverVertX;
3357 			horzX = scene->_moverHorzX;
3358 		} else {
3359 			vertX = scene->_tunnelVertCircle._position.x;
3360 			horzX = scene->_tunnelHorzCircle._position.x;
3361 		}
3362 
3363 		scene->_throttle.updateSpeed();
3364 
3365 		scene->_tunnelVertCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
3366 		Common::Point pt(vertX, 73);
3367 		NpcMover *mover = new NpcMover();
3368 		scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
3369 
3370 		scene->_tunnelHorzCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
3371 		Common::Point pt2(horzX, 73);
3372 		NpcMover *mover2 = new NpcMover();
3373 		scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
3374 
3375 		scene->_horizontalSpeedDisplay.setFrame2(2);
3376 		}
3377 		break;
3378 	default:
3379 		break;
3380 	}
3381 }
3382 
3383 /*--------------------------------------------------------------------------*/
3384 
DirectionButton()3385 Scene3500::DirectionButton::DirectionButton() {
3386 	_movementId = 0;
3387 }
3388 
synchronize(Serializer & s)3389 void Scene3500::DirectionButton::synchronize(Serializer &s) {
3390 	NamedHotspot::synchronize(s);
3391 
3392 	s.syncAsSint16LE(_movementId);
3393 }
3394 
startAction(CursorType action,Event & event)3395 bool Scene3500::DirectionButton::startAction(CursorType action, Event &event) {
3396 	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3397 
3398 	if (!scene->_directionChangesEnabled) {
3399 		return true;
3400 	} else if (action == CURSOR_USE) {
3401 		R2_GLOBALS._sound2.play(14, nullptr, 63);
3402 		scene->doMovement(_movementId);
3403 		return true;
3404 	} else {
3405 		return SceneHotspot::startAction(action, event);
3406 	}
3407 }
3408 
3409 /*--------------------------------------------------------------------------*/
3410 
Throttle()3411 Scene3500::Throttle::Throttle() {
3412 	_deltaX = 1;
3413 	_deltaY = 0;
3414 	_slideDeltaY = 0;
3415 	_deltaMouseY = 0;
3416 }
3417 
synchronize(Serializer & s)3418 void Scene3500::Throttle::synchronize(Serializer &s) {
3419 	SceneActor::synchronize(s);
3420 
3421 	s.syncAsSint16LE(_pos.x);
3422 	s.syncAsSint16LE(_pos.y);
3423 	s.syncAsSint16LE(_deltaX);
3424 	s.syncAsSint16LE(_deltaY);
3425 	s.syncAsSint16LE(_slideDeltaY);
3426 	s.syncAsSint16LE(_deltaMouseY);
3427 }
3428 
init(int xp,int yp,int dx,int dy,int speed)3429 void Scene3500::Throttle::init(int xp, int yp, int dx, int dy, int speed) {
3430 	_deltaMouseY = 0;
3431 	_pos = Common::Point(xp, yp);
3432 	_deltaX = dx;
3433 	_deltaY = dy;
3434 	_slideDeltaY = _deltaY / _deltaX;
3435 
3436 	postInit();
3437 	setup(1050, 3, 1);
3438 	fixPriority(255);
3439 	setSpeed(speed);
3440 }
3441 
updateSpeed()3442 void Scene3500::Throttle::updateSpeed() {
3443 	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3444 
3445 	scene->_speed = _position.x - _pos.x;
3446 }
3447 
setSpeed(int arg1)3448 void Scene3500::Throttle::setSpeed(int arg1){
3449 	changePosition(Common::Point(_pos.x + arg1, _pos.y - (_slideDeltaY * arg1)));
3450 }
3451 
changePosition(const Common::Point & pt)3452 void Scene3500::Throttle::changePosition(const Common::Point &pt) {
3453 	setPosition(pt);
3454 }
3455 
process(Event & event)3456 void Scene3500::Throttle::process(Event &event) {
3457 	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3458 
3459 	if (!scene->_directionChangesEnabled)
3460 		return;
3461 
3462 	if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) && (_bounds.contains(event.mousePos))) {
3463 		_deltaMouseY = 1 + event.mousePos.y - _position.y;
3464 		event.eventType = EVENT_NONE;
3465 	}
3466 
3467 	if ((event.eventType == EVENT_BUTTON_UP) && (_deltaMouseY != 0)) {
3468 		_deltaMouseY = 0;
3469 		event.handled = true;
3470 		if (!scene->_action1._turningFl)
3471 			updateSpeed();
3472 	}
3473 
3474 	if (_deltaMouseY == 0)
3475 		return;
3476 
3477 	R2_GLOBALS._sound2.play(338);
3478 	event.handled = true;
3479 
3480 	int cx = event.mousePos.y - _deltaMouseY + 1;
3481 	if (_pos.y >= cx) {
3482 		if (_pos.y - _deltaY <= cx)
3483 			changePosition(Common::Point(((_pos.y - cx) / 2) + _pos.x + ((_pos.y - cx) % 2), cx));
3484 		else
3485 			changePosition(Common::Point(_pos.x + _deltaX, _pos.y - _deltaY));
3486 	} else {
3487 		changePosition(Common::Point(_pos.x, _pos.y));
3488 	}
3489 }
3490 
startAction(CursorType action,Event & event)3491 bool Scene3500::Throttle::startAction(CursorType action, Event &event) {
3492 	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3493 
3494 	if (!scene->_directionChangesEnabled) {
3495 		return true;
3496 	} else if (action == CURSOR_USE) {
3497 		return false;
3498 	} else {
3499 		return SceneActor::startAction(action, event);
3500 	}
3501 }
3502 
3503 /*--------------------------------------------------------------------------*/
3504 
cellFromX(int x)3505 int16 Scene3500::MazeUI3500::cellFromX(int x) {
3506 	return (_cellSize.x / 2) + x - (x % _cellSize.x);
3507 }
3508 
cellFromY(int y)3509 int16 Scene3500::MazeUI3500::cellFromY(int y) {
3510 	return (_cellSize.y / 2) + y - (y % _cellSize.y) - 1;
3511 }
3512 
getCellFromMapXY(Common::Point pt)3513 int Scene3500::MazeUI3500::getCellFromMapXY(Common::Point pt) {
3514 	int cellX = pt.x / _cellSize.x;
3515 	int cellY = pt.y / _cellSize.y;
3516 
3517 	if ((cellX >= 0) && (cellY >= 0) && (cellX < _mapCells.x) && (cellY < _mapCells.y)) {
3518 		return (int16)READ_LE_UINT16(_mapData + (_mapCells.x * cellY + cellX) * 2);
3519 	} else
3520 		return -1;
3521 }
3522 
setMazePosition2(Common::Point & p)3523 bool Scene3500::MazeUI3500::setMazePosition2(Common::Point &p) {
3524 	bool retVal = setMazePosition(p);
3525 	p = _mapOffset;
3526 
3527 	return retVal;
3528 }
3529 
3530 /*--------------------------------------------------------------------------*/
3531 
Scene3500()3532 Scene3500::Scene3500() {
3533 	_moverVertX = 0;
3534 	_moverHorzX = 0;
3535 	_rotation = NULL;
3536 	_mazeChangeAmount = 0;
3537 	_speed = 0;
3538 	_updateIdxChangeFl = false;
3539 	_mazeDirection = MAZEDIR_NONE;
3540 	_nextMove = 0;
3541 	_mazePosition.x = 0;
3542 	_mazePosition.y = 0;
3543 	_postFixupFl = true; // Set to true in fixup()
3544 	_exitCounter = 0;
3545 	_directionChangesEnabled = false;
3546 }
3547 
synchronize(Serializer & s)3548 void Scene3500::synchronize(Serializer &s) {
3549 	SceneExt::synchronize(s);
3550 	SYNC_POINTER(_rotation);
3551 
3552 	s.syncAsSint16LE(_moverVertX);
3553 	s.syncAsSint16LE(_moverHorzX);
3554 	s.syncAsSint16LE(_mazeChangeAmount);
3555 	s.syncAsSint16LE(_speed);
3556 	s.syncAsSint16LE(_updateIdxChangeFl);
3557 	s.syncAsSint16LE(_mazeDirection);
3558 	s.syncAsSint16LE(_nextMove);
3559 	s.syncAsSint16LE(_mazePosition.x);
3560 	s.syncAsSint16LE(_mazePosition.y);
3561 	s.syncAsSint16LE(_postFixupFl);
3562 	s.syncAsSint16LE(_exitCounter);
3563 	s.syncAsSint16LE(_directionChangesEnabled);
3564 }
3565 
postInit(SceneObjectList * OwnerList)3566 void Scene3500::postInit(SceneObjectList *OwnerList) {
3567 	byte tmpPal[768];
3568 
3569 	loadScene(1050);
3570 	R2_GLOBALS._uiElements._active = false;
3571 	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
3572 
3573 	R2_GLOBALS._sound1.play(305);
3574 	R2_GLOBALS._player._characterIndex = R2_QUINN;
3575 	R2_GLOBALS._player._characterScene[R2_QUINN] = 3500;
3576 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 3500;
3577 	R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3500;
3578 	_exitCounter = 0;
3579 	_postFixupFl = false;
3580 	_nextMove = 0;
3581 	_updateIdxChangeFl = true;
3582 	_speed = 4;
3583 	_mazeChangeAmount = 4;
3584 	_mazePosition = Common::Point(860, 891);
3585 	_rotation = R2_GLOBALS._scenePalette.addRotation(240, 254, -1);
3586 	_rotation->setDelay(0);
3587 	_rotation->_idxChange = 1;
3588 
3589 	for (int i = 240; i <= 254; i++) {
3590 		int tmpIndex = _rotation->_currIndex - 240;
3591 
3592 		if (tmpIndex > 254)
3593 			tmpIndex--;
3594 
3595 		tmpPal[3 * i] = R2_GLOBALS._scenePalette._palette[3 * tmpIndex];
3596 		tmpPal[(3 * i) + 1] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 1];
3597 		tmpPal[(3 * i) + 2] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 2];
3598 	}
3599 
3600 	for (int i = 240; i <= 254; i++) {
3601 		R2_GLOBALS._scenePalette._palette[3 * i] = tmpPal[3 * i];
3602 		R2_GLOBALS._scenePalette._palette[(3 * i) + 1] = tmpPal[(3 * i) + 1];
3603 		R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2];
3604 	}
3605 
3606 	_throttle.init(38, 165, 16, 32, _speed);
3607 	_throttle.setDetails(3500, 6, 7, -1, 1, (SceneItem *)NULL);
3608 	R2_GLOBALS._sound1.play(276);
3609 
3610 	_pitchDown._movementId = 88;
3611 	_pitchDown.setDetails(88, 3500, 18, 10, -1);
3612 
3613 	_turnLeft._movementId = 112;
3614 	_turnLeft.setDetails(112, 3500, 9, 10, -1);
3615 
3616 	_pitchUp._movementId = 104;
3617 	_pitchUp.setDetails(104, 3500, 15, 10, -1);
3618 
3619 	_turnRight._movementId = 96;
3620 	_turnRight.setDetails(96, 3500, 12, 10, -1);
3621 
3622 	_tunnelVertCircle.postInit();
3623 	_tunnelVertCircle.setup(1050, 1, 1);
3624 	_tunnelVertCircle.setPosition(Common::Point(160, 73));
3625 	_tunnelVertCircle.fixPriority(1);
3626 
3627 	_tunnelHorzCircle.postInit();
3628 	_tunnelHorzCircle.setup(1050, 2, 1);
3629 	_tunnelHorzCircle.setPosition(Common::Point(-160, 73));
3630 	_tunnelHorzCircle.fixPriority(11);
3631 	_tunnelHorzCircle.hide();
3632 
3633 	_outsideView.setDetails(27, 3500, 21, -1, -1);
3634 	_mapScreen.setDetails(Rect(160, 89, 299, 182), 3500, 3, -1, -1, 1, NULL);
3635 	_background.setDetails(Rect(0, 0, 320, 200), 3500, 0, -1, 2, 1, NULL);
3636 
3637 	_shuttle.postInit();
3638 	_mazeDirection = MAZEDIR_NORTH;
3639 	_shuttle.setup(1004, 1, _mazeDirection);
3640 	_shuttle.setPosition(Common::Point(230, 135));
3641 	_shuttle.fixPriority(200);
3642 	_shuttle._frameChange = 1;
3643 
3644 	_symbolLeft.postInit();
3645 	_symbolLeft.setup(1004, 3, 1);
3646 	_symbolLeft.setPosition(Common::Point(117, 163));
3647 	_symbolLeft.fixPriority(200);
3648 	_symbolLeft.hide();
3649 
3650 	_symbolVertical.postInit();
3651 	_symbolVertical.setup(1004, 3, 2);
3652 	_symbolVertical.setPosition(Common::Point(126, 163));
3653 	_symbolVertical.fixPriority(200);
3654 
3655 	_symbolRight.postInit();
3656 	_symbolRight.setup(1004, 3, 3);
3657 	_symbolRight.setPosition(Common::Point(135, 163));
3658 	_symbolRight.fixPriority(200);
3659 	_symbolRight.hide();
3660 
3661 	_verticalSpeedDisplay.postInit();
3662 	_verticalSpeedDisplay.setup(1004, 4, _mazeChangeAmount + 1);
3663 	_verticalSpeedDisplay.setPosition(Common::Point(126, 137));
3664 	_verticalSpeedDisplay.fixPriority(200);
3665 
3666 	_horizontalSpeedDisplay.postInit();
3667 	_horizontalSpeedDisplay.setup(1004, 5, 2);
3668 	_horizontalSpeedDisplay.setPosition(Common::Point(126, 108));
3669 	_horizontalSpeedDisplay.fixPriority(200);
3670 
3671 	_action1._turningFl = false;
3672 
3673 	_mazeUI.postInit();
3674 	_mazeUI.setDisplayBounds(Rect(160, 89, 299, 182));
3675 	_mazeUI.load(2);
3676 	_mazeUI.setMazePosition(_mazePosition);
3677 	_mazeUI.draw();
3678 	_directionChangesEnabled = true;
3679 
3680 	R2_GLOBALS._player.postInit();
3681 	R2_GLOBALS._player.hide();
3682 	R2_GLOBALS._player.enableControl(CURSOR_USE);
3683 	R2_GLOBALS._player._uiEnabled = false;
3684 	R2_GLOBALS._player._canWalk = false;
3685 }
3686 
doMovement(int id)3687 void Scene3500::doMovement(int id) {
3688 	switch (id) {
3689 	case -1:
3690 		_throttle.updateSpeed();
3691 		if (_speed != 0) {
3692 			_speed--;
3693 			_throttle.setSpeed(_speed);
3694 		}
3695 		if (_action1._turningFl)
3696 			_speed = 0;
3697 		break;
3698 	case 1:
3699 		_throttle.updateSpeed();
3700 		if (_speed < 16) {
3701 			++_speed;
3702 			_throttle.setSpeed(_speed);
3703 		}
3704 		if (_action1._turningFl)
3705 			_speed = 0;
3706 		break;
3707 	case 88:
3708 		// Up button has been pressed
3709 		// The original was doing a double check on action, only one is here.
3710 		if (!_action || (!_action1._turningFl)) {
3711 			_action2.handleVertButton(2);
3712 			if (_action && ((_action2.getActionIndex() != 0) || (_action2._direction != 2))) {
3713 				_action2.signal();
3714 			} else {
3715 				_tunnelHorzCircle.setAction(&_action2, &_tunnelHorzCircle, NULL);
3716 			}
3717 		}
3718 		break;
3719 	case 96:
3720 		// Right button has been pressed
3721 		if (!_action || !_action1._turningFl || (_action1._direction == 1)) {
3722 			if (_action && (_nextMove == 0) && (_action1._turningFl)) {
3723 				_nextMove = id;
3724 			} else if (_action && (!_action1._turningFl)) {
3725 				_action1.handleHorzButton(1);
3726 				_action1.signal();
3727 			} else if (!_action) {
3728 				_action1.handleHorzButton(1);
3729 				setAction(&_action1, &_shuttle, NULL);
3730 			}
3731 
3732 		} else {
3733 			if (_nextMove != 0)
3734 				_nextMove = 0;
3735 
3736 			_action1.turnShuttle(false);
3737 		}
3738 		break;
3739 	case 104:
3740 		// Down button has been pressed
3741 		if (!_action || (!_action1._turningFl)) {
3742 			_action2.handleVertButton(-1);
3743 			if ((_action) && ((_action2.getActionIndex() != 0) || (_action2._direction != -1))) {
3744 				_action2.signal();
3745 			} else {
3746 				_tunnelHorzCircle.setAction(&_action2, &_tunnelHorzCircle, NULL);
3747 			}
3748 		}
3749 		break;
3750 	case 112:
3751 		// Left button has been pressed
3752 		if (!_action || !_action1._turningFl || (_action1._direction == 1)) {
3753 			if (_action && (_nextMove == 0) && (_action1._turningFl)) {
3754 				_nextMove = id;
3755 			} else if (_action && (!_action1._turningFl)) {
3756 				_action1.handleHorzButton(-1);
3757 				_action1.signal();
3758 			} else if (!_action) {
3759 				_action1.handleHorzButton(-1);
3760 				setAction(&_action1, &_shuttle, NULL);
3761 			}
3762 
3763 		} else {
3764 			if (_nextMove != 0)
3765 				_nextMove = 0;
3766 
3767 			_action1.turnShuttle(false);
3768 		}
3769 		break;
3770 	default:
3771 		_speed = id;
3772 		_throttle.setSpeed(id);
3773 		if (_action1._turningFl) {
3774 			_speed = 0;
3775 		}
3776 		break;
3777 	}
3778 }
3779 
remove()3780 void Scene3500::remove() {
3781 	R2_GLOBALS._sound2.fadeOut2(NULL);
3782 	SceneExt::remove();
3783 }
3784 
signal()3785 void Scene3500::signal() {
3786 	R2_GLOBALS._player.enableControl(CURSOR_USE);
3787 	R2_GLOBALS._player._canWalk = false;
3788 	_directionChangesEnabled = true;
3789 }
3790 
process(Event & event)3791 void Scene3500::process(Event &event) {
3792 	if (!_directionChangesEnabled)
3793 		return;
3794 
3795 	if (event.eventType == EVENT_KEYPRESS) {
3796 		switch (event.kbd.keycode) {
3797 		case Common::KEYCODE_KP7:
3798 			R2_GLOBALS._sound2.play(338);
3799 			doMovement(16);
3800 			event.handled = true;
3801 			break;
3802 		case Common::KEYCODE_UP:
3803 		case Common::KEYCODE_KP8:
3804 			R2_GLOBALS._sound2.play(14, NULL, 63);
3805 			doMovement(88);
3806 			event.handled = true;
3807 			break;
3808 		case Common::KEYCODE_KP9:
3809 			if (_speed < 16)
3810 				R2_GLOBALS._sound2.play(338);
3811 			doMovement(1);
3812 			event.handled = true;
3813 			break;
3814 		case Common::KEYCODE_KP4:
3815 		case Common::KEYCODE_LEFT:
3816 			R2_GLOBALS._sound2.play(14, NULL, 63);
3817 			doMovement(112);
3818 			event.handled = true;
3819 			break;
3820 		case Common::KEYCODE_KP6:
3821 		case Common::KEYCODE_RIGHT:
3822 			R2_GLOBALS._sound2.play(14, NULL, 63);
3823 			doMovement(96);
3824 			event.handled = true;
3825 			break;
3826 		case Common::KEYCODE_KP1:
3827 			R2_GLOBALS._sound2.play(338);
3828 			doMovement(0);
3829 			event.handled = true;
3830 			break;
3831 		case Common::KEYCODE_KP2:
3832 		case Common::KEYCODE_DOWN:
3833 			R2_GLOBALS._sound2.play(14, NULL, 63);
3834 			doMovement(104);
3835 			event.handled = true;
3836 			break;
3837 		case Common::KEYCODE_KP3:
3838 			if (_speed != 0)
3839 				R2_GLOBALS._sound2.play(338);
3840 			doMovement(-1);
3841 			event.handled = true;
3842 			break;
3843 		case Common::KEYCODE_KP0:
3844 			R2_GLOBALS._sound2.play(338);
3845 			doMovement(8);
3846 			event.handled = true;
3847 			break;
3848 		case Common::KEYCODE_KP_PERIOD:
3849 			R2_GLOBALS._sound2.play(338);
3850 			doMovement(4);
3851 			event.handled = true;
3852 			break;
3853 		default:
3854 			break;
3855 		}
3856 	}
3857 
3858 	if (!event.handled)
3859 		_throttle.process(event);
3860 
3861 	if (!event.handled)
3862 		_pitchDown.process(event);
3863 
3864 	if (!event.handled)
3865 		_turnLeft.process(event);
3866 
3867 	if (!event.handled)
3868 		_pitchUp.process(event);
3869 
3870 	if (!event.handled)
3871 		_turnRight.process(event);
3872 
3873 	Scene::process(event);
3874 }
3875 
dispatch()3876 void Scene3500::dispatch() {
3877 	Rect tmpRect;
3878 	Scene::dispatch();
3879 
3880 	// WORKAROUND: The _mazeUI wasn't originally added to the scene in postInit.
3881 	// This is only needed to fix old savegames
3882 	if (!R2_GLOBALS._sceneObjects->contains(&_mazeUI))
3883 		_mazeUI.draw();
3884 
3885 	if (((_shuttle._frame % 2) == 0) && (!_action1._turningFl)) {
3886 		_shuttle.setFrame(_shuttle.changeFrame());
3887 		_mazeDirection = _shuttle._frame;
3888 	}
3889 
3890 	if ((_nextMove != 0) && (!_action1._turningFl)) {
3891 		int move = _nextMove;
3892 		_nextMove = 0;
3893 		doMovement(move);
3894 	}
3895 
3896 	if (!_rotation)
3897 		return;
3898 
3899 	int16 newMazeX = 0;
3900 	int16 newMazeY = 0;
3901 	int16 mazePosX = 0;
3902 	int16 mazePosY = 0;
3903 	int deltaX = 0;
3904 	int deltaY = 0;
3905 	int cellId = 0;
3906 
3907 	if ((_mazeChangeAmount == 0) && !_postFixupFl) {
3908 		if (_exitCounter == 2)
3909 			R2_GLOBALS._sceneManager.changeScene(1000);
3910 	} else {
3911 		_postFixupFl = false;
3912 		tmpRect.set(160, 89, 299, 182);
3913 
3914 		newMazeX = _mazePosition.x;
3915 		newMazeY = _mazePosition.y;
3916 		mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
3917 		mazePosY = _mazeUI.cellFromY(_mazePosition.y + 46) - 46;
3918 		deltaX = abs(mazePosX - newMazeX);
3919 		deltaY = abs(mazePosY - newMazeY);
3920 		int tmpCellId = 0;
3921 
3922 		switch (_mazeDirection) {
3923 		case MAZEDIR_NORTH:
3924 			cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
3925 			if (((cellId == 2) || (cellId == 3) || (cellId == 6) || (cellId == 1)) ||
3926 					((cellId == 25 || cellId == 26 || cellId == 5 || cellId == 14 || cellId == 15) && deltaX > 3)) {
3927 				R2_GLOBALS._sound2.play(339);
3928 				_rotation->_idxChange = 0;
3929 				_speed = 0;
3930 				_mazeChangeAmount = 0;
3931 				_updateIdxChangeFl = false;
3932 				if (!_action1._turningFl)
3933 					_tunnelVertCircle.hide();
3934 			} else {
3935 				mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
3936 				newMazeY = _mazePosition.y - _mazeChangeAmount;
3937 				tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
3938 				if (((cellId == 23) || (cellId == 24) || (cellId == 4)) && (cellId != tmpCellId)) {
3939 					newMazeY = mazePosY;
3940 					R2_GLOBALS._sound2.play(339);
3941 					_rotation->_idxChange = 0;
3942 					_speed = 0;
3943 					_mazeChangeAmount = 0;
3944 					_updateIdxChangeFl = false;
3945 					if (!_action1._turningFl)
3946 						_tunnelVertCircle.hide();
3947 				} else if ((cellId == 11) && (cellId != tmpCellId)) {
3948 					newMazeY = mazePosY + 3;
3949 					R2_GLOBALS._sound2.play(339);
3950 					_rotation->_idxChange = 0;
3951 					_speed = 0;
3952 					_mazeChangeAmount = 0;
3953 					_updateIdxChangeFl = false;
3954 					if (!_action1._turningFl)
3955 						_tunnelVertCircle.hide();
3956 				} else {
3957 					mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
3958 					deltaY = abs(mazePosY - newMazeY);
3959 					cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
3960 
3961 					if ( (((cellId == 23) || (cellId == 24) || (cellId == 4)) && (newMazeY <= mazePosY) && (_mazePosition.y>= mazePosY))
3962 						|| (((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)) && (_mazeChangeAmount >= deltaY) && (_mazeChangeAmount > 3) && (_action1._turningFl != 0)) ) {
3963 						newMazeY = mazePosY;
3964 						if ((cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 14) && (cellId != 15))
3965 							R2_GLOBALS._sound2.play(339);
3966 						_rotation->_idxChange = 0;
3967 						_speed = 0;
3968 						_mazeChangeAmount = 0;
3969 						_updateIdxChangeFl = false;
3970 						if (!_action1._turningFl)
3971 							_tunnelVertCircle.hide();
3972 					} else if ((cellId == 11) && (mazePosY + 3 >= newMazeY) && (_mazePosition.y >= mazePosY + 3)) {
3973 						R2_GLOBALS._sound2.play(339);
3974 						_rotation->_idxChange = 0;
3975 						_speed = 0;
3976 						_mazeChangeAmount = 0;
3977 						_updateIdxChangeFl = false;
3978 						if (!_action1._turningFl)
3979 							_tunnelVertCircle.hide();
3980 					} else if (((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)) && (deltaX != 0) && (deltaX <= 3)) {
3981 						newMazeX = mazePosX;
3982 						R2_GLOBALS._sound2.play(339);
3983 					} else {
3984 						// Nothing
3985 					}
3986 				}
3987 			}
3988 			break;
3989 		case MAZEDIR_EAST:
3990 			cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
3991 			if (  ((cellId == 12) || (cellId == 13) || (cellId == 11) || (cellId == 16) || (cellId == 31))
3992 			  || (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (deltaY > 3)) ) {
3993 				R2_GLOBALS._sound2.play(339);
3994 				_rotation->_idxChange = 0;
3995 				_speed = 0;
3996 				_mazeChangeAmount = 0;
3997 				_updateIdxChangeFl = false;
3998 				if (!_action1._turningFl)
3999 					_tunnelVertCircle.hide();
4000 			} else {
4001 				mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
4002 				newMazeX = _mazePosition.x + _mazeChangeAmount;
4003 				tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4004 				if (((cellId == 26) || (cellId == 24) || (cellId == 15)) && (cellId != tmpCellId)) {
4005 					newMazeX = mazePosX;
4006 					R2_GLOBALS._sound2.play(339);
4007 					_rotation->_idxChange = 0;
4008 					_speed = 0;
4009 					_mazeChangeAmount = 0;
4010 					_updateIdxChangeFl = false;
4011 					if (!_action1._turningFl)
4012 						_tunnelVertCircle.hide();
4013 				} else if ((cellId == 6) && (cellId != tmpCellId)) {
4014 					newMazeX = mazePosX - 5;
4015 					R2_GLOBALS._sound2.play(339);
4016 					_rotation->_idxChange = 0;
4017 					_speed = 0;
4018 					_mazeChangeAmount = 0;
4019 					_updateIdxChangeFl = false;
4020 					if (!_action1._turningFl)
4021 						_tunnelVertCircle.hide();
4022 				} else {
4023 					mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
4024 					deltaX = abs(newMazeX - mazePosX);
4025 					cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4026 					if ( (((cellId == 26) || (cellId == 24) || (cellId == 15)) && (newMazeX >= mazePosX) && (_mazePosition.x <= mazePosX))
4027 						|| (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (_mazeChangeAmount >= deltaX) && (_mazeChangeAmount <= 3) && (_action1._turningFl != 0)) ) {
4028 						newMazeX = mazePosX;
4029 						if ((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4))
4030 							R2_GLOBALS._sound2.play(339);
4031 						_rotation->_idxChange = 0;
4032 						_speed = 0;
4033 						_mazeChangeAmount = 0;
4034 						_updateIdxChangeFl = false;
4035 						if (!_action1._turningFl)
4036 							_tunnelVertCircle.hide();
4037 					} else if ((cellId == 6) && (mazePosX - 5 <= newMazeX) && (_mazePosition.x <= mazePosX - 5)) {
4038 						newMazeX = mazePosX - 5;
4039 						R2_GLOBALS._sound2.play(339);
4040 						_rotation->_idxChange = 0;
4041 						_speed = 0;
4042 						_mazeChangeAmount = 0;
4043 						_updateIdxChangeFl = false;
4044 						if (!_action1._turningFl)
4045 							_tunnelVertCircle.hide();
4046 					} else if (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (deltaY != 0) && (deltaY <= 3)) {
4047 						newMazeY = mazePosY;
4048 						R2_GLOBALS._sound2.play(339);
4049 					} else {
4050 						// Nothing
4051 					}
4052 				}
4053 			}
4054 			break;
4055 		case MAZEDIR_SOUTH:
4056 			cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4057 			if (  ((cellId == 2) || (cellId == 3) || (cellId == 6) || (cellId == 1))
4058 			  || (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (deltaX > 3)) ) {
4059 				R2_GLOBALS._sound2.play(339);
4060 				_rotation->_idxChange = 0;
4061 				_speed = 0;
4062 				_mazeChangeAmount = 0;
4063 				_updateIdxChangeFl = false;
4064 				if (!_action1._turningFl)
4065 					_tunnelVertCircle.hide();
4066 			} else {
4067 				mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
4068 				newMazeY = _mazePosition.y + _mazeChangeAmount;
4069 				tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4070 
4071 				if (((cellId == 25) || (cellId == 26) || (cellId == 5)) && (cellId != tmpCellId)) {
4072 					R2_GLOBALS._sound2.play(339);
4073 					_rotation->_idxChange = 0;
4074 					_speed = 0;
4075 					_mazeChangeAmount = 0;
4076 					_updateIdxChangeFl = false;
4077 					if (!_action1._turningFl)
4078 						_tunnelVertCircle.hide();
4079 				} else if ((cellId == 16) && (cellId != tmpCellId)) {
4080 					newMazeY = mazePosY - 3;
4081 					R2_GLOBALS._sound2.play(339);
4082 					_rotation->_idxChange = 0;
4083 					_speed = 0;
4084 					_mazeChangeAmount = 0;
4085 					_updateIdxChangeFl = false;
4086 					if (!_action1._turningFl)
4087 						_tunnelVertCircle.hide();
4088 				} else if ((cellId == 31) && (cellId != tmpCellId)) {
4089 					newMazeY = mazePosY + 4;
4090 					R2_GLOBALS._sound2.play(339);
4091 					_rotation->_idxChange = 0;
4092 					_speed = 0;
4093 					_mazeChangeAmount = 0;
4094 					_updateIdxChangeFl = false;
4095 					if (!_action1._turningFl)
4096 						_tunnelVertCircle.hide();
4097 				} else {
4098 					mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
4099 					deltaY = abs(newMazeY - mazePosY);
4100 					cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4101 					if ( (((cellId == 25) || (cellId == 26) || (cellId == 5)) && (newMazeY >= mazePosY) && (_mazePosition.y <= mazePosY))
4102 					  || (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (_mazeChangeAmount >= deltaY) && (_mazeChangeAmount <= 3) && (_action1._turningFl != 0)) ){
4103 						newMazeY = mazePosY;
4104 
4105 						if ((cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 14) && (cellId != 15))
4106 							R2_GLOBALS._sound2.play(339);
4107 						_rotation->_idxChange = 0;
4108 						_speed = 0;
4109 						_mazeChangeAmount = 0;
4110 						_updateIdxChangeFl = false;
4111 						if (!_action1._turningFl)
4112 							_tunnelVertCircle.hide();
4113 					} else if ((cellId == 16) && (mazePosY - 3 <= newMazeY) && (_mazePosition.y <= mazePosY - 3)) {
4114 						newMazeY = mazePosY - 3;
4115 						R2_GLOBALS._sound2.play(339);
4116 						_rotation->_idxChange = 0;
4117 						_speed = 0;
4118 						_mazeChangeAmount = 0;
4119 						_updateIdxChangeFl = false;
4120 						if (!_action1._turningFl)
4121 							_tunnelVertCircle.hide();
4122 					} else if ((cellId == 31) && (mazePosY + 4 <= newMazeY) && (_mazePosition.y <= mazePosY + 4)) {
4123 						newMazeY = mazePosY + 4;
4124 						_rotation->_idxChange = 0;
4125 						_speed = 0;
4126 						_mazeChangeAmount = 0;
4127 						_updateIdxChangeFl = false;
4128 						if (!_action1._turningFl)
4129 							_tunnelVertCircle.hide();
4130 						if ((newMazeX == 660) && (_mazeChangeAmount + 306 <= newMazeY) && (newMazeY <= 307))
4131 							 ++_exitCounter;
4132 						else
4133 							R2_GLOBALS._sound2.play(339);
4134 					} else if (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (deltaX != 0) && (deltaX <= 3)) {
4135 						newMazeX = mazePosX;
4136 						R2_GLOBALS._sound2.play(339);
4137 					} else {
4138 						// Nothing
4139 					}
4140 				}
4141 			}
4142 			break;
4143 		case MAZEDIR_WEST:
4144 			cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4145 			if ( ((cellId == 12) || (cellId == 13) || (cellId == 11) || (cellId == 16) || (cellId == 31))
4146 			 || (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (deltaY > 3)) ) {
4147 				R2_GLOBALS._sound2.play(339);
4148 				_rotation->_idxChange = 0;
4149 				_speed = 0;
4150 				_mazeChangeAmount = 0;
4151 				_updateIdxChangeFl = false;
4152 				if (!_action1._turningFl)
4153 					_tunnelVertCircle.hide();
4154 			} else {
4155 				mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
4156 				newMazeX = _mazePosition.x - _mazeChangeAmount;
4157 				tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4158 				if (((cellId == 25) || (cellId == 23) || (cellId == 14)) && (cellId != tmpCellId)) {
4159 					newMazeX = mazePosX;
4160 					R2_GLOBALS._sound2.play(339);
4161 					_rotation->_idxChange = 0;
4162 					_speed = 0;
4163 					_mazeChangeAmount = 0;
4164 					_updateIdxChangeFl = false;
4165 					if (!_action1._turningFl)
4166 						_tunnelVertCircle.hide();
4167 				} else if ((cellId == 1) && (cellId != tmpCellId)) {
4168 					newMazeX = mazePosX + 5;
4169 					R2_GLOBALS._sound2.play(339);
4170 					_rotation->_idxChange = 0;
4171 					_speed = 0;
4172 					_mazeChangeAmount = 0;
4173 					_updateIdxChangeFl = false;
4174 					if (!_action1._turningFl)
4175 						_tunnelVertCircle.hide();
4176 				} else {
4177 					mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
4178 					deltaX = abs(mazePosX - newMazeX);
4179 					cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4180 					if ( (((cellId == 25) || (cellId == 23) || (cellId == 14)) && (newMazeX <= mazePosX) && (_mazePosition.x >= mazePosX))
4181 					  || (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (_mazeChangeAmount >= deltaX) && (_mazeChangeAmount <= 3) && (_action1._turningFl)) ) {
4182 						newMazeX = mazePosX;
4183 						if ((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4))
4184 							R2_GLOBALS._sound2.play(339);
4185 						_rotation->_idxChange = 0;
4186 						_speed = 0;
4187 						_mazeChangeAmount = 0;
4188 						_updateIdxChangeFl = false;
4189 						if (!_action1._turningFl)
4190 							_tunnelVertCircle.hide();
4191 					} else if ((cellId == 1) && (newMazeX >= mazePosX + 5) && (_mazePosition.x >= mazePosX + 5)) {
4192 						newMazeX = mazePosX + 5;
4193 						R2_GLOBALS._sound2.play(339);
4194 						_rotation->_idxChange = 0;
4195 						_speed = 0;
4196 						_mazeChangeAmount = 0;
4197 						_updateIdxChangeFl = false;
4198 						if (!_action1._turningFl)
4199 							_tunnelVertCircle.hide();
4200 					} else if (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (deltaY != 0) && (deltaY <= 3)) {
4201 						newMazeY = mazePosY;
4202 						R2_GLOBALS._sound2.play(339);
4203 					} else {
4204 						// Nothing
4205 					}
4206 				}
4207 			}
4208 			break;
4209 		default:
4210 			break;
4211 		}
4212 
4213 		if (_exitCounter < 2) {
4214 			_mazePosition.x = newMazeX;
4215 			_mazePosition.y = newMazeY;
4216 			if (_mazeUI.setMazePosition2(_mazePosition) != 0) {
4217 				_updateIdxChangeFl = false;
4218 				_mazeChangeAmount = 0;
4219 				_speed = 0;
4220 				_rotation->setDelay(0);
4221 				_rotation->_idxChange = 0;
4222 			}
4223 
4224 			if (_exitCounter != 0)
4225 				++_exitCounter;
4226 		}
4227 	}
4228 
4229 	if (!_updateIdxChangeFl) {
4230 		if (_mazeChangeAmount != _speed) {
4231 			if (_mazeChangeAmount >= _speed) {
4232 				if (_mazeChangeAmount == 1) {
4233 					if (_action1._turningFl) {
4234 						if ( ((_mazeDirection == 1) && (deltaX == 0) && (deltaY != 0) && (deltaY <= 3) && ((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)))
4235 						  || ((_mazeDirection == 3) && (deltaY == 0) && (deltaX != 0) && (deltaX <= 3) && ((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)))
4236 						  || ((_mazeDirection == 5) && (deltaX == 0) && (deltaY != 0) && (deltaY <= 3) && ((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)))
4237 						  || ((_mazeDirection == 7) && (deltaY == 0) && (deltaX != 0) && (deltaX <= 3) && ((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4))) ){
4238 							_mazeChangeAmount = 1;
4239 						} else
4240 							_mazeChangeAmount--;
4241 					} else
4242 						_mazeChangeAmount--;
4243 				} else
4244 					_mazeChangeAmount--;
4245 			} else
4246 				++_mazeChangeAmount;
4247 			_updateIdxChangeFl = true;
4248 		}
4249 		_verticalSpeedDisplay.setFrame2(_mazeChangeAmount + 1);
4250 	}
4251 
4252 	if (_updateIdxChangeFl) {
4253 		if (_mazeChangeAmount == 0)
4254 			_rotation->_idxChange = 0;
4255 		else if (_mazeChangeAmount > 8)
4256 			_rotation->_idxChange = 2;
4257 		else
4258 			_rotation->_idxChange = 1;
4259 
4260 		_updateIdxChangeFl = false;
4261 	}
4262 
4263 	if (_mazeChangeAmount != 0) {
4264 		R2_GLOBALS._player._uiEnabled = false;
4265 		if (_mazeChangeAmount != _speed)
4266 			_aSound1.play(276);
4267 	} else {
4268 		R2_GLOBALS._player._uiEnabled = true;
4269 		_aSound1.fadeOut2(NULL);
4270 	}
4271 }
4272 
4273 /*--------------------------------------------------------------------------
4274  * Scene 3600 - Cutscene - walking at gunpoint
4275  *
4276  *--------------------------------------------------------------------------*/
4277 
Scene3600()4278 Scene3600::Scene3600() {
4279 	_tealDead = false;
4280 	_lightEntered = false;
4281 	_ghoulTeleported = false;
4282 }
synchronize(Serializer & s)4283 void Scene3600::synchronize(Serializer &s) {
4284 	SceneExt::synchronize(s);
4285 
4286 	s.syncAsSint16LE(_tealDead);
4287 	s.syncAsSint16LE(_lightEntered);
4288 	s.syncAsSint16LE(_ghoulTeleported);
4289 }
4290 
Action3600()4291 Scene3600::Action3600::Action3600() {
4292 	_part2Fl = false;
4293 	_fadePct = 0;
4294 }
4295 
synchronize(Serializer & s)4296 void Scene3600::Action3600::synchronize(Serializer &s) {
4297 	Action::synchronize(s);
4298 
4299 	s.syncAsSint16LE(_part2Fl);
4300 	s.syncAsSint16LE(_fadePct);
4301 }
4302 
signal()4303 void Scene3600::Action3600::signal() {
4304 	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
4305 
4306 	switch (_actionIndex) {
4307 	case 0:
4308 		++_actionIndex;
4309 		setDelay(60);
4310 		break;
4311 	case 1:
4312 		if (!_part2Fl) {
4313 			_part2Fl = true;
4314 			scene->_steppingDisk.setAction(NULL);
4315 			R2_GLOBALS._sound2.play(330, NULL, 0);
4316 			R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
4317 		}
4318 
4319 		setDelay(1);
4320 		R2_GLOBALS._scenePalette.fade((const byte *)&scene->_palette1._palette, true, _fadePct);
4321 		if (_fadePct > 0)
4322 			_fadePct -= 2;
4323 		break;
4324 	case 2:
4325 		R2_GLOBALS._sound2.stop();
4326 		++_actionIndex;
4327 		setDelay(3);
4328 		break;
4329 	case 3:
4330 		R2_GLOBALS._sound2.play(330, this, 0);
4331 		R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
4332 		_actionIndex = 1;
4333 		break;
4334 	default:
4335 		break;
4336 	}
4337 }
4338 
signal()4339 void Scene3600::Action2::signal() {
4340 	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
4341 
4342 	switch (_actionIndex) {
4343 	case 3621:
4344 		R2_GLOBALS._events.proc1();
4345 		R2_GLOBALS._player.enableControl();
4346 		_actionIndex = 3619;
4347 		scene->_protector._state = 0;
4348 		// fall through
4349 	case 3619: {
4350 		++_actionIndex;
4351 		scene->_protector.setup(3127, 2, 1);
4352 		scene->_protector.animate(ANIM_MODE_1, NULL);
4353 		NpcMover *mover = new NpcMover();
4354 		scene->_protector.addMover(mover, &scene->_protector._actorDestPos, scene);
4355 		}
4356 		break;
4357 	default:
4358 		_actionIndex = 3619;
4359 		setDelay(360);
4360 		break;
4361 	}
4362 }
4363 
startAction(CursorType action,Event & event)4364 bool Scene3600::LightShaft::startAction(CursorType action, Event &event) {
4365 	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
4366 
4367 	if ((action != CURSOR_USE) || !scene->_action1._part2Fl)
4368 		return SceneItem::startAction(action, event);
4369 
4370 	R2_GLOBALS._walkRegions.enableRegion(2);
4371 	R2_GLOBALS._walkRegions.enableRegion(7);
4372 
4373 	R2_GLOBALS._player.disableControl();
4374 	scene->_sceneMode = 3624;
4375 	scene->_quinn.setStrip2(-1);
4376 	scene->_seeker.setStrip2(-1);
4377 	scene->_miranda.setStrip2(-1);
4378 	scene->_webbster.setStrip2(-1);
4379 
4380 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
4381 		R2_GLOBALS._player.setAction(&scene->_sequenceManager3, scene, 3611, &R2_GLOBALS._player, NULL);
4382 	else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
4383 		R2_GLOBALS._player.setAction(&scene->_sequenceManager4, scene, 3612, &R2_GLOBALS._player, NULL);
4384 	else
4385 		R2_GLOBALS._player.setAction(&scene->_sequenceManager2, scene, 3610, &R2_GLOBALS._player, NULL);
4386 
4387 	return true;
4388 }
4389 
startAction(CursorType action,Event & event)4390 bool Scene3600::Protector::startAction(CursorType action, Event &event) {
4391 	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
4392 
4393 	switch(action) {
4394 	case CURSOR_TALK:
4395 		if (_action)
4396 			return SceneActor::startAction(action, event);
4397 
4398 		scene->_protectorSpeaker._displayMode = 1;
4399 		if (!R2_GLOBALS._player._mover)
4400 			R2_GLOBALS._player.addMover(NULL);
4401 		if (!scene->_quinn._mover)
4402 			scene->_quinn.addMover(NULL);
4403 		if (!scene->_seeker._mover)
4404 			scene->_seeker.addMover(NULL);
4405 		if (!scene->_miranda._mover)
4406 			scene->_miranda.addMover(NULL);
4407 		if (!scene->_webbster._mover)
4408 			scene->_webbster.addMover(NULL);
4409 
4410 		setup(3127, 2, 1);
4411 		scene->_sceneMode = 3327;
4412 		scene->_stripManager.start(3327, scene);
4413 
4414 		return true;
4415 	case R2_SONIC_STUNNER:
4416 	// No break on purpose
4417 	case R2_PHOTON_STUNNER:
4418 		if (action == R2_SONIC_STUNNER)
4419 			R2_GLOBALS._sound3.play(43);
4420 		else
4421 			R2_GLOBALS._sound3.play(99);
4422 
4423 		if (_state != 0) {
4424 			_state = 1;
4425 			setup(3128, 1, 1);
4426 			addMover(NULL);
4427 		}
4428 		scene->_action2.setActionIndex(3621);
4429 
4430 		if (!_action)
4431 			setAction(&scene->_action2, scene, NULL);
4432 
4433 		animate(ANIM_MODE_5, &scene->_action2);
4434 		R2_GLOBALS._player.disableControl();
4435 		return true;
4436 		break;
4437 	default:
4438 		return SceneActor::startAction(action, event);
4439 		break;
4440 	}
4441 }
4442 
postInit(SceneObjectList * OwnerList)4443 void Scene3600::postInit(SceneObjectList *OwnerList) {
4444 	if (R2_GLOBALS._sceneManager._previousScene == 3600) {
4445 		R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
4446 	} else {
4447 		R2_GLOBALS._scrollFollower = &_steppingDisk;
4448 		_sceneBounds = Rect(160, 0, 480, 200);
4449 	}
4450 
4451 	loadScene(3600);
4452 	SceneExt::postInit();
4453 
4454 	_stripManager.setColors(60, 255);
4455 	_stripManager.setFontNumber(3);
4456 	_stripManager.addSpeaker(&_quinnSpeaker);
4457 	_stripManager.addSpeaker(&_seekerSpeaker);
4458 	_stripManager.addSpeaker(&_mirandaSpeaker);
4459 	_stripManager.addSpeaker(&_tealSpeaker);
4460 	_stripManager.addSpeaker(&_protectorSpeaker);
4461 
4462 	setZoomPercents(142, 80, 167, 105);
4463 	R2_GLOBALS._player._characterScene[R2_QUINN] = 3600;
4464 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 3600;
4465 	R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3600;
4466 
4467 	_console.setDetails(33, 3600, 6, -1, -1);
4468 	_tapestry1.setDetails(Rect(3, 3, 22, 45), 3600, 9, -1, -1, 1, NULL);
4469 	_tapestry2.setDetails(Rect(449, 3, 475, 45), 3600, 9, -1, -1, 1, NULL);
4470 
4471 	_quinn.postInit();
4472 	_quinn._moveDiff = Common::Point(3, 2);
4473 	_quinn.changeZoom(-1);
4474 	_quinn._effect = EFFECT_SHADED;
4475 
4476 	if (R2_GLOBALS._player._characterIndex != R2_QUINN)
4477 		_quinn.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
4478 
4479 	_seeker.postInit();
4480 	_seeker._numFrames = 7;
4481 	_seeker._moveDiff = Common::Point(5, 3);
4482 	_seeker.changeZoom(-1);
4483 	_seeker._effect = EFFECT_SHADED;
4484 
4485 	if (R2_GLOBALS._player._characterIndex != R2_SEEKER)
4486 		_seeker.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
4487 
4488 	_miranda.postInit();
4489 	_miranda._moveDiff = Common::Point(3, 2);
4490 	_miranda.changeZoom(-1);
4491 	_miranda._effect = EFFECT_SHADED;
4492 
4493 	if (R2_GLOBALS._player._characterIndex != R2_MIRANDA)
4494 		_miranda.setDetails(9003, 1, -1, -1, 1, (SceneItem *) NULL);
4495 
4496 	R2_GLOBALS._player.postInit();
4497 	R2_GLOBALS._player.changeZoom(-1);
4498 	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
4499 	R2_GLOBALS._player.disableControl();
4500 
4501 	_webbster.postInit();
4502 	_webbster._numFrames = 7;
4503 	_webbster._moveDiff = Common::Point(5, 3);
4504 	_webbster.changeZoom(-1);
4505 	_webbster._effect = EFFECT_SHADED;
4506 	_webbster.setDetails(3600, 27, -1, -1, 1, (SceneItem *) NULL);
4507 
4508 	_teal.postInit();
4509 	_teal._numFrames = 7;
4510 	_teal._moveDiff = Common::Point(3, 2);
4511 	_teal.changeZoom(-1);
4512 	_teal._effect = EFFECT_SHADED;
4513 	_teal.setDetails(3600, 12, -1, -1, 1, (SceneItem *) NULL);
4514 
4515 	_palette1.loadPalette(0);
4516 	_palette1.loadPalette(3601);
4517 
4518 	if (R2_GLOBALS._sceneManager._previousScene == 3600) {
4519 		_lightShaft._sceneRegionId = 200;
4520 		_lightShaft.setDetails(3600, 30, -1, -1, 5, &_webbster);
4521 		_tealDead = true;
4522 
4523 		R2_GLOBALS._walkRegions.disableRegion(2);
4524 		R2_GLOBALS._walkRegions.disableRegion(7);
4525 		R2_GLOBALS._walkRegions.disableRegion(14);
4526 		R2_GLOBALS._walkRegions.disableRegion(15);
4527 		R2_GLOBALS._walkRegions.disableRegion(16);
4528 
4529 		_quinn.setup(10, 5, 11);
4530 		_quinn.animate(ANIM_MODE_1, NULL);
4531 
4532 		_seeker.setup(20, 5, 11);
4533 		_seeker.animate(ANIM_MODE_1, NULL);
4534 
4535 		_miranda.setup(30, 5, 11);
4536 		_miranda.animate(ANIM_MODE_1, NULL);
4537 
4538 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
4539 			_quinn.setPosition(Common::Point(76, 148));
4540 			_seeker.setPosition(Common::Point(134, 148));
4541 			_miranda.setPosition(Common::Point(100, 148));
4542 			R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
4543 			R2_GLOBALS._player.setup(20, _seeker._strip, 1);
4544 			R2_GLOBALS._player.setPosition(_seeker._position);
4545 			_seeker.hide();
4546 		} else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
4547 			_quinn.setPosition(Common::Point(110, 148));
4548 			_seeker.setPosition(Common::Point(76, 148));
4549 			_miranda.setPosition(Common::Point(134, 148));
4550 			R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4551 			R2_GLOBALS._player.setup(30, _miranda._strip, 1);
4552 			R2_GLOBALS._player.setPosition(_miranda._position);
4553 			_miranda.hide();
4554 		} else {
4555 			_quinn.setPosition(Common::Point(134, 148));
4556 			_seeker.setPosition(Common::Point(76, 148));
4557 			_miranda.setPosition(Common::Point(110, 148));
4558 			R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4559 			R2_GLOBALS._player.setup(10, _quinn._strip, 1);
4560 			R2_GLOBALS._player.setPosition(_quinn._position);
4561 			_quinn.hide();
4562 		}
4563 		_webbster.setPosition(Common::Point(47, 149));
4564 		_webbster.setup(40, 1, 11);
4565 		_webbster.animate(ANIM_MODE_1, NULL);
4566 
4567 		_teal.setPosition(Common::Point(367, 148));
4568 		_teal.setup(3601, 7, 5);
4569 
4570 		if (!R2_GLOBALS.getFlag(71)) {
4571 			_protector.postInit();
4572 			_protector._state = 0;
4573 			_protector._actorDestPos = Common::Point(226, 152);
4574 			_protector._moveDiff = Common::Point(3, 2);
4575 			_protector.setPosition(Common::Point(284, 152));
4576 			_protector.setup(3127, 2, 1);
4577 			_protector.changeZoom(-1);
4578 			_protector.setDetails(3600, 15, -1, 17, 1, (SceneItem *) NULL);
4579 		}
4580 
4581 		R2_GLOBALS._sound2.play(330);
4582 		_consoleLights.postInit();
4583 		_consoleLights.setPosition(Common::Point(84, 156));
4584 		_consoleLights.fixPriority(158);
4585 		_consoleLights.setup(3601, 5, 1);
4586 		_consoleLights.animate(ANIM_MODE_2, NULL);
4587 
4588 		_action1._part2Fl = true;
4589 		_action1._fadePct = 0;
4590 		_action1.setActionIndex(1);
4591 
4592 		_consoleLights.setAction(&_action1);
4593 		_sceneMode = 3623;
4594 
4595 		g_globals->_events.setCursor(CURSOR_ARROW);
4596 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
4597 	} else {
4598 		_tealDead = false;
4599 
4600 		R2_GLOBALS._walkRegions.disableRegion(17);
4601 		R2_GLOBALS._walkRegions.disableRegion(18);
4602 
4603 		_quinn.setPosition(Common::Point(393, 148));
4604 		_seeker.setPosition(Common::Point(364, 153));
4605 		_miranda.setPosition(Common::Point(413, 164));
4606 
4607 		R2_GLOBALS._player.hide();
4608 
4609 		_webbster.setPosition(Common::Point(373, 164));
4610 
4611 		_teal.setup(3403, 8, 11);
4612 		_teal.setPosition(Common::Point(403, 155));
4613 
4614 		_protector.setup(3403, 7, 1);
4615 		_protector.setPosition(Common::Point(405, 155));
4616 
4617 		_steppingDisk.postInit();
4618 		_steppingDisk.setup(3600, 2, 1);
4619 		_steppingDisk.setPosition(Common::Point(403, 161));
4620 		_steppingDisk.fixPriority(149);
4621 		_steppingDisk.changeZoom(-1);
4622 
4623 		_action1._part2Fl = false;
4624 		_action1._fadePct = 90;
4625 
4626 		_sceneMode = 3600;
4627 		setAction(&_sequenceManager1, this, 3600, &_seeker, &_quinn, &_miranda,
4628 			&_webbster, &_teal, &_steppingDisk, NULL);
4629 	}
4630 	_lightEntered = false;
4631 	_ghoulTeleported = R2_GLOBALS.getFlag(71);
4632 
4633 	R2_GLOBALS._sound1.play(326);
4634 	_background.setDetails(Rect(0, 0, 480, 200), 3600, 0, -1, -1, 1, NULL);
4635 }
4636 
remove()4637 void Scene3600::remove() {
4638 	_consoleLights.animate(ANIM_MODE_NONE, NULL);
4639 	_consoleLights.setAction(NULL);
4640 	R2_GLOBALS._sound2.fadeOut2(NULL);
4641 	R2_GLOBALS._sound1.fadeOut2(NULL);
4642 	R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
4643 	SceneExt::remove();
4644 }
4645 
signal()4646 void Scene3600::signal() {
4647 	switch (_sceneMode) {
4648 	case 3320:
4649 		// Move to the console
4650 		R2_GLOBALS._walkRegions.disableRegion(14);
4651 		R2_GLOBALS._scrollFollower = &_seeker;
4652 		_tealSpeaker._object1.hide();
4653 		_teal.show();
4654 		_teal.setStrip(2);
4655 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
4656 			_sceneMode = 3602;
4657 		else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
4658 			_sceneMode = 3603;
4659 		else
4660 			_sceneMode = 3601;
4661 		setAction(&_sequenceManager1, this, _sceneMode, &_seeker, &_quinn,
4662 			&_miranda, &_webbster, &_teal, NULL);
4663 		break;
4664 	case 3321:
4665 		// Teal activates console
4666 		R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
4667 		_tealSpeaker.stopSpeaking();
4668 		_teal.show();
4669 		_teal.setStrip(1);
4670 		_consoleLights.postInit();
4671 		_sceneMode = 3604;
4672 		setAction(&_sequenceManager1, this, _sceneMode, &_teal, &_consoleLights,
4673 			&_quinn, &_seeker, &_miranda, &_webbster, NULL);
4674 		break;
4675 	case 3322:
4676 		// Teal walks toward the teleport pod, the goule protector appears
4677 		_quinnSpeaker.stopSpeaking();
4678 		_quinnSpeaker._displayMode = 1;
4679 		_tealSpeaker.stopSpeaking();
4680 		_tealSpeaker._displayMode = 7;
4681 		R2_GLOBALS._scrollFollower = &_teal;
4682 		_sceneMode = 3605;
4683 		setAction(&_sequenceManager1, this, _sceneMode, &_teal, &_protector, &_steppingDisk, NULL);
4684 		break;
4685 	case 3323:
4686 		// Goule protector eats Teal guts then moves
4687 
4688 		if (!_tealDead)
4689 			_tealDead = true;
4690 		else {
4691 			_protectorSpeaker.stopSpeaking();
4692 			_protector.show();
4693 			_protector.setup(3258, 6, 1);
4694 
4695 			_sceneMode = 3607;
4696 			_protector.setAction(&_sequenceManager1, this, _sceneMode, &_protector, NULL);
4697 
4698 			_protectorSpeaker.stopSpeaking();
4699 			_protectorSpeaker._displayMode = 1;
4700 			_quinnSpeaker._displayMode = 1;
4701 			_protector.show();
4702 
4703 			R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
4704 			R2_GLOBALS._walkRegions.enableRegion(17);
4705 			R2_GLOBALS._walkRegions.enableRegion(18);
4706 			R2_GLOBALS._walkRegions.disableRegion(2);
4707 			R2_GLOBALS._walkRegions.disableRegion(7);
4708 			R2_GLOBALS._walkRegions.disableRegion(14);
4709 			R2_GLOBALS._walkRegions.disableRegion(15);
4710 			R2_GLOBALS._walkRegions.disableRegion(16);
4711 
4712 			_consoleLights.setAction(&_action1);
4713 		}
4714 		break;
4715 	case 3324:
4716 	// No break on purpose
4717 	case 3607:
4718 		g_globals->_events.setCursor(CURSOR_ARROW);
4719 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
4720 		_protector.fixPriority(-1);
4721 		_sceneMode = 3623;
4722 		break;
4723 	case 3327:
4724 		g_globals->_events.setCursor(CURSOR_ARROW);
4725 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
4726 		_sceneMode = 3623;
4727 		break;
4728 	case 3450:
4729 		// Speech of Teal and Quinn
4730 		R2_GLOBALS._sound1.stop();
4731 		_protector3400.hide();
4732 		_door3400.hide();
4733 
4734 		_sceneBounds = Rect(40, 0, SCREEN_WIDTH + 40, SCREEN_HEIGHT);
4735 		setZoomPercents(142, 80, 167, 105);
4736 		loadScene(3600);
4737 		R2_GLOBALS._uiElements.show();
4738 		_lightShaft._sceneRegionId = 200;
4739 		_lightShaft.setDetails(3600, 30, -1, -1, 5, &_webbster);
4740 
4741 		_consoleLights.show();
4742 		_quinn.show();
4743 		_seeker.show();
4744 		_miranda.show();
4745 		_webbster.show();
4746 		_teal.show();
4747 
4748 		_teal.setPosition(Common::Point(298, 151));
4749 
4750 		_protector.postInit();
4751 		_protector._state = 0;
4752 		_protector._actorDestPos = Common::Point(226, 152);
4753 		_protector._moveDiff = Common::Point(5, 3);
4754 		_protector.setup(3403, 7, 1);
4755 		_protector.setPosition(Common::Point(405, 155));
4756 		_protector.changeZoom(-1);
4757 		_protector.addMover(NULL);
4758 		_protector.animate(ANIM_MODE_NONE);
4759 		_protector.hide();
4760 		_protector.setDetails(3600, 15, -1, 17, 5, &_lightShaft);
4761 
4762 		_steppingDisk.setup(3600, 2, 1);
4763 		_steppingDisk.setPosition(Common::Point(403, 161));
4764 		_steppingDisk.fixPriority(149);
4765 		_steppingDisk.changeZoom(-1);
4766 		_steppingDisk.show();
4767 
4768 		_quinnSpeaker._displayMode = 2;
4769 		_tealSpeaker._displayMode = 2;
4770 
4771 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
4772 			R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
4773 			R2_GLOBALS._player.setup(20, _seeker._strip, 1);
4774 			R2_GLOBALS._player.setPosition(_seeker._position);
4775 			_seeker.hide();
4776 		} else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
4777 			R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4778 			R2_GLOBALS._player.setup(30, _miranda._strip, 1);
4779 			R2_GLOBALS._player.setPosition(_miranda._position);
4780 			_miranda.hide();
4781 		} else {
4782 			R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4783 			R2_GLOBALS._player.setup(10, _quinn._strip, 1);
4784 			R2_GLOBALS._player.setPosition(_quinn._position);
4785 			_quinn.hide();
4786 		}
4787 		R2_GLOBALS._player.show();
4788 		R2_GLOBALS._sound1.play(326);
4789 		_sceneMode = 3322;
4790 		_stripManager.start(3322, this);
4791 		R2_GLOBALS._sound2.play(329);
4792 		break;
4793 	case 3600:
4794 		// First speech by Teal
4795 		_sceneMode = 3320;
4796 		_stripManager.start(3320, this);
4797 		break;
4798 	case 3601:
4799 	// No break on purpose
4800 	case 3602:
4801 	// No break on purpose
4802 	case 3603:
4803 		// Teal speech near the console
4804 		R2_GLOBALS._walkRegions.disableRegion(2);
4805 		R2_GLOBALS._walkRegions.disableRegion(7);
4806 		_tealSpeaker._displayMode = 1;
4807 		_sceneMode = 3321;
4808 		_stripManager.start(3321, this);
4809 		break;
4810 	case 3604:
4811 		// Goule Protector forces the door
4812 		R2_GLOBALS._sound2.fadeOut2(NULL);
4813 		R2_GLOBALS._sound1.stop();
4814 		R2_GLOBALS._walkRegions.enableRegion(2);
4815 		R2_GLOBALS._walkRegions.enableRegion(7);
4816 
4817 		_steppingDisk.hide();
4818 		_consoleLights.hide();
4819 		R2_GLOBALS._player.hide();
4820 		_quinn.hide();
4821 		_seeker.hide();
4822 		_miranda.hide();
4823 		_webbster.hide();
4824 		_teal.hide();
4825 
4826 		_sceneBounds = Rect(60, 0, SCREEN_WIDTH + 60, SCREEN_HEIGHT);
4827 		setZoomPercents(51, 46, 180, 200);
4828 
4829 		loadScene(3400);
4830 		R2_GLOBALS._uiElements.show();
4831 		_protector3400.postInit();
4832 
4833 		_steppingDisk.setup(3403, 1, 1);
4834 		_steppingDisk.setPosition(Common::Point(190, 103));
4835 		_steppingDisk.fixPriority(89);
4836 		_steppingDisk.show();
4837 
4838 		_door3400.postInit();
4839 		_door3400.setup(3400, 1, 6);
4840 		_door3400.setPosition(Common::Point(236, 51));
4841 		_door3400.fixPriority(51);
4842 		R2_GLOBALS._scrollFollower = &_door3400;
4843 
4844 		R2_GLOBALS._sound1.play(323);
4845 		_sceneMode = 3450;
4846 		setAction(&_sequenceManager1, this, 3450, &_protector3400, &_door3400, NULL);
4847 		break;
4848 	case 3605:
4849 		// Goule protector jumps on Teal
4850 		_protector.setup(3258, 4, 1);
4851 		_protector.setAction(&_sequenceManager1, this, 3606, &_teal, &_protector,
4852 			&_steppingDisk, NULL);
4853 		_sceneMode = 3323;
4854 		_stripManager.start(3323, this);
4855 
4856 		break;
4857 	case 3620:
4858 	// No break on purpose
4859 	case 3623:
4860 		if ((_protector._position.x == 226) && (_protector._position.y == 152)
4861 				&& _action1._part2Fl && (_protector._visage == 3127) && (!R2_GLOBALS.getFlag(71))) {
4862 			R2_GLOBALS._sound2.stop();
4863 			R2_GLOBALS._sound2.play(331);
4864 			R2_GLOBALS.setFlag(71);
4865 			_sceneMode = 3626;
4866 			setAction(&_sequenceManager1, this, 3626, &_protector, NULL);
4867 		}
4868 		break;
4869 	case 3624:
4870 		R2_GLOBALS._player.disableControl();
4871 		if (_lightEntered && (_quinn._position.x == 229) && (_quinn._position.y == 154) && (_seeker._position.x == 181) && (_seeker._position.y == 154) && (_miranda._position.x == 207) && (_miranda._position.y == 154) && (_webbster._position.x == 155) && (_webbster._position.y == 154)) {
4872 			R2_GLOBALS._sound2.stop();
4873 			R2_GLOBALS._sound2.play(331);
4874 			_sceneMode = 3625;
4875 			setAction(&_sequenceManager1, this, 3625, &_quinn, &_seeker, &_miranda, &_webbster, NULL);
4876 		}
4877 		break;
4878 	case 3625:
4879 		R2_GLOBALS._sound2.stop();
4880 		R2_GLOBALS._sceneManager.changeScene(3700);
4881 		break;
4882 	case 3626:
4883 		_protector.setPosition(Common::Point(0, 0));
4884 		_action1.setActionIndex(2);
4885 		if (R2_GLOBALS._events.getCursor() > R2_LAST_INVENT) {
4886 			R2_GLOBALS._events.setCursor(CURSOR_USE);
4887 			R2_GLOBALS._player.enableControl(CURSOR_USE);
4888 		} else {
4889 			R2_GLOBALS._player.enableControl();
4890 		}
4891 		R2_GLOBALS._sound2.stop();
4892 		_sceneMode = 3623;
4893 		break;
4894 	default:
4895 		break;
4896 	}
4897 }
4898 
process(Event & event)4899 void Scene3600::process(Event &event) {
4900 	if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_ARROW)
4901 			&& (event.mousePos.x > 237) && (!R2_GLOBALS.getFlag(71))) {
4902 		SceneItem::display(3600, 17, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
4903 		event.handled = true;
4904 	}
4905 	Scene::process(event);
4906 }
4907 
dispatch()4908 void Scene3600::dispatch() {
4909 	if ((R2_GLOBALS._player.getRegionIndex() == 200) && _action1._part2Fl && !_lightEntered) {
4910 		R2_GLOBALS._sound2.fadeOut2(NULL);
4911 		if (_protector._mover)
4912 			_protector.addMover(NULL);
4913 
4914 		if (R2_GLOBALS._player._action)
4915 			R2_GLOBALS._player.setAction(NULL);
4916 		if (R2_GLOBALS._player._mover)
4917 			R2_GLOBALS._player.addMover(NULL);
4918 
4919 		_lightEntered = true;
4920 
4921 		R2_GLOBALS._walkRegions.enableRegion(2);
4922 		R2_GLOBALS._walkRegions.enableRegion(7);
4923 		R2_GLOBALS._player.disableControl();
4924 
4925 		_sceneMode = 3624;
4926 
4927 		_quinn.setStrip(-1);
4928 		_seeker.setStrip(-1);
4929 		_miranda.setStrip(-1);
4930 		_webbster.setStrip(-1);
4931 
4932 		R2_GLOBALS._player.hide();
4933 
4934 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
4935 			_seeker.setPosition(R2_GLOBALS._player._position);
4936 			_seeker.show();
4937 		} else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
4938 			_miranda.setPosition(R2_GLOBALS._player._position);
4939 			_miranda.show();
4940 		} else {
4941 			_quinn.setPosition(R2_GLOBALS._player._position);
4942 			_quinn.show();
4943 		}
4944 		_quinn.setAction(&_sequenceManager2, this, 3610, &_quinn, NULL);
4945 		_seeker.setAction(&_sequenceManager3, this, 3611, &_seeker, NULL);
4946 		_miranda.setAction(&_sequenceManager4, this, 3612, &_miranda, NULL);
4947 		_webbster.setAction(&_sequenceManager1, this, 3613, &_webbster, NULL);
4948 	}
4949 
4950 	if ((_protector.getRegionIndex() == 200) && _action1._part2Fl && !_ghoulTeleported) {
4951 		R2_GLOBALS._sound2.fadeOut2(NULL);
4952 		_sceneMode = 3620;
4953 		_ghoulTeleported = true;
4954 		R2_GLOBALS._player.disableControl();
4955 
4956 		if (R2_GLOBALS._player._mover)
4957 			R2_GLOBALS._player.addMover(NULL);
4958 		if (_quinn._mover)
4959 			_quinn.addMover(NULL);
4960 		if (_seeker._mover)
4961 			_seeker.addMover(NULL);
4962 		if (_miranda._mover)
4963 			_miranda.addMover(NULL);
4964 		if (_webbster._mover)
4965 			_webbster.addMover(NULL);
4966 	}
4967 
4968 	Scene::dispatch();
4969 }
4970 
4971 /*--------------------------------------------------------------------------
4972  * Scene 3700 - Cutscene - Teleport outside
4973  *
4974  *--------------------------------------------------------------------------*/
4975 
postInit(SceneObjectList * OwnerList)4976 void Scene3700::postInit(SceneObjectList *OwnerList) {
4977 	loadScene(3700);
4978 	R2_GLOBALS._uiElements._active = false;
4979 	R2_GLOBALS._uiElements._visible = false;
4980 	SceneExt::postInit();
4981 	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
4982 
4983 	_stripManager.setColors(60, 255);
4984 	_stripManager.setFontNumber(3);
4985 	_stripManager.addSpeaker(&_quinnSpeaker);
4986 	_stripManager.addSpeaker(&_seekerSpeaker);
4987 	_stripManager.addSpeaker(&_mirandaSpeaker);
4988 
4989 	_quinn.postInit();
4990 	_quinn._moveDiff = Common::Point(3, 2);
4991 
4992 	_seeker.postInit();
4993 	_seeker._numFrames = 7;
4994 	_seeker._moveDiff = Common::Point(5, 3);
4995 	_seeker.hide();
4996 
4997 	_miranda.postInit();
4998 	_miranda._moveDiff = Common::Point(3, 2);
4999 	_miranda.hide();
5000 
5001 	_webbster.postInit();
5002 	_webbster._numFrames = 7;
5003 	_webbster._moveDiff = Common::Point(5, 3);
5004 	_webbster.hide();
5005 
5006 	_teleportPad.postInit();
5007 
5008 	R2_GLOBALS._player.disableControl();
5009 	R2_GLOBALS._sound1.play(332);
5010 
5011 	_sceneMode = 3700;
5012 	setAction(&_sequenceManager, this, 3700, &_quinn, &_seeker, &_miranda,
5013 		&_webbster, &_teleportPad, NULL);
5014 }
5015 
remove()5016 void Scene3700::remove() {
5017 	R2_GLOBALS._sound1.fadeOut2(NULL);
5018 	SceneExt::remove();
5019 }
5020 
signal()5021 void Scene3700::signal() {
5022 	switch (_sceneMode) {
5023 	case 3328:
5024 	// No break on purpose
5025 	case 3329:
5026 		_sceneMode = 3701;
5027 		setAction(&_sequenceManager, this, 3701, &_seeker, &_miranda, &_webbster, NULL);
5028 		break;
5029 	case 3700:
5030 		_quinn.setup(10, 6, 1);
5031 		_seeker.setup(20, 5, 1);
5032 		if (R2_GLOBALS.getFlag(71)) {
5033 			_sceneMode = 3329;
5034 			_stripManager.start(3329, this);
5035 		} else {
5036 			_sceneMode = 3328;
5037 			_stripManager.start(3328, this);
5038 		}
5039 		break;
5040 	case 3701:
5041 		R2_GLOBALS._sceneManager.changeScene(1000);
5042 		break;
5043 	default:
5044 		R2_GLOBALS._player.enableControl();
5045 		break;
5046 	}
5047 }
5048 
5049 /*--------------------------------------------------------------------------
5050  * Scene 3800 - Desert
5051  *
5052  *--------------------------------------------------------------------------*/
5053 
Scene3800()5054 Scene3800::Scene3800() {
5055 	_desertDirection = 0;
5056 	_skylineRect.set(0, 0, 320, 87);
5057 }
5058 
synchronize(Serializer & s)5059 void Scene3800::synchronize(Serializer &s) {
5060 	SceneExt::synchronize(s);
5061 
5062 	s.syncAsSint16LE(_desertDirection);
5063 }
5064 
changeScene()5065 void Scene3800::NorthExit::changeScene() {
5066 	Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
5067 
5068 	_enabled = false;
5069 	R2_GLOBALS._player.disableControl();
5070 	scene->_desertDirection = 1;
5071 
5072 	if (R2_GLOBALS.getFlag(46)) {
5073 		if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
5074 			R2_GLOBALS._desertPreviousDirection = 3;
5075 			if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
5076 				R2_GLOBALS._desertStepsRemaining--;
5077 				R2_GLOBALS._desertCorrectDirection = 0;
5078 			} else {
5079 				R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
5080 				R2_GLOBALS._desertWrongDirCtr--;
5081 			}
5082 		} else {
5083 			++R2_GLOBALS._desertWrongDirCtr;
5084 			if (R2_GLOBALS._desertWrongDirCtr > 999)
5085 				R2_GLOBALS._desertWrongDirCtr = 999;
5086 			R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
5087 			R2_GLOBALS._desertCorrectDirection = 3;
5088 		}
5089 	}
5090 
5091 	if (R2_GLOBALS._desertStepsRemaining == 0)
5092 		scene->_sceneMode = 16;
5093 	else
5094 		scene->_sceneMode = 11;
5095 
5096 	Common::Point pt(160, 115);
5097 	NpcMover *mover = new NpcMover();
5098 	R2_GLOBALS._player.addMover(mover, &pt, scene);
5099 }
5100 
changeScene()5101 void Scene3800::EastExit::changeScene() {
5102 	Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
5103 
5104 	_enabled = false;
5105 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5106 	scene->_desertDirection = 2;
5107 
5108 	if (R2_GLOBALS.getFlag(46)) {
5109 		if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
5110 			R2_GLOBALS._desertPreviousDirection = 4;
5111 			if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
5112 				R2_GLOBALS._desertStepsRemaining--;
5113 				R2_GLOBALS._desertCorrectDirection = 0;
5114 			} else {
5115 				R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
5116 				R2_GLOBALS._desertWrongDirCtr--;
5117 			}
5118 		} else {
5119 			++R2_GLOBALS._desertWrongDirCtr;
5120 			if (R2_GLOBALS._desertWrongDirCtr > 999)
5121 				R2_GLOBALS._desertWrongDirCtr = 999;
5122 			R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
5123 			R2_GLOBALS._desertCorrectDirection = 4;
5124 		}
5125 	}
5126 
5127 	if (R2_GLOBALS._desertStepsRemaining == 0)
5128 		scene->_sceneMode = 16;
5129 	else
5130 		scene->_sceneMode = 12;
5131 
5132 	Common::Point pt(330, 145);
5133 	NpcMover *mover = new NpcMover();
5134 	R2_GLOBALS._player.addMover(mover, &pt, scene);
5135 }
5136 
changeScene()5137 void Scene3800::SouthExit::changeScene() {
5138 	Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
5139 
5140 	_enabled = false;
5141 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5142 	scene->_desertDirection = 3;
5143 
5144 	if (R2_GLOBALS.getFlag(46)) {
5145 		if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
5146 			R2_GLOBALS._desertPreviousDirection = 1;
5147 			if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
5148 				R2_GLOBALS._desertStepsRemaining--;
5149 				R2_GLOBALS._desertCorrectDirection = 0;
5150 			} else {
5151 				R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
5152 				R2_GLOBALS._desertWrongDirCtr--;
5153 			}
5154 		} else {
5155 			++R2_GLOBALS._desertWrongDirCtr;
5156 			if (R2_GLOBALS._desertWrongDirCtr > 999)
5157 				R2_GLOBALS._desertWrongDirCtr = 999;
5158 			R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
5159 			R2_GLOBALS._desertCorrectDirection = 1;
5160 		}
5161 	}
5162 
5163 	if (R2_GLOBALS._desertStepsRemaining == 0)
5164 		scene->_sceneMode = 16;
5165 	else
5166 		scene->_sceneMode = 13;
5167 
5168 	Common::Point pt(160, 220);
5169 	NpcMover *mover = new NpcMover();
5170 	R2_GLOBALS._player.addMover(mover, &pt, scene);
5171 }
5172 
changeScene()5173 void Scene3800::WestExit::changeScene() {
5174 	Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
5175 
5176 	_enabled = false;
5177 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5178 	scene->_desertDirection = 4;
5179 
5180 	if (R2_GLOBALS.getFlag(46)) {
5181 		if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
5182 			R2_GLOBALS._desertPreviousDirection = 2;
5183 			if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
5184 				R2_GLOBALS._desertStepsRemaining--;
5185 				R2_GLOBALS._desertCorrectDirection = 0;
5186 			} else {
5187 				R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
5188 				R2_GLOBALS._desertWrongDirCtr--;
5189 			}
5190 		} else {
5191 			++R2_GLOBALS._desertWrongDirCtr;
5192 			if (R2_GLOBALS._desertWrongDirCtr > 999)
5193 				R2_GLOBALS._desertWrongDirCtr = 999;
5194 			R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
5195 			R2_GLOBALS._desertCorrectDirection = 2;
5196 		}
5197 	}
5198 
5199 	if (R2_GLOBALS._desertStepsRemaining == 0)
5200 		scene->_sceneMode = 16;
5201 	else
5202 		scene->_sceneMode = 14;
5203 
5204 	Common::Point pt(-10, 145);
5205 	NpcMover *mover = new NpcMover();
5206 	R2_GLOBALS._player.addMover(mover, &pt, scene);
5207 }
5208 
initExits()5209 void Scene3800::initExits() {
5210 	_northExit._enabled = true;
5211 	_eastExit._enabled = true;
5212 	_southExit._enabled = true;
5213 	_westExit._enabled = true;
5214 	_northExit._insideArea = false;
5215 	_eastExit._insideArea = false;
5216 	_southExit._insideArea = false;
5217 	_westExit._insideArea = false;
5218 	_northExit._moving = false;
5219 	_eastExit._moving = false;
5220 	_southExit._moving = false;
5221 	_westExit._moving = false;
5222 
5223 	loadScene(R2_GLOBALS._maze3800SceneNumb);
5224 
5225 	R2_GLOBALS._uiElements.draw();
5226 }
5227 
enterArea()5228 void Scene3800::enterArea() {
5229 	R2_GLOBALS._player.disableControl(CURSOR_WALK);
5230 
5231 	switch (_desertDirection) {
5232 	case 0:
5233 		R2_GLOBALS._player.postInit();
5234 		R2_GLOBALS._player.setVisage(10);
5235 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
5236 		R2_GLOBALS._player.setPosition(Common::Point(160, 145));
5237 		R2_GLOBALS._player.setStrip(3);
5238 		R2_GLOBALS._player.changeZoom(-1);
5239 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
5240 
5241 		_quinnShadow.postInit();
5242 		_quinnShadow.fixPriority(10);
5243 		_quinnShadow.changeZoom(-1);
5244 		_quinnShadow.setVisage(1110);
5245 		_quinnShadow._effect = EFFECT_SHADOW_MAP;
5246 		_quinnShadow._shadowMap = this->_shadowPaletteMap;
5247 		R2_GLOBALS._player._linkedActor = &_quinnShadow;
5248 
5249 		switch (R2_GLOBALS._sceneManager._previousScene) {
5250 		case 2600:
5251 			_balloon.postInit();
5252 			_harness.postInit();
5253 			_quinnShadow.hide();
5254 			_sceneMode = 3800;
5255 			setAction(&_sequenceManager1, this, 3800, &R2_GLOBALS._player,
5256 				&_balloon, &_harness, NULL);
5257 			break;
5258 		case 3900:
5259 			_sceneMode = 15;
5260 			switch (R2_GLOBALS._desertPreviousDirection - 1) {
5261 			case 0: {
5262 				R2_GLOBALS._player.setPosition(Common::Point(160, 220));
5263 				Common::Point pt(160, 160);
5264 				NpcMover *mover = new NpcMover();
5265 				R2_GLOBALS._player.addMover(mover, &pt, this);
5266 				}
5267 				break;
5268 			case 1: {
5269 				R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
5270 				Common::Point pt(19, 145);
5271 				NpcMover *mover = new NpcMover();
5272 				R2_GLOBALS._player.addMover(mover, &pt, this);
5273 				}
5274 				break;
5275 			case 2: {
5276 				R2_GLOBALS._player.setPosition(Common::Point(160, 115));
5277 				Common::Point pt(160, 120);
5278 				NpcMover *mover = new NpcMover();
5279 				R2_GLOBALS._player.addMover(mover, &pt, this);
5280 				}
5281 				break;
5282 			case 3: {
5283 				R2_GLOBALS._player.setPosition(Common::Point(330, 145));
5284 				Common::Point pt(300, 145);
5285 				NpcMover *mover = new NpcMover();
5286 				R2_GLOBALS._player.addMover(mover, &pt, this);
5287 				}
5288 				break;
5289 			default:
5290 				break;
5291 			}
5292 			break;
5293 		default:
5294 			R2_GLOBALS._player.enableControl(CURSOR_WALK);
5295 			break;
5296 		}
5297 		break;
5298 	case 1: {
5299 		_sceneMode = 15;
5300 		R2_GLOBALS._player.setPosition(Common::Point(160, 220));
5301 		Common::Point pt(160, 160);
5302 		NpcMover *mover = new NpcMover();
5303 		R2_GLOBALS._player.addMover(mover, &pt, this);
5304 		}
5305 		break;
5306 	case 2: {
5307 		_sceneMode = 15;
5308 		R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
5309 		Common::Point pt(19, 145);
5310 		NpcMover *mover = new NpcMover();
5311 		R2_GLOBALS._player.addMover(mover, &pt, this);
5312 		}
5313 		break;
5314 	case 3: {
5315 		_sceneMode = 15;
5316 		R2_GLOBALS._player.setPosition(Common::Point(160, 115));
5317 		Common::Point pt(160, 120);
5318 		NpcMover *mover = new NpcMover();
5319 		R2_GLOBALS._player.addMover(mover, &pt, this);
5320 		}
5321 		break;
5322 	case 4: {
5323 		_sceneMode = 15;
5324 		R2_GLOBALS._player.setPosition(Common::Point(330, 145));
5325 		Common::Point pt(300, 145);
5326 		NpcMover *mover = new NpcMover();
5327 		R2_GLOBALS._player.addMover(mover, &pt, this);
5328 		}
5329 		break;
5330 	default:
5331 		break;
5332 	}
5333 }
5334 
postInit(SceneObjectList * OwnerList)5335 void Scene3800::postInit(SceneObjectList *OwnerList) {
5336 	_desertDirection = 0;
5337 
5338 	initExits();
5339 
5340 	SceneExt::postInit();
5341 	R2_GLOBALS._sound1.play(231);
5342 
5343 	scalePalette(65, 65, 65);
5344 
5345 	setZoomPercents(87, 40, 144, 100);
5346 
5347 	_northExit.setDetails(Rect(14, 87, 305, 125), SHADECURSOR_UP, 3800);
5348 	_northExit.setDest(Common::Point(160, 126));
5349 	_eastExit.setDetails(Rect(305, 87, 320, 168), EXITCURSOR_E, 3800);
5350 	_eastExit.setDest(Common::Point(312, 145));
5351 	_southExit.setDetails(Rect(14, 160, 305, 168), SHADECURSOR_DOWN, 3800);
5352 	_southExit.setDest(Common::Point(160, 165));
5353 	_westExit.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3800);
5354 	_westExit.setDest(Common::Point(7, 145));
5355 
5356 	_background.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *) NULL);
5357 
5358 	enterArea();
5359 }
5360 
signal()5361 void Scene3800::signal() {
5362 	switch (_sceneMode) {
5363 	case 11:
5364 		R2_GLOBALS._maze3800SceneNumb += 15;
5365 		if (R2_GLOBALS._maze3800SceneNumb > 3815)
5366 			R2_GLOBALS._maze3800SceneNumb -= 20;
5367 		initExits();
5368 		enterArea();
5369 		break;
5370 	case 12:
5371 		R2_GLOBALS._maze3800SceneNumb += 5;
5372 		if (R2_GLOBALS._maze3800SceneNumb > 3815)
5373 			R2_GLOBALS._maze3800SceneNumb = 3800;
5374 		initExits();
5375 		enterArea();
5376 		break;
5377 	case 13:
5378 		R2_GLOBALS._maze3800SceneNumb -= 15;
5379 		if (R2_GLOBALS._maze3800SceneNumb < 3800)
5380 			R2_GLOBALS._maze3800SceneNumb += 20;
5381 		initExits();
5382 		enterArea();
5383 		break;
5384 	case 14:
5385 		R2_GLOBALS._maze3800SceneNumb -= 5;
5386 		if (R2_GLOBALS._maze3800SceneNumb < 3800)
5387 			R2_GLOBALS._maze3800SceneNumb = 3815;
5388 		initExits();
5389 		enterArea();
5390 		break;
5391 	case 15:
5392 		R2_GLOBALS._player.enableControl();
5393 		break;
5394 	case 16:
5395 		g_globals->_sceneManager.changeScene(3900);
5396 		break;
5397 	case 3800:
5398 		_quinnShadow.show();
5399 		_balloon.remove();
5400 		_harness.remove();
5401 		R2_GLOBALS._player.enableControl();
5402 		break;
5403 	case 3805:
5404 		_northExit._enabled = false;
5405 		_eastExit._enabled = false;
5406 		_southExit._enabled = false;
5407 		_westExit._enabled = false;
5408 		R2_GLOBALS._player._canWalk = false;
5409 		R2_GLOBALS._events.setCursor(CURSOR_USE);
5410 		break;
5411 	case 3806:
5412 		_northExit._enabled = true;
5413 		_eastExit._enabled = true;
5414 		_southExit._enabled = true;
5415 		_westExit._enabled = true;
5416 		R2_GLOBALS._player.enableControl();
5417 		break;
5418 	default:
5419 		break;
5420 	}
5421 }
5422 
process(Event & event)5423 void Scene3800::process(Event &event) {
5424 	if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == EVENT_BUTTON_DOWN)
5425 			&& (_skylineRect.contains(event.mousePos))) {
5426 		event.handled = true;
5427 		switch (R2_GLOBALS._events.getCursor()) {
5428 		case CURSOR_WALK:
5429 			R2_GLOBALS._player.addMover(NULL);
5430 			R2_GLOBALS._player.updateAngle(event.mousePos);
5431 			break;
5432 		case CURSOR_LOOK:
5433 			SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
5434 			break;
5435 		case CURSOR_USE:
5436 			SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
5437 			break;
5438 		default:
5439 			event.handled = false;
5440 			break;
5441 		}
5442 	}
5443 
5444 	Scene::process(event);
5445 }
5446 
5447 /*--------------------------------------------------------------------------
5448  * Scene 3900 - Forest Entrance
5449  *
5450  *--------------------------------------------------------------------------*/
5451 
changeScene()5452 void Scene3900::NorthExit::changeScene() {
5453 	Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
5454 
5455 	_enabled = false;
5456 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5457 	R2_GLOBALS._desertCorrectDirection = 3;
5458 	R2_GLOBALS._desertPreviousDirection = 1;
5459 	R2_GLOBALS._desertStepsRemaining = 1;
5460 	scene->_sceneMode = 14;
5461 
5462 	Common::Point pt(160, 115);
5463 	NpcMover *mover = new NpcMover();
5464 	R2_GLOBALS._player.addMover(mover, &pt, scene);
5465 }
5466 
changeScene()5467 void Scene3900::EastExit::changeScene() {
5468 	Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
5469 
5470 	_enabled = false;
5471 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5472 	R2_GLOBALS._desertCorrectDirection = 4;
5473 	R2_GLOBALS._desertPreviousDirection = 2;
5474 	R2_GLOBALS._desertStepsRemaining = 1;
5475 	scene->_sceneMode = 14;
5476 
5477 	Common::Point pt(330, 145);
5478 	NpcMover *mover = new NpcMover();
5479 	R2_GLOBALS._player.addMover(mover, &pt, scene);
5480 }
5481 
changeScene()5482 void Scene3900::SouthExit::changeScene() {
5483 	Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
5484 
5485 	_enabled = false;
5486 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5487 	R2_GLOBALS._desertCorrectDirection = 1;
5488 	R2_GLOBALS._desertPreviousDirection = 3;
5489 	R2_GLOBALS._desertStepsRemaining = 1;
5490 	scene->_sceneMode = 14;
5491 
5492 	Common::Point pt(160, 220);
5493 	NpcMover *mover = new NpcMover();
5494 	R2_GLOBALS._player.addMover(mover, &pt, scene);
5495 }
5496 
changeScene()5497 void Scene3900::WestExit::changeScene() {
5498 	Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
5499 
5500 	_enabled = false;
5501 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5502 	R2_GLOBALS._desertCorrectDirection = 2;
5503 	R2_GLOBALS._desertPreviousDirection = 4;
5504 	R2_GLOBALS._desertStepsRemaining = 1;
5505 	scene->_sceneMode = 14;
5506 
5507 	Common::Point pt(-10, 145);
5508 	NpcMover *mover = new NpcMover();
5509 	R2_GLOBALS._player.addMover(mover, &pt, scene);
5510 }
5511 
changeScene()5512 void Scene3900::Exit5::changeScene() {
5513 	Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
5514 
5515 	_enabled = false;
5516 	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5517 	scene->_sceneMode = 13;
5518 
5519 	if (R2_GLOBALS._desertCorrectDirection == 4) {
5520 		Common::Point pt(-10, 135);
5521 		NpcMover *mover = new NpcMover();
5522 		R2_GLOBALS._player.addMover(mover, &pt, scene);
5523 	} else {
5524 		Common::Point pt(330, 135);
5525 		NpcMover *mover = new NpcMover();
5526 		R2_GLOBALS._player.addMover(mover, &pt, scene);
5527 	}
5528 
5529 	R2_GLOBALS._desertCorrectDirection = 0;
5530 }
5531 
postInit(SceneObjectList * OwnerList)5532 void Scene3900::postInit(SceneObjectList *OwnerList) {
5533 	if ((R2_GLOBALS._desertPreviousDirection == 2)
5534 			&& (R2_GLOBALS._sceneManager._previousScene != 2700))
5535 		loadScene(3825);
5536 	else
5537 		loadScene(3820);
5538 	SceneExt::postInit();
5539 
5540 	R2_GLOBALS._sound1.changeSound(231);
5541 	setZoomPercents(87, 40, 144, 100);
5542 
5543 	R2_GLOBALS._player.disableControl();
5544 	R2_GLOBALS._player.postInit();
5545 	R2_GLOBALS._player.setVisage(10);
5546 	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
5547 	R2_GLOBALS._player.setStrip(3);
5548 	R2_GLOBALS._player.changeZoom(-1);
5549 	R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
5550 
5551 	_quinnShadow.postInit();
5552 	_quinnShadow.fixPriority(10);
5553 	_quinnShadow.changeZoom(-1);
5554 	_quinnShadow.setVisage(1110);
5555 	_quinnShadow._effect = EFFECT_SHADOW_MAP;
5556 	_quinnShadow._shadowMap = _shadowPaletteMap;
5557 	R2_GLOBALS._player._linkedActor = &_quinnShadow;
5558 
5559 	if ((R2_GLOBALS._desertPreviousDirection == 2) && (R2_GLOBALS._sceneManager._previousScene != 2700)) {
5560 //		loadScene(3825);
5561 		R2_GLOBALS._desertCorrectDirection = 4;
5562 		_northExit.setDetails(Rect(29, 87, 305, 125), SHADECURSOR_UP, 3900);
5563 		_southExit.setDetails(Rect(29, 160, 305, 168), SHADECURSOR_DOWN, 3900);
5564 
5565 		_eastExit.setDetails(Rect(305, 87, 320, 168), EXITCURSOR_E, 3900);
5566 		_eastExit.setDest(Common::Point(312, 145));
5567 		_eastExit._enabled = true;
5568 		_eastExit._insideArea = false;
5569 		_eastExit._moving = false;
5570 
5571 		_westExit._enabled = false;
5572 
5573 		_westEnterForest.setDetails(Rect(0, 87, 29, 168), EXITCURSOR_W, 3900);
5574 		_westEnterForest.setDest(Common::Point(24, 135));
5575 	} else {
5576 //		loadScene(3820);
5577 		R2_GLOBALS._desertCorrectDirection = 2;
5578 		_northExit.setDetails(Rect(14, 87, 290, 125), SHADECURSOR_UP, 3900);
5579 		_southExit.setDetails(Rect(14, 160, 290, 168), SHADECURSOR_DOWN, 3900);
5580 
5581 		_eastExit._enabled = false;
5582 
5583 		_westExit.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3900);
5584 		_westExit.setDest(Common::Point(7, 145));
5585 		_westExit._enabled = true;
5586 		_westExit._insideArea = false;
5587 		_westExit._moving = false;
5588 
5589 		_westEnterForest.setDetails(Rect(290, 87, 320, 168), EXITCURSOR_E, 3900);
5590 		_westEnterForest.setDest(Common::Point(295, 135));
5591 	}
5592 	_westEnterForest._enabled = true;
5593 	_westEnterForest._insideArea = false;
5594 	_westEnterForest._moving = false;
5595 
5596 	scalePalette(65, 65, 65);
5597 
5598 	_northExit.setDest(Common::Point(160, 126));
5599 	_northExit._enabled = true;
5600 	_northExit._insideArea = false;
5601 	_northExit._moving = false;
5602 
5603 	_southExit.setDest(Common::Point(160, 165));
5604 	_southExit._enabled = true;
5605 	_southExit._insideArea = false;
5606 	_southExit._moving = false;
5607 
5608 	R2_GLOBALS._uiElements.draw();
5609 
5610 	_skylineRect.set(0, 0, 320, 87);
5611 	_background.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *)NULL);
5612 	if (R2_GLOBALS._sceneManager._previousScene == 3800) {
5613 		_sceneMode = 11;
5614 		switch (R2_GLOBALS._desertPreviousDirection) {
5615 		case 1: {
5616 			// Entering from the north
5617 			R2_GLOBALS._player.setPosition(Common::Point(160, 115));
5618 			Common::Point pt(160, 120);
5619 			NpcMover *mover = new NpcMover();
5620 			R2_GLOBALS._player.addMover(mover, &pt, this);
5621 			}
5622 			break;
5623 		case 2: {
5624 			// Entering from the east
5625 			R2_GLOBALS._player.setPosition(Common::Point(330, 145));
5626 			Common::Point pt(300, 145);
5627 			NpcMover *mover = new NpcMover();
5628 			R2_GLOBALS._player.addMover(mover, &pt, this);
5629 			}
5630 			break;
5631 		case 3: {
5632 			// Entering from the south
5633 			R2_GLOBALS._player.setPosition(Common::Point(160, 220));
5634 			Common::Point pt(160, 160);
5635 			NpcMover *mover = new NpcMover();
5636 			R2_GLOBALS._player.addMover(mover, &pt, this);
5637 			}
5638 			break;
5639 		case 4: {
5640 			// Entering from the west
5641 			R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
5642 			Common::Point pt(19, 145);
5643 			NpcMover *mover = new NpcMover();
5644 			R2_GLOBALS._player.addMover(mover, &pt, this);
5645 			}
5646 			break;
5647 		default:
5648 			break;
5649 		}
5650 	} else if (R2_GLOBALS._sceneManager._previousScene == 2700) {
5651 		_sceneMode = 12;
5652 		R2_GLOBALS._player.setPosition(Common::Point(330, 135));
5653 		Common::Point pt(265, 135);
5654 		NpcMover *mover = new NpcMover();
5655 		R2_GLOBALS._player.addMover(mover, &pt, this);
5656 	} else {
5657 		R2_GLOBALS._player.setPosition(Common::Point(160, 145));
5658 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
5659 	}
5660 }
5661 
signal()5662 void Scene3900::signal() {
5663 	switch (_sceneMode) {
5664 	case 11:
5665 	// No break on purpose
5666 	case 12:
5667 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
5668 		break;
5669 	case 13:
5670 		R2_GLOBALS._sceneManager.changeScene(2700);
5671 		break;
5672 	case 14:
5673 		R2_GLOBALS._sceneManager.changeScene(3800);
5674 		break;
5675 	case 3805:
5676 		_northExit._enabled = false;
5677 		_eastExit._enabled = false;
5678 		_southExit._enabled = false;
5679 		_westExit._enabled = false;
5680 		R2_GLOBALS._player._canWalk = false;
5681 		R2_GLOBALS._events.setCursor(CURSOR_USE);
5682 		break;
5683 	case 3806:
5684 		_northExit._enabled = true;
5685 		_eastExit._enabled = true;
5686 		_southExit._enabled = true;
5687 		_westExit._enabled = true;
5688 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
5689 		break;
5690 	default:
5691 		break;
5692 	}
5693 }
5694 
process(Event & event)5695 void Scene3900::process(Event &event) {
5696 	if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == EVENT_BUTTON_DOWN)
5697 			&& (_skylineRect.contains(event.mousePos))) {
5698 		event.handled = true;
5699 		switch (R2_GLOBALS._events.getCursor()) {
5700 		case CURSOR_WALK:
5701 			R2_GLOBALS._player.addMover(NULL);
5702 			R2_GLOBALS._player.updateAngle(event.mousePos);
5703 			break;
5704 		case CURSOR_USE:
5705 			SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
5706 			break;
5707 		case CURSOR_LOOK:
5708 			SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
5709 			break;
5710 		default:
5711 			event.handled = false;
5712 			break;
5713 		}
5714 	}
5715 	Scene::process(event);
5716 }
5717 
5718 } // End of namespace Ringworld2
5719 } // End of namespace TsAGE
5720