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 "common/math.h"
24 #include "graphics/cursorman.h"
25 
26 #include "tsage/scenes.h"
27 #include "tsage/dialogs.h"
28 #include "tsage/tsage.h"
29 #include "tsage/staticres.h"
30 #include "tsage/ringworld2/ringworld2_scenes1.h"
31 
32 namespace TsAGE {
33 
34 namespace Ringworld2 {
35 
36 /*--------------------------------------------------------------------------
37  * Scene 1000 - Cutscene scene
38  *
39  *--------------------------------------------------------------------------*/
40 
Scene1000()41 Scene1000::Scene1000(): SceneExt() {
42 	R2_GLOBALS._sceneManager._hasPalette = false;
43 	R2_GLOBALS._uiElements._active = false;
44 	_gameTextSpeaker._displayMode = 9;
45 	_forceCheckAnimationFl = false;
46 	_animCounter = 0;
47 }
48 
postInit(SceneObjectList * OwnerList)49 void Scene1000::postInit(SceneObjectList *OwnerList) {
50 	loadBlankScene();
51 	SceneExt::postInit();
52 
53 	_stripManager.addSpeaker(&_gameTextSpeaker);
54 	R2_GLOBALS._player.postInit();
55 	R2_GLOBALS._player.hide();
56 	R2_GLOBALS._player.disableControl();
57 
58 	switch (R2_GLOBALS._sceneManager._previousScene) {
59 	case 300:
60 		_sceneMode = R2_GLOBALS.getFlag(57) ? 40 : 0;
61 		break;
62 	case 1010:
63 		_sceneMode = 30;
64 		break;
65 	case 1100:
66 		_sceneMode = 10;
67 		break;
68 	case 1530:
69 		_sceneMode = 20;
70 		break;
71 	case 2500:
72 		_sceneMode = 100;
73 		break;
74 	case 2800:
75 		_sceneMode = 70;
76 		break;
77 	case 3100:
78 		if (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 1000)
79 			_sceneMode = 90;
80 		else
81 			_sceneMode = 80;
82 		break;
83 	case 3500:
84 		_sceneMode = 50;
85 		break;
86 	case 3700:
87 		_sceneMode = 60;
88 		break;
89 	default:
90 		_sceneMode = 999;
91 		break;
92 	}
93 
94 	R2_GLOBALS._uiElements._active = false;
95 	setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
96 }
97 
remove()98 void Scene1000::remove() {
99 	R2_GLOBALS._scenePalette.loadPalette(0);
100 	R2_GLOBALS._scenePalette.setEntry(255, 0xff, 0xff, 0xff);
101 	SceneExt::remove();
102 }
103 
signal()104 void Scene1000::signal() {
105 	ScenePalette scenePalette1, scenePalette2;
106 	uint32 black = 0;
107 
108 	switch (_sceneMode++) {
109 	case 0:
110 		// TODO: Determine correct colors
111 		R2_GLOBALS._gfxColors.foreground = 191;
112 		R2_GLOBALS._gfxColors.background = 144;
113 		R2_GLOBALS._fontColors.background = 224;
114 		R2_GLOBALS._fontColors.foreground = 119;
115 
116 		_animationPlayer._objectMode = ANIMOBJMODE_2;
117 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
118 		_animationPlayer.load(5, this);
119 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
120 		R2_GLOBALS._sceneManager._hasPalette = false;
121 
122 		_animationPlayer.dispatch();
123 		_forceCheckAnimationFl = true;
124 
125 		R2_GLOBALS._scenePalette.fade((const byte *)&black, true, 0);
126 		for (int percent = 0; percent < 100; percent += 5)
127 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
128 
129 		R2_GLOBALS._sound1.play(67);
130 		break;
131 
132 	case 1:
133 		R2_GLOBALS._sound1.fadeOut2(NULL);
134 
135 		// TODO: Determine correct colors
136 		R2_GLOBALS._gfxColors.foreground = 191;
137 		R2_GLOBALS._gfxColors.background = 144;
138 		R2_GLOBALS._fontColors.background = 224;
139 		R2_GLOBALS._fontColors.foreground = 119;
140 
141 		R2_GLOBALS._scenePalette.loadPalette(0);
142 		loadScene(9999);
143 
144 		R2_GLOBALS._player.setup(1140, 1, 1);
145 		R2_GLOBALS._player.setPosition(Common::Point(160, 100));
146 		R2_GLOBALS._player.show();
147 
148 		_animCounter = 0;
149 		_stripManager.start(29, this);
150 		break;
151 
152 	case 2:
153 		if (R2_GLOBALS._speechSubtitles & SPEECH_TEXT)
154 			setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
155 		else {
156 			if (++_animCounter < 3)
157 				_sceneMode = 2;
158 
159 			setAction(&_sequenceManager1, this, 2, &R2_GLOBALS._player, NULL);
160 		}
161 		break;
162 
163 	case 3:
164 		// TODO: Determine correct colors
165 		R2_GLOBALS._gfxColors.foreground = 191;
166 		R2_GLOBALS._gfxColors.background = 144;
167 		R2_GLOBALS._fontColors.background = 224;
168 		R2_GLOBALS._fontColors.foreground = 119;
169 
170 		for (int percent = 100; percent >= 0; percent -= 5)
171 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
172 
173 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
174 		_animationPlayer._objectMode = ANIMOBJMODE_2;
175 		_animationPlayer.load(7, this);
176 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
177 		R2_GLOBALS._sceneManager._hasPalette = false;
178 
179 		_animationPlayer.dispatch();
180 
181 		_forceCheckAnimationFl = true;
182 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
183 		for (int percent = 0; percent < 100; percent += 5)
184 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
185 
186 		R2_GLOBALS._sound2.play(81);
187 		R2_GLOBALS._sound1.play(80);
188 		break;
189 
190 	case 4:
191 		// TODO: Determine correct colors
192 		R2_GLOBALS._gfxColors.foreground = 191;
193 		R2_GLOBALS._gfxColors.background = 144;
194 		R2_GLOBALS._fontColors.background = 224;
195 		R2_GLOBALS._fontColors.foreground = 119;
196 
197 		R2_GLOBALS._sound2.fadeOut2(NULL);
198 		R2_GLOBALS._sound1.fadeOut2(NULL);
199 		R2_GLOBALS._sceneManager.changeScene(1100);
200 		break;
201 
202 	case 10:
203 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
204 		_animationPlayer._objectMode = ANIMOBJMODE_2;
205 		_animationPlayer.load(6, this);
206 
207 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
208 		R2_GLOBALS._sceneManager._hasPalette = false;
209 		_animationPlayer.dispatch();
210 
211 		_forceCheckAnimationFl = true;
212 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
213 		for (int percent = 0; percent < 100; percent += 5)
214 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
215 
216 		R2_GLOBALS._sound1.play(55);
217 		break;
218 
219 	case 11:
220 		R2_GLOBALS._scenePalette.loadPalette(0);
221 		R2_GLOBALS._sceneManager.changeScene(300);
222 		break;
223 
224 	case 20:
225 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
226 		_animationPlayer._objectMode = ANIMOBJMODE_2;
227 		_animationPlayer.load(8, this);
228 
229 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
230 		R2_GLOBALS._sceneManager._hasPalette = false;
231 		_animationPlayer.dispatch();
232 
233 		_forceCheckAnimationFl = true;
234 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
235 		for (int percent = 0; percent < 100; percent += 5)
236 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
237 		break;
238 
239 	case 21:
240 		R2_GLOBALS._scenePalette.loadPalette(0);
241 		R2_GLOBALS._sceneManager.changeScene(1530);
242 		break;
243 
244 	case 30:
245 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
246 		_animationPlayer._objectMode = ANIMOBJMODE_2;
247 		_animationPlayer.load(17, this);
248 
249 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
250 		R2_GLOBALS._sceneManager._hasPalette = false;
251 		_animationPlayer.dispatch();
252 
253 		_forceCheckAnimationFl = true;
254 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
255 		for (int percent = 0; percent < 100; percent += 5)
256 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
257 
258 		R2_GLOBALS._sound2.play(91);
259 		break;
260 
261 	case 31:
262 		R2_GLOBALS._sound2.fadeOut2(NULL);
263 		R2_GLOBALS._sound1.fadeOut2(NULL);
264 		R2_GLOBALS._scenePalette.loadPalette(0);
265 		R2_GLOBALS.setFlag(51);
266 		R2_GLOBALS._sceneManager.changeScene(300);
267 		break;
268 
269 	case 40:
270 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
271 		_animationPlayer._objectMode = ANIMOBJMODE_2;
272 		_animationPlayer.load(18, this);
273 
274 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
275 		R2_GLOBALS._sceneManager._hasPalette = false;
276 		_animationPlayer.dispatch();
277 
278 		_forceCheckAnimationFl = true;
279 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
280 		for (int percent = 0; percent < 100; percent += 5)
281 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
282 
283 		R2_GLOBALS._sound2.play(90);
284 		break;
285 
286 	case 41:
287 		R2_GLOBALS._scenePalette.loadPalette(0);
288 		R2_GLOBALS._sceneManager.changeScene(1010);
289 		break;
290 
291 	case 50:
292 		R2_GLOBALS._sound2.play(306);
293 		for (int percent = 100; percent >= 0; percent -= 5)
294 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
295 
296 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
297 		_animationPlayer._objectMode = ANIMOBJMODE_2;
298 		_animationPlayer.load(13, this);
299 
300 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
301 		R2_GLOBALS._sceneManager._hasPalette = false;
302 		_animationPlayer.dispatch();
303 
304 		_forceCheckAnimationFl = true;
305 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
306 		for (int percent = 0; percent < 100; percent += 5)
307 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
308 		break;
309 
310 	case 51:
311 		R2_GLOBALS._sound2.stop();
312 		R2_GLOBALS._sound2.play(307);
313 		R2_GLOBALS._sound1.play(308);
314 
315 		for (int percent = 100; percent >= 0; percent -= 5)
316 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
317 
318 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
319 		_animationPlayer._objectMode = ANIMOBJMODE_2;
320 		_animationPlayer.load(14, this);
321 
322 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
323 		R2_GLOBALS._sceneManager._hasPalette = false;
324 		_animationPlayer.dispatch();
325 
326 		_forceCheckAnimationFl = true;
327 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
328 		for (int percent = 0; percent < 100; percent += 5)
329 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
330 		break;
331 
332 	case 52:
333 		R2_GLOBALS._sound2.fadeOut2(NULL);
334 		R2_GLOBALS._sound1.fadeOut2(NULL);
335 		R2_GLOBALS._scenePalette.loadPalette(0);
336 		R2_GLOBALS._sceneManager.changeScene(3350);
337 		break;
338 
339 	case 60:
340 		R2_GLOBALS._sound1.play(333);
341 
342 		for (int percent = 100; percent >= 0; percent -= 5)
343 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
344 
345 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
346 		_animationPlayer._objectMode = ANIMOBJMODE_2;
347 		_animationPlayer.load(12, this);
348 
349 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
350 		R2_GLOBALS._sceneManager._hasPalette = false;
351 		_animationPlayer.dispatch();
352 
353 		_forceCheckAnimationFl = true;
354 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
355 		for (int percent = 0; percent < 100; percent += 5)
356 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
357 		break;
358 
359 	case 61:
360 		R2_GLOBALS._sound1.fadeOut2(NULL);
361 		R2_GLOBALS._scenePalette.loadPalette(0);
362 		R2_GLOBALS._sceneManager.changeScene(160);
363 		break;
364 
365 	case 70:
366 		R2_GLOBALS._sound2.play(113);
367 		for (int percent = 100; percent >= 0; percent -= 5)
368 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
369 
370 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
371 		_animationPlayer._objectMode = ANIMOBJMODE_2;
372 		_animationPlayer.load(9, this);
373 
374 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
375 		R2_GLOBALS._sceneManager._hasPalette = false;
376 		_animationPlayer.dispatch();
377 
378 		_forceCheckAnimationFl = true;
379 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
380 		for (int percent = 0; percent < 100; percent += 5)
381 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
382 		break;
383 
384 	case 71:
385 	case 81:
386 		R2_GLOBALS._sound1.fadeOut2(NULL);
387 		R2_GLOBALS._sound2.fadeOut2(NULL);
388 		R2_GLOBALS._scenePalette.loadPalette(0);
389 		R2_GLOBALS._sceneManager.changeScene(3100);
390 		break;
391 
392 	case 80:
393 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
394 		_animationPlayer._objectMode = ANIMOBJMODE_2;
395 		_animationPlayer.load(10, this);
396 
397 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
398 		R2_GLOBALS._sceneManager._hasPalette = false;
399 		_animationPlayer.dispatch();
400 
401 		_forceCheckAnimationFl = true;
402 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
403 		for (int percent = 0; percent < 100; percent += 5)
404 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
405 
406 		R2_GLOBALS._sound1.play(242);
407 		R2_GLOBALS._sound2.play(286);
408 		break;
409 
410 	case 90:
411 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
412 		_animationPlayer._objectMode = ANIMOBJMODE_2;
413 		_animationPlayer.load(11, this);
414 
415 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
416 		R2_GLOBALS._sceneManager._hasPalette = false;
417 		_animationPlayer.dispatch();
418 
419 		_forceCheckAnimationFl = true;
420 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
421 		for (int percent = 0; percent < 100; percent += 5)
422 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
423 
424 		R2_GLOBALS._sound1.play(277);
425 		break;
426 
427 	case 91:
428 		R2_GLOBALS._sound1.fadeOut2(NULL);
429 		R2_GLOBALS._player._characterIndex = R2_SEEKER;
430 		R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 3100;
431 		R2_GLOBALS._sceneManager.changeScene(2500);
432 		break;
433 
434 	case 100:
435 		R2_GLOBALS._sound1.play(304);
436 		R2_GLOBALS._sound2.play(82);
437 
438 		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
439 		_animationPlayer._objectMode = ANIMOBJMODE_2;
440 		_animationPlayer.load(19, this);
441 
442 		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
443 		R2_GLOBALS._sceneManager._hasPalette = false;
444 		_animationPlayer.dispatch();
445 
446 		_forceCheckAnimationFl = true;
447 		R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
448 		for (int percent = 0; percent < 100; percent += 5)
449 			R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
450 		break;
451 
452 	case 101:
453 		R2_GLOBALS._sound1.fadeOut2(NULL);
454 		R2_GLOBALS._sound2.fadeOut2(NULL);
455 		R2_GLOBALS._scenePalette.loadPalette(0);
456 		R2_GLOBALS._sceneManager.changeScene(3500);
457 		break;
458 
459 	default:
460 		break;
461 	}
462 }
463 
dispatch()464 void Scene1000::dispatch() {
465 	if (_forceCheckAnimationFl) {
466 		if (_animationPlayer.isCompleted()) {
467 			_forceCheckAnimationFl = false;
468 			_animationPlayer.close();
469 			_animationPlayer.remove();
470 
471 			if (_sceneMode == 52)
472 				_animationPlayer._endAction = this;
473 		} else
474 			_animationPlayer.dispatch();
475 	}
476 
477 	Scene::dispatch();
478 }
479 
480 
481 /*--------------------------------------------------------------------------
482  * Scene 1010 - Cutscene: A pixel lost in space!
483  *
484  *--------------------------------------------------------------------------*/
485 
postInit(SceneObjectList * OwnerList)486 void Scene1010::postInit(SceneObjectList *OwnerList) {
487 	loadScene(1010);
488 	R2_GLOBALS._uiElements._active = false;
489 	SceneExt::postInit();
490 	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
491 
492 	setZoomPercents(100, 1, 160, 100);
493 	R2_GLOBALS._player.postInit();
494 	R2_GLOBALS._player.setObjectWrapper(NULL);
495 	R2_GLOBALS._player.setPosition(Common::Point(30, 264));
496 	R2_GLOBALS._player.changeZoom(-1);
497 	R2_GLOBALS._player.disableControl();
498 
499 	setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
500 
501 	if (R2_GLOBALS.getFlag(57))
502 		_sceneMode = 1;
503 	else {
504 		R2_GLOBALS._sound1.play(89);
505 		_sceneMode = 0;
506 	}
507 }
508 
signal()509 void Scene1010::signal() {
510 	switch (_sceneMode) {
511 	case 1: {
512 		_sceneMode = 2;
513 		R2_GLOBALS._player.setup(1010, 2, 1);
514 		R2_GLOBALS._player.setPosition(Common::Point(297, 101));
515 		Common::Point pt(30, 264);
516 		NpcMover *mover = new NpcMover();
517 		R2_GLOBALS._player.addMover(mover, &pt, this);
518 		}
519 		break;
520 	case 2:
521 		_sceneMode = 3;
522 		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
523 		R2_GLOBALS._player.hide();
524 		break;
525 	case 3:
526 		if (R2_GLOBALS.getFlag(57))
527 			R2_GLOBALS._sceneManager.changeScene(1500);
528 		else
529 			R2_GLOBALS._sceneManager.changeScene(1000);
530 		break;
531 	default: {
532 		_sceneMode = 2;
533 		R2_GLOBALS._player.setup(1010, 1, 1);
534 		Common::Point pt(297, 101);
535 		NpcMover *mover = new NpcMover();
536 		R2_GLOBALS._player.addMover(mover, &pt, this);
537 		}
538 		break;
539 	}
540 }
541 
542 /*--------------------------------------------------------------------------
543  * Scene 1020 - Cutscene - trip in space 2
544  *
545  *--------------------------------------------------------------------------*/
546 
postInit(SceneObjectList * OwnerList)547 void Scene1020::postInit(SceneObjectList *OwnerList) {
548 	loadScene(1020);
549 	R2_GLOBALS._uiElements._active = false;
550 	SceneExt::postInit();
551 
552 	if (R2_GLOBALS._sceneManager._previousScene == 1010)
553 		_sceneBounds = Rect(160, 0, SCREEN_WIDTH + 160, 200);
554 
555 	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
556 	R2_GLOBALS._player.postInit();
557 
558 	if (R2_GLOBALS._sceneManager._previousScene == 1010) {
559 		R2_GLOBALS._player.setPosition(Common::Point(500, 100));
560 		R2_GLOBALS._player.setup(1020, 1, 1);
561 	} else {
562 		R2_GLOBALS._player.setPosition(Common::Point(0, 100));
563 		R2_GLOBALS._player.setup(1020, 2, 1);
564 	}
565 
566 	R2_GLOBALS._player.setObjectWrapper(NULL);
567 	R2_GLOBALS._player.hide();
568 	R2_GLOBALS._player.disableControl();
569 	setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
570 
571 	if (R2_GLOBALS._sceneManager._previousScene == 1010)
572 		_sceneMode = 0;
573 	else
574 		_sceneMode = 10;
575 }
576 
signal()577 void Scene1020::signal() {
578 	switch (_sceneMode) {
579 	case 0: {
580 		_sceneMode = 1;
581 		R2_GLOBALS._player.show();
582 		R2_GLOBALS._player.setPosition(Common::Point(347, 48));
583 		R2_GLOBALS._player._moveDiff = Common::Point(2, 1);
584 		R2_GLOBALS._player.setZoom(0);
585 		Common::Point pt(392, 41);
586 		NpcMover *mover = new NpcMover();
587 		R2_GLOBALS._player.addMover(mover, &pt, this);
588 		}
589 		break;
590 	case 1:
591 		_sceneMode = 2;
592 		R2_GLOBALS._player.setZoom(100);
593 		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
594 		break;
595 	case 2: {
596 		_sceneMode = 3;
597 		R2_GLOBALS._player._moveDiff = Common::Point(30, 15);
598 		Common::Point pt(-15, 149);
599 		NpcMover *mover = new NpcMover();
600 		R2_GLOBALS._player.addMover(mover, &pt, this);
601 		}
602 		break;
603 	case 3:
604 		_sceneMode = 4;
605 		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
606 		break;
607 	case 4:
608 		R2_GLOBALS.setFlag(51);
609 		R2_GLOBALS._sceneManager.changeScene(300);
610 		break;
611 	case 10: {
612 		_sceneMode = 11;
613 		R2_GLOBALS._player.setPosition(Common::Point(25, 133));
614 		R2_GLOBALS._player._moveDiff = Common::Point(30, 15);
615 		R2_GLOBALS._player.setZoom(100);
616 		Common::Point pt(355, 60);
617 		NpcMover *mover = new NpcMover();
618 		R2_GLOBALS._player.addMover(mover, &pt, this);
619 		}
620 		break;
621 	case 11:
622 		R2_GLOBALS._player.setPosition(Common::Point(355, 57));
623 		_sceneMode = 12;
624 		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
625 		break;
626 	case 12: {
627 		R2_GLOBALS._player.setPosition(Common::Point(355, 60));
628 		_sceneMode = 13;
629 		R2_GLOBALS._player._moveDiff = Common::Point(3, 1);
630 		Common::Point pt(347, 48);
631 		NpcMover *mover = new NpcMover();
632 		R2_GLOBALS._player.addMover(mover, &pt, this);
633 		}
634 		break;
635 	case 13:
636 		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
637 		if (R2_GLOBALS._player._percent < 1)
638 			_sceneMode = 14;
639 		break;
640 	case 14:
641 		R2_GLOBALS._sceneManager.changeScene(1010);
642 		break;
643 	default:
644 		break;
645 	}
646 }
647 
dispatch()648 void Scene1020::dispatch() {
649 	if (_sceneMode == 1) {
650 		R2_GLOBALS._player.setZoom(R2_GLOBALS._player._percent + 1);
651 		if (R2_GLOBALS._player._percent > 10)
652 			R2_GLOBALS._player._moveDiff.x = 3;
653 		if (R2_GLOBALS._player._percent > 20)
654 			R2_GLOBALS._player._moveDiff.x = 4;
655 	}
656 
657 	if ((_sceneMode == 13) && (R2_GLOBALS._player._percent != 0)) {
658 		R2_GLOBALS._player.setZoom(R2_GLOBALS._player._percent - 2);
659 		if (R2_GLOBALS._player._percent < 80)
660 			R2_GLOBALS._player._moveDiff.x = 2;
661 		if (R2_GLOBALS._player._percent < 70)
662 			R2_GLOBALS._player._moveDiff.x = 1;
663 	}
664 
665 	Scene::dispatch();
666 }
667 
668 /*--------------------------------------------------------------------------
669  * Scene 1100 - Canyon
670  *
671  *--------------------------------------------------------------------------*/
672 
Scene1100()673 Scene1100::Scene1100() {
674 	_nextStripNum = 0;
675 	_paletteRefreshStatus = 0;
676 }
677 
synchronize(Serializer & s)678 void Scene1100::synchronize(Serializer &s) {
679 	SceneExt::synchronize(s);
680 
681 	s.syncAsSint16LE(_nextStripNum);
682 	s.syncAsSint16LE(_paletteRefreshStatus);
683 }
684 
startAction(CursorType action,Event & event)685 bool Scene1100::Seeker::startAction(CursorType action, Event &event) {
686 	if (action != CURSOR_TALK)
687 		return SceneActor::startAction(action, event);
688 
689 	Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
690 
691 	if (R2_GLOBALS.getFlag(52)) {
692 		// The trouper is dead
693 		R2_GLOBALS._player.disableControl();
694 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
695 			scene->_nextStripNum = 327;
696 		else
697 			scene->_nextStripNum = 328;
698 		scene->_sceneMode = 53;
699 		scene->setAction(&scene->_sequenceManager1, scene, 1122, &R2_GLOBALS._player, NULL);
700 	} else {
701 		// The trouper is not dead
702 		R2_GLOBALS._player.disableControl();
703 		scene->_sceneMode = 55;
704 		if (R2_GLOBALS._stripModifier >= 3) {
705 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
706 				scene->_stripManager.start3(329, scene, R2_GLOBALS._stripManager_lookupList);
707 			else
708 				scene->_stripManager.start3(330, scene, R2_GLOBALS._stripManager_lookupList);
709 		} else {
710 			++R2_GLOBALS._stripModifier;
711 			R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
712 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
713 				scene->_stripManager.start3(304, scene, R2_GLOBALS._stripManager_lookupList);
714 			else
715 				scene->_stripManager.start3(308, scene, R2_GLOBALS._stripManager_lookupList);
716 		}
717 	}
718 	return true;
719 }
720 
startAction(CursorType action,Event & event)721 bool Scene1100::Trooper::startAction(CursorType action, Event &event) {
722 	Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
723 
724 	switch (action) {
725 	case R2_NEGATOR_GUN:
726 		if (_visage == 1105) {
727 			// Trooper wears the stasis shield
728 			R2_GLOBALS._player.disableControl();
729 			scene->_sceneMode = 1114;
730 			scene->setAction(&scene->_sequenceManager1, scene, 1114, &R2_GLOBALS._player, &scene->_trooper, NULL);
731 			return true;
732 		} else
733 			return SceneActor::startAction(action, event);
734 		break;
735 	case R2_SONIC_STUNNER:
736 	// No break on purpose
737 	case R2_PHOTON_STUNNER:
738 		if (_visage == 1105) {
739 			// If trooper wears the stasis shield
740 			R2_GLOBALS._player.disableControl();
741 			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
742 				scene->_sceneMode = 1112;
743 				scene->setAction(&scene->_sequenceManager1, scene, 1112, &R2_GLOBALS._player, &scene->_trooper, NULL);
744 			} else {
745 				scene->_sceneMode = 1115;
746 				scene->setAction(&scene->_sequenceManager1, scene, 1115, &R2_GLOBALS._player, &scene->_trooper, NULL);
747 			}
748 			return true;
749 		} else if (_strip == 2) {
750 			// Trooper wears his black uniform
751 			R2_GLOBALS._player.disableControl();
752 			scene->_sceneMode = 1113;
753 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
754 				scene->setAction(&scene->_sequenceManager1, scene, 1113, &R2_GLOBALS._player, &scene->_trooper, NULL);
755 			else
756 				scene->setAction(&scene->_sequenceManager1, scene, 1118, &R2_GLOBALS._player, &scene->_trooper, NULL);
757 			return true;
758 		} else
759 			return SceneActor::startAction(action, event);
760 		break;
761 	default:
762 		return SceneActor::startAction(action, event);
763 		break;
764 	}
765 }
766 
startAction(CursorType action,Event & event)767 bool Scene1100::Chief::startAction(CursorType action, Event &event) {
768 	// CHECKME: Flag 54 is never set. Guess: the flag means "Chief is dead"
769 	if ((action == CURSOR_TALK) && (!R2_GLOBALS.getFlag(54)) && (R2_GLOBALS.getFlag(52))) {
770 		// Talk to chief after the trooper dies
771 		Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
772 
773 		scene->_nextStripNum = 0;
774 		R2_GLOBALS._player.disableControl();
775 		scene->_sceneMode = 53;
776 		scene->setAction(&scene->_sequenceManager1, scene, 1122, &R2_GLOBALS._player, NULL);
777 		return true;
778 	}
779 
780 	return SceneActor::startAction(action, event);
781 }
782 
postInit(SceneObjectList * OwnerList)783 void Scene1100::postInit(SceneObjectList *OwnerList) {
784 	if ((R2_GLOBALS._sceneManager._previousScene == 300) || (R2_GLOBALS._sceneManager._previousScene == 1100))
785 		loadScene(1150);
786 	else
787 		loadScene(1100);
788 
789 	if ((R2_GLOBALS._sceneManager._previousScene == 1000) && (!R2_GLOBALS.getFlag(44)))
790 		R2_GLOBALS._uiElements._active = false;
791 
792 	if (R2_GLOBALS._player._characterScene[R2_QUINN] == 1100)
793 		R2_GLOBALS._sceneManager._previousScene = 1100;
794 
795 	if (R2_GLOBALS._sceneManager._previousScene == -1)
796 		R2_GLOBALS._uiElements._active = false;
797 
798 	SceneExt::postInit();
799 
800 	if (R2_GLOBALS._sceneManager._previousScene == -1)
801 		R2_GLOBALS._sceneManager._previousScene = 1000;
802 
803 	_stripManager.setColors(60, 255);
804 	_stripManager.setFontNumber(3);
805 	_stripManager.addSpeaker(&_seekerSpeaker);
806 	_stripManager.addSpeaker(&_quinnSpeaker);
807 	_stripManager.addSpeaker(&_chiefSpeaker);
808 
809 	scalePalette(65, 65, 65);
810 
811 	_cloud.postInit();
812 	_cloud.setup(1100, 1, 1);
813 	_cloud.fixPriority(10);
814 
815 	R2_GLOBALS._scrollFollower = NULL;
816 
817 	_fuana1.setDetails(Rect(56, 47, 68, 83), 1100, 7, -1, -1, 1, NULL);
818 	_fauna2.setDetails(Rect(167, 132, 183, 167), 1100, 7, -1, -1, 1, NULL);
819 	_bouldersBlockingCave.setDetails(Rect(26, 112, 87, 145), 1100, 13, -1, -1, 1, NULL);
820 	_trail.setDetails(Rect(4, 70, 79, 167), 1100, 16, -1, -1, 1, NULL);
821 
822 	R2_GLOBALS._sound1.stop();
823 
824 	if (R2_GLOBALS._sceneManager._previousScene == 300) {
825 		if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
826 			R2_GLOBALS._player._characterIndex = R2_QUINN;
827 		R2_GLOBALS._player._characterScene[R2_QUINN] = 1100;
828 		R2_GLOBALS._player._characterScene[R2_SEEKER] = 1100;
829 		_cloud.setPosition(Common::Point(150, 30));
830 		R2_GLOBALS._sound1.play(93);
831 		R2_GLOBALS._player.postInit();
832 		R2_GLOBALS._player.hide();
833 		R2_GLOBALS._player.disableControl();
834 
835 		_seeker.postInit();
836 		_seeker.hide();
837 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
838 			_seeker.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
839 		else
840 			_seeker.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
841 
842 		_chief.postInit();
843 		_chief.setup(1113, 3, 1);
844 		_chief.setPosition(Common::Point(181, 125));
845 		_chief.fixPriority(110);
846 
847 		if (R2_GLOBALS.getFlag(54))
848 			_chief.setDetails(1100, 4, -1, -1, 1, (SceneItem *) NULL);
849 		else
850 			_chief.setDetails(1100, 3, -1, -1, 1, (SceneItem *) NULL);
851 
852 		_trooper.postInit();
853 		// Trooper wears his stasis shield
854 		_trooper.setup(1105, 3, 1);
855 		_trooper.setPosition(Common::Point(312, 165));
856 		_trooper._numFrames = 5;
857 		_trooper.setDetails(1100, 22, 23, 24, 1, (SceneItem *) NULL);
858 
859 		_ship.postInit();
860 		_ship.setup(1512, 1, 1);
861 		_ship.setPosition(Common::Point(187, -25));
862 		_ship.fixPriority(48);
863 		_ship._moveDiff.y = 1;
864 		_ship.setDetails(1100, 37, -1, -1, 1, (SceneItem *) NULL);
865 
866 		_sceneMode = 20;
867 
868 		setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
869 	} else if (R2_GLOBALS._sceneManager._previousScene == 1000) {
870 		_cloud.setPosition(Common::Point(50, 30));
871 		_paletteRefreshStatus = 0;
872 		_palette1.loadPalette(1101);
873 		R2_GLOBALS._player.postInit();
874 		R2_GLOBALS._player.disableControl();
875 		R2_GLOBALS._player._effect = EFFECT_SHADOW_MAP;
876 		R2_GLOBALS._player._shadowMap = _shadowPaletteMap;
877 		R2_GLOBALS._player.setup(1102, 3, 2);
878 		R2_GLOBALS._player.setObjectWrapper(NULL);
879 		R2_GLOBALS._player.setPosition(Common::Point(111,-20));
880 		R2_GLOBALS._player.fixPriority(150);
881 		R2_GLOBALS._player._moveRate = 30;
882 		R2_GLOBALS._player._moveDiff = Common::Point(16, 2);
883 
884 		_rightLandslide.setup2(1104, 2, 1, 175, 125, 102, EFFECT_SHADED);
885 		_purplePlant.setup2(1102, 5, 1, 216, 167, 1, EFFECT_NONE);
886 
887 		_leftImpacts.postInit();
888 		_leftImpacts.setup(1113, 2, 1);
889 		_leftImpacts.setPosition(Common::Point(67, 151));
890 		_leftImpacts.fixPriority(255);
891 
892 		_shipFormation.postInit();
893 		_shipFormation.setup(1102, 6, 1);
894 		_shipFormation._moveRate = 30;
895 		_shipFormation._moveDiff.x = 2;
896 
897 		_shipFormationShadow.postInit();
898 		_shipFormationShadow.setup(1102, 6, 2);
899 		_shipFormationShadow._moveRate = 30;
900 		_shipFormationShadow._moveDiff.x = 2;
901 		_shipFormationShadow._effect = EFFECT_SHADOW_MAP;
902 		_shipFormationShadow._shadowMap = _shadowPaletteMap;
903 
904 		R2_GLOBALS._sound1.play(86);
905 
906 		_sceneMode = 0;
907 
908 		setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
909 	} else {
910 		_cloud.setPosition(Common::Point(180, 30));
911 		if (R2_GLOBALS.getFlag(52))
912 			// Trooper is dead
913 			R2_GLOBALS._sound1.play(98);
914 		else
915 			// Trooper is alive
916 			R2_GLOBALS._sound1.play(95);
917 
918 		R2_GLOBALS._player.postInit();
919 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
920 
921 		_seeker.postInit();
922 
923 		if (R2_GLOBALS.getFlag(52)) {
924 			// Trooper is dead
925 			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
926 				R2_GLOBALS._player.setup(19, 7, 1);
927 				_seeker.setup(29, 6, 1);
928 			} else {
929 				R2_GLOBALS._player.setup(29, 7, 1);
930 				_seeker.setup(19, 6, 1);
931 			}
932 			R2_GLOBALS._player.setPosition(Common::Point(140, 124));
933 			_seeker.setPosition(Common::Point(237, 134));
934 			R2_GLOBALS._player.enableControl();
935 		} else {
936 			// Trooper is alive
937 			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
938 				R2_GLOBALS._player.setup(1107, 2, 1);
939 				_seeker.setup(1107, 4, 1);
940 				R2_GLOBALS._player.setPosition(Common::Point(247, 169));
941 				_seeker.setPosition(Common::Point(213, 169));
942 			} else {
943 				R2_GLOBALS._player.setup(1107, 4, 1);
944 				_seeker.setup(1107, 2, 1);
945 				R2_GLOBALS._player.setPosition(Common::Point(213, 169));
946 				_seeker.setPosition(Common::Point(247, 169));
947 			}
948 			R2_GLOBALS._player.enableControl();
949 			R2_GLOBALS._player._canWalk = false;
950 		}
951 
952 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
953 			_seeker.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
954 		else
955 			_seeker.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
956 
957 		_chief.postInit();
958 		_chief.setup(1113, 3, 1);
959 		_chief.setPosition(Common::Point(181, 125));
960 		_chief.fixPriority(110);
961 
962 		if (R2_GLOBALS.getFlag(54))
963 			_chief.setDetails(1100, 4, -1, -1, 1, (SceneItem *) NULL);
964 		else
965 			_chief.setDetails(1100, 3, -1, -1, 1, (SceneItem *) NULL);
966 
967 		if (!R2_GLOBALS.getFlag(52)) {
968 			// If trooper is alive, initialize him
969 			_trooper.postInit();
970 			if (R2_GLOBALS.getFlag(53))
971 				// Trooper wears his black uniform
972 				_trooper.setup(1106, 2, 4);
973 			else
974 				// Trooper wears a stasis shield
975 				_trooper.setup(1105, 4, 4);
976 
977 			_trooper.setPosition(Common::Point(17, 54));
978 			_trooper._numFrames = 5;
979 
980 			if (R2_GLOBALS.getFlag(53))
981 				// Trooper isn't wearing the stasis shield
982 				_trooper.setDetails(1100, 28, -1, -1, 1, (SceneItem *) NULL);
983 			else
984 				_trooper.setDetails(1100, 22, 23, 24, 1, (SceneItem *) NULL);
985 
986 			_trooper.fixPriority(200);
987 		}
988 		_ship.postInit();
989 		_ship.setup(1512, 1, 1);
990 		_ship.setPosition(Common::Point(187, 45));
991 		_ship.fixPriority(48);
992 		_ship._moveDiff.y = 1;
993 		_ship.setDetails(1100, 37, -1, -1, 1, (SceneItem *) NULL);
994 	}
995 
996 	_boulders.setDetails(Rect(123, 69, 222, 105), 1100, 13, -1, -1, 1, NULL);
997 	_sky.setDetails(Rect(0, 0, 480, 46), 1100, 0, -1, -1, 1, NULL);
998 	_background.setDetails(Rect(0, 0, 480, 200), 1100, 40, 41, 42, 1, NULL);
999 }
1000 
remove()1001 void Scene1100::remove() {
1002 	R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
1003 	if (_sceneMode > 20)
1004 		R2_GLOBALS._sound1.fadeOut2(NULL);
1005 	g_globals->gfxManager()._bounds.moveTo(Common::Point(0, 0));
1006 	R2_GLOBALS._uiElements._active = true;
1007 	SceneExt::remove();
1008 }
1009 
signal()1010 void Scene1100::signal() {
1011 	switch (_sceneMode++) {
1012 	case 0:
1013 		_shipFormation.setPosition(Common::Point(350, 20));
1014 		setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
1015 		break;
1016 	case 1:{
1017 		Common::Point pt(-150, 20);
1018 		NpcMover *mover = new NpcMover();
1019 		_shipFormation.addMover(mover, &pt, this);
1020 		_shipFormationShadow.setPosition(Common::Point(350, 55));
1021 
1022 		Common::Point pt2(-150, 55);
1023 		NpcMover *mover2 = new NpcMover();
1024 		_shipFormationShadow.addMover(mover2, &pt2, NULL);
1025 		}
1026 		break;
1027 	case 2:
1028 		_shipFormation.remove();
1029 		_shipFormationShadow.remove();
1030 		_shotImpact1.postInit();
1031 		_shotImpact2.postInit();
1032 		_shotImpact3.postInit();
1033 		_shotImpact4.postInit();
1034 		_shotImpact5.postInit();
1035 		_laserShot.postInit();
1036 		setAction(&_sequenceManager1, this, 1102, &_shotImpact1, &_shotImpact2, &_shotImpact3, &_shotImpact4, &_shotImpact5, &_laserShot, NULL);
1037 		break;
1038 	case 3: {
1039 		R2_GLOBALS._sound2.play(84);
1040 		R2_GLOBALS._player.setPosition(Common::Point(-50, 126));
1041 		Common::Point pt(350, 226);
1042 		NpcMover *mover = new NpcMover();
1043 		R2_GLOBALS._player.addMover(mover, &pt, this);
1044 		}
1045 		break;
1046 	case 4:
1047 		_chief.postInit();
1048 		_chief.show();
1049 		setAction(&_sequenceManager1, this, 1101, &_chief, &_laserShot, NULL);
1050 		break;
1051 	case 5:
1052 		_runningGuy1.postInit();
1053 		_runningGuy1._effect = EFFECT_SHADED2;
1054 		_runningGuy1.setup(1103, 3, 1);
1055 		_runningGuy1._moveRate = 30;
1056 
1057 		_runningGuy2.postInit();
1058 		_runningGuy2._effect = EFFECT_SHADED2;
1059 		_runningGuy2.setup(1103, 4, 1);
1060 		_runningGuy2._moveRate = 25;
1061 
1062 		_runningGuy1.setAction(&_sequenceManager2, this, 1109, &_runningGuy1, &_runningGuy2, NULL);
1063 		break;
1064 	case 6: {
1065 		_runningGuy1.remove();
1066 		_runningGuy2.remove();
1067 		R2_GLOBALS._player.setPosition(Common::Point(-50, 136));
1068 		R2_GLOBALS._sound2.play(84);
1069 		Common::Point pt(350, 236);
1070 		NpcMover *mover = new NpcMover();
1071 		R2_GLOBALS._player.addMover(mover, &pt, this);
1072 		}
1073 		break;
1074 	case 7:
1075 		setAction(&_sequenceManager1, this, 1103, &_chief, &_laserShot, NULL);
1076 		break;
1077 	case 8:
1078 		R2_GLOBALS._player._effect = EFFECT_NONE;
1079 		_animation.postInit();
1080 		setAction(&_sequenceManager1, this, 1105, &R2_GLOBALS._player, &_laserShot, &_animation, &_chief, NULL);
1081 		break;
1082 	case 9:
1083 		_rightLandslide.copySceneToBackground();
1084 
1085 		_runningGuy3.postInit();
1086 		_runningGuy3.setup(1103, 2, 1);
1087 		_runningGuy3._moveRate = 30;
1088 		_runningGuy3.setAction(&_sequenceManager3, this, 1107, &_runningGuy3, NULL);
1089 		break;
1090 	case 10:
1091 		_runningGuy1.postInit();
1092 		_runningGuy1.setup(1103, 1, 1);
1093 		_runningGuy1._moveRate = 15;
1094 		_runningGuy1.setAction(&_sequenceManager2, this, 1108, &_runningGuy1, NULL);
1095 		break;
1096 	case 11: {
1097 		setAction(&_sequenceManager1, this, 1106, &_animation, &_laserShot, &_leftImpacts, NULL);
1098 
1099 		R2_GLOBALS._player._effect = EFFECT_SHADOW_MAP;
1100 		R2_GLOBALS._player.setup(1102, 3, 2);
1101 		R2_GLOBALS._player.setPosition(Common::Point(-50, 131));
1102 		R2_GLOBALS._sound2.play(84);
1103 		Common::Point pt(350, 231);
1104 		NpcMover *mover = new NpcMover();
1105 		R2_GLOBALS._player.addMover(mover, &pt, this);
1106 		}
1107 		break;
1108 	case 12:
1109 	// Really nothing
1110 		break;
1111 	case 13:
1112 		_trooper.postInit();
1113 		R2_GLOBALS._scrollFollower = &_trooper;
1114 
1115 		_animation.setup(1100, 2, 1);
1116 		_animation.setPosition(Common::Point(408, 121));
1117 
1118 		_laserShot.setup(1100, 3, 5);
1119 		_laserShot.setPosition(Common::Point(409, 121));
1120 
1121 		setAction(&_sequenceManager1, this, 1104, &_trooper, NULL);
1122 		break;
1123 	case 14:
1124 		setAction(&_sequenceManager1, this, 1100, &_animation, &_laserShot, NULL);
1125 		break;
1126 	case 15:
1127 		R2_GLOBALS._sceneManager.changeScene(1000);
1128 		break;
1129 	case 20: {
1130 		Common::Point pt(187, -13);
1131 		NpcMover *mover = new NpcMover();
1132 		_ship.addMover(mover, &pt, this);
1133 		}
1134 		break;
1135 	case 21: {
1136 		R2_GLOBALS._sound2.play(92);
1137 		_trooper.animate(ANIM_MODE_5, NULL);
1138 		Common::Point pt(187, 45);
1139 		NpcMover *mover = new NpcMover();
1140 		_ship.addMover(mover, &pt, this);
1141 		}
1142 		break;
1143 	case 22:
1144 		setAction(&_sequenceManager1, this, 1110, &_seeker, &R2_GLOBALS._player, NULL);
1145 		break;
1146 	case 23:
1147 		R2_GLOBALS._player.disableControl();
1148 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1149 		_stripManager.start(312, this);
1150 		R2_GLOBALS._player.setAction(&_sequenceManager1, this, 1119, &R2_GLOBALS._player, NULL);
1151 		break;
1152 	case 24:
1153 		if (!_stripManager._endHandler)
1154 			R2_GLOBALS._player.disableControl();
1155 		break;
1156 	case 25:
1157 		R2_GLOBALS._player.disableControl();
1158 		R2_GLOBALS._stripManager_lookupList[9] = 1;
1159 		R2_GLOBALS._stripManager_lookupList[10] = 1;
1160 		R2_GLOBALS._stripManager_lookupList[11] = 1;
1161 		R2_GLOBALS._sound1.play(95);
1162 		setAction(&_sequenceManager1, this, 1111, &_trooper, &R2_GLOBALS._player, &_seeker, NULL);
1163 		break;
1164 	case 26:
1165 		R2_GLOBALS._player.disableControl();
1166 		R2_GLOBALS._events.setCursor(CURSOR_WALK);
1167 		_stripManager.start(302, this);
1168 		break;
1169 	case 27:
1170 		R2_GLOBALS._player.disableControl();
1171 		setAction(&_sequenceManager1, this, 1120, &_seeker, &R2_GLOBALS._player, NULL);
1172 		break;
1173 	case 28:
1174 		R2_GLOBALS._player.disableControl();
1175 		R2_GLOBALS._events.setCursor(CURSOR_WALK);
1176 		_stripManager.start(303, this);
1177 		break;
1178 	case 29:
1179 	case 50:
1180 		R2_GLOBALS._player.enableControl(CURSOR_USE);
1181 		R2_GLOBALS._player._canWalk = false;
1182 		break;
1183 	case 51:
1184 		// Trooper no longer wears a statis shield
1185 		R2_GLOBALS.setFlag(53);
1186 		_trooper.setDetails(1100, 28, -1, -1, 3, (SceneItem *) NULL);
1187 
1188 		R2_GLOBALS._player.enableControl(CURSOR_USE);
1189 		R2_GLOBALS._player._canWalk = false;
1190 		break;
1191 	case 52:
1192 		// Trooper is shot to death
1193 		R2_GLOBALS._sound1.play(98);
1194 		R2_GLOBALS.setFlag(52);
1195 		R2_GLOBALS._player.disableControl();
1196 		_sceneMode = 1116;
1197 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1198 			setAction(&_sequenceManager1, this, 1116, &R2_GLOBALS._player, NULL);
1199 			_seeker.setAction(&_sequenceManager2, NULL, 1123, &_seeker, NULL);
1200 		} else {
1201 			setAction(&_sequenceManager1, this, 1124, &R2_GLOBALS._player, NULL);
1202 			_seeker.setAction(&_sequenceManager2, NULL, 1117, &_seeker, NULL);
1203 		}
1204 		break;
1205 	case 53:
1206 		_sceneMode = 54;
1207 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1208 		if (_nextStripNum == 0) {
1209 			R2_GLOBALS.setFlag(55);
1210 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1211 				_stripManager.start(318, this);
1212 			else
1213 				_stripManager.start(323, this);
1214 		} else
1215 			_stripManager.start3(_nextStripNum, this, _stripManager._lookupList);
1216 
1217 		break;
1218 	case 54:
1219 		if (_stripManager._exitMode == 1) {
1220 			R2_GLOBALS._player.disableControl();
1221 			_sceneMode = 1125;
1222 			setAction(&_sequenceManager1, this, 1125, &R2_GLOBALS._player, &_seeker, NULL);
1223 		} else
1224 			R2_GLOBALS._player.enableControl(CURSOR_TALK);
1225 		break;
1226 	case 55:
1227 		R2_GLOBALS._player.enableControl(CURSOR_TALK);
1228 		R2_GLOBALS._player._canWalk = false;
1229 		break;
1230 	case 99:
1231 		R2_GLOBALS._player._characterScene[R2_QUINN] = 300;
1232 		R2_GLOBALS._player._characterScene[R2_SEEKER] = 300;
1233 		R2_GLOBALS._player._characterIndex = R2_QUINN;
1234 		R2_GLOBALS._sceneManager.changeScene(300);
1235 		break;
1236 	case 1112:
1237 		_sceneMode = 50;
1238 		R2_GLOBALS._player.disableControl();
1239 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1240 		_stripManager.start3(313, this, _stripManager._lookupList);
1241 		break;
1242 	case 1113:
1243 		_sceneMode = 52;
1244 		R2_GLOBALS._player.disableControl();
1245 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1246 		R2_GLOBALS._sound1.play(96);
1247 		_stripManager.start3(316, this, _stripManager._lookupList);
1248 		break;
1249 	case 1114:
1250 		_sceneMode = 51;
1251 		R2_GLOBALS._player.disableControl();
1252 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1253 		_stripManager.start3(315, this, _stripManager._lookupList);
1254 		break;
1255 	case 1115:
1256 		_sceneMode = 50;
1257 		R2_GLOBALS._player.disableControl();
1258 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1259 		_stripManager.start3(314, this, _stripManager._lookupList);
1260 		break;
1261 	case 1116:
1262 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
1263 		R2_GLOBALS._stripManager_lookupList[9] = 1;
1264 		R2_GLOBALS._stripManager_lookupList[10] = 1;
1265 		R2_GLOBALS._stripManager_lookupList[11] = 1;
1266 		break;
1267 	case 1125: {
1268 		_sceneMode = 99;
1269 		R2_GLOBALS._sound2.play(100);
1270 		R2_GLOBALS._sound1.play(101);
1271 		Common::Point pt(187, -13);
1272 		NpcMover *mover = new NpcMover();
1273 		_ship.addMover(mover, &pt, this);
1274 		}
1275 		break;
1276 	default:
1277 		R2_GLOBALS._player.enableControl();
1278 		R2_GLOBALS._player._canWalk = false;
1279 		break;
1280 	}
1281 }
1282 
dispatch()1283 void Scene1100::dispatch() {
1284 	// WORKAROUND: This fixes a problem with an overhang that gets blasted re-appearing
1285 	if (_animation._frame > 5 && _sceneMode == 13) {
1286 		_animation._endFrame = 9;
1287 		if (_animation._frame == 9)
1288 			// Use one of the scene's background scene objects to copy the scene to the background.
1289 			// This fixes the problem with the cliff overhang still appearing during the cutscene
1290 			_rightLandslide.copySceneToBackground();
1291 	}
1292 
1293 	if ((g_globals->_sceneObjects->contains(&_laserShot)) && (_laserShot._visage == 1102) && (_laserShot._strip == 4) && (_laserShot._frame == 1) && (_laserShot._flags & OBJFLAG_HIDING)) {
1294 		if (_paletteRefreshStatus == 1) {
1295 			_paletteRefreshStatus = 2;
1296 			R2_GLOBALS._scenePalette.refresh();
1297 		}
1298 	} else {
1299 		if (_paletteRefreshStatus == 2)
1300 			R2_GLOBALS._scenePalette.refresh();
1301 		_paletteRefreshStatus = 1;
1302 	}
1303 
1304 	Scene::dispatch();
1305 
1306 	if (R2_GLOBALS._player._bounds.contains(_runningGuy1._position))
1307 		_runningGuy1._shade = 3;
1308 	else
1309 		_runningGuy1._shade = 0;
1310 
1311 	if (R2_GLOBALS._player._bounds.contains(_runningGuy2._position))
1312 		_runningGuy2._shade = 3;
1313 	else
1314 		_runningGuy2._shade = 0;
1315 
1316 	if (R2_GLOBALS._player._bounds.contains(_runningGuy3._position))
1317 		_runningGuy3._shade = 3;
1318 	else
1319 		_runningGuy3._shade = 0;
1320 }
1321 
saveCharacter(int characterIndex)1322 void Scene1100::saveCharacter(int characterIndex) {
1323 	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
1324 		R2_GLOBALS._sound1.fadeOut2(NULL);
1325 	SceneExt::saveCharacter(characterIndex);
1326 }
1327 
1328 /*--------------------------------------------------------------------------
1329  * Scene 1500 - Cutscene: Ship landing
1330  *
1331  *--------------------------------------------------------------------------*/
1332 
postInit(SceneObjectList * OwnerList)1333 void Scene1500::postInit(SceneObjectList *OwnerList) {
1334 	loadScene(1500);
1335 	R2_GLOBALS._uiElements._active = false;
1336 	setZoomPercents(170, 13, 240, 100);
1337 	SceneExt::postInit();
1338 	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
1339 
1340 	scalePalette(65, 65, 65);
1341 
1342 	R2_GLOBALS._player.postInit();
1343 	R2_GLOBALS._player.hide();
1344 	R2_GLOBALS._player.disableControl();
1345 
1346 	_starshipShadow.postInit();
1347 	_starshipShadow.setup(1401, 1, 1);
1348 	_starshipShadow._effect = EFFECT_SHADOW_MAP;
1349 	_starshipShadow.fixPriority(10);
1350 	_starshipShadow._shadowMap = _shadowPaletteMap;
1351 
1352 	_starship.postInit();
1353 	_starship.setup(1400, 1, 1);
1354 	_starship._moveDiff = Common::Point(1, 1);
1355 	_starship._linkedActor = &_starshipShadow;
1356 
1357 	if (R2_GLOBALS._sceneManager._previousScene != 1010) {
1358 		_smallShipShadow.postInit();
1359 		_smallShipShadow.setup(1401, 2, 1);
1360 		_smallShipShadow._effect = EFFECT_SHADOW_MAP;
1361 		_smallShipShadow.fixPriority(10);
1362 		_smallShipShadow._shadowMap = _shadowPaletteMap;
1363 
1364 		_smallShip.postInit();
1365 		_smallShip._moveRate = 30;
1366 		_smallShip._moveDiff = Common::Point(1, 1);
1367 		_smallShip._linkedActor = &_smallShipShadow;
1368 	}
1369 
1370 	if (R2_GLOBALS._sceneManager._previousScene == 300) {
1371 		_starship.setPosition(Common::Point(189, 139), 5);
1372 
1373 		_smallShip.setup(1400, 1, 2);
1374 		_smallShip.setPosition(Common::Point(148, 108), 0);
1375 
1376 		_sceneMode = 20;
1377 		R2_GLOBALS._sound1.play(110);
1378 	} else if (R2_GLOBALS._sceneManager._previousScene == 1550) {
1379 		_starship.setPosition(Common::Point(189, 139), 5);
1380 
1381 		_smallShip.setup(1400, 2, 1);
1382 		_smallShip.changeZoom(-1);
1383 		_smallShip.setPosition(Common::Point(298, 258), 5);
1384 
1385 		_sceneMode = 10;
1386 		R2_GLOBALS._sound1.play(106);
1387 	} else {
1388 		_starship.setPosition(Common::Point(289, 239), -30);
1389 		_sceneMode = 0;
1390 		R2_GLOBALS._sound1.play(102);
1391 	}
1392 
1393 	signal();
1394 }
1395 
remove()1396 void Scene1500::remove() {
1397 	R2_GLOBALS._uiElements._active = true;
1398 	R2_GLOBALS._uiElements._visible = true;
1399 
1400 	SceneExt::remove();
1401 }
1402 
signal()1403 void Scene1500::signal() {
1404 	switch(_sceneMode++) {
1405 	case 0:
1406 		R2_GLOBALS.setFlag(25);
1407 		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
1408 		// fall through
1409 	case 1:
1410 		if (_starship._yDiff < 50) {
1411 			_starship.setPosition(Common::Point(289, 239), _starship._yDiff + 1);
1412 			_sceneMode = 1;
1413 		}
1414 		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
1415 		break;
1416 	case 2: {
1417 		Common::Point pt(189, 139);
1418 		NpcMover *mover = new NpcMover();
1419 		_starship.addMover(mover, &pt, this);
1420 		}
1421 		break;
1422 	case 3:
1423 		if (_starship._yDiff > 5) {
1424 			_starship.setPosition(Common::Point(189, 139), _starship._yDiff - 1);
1425 			_sceneMode = 3;
1426 		}
1427 		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
1428 		break;
1429 	case 13:
1430 		R2_GLOBALS._player._characterIndex = R2_MIRANDA;
1431 		// fall through
1432 	case 4:
1433 		R2_GLOBALS._sceneManager.changeScene(300);
1434 		break;
1435 	case 10:
1436 		// fall through
1437 	case 20:
1438 		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
1439 		break;
1440 	case 11: {
1441 		Common::Point pt(148, 108);
1442 		NpcMover *mover = new NpcMover();
1443 		_smallShip.addMover(mover, &pt, this);
1444 		}
1445 		break;
1446 	case 12:
1447 		setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
1448 		break;
1449 	case 21: {
1450 		Common::Point pt(-2, -42);
1451 		NpcMover *mover = new NpcMover();
1452 		_smallShip.addMover(mover, &pt, NULL);
1453 		signal();
1454 		}
1455 		break;
1456 	case 22:
1457 		if (_starship._yDiff < 50) {
1458 			_starship.setPosition(Common::Point(189, 139), _starship._yDiff + 1);
1459 			_sceneMode = 22;
1460 		}
1461 		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
1462 		break;
1463 	case 23: {
1464 		Common::Point pt(-13, -61);
1465 		NpcMover *mover = new NpcMover();
1466 		_starship.addMover(mover, &pt, this);
1467 		}
1468 		break;
1469 	case 24:
1470 		R2_GLOBALS._sceneManager.changeScene(1550);
1471 		break;
1472 	default:
1473 		break;
1474 	}
1475 }
1476 
dispatch()1477 void Scene1500::dispatch() {
1478 	if (_sceneMode > 10) {
1479 		float yDiff = sqrt((float) (_smallShip._position.x * _smallShip._position.x) + (_smallShip._position.y * _smallShip._position.y));
1480 		if (yDiff > 6)
1481 			_smallShip.setPosition(_smallShip._position, (int)yDiff);
1482 	}
1483 
1484 	Scene::dispatch();
1485 }
1486 
1487 /*--------------------------------------------------------------------------
1488  * Scene 1525 - Cutscene - Ship
1489  *
1490  *--------------------------------------------------------------------------*/
1491 
postInit(SceneObjectList * OwnerList)1492 void Scene1525::postInit(SceneObjectList *OwnerList) {
1493 	loadScene(1525);
1494 	R2_GLOBALS._uiElements._active = false;
1495 	SceneExt::postInit();
1496 
1497 	R2_GLOBALS._player.postInit();
1498 	if (R2_GLOBALS._sceneManager._previousScene == 525)
1499 		R2_GLOBALS._player.setup(1525, 1, 1);
1500 	else
1501 		R2_GLOBALS._player.setup(1525, 1, 16);
1502 	R2_GLOBALS._player.setPosition(Common::Point(244, 148));
1503 	R2_GLOBALS._player.disableControl();
1504 
1505 	_sceneMode = 0;
1506 	setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
1507 }
1508 
signal()1509 void Scene1525::signal() {
1510 	switch (_sceneMode++) {
1511 	case 0:
1512 		if (R2_GLOBALS._sceneManager._previousScene == 525)
1513 			setAction(&_sequenceManager, this, 1525, &R2_GLOBALS._player, NULL);
1514 		else
1515 			setAction(&_sequenceManager, this, 1526, &R2_GLOBALS._player, NULL);
1516 		break;
1517 	case 1:
1518 		setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
1519 		break;
1520 	case 2:
1521 		if (R2_GLOBALS._sceneManager._previousScene == 1530)
1522 			R2_GLOBALS._sceneManager.changeScene(1550);
1523 		else
1524 			R2_GLOBALS._sceneManager.changeScene(1530);
1525 	default:
1526 		break;
1527 	}
1528 }
1529 
1530 /*--------------------------------------------------------------------------
1531  * Scene 1530 - Cutscene - Crashing on Rimwall
1532  *
1533  *--------------------------------------------------------------------------*/
1534 
postInit(SceneObjectList * OwnerList)1535 void Scene1530::postInit(SceneObjectList *OwnerList) {
1536 	if (R2_GLOBALS._sceneManager._previousScene == 1000)
1537 		loadScene(1650);
1538 	else if (R2_GLOBALS._sceneManager._previousScene == 1580)
1539 		loadScene(1550);
1540 	else
1541 		loadScene(1530);
1542 
1543 	R2_GLOBALS._uiElements._active = false;
1544 	SceneExt::postInit();
1545 	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
1546 
1547 	_stripManager.addSpeaker(&_quinnSpeaker);
1548 	_stripManager.addSpeaker(&_seekerSpeaker);
1549 
1550 	if (R2_GLOBALS._sceneManager._previousScene == 1000) {
1551 		R2_GLOBALS._player.postInit();
1552 		R2_GLOBALS._player.hide();
1553 		R2_GLOBALS._player.disableControl();
1554 
1555 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1556 		_stripManager.start(538, this);
1557 		R2_GLOBALS._sound1.play(114);
1558 
1559 		_sceneMode = 3;
1560 	} else if (R2_GLOBALS._sceneManager._previousScene == 1580) {
1561 		R2_GLOBALS._player.postInit();
1562 		R2_GLOBALS._player._characterIndex = R2_QUINN;
1563 		R2_GLOBALS._player.setObjectWrapper(NULL);
1564 		R2_GLOBALS._player.setup(1516, 6, 1);
1565 		R2_GLOBALS._player.setPosition(Common::Point(160, 125));
1566 		R2_GLOBALS._player._moveRate = 30;
1567 		R2_GLOBALS._player._moveDiff = Common::Point(4, 1);
1568 
1569 		_leftReactor.postInit();
1570 		_leftReactor.setup(1516, 7, 1);
1571 		_leftReactor.setPosition(Common::Point(121, 41));
1572 		_leftReactor.animate(ANIM_MODE_2, NULL);
1573 
1574 		_rightReactor.postInit();
1575 		_rightReactor.setup(1516, 8, 1);
1576 		_rightReactor.setPosition(Common::Point(107, 116));
1577 		_rightReactor.animate(ANIM_MODE_2, NULL);
1578 
1579 		R2_GLOBALS._player.disableControl();
1580 		Common::Point pt(480, 75);
1581 		NpcMover *mover = new NpcMover();
1582 		R2_GLOBALS._player.addMover(mover, &pt, this);
1583 		R2_GLOBALS._sound1.play(111);
1584 
1585 		_sceneMode = 1;
1586 	} else {
1587 		_seeker.postInit();
1588 		_seeker._effect = EFFECT_SHADED;
1589 
1590 		R2_GLOBALS._player.postInit();
1591 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1592 		R2_GLOBALS._player.disableControl();
1593 
1594 		setAction(&_sequenceManager, this, 1530, &R2_GLOBALS._player, &_seeker, NULL);
1595 
1596 		_sceneMode = 2;
1597 	}
1598 
1599 }
1600 
signal()1601 void Scene1530::signal() {
1602 	switch (_sceneMode - 1) {
1603 	case 0:
1604 		R2_GLOBALS._sceneManager.changeScene(1000);
1605 		break;
1606 	case 1:
1607 		R2_GLOBALS._sceneManager.changeScene(1525);
1608 		break;
1609 	case 2:
1610 		R2_GLOBALS._player.disableControl();
1611 		_sceneMode = 4;
1612 		R2_GLOBALS._player.show();
1613 		setAction(&_sequenceManager, this, 1650, &R2_GLOBALS._player, NULL);
1614 		break;
1615 	case 3:
1616 		R2_GLOBALS._sceneManager.changeScene(1700);
1617 		break;
1618 	default:
1619 		break;
1620 	}
1621 }
1622 
dispatch()1623 void Scene1530::dispatch() {
1624 	int16 x = R2_GLOBALS._player._position.x;
1625 	int16 y = R2_GLOBALS._player._position.y;
1626 
1627 	_leftReactor.setPosition(Common::Point(x - 39, y - 85));
1628 	_rightReactor.setPosition(Common::Point(x - 53, y - 9));
1629 
1630 	Scene::dispatch();
1631 }
1632 
1633 /*--------------------------------------------------------------------------
1634  * Scene 1550 - Spaceport
1635  *
1636  *--------------------------------------------------------------------------*/
1637 
Junk()1638 Scene1550::Junk::Junk() {
1639 	_junkNumber = 0;
1640 }
1641 
synchronize(Serializer & s)1642 void Scene1550::Junk::synchronize(Serializer &s) {
1643 	SceneActor::synchronize(s);
1644 
1645 	s.syncAsSint16LE(_junkNumber);
1646 }
1647 
startAction(CursorType action,Event & event)1648 bool Scene1550::Junk::startAction(CursorType action, Event &event) {
1649 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
1650 
1651 	switch (action) {
1652 	case CURSOR_USE:
1653 		if (_visage == 1561) {
1654 			R2_GLOBALS._player.disableControl();
1655 			scene->_sceneMode = 40;
1656 			Common::Point pt(_position.x + 5, _position.y + 20);
1657 			PlayerMover *mover = new PlayerMover();
1658 			R2_GLOBALS._player.addMover(mover, &pt, scene);
1659 			return true;
1660 		}
1661 		return SceneActor::startAction(action, event);
1662 		break;
1663 	case CURSOR_LOOK:
1664 		if (_visage == 1561) {
1665 			switch (_frame) {
1666 			case 2:
1667 				SceneItem::display(1550, 23, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1668 				break;
1669 			case 3:
1670 				SceneItem::display(1550, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1671 				break;
1672 			case 4:
1673 				SceneItem::display(1550, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1674 				break;
1675 			default:
1676 				break;
1677 			}
1678 		} else {
1679 			switch ((((_strip - 1) * 5) + _frame) % 3) {
1680 			case 0:
1681 				SceneItem::display(1550, 62, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1682 				break;
1683 			case 1:
1684 				SceneItem::display(1550, 53, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1685 				break;
1686 			case 2:
1687 				SceneItem::display(1550, 76, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1688 				break;
1689 			default:
1690 				break;
1691 			}
1692 		}
1693 		return true;
1694 		break;
1695 	default:
1696 		return SceneActor::startAction(action, event);
1697 		break;
1698 	}
1699 }
1700 
ShipComponent()1701 Scene1550::ShipComponent::ShipComponent() {
1702 	_componentId = 0;
1703 }
1704 
synchronize(Serializer & s)1705 void Scene1550::ShipComponent::synchronize(Serializer &s) {
1706 	SceneActor::synchronize(s);
1707 
1708 	s.syncAsSint16LE(_componentId);
1709 }
1710 
startAction(CursorType action,Event & event)1711 bool Scene1550::ShipComponent::startAction(CursorType action, Event &event) {
1712 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
1713 
1714 	switch (action) {
1715 	case CURSOR_USE:
1716 		if (_componentId == 8) {
1717 			scene->_dontExit = true;
1718 			R2_GLOBALS._player.disableControl();
1719 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1720 				scene->_sceneMode = 1576;
1721 			else
1722 				scene->_sceneMode = 1584;
1723 			// strcpy(scene->_shipComponents[7]._actorName, 'hatch');
1724 			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[7], NULL);
1725 			return true;
1726 		}
1727 		return SceneActor::startAction(action, event);
1728 		break;
1729 	case CURSOR_LOOK:
1730 		if (_componentId == 8)
1731 			SceneItem::display(1550, 75, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1732 		else if (_frame == 1)
1733 			SceneItem::display(1550, 70, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1734 		else
1735 			SceneItem::display(1550, 71, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1736 		return true;
1737 		break;
1738 	case R2_FUEL_CELL:
1739 		scene->_dontExit = true;
1740 		if (_componentId == 6) {
1741 			R2_GLOBALS._player.disableControl();
1742 			scene->_wreckage2.postInit();
1743 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1744 				scene->_sceneMode = 1574;
1745 			else
1746 				scene->_sceneMode = 1582;
1747 			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[5], &scene->_wreckage2, NULL);
1748 			return true;
1749 		}
1750 		return SceneActor::startAction(action, event);
1751 		break;
1752 	case R2_GYROSCOPE:
1753 		scene->_dontExit = true;
1754 		if (_componentId == 3) {
1755 			R2_GLOBALS._player.disableControl();
1756 			scene->_wreckage2.postInit();
1757 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1758 				scene->_sceneMode = 1571;
1759 			else
1760 				scene->_sceneMode = 1581;
1761 			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[2], &scene->_wreckage2, NULL);
1762 			return true;
1763 		}
1764 		return SceneActor::startAction(action, event);
1765 		break;
1766 	case R2_GUIDANCE_MODULE:
1767 		scene->_dontExit = true;
1768 		if (_componentId == 1) {
1769 			R2_GLOBALS._player.disableControl();
1770 			scene->_wreckage2.postInit();
1771 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1772 				scene->_sceneMode = 1569;
1773 			else
1774 				scene->_sceneMode = 1579;
1775 			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[0], &scene->_wreckage2, NULL);
1776 			return true;
1777 		}
1778 		return SceneActor::startAction(action, event);
1779 		break;
1780 	case R2_THRUSTER_VALVE:
1781 		scene->_dontExit = true;
1782 		if (_componentId == 4) {
1783 			R2_GLOBALS._player.disableControl();
1784 			scene->_sceneMode = 1572;
1785 			scene->_wreckage2.postInit();
1786 			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[3], &scene->_wreckage2, NULL);
1787 			return true;
1788 		}
1789 		return SceneActor::startAction(action, event);
1790 		break;
1791 	case R2_RADAR_MECHANISM:
1792 		scene->_dontExit = true;
1793 		if (_componentId == 2) {
1794 			R2_GLOBALS._player.disableControl();
1795 			scene->_wreckage2.postInit();
1796 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1797 				scene->_sceneMode = 1570;
1798 			else
1799 				scene->_sceneMode = 1580;
1800 			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[1], &scene->_wreckage2, NULL);
1801 			return true;
1802 		}
1803 		return SceneActor::startAction(action, event);
1804 		break;
1805 	case R2_IGNITOR:
1806 		scene->_dontExit = true;
1807 		if (_componentId == 5) {
1808 			R2_GLOBALS._player.disableControl();
1809 			scene->_sceneMode = 1573;
1810 			scene->_wreckage2.postInit();
1811 			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[4], &scene->_wreckage2, NULL);
1812 			return true;
1813 		}
1814 		return SceneActor::startAction(action, event);
1815 		break;
1816 	case R2_BATTERY:
1817 		scene->_dontExit = true;
1818 		if (_componentId == 7) {
1819 			R2_GLOBALS._player.disableControl();
1820 			scene->_wreckage2.postInit();
1821 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1822 				scene->_sceneMode = 1575;
1823 			else
1824 				scene->_sceneMode = 1583;
1825 			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[6], &scene->_wreckage2, NULL);
1826 			return true;
1827 		}
1828 		return SceneActor::startAction(action, event);
1829 		break;
1830 	default:
1831 		return SceneActor::startAction(action, event);
1832 		break;
1833 	}
1834 }
1835 
setupShipComponent(int componentId)1836 void Scene1550::ShipComponent::setupShipComponent(int componentId) {
1837 	_componentId = componentId;
1838 	postInit();
1839 	setup(1517, _componentId, 1);
1840 
1841 	switch (_componentId) {
1842 	case 1:
1843 		if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0)
1844 			setFrame(5);
1845 		setPosition(Common::Point(287, 85));
1846 		break;
1847 	case 2:
1848 		if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0)
1849 			setFrame(5);
1850 		setPosition(Common::Point(248, 100));
1851 		break;
1852 	case 3:
1853 		if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0)
1854 			setFrame(5);
1855 		setPosition(Common::Point(217, 85));
1856 		break;
1857 	case 4:
1858 		if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 0)
1859 			setFrame(5);
1860 		setPosition(Common::Point(161, 121));
1861 		break;
1862 	case 5:
1863 		if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 0)
1864 			setFrame(5);
1865 		setPosition(Common::Point(117, 121));
1866 		break;
1867 	case 6:
1868 		if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0)
1869 			setFrame(5);
1870 		setPosition(Common::Point(111, 85));
1871 		break;
1872 	case 7:
1873 		if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 0)
1874 			setFrame(5);
1875 		setPosition(Common::Point(95, 84));
1876 		break;
1877 	case 8: {
1878 		setup(1516, 1, 1);
1879 		setPosition(Common::Point(201, 45));
1880 		Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
1881 		if ((scene->_sceneMode == 1577) || (scene->_sceneMode == 1578))
1882 			hide();
1883 		fixPriority(92);
1884 		setDetails(1550, 70, -1, -1, 2, (SceneItem *) NULL);
1885 		}
1886 		break;
1887 	default:
1888 		break;
1889 	}
1890 
1891 	fixPriority(92);
1892 	setDetails(1550, 70, -1, -1, 2, (SceneItem *)NULL);
1893 }
1894 
DishControl()1895 Scene1550::DishControlsWindow::DishControl::DishControl() {
1896 	_controlId = 0;
1897 }
1898 
synchronize(Serializer & s)1899 void Scene1550::DishControlsWindow::DishControl::synchronize(Serializer &s) {
1900 	SceneActor::synchronize(s);
1901 
1902 	s.syncAsSint16LE(_controlId);
1903 }
1904 
startAction(CursorType action,Event & event)1905 bool Scene1550::DishControlsWindow::DishControl::startAction(CursorType action, Event &event) {
1906 	if (action != CURSOR_USE)
1907 		return SceneActor::startAction(action, event);
1908 
1909 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
1910 
1911 	switch (_controlId) {
1912 	case 1:
1913 		// Button control
1914 		if (scene->_dish._frame == 5) {
1915 			R2_GLOBALS._player.disableControl();
1916 			scene->_sceneMode = 25;
1917 			if (scene->_walkway._frame == 1) {
1918 				scene->setAction(&scene->_sequenceManager1, scene, 1560, &scene->_walkway, NULL);
1919 				R2_GLOBALS.setFlag(20);
1920 				setFrame(2);
1921 			} else {
1922 				scene->setAction(&scene->_sequenceManager1, scene, 1561, &scene->_walkway, NULL);
1923 				R2_GLOBALS.clearFlag(20);
1924 				setFrame(1);
1925 			}
1926 			scene->_dishControlsWindow.remove();
1927 		}
1928 		break;
1929 	case 2:
1930 		// Lever control
1931 		R2_GLOBALS._player.disableControl();
1932 		if (scene->_dish._frame == 1) {
1933 			scene->_sceneMode = 23;
1934 			scene->setAction(&scene->_sequenceManager1, scene, 1560, this, NULL);
1935 		} else {
1936 			if (scene->_walkway._frame == 1)
1937 				scene->_sceneMode = 24;
1938 			else
1939 				scene->_sceneMode = 22;
1940 			scene->setAction(&scene->_sequenceManager1, scene, 1561, this, NULL);
1941 		}
1942 	break;
1943 	default:
1944 		break;
1945 	}
1946 	return true;
1947 }
1948 
remove()1949 void Scene1550::DishControlsWindow::remove() {
1950 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
1951 
1952 	_button.remove();
1953 	_lever.remove();
1954 
1955 	ModalWindow::remove();
1956 
1957 	if ((scene->_sceneMode >= 20) && (scene->_sceneMode <= 29))
1958 		return;
1959 
1960 	R2_GLOBALS._player.disableControl();
1961 	if (scene->_walkway._frame == 1) {
1962 		scene->_sceneMode = 1559;
1963 		scene->setAction(&scene->_sequenceManager1, scene, 1559, &R2_GLOBALS._player, NULL);
1964 	} else {
1965 		scene->_sceneMode = 1562;
1966 		scene->setAction(&scene->_sequenceManager1, scene, 1562, &R2_GLOBALS._player, NULL);
1967 	}
1968 }
1969 
setup2(int visage,int stripFrameNum,int frameNum,int posX,int posY)1970 void Scene1550::DishControlsWindow::setup2(int visage, int stripFrameNum, int frameNum,
1971 		int posX, int posY) {
1972 	// Call inherited setup
1973 	ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY);
1974 
1975 	// Further setup
1976 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
1977 	setup3(1550, 67, -1, -1);
1978 	_button.postInit();
1979 	_button._controlId = 1;
1980 	if (scene->_walkway._frame == 1)
1981 		_button.setup(1559, 3, 1);
1982 	else
1983 		_button.setup(1559, 3, 2);
1984 	_button.setPosition(Common::Point(142, 79));
1985 	_button.fixPriority(251);
1986 	_button.setDetails(1550, 68, -1, -1, 2, (SceneItem *) NULL);
1987 
1988 	_lever.postInit();
1989 	_lever._numFrames = 5;
1990 	_lever._controlId = 2;
1991 	if (scene->_dish._frame == 1)
1992 		_lever.setup(1559, 2, 1);
1993 	else
1994 		_lever.setup(1559, 2, 5);
1995 	_lever.setPosition(Common::Point(156, 103));
1996 	_lever.fixPriority(251);
1997 	_lever.setDetails(1550, 69, -1, -1, 2, (SceneItem *) NULL);
1998 }
1999 
startAction(CursorType action,Event & event)2000 bool Scene1550::WorkingShip::startAction(CursorType action, Event &event) {
2001 	return SceneHotspot::startAction(action, event);
2002 }
2003 
startAction(CursorType action,Event & event)2004 bool Scene1550::Wreckage::startAction(CursorType action, Event &event) {
2005 	return SceneActor::startAction(action, event);
2006 }
2007 
startAction(CursorType action,Event & event)2008 bool Scene1550::Companion::startAction(CursorType action, Event &event) {
2009 	if (action != CURSOR_TALK)
2010 		return SceneActor::startAction(action, event);
2011 
2012 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
2013 	scene->_sceneMode = 80;
2014 	scene->signal();
2015 
2016 	return true;
2017 }
2018 
startAction(CursorType action,Event & event)2019 bool Scene1550::AirBag::startAction(CursorType action, Event &event) {
2020 	if (action != CURSOR_USE)
2021 		return SceneActor::startAction(action, event);
2022 
2023 	R2_GLOBALS._player.disableControl();
2024 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
2025 	scene->_dontExit = true;
2026 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2027 		scene->_sceneMode = 1552;
2028 	else
2029 		scene->_sceneMode = 1588;
2030 
2031 	scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_airbag, NULL);
2032 	return true;
2033 }
2034 
startAction(CursorType action,Event & event)2035 bool Scene1550::Joystick::startAction(CursorType action, Event &event) {
2036 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
2037 
2038 	switch (action) {
2039 	case CURSOR_USE:
2040 		scene->_sceneMode = 50;
2041 		R2_GLOBALS._player.disableControl();
2042 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2043 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2044 			scene->_stripManager.start(518, scene);
2045 		else
2046 			scene->_stripManager.start(520, scene);
2047 		return true;
2048 		break;
2049 	case CURSOR_LOOK:
2050 		SceneItem::display(1550, 41, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
2051 		return true;
2052 		break;
2053 	default:
2054 		return SceneActor::startAction(action, event);
2055 	}
2056 }
2057 
startAction(CursorType action,Event & event)2058 bool Scene1550::Gyroscope::startAction(CursorType action, Event &event) {
2059 	if (action != CURSOR_USE)
2060 		return SceneActor::startAction(action, event);
2061 
2062 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
2063 	R2_GLOBALS._player.disableControl();
2064 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2065 		scene->_sceneMode = 1555;
2066 	else
2067 		scene->_sceneMode = 1589;
2068 
2069 	scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
2070 		&scene->_gyroscope, NULL);
2071 	return true;
2072 }
2073 
startAction(CursorType action,Event & event)2074 bool Scene1550::DiagnosticsDisplay::startAction(CursorType action, Event &event) {
2075 	if (action != CURSOR_USE)
2076 		return SceneActor::startAction(action, event);
2077 
2078 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
2079 	R2_GLOBALS._player.disableControl();
2080 	scene->_dontExit = true;
2081 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2082 		scene->_sceneMode = 1586;
2083 	else
2084 		scene->_sceneMode = 1587;
2085 
2086 	scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
2087 		&scene->_diagnosticsDisplay, NULL);
2088 	return true;
2089 }
2090 
startAction(CursorType action,Event & event)2091 bool Scene1550::DishTower::startAction(CursorType action, Event &event) {
2092 	if (action != CURSOR_USE)
2093 		return SceneActor::startAction(action, event);
2094 
2095 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
2096 
2097 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2098 		R2_GLOBALS._player.disableControl();
2099 		scene->_sceneMode = 1585;
2100 		scene->setAction(&scene->_sequenceManager1, scene, 1585, &R2_GLOBALS._player, NULL);
2101 	} else {
2102 		R2_GLOBALS._player.disableControl();
2103 		switch(scene->_dishMode) {
2104 		case 0:
2105 			scene->_dish.fixPriority(168);
2106 			scene->_walkway.fixPriority(125);
2107 			scene->_sceneMode = 1558;
2108 			scene->setAction(&scene->_sequenceManager1, scene, 1558, &R2_GLOBALS._player, NULL);
2109 			break;
2110 		case 1:
2111 			return SceneActor::startAction(action, event);
2112 			break;
2113 		case 2:
2114 			scene->_dishMode = 1;
2115 			scene->_sceneMode = 1563;
2116 			scene->setAction(&scene->_sequenceManager1, scene, 1563, &R2_GLOBALS._player, &scene->_walkway, NULL);
2117 			break;
2118 		default:
2119 			break;
2120 		}
2121 	}
2122 	return true;
2123 
2124 }
2125 
startAction(CursorType action,Event & event)2126 bool Scene1550::Dish::startAction(CursorType action, Event &event) {
2127 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
2128 
2129 	switch (action) {
2130 	case CURSOR_USE:
2131 		if (scene->_dishMode != 2)
2132 			return SceneActor::startAction(action, event);
2133 
2134 		if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) {
2135 			R2_GLOBALS._player.disableControl();
2136 			scene->_sceneMode = 1564;
2137 			scene->setAction(&scene->_sequenceManager1, scene, 1564, &R2_GLOBALS._player, NULL);
2138 		} else
2139 			SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
2140 		return true;
2141 		break;
2142 	case CURSOR_LOOK:
2143 		if (scene->_dishMode != 2)
2144 			return SceneActor::startAction(action, event);
2145 
2146 		if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) {
2147 			SceneItem::display(1550, 74, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
2148 		} else
2149 			SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
2150 		return true;
2151 		break;
2152 	default:
2153 		return SceneActor::startAction(action, event);
2154 		break;
2155 	}
2156 }
2157 
2158 /*--------------------------------------------------------------------------*/
2159 
Scene1550()2160 Scene1550::Scene1550() {
2161 	_dontExit = false;
2162 	_wallType = 0;
2163 	_dishMode = 0;
2164 	_sceneResourceId = 0;
2165 	_walkRegionsId = 0;
2166 }
2167 
synchronize(Serializer & s)2168 void Scene1550::synchronize(Serializer &s) {
2169 	SceneExt::synchronize(s);
2170 
2171 	s.syncAsSint16LE(_dontExit);
2172 	s.syncAsByte(_wallType);
2173 	s.syncAsSint16LE(_dishMode);
2174 	s.syncAsSint16LE(_sceneResourceId);
2175 	s.syncAsSint16LE(_walkRegionsId);
2176 }
2177 
postInit(SceneObjectList * OwnerList)2178 void Scene1550::postInit(SceneObjectList *OwnerList) {
2179 	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
2180 			(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11))
2181 		// Exiting the intact spaceship
2182 		loadScene(1234);
2183 	else
2184 		// Normal scene entry
2185 		loadScene(1550);
2186 	SceneExt::postInit();
2187 
2188 	scalePalette(65, 65, 65);
2189 	setZoomPercents(30, 75, 170, 100);
2190 	_sceneResourceId = 1550;
2191 	_walkRegionsId = 0;
2192 
2193 	if (R2_GLOBALS._sceneManager._previousScene == -1)
2194 		R2_GLOBALS.setFlag(16);
2195 
2196 	if ((R2_GLOBALS._player._characterScene[R2_QUINN] != 1550) && (R2_GLOBALS._player._characterScene[R2_QUINN] != 1580)) {
2197 		R2_GLOBALS._player._characterScene[R2_QUINN] = 1550;
2198 		R2_GLOBALS._player._characterScene[R2_SEEKER] = 1550;
2199 	}
2200 
2201 	_stripManager.setColors(60, 255);
2202 	_stripManager.setFontNumber(3);
2203 	_stripManager.addSpeaker(&_quinnSpeaker);
2204 	_stripManager.addSpeaker(&_seekerSpeaker);
2205 
2206 	R2_GLOBALS._player.postInit();
2207 	R2_GLOBALS._player._effect = EFFECT_SHADED2;
2208 
2209 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2210 		R2_GLOBALS._player.setup(1500, 3, 1);
2211 	else
2212 		R2_GLOBALS._player.setup(1505, 3, 1);
2213 
2214 	R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2215 
2216 	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
2217 			(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11))
2218 		R2_GLOBALS._player.setPosition(Common::Point(157, 135));
2219 	else
2220 		R2_GLOBALS._player.setPosition(Common::Point(160, 100));
2221 
2222 	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2223 	R2_GLOBALS._player.disableControl();
2224 
2225 	_wallType = 0;
2226 	_companion.changeZoom(-1);
2227 	R2_GLOBALS._player.changeZoom(-1);
2228 
2229 	switch (R2_GLOBALS._sceneManager._previousScene) {
2230 	case 1530:
2231 		R2_GLOBALS._stripModifier = 0;
2232 		// fall through
2233 	case 300:
2234 		// fall through
2235 	case 1500:
2236 		// fall through
2237 	case 3150:
2238 		R2_GLOBALS._sound1.play(105);
2239 		break;
2240 	case 1580:
2241 		// Leaving intact ship
2242 		if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1580) {
2243 			R2_GLOBALS._player.disableControl();
2244 			R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
2245 
2246 			_dontExit = true;
2247 
2248 			_wreckage2.postInit();
2249 			_shipComponents[7].setupShipComponent(8);
2250 			_shipComponents[7].hide();
2251 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2252 				_sceneMode = 1577;
2253 			else
2254 				_sceneMode = 1578;
2255 
2256 			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_wreckage2, &_shipComponents[7], NULL);
2257 			R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1550;
2258 		} else {
2259 			R2_GLOBALS._player.enableControl();
2260 		}
2261 		break;
2262 	default:
2263 		break;
2264 	}
2265 
2266 	enterArea();
2267 
2268 	_intactHull1.setDetails(16, 1550, 10, -1, -1);
2269 	_intactHull2.setDetails(24, 1550, 10, -1, -1);
2270 	_background.setDetails(Rect(0, 0, 320, 200), 1550, 0, 1, -1, 1, NULL);
2271 
2272 	if ((R2_GLOBALS._sceneManager._previousScene == 1500) && (R2_GLOBALS.getFlag(16))) {
2273 		_sceneMode = 70;
2274 		if (!R2_GLOBALS._sceneObjects->contains(&_companion))
2275 			_companion.postInit();
2276 
2277 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2278 			_companion.setVisage(1505);
2279 		else
2280 			_companion.setVisage(1500);
2281 
2282 		_companion.changeZoom(77);
2283 		_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
2284 
2285 		assert(_walkRegionsId >= 1550);
2286 		R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]);
2287 
2288 		setAction(&_sequenceManager1, this, 1590, &_companion, NULL);
2289 	} else if ((_sceneMode != 1577) && (_sceneMode != 1578))
2290 		R2_GLOBALS._player.enableControl();
2291 }
2292 
signal()2293 void Scene1550::signal() {
2294 	switch (_sceneMode) {
2295 	case 1:
2296 	// No break on purpose
2297 	case 3:
2298 	// No break on purpose
2299 	case 5:
2300 	// No break on purpose
2301 	case 7:
2302 		_dontExit = false;
2303 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
2304 		break;
2305 	case 20:
2306 	// No break on purpose
2307 	case 21:
2308 	// No break on purpose
2309 	case 25:
2310 	// No break on purpose
2311 	case 1563:
2312 		// Show the communication dish controls window
2313 		R2_GLOBALS.clearFlag(20);
2314 		_dishControlsWindow.setup2(1559, 1, 1, 160, 125);
2315 		R2_GLOBALS._player.enableControl();
2316 		_sceneMode = 0;
2317 		break;
2318 	case 22:
2319 		_dishControlsWindow.remove();
2320 		_sceneMode = 24;
2321 		setAction(&_sequenceManager1, this, 1561, &_walkway, NULL);
2322 		R2_GLOBALS.clearFlag(20);
2323 		break;
2324 	case 23:
2325 		_dishControlsWindow.remove();
2326 		_sceneMode = 20;
2327 		setAction(&_sequenceManager1, this, 1566, &_dish, &_dishTowerShadow, NULL);
2328 		R2_GLOBALS.setFlag(19);
2329 		break;
2330 	case 24:
2331 		_dishControlsWindow.remove();
2332 		_sceneMode = 21;
2333 		setAction(&_sequenceManager1, this, 1567, &_dish, &_dishTowerShadow, NULL);
2334 		R2_GLOBALS.clearFlag(19);
2335 		break;
2336 	case 30:
2337 	// No break on purpose
2338 	case 1556:
2339 	// No break on purpose
2340 	case 1557:
2341 	// Nothing on purpose
2342 		break;
2343 	case 40: {
2344 			_sceneMode = 41;
2345 			Common::Point pt(_junk[0]._position.x, _junk[0]._position.y + 20);
2346 			NpcMover *mover = new NpcMover();
2347 			R2_GLOBALS._player.addMover(mover, &pt, this);
2348 		}
2349 		break;
2350 	case 41:
2351 		_sceneMode = 42;
2352 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2353 			R2_GLOBALS._player.setup(1502, 8, 1);
2354 		} else {
2355 			R2_GLOBALS._player.changeZoom(R2_GLOBALS._player._percent + 14);
2356 			R2_GLOBALS._player.setup(1516, 4, 1);
2357 		}
2358 		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
2359 		break;
2360 
2361 	case 42: {
2362 		_sceneMode = 43;
2363 		int junkRegionIndex = R2_GLOBALS._scene1550JunkLocations[_junk[0]._junkNumber + 3];
2364 		R2_GLOBALS._walkRegions.enableRegion(scene1550JunkRegions[junkRegionIndex]);
2365 
2366 		switch (_junk[0]._frame) {
2367 		case 1:
2368 			R2_INVENTORY.setObjectScene(R2_JOYSTICK, R2_GLOBALS._player._characterIndex);
2369 			break;
2370 		case 2:
2371 			R2_INVENTORY.setObjectScene(R2_FUEL_CELL, R2_GLOBALS._player._characterIndex);
2372 			break;
2373 		case 3:
2374 			R2_INVENTORY.setObjectScene(R2_GUIDANCE_MODULE, R2_GLOBALS._player._characterIndex);
2375 			break;
2376 		case 4:
2377 			R2_INVENTORY.setObjectScene(R2_RADAR_MECHANISM, R2_GLOBALS._player._characterIndex);
2378 			break;
2379 		case 5:
2380 			R2_INVENTORY.setObjectScene(R2_BATTERY, R2_GLOBALS._player._characterIndex);
2381 			break;
2382 		case 6:
2383 			R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex);
2384 			break;
2385 		default:
2386 			break;
2387 		}
2388 
2389 		_junk[0].remove();
2390 		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
2391 		break;
2392 	}
2393 	case 43:
2394 		R2_GLOBALS._scene1550JunkLocations[_junk[0]._junkNumber + 2] = 0;
2395 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2396 			R2_GLOBALS._player.setVisage(1500);
2397 		else {
2398 			R2_GLOBALS._player.changeZoom(-1);
2399 			R2_GLOBALS._player.setVisage(1505);
2400 		}
2401 		R2_GLOBALS._player.animate(ANIM_MODE_1, this);
2402 		R2_GLOBALS._player.setStrip(8);
2403 		R2_GLOBALS._player.enableControl();
2404 		break;
2405 	case 50:
2406 		// Removed (useless ?) call to sub_1D227
2407 		++_sceneMode;
2408 		setAction(&_sequenceManager1, this, 1591, &R2_GLOBALS._player, NULL);
2409 		if (g_globals->_sceneObjects->contains(&_companion))
2410 			signal();
2411 		else {
2412 			_companion.postInit();
2413 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2414 				_companion.setVisage(1505);
2415 			else
2416 				_companion.setVisage(1500);
2417 			_companion.changeZoom(77);
2418 			_companion.setAction(&_sequenceManager2, this, 1590, &_companion, NULL);
2419 			_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
2420 		}
2421 		break;
2422 	case 51:
2423 		++_sceneMode;
2424 		break;
2425 	case 52:
2426 		_companion.changeZoom(-1);
2427 		_sceneMode = 1592;
2428 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2429 			setAction(&_sequenceManager1, this, 1592, &R2_GLOBALS._player, &_companion,
2430 				&_junk[0], &_joystick, NULL);
2431 		else
2432 			setAction(&_sequenceManager1, this, 1593, &R2_GLOBALS._player, &_companion,
2433 				&_junk[0], &_joystick, NULL);
2434 		break;
2435 	case 61:
2436 		R2_GLOBALS._player.enableControl(CURSOR_USE);
2437 		R2_GLOBALS._player._canWalk = false;
2438 		_dishMode = 2;
2439 		break;
2440 	case 62:
2441 		R2_GLOBALS._player.enableControl(CURSOR_TALK);
2442 		if (_dishMode == 2) {
2443 			R2_GLOBALS._player.enableControl(CURSOR_USE);
2444 			R2_GLOBALS._player._canWalk = false;
2445 		}
2446 		break;
2447 	case 70:
2448 		R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN];
2449 		//R2_GLOBALS._s1550PlayerAreas[0] = 1;
2450 		_sceneMode = 60;
2451 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2452 		_stripManager.start(500, this);
2453 		break;
2454 	case 80:
2455 		if (R2_GLOBALS.getFlag(16)) {
2456 			_sceneMode = 60;
2457 			R2_GLOBALS._player.disableControl();
2458 			R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2459 			if (R2_GLOBALS._stripModifier >= 3) {
2460 				if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2461 					_stripManager.start(572, this);
2462 				else
2463 					_stripManager.start(573, this);
2464 			} else {
2465 				++R2_GLOBALS._stripModifier;
2466 				if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2467 					_stripManager.start(499 + R2_GLOBALS._stripModifier, this);
2468 				else
2469 					_stripManager.start(502 + R2_GLOBALS._stripModifier, this);
2470 			}
2471 		} else {
2472 			_sceneMode = 60;
2473 			R2_GLOBALS._player.disableControl();
2474 			R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2475 			if (R2_GLOBALS._stripModifier >= 4) {
2476 				if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2477 					_stripManager.start(572, this);
2478 				else
2479 					_stripManager.start(573, this);
2480 			} else {
2481 				++R2_GLOBALS._stripModifier;
2482 				if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2483 					_stripManager.start(563 + R2_GLOBALS._stripModifier, this);
2484 				else
2485 					_stripManager.start(567 + R2_GLOBALS._stripModifier, this);
2486 			}
2487 		}
2488 		break;
2489 	case 1550:
2490 		R2_GLOBALS._sceneManager.changeScene(1525);
2491 		break;
2492 	case 1552:
2493 	// No break on purpose
2494 	case 1588:
2495 		R2_INVENTORY.setObjectScene(R2_AIRBAG, R2_GLOBALS._player._characterIndex);
2496 		_airbag.remove();
2497 		_dontExit = false;
2498 		R2_GLOBALS._player.enableControl();
2499 		break;
2500 	case 1553:
2501 		R2_GLOBALS._sceneManager.changeScene(1575);
2502 		break;
2503 	case 1554:
2504 		R2_GLOBALS._player.enableControl();
2505 		_dontExit = false;
2506 		break;
2507 	case 1555:
2508 	// No break on purpose
2509 	case 1589:
2510 		R2_INVENTORY.setObjectScene(R2_GYROSCOPE, R2_GLOBALS._player._characterIndex);
2511 		_gyroscope.remove();
2512 		R2_GLOBALS._player.enableControl();
2513 		break;
2514 	case 1558:
2515 		_dish.fixPriority(124);
2516 		_dishMode = 1;
2517 		_dishControlsWindow.setup2(1559, 1, 1, 160, 125);
2518 		R2_GLOBALS._player.enableControl();
2519 		break;
2520 	case 1559:
2521 		_dish.fixPriority(168);
2522 		_walkway.fixPriority(169);
2523 		R2_GLOBALS._player.fixPriority(-1);
2524 		R2_GLOBALS._player.changeZoom(-1);
2525 		_dishMode = 0;
2526 		R2_GLOBALS._player.enableControl();
2527 		break;
2528 	case 1562:
2529 		R2_GLOBALS._player.enableControl();
2530 		R2_GLOBALS._player._canWalk = false;
2531 		_dishMode = 2;
2532 		break;
2533 	case 1564:
2534 		R2_INVENTORY.setObjectScene(R2_BATTERY, 1);
2535 		_sceneMode = 1565;
2536 		setAction(&_sequenceManager1, this, 1565, &R2_GLOBALS._player, NULL);
2537 		break;
2538 	case 1565:
2539 		R2_GLOBALS._player.enableControl(CURSOR_USE);
2540 		R2_GLOBALS._player._canWalk = false;
2541 		break;
2542 	case 1569:
2543 	// No break on purpose
2544 	case 1579:
2545 		_dontExit = false;
2546 		_wreckage2.remove();
2547 		R2_INVENTORY.setObjectScene(R2_GUIDANCE_MODULE, 0);
2548 		R2_GLOBALS._player.enableControl();
2549 		break;
2550 	case 1570:
2551 	// No break on purpose
2552 	case 1580:
2553 		_dontExit = false;
2554 		_wreckage2.remove();
2555 		R2_INVENTORY.setObjectScene(R2_RADAR_MECHANISM, 0);
2556 		R2_GLOBALS._player.enableControl();
2557 		break;
2558 	case 1571:
2559 	// No break on purpose
2560 	case 1581:
2561 		_dontExit = false;
2562 		_wreckage2.remove();
2563 		R2_INVENTORY.setObjectScene(R2_GYROSCOPE, 0);
2564 		R2_GLOBALS._player.enableControl();
2565 		break;
2566 	case 1572:
2567 		_dontExit = false;
2568 		_wreckage2.remove();
2569 		R2_INVENTORY.setObjectScene(R2_THRUSTER_VALVE, 0);
2570 		R2_GLOBALS._player.enableControl();
2571 		break;
2572 	case 1573:
2573 		_dontExit = false;
2574 		_wreckage2.remove();
2575 		R2_INVENTORY.setObjectScene(R2_IGNITOR, 0);
2576 		R2_GLOBALS._player.enableControl();
2577 		break;
2578 	case 1574:
2579 	// No break on purpose
2580 	case 1582:
2581 		_dontExit = false;
2582 		_wreckage2.remove();
2583 		R2_INVENTORY.setObjectScene(R2_FUEL_CELL, 0);
2584 		R2_GLOBALS._player.enableControl();
2585 		break;
2586 	case 1575:
2587 	// No break on purpose
2588 	case 1583:
2589 		_dontExit = false;
2590 		_wreckage2.remove();
2591 		R2_INVENTORY.setObjectScene(R2_BATTERY, 0);
2592 		R2_GLOBALS._player.enableControl();
2593 		break;
2594 	case 1576:
2595 	// No break on purpose
2596 	case 1584:
2597 		R2_GLOBALS._sceneManager.changeScene(1580);
2598 		R2_GLOBALS._player.enableControl();
2599 		break;
2600 	case 1577:
2601 	// No break on purpose
2602 	case 1578:
2603 		_sceneMode = 0;
2604 		_wreckage2.remove();
2605 		_dontExit = false;
2606 		R2_GLOBALS._player.fixPriority(-1);
2607 		R2_GLOBALS._player.enableControl();
2608 		break;
2609 	case 1585:
2610 		SceneItem::display(1550, 66, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
2611 		R2_GLOBALS._player.enableControl();
2612 		break;
2613 	case 1586:
2614 	// No break on purpose
2615 	case 1587:
2616 		R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex);
2617 		_diagnosticsDisplay.remove();
2618 		_dontExit = false;
2619 		R2_GLOBALS._player.enableControl();
2620 		break;
2621 	case 1592:
2622 		_joystick.remove();
2623 		R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1);
2624 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2625 			R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN];
2626 		} else {
2627 			R2_GLOBALS._s1550PlayerArea[R2_QUINN] = R2_GLOBALS._s1550PlayerArea[R2_SEEKER];
2628 		}
2629 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
2630 		break;
2631 	default:
2632 		_sceneMode = 62;
2633 		setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
2634 		break;
2635 	}
2636 }
2637 
process(Event & event)2638 void Scene1550::process(Event &event) {
2639 	if ((!R2_GLOBALS._player._canWalk) && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN) && (event.eventType == EVENT_BUTTON_DOWN) && (this->_screenNumber == 1234)) {
2640 		int curReg = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);
2641 		if (curReg == 0)
2642 			_dontExit = true;
2643 		else if (((R2_GLOBALS._player._position.y < 90) && (event.mousePos.y > 90)) || ((R2_GLOBALS._player._position.y > 90) && (event.mousePos.y < 90)))
2644 			_dontExit = true;
2645 		else
2646 			_dontExit = false;
2647 
2648 		if ((curReg == 13) || (curReg == 14))
2649 			_dontExit = false;
2650 	}
2651 
2652 	Scene::process(event);
2653 }
2654 
dispatch()2655 void Scene1550::dispatch() {
2656 	Scene::dispatch();
2657 
2658 	// Arrays related to this scene are all hacky in the origina: they are based on the impossibility to use Miranda
2659 	assert ((R2_GLOBALS._player._characterIndex == R2_QUINN) || (R2_GLOBALS._player._characterIndex == R2_SEEKER));
2660 
2661 	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 15) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 16)) {
2662 		R2_GLOBALS._player._shade = 0;
2663 
2664 		// NOTE: Original game contains a switch based on an uninitialized variable.
2665 		// We're leaving this code here, but ifdef'ed out, in case we can ever figure out
2666 		// what the original programmers intended the value to come from
2667 #if 0
2668 		int missingVariable = 0;
2669 		switch (missingVariable) {
2670 		case 144:
2671 		// No break on purpose
2672 		case 146:
2673 			_dish._frame = 5;
2674 			R2_GLOBALS._player._shade = 3;
2675 			break;
2676 		case 148:
2677 		// No break on purpose
2678 		case 149:
2679 			_dish._frame = 1;
2680 		// No break on purpose
2681 		case 147:
2682 		// No break on purpose
2683 		case 150:
2684 			R2_GLOBALS._player._shade = 3;
2685 			break;
2686 		default:
2687 			break;
2688 		}
2689 #endif
2690 	}
2691 
2692 	if (_dontExit)
2693 		return;
2694 
2695 	switch (R2_GLOBALS._player.getRegionIndex() - 11) {
2696 	case 0:
2697 	// No break on purpose
2698 	case 5:
2699 		// Exiting the top of the screen
2700 		R2_GLOBALS._player.disableControl();
2701 		_sceneMode = 1;
2702 		_dontExit = true;
2703 		--R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y;
2704 
2705 		enterArea();
2706 
2707 		R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 108) * 172) / 100), 145));
2708 		if (R2_GLOBALS._player._position.x < 160) {
2709 			Common::Point pt(R2_GLOBALS._player._position.x + 5, 135);
2710 			NpcMover *mover = new NpcMover();
2711 			R2_GLOBALS._player.addMover(mover, &pt, this);
2712 		} else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original...
2713 			Common::Point pt(R2_GLOBALS._player._position.x, 135);
2714 			NpcMover *mover = new NpcMover();
2715 			R2_GLOBALS._player.addMover(mover, &pt, this);
2716 		} else {
2717 			Common::Point pt(R2_GLOBALS._player._position.x - 5, 135);
2718 			NpcMover *mover = new NpcMover();
2719 			R2_GLOBALS._player.addMover(mover, &pt, this);
2720 		}
2721 		break;
2722 	case 1:
2723 		// Exiting the bottom of the screen
2724 		R2_GLOBALS._player.disableControl();
2725 		_sceneMode = 3;
2726 		_dontExit = true;
2727 		++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y;
2728 
2729 		enterArea();
2730 
2731 		R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 172) * 108) / 100), 19));
2732 		if (R2_GLOBALS._player._position.x < 160) {
2733 			Common::Point pt(R2_GLOBALS._player._position.x + 5, 29);
2734 			NpcMover *mover = new NpcMover();
2735 			R2_GLOBALS._player.addMover(mover, &pt, this);
2736 		} else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original...
2737 			Common::Point pt(R2_GLOBALS._player._position.x, 29);
2738 			NpcMover *mover = new NpcMover();
2739 			R2_GLOBALS._player.addMover(mover, &pt, this);
2740 		} else {
2741 			Common::Point pt(R2_GLOBALS._player._position.x - 5, 29);
2742 			NpcMover *mover = new NpcMover();
2743 			R2_GLOBALS._player.addMover(mover, &pt, this);
2744 		}
2745 		break;
2746 	case 2:
2747 		// Exiting the right of the screen
2748 		R2_GLOBALS._player.disableControl();
2749 		_sceneMode = 5;
2750 		_dontExit = true;
2751 		++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x;
2752 
2753 		enterArea();
2754 
2755 		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) {
2756 			if (R2_GLOBALS._player._position.y >= 85) {
2757 				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10));
2758 				Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y + 20);
2759 				NpcMover *mover = new NpcMover();
2760 				R2_GLOBALS._player.addMover(mover, &pt, this);
2761 			} else {
2762 				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10));
2763 				Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y - 20);
2764 				NpcMover *mover = new NpcMover();
2765 				R2_GLOBALS._player.addMover(mover, &pt, this);
2766 			}
2767 		} else {
2768 			R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y));
2769 			Common::Point pt(R2_GLOBALS._player._position.x + 10, R2_GLOBALS._player._position.y);
2770 			NpcMover *mover = new NpcMover();
2771 			R2_GLOBALS._player.addMover(mover, &pt, this);
2772 		}
2773 		break;
2774 	case 3:
2775 		// Exiting to the left of the screen
2776 		R2_GLOBALS._player.disableControl();
2777 		_sceneMode = 7;
2778 		_dontExit = true;
2779 		--R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x;
2780 
2781 		enterArea();
2782 
2783 		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 24) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) {
2784 			R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y / 2));
2785 			Common::Point pt(265, 29);
2786 			NpcMover *mover = new NpcMover();
2787 			R2_GLOBALS._player.addMover(mover, &pt, this);
2788 		} else if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) {
2789 			if (R2_GLOBALS._player._position.y >= 85) {
2790 				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10));
2791 				Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y + 20);
2792 				NpcMover *mover = new NpcMover();
2793 				R2_GLOBALS._player.addMover(mover, &pt, this);
2794 			} else {
2795 				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10));
2796 				Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y - 20);
2797 				NpcMover *mover = new NpcMover();
2798 				R2_GLOBALS._player.addMover(mover, &pt, this);
2799 			}
2800 		} else {
2801 			R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y));
2802 			Common::Point pt(R2_GLOBALS._player._position.x - 10, R2_GLOBALS._player._position.y);
2803 			NpcMover *mover = new NpcMover();
2804 			R2_GLOBALS._player.addMover(mover, &pt, this);
2805 		}
2806 		break;
2807 	default:
2808 		break;
2809 	}
2810 }
2811 
saveCharacter(int characterIndex)2812 void Scene1550::saveCharacter(int characterIndex) {
2813 	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2814 		R2_GLOBALS._sound1.fadeOut2(NULL);
2815 
2816 	SceneExt::saveCharacter(characterIndex);
2817 }
2818 
setupWall(int frameNumber,int strip)2819 void Scene1550::Wall::setupWall(int frameNumber, int strip) {
2820 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
2821 
2822 	postInit();
2823 	if (scene->_wallType == 2)
2824 		setup(1551, strip, frameNumber);
2825 	else
2826 		setup(1554, strip, frameNumber);
2827 
2828 	switch (strip) {
2829 	case 0:
2830 		switch (frameNumber - 1) {
2831 		case 0:
2832 			setup(1551, 1, 1);
2833 			setPosition(Common::Point(30, 67));
2834 			break;
2835 		case 1:
2836 			setup(1560, 1, 5);
2837 			setPosition(Common::Point(141, 54));
2838 			break;
2839 		case 2:
2840 			setup(1560, 2, 5);
2841 			setPosition(Common::Point(178, 54));
2842 			break;
2843 		case 3:
2844 			setup(1560, 2, 1);
2845 			setPosition(Common::Point(289, 67));
2846 			break;
2847 		case 4:
2848 			setup(1560, 2, 2);
2849 			setPosition(Common::Point(298, 132));
2850 			break;
2851 		case 5:
2852 			setup(1560, 1, 2);
2853 			setPosition(Common::Point(21, 132));
2854 			break;
2855 		case 6:
2856 			setup(1560, 2, 4);
2857 			setPosition(Common::Point(285, 123));
2858 			break;
2859 		case 7:
2860 			setup(1560, 1, 3);
2861 			setPosition(Common::Point(30, 111));
2862 			break;
2863 		case 8:
2864 			setup(1560, 2, 3);
2865 			setPosition(Common::Point(289, 111));
2866 			break;
2867 		case 9:
2868 			setup(1560, 1, 4);
2869 			setPosition(Common::Point(34, 123));
2870 			break;
2871 		default:
2872 			break;
2873 		}
2874 		fixPriority(1);
2875 		break;
2876 	case 1:
2877 		if (frameNumber == 3) {
2878 			setup(1553, 3, 1);
2879 			setPosition(Common::Point(48, 44));
2880 			fixPriority(2);
2881 		} else {
2882 			fixPriority(1);
2883 			setPosition(Common::Point(32, 17));
2884 		}
2885 
2886 		switch (frameNumber) {
2887 		case 2:
2888 			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
2889 			break;
2890 		case 3:
2891 			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
2892 			break;
2893 		default:
2894 			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
2895 			break;
2896 		}
2897 		break;
2898 	case 2:
2899 		fixPriority(1);
2900 		switch (frameNumber) {
2901 		case 4:
2902 			setup(1553, 4, 1);
2903 			setPosition(Common::Point(48, 168));
2904 			break;
2905 		case 5:
2906 			setup(1553, 3, 2);
2907 			setPosition(Common::Point(20, 168));
2908 			fixPriority(250);
2909 			break;
2910 		default:
2911 			setPosition(Common::Point(28, 116));
2912 			break;
2913 		}
2914 
2915 		switch (frameNumber) {
2916 		case 2:
2917 			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
2918 			break;
2919 		case 4:
2920 			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
2921 			break;
2922 		case 5:
2923 			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
2924 			break;
2925 		default:
2926 			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
2927 			break;
2928 		}
2929 		break;
2930 	case 3:
2931 		switch (frameNumber) {
2932 		case 2:
2933 			fixPriority(2);
2934 			if (scene->_wallType == 2)
2935 				setup(1553, 2, 1);
2936 			else
2937 				setup(1556, 2, 1);
2938 			setPosition(Common::Point(160, 44));
2939 			break;
2940 		case 3:
2941 			fixPriority(2);
2942 			setup(1553, 5, 1);
2943 			setPosition(Common::Point(178, 44));
2944 			break;
2945 		default:
2946 			fixPriority(1);
2947 			setPosition(Common::Point(160, 17));
2948 			break;
2949 		}
2950 
2951 		if (frameNumber == 1)
2952 			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
2953 		else
2954 			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
2955 		break;
2956 	case 4:
2957 		if (frameNumber == 2) {
2958 			fixPriority(250);
2959 			if (scene->_wallType == 2)
2960 				setup(1553, 1, 1);
2961 			else
2962 				setup(1556, 1, 1);
2963 		} else {
2964 			fixPriority(2);
2965 		}
2966 
2967 		if (frameNumber != 1)
2968 			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
2969 
2970 		setPosition(Common::Point(160, 168));
2971 		break;
2972 	case 5:
2973 		fixPriority(1);
2974 		setPosition(Common::Point(287, 17));
2975 
2976 		switch (frameNumber) {
2977 		case 2:
2978 			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
2979 			break;
2980 		case 3:
2981 			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
2982 			break;
2983 		default:
2984 			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
2985 			break;
2986 		}
2987 		break;
2988 	case 6:
2989 		fixPriority(1);
2990 		setPosition(Common::Point(291, 116));
2991 
2992 		if (frameNumber == 2)
2993 			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
2994 		else
2995 			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
2996 		break;
2997 	default:
2998 		break;
2999 	}
3000 
3001 }
3002 
enterArea()3003 void Scene1550::enterArea() {
3004 	_walkRegionsId = 0;
3005 	_dishMode = 0;
3006 
3007 	_wallCorner1.remove();
3008 	_westWall.remove();
3009 	_northWall.remove();
3010 	_southWall.remove();
3011 	_wallCorner2.remove();
3012 	_eastWall.remove();
3013 
3014 	for (int i = 0; i < 8; ++i)
3015 		_junk[i].remove();
3016 
3017 	_wreckage.remove();
3018 
3019 	for (int i = 0; i < 8; ++i)
3020 		_shipComponents[i].remove();
3021 
3022 	_airbag.remove();
3023 	_joystick.remove();
3024 	_gyroscope.remove();
3025 	_wreckage4.remove();
3026 	_diagnosticsDisplay.remove();
3027 
3028 	if ((_sceneMode != 1577) && (_sceneMode != 1578))
3029 		_wreckage2.remove();
3030 
3031 	_wreckage3.remove();
3032 	_companion.remove();
3033 	_dish.remove();
3034 	_dishTowerShadow.remove();
3035 	_dishTower.remove();
3036 	_walkway.remove();
3037 
3038 	// Set up of special walk regions for certain areas
3039 	switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y) {
3040 	case 0:
3041 		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
3042 		case 3:
3043 			R2_GLOBALS._walkRegions.load(1554);
3044 			_walkRegionsId = 1554;
3045 			break;
3046 		case 4:
3047 			R2_GLOBALS._walkRegions.load(1553);
3048 			_walkRegionsId = 1553;
3049 			break;
3050 		default:
3051 			break;
3052 		}
3053 		break;
3054 	case 3:
3055 	// No break on purpose
3056 	case 4:
3057 		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 23) || (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x)) {
3058 			if (!R2_GLOBALS.getFlag(16)) {
3059 				R2_GLOBALS._walkRegions.load(1559);
3060 				_walkRegionsId = 1559;
3061 			}
3062 		}
3063 		break;
3064 	case 7:
3065 		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
3066 		case 10:
3067 			R2_GLOBALS._walkRegions.load(1555);
3068 			_walkRegionsId = 1555;
3069 			break;
3070 		case 11:
3071 			R2_GLOBALS._walkRegions.load(1556);
3072 			_walkRegionsId = 1556;
3073 			break;
3074 		default:
3075 			break;
3076 		}
3077 		break;
3078 	case 11:
3079 		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
3080 		case 24:
3081 			R2_GLOBALS._walkRegions.load(1558);
3082 			_walkRegionsId = 1558;
3083 			break;
3084 		case 25:
3085 			R2_GLOBALS._walkRegions.load(1557);
3086 			_walkRegionsId = 1557;
3087 			break;
3088 		default:
3089 			break;
3090 		}
3091 		break;
3092 	case 16:
3093 		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
3094 		case 2:
3095 			R2_GLOBALS._walkRegions.load(1552);
3096 			_walkRegionsId = 1552;
3097 			break;
3098 		case 3:
3099 			R2_GLOBALS._walkRegions.load(1551);
3100 			_walkRegionsId = 1551;
3101 			break;
3102 		case 15:
3103 			R2_GLOBALS._walkRegions.load(1575);
3104 			_walkRegionsId = 1575;
3105 		default:
3106 			break;
3107 		}
3108 		break;
3109 	default:
3110 		break;
3111 	}
3112 
3113 	int varA = 0;
3114 
3115 	// This section handles checks if the ARM spacecraft have not yet seized
3116 	// control of Lance of Truth.
3117 	if (!R2_GLOBALS.getFlag(16)) {
3118 		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y - 2) {
3119 		case 0:
3120 			switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 22) {
3121 				case 0:
3122 					varA = 1553;
3123 					_northWall.setupWall(6, 0);
3124 					break;
3125 				case 1:
3126 				// No break on purpose
3127 				case 2:
3128 				// No break on purpose
3129 				case 3:
3130 				// No break on purpose
3131 				case 4:
3132 					varA = 1553;
3133 					break;
3134 				case 5:
3135 					varA = 1553;
3136 					_northWall.setupWall(6, 0);
3137 					break;
3138 				default:
3139 					break;
3140 			}
3141 			break;
3142 		case 1:
3143 		// No break on purpose
3144 		case 2:
3145 			switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) {
3146 			case 0:
3147 				varA = 1550;
3148 				_northWall.setupWall(9, 0);
3149 				break;
3150 			case 1:
3151 				varA = 1552;
3152 				_northWall.setupWall(10, 0);
3153 				break;
3154 			case 2:
3155 			// No break on purpose
3156 			case 3:
3157 			// No break on purpose
3158 			case 4:
3159 			// No break on purpose
3160 			case 5:
3161 				varA = 1552;
3162 				break;
3163 			case 6:
3164 				varA = 1552;
3165 				_northWall.setupWall(7, 0);
3166 				break;
3167 			case 7:
3168 				varA = 1550;
3169 				_northWall.setupWall(8, 0);
3170 				break;
3171 			default:
3172 				break;
3173 			}
3174 			break;
3175 		case 3:
3176 			switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) {
3177 			case 0:
3178 				varA = 1550;
3179 				_northWall.setupWall(4, 0);
3180 				break;
3181 			case 1:
3182 				varA = 1550;
3183 				_northWall.setupWall(3, 0);
3184 				break;
3185 			case 2:
3186 			// No break on purpose
3187 			case 3:
3188 			// No break on purpose
3189 			case 4:
3190 			// No break on purpose
3191 			case 5:
3192 				varA = 1551;
3193 				break;
3194 			case 6:
3195 				varA = 1550;
3196 				_northWall.setupWall(2, 0);
3197 				break;
3198 			case 7:
3199 				varA = 1550;
3200 				_northWall.setupWall(1, 0);
3201 				break;
3202 			default:
3203 				break;
3204 			}
3205 			break;
3206 		default:
3207 			break;
3208 		}
3209 		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 0) &&
3210 				(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x <= 29) &&
3211 				((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x < 20) ||
3212 				(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 7))) {
3213 			// In an area where the cutscene can be triggered, so start it
3214 			R2_GLOBALS.setFlag(16);
3215 			R2_GLOBALS._sceneManager.changeScene(1500);
3216 		}
3217 	}
3218 
3219 	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
3220 			(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) {
3221 		if (_screenNumber != 1234) {
3222 			R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
3223 			loadScene(1234);
3224 			R2_GLOBALS._sceneManager._hasPalette = false;
3225 			_wallType = 0;
3226 		}
3227 	} else if (_screenNumber == 1234) {
3228 		R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
3229 		loadScene(1550);
3230 		R2_GLOBALS._sceneManager._hasPalette = false;
3231 	}
3232 
3233 	if (_screenNumber == 1234)
3234 		_walkRegionsId = 1576;
3235 
3236 	if (_wallType == 0) {
3237 		_wallType = 1;
3238 	} else {
3239 		if (_wallType == 2) {
3240 			_wallType = 3;
3241 		} else {
3242 			_wallType = 2;
3243 		}
3244 
3245 		if (R2_GLOBALS._sceneManager._sceneNumber == 1550){
3246 #if 0
3247 			warning("Mouse_hideIfNeeded()");
3248 			warning("gfx_set_pane_p");
3249 			for (int i = 3; i != 168; ++i) {
3250 				warning("sub294D2(4, i, 312,  var14C)");
3251 				warning("missing for loop, to be implemented");
3252 				warning("gfx_draw_slice");
3253 			}
3254 			warning("gfx_flip_screen()");
3255 			warning("gfx_set_pane_p()");
3256 #endif
3257 			R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
3258 
3259 			if (varA == 0) {
3260 				if (_sceneResourceId != 1550) {
3261 					g_globals->_scenePalette.loadPalette(1550);
3262 					R2_GLOBALS._sceneManager._hasPalette = true;
3263 				}
3264 			} else {
3265 				g_globals->_scenePalette.loadPalette(varA);
3266 				R2_GLOBALS._sceneManager._hasPalette = true;
3267 			}
3268 
3269 			if (R2_GLOBALS._sceneManager._hasPalette)
3270 				_sceneResourceId = varA;
3271 
3272 //			warning("sub_2C429()");
3273 		}
3274 	}
3275 
3276 	// Scene setup dependent on the type of cell specified in the scene map
3277 	switch (scene1550AreaMap[(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y * 30) +
3278 		R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x]) {
3279 	case 0:
3280 		// Standard cell
3281 		if (_walkRegionsId == 0) {
3282 			R2_GLOBALS._walkRegions.load(1550);
3283 			_walkRegionsId = 1550;
3284 		}
3285 		break;
3286 	case 1:
3287 		// North end of the spaceport
3288 		if (_walkRegionsId == 0) {
3289 			R2_GLOBALS._walkRegions.load(1560);
3290 			_walkRegionsId = 1560;
3291 		}
3292 		_wallCorner1.setupWall(2, 1);
3293 		_northWall.setupWall(1, 3);
3294 		_wallCorner2.setupWall(2, 5);
3295 		break;
3296 	case 2:
3297 		R2_GLOBALS._walkRegions.load(1561);
3298 		_walkRegionsId = 1561;
3299 		_wallCorner1.setupWall(2, 1);
3300 		_westWall.setupWall(2, 2);
3301 		_northWall.setupWall(1, 3);
3302 		_wallCorner2.setupWall(2, 5);
3303 		break;
3304 	case 3:
3305 		R2_GLOBALS._walkRegions.load(1562);
3306 		_walkRegionsId = 1562;
3307 		_wallCorner1.setupWall(2, 1);
3308 		_northWall.setupWall(1, 3);
3309 		_wallCorner2.setupWall(2, 5);
3310 		_eastWall.setupWall(2, 6);
3311 		break;
3312 	case 4:
3313 		R2_GLOBALS._walkRegions.load(1563);
3314 		_walkRegionsId = 1563;
3315 		_northWall.setupWall(2, 3);
3316 		break;
3317 	case 5:
3318 		R2_GLOBALS._walkRegions.load(1564);
3319 		_walkRegionsId = 1564;
3320 		_southWall.setupWall(2, 4);
3321 		break;
3322 	case 6:
3323 		R2_GLOBALS._walkRegions.load(1565);
3324 		_walkRegionsId = 1565;
3325 		_wallCorner1.setupWall(1, 1);
3326 		_westWall.setupWall(1, 2);
3327 		_northWall.setupWall(3, 3);
3328 		break;
3329 	case 7:
3330 		R2_GLOBALS._walkRegions.load(1566);
3331 		_walkRegionsId = 1566;
3332 		_wallCorner1.setupWall(1, 1);
3333 		_westWall.setupWall(1, 2);
3334 		_northWall.setupWall(2, 4);
3335 		break;
3336 	case 8:
3337 		R2_GLOBALS._walkRegions.load(1567);
3338 		_walkRegionsId = 1567;
3339 		_westWall.setupWall(5, 2);
3340 		break;
3341 	case 9:
3342 		R2_GLOBALS._walkRegions.load(1568);
3343 		_walkRegionsId = 1568;
3344 		_westWall.setupWall(4, 2);
3345 		break;
3346 	case 10:
3347 		R2_GLOBALS._walkRegions.load(1569);
3348 		_walkRegionsId = 1569;
3349 		_wallCorner1.setupWall(3, 1);
3350 		break;
3351 	case 11:
3352 		R2_GLOBALS._walkRegions.load(1570);
3353 		_walkRegionsId = 1570;
3354 		_wallCorner1.setupWall(1, 1);
3355 		_westWall.setupWall(1, 2);
3356 		break;
3357 	case 12:
3358 		R2_GLOBALS._walkRegions.load(1571);
3359 		_walkRegionsId = 1571;
3360 		_wallCorner2.setupWall(1, 5);
3361 		_eastWall.setupWall(1, 6);
3362 		break;
3363 	case 13:
3364 		R2_GLOBALS._walkRegions.load(1572);
3365 		_walkRegionsId = 1572;
3366 		_wallCorner1.setupWall(1, 1);
3367 		_westWall.setupWall(1, 2);
3368 		_southWall.setupWall(1, 4);
3369 		break;
3370 	case 14:
3371 		R2_GLOBALS._walkRegions.load(1573);
3372 		_walkRegionsId = 1573;
3373 		_southWall.setupWall(1, 4);
3374 		_wallCorner2.setupWall(1, 5);
3375 		_eastWall.setupWall(1, 6);
3376 		break;
3377 	case 15:
3378 		// South wall
3379 		R2_GLOBALS._walkRegions.load(1574);
3380 		_walkRegionsId = 1574;
3381 		_southWall.setupWall(1, 4);
3382 		break;
3383 	case 16:
3384 		R2_GLOBALS._walkRegions.load(1570);
3385 		_walkRegionsId = 1570;
3386 		_wallCorner1.setupWall(2, 1);
3387 		_westWall.setupWall(2, 2);
3388 		break;
3389 	case 17:
3390 		R2_GLOBALS._walkRegions.load(1570);
3391 		_walkRegionsId = 1570;
3392 		_wallCorner1.setupWall(2, 1);
3393 		_westWall.setupWall(3, 2);
3394 		break;
3395 	case 18:
3396 		R2_GLOBALS._walkRegions.load(1571);
3397 		_walkRegionsId = 1571;
3398 		_wallCorner2.setupWall(2, 5);
3399 		_eastWall.setupWall(2, 6);
3400 		break;
3401 	case 19:
3402 		R2_GLOBALS._walkRegions.load(1571);
3403 		_walkRegionsId = 1571;
3404 		_wallCorner2.setupWall(2, 5);
3405 		_eastWall.setupWall(3, 6);
3406 		break;
3407 	default:
3408 		break;
3409 	}
3410 
3411 	int di = 0;
3412 	int tmpIdx = 0;
3413 	for (int i = 0; i < 127 * 4; i += 4) {
3414 		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == R2_GLOBALS._scene1550JunkLocations[i]) &&
3415 				(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == R2_GLOBALS._scene1550JunkLocations[i + 1]) &&
3416 				(R2_GLOBALS._scene1550JunkLocations[i + 2] != 0)) {
3417 			tmpIdx = R2_GLOBALS._scene1550JunkLocations[i + 3];
3418 			_junk[di].postInit();
3419 			_junk[di]._effect = EFFECT_SHADED2;
3420 			_junk[di]._shade = 0;
3421 			//_junk[di]._junkState = tmpIdx;
3422 			_junk[di]._junkNumber = i;
3423 			_junk[di].setDetails(1550, 62, -1, 63, 2, (SceneItem *) NULL);
3424 			if (R2_GLOBALS._scene1550JunkLocations[i + 2] == 41) {
3425 				_junk[di].changeZoom(-1);
3426 				_junk[di].setPosition(Common::Point(150, 70));
3427 				_junk[di].setup(1562, 1, 1);
3428 
3429 				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[2]);
3430 				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[3]);
3431 				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[6]);
3432 				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[7]);
3433 
3434 				if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1550) {
3435 					_joystick.postInit();
3436 					_joystick.setup(1562, 3, 1);
3437 					_joystick.setPosition(Common::Point(150, 70));
3438 					_joystick.fixPriority(10);
3439 					_joystick.setDetails(1550, 41, -1, 42, 2, (SceneItem *) NULL);
3440 				}
3441 			} else {
3442 				if (R2_GLOBALS._scene1550JunkLocations[i + 2] > 40) {
3443 					_junk[di].changeZoom(100);
3444 					_junk[di].setup(1561, 1, R2_GLOBALS._scene1550JunkLocations[i + 2] - 40);
3445 				} else {
3446 					_junk[di].changeZoom(-1);
3447 					_junk[di].setup(1552, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) / 5) + 1, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) % 5) + 1);
3448 				}
3449 				_junk[di].setPosition(Common::Point(scene1550JunkX[tmpIdx], scene1550JunkY[tmpIdx]));
3450 				if (scene1550JunkRegions[tmpIdx] != 0)
3451 					R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[tmpIdx]);
3452 				di++;
3453 			}
3454 		}
3455 	}
3456 
3457 	// Loop for detecting and setting up certain special areas within the map
3458 	for (int i = 0; i < 15 * 3; i += 3) {
3459 		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == scene1550SpecialAreas[i])
3460 				&& (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == scene1550SpecialAreas[i + 1])) {
3461 			int areaType = scene1550SpecialAreas[i + 2];
3462 			switch (areaType) {
3463 			case 1:
3464 				if (!R2_GLOBALS.getFlag(16)) {
3465 					_wreckage2.postInit();
3466 					if (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 3)
3467 						_wreckage2.setup(1555, 2, 1);
3468 					else
3469 						_wreckage2.setup(1555, 1, 1);
3470 					_wreckage2.setPosition(Common::Point(150, 100));
3471 					_wreckage2.fixPriority(92);
3472 					_wreckage2.setDetails(1550, 73, -1, -1, 2, (SceneItem *) NULL);
3473 				}
3474 				break;
3475 			case 2:
3476 				_dish.postInit();
3477 				if (R2_GLOBALS.getFlag(19))
3478 					_dish.setup(1556, 3, 5);
3479 				else
3480 					_dish.setup(1556, 3, 1);
3481 				_dish.changeZoom(95);
3482 				_dish.setPosition(Common::Point(165, 83));
3483 				_dish.fixPriority(168);
3484 				_dish.setDetails(1550, 17, -1, 19, 2, (SceneItem *) NULL);
3485 
3486 				_dishTower.postInit();
3487 				_dishTower.setup(1556, 4, 1);
3488 				_dishTower.setPosition(Common::Point(191, 123));
3489 				_dishTower.changeZoom(95);
3490 				_dishTower.setDetails(1550, 65, -1, 66, 2, (SceneItem *) NULL);
3491 
3492 				_dishTowerShadow.postInit();
3493 				_dishTowerShadow._numFrames = 5;
3494 				if (R2_GLOBALS.getFlag(19))
3495 					_dishTowerShadow.setup(1556, 8, 5);
3496 				else
3497 					_dishTowerShadow.setup(1556, 8, 1);
3498 
3499 				_dishTowerShadow.setPosition(Common::Point(156, 151));
3500 				_dishTowerShadow.fixPriority(10);
3501 
3502 				_walkway.postInit();
3503 				if (R2_GLOBALS.getFlag(20))
3504 					_walkway.setup(1558, 3, 10);
3505 				else
3506 					_walkway.setup(1558, 3, 1);
3507 
3508 				_walkway.setPosition(Common::Point(172, 48));
3509 				_walkway.fixPriority(169);
3510 				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[15]);
3511 				break;
3512 			case 3:
3513 				_wreckage.postInit();
3514 				_wreckage.setup(1550, 1, 1);
3515 				_wreckage.setPosition(Common::Point(259, 55));
3516 				_wreckage.fixPriority(133);
3517 				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
3518 
3519 				_wreckage2.postInit();
3520 				_wreckage2.setup(1550, 1, 2);
3521 				_wreckage2.setPosition(Common::Point(259, 133));
3522 				_wreckage2.fixPriority(105);
3523 				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
3524 				if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 1550) {
3525 					_gyroscope.postInit();
3526 					_gyroscope.setup(1550, 7, 2);
3527 					_gyroscope.setPosition(Common::Point(227, 30));
3528 					_gyroscope.fixPriority(130);
3529 					_gyroscope.setDetails(1550, 29, -1, 63, 2, (SceneItem *) NULL);
3530 				}
3531 				break;
3532 			case 4:
3533 				_wreckage.postInit();
3534 				_wreckage.setup(1550, 1, 4);
3535 				_wreckage.setPosition(Common::Point(76, 131));
3536 				_wreckage.fixPriority(10);
3537 				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
3538 
3539 				_wreckage2.postInit();
3540 				_wreckage2.setup(1550, 1, 3);
3541 				_wreckage2.setPosition(Common::Point(76, 64));
3542 				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
3543 				if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1550) {
3544 					_diagnosticsDisplay.postInit();
3545 					_diagnosticsDisplay.setup(1504, 4, 1);
3546 					_diagnosticsDisplay.setPosition(Common::Point(49, 35));
3547 					_diagnosticsDisplay.animate(ANIM_MODE_2, NULL);
3548 					_diagnosticsDisplay._numFrames = 4;
3549 					_diagnosticsDisplay.fixPriority(65);
3550 					_diagnosticsDisplay.setDetails(1550, 14, 15, 63, 2, (SceneItem *) NULL);
3551 				}
3552 				if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1550) {
3553 					_airbag.postInit();
3554 					_airbag.setup(1550, 7, 1);
3555 					_airbag.setPosition(Common::Point(45, 44));
3556 					_airbag.fixPriority(150);
3557 					_airbag.setDetails(1550, 44, -1, 63, 2, (SceneItem *) NULL);
3558 				}
3559 				break;
3560 			case 5:
3561 				_wreckage.postInit();
3562 				_wreckage.setup(1550, 2, 4);
3563 				_wreckage.setPosition(Common::Point(243, 131));
3564 				_wreckage.fixPriority(10);
3565 				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
3566 
3567 				_wreckage2.postInit();
3568 				_wreckage2.setup(1550, 2, 3);
3569 				_wreckage2.setPosition(Common::Point(243, 64));
3570 				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
3571 				break;
3572 			case 6:
3573 				_wreckage.postInit();
3574 				_wreckage.setup(1550, 2, 1);
3575 				_wreckage.setPosition(Common::Point(60, 55));
3576 				_wreckage.fixPriority(133);
3577 				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
3578 
3579 				_wreckage2.postInit();
3580 				_wreckage2.setup(1550, 2, 2);
3581 				_wreckage2.setPosition(Common::Point(60, 133));
3582 				_wreckage2.fixPriority(106);
3583 				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
3584 				break;
3585 			case 7:
3586 				_wreckage.postInit();
3587 				_wreckage.setup(1550, 3, 1);
3588 				_wreckage.setPosition(Common::Point(281, 132));
3589 				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
3590 				break;
3591 			case 8:
3592 				_wreckage.postInit();
3593 				_wreckage.setup(1550, 3, 2);
3594 				_wreckage.setPosition(Common::Point(57, 96));
3595 				_wreckage.fixPriority(70);
3596 				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
3597 
3598 				_wreckage2.postInit();
3599 				_wreckage2.setup(1550, 3, 3);
3600 				_wreckage2.setPosition(Common::Point(145, 88));
3601 				_wreckage2.fixPriority(55);
3602 				_wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
3603 
3604 				_wreckage3.postInit();
3605 				_wreckage3.setup(1550, 3, 4);
3606 				_wreckage3.setPosition(Common::Point(64, 137));
3607 				_wreckage3.fixPriority(115);
3608 				_wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
3609 
3610 				_wreckage4.postInit();
3611 				_wreckage4.setup(1550, 5, 1);
3612 				_wreckage4.setPosition(Common::Point(60, 90));
3613 				_wreckage4.fixPriority(45);
3614 				break;
3615 			case 9:
3616 				_wreckage.postInit();
3617 				_wreckage.setup(1550, 4, 2);
3618 				_wreckage.setPosition(Common::Point(262, 96));
3619 				_wreckage.fixPriority(70);
3620 				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
3621 
3622 				_wreckage2.postInit();
3623 				_wreckage2.setup(1550, 4, 3);
3624 				_wreckage2.setPosition(Common::Point(174, 88));
3625 				_wreckage2.fixPriority(55);
3626 				_wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
3627 
3628 				_wreckage3.postInit();
3629 				_wreckage3.setup(1550, 4, 4);
3630 				_wreckage3.setPosition(Common::Point(255, 137));
3631 				_wreckage3.fixPriority(115);
3632 				_wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
3633 
3634 				_wreckage4.postInit();
3635 				_wreckage4.setup(1550, 6, 1);
3636 				_wreckage4.setPosition(Common::Point(259, 90));
3637 				_wreckage4.fixPriority(45);
3638 				break;
3639 			case 10:
3640 				_wreckage.postInit();
3641 				_wreckage.setup(1550, 4, 1);
3642 				_wreckage.setPosition(Common::Point(38, 132));
3643 				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
3644 				break;
3645 			case 12:
3646 				// Intact ship
3647 				_shipComponents[7].setupShipComponent(8);
3648 				_shipComponents[0].setupShipComponent(1);
3649 				_shipComponents[1].setupShipComponent(2);
3650 				_shipComponents[2].setupShipComponent(3);
3651 				_shipComponents[3].setupShipComponent(4);
3652 				_shipComponents[4].setupShipComponent(5);
3653 				_shipComponents[5].setupShipComponent(6);
3654 				_shipComponents[6].setupShipComponent(7);
3655 				break;
3656 			default:
3657 				break;
3658 			}
3659 		}
3660 	}
3661 
3662 	if (R2_GLOBALS._s1550PlayerArea[R2_QUINN] == R2_GLOBALS._s1550PlayerArea[R2_SEEKER]) {
3663 		_companion.postInit();
3664 		_companion._effect = EFFECT_SHADED2;
3665 		_companion.changeZoom(-1);
3666 
3667 		assert((_walkRegionsId >= 1550) && (_walkRegionsId <= 2008));
3668 		R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]);
3669 		_companion.setPosition(Common::Point(scene1550JunkX[k5A76D[_walkRegionsId - 1550]], scene1550JunkY[k5A76D[_walkRegionsId - 1550]] + 8));
3670 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
3671 			if (R2_GLOBALS._player._characterScene[R2_SEEKER] == 1580) {
3672 				_companion.setup(1516, 3, 17);
3673 				_companion.setPosition(Common::Point(272, 94));
3674 				_companion.fixPriority(91);
3675 				_companion.changeZoom(100);
3676 				_companion.setDetails(1550, -1, -1, -1, 5, &_shipComponents[7]);
3677 			} else {
3678 				_companion.setup(1505, 6, 1);
3679 				_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
3680 			}
3681 		} else {
3682 			if (R2_GLOBALS._player._characterScene[R2_QUINN] == 1580) {
3683 				_companion.setup(1516, 2, 14);
3684 				_companion.setPosition(Common::Point(276, 97));
3685 				_companion.fixPriority(91);
3686 				_companion.changeZoom(100);
3687 				_companion.setDetails(1550, -1, -1, -1, 5, &_shipComponents[7]);
3688 			} else {
3689 				_companion.setup(1500, 6, 1);
3690 				_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
3691 			}
3692 		}
3693 	}
3694 	R2_GLOBALS._uiElements.updateInventory();
3695 }
3696 
3697 /*--------------------------------------------------------------------------
3698  * Scene 1575 - Spaceport - unused ship scene
3699  *
3700  *--------------------------------------------------------------------------*/
3701 
Button()3702 Scene1575::Button::Button() {
3703 	_buttonId = 0;
3704 	_pressed = false;
3705 }
3706 
synchronize(Serializer & s)3707 void Scene1575::Button::synchronize(Serializer &s) {
3708 	NamedHotspot::synchronize(s);
3709 
3710 	s.syncAsSint16LE(_buttonId);
3711 	s.syncAsSint16LE(_pressed);
3712 }
3713 
process(Event & event)3714 void Scene1575::Button::process(Event &event) {
3715 	Scene1575 *scene = (Scene1575 *)R2_GLOBALS._sceneManager._scene;
3716 	bool isInBounds = _bounds.contains(event.mousePos);
3717 	CursorType cursor = R2_GLOBALS._events.getCursor();
3718 
3719 	if ((event.eventType == EVENT_BUTTON_DOWN && cursor == CURSOR_USE && isInBounds) ||
3720 		(_pressed && _buttonId != 1 && event.eventType == EVENT_BUTTON_UP && isInBounds)) {
3721 		// Button pressed
3722 		_pressed = true;
3723 		Common::Point pos = scene->_actor1._position;
3724 		event.handled = true;
3725 
3726 		if (!R2_GLOBALS.getFlag(18) || _buttonId <= 1 || _buttonId >= 6) {
3727 			switch (_buttonId) {
3728 			case 1:
3729 				if (R2_GLOBALS.getFlag(18)) {
3730 					scene->_actor14.hide();
3731 					scene->_actor15.hide();
3732 					R2_GLOBALS.clearFlag(18);
3733 				} else if ((scene->_actor12._position.x == 85) && (scene->_actor12._position.y == 123)) {
3734 					scene->_actor14.show();
3735 					scene->_actor15.show();
3736 					R2_GLOBALS.setFlag(18);
3737 				} else {
3738 					SceneItem::display("That's probably not a good thing, ya know!");
3739 				}
3740 				break;
3741 			case 2:
3742 				if (scene->_field41A < 780) {
3743 					if (pos.x > 54)
3744 						pos.x -= 65;
3745 					pos.x += 2;
3746 					scene->_field41A += 2;
3747 
3748 					for (int i = 0; i < 17; i++)
3749 						scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x + 2, scene->_arrActor[i]._position.y));
3750 
3751 					scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x + 2, scene->_actor13._position.y));
3752 					scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x + 2, scene->_actor12._position.y));
3753 					scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
3754 					scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
3755 					scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
3756 				}
3757 				break;
3758 			case 3:
3759 				if (scene->_field41A > 0) {
3760 					if (pos.x < -8)
3761 						pos.x += 65;
3762 
3763 					pos.x -= 2;
3764 					scene->_field41A -= 2;
3765 					for (int i = 0; i < 17; i++)
3766 						scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x - 2, scene->_arrActor[i]._position.y));
3767 
3768 					scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x - 2, scene->_actor13._position.y));
3769 					scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x - 2, scene->_actor12._position.y));
3770 					scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
3771 					scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
3772 					scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
3773 				}
3774 				break;
3775 			case 4: {
3776 					if (pos.y < 176) {
3777 						++pos.y;
3778 						for (int i = 0; i < 17; ++i)
3779 							scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y + 1));
3780 
3781 						scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y + 1));
3782 						scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y + 1));
3783 						scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
3784 						scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
3785 						scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
3786 					}
3787 				}
3788 				break;
3789 			case 5: {
3790 					if (pos.y > 145) {
3791 						--pos.y;
3792 						for (int i = 0; i < 17; ++i)
3793 							scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y - 1));
3794 
3795 						scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y - 1));
3796 						scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y - 1));
3797 						scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
3798 						scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
3799 						scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
3800 					}
3801 				}
3802 				break;
3803 			case 6:
3804 				R2_GLOBALS._sceneManager.changeScene(1550);
3805 				break;
3806 			default:
3807 				break;
3808 			}
3809 
3810 			int j = 0;
3811 			for (int i = 0; i < 17; i++) {
3812 				if (scene->_arrActor[i]._bounds.contains(85, 116))
3813 					j = i;
3814 			}
3815 
3816 			if (scene->_actor13._bounds.contains(85, 116))
3817 				j = 18;
3818 
3819 			if (scene->_actor12._bounds.contains(85, 116))
3820 				j = 19;
3821 
3822 			if (j)
3823 				scene->_actor11.show();
3824 			else
3825 				scene->_actor11.hide();
3826 		} else {
3827 			SceneItem::display("Better not move the laser while it's firing!");
3828 		}
3829 	} else {
3830 		_pressed = false;
3831 	}
3832 }
3833 
startAction(CursorType action,Event & event)3834 bool Scene1575::Button::startAction(CursorType action, Event &event) {
3835 	if (action == CURSOR_USE)
3836 		return false;
3837 	return SceneHotspot::startAction(action, event);
3838 }
3839 
initButton(int buttonId)3840 void Scene1575::Button::initButton(int buttonId) {
3841 	_buttonId = buttonId;
3842 	_pressed = false;
3843 	EventHandler::postInit();
3844 
3845 	switch (_buttonId) {
3846 	case 1:
3847 		setDetails(Rect(53, 165, 117, 190), -1, -1, -1, 2, 1, NULL);
3848 		break;
3849 	case 2:
3850 		setDetails(Rect(151, 142, 189, 161), -1, -1, -1, 2, 1, NULL);
3851 		break;
3852 	case 3:
3853 		setDetails(Rect(225, 142, 263, 161), -1, -1, -1, 2, 1, NULL);
3854 		break;
3855 	case 4:
3856 		setDetails(Rect(188, 122, 226, 140), -1, -1, -1, 2, 1, NULL);
3857 		break;
3858 	case 5:
3859 		setDetails(Rect(188, 162, 226, 180), -1, -1, -1, 2, 1, NULL);
3860 		break;
3861 	case 6:
3862 		setDetails(Rect(269, 169, 301, 185), -1, -1, -1, 2, 1, NULL);
3863 		break;
3864 	default:
3865 		break;
3866 	}
3867 }
3868 
3869 /*--------------------------------------------------------------------------*/
3870 
Scene1575()3871 Scene1575::Scene1575() {
3872 	_field412 = 0;
3873 	_field414 = 390;
3874 	_field416 = 0;
3875 	_field418 = 0;
3876 	_field41A = 0;
3877 }
3878 
synchronize(Serializer & s)3879 void Scene1575::synchronize(Serializer &s) {
3880 	SceneExt::synchronize(s);
3881 
3882 	s.syncAsSint16LE(_field412);
3883 	s.syncAsSint16LE(_field414);
3884 	s.syncAsSint16LE(_field416);
3885 	s.syncAsSint16LE(_field418);
3886 	s.syncAsSint16LE(_field41A);
3887 }
3888 
postInit(SceneObjectList * OwnerList)3889 void Scene1575::postInit(SceneObjectList *OwnerList) {
3890 	loadScene(1575);
3891 	R2_GLOBALS._uiElements._active = false;
3892 	SceneExt::postInit();
3893 	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
3894 
3895 	_actor1.postInit();
3896 	_actor1.setup(1575, 1, 1);
3897 	_actor1.setPosition(Common::Point(54, 161));
3898 	_actor1.fixPriority(5);
3899 
3900 	_actor2.postInit();
3901 	_actor2.setup(1575, 1, 1);
3902 	_actor2.setPosition(Common::Point(119, 161));
3903 	_actor2.fixPriority(5);
3904 
3905 	_actor3.postInit();
3906 	_actor3.setup(1575, 1, 1);
3907 	_actor3.setPosition(Common::Point(184, 161));
3908 	_actor3.fixPriority(5);
3909 
3910 	for (int i = 0; i < 17; i++) {
3911 		_arrActor[i].postInit();
3912 		_arrActor[i].setup(1575, 2, k5A7F6[3 * i + 2]);
3913 
3914 		double v1 = Common::hypotenuse<double>(2.0, 3 - k5A7F6[3 * i]);
3915 		v1 += Common::hypotenuse<double>(2.0, 3 - k5A7F6[3 * i + 1]);
3916 		int yp = (int)(sqrt(v1) * 75.0 / 17.0 - 161.0);
3917 
3918 		int angle = R2_GLOBALS._gfxManagerInstance.getAngle(
3919 			Common::Point(3, 16), Common::Point(k5A7F6[3 * i], k5A7F6[3 * i + 1]));
3920 		int xp = angle * 78 / 9 - 319;
3921 
3922 		_arrActor[i].setPosition(Common::Point(xp, yp));
3923 		_arrActor[i].fixPriority(6);
3924 	}
3925 
3926 	_actor4.postInit();
3927 	_actor4.setup(1575, 3, 1);
3928 	_actor4.setPosition(Common::Point(48, 81));
3929 
3930 	_actor5.postInit();
3931 	_actor5.setup(1575, 3,1);
3932 	_actor5.setPosition(Common::Point(121, 81));
3933 
3934 	_actor6.postInit();
3935 	_actor6.setup(1575, 3, 2);
3936 	_actor6.setPosition(Common::Point(203, 80));
3937 
3938 	_actor7.postInit();
3939 	_actor7.setup(1575, 3, 2);
3940 	_actor7.setPosition(Common::Point(217, 80));
3941 
3942 	_actor8.postInit();
3943 	_actor8.setup(1575, 3, 2);
3944 	_actor8.setPosition(Common::Point(231, 80));
3945 
3946 	_actor9.postInit();
3947 	_actor9.setup(1575, 3, 2);
3948 	_actor9.setPosition(Common::Point(273, 91));
3949 
3950 	_actor10.postInit();
3951 	_actor10.setup(1575, 3, 2);
3952 	_actor10.setPosition(Common::Point(287, 91));
3953 
3954 	// Initialize buttons
3955 	_button1.initButton(1);
3956 	_button2.initButton(2);
3957 	_button3.initButton(3);
3958 	_button4.initButton(4);
3959 	_button5.initButton(5);
3960 	_button6.initButton(6);
3961 
3962 	_actor11.postInit();
3963 	_actor11.setup(1575, 4, 2);
3964 	_actor11.setPosition(Common::Point(84, 116));
3965 	_actor11.hide();
3966 
3967 	R2_GLOBALS._player.postInit();
3968 	R2_GLOBALS._player.hide();
3969 	R2_GLOBALS._player.enableControl();
3970 
3971 	do {
3972 		_field412 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10;
3973 		_field414 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10;
3974 	} while ((_field412) && (_field414));
3975 
3976 	if (_field412 < 0)
3977 		_actor4.hide();
3978 
3979 	if (_field414 < 0)
3980 		_actor5.hide();
3981 
3982 	_field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
3983 	_field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
3984 
3985 	_actor13.postInit();
3986 	_actor13.setup(1575, 2, 4);
3987 
3988 	// TODO
3989 	warning("TODO: another immense pile of floating operations");
3990 
3991 	_actor12.postInit();
3992 	_actor12.fixPriority(12);
3993 
3994 	if (R2_GLOBALS.getFlag(17)) {
3995 		_actor13.setPosition(Common::Point(_actor13._position.x + 5, _actor13._position.y));
3996 		_actor12.setPosition(Common::Point(_actor12._position.x + 5, _actor12._position.y));
3997 	}
3998 
3999 	_actor14.postInit();
4000 	_actor14.setup(1575, 5, 1);
4001 	_actor14.setPosition(Common::Point(85, 176));
4002 	_actor14.fixPriority(7);
4003 	_actor14.hide();
4004 
4005 	_actor15.postInit();
4006 	_actor15.setup(1575, 5, 2);
4007 	_actor15.setPosition(Common::Point(85, 147));
4008 	_actor15.fixPriority(7);
4009 	_actor15.hide();
4010 }
4011 
remove()4012 void Scene1575::remove() {
4013 	SceneExt::remove();
4014 	R2_GLOBALS._uiElements._active = true;
4015 }
4016 
signal()4017 void Scene1575::signal() {
4018 	R2_GLOBALS._player.enableControl();
4019 }
4020 
process(Event & event)4021 void Scene1575::process(Event &event) {
4022 	Scene::process(event);
4023 
4024 	g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject);
4025 }
4026 
dispatch()4027 void Scene1575::dispatch() {
4028 	if (_field412 <= 0) {
4029 		++_field412;
4030 		if (_field412 == 0) {
4031 			_actor4.show();
4032 			_field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
4033 		}
4034 	} else {
4035 		_field412--;
4036 		if (_field412 ==0) {
4037 			_actor4.hide();
4038 			_field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
4039 		}
4040 	}
4041 
4042 	if (_field414 <= 0) {
4043 		++_field414;
4044 		if (_field414 == 0) {
4045 			_actor5.show();
4046 			_field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
4047 		}
4048 	} else {
4049 		_field414--;
4050 		if (_field414 == 0) {
4051 			_actor5.hide();
4052 			_field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
4053 		}
4054 	}
4055 
4056 	if (_field416 == 0) {
4057 		switch(R2_GLOBALS._randomSource.getRandomNumber(3)) {
4058 		case 0:
4059 			_actor6.hide();
4060 			_actor7.hide();
4061 			_actor8.hide();
4062 			break;
4063 		case 1:
4064 			_actor6.show();
4065 			_actor7.hide();
4066 			_actor8.hide();
4067 			break;
4068 		case 2:
4069 			_actor6.show();
4070 			_actor7.show();
4071 			_actor8.hide();
4072 			break;
4073 		case 3:
4074 			_actor6.show();
4075 			_actor7.show();
4076 			_actor8.show();
4077 			break;
4078 		default:
4079 			break;
4080 		}
4081 		_field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
4082 	} else {
4083 		--_field416;
4084 	}
4085 
4086 	if (_field418 == 0) {
4087 		switch(R2_GLOBALS._randomSource.getRandomNumber(2)) {
4088 		case 0:
4089 			_actor9.hide();
4090 			_actor10.hide();
4091 			break;
4092 		case 1:
4093 			_actor9.show();
4094 			_actor10.hide();
4095 			break;
4096 		case 2:
4097 			_actor9.show();
4098 			_actor10.show();
4099 			break;
4100 		default:
4101 			break;
4102 		}
4103 		_field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
4104 	} else {
4105 		_field418--;
4106 	}
4107 	Scene::dispatch();
4108 }
4109 
4110 /*--------------------------------------------------------------------------
4111  * Scene 1580 - Inside wreck
4112  *
4113  *--------------------------------------------------------------------------*/
4114 
Scene1580()4115 Scene1580::Scene1580() {
4116 }
4117 
synchronize(Serializer & s)4118 void Scene1580::synchronize(Serializer &s) {
4119 	SceneExt::synchronize(s);
4120 }
4121 
startAction(CursorType action,Event & event)4122 bool Scene1580::JoystickPlug::startAction(CursorType action, Event &event) {
4123 	if (action == R2_JOYSTICK) {
4124 		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
4125 
4126 		R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1580);
4127 		R2_GLOBALS._sceneItems.remove(&scene->_joystickPlug);
4128 		scene->_joystick.postInit();
4129 		scene->_joystick.setup(1580, 1, 4);
4130 		scene->_joystick.setPosition(Common::Point(159, 163));
4131 		scene->_joystick.setDetails(1550, 78, -1, -1, 2, (SceneItem *) NULL);
4132 
4133 		scene->_arrActor[5].remove();
4134 
4135 		return true;
4136 	}
4137 
4138 	return SceneHotspot::startAction(action, event);
4139 }
4140 
startAction(CursorType action,Event & event)4141 bool Scene1580::ScreenSlot::startAction(CursorType action, Event &event) {
4142 	if (action == R2_DIAGNOSTICS_DISPLAY) {
4143 		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
4144 
4145 		R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, 1580);
4146 		R2_GLOBALS._player.disableControl();
4147 		R2_GLOBALS._sceneItems.remove(&scene->_screenSlot);
4148 
4149 		scene->_screen.postInit();
4150 		scene->_screen.setup(1580, 1, 1);
4151 		scene->_screen.setPosition(Common::Point(124, 108));
4152 		scene->_screen.fixPriority(10);
4153 
4154 		if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580)
4155 			scene->_screen.setDetails(1550, 14, -1, -1, 5, &scene->_joystick);
4156 		else
4157 			scene->_screen.setDetails(1550, 14, -1, -1, 2, (SceneItem *)NULL);
4158 
4159 		scene->_screenDisplay.postInit();
4160 		scene->_screenDisplay.setup(1580, 3, 1);
4161 		scene->_screenDisplay.setPosition(Common::Point(124, 109));
4162 		scene->_screenDisplay.fixPriority(20);
4163 		//scene->_field412 = 1;
4164 		scene->_sceneMode = 10;
4165 		scene->setAction(&scene->_sequenceManager, scene, 1, &R2_GLOBALS._player, NULL);
4166 
4167 		return true;
4168 	}
4169 
4170 	return SceneHotspot::startAction(action, event);
4171 }
4172 
startAction(CursorType action,Event & event)4173 bool Scene1580::Joystick::startAction(CursorType action, Event &event) {
4174 	if ( (action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580)
4175 		&& (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0) && (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0)
4176 		&& (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0) && (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0)
4177 		&& (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 0) && (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 0)) {
4178 		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
4179 		scene->_sceneMode = 31;
4180 		R2_GLOBALS._player.disableControl();
4181 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4182 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
4183 			scene->_stripManager.start(536, scene);
4184 		else
4185 			scene->_stripManager.start(537, scene);
4186 
4187 		return true;
4188 	}
4189 
4190 	return SceneActor::startAction(action, event);
4191 }
4192 
startAction(CursorType action,Event & event)4193 bool Scene1580::Screen::startAction(CursorType action, Event &event) {
4194 	if ((action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580)) {
4195 		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
4196 
4197 		R2_INVENTORY.setObjectScene(R2_BROKEN_DISPLAY, R2_GLOBALS._player._characterIndex);
4198 		scene->_screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 2, NULL);
4199 		scene->_screenDisplay.remove();
4200 		remove();
4201 		return true;
4202 	}
4203 
4204 	return SceneActor::startAction(action, event);
4205 }
4206 
startAction(CursorType action,Event & event)4207 bool Scene1580::StorageCompartment::startAction(CursorType action, Event &event) {
4208 	if (action != CURSOR_USE)
4209 		return SceneActor::startAction(action, event);
4210 
4211 	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
4212 
4213 	R2_GLOBALS._player.disableControl();
4214 	R2_GLOBALS._sceneItems.remove(&scene->_storageCompartment);
4215 	scene->_sceneMode = 0;
4216 	animate(ANIM_MODE_5, scene);
4217 
4218 	return true;
4219 }
4220 
startAction(CursorType action,Event & event)4221 bool Scene1580::HatchButton::startAction(CursorType action, Event &event) {
4222 	if (action != CURSOR_USE)
4223 		return SceneActor::startAction(action, event);
4224 
4225 	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
4226 
4227 	R2_GLOBALS._player.disableControl();
4228 	setFrame(2);
4229 	scene->_sceneMode = 20;
4230 	scene->setAction(&scene->_sequenceManager, scene, 2, &R2_GLOBALS._player, NULL);
4231 
4232 	return true;
4233 }
4234 
startAction(CursorType action,Event & event)4235 bool Scene1580::ThrusterValve::startAction(CursorType action, Event &event) {
4236 	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
4237 
4238 	switch (action) {
4239 	case CURSOR_USE:
4240 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
4241 			R2_INVENTORY.setObjectScene(R2_THRUSTER_VALVE, 1);
4242 			remove();
4243 			return true;
4244 		}
4245 		break;
4246 	case R2_COM_SCANNER:
4247 		scene->_sceneMode = 30;
4248 		R2_GLOBALS._player.disableControl();
4249 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4250 		scene->_stripManager.start(529, scene);
4251 		return true;
4252 		break;
4253 	case R2_COM_SCANNER_2:
4254 		scene->_sceneMode = 30;
4255 		R2_GLOBALS._player.disableControl();
4256 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4257 		scene->_stripManager.start(527, scene);
4258 		return true;
4259 		break;
4260 	default:
4261 		break;
4262 	}
4263 
4264 	return SceneActor::startAction(action, event);
4265 }
4266 
startAction(CursorType action,Event & event)4267 bool Scene1580::Ignitor::startAction(CursorType action, Event &event) {
4268 	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
4269 
4270 	switch (action) {
4271 	case CURSOR_USE:
4272 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
4273 			R2_INVENTORY.setObjectScene(R2_IGNITOR, 1);
4274 			remove();
4275 			return true;
4276 		}
4277 		break;
4278 	case R2_COM_SCANNER:
4279 		scene->_sceneMode = 30;
4280 		R2_GLOBALS._player.disableControl();
4281 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4282 		scene->_stripManager.start(529, scene);
4283 		return true;
4284 		break;
4285 	case R2_COM_SCANNER_2:
4286 		scene->_sceneMode = 30;
4287 		R2_GLOBALS._player.disableControl();
4288 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4289 		scene->_stripManager.start(527, scene);
4290 		return true;
4291 		break;
4292 	default:
4293 		break;
4294 	}
4295 
4296 	return SceneActor::startAction(action, event);
4297 }
4298 
postInit(SceneObjectList * OwnerList)4299 void Scene1580::postInit(SceneObjectList *OwnerList) {
4300 	loadScene(1580);
4301 	R2_GLOBALS._sceneManager._fadeMode = FADEMODE_GRADUAL;
4302 	SceneExt::postInit();
4303 
4304 	_stripManager.setColors(60, 255);
4305 	_stripManager.setFontNumber(3);
4306 	_stripManager.addSpeaker(&_quinnSpeaker);
4307 	_stripManager.addSpeaker(&_seekerSpeaker);
4308 
4309 	_sceneMode = 0;
4310 
4311 	R2_GLOBALS._player.disableControl();
4312 	if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580) {
4313 		_joystick.postInit();
4314 		_joystick.setup(1580, 1, 4);
4315 		_joystick.setPosition(Common::Point(159, 163));
4316 		_joystick.setDetails(1550, 78, -1, -1, 1, (SceneItem *) NULL);
4317 	} else {
4318 		_joystickPlug.setDetails(Rect(141, 148, 179, 167), 1550, 79, -1, -1, 1, NULL);
4319 	}
4320 
4321 	if (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580) {
4322 		_screen.postInit();
4323 		_screen.setup(1580, 1, 1);
4324 		_screen.setPosition(Common::Point(124, 108));
4325 		_screen.fixPriority(10);
4326 		_screen.setDetails(1550, 13, -1, -1, 1, (SceneItem *) NULL);
4327 
4328 		_screenDisplay.postInit();
4329 		_screenDisplay.setup(1580, 1, 3);
4330 		_screenDisplay.setPosition(Common::Point(124, 96));
4331 		_screenDisplay.fixPriority(20);
4332 	} else if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580) {
4333 		_screen.postInit();
4334 		_screen.setup(1580, 1, 1);
4335 		_screen.setPosition(Common::Point(124, 108));
4336 		_screen.fixPriority(10);
4337 		_screen.setDetails(1550, 14, -1, -1, 1, (SceneItem *) NULL);
4338 
4339 		_screenDisplay.postInit();
4340 		_screenDisplay.setup(1580, 3, 1);
4341 		_screenDisplay.setPosition(Common::Point(124, 109));
4342 		_screenDisplay.fixPriority(20);
4343 
4344 		_sceneMode = 10;
4345 	} else {
4346 		_screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 1, NULL);
4347 	}
4348 
4349 	_storageCompartment.postInit();
4350 	if (R2_GLOBALS.getFlag(58) == 0) {
4351 		_storageCompartment.setup(1580, 5, 1);
4352 		_storageCompartment.setDetails(1550, 80, -1, -1, 1, (SceneItem *) NULL);
4353 	} else {
4354 		_storageCompartment.setup(1580, 5, 6);
4355 	}
4356 
4357 	_storageCompartment.setPosition(Common::Point(216, 108));
4358 	_storageCompartment.fixPriority(100);
4359 
4360 	_hatchButton.postInit();
4361 	_hatchButton.setup(1580, 4, 1);
4362 	_hatchButton.setPosition(Common::Point(291, 147));
4363 	_hatchButton.fixPriority(100);
4364 	_hatchButton.setDetails(1550, 81, -1, -1, 1, (SceneItem *) NULL);
4365 
4366 	if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 1580) {
4367 		_thrusterValve.postInit();
4368 		_thrusterValve.setup(1580, 6, 2);
4369 		_thrusterValve.setPosition(Common::Point(222, 108));
4370 		_thrusterValve.fixPriority(50);
4371 		_thrusterValve.setDetails(1550, 32, -1, 34, 1, (SceneItem *) NULL);
4372 	}
4373 
4374 	if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 1580) {
4375 		_ignitor.postInit();
4376 		_ignitor.setup(1580, 6, 1);
4377 		_ignitor.setPosition(Common::Point(195, 108));
4378 		_ignitor.fixPriority(50);
4379 		_ignitor.setDetails(1550, 38, -1, 34, 1, (SceneItem *) NULL);
4380 	}
4381 
4382 	R2_GLOBALS._player.postInit();
4383 	R2_GLOBALS._player.hide();
4384 	setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
4385 	_background.setDetails(Rect(0, 0, 320, 200), 1550, 50, -1, -1, 1, NULL);
4386 }
4387 
signal()4388 void Scene1580::signal() {
4389 	switch (_sceneMode++) {
4390 	case 10:
4391 		_screenDisplay.animate(ANIM_MODE_5, this);
4392 		break;
4393 	case 11:
4394 		_screenDisplay.setup(1580, 1, 2);
4395 		_screenDisplay.setPosition(Common::Point(124, 94));
4396 
4397 		if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) != 0) {
4398 			_arrActor[0].postInit();
4399 			_arrActor[0].setup(1580, 2, 1);
4400 			_arrActor[0].setPosition(Common::Point(138, 56));
4401 		}
4402 
4403 		if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) != 0) {
4404 			_arrActor[1].postInit();
4405 			_arrActor[1].setup(1580, 2, 2);
4406 			_arrActor[1].setPosition(Common::Point(140, 66));
4407 		}
4408 
4409 		if (R2_INVENTORY.getObjectScene(R2_IGNITOR) != 0) {
4410 			_arrActor[2].postInit();
4411 			_arrActor[2].setup(1580, 2, 3);
4412 			_arrActor[2].setPosition(Common::Point(142, 85));
4413 		}
4414 
4415 		if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) != 0) {
4416 			_arrActor[3].postInit();
4417 			_arrActor[3].setup(1580, 2, 4);
4418 			_arrActor[3].setPosition(Common::Point(142, 92));
4419 		}
4420 
4421 		if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) != 0) {
4422 			_arrActor[4].postInit();
4423 			_arrActor[4].setup(1580, 2, 5);
4424 			_arrActor[4].setPosition(Common::Point(108, 54));
4425 		}
4426 
4427 		if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) != 1580) {
4428 			_arrActor[5].postInit();
4429 			_arrActor[5].setup(1580, 2, 6);
4430 			_arrActor[5].setPosition(Common::Point(110, 64));
4431 		}
4432 
4433 		if (R2_INVENTORY.getObjectScene(R2_BATTERY) != 0) {
4434 			_arrActor[6].postInit();
4435 			_arrActor[6].setup(1580, 2, 7);
4436 			_arrActor[6].setPosition(Common::Point(108, 80));
4437 		}
4438 
4439 		if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) != 0) {
4440 			_arrActor[7].postInit();
4441 			_arrActor[7].setup(1580, 2, 8);
4442 			_arrActor[7].setPosition(Common::Point(111, 92));
4443 		}
4444 
4445 		R2_GLOBALS._player.enableControl(CURSOR_USE);
4446 		R2_GLOBALS._player._canWalk = false;
4447 		break;
4448 	case 20:
4449 		R2_GLOBALS._sceneManager.changeScene(1550);
4450 		break;
4451 	case 31:
4452 		R2_GLOBALS._sceneManager.changeScene(1530);
4453 		break;
4454 	default:
4455 		R2_GLOBALS._player.enableControl(CURSOR_USE);
4456 		R2_GLOBALS._player._canWalk = false;
4457 		break;
4458 	}
4459 }
4460 
4461 /*--------------------------------------------------------------------------
4462  * Scene 1625 - Miranda being questioned
4463  *
4464  *--------------------------------------------------------------------------*/
4465 
startAction(CursorType action,Event & event)4466 bool Scene1625::Wire::startAction(CursorType action, Event &event) {
4467 	if (action != CURSOR_USE)
4468 		return SceneActor::startAction(action, event);
4469 
4470 	Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene;
4471 	R2_GLOBALS._player.disableControl();
4472 
4473 	scene->_sceneMode = 1631;
4474 	scene->_mirandaMouth.postInit();
4475 	scene->setAction(&scene->_sequenceManager, scene, 1631, &scene->_mirandaMouth, &scene->_wire, NULL);
4476 	return true;
4477 }
4478 
Scene1625()4479 Scene1625::Scene1625() {
4480 }
4481 
synchronize(Serializer & s)4482 void Scene1625::synchronize(Serializer &s) {
4483 	SceneExt::synchronize(s);
4484 }
4485 
postInit(SceneObjectList * OwnerList)4486 void Scene1625::postInit(SceneObjectList *OwnerList) {
4487 	loadScene(1625);
4488 	R2_GLOBALS._player._characterIndex = R2_MIRANDA;
4489 	SceneExt::postInit();
4490 
4491 	_stripManager.addSpeaker(&_mirandaSpeaker);
4492 	_stripManager.addSpeaker(&_tealSpeaker);
4493 	_stripManager.addSpeaker(&_soldierSpeaker);
4494 
4495 	R2_GLOBALS._player.postInit();
4496 	R2_GLOBALS._player.hide();
4497 
4498 	_wire.postInit();
4499 	_wire.setup(1626, 2, 1);
4500 	_wire.setPosition(Common::Point(206, 133));
4501 	_wire.setDetails(1625, 0, -1, -1, 1, (SceneItem *) NULL);
4502 
4503 	_wristRestraints.postInit();
4504 	_wristRestraints.setup(1625, 8, 1);
4505 	_wristRestraints.setPosition(Common::Point(190, 131));
4506 	_wristRestraints.setDetails(1625, 6, -1, 2, 1, (SceneItem *) NULL);
4507 
4508 	if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 1625) {
4509 		if (!R2_GLOBALS.getFlag(83)) {
4510 			_glass.postInit();
4511 			_glass.setup(1626, 4, 1);
4512 			_glass.setPosition(Common::Point(96, 166));
4513 			_glass.setDetails(1625, -1, -1, -1, 1, (SceneItem *) NULL);
4514 		}
4515 		R2_GLOBALS._player.enableControl();
4516 		R2_GLOBALS._player._canWalk = false;
4517 	} else {
4518 		_teal.postInit();
4519 		_teal.fixPriority(10);
4520 
4521 		_tealRightArm.postInit();
4522 
4523 		R2_GLOBALS._player.disableControl();
4524 		_sceneMode = 1625;
4525 		setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL);
4526 	}
4527 
4528 	R2_GLOBALS._sound1.play(245);
4529 	_background.setDetails(Rect(0, 0, 320, 200), 1625, 12, -1, -1, 1, NULL);
4530 	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1625;
4531 	R2_GLOBALS._player._characterScene[R2_MIRANDA] = 1625;
4532 }
4533 
remove()4534 void Scene1625::remove() {
4535 	R2_GLOBALS._sound1.fadeOut2(NULL);
4536 	SceneExt::remove();
4537 }
4538 
signal()4539 void Scene1625::signal() {
4540 	switch (_sceneMode) {
4541 	case 10:
4542 		R2_GLOBALS._player.disableControl();
4543 		_glass.postInit();
4544 		_glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
4545 		_sceneMode = 1626;
4546 		setAction(&_sequenceManager, this, 1626, &_tealHead, &_glass, NULL);
4547 		break;
4548 	case 12:
4549 		MessageDialog::show(DONE_MSG, OK_BTN_STRING);
4550 		break;
4551 	case 14:
4552 		_tealHead.postInit();
4553 		_tealHead.setup(1627, 1, 1);
4554 		_tealHead.setPosition(Common::Point(68, 68));
4555 		_sceneMode = 99;
4556 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4557 		_stripManager.start(831, this);
4558 		break;
4559 	case 99:
4560 		R2_GLOBALS._player.disableControl();
4561 		switch (_stripManager._exitMode) {
4562 		case 1:
4563 			_sceneMode = 1627;
4564 			setAction(&_sequenceManager, this, 1627, &_mirandaMouth, &_glass, NULL);
4565 			break;
4566 		case 2:
4567 			_sceneMode = 1629;
4568 			setAction(&_sequenceManager, this, 1629, &_tealHead, &_wristRestraints, NULL);
4569 			break;
4570 		case 4:
4571 			R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150;
4572 			R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3150;
4573 			R2_GLOBALS._player._characterIndex = R2_QUINN;
4574 			R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._characterScene[R2_QUINN]);
4575 			break;
4576 		case 5:
4577 			_sceneMode = 1628;
4578 			_tealHead.remove();
4579 			setAction(&_sequenceManager, this, 1628, &_mirandaMouth, &_glass, NULL);
4580 			break;
4581 		case 6:
4582 			_glass.postInit();
4583 			_glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
4584 			_sceneMode = 1632;
4585 			setAction(&_sequenceManager, this, 1632, &_glass, NULL);
4586 			break;
4587 		case 7:
4588 			_sceneMode = 1633;
4589 			setAction(&_sequenceManager, this, 1633, &_glass, NULL);
4590 			break;
4591 		case 8:
4592 			_sceneMode = 1635;
4593 			setAction(&_sequenceManager, this, 1635, &_mirandaMouth, &_wristRestraints, NULL);
4594 			break;
4595 		case 9:
4596 			_glass.postInit();
4597 			_glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
4598 			_sceneMode = 1634;
4599 			setAction(&_sequenceManager, this, 1634, &_mirandaMouth, &_wristRestraints, NULL);
4600 			break;
4601 		case 3:
4602 		// No break on purpose
4603 		default:
4604 			_sceneMode = 1630;
4605 			_tealHead.remove();
4606 			setAction(&_sequenceManager, this, 1630, &_teal, &_tealRightArm, NULL);
4607 			break;
4608 		}
4609 		//_field412 = _stripManager._field2E8;
4610 		_stripManager._currObj44Id = 0;
4611 		break;
4612 	case 1625:
4613 		_tealHead.postInit();
4614 		_tealHead.setup(1627, 1, 1);
4615 		_tealHead.setPosition(Common::Point(68, 68));
4616 		_sceneMode = 10;
4617 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4618 		_stripManager.start(800, this);
4619 		break;
4620 	case 1626:
4621 		_tealHead.setup(1627, 1, 1);
4622 		_tealHead.setPosition(Common::Point(68, 68));
4623 		_tealHead.show();
4624 
4625 		_mirandaMouth.postInit();
4626 		_mirandaMouth.setup(1627, 3, 1);
4627 		_mirandaMouth.setPosition(Common::Point(196, 65));
4628 
4629 		_sceneMode = 99;
4630 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4631 		_stripManager.start(832, this);
4632 		break;
4633 	case 1627:
4634 		_mirandaMouth.setup(1627, 3, 1);
4635 		_mirandaMouth.setPosition(Common::Point(196, 65));
4636 		_mirandaMouth.show();
4637 
4638 		_sceneMode = 99;
4639 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4640 		_stripManager.start(833, this);
4641 		break;
4642 	case 1628:
4643 		R2_GLOBALS.setFlag(83);
4644 		_tealHead.postInit();
4645 		_tealHead.setup(1627, 1, 1);
4646 		_tealHead.setPosition(Common::Point(68, 68));
4647 
4648 		_mirandaMouth.setup(1627, 3, 1);
4649 		_mirandaMouth.setPosition(Common::Point(196, 65));
4650 		_mirandaMouth.show();
4651 
4652 		_sceneMode = 99;
4653 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4654 		_stripManager.start(834, this);
4655 		break;
4656 	case 1629:
4657 		_tealHead.setup(1627, 1, 1);
4658 		_tealHead.setPosition(Common::Point(68, 68));
4659 		_tealHead.show();
4660 
4661 		_sceneMode = 99;
4662 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4663 		_stripManager.start(805, this);
4664 		break;
4665 	case 1630:
4666 		R2_GLOBALS._player.enableControl(CURSOR_USE);
4667 		R2_GLOBALS._player._canWalk = true;
4668 		break;
4669 	case 1631:
4670 		_mirandaMouth.setup(1627, 3, 1);
4671 		_mirandaMouth.setPosition(Common::Point(196, 65));
4672 		_mirandaMouth.show();
4673 
4674 		_wire.remove();
4675 
4676 		_teal.postInit();
4677 		_teal.fixPriority(10);
4678 
4679 		_tealRightArm.postInit();
4680 
4681 		R2_INVENTORY.setObjectScene(R2_SUPERCONDUCTOR_WIRE, 3);
4682 		_sceneMode = 14;
4683 
4684 		setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL);
4685 		break;
4686 	case 1632:
4687 		_tealHead.setup(1627, 1, 1);
4688 		_tealHead.setPosition(Common::Point(68, 68));
4689 		_tealHead.show();
4690 
4691 		_sceneMode = 99;
4692 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4693 		_stripManager.start(835, this);
4694 		break;
4695 	case 1633:
4696 		_glass.remove();
4697 		_sceneMode = 99;
4698 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4699 		_stripManager.start(818, this);
4700 		break;
4701 	case 1634:
4702 		_sceneMode = 99;
4703 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4704 		_stripManager.start(836, this);
4705 		break;
4706 	case 1635:
4707 		_mirandaMouth.setup(1627, 3, 1);
4708 		_mirandaMouth.setPosition(Common::Point(196, 65));
4709 		_mirandaMouth.show();
4710 
4711 		_sceneMode = 99;
4712 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
4713 		_stripManager.start(818, this);
4714 		break;
4715 	default:
4716 		break;
4717 	}
4718 }
4719 
process(Event & event)4720 void Scene1625::process(Event &event) {
4721 	if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE))
4722 		event.handled = true;
4723 	else
4724 		Scene::process(event);
4725 }
4726 
4727 /*--------------------------------------------------------------------------
4728  * Scene 1700 - Rim
4729  *
4730  *--------------------------------------------------------------------------*/
4731 
Scene1700()4732 Scene1700::Scene1700() {
4733 	_walkFlag = 0;
4734 }
4735 
synchronize(Serializer & s)4736 void Scene1700::synchronize(Serializer &s) {
4737 	SceneExt::synchronize(s);
4738 
4739 	s.syncAsSint16LE(_walkFlag);
4740 }
4741 
startAction(CursorType action,Event & event)4742 bool Scene1700::RimTransport::startAction(CursorType action, Event &event) {
4743 	if (action != CURSOR_USE)
4744 		return SceneActor::startAction(action, event);
4745 
4746 	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
4747 
4748 	R2_GLOBALS._player.disableControl();
4749 	scene->_sceneMode = 4;
4750 
4751 	Common::Point pt(271, 90);
4752 	PlayerMover *mover = new PlayerMover();
4753 	R2_GLOBALS._player.addMover(mover, &pt, scene);
4754 
4755 	return true;
4756 }
4757 
startAction(CursorType action,Event & event)4758 bool Scene1700::Companion::startAction(CursorType action, Event &event) {
4759 	if (action != CURSOR_TALK)
4760 		return SceneActor::startAction(action, event);
4761 
4762 	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
4763 	scene->_sceneMode = 30;
4764 	scene->signal();
4765 
4766 	return true;
4767 }
4768 
changeScene()4769 void Scene1700::NorthExit::changeScene() {
4770 	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
4771 
4772 	R2_GLOBALS._player.disableControl();
4773 	_moving = false;
4774 	scene->_sceneMode = 1;
4775 
4776 	Common::Point pt(R2_GLOBALS._player._position.x, 0);
4777 	NpcMover *mover = new NpcMover();
4778 	R2_GLOBALS._player.addMover(mover, &pt, scene);
4779 }
4780 
changeScene()4781 void Scene1700::SouthExit::changeScene() {
4782 	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
4783 
4784 	R2_GLOBALS._player.disableControl();
4785 	_moving = false;
4786 	scene->_sceneMode = 2;
4787 
4788 	Common::Point pt(R2_GLOBALS._player._position.x, 170);
4789 	NpcMover *mover = new NpcMover();
4790 	R2_GLOBALS._player.addMover(mover, &pt, scene);
4791 }
4792 
changeScene()4793 void Scene1700::WestExit::changeScene() {
4794 	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
4795 
4796 	R2_GLOBALS._player.disableControl();
4797 	_moving = false;
4798 	scene->_sceneMode = 6;
4799 
4800 	Common::Point pt(0, R2_GLOBALS._player._position.y);
4801 	NpcMover *mover = new NpcMover();
4802 	R2_GLOBALS._player.addMover(mover, &pt, scene);
4803 }
4804 
enterArea()4805 void Scene1700::enterArea() {
4806 	Rect tmpRect;
4807 	R2_GLOBALS._walkRegions.load(1700);
4808 
4809 	_slabWest.remove();
4810 	_slabEast.remove();
4811 	_slabShadowWest.remove();
4812 	_slabShadowEast.remove();
4813 	_westPlatform.remove();
4814 	_rimTransportDoor.remove();
4815 	_rimTransport.remove();
4816 
4817 	if (_sceneMode != 40) {
4818 		_ledgeHopper.remove();
4819 		_hatch.remove();
4820 	}
4821 
4822 	// The original had manual code here to redraw the background manually when
4823 	// changing areas within the scene. Which seems to be totally redundant.
4824 
4825 	if (_sceneMode != 40 && R2_GLOBALS._rimLocation == 0) {
4826 		// Crashed ledge hopper
4827 		_ledgeHopper.postInit();
4828 		_ledgeHopper.setup(1701, 1, 1);
4829 		_ledgeHopper.setPosition(Common::Point(220, 137));
4830 		_ledgeHopper.setDetails(1700, 6, -1, -1, 2, (SceneItem *) NULL);
4831 		R2_GLOBALS._walkRegions.disableRegion(2);
4832 		R2_GLOBALS._walkRegions.disableRegion(12);
4833 	}
4834 
4835 	if ((R2_GLOBALS._rimLocation + 2) % 4 == 0) {
4836 		// The slabs forming the bottom of the regular rings the rim transport travels through
4837 		_slabWest.postInit();
4838 		_slabWest.setup(1700, 1, 1);
4839 		_slabWest.setPosition(Common::Point(222, 82));
4840 		_slabWest.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL);
4841 
4842 		_slabShadowWest.postInit();
4843 		_slabShadowWest.setup(1700, 2, 1);
4844 		_slabShadowWest.setPosition(Common::Point(177, 82));
4845 		_slabShadowWest.fixPriority(0);
4846 
4847 		_slabShadowEast.postInit();
4848 		_slabShadowEast.setup(1700, 2, 2);
4849 		_slabShadowEast.setPosition(Common::Point(332, 96));
4850 		_slabShadowEast.fixPriority(0);
4851 
4852 		_slabEast.postInit();
4853 		_slabEast.setup(1700, 1, 2);
4854 		_slabEast.setPosition(Common::Point(424, 84));
4855 
4856 		R2_GLOBALS._walkRegions.disableRegion(11);
4857 	}
4858 
4859 	if ((R2_GLOBALS._rimLocation + 399) % 800 == 0) {
4860 		// Enable west exit to lift
4861 		_westPlatform.postInit();
4862 		_westPlatform.setup(1700, 3, 2);
4863 		_westPlatform.setPosition(Common::Point(51, 141));
4864 		_westPlatform.fixPriority(0);
4865 		_westPlatform.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL);
4866 
4867 		_westExit._enabled = true;
4868 	} else {
4869 		R2_GLOBALS._walkRegions.disableRegion(1);
4870 		_westExit._enabled = false;
4871 	}
4872 
4873 	if (  ((!R2_GLOBALS.getFlag(15)) && ((R2_GLOBALS._rimLocation == 25) || (R2_GLOBALS._rimLocation == -3)))
4874 		 || ((R2_GLOBALS.getFlag(15)) && (R2_GLOBALS._rimLocation == R2_GLOBALS._rimTransportLocation))
4875 		 ) {
4876 		// Rim transport vechile located
4877 		R2_GLOBALS._rimTransportLocation = R2_GLOBALS._rimLocation;
4878 		if (!R2_GLOBALS.getFlag(15))
4879 			_walkFlag = true;
4880 
4881 		_rimTransport.postInit();
4882 		_rimTransport.setup(1700, 3, 1);
4883 		_rimTransport.setPosition(Common::Point(338, 150));
4884 		_rimTransport.setDetails(1700, 9, -1, -1, 2, (SceneItem *) NULL);
4885 		_rimTransport.fixPriority(15);
4886 
4887 		_rimTransportDoor.postInit();
4888 		_rimTransportDoor.setup(1700, 4, 1);
4889 		_rimTransportDoor.setPosition(Common::Point(312, 106));
4890 		_rimTransportDoor.fixPriority(130);
4891 	}
4892 }
4893 
postInit(SceneObjectList * OwnerList)4894 void Scene1700::postInit(SceneObjectList *OwnerList) {
4895 	loadScene(1700);
4896 	SceneExt::postInit();
4897 	if (R2_GLOBALS._sceneManager._previousScene == -1)
4898 		R2_GLOBALS._sceneManager._previousScene = 1530;
4899 
4900 	scalePalette(65, 65, 65);
4901 	_stripManager.addSpeaker(&_quinnSpeaker);
4902 	_stripManager.addSpeaker(&_seekerSpeaker);
4903 
4904 	_northExit.setDetails(Rect(94, 0, 319, 12), EXITCURSOR_N, 1700);
4905 	_southExit.setDetails(Rect(0, 161, 319, 168), EXITCURSOR_S, 1700);
4906 	_westExit.setDetails(Rect(0, 0, 12, 138), EXITCURSOR_W, 1800);
4907 
4908 	R2_GLOBALS._player.postInit();
4909 	R2_GLOBALS._player.setPosition(Common::Point(0, 0));
4910 	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
4911 	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
4912 		R2_GLOBALS._player.setVisage(1501);
4913 		R2_GLOBALS._player._moveDiff = Common::Point(2, 1);
4914 	} else {
4915 		R2_GLOBALS._player.setVisage(1506);
4916 		R2_GLOBALS._player._moveDiff = Common::Point(3, 1);
4917 	}
4918 
4919 	_companion.postInit();
4920 	_companion.animate(ANIM_MODE_1, NULL);
4921 	_companion.setObjectWrapper(new SceneObjectWrapper());
4922 
4923 	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
4924 		_companion.setVisage(1506);
4925 		_companion._moveDiff = Common::Point(3, 1);
4926 		_companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
4927 	} else {
4928 		_companion.setVisage(1501);
4929 		_companion._moveDiff = Common::Point(2, 1);
4930 		_companion.setDetails(9001, 1, -1, -1, 1, (SceneItem *) NULL);
4931 	}
4932 
4933 	R2_GLOBALS._sound1.play(134);
4934 
4935 	_playerShadow.postInit();
4936 	_playerShadow.fixPriority(10);
4937 
4938 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
4939 		_playerShadow.setVisage(1112);
4940 	else
4941 		_playerShadow.setVisage(1111);
4942 
4943 	_playerShadow._effect = EFFECT_SHADOW_MAP;
4944 	_playerShadow._shadowMap = _shadowPaletteMap;
4945 	R2_GLOBALS._player._linkedActor = &_playerShadow;
4946 
4947 	_companionShadow.postInit();
4948 	_companionShadow.fixPriority(10);
4949 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
4950 		_companionShadow.setVisage(1111);
4951 	else
4952 		_companionShadow.setVisage(1112);
4953 
4954 	_companionShadow._effect = EFFECT_SHADOW_MAP;
4955 	_companionShadow._shadowMap = _shadowPaletteMap;
4956 	_companion._linkedActor = &_companionShadow;
4957 
4958 	R2_GLOBALS._sound1.play(134);
4959 
4960 	switch (R2_GLOBALS._sceneManager._previousScene) {
4961 	case 1530:
4962 		R2_GLOBALS._player._characterIndex = R2_QUINN;
4963 		R2_GLOBALS._player.disableControl();
4964 		R2_GLOBALS._player.hide();
4965 		_companion.hide();
4966 
4967 		_hatch.postInit();
4968 		_hatch.hide();
4969 
4970 		_ledgeHopper.postInit();
4971 		_ledgeHopper.setup(1701, 1, 1);
4972 		_ledgeHopper.setPosition(Common::Point(220, 137));
4973 		_ledgeHopper.setDetails(1700, 6, -1, -1, 1, (SceneItem *) NULL);
4974 
4975 		_playerShadow.hide();
4976 		_companionShadow.hide();
4977 		R2_GLOBALS._events.setCursor(CURSOR_WALK);
4978 		_stripManager.start(539, this);
4979 		_sceneMode = 40;
4980 		break;
4981 	case 1750: {
4982 		R2_GLOBALS._player.setPosition(Common::Point(282, 121));
4983 		_companion.setPosition(Common::Point(282, 139));
4984 		_sceneMode = 8;
4985 		Common::Point pt(262, 101);
4986 		NpcMover *mover = new NpcMover();
4987 		R2_GLOBALS._player.addMover(mover, &pt, this);
4988 		Common::Point pt2(262, 119);
4989 		NpcMover *mover2 = new NpcMover();
4990 		_companion.addMover(mover2, &pt2, this);
4991 		}
4992 		break;
4993 	case 1800: {
4994 		R2_GLOBALS._player.disableControl();
4995 		R2_GLOBALS._player.setPosition(Common::Point(0, 86));
4996 		_companion.setPosition(Common::Point(0, 64));
4997 		_sceneMode = 7;
4998 		R2_GLOBALS._player.setObjectWrapper(NULL);
4999 		R2_GLOBALS._player._strip = 1;
5000 		Common::Point pt(64, 86);
5001 		NpcMover *mover = new NpcMover();
5002 		R2_GLOBALS._player.addMover(mover, &pt, this);
5003 		_companion.setObjectWrapper(NULL);
5004 		_companion._strip = 1;
5005 		Common::Point pt2(77, 64);
5006 		NpcMover *mover2 = new NpcMover();
5007 		_companion.addMover(mover2, &pt2, NULL);
5008 		}
5009 		break;
5010 	default:
5011 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5012 			R2_GLOBALS._player.setPosition(Common::Point(109, 160));
5013 			_companion.setPosition(Common::Point(156, 160));
5014 			R2_GLOBALS._walkRegions.disableRegion(15);
5015 		} else {
5016 			R2_GLOBALS._player.setPosition(Common::Point(156, 160));
5017 			_companion.setPosition(Common::Point(109, 160));
5018 			R2_GLOBALS._walkRegions.disableRegion(17);
5019 		}
5020 		_sceneMode = 50;
5021 		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
5022 		break;
5023 	}
5024 	R2_GLOBALS._player._characterScene[R2_QUINN] = 1700;
5025 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1700;
5026 	R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1700;
5027 	R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1700;
5028 
5029 	enterArea();
5030 
5031 	_surface.setDetails(1, 1700, 3, -1, -1);
5032 	_background.setDetails(Rect(0, 0, 480, 200), 1700, 0, -1, -1, 1, NULL);
5033 }
5034 
remove()5035 void Scene1700::remove() {
5036 	R2_GLOBALS._sound1.fadeOut2(NULL);
5037 	SceneExt::remove();
5038 }
5039 
signal()5040 void Scene1700::signal() {
5041 	switch (_sceneMode) {
5042 	case 1: {
5043 		_sceneMode = 3;
5044 		if (R2_GLOBALS._rimLocation < 2400)
5045 			++R2_GLOBALS._rimLocation;
5046 		enterArea();
5047 		R2_GLOBALS._player.setPosition(Common::Point(235 - (((((235 - R2_GLOBALS._player._position.x) * 100) / 103) * 167) / 100), 170));
5048 		Common::Point pt(R2_GLOBALS._player._position.x, 160);
5049 		NpcMover *mover = new NpcMover();
5050 		R2_GLOBALS._player.addMover(mover, &pt, this);
5051 
5052 		if (R2_GLOBALS._player._position.x < 132) {
5053 			_companion.setPosition(Common::Point(156, 170));
5054 			Common::Point pt2(156, 160);
5055 			NpcMover *mover2 = new NpcMover();
5056 			_companion.addMover(mover2, &pt2, NULL);
5057 			R2_GLOBALS._walkRegions.disableRegion(15);
5058 		} else {
5059 			_companion.setPosition(Common::Point(109, 170));
5060 			Common::Point pt3(109, 160);
5061 			NpcMover *mover3 = new NpcMover();
5062 			_companion.addMover(mover3, &pt3, NULL);
5063 			R2_GLOBALS._walkRegions.disableRegion(17);
5064 		}
5065 		}
5066 		break;
5067 	case 2: {
5068 		_sceneMode = 3;
5069 		if (R2_GLOBALS._rimLocation > -2400)
5070 			--R2_GLOBALS._rimLocation;
5071 		enterArea();
5072 		R2_GLOBALS._player.setPosition(Common::Point(235 - (((((235 - R2_GLOBALS._player._position.x) * 100) / 167) * 103) / 100), 0));
5073 		Common::Point pt(R2_GLOBALS._player._position.x, 10);
5074 		NpcMover *mover = new NpcMover();
5075 		R2_GLOBALS._player.addMover(mover, &pt, this);
5076 
5077 		if (R2_GLOBALS._player._position.x >= 171) {
5078 			_companion.setPosition(Common::Point(155, 0));
5079 			Common::Point pt2(155, 10);
5080 			NpcMover *mover2 = new NpcMover();
5081 			_companion.addMover(mover2, &pt2, NULL);
5082 			R2_GLOBALS._walkRegions.disableRegion(15);
5083 		} else {
5084 			_companion.setPosition(Common::Point(188, 0));
5085 			Common::Point pt3(188, 10);
5086 			NpcMover *mover3 = new NpcMover();
5087 			_companion.addMover(mover3, &pt3, NULL);
5088 			R2_GLOBALS._walkRegions.disableRegion(17);
5089 		}
5090 		}
5091 		break;
5092 	case 3:
5093 		if (!_walkFlag) {
5094 			R2_GLOBALS._player.enableControl(CURSOR_WALK);
5095 		} else {
5096 			R2_GLOBALS.setFlag(15);
5097 			_walkFlag = false;
5098 			_sceneMode = 31;
5099 			R2_GLOBALS._events.setCursor(CURSOR_WALK);
5100 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
5101 				_stripManager.start(542, this);
5102 			else
5103 				_stripManager.start(543, this);
5104 		}
5105 		break;
5106 	case 4: {
5107 		_sceneMode = 5;
5108 		Common::Point pt(271, 90);
5109 		PlayerMover *mover = new PlayerMover();
5110 		_companion.addMover(mover, &pt, NULL);
5111 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
5112 			setAction(&_sequenceManager, this, 1700, &R2_GLOBALS._player, &_rimTransportDoor, NULL);
5113 		else
5114 			setAction(&_sequenceManager, this, 1701, &R2_GLOBALS._player, &_rimTransportDoor, NULL);
5115 		}
5116 		break;
5117 	case 5:
5118 		R2_GLOBALS._sceneManager.changeScene(1750);
5119 		break;
5120 	case 6:
5121 		R2_GLOBALS._sceneManager.changeScene(1800);
5122 		break;
5123 	case 7:
5124 		R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
5125 		R2_GLOBALS._player._strip = 1;
5126 		_companion.setObjectWrapper(new SceneObjectWrapper());
5127 		_companion._strip = 1;
5128 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
5129 		R2_GLOBALS._walkRegions.disableRegion(14);
5130 		break;
5131 	case 8:
5132 		R2_GLOBALS._player._strip = 2;
5133 		_companion._strip = 1;
5134 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
5135 		R2_GLOBALS._walkRegions.disableRegion(12);
5136 		break;
5137 	case 30:
5138 		_sceneMode = 31;
5139 		R2_GLOBALS._player.disableControl();
5140 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
5141 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
5142 			_stripManager.start(540, this);
5143 		else
5144 			_stripManager.start(541, this);
5145 		break;
5146 	case 31:
5147 		R2_GLOBALS._player.enableControl(CURSOR_TALK);
5148 		break;
5149 	case 40:
5150 		R2_GLOBALS._player.disableControl();
5151 		_sceneMode = 1704;
5152 		setAction(&_sequenceManager, this, 1704, &R2_GLOBALS._player, &_companion,
5153 			&_hatch, &_ledgeHopper, &_playerShadow, &_companionShadow, NULL);
5154 		break;
5155 	case 50:
5156 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
5157 			R2_GLOBALS._walkRegions.disableRegion(15);
5158 		else
5159 			R2_GLOBALS._walkRegions.disableRegion(17);
5160 
5161 		R2_GLOBALS._player.enableControl();
5162 		break;
5163 	case 1704:
5164 		R2_GLOBALS._sound1.play(134);
5165 		R2_GLOBALS._walkRegions.disableRegion(15);
5166 		R2_GLOBALS._walkRegions.disableRegion(2);
5167 		R2_GLOBALS._walkRegions.disableRegion(12);
5168 		R2_GLOBALS._player.fixPriority(-1);
5169 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
5170 		break;
5171 	default:
5172 		R2_GLOBALS._player.enableControl();
5173 		break;
5174 	}
5175 }
5176 
5177 /*--------------------------------------------------------------------------
5178  * Scene 1750 - Maintaiance Vechile
5179  *
5180  *--------------------------------------------------------------------------*/
5181 
Button()5182 Scene1750::Button::Button() {
5183 	_buttonId = 0;
5184 }
5185 
synchronize(Serializer & s)5186 void Scene1750::Button::synchronize(Serializer &s) {
5187 	SceneActor::synchronize(s);
5188 
5189 	s.syncAsSint16LE(_buttonId);
5190 }
5191 
startAction(CursorType action,Event & event)5192 bool Scene1750::Button::startAction(CursorType action, Event &event) {
5193 	if (action != CURSOR_USE)
5194 		return SceneActor::startAction(action, event);
5195 
5196 	Scene1750 *scene = (Scene1750 *)R2_GLOBALS._sceneManager._scene;
5197 
5198 	switch (_buttonId) {
5199 	case 1:
5200 		// Forward button
5201 		show();
5202 		scene->_backwardButton.hide();
5203 		if (scene->_speed < 0)
5204 			scene->_speed = -scene->_speed;
5205 		scene->_direction = 1;
5206 		break;
5207 	case 2:
5208 		// Backwards button
5209 		show();
5210 		scene->_forwardButton.hide();
5211 		if (scene->_speed > 0)
5212 			scene->_speed = -scene->_speed;
5213 		scene->_direction = -1;
5214 		break;
5215 	case 3:
5216 		// Exit button
5217 		if (scene->_rotation->_idxChange == 0) {
5218 			show();
5219 			R2_GLOBALS._sceneManager.changeScene(1700);
5220 		} else {
5221 			scene->_speed = 0;
5222 			scene->_speedSlider._moveRate = 20;
5223 			scene->_forwardButton._moveDiff.y = 1;
5224 			Common::Point pt(286, 143);
5225 			NpcMover *mover = new NpcMover();
5226 			scene->_speedSlider.addMover(mover, &pt, NULL);
5227 		}
5228 	default:
5229 		break;
5230 	}
5231 
5232 	return true;
5233 }
5234 
5235 /*------------------------------------------------------------------------*/
5236 
SpeedSlider()5237 Scene1750::SpeedSlider::SpeedSlider() {
5238 	_incrAmount = 0;
5239 	_xp = 0;
5240 	_ys = 0;
5241 	_height = 0;
5242 	_thumbHeight = 0;
5243 	_mouseDown = false;
5244 }
5245 
synchronize(Serializer & s)5246 void Scene1750::SpeedSlider::synchronize(Serializer &s) {
5247 	SceneActor::synchronize(s);
5248 
5249 	s.syncAsSint16LE(_incrAmount);
5250 	s.syncAsSint16LE(_xp);
5251 	s.syncAsSint16LE(_ys);
5252 	s.syncAsSint16LE(_height);
5253 	s.syncAsSint16LE(_thumbHeight);
5254 	s.syncAsSint16LE(_mouseDown);
5255 }
5256 
setupSlider(int incrAmount,int xp,int ys,int height,int thumbHeight)5257 void Scene1750::SpeedSlider::setupSlider(int incrAmount, int xp, int ys, int height, int thumbHeight) {
5258 	_mouseDown = false;
5259 	_incrAmount = incrAmount;
5260 	_xp = xp;
5261 	_ys = ys;
5262 	_height = height;
5263 	_thumbHeight = thumbHeight;
5264 
5265 	postInit();
5266 	setup(1750, 1, 1);
5267 	fixPriority(255);
5268 	setPosition(Common::Point(_xp, _ys + ((_height * (incrAmount - 1)) / (_thumbHeight - 1))));
5269 }
5270 
calculateSlider()5271 void Scene1750::SpeedSlider::calculateSlider() {
5272 	Scene1750 *scene = (Scene1750 *)R2_GLOBALS._sceneManager._scene;
5273 
5274 	int tmpVar = (_height / (_thumbHeight - 1)) / 2;
5275 	int tmpVar2 = ((_position.y - _ys + tmpVar) * _thumbHeight) / (_height + 2 * tmpVar);
5276 
5277 	setPosition(Common::Point(_xp, _ys + ((_height * tmpVar2) / (_thumbHeight - 1))));
5278 	scene->_speed = scene->_direction * tmpVar2;
5279 }
5280 
process(Event & event)5281 void Scene1750::SpeedSlider::process(Event &event) {
5282 	if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) &&
5283 			(_bounds.contains(event.mousePos))) {
5284 		_mouseDown = true;
5285 		event.eventType = EVENT_NONE;
5286 	}
5287 
5288 	if ((event.eventType == EVENT_BUTTON_UP) && _mouseDown) {
5289 		_mouseDown = false;
5290 		event.handled = true;
5291 		addMover(NULL);
5292 		calculateSlider();
5293 	}
5294 
5295 	if (_mouseDown) {
5296 		event.handled = true;
5297 		if (event.mousePos.y >= _ys) {
5298 			if (_ys + _height >= event.mousePos.y)
5299 				setPosition(Common::Point(_xp, event.mousePos.y));
5300 			else
5301 				setPosition(Common::Point(_xp, _ys + _height));
5302 		} else {
5303 			setPosition(Common::Point(_xp, _ys));
5304 		}
5305 	}
5306 }
5307 
startAction(CursorType action,Event & event)5308 bool Scene1750::SpeedSlider::startAction(CursorType action, Event &event) {
5309 	if (action == CURSOR_USE)
5310 		return SceneActor::startAction(action, event);
5311 
5312 	return false;
5313 }
5314 
5315 /*------------------------------------------------------------------------*/
5316 
Scene1750()5317 Scene1750::Scene1750() {
5318 	_direction = 0;
5319 	_speedCurrent = 0;
5320 	_speed = 0;
5321 	_speedDelta = 0;
5322 	_rotationSegment = 0;
5323 	_rotationSegCurrent = 0;
5324 	_newRotation = 0;
5325 
5326 	_rotation = nullptr;
5327 }
5328 
synchronize(Serializer & s)5329 void Scene1750::synchronize(Serializer &s) {
5330 	SceneExt::synchronize(s);
5331 	SYNC_POINTER(_rotation);
5332 
5333 	s.syncAsSint16LE(_direction);
5334 	s.syncAsSint16LE(_speedCurrent);
5335 	s.syncAsSint16LE(_speed);
5336 	s.syncAsSint16LE(_speedDelta);
5337 	s.syncAsSint16LE(_rotationSegment);
5338 	s.syncAsSint16LE(_rotationSegCurrent);
5339 	s.syncAsSint16LE(_newRotation);
5340 }
5341 
postInit(SceneObjectList * OwnerList)5342 void Scene1750::postInit(SceneObjectList *OwnerList) {
5343 	loadScene(1750);
5344 	R2_GLOBALS._sound1.play(115);
5345 	R2_GLOBALS._uiElements._active = false;
5346 
5347 	SceneExt::postInit();
5348 	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
5349 
5350 	R2_GLOBALS._player._characterScene[R2_QUINN] = 1750;
5351 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1750;
5352 	R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1750;
5353 	R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1750;
5354 
5355 	_rotation = R2_GLOBALS._scenePalette.addRotation(224, 254, 1);
5356 	_rotation->setDelay(0);
5357 	_rotation->_idxChange = 0;
5358 	_rotation->_countdown = 2;
5359 
5360 	switch ((R2_GLOBALS._rimLocation + 2) % 4) {
5361 	case 0:
5362 		_rotation->_currIndex = 247;
5363 		break;
5364 	case 1:
5365 		_rotation->_currIndex = 235;
5366 		break;
5367 	case 2:
5368 		_rotation->_currIndex = 239;
5369 		break;
5370 	case 3:
5371 		_rotation->_currIndex = 243;
5372 		break;
5373 	default:
5374 		break;
5375 	}
5376 
5377 	byte tmpPal[768];
5378 
5379 	for (int i = 224; i < 255; i++) {
5380 		int tmpIndex = _rotation->_currIndex - 224;
5381 		if (tmpIndex > 254)
5382 			tmpIndex -= 31;
5383 		tmpPal[3 * i] = R2_GLOBALS._scenePalette._palette[3 * tmpIndex];
5384 		tmpPal[(3 * i) + 1] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 1];
5385 		tmpPal[(3 * i) + 2] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 2];
5386 	}
5387 
5388 	for (int i = 224; i < 255; i++) {
5389 		R2_GLOBALS._scenePalette._palette[3 * i] = tmpPal[3 * i];
5390 		R2_GLOBALS._scenePalette._palette[(3 * i) + 1] = tmpPal[(3 * i) + 1];
5391 		R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2];
5392 	}
5393 
5394 	R2_GLOBALS._player.postInit();
5395 	R2_GLOBALS._player.hide();
5396 	R2_GLOBALS._player.enableControl();
5397 
5398 	_radarSweep.postInit();
5399 	_radarSweep.setup(1750, 3, 1);
5400 	_radarSweep.setPosition(Common::Point(49, 185));
5401 	_radarSweep.fixPriority(7);
5402 	_radarSweep.setDetails(1750, 30, -1, -1, 1, (SceneItem *) NULL);
5403 
5404 	_scannerIcon.postInit();
5405 	_scannerIcon.setup(1750, 2, 1);
5406 	_scannerIcon.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) + ((R2_GLOBALS._rimLocation % 800) * 4) - 1440));
5407 	_scannerIcon.fixPriority(8);
5408 
5409 	_redLights.postInit();
5410 	_redLights.setup(1750, 1, 4);
5411 
5412 	int tmpVar = ABS(_scannerIcon._position.y - 158) / 100;
5413 
5414 	if (tmpVar >= 8)
5415 		_redLights.hide();
5416 	else if (_scannerIcon._position.y <= 158)
5417 		_redLights.setPosition(Common::Point(137, (tmpVar * 7) + 122));
5418 	else
5419 		_redLights.setPosition(Common::Point(148, (tmpVar * 7) + 122));
5420 
5421 	_speedSlider.setupSlider(1, 286, 143, 41, 15);
5422 	_speedSlider.setDetails(1750, 24, 1, -1, 1, (SceneItem *) NULL);
5423 
5424 	_forwardButton.postInit();
5425 	_forwardButton._buttonId = 1;
5426 	_forwardButton.setup(1750, 1, 2);
5427 	_forwardButton.setPosition(Common::Point(192, 140));
5428 	_forwardButton.setDetails(1750, 18, 1, -1, 1, (SceneItem *) NULL);
5429 
5430 	_backwardButton.postInit();
5431 	_backwardButton._buttonId = 2;
5432 	_backwardButton.setup(1750, 1, 3);
5433 	_backwardButton.setPosition(Common::Point(192, 163));
5434 	_backwardButton.setDetails(1750, 18, 1, -1, 1, (SceneItem *) NULL);
5435 	_backwardButton.hide();
5436 
5437 	_exitButton.postInit();
5438 	_exitButton._buttonId = 3;
5439 	_exitButton.setup(1750, 1, 5);
5440 	_exitButton.setPosition(Common::Point(230, 183));
5441 	_exitButton.setDetails(1750, 27, 1, -1, 1, (SceneItem *) NULL);
5442 
5443 	_direction = 1;		// Forward by default
5444 	_speedDelta = 0;
5445 	_speedCurrent = 0;
5446 	_speed = 0;
5447 	_rotationSegment = ((_rotation->_currIndex - 218) / 4) % 4;
5448 
5449 	_redLightsDescr.setDetails(Rect(129, 112, 155, 175), 1750, 21, -1, -1, 1, NULL);
5450 	_greenLights.setDetails(Rect(93, 122, 126, 172), 1750, 15, -1, -1, 1, NULL);
5451 	_frontView.setDetails(Rect(3, 3, 157, 99), 1750, 9, -1, -1, 1, NULL);
5452 	_rearView.setDetails(Rect(162, 3, 316, 99), 1750, 12, -1, -1, 1, NULL);
5453 	_background.setDetails(Rect(0, 0, 320, 200), 1750, 6, 1, -1, 1, NULL);
5454 }
5455 
remove()5456 void Scene1750::remove() {
5457 	if (R2_GLOBALS._rimLocation == 2400)
5458 		R2_GLOBALS._rimLocation = 2399;
5459 
5460 	if (R2_GLOBALS._rimLocation == -2400)
5461 		R2_GLOBALS._rimLocation = -2399;
5462 
5463 	R2_GLOBALS._rimTransportLocation = R2_GLOBALS._rimLocation;
5464 
5465 	SceneExt::remove();
5466 	R2_GLOBALS._sound1.fadeOut2(NULL);
5467 	R2_GLOBALS._uiElements._active = true;
5468 }
5469 
signal()5470 void Scene1750::signal() {
5471 	R2_GLOBALS._player.enableControl();
5472 }
5473 
process(Event & event)5474 void Scene1750::process(Event &event) {
5475 	Scene::process(event);
5476 	if (!event.handled)
5477 		_speedSlider.process(event);
5478 }
5479 
dispatch()5480 void Scene1750::dispatch() {
5481 	if (_rotation) {
5482 		if (!_speedDelta && (_speed != _speedCurrent)) {
5483 			if (_speedCurrent >= _speed)
5484 				--_speedCurrent;
5485 			else
5486 				++_speedCurrent;
5487 
5488 			_speedDelta = 21 - ABS(_speedCurrent);
5489 		}
5490 
5491 		if (_speedDelta == 1) {
5492 			if (_speedCurrent == 0) {
5493 				_radarSweep.show();
5494 				_rotation->_idxChange = 0;
5495 			} else {
5496 				if (_rotation->_idxChange == 0)
5497 					_radarSweep.hide();
5498 
5499 				if (_speedCurrent < -12) {
5500 					_rotation->setDelay(15 - ABS(_speedCurrent));
5501 					_rotation->_idxChange = -2;
5502 				} else if (_speedCurrent < 0) {
5503 					_rotation->setDelay(10 - ABS(_speedCurrent));
5504 					_rotation->_idxChange = -1;
5505 				} else if (_speedCurrent < 11) {
5506 					_rotation->setDelay(10 - _speedCurrent);
5507 					_rotation->_idxChange = 1;
5508 				} else {
5509 					_rotation->setDelay(15 - _speedCurrent);
5510 					_rotation->_idxChange = 2;
5511 				}
5512 			}
5513 		}
5514 
5515 		if (_speedDelta)
5516 			--_speedDelta;
5517 
5518 		_rotationSegCurrent = _rotationSegment;
5519 		_rotationSegment = ((_rotation->_currIndex - 218) / 4) % 4;
5520 
5521 		if ((_rotationSegCurrent + 1) == _rotationSegment || (_rotationSegCurrent - 3)  == _rotationSegment) {
5522 			if (R2_GLOBALS._rimLocation < 2400) {
5523 				++R2_GLOBALS._rimLocation;
5524 			}
5525 		}
5526 
5527 		if ((_rotationSegCurrent - 1) == _rotationSegment || (_rotationSegCurrent + 3) == _rotationSegment) {
5528 			if (R2_GLOBALS._rimLocation > -2400) {
5529 				--R2_GLOBALS._rimLocation;
5530 			}
5531 		}
5532 
5533 		if (_rotation->_currIndex != _newRotation) {
5534 			// Handle setting the position of the lift icon in the scanner display
5535 			_newRotation = _rotation->_currIndex;
5536 			_scannerIcon.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) +
5537 				((R2_GLOBALS._rimLocation % 800) * 4) - 1440));
5538 		}
5539 	}
5540 
5541 	int v = ABS(_scannerIcon._position.y - 158) / 100;
5542 	if (v < 8) {
5543 		// Show how close the user is to the lift on the second column of lights
5544 		_redLights.show();
5545 		_redLights.setPosition(Common::Point((_scannerIcon._position.y <= 158) ? 137 : 148,
5546 			v * 7 + 122));
5547 	} else {
5548 		_redLights.hide();
5549 	}
5550 }
5551 
5552 /*--------------------------------------------------------------------------
5553  * Scene 1800 - Rim Lift Exterior
5554  *
5555  *--------------------------------------------------------------------------*/
5556 
Scene1800()5557 Scene1800::Scene1800() {
5558 	_locationMode = 0;
5559 }
5560 
synchronize(Serializer & s)5561 void Scene1800::synchronize(Serializer &s) {
5562 	SceneExt::synchronize(s);
5563 
5564 	s.syncAsSint16LE(_locationMode);
5565 }
5566 
startAction(CursorType action,Event & event)5567 bool Scene1800::Background::startAction(CursorType action, Event &event) {
5568 	if ((action != R2_COM_SCANNER) && (action != R2_COM_SCANNER_2))
5569 		return false;
5570 
5571 	Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
5572 
5573 	R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
5574 
5575 	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5576 		if (R2_GLOBALS._rimLocation == 1201) {
5577 			scene->_stripManager.start(548, this);
5578 		} else if (R2_GLOBALS.getFlag(66)) {
5579 			return false;
5580 		} else {
5581 			scene->_stripManager.start(546, this);
5582 		}
5583 	} else {
5584 		if (R2_GLOBALS._rimLocation == 1201) {
5585 			scene->_stripManager.start(549, this);
5586 		} else if (R2_GLOBALS.getFlag(66)) {
5587 			return false;
5588 		} else {
5589 			scene->_stripManager.start(547, this);
5590 		}
5591 	}
5592 
5593 	R2_GLOBALS.setFlag(66);
5594 	return true;
5595 }
5596 
startAction(CursorType action,Event & event)5597 bool Scene1800::Lever::startAction(CursorType action, Event &event) {
5598 	if (action != CURSOR_USE)
5599 		return SceneActor::startAction(action, event);
5600 
5601 	if (!R2_GLOBALS.getFlag(14))
5602 		return false;
5603 
5604 	if (R2_GLOBALS._player._characterIndex != R2_QUINN)
5605 		return SceneActor::startAction(action, event);
5606 
5607 	Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
5608 	R2_GLOBALS._player.disableControl();
5609 
5610 	if (_frame == 1) {
5611 		R2_GLOBALS.setFlag(64);
5612 		scene->_sceneMode = 1810;
5613 		scene->setAction(&scene->_sequenceManager, scene, 1810, &R2_GLOBALS._player, &scene->_lever, &scene->_leftStaircase, &scene->_rightStaircase, NULL);
5614 	} else {
5615 		R2_GLOBALS.clearFlag(64);
5616 		scene->_sceneMode = 1811;
5617 		scene->setAction(&scene->_sequenceManager, scene, 1811, &R2_GLOBALS._player, &scene->_lever, &scene->_leftStaircase, &scene->_rightStaircase, NULL);
5618 	}
5619 	return true;
5620 }
5621 
startAction(CursorType action,Event & event)5622 bool Scene1800::Doors::startAction(CursorType action, Event &event) {
5623 	if (action != CURSOR_USE)
5624 		return SceneActor::startAction(action, event);
5625 
5626 	Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
5627 
5628 	if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
5629 		// Seeker trying to force open the door
5630 		R2_GLOBALS._player.disableControl();
5631 		if (scene->_locationMode >= 2) {
5632 			if (R2_GLOBALS.getFlag(14)) {
5633 				// Allow door to close
5634 				scene->_sceneMode = 1809;
5635 				scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL);
5636 				R2_GLOBALS.clearFlag(14);
5637 			} else {
5638 				// Force open door
5639 				scene->_sceneMode = 1808;
5640 				scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_doors, NULL);
5641 				R2_GLOBALS.setFlag(14);
5642 			}
5643 		} else {
5644 			// Seeker failing to force open doors
5645 			scene->_sceneMode = 1813;
5646 			// Original was using 1813 in setAction too, but it somewhat broken.
5647 			// Seeker goes 2 pixels to high, hiding behind the door
5648 			scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_doors, NULL);
5649 		}
5650 	} else if (R2_GLOBALS.getFlag(14)) {
5651 		return SceneActor::startAction(action, event);
5652 	} else {
5653 		// Quinn trying to force open doors
5654 		R2_GLOBALS._player.disableControl();
5655 		scene->_sceneMode = 1812;
5656 		scene->setAction(&scene->_sequenceManager, scene, 1812, &R2_GLOBALS._player, NULL);
5657 	}
5658 
5659 	return true;
5660 }
5661 
startAction(CursorType action,Event & event)5662 bool Scene1800::PassengerDoor::startAction(CursorType action, Event &event) {
5663 	if (action != CURSOR_USE)
5664 		return SceneActor::startAction(action, event);
5665 
5666 	Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
5667 
5668 	if (_position.x < 160) {
5669 		if (scene->_leftStaircase._frame == 1) {
5670 			return SceneActor::startAction(action, event);
5671 		} else {
5672 			R2_GLOBALS.setFlag(29);
5673 			R2_GLOBALS._player.disableControl();
5674 			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5675 				if (R2_GLOBALS.getFlag(14)) {
5676 					scene->_sceneMode = 1;
5677 					scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL);
5678 					R2_GLOBALS.clearFlag(14);
5679 				} else {
5680 					scene->_sceneMode = 1804;
5681 					scene->setAction(&scene->_sequenceManager, scene, 1804, &R2_GLOBALS._player, &scene->_companion, &scene->_leftDoor, NULL);
5682 				}
5683 			} else {
5684 				if (R2_GLOBALS.getFlag(14)) {
5685 					scene->_sceneMode = 1;
5686 					scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_doors, NULL);
5687 					R2_GLOBALS.clearFlag(14);
5688 				} else {
5689 					scene->_sceneMode = 1805;
5690 					scene->setAction(&scene->_sequenceManager, scene, 1805, &R2_GLOBALS._player, &scene->_companion, &scene->_leftDoor, NULL);
5691 				}
5692 			}
5693 		}
5694 	} else if (scene->_leftStaircase._frame == 1) {
5695 		return SceneActor::startAction(action, event);
5696 	} else {
5697 		R2_GLOBALS.clearFlag(29);
5698 		R2_GLOBALS._player.disableControl();
5699 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5700 			if (R2_GLOBALS.getFlag(14)) {
5701 				scene->_sceneMode = 2;
5702 				scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL);
5703 				R2_GLOBALS.clearFlag(14);
5704 			} else {
5705 				scene->_sceneMode = 1806;
5706 				scene->setAction(&scene->_sequenceManager, scene, 1806, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL);
5707 			}
5708 		} else {
5709 			if (R2_GLOBALS.getFlag(14)) {
5710 				scene->_sceneMode = 2;
5711 				scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL);
5712 				R2_GLOBALS.clearFlag(14);
5713 			} else {
5714 				scene->_sceneMode = 1807;
5715 				scene->setAction(&scene->_sequenceManager, scene, 1807, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL);
5716 			}
5717 		}
5718 	}
5719 
5720 	return true;
5721 }
5722 
changeScene()5723 void Scene1800::SouthExit::changeScene() {
5724 	Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
5725 
5726 	_enabled = false;
5727 	R2_GLOBALS._events.setCursor(CURSOR_WALK);
5728 	R2_GLOBALS._player.disableControl();
5729 	if (R2_GLOBALS.getFlag(14)) {
5730 		scene->_sceneMode = 3;
5731 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
5732 			scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL);
5733 		else
5734 			scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL);
5735 		R2_GLOBALS.clearFlag(14);
5736 	} else {
5737 		scene->_sceneMode = 1802;
5738 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
5739 			scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_companion, NULL);
5740 		else
5741 			scene->setAction(&scene->_sequenceManager, scene, 1803, &R2_GLOBALS._player, &scene->_companion, NULL);
5742 	}
5743 }
5744 
postInit(SceneObjectList * OwnerList)5745 void Scene1800::postInit(SceneObjectList *OwnerList) {
5746 	loadScene(1800);
5747 	SceneExt::postInit();
5748 	R2_GLOBALS._sound1.play(116);
5749 	_stripManager.addSpeaker(&_quinnSpeaker);
5750 	_stripManager.addSpeaker(&_seekerSpeaker);
5751 
5752 	if (R2_GLOBALS._sceneManager._previousScene == -1)
5753 		R2_GLOBALS._rimLocation = 1201;
5754 
5755 	// Set the mode based on whether this is the "correct" lift or not
5756 	if (R2_GLOBALS._rimLocation == 1201)
5757 		_locationMode = 2;
5758 	else
5759 		_locationMode = 0;
5760 
5761 	scalePalette(65, 65, 65);
5762 	_southExit.setDetails(Rect(0, 160, 319, 168), EXITCURSOR_S, 1800);
5763 	_background.setDetails(Rect(0, 0, 320, 200), -1, -1, -1, -1, 1, NULL);
5764 
5765 	_lever.postInit();
5766 	_lever.setup(1801, 4, 1);
5767 	_lever.setPosition(Common::Point(170, 124));
5768 	_lever.setDetails(1800, 13, 14, 15, 1, (SceneItem *) NULL);
5769 
5770 	_doors.postInit();
5771 	_doors.setup(1801, 3, 1);
5772 	_doors.setPosition(Common::Point(160, 139));
5773 	_doors.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL);
5774 
5775 	_leftDoor.postInit();
5776 	_leftDoor.setup(1800, 1, 1);
5777 	_leftDoor.setPosition(Common::Point(110, 78));
5778 	_leftDoor.fixPriority(135);
5779 	_leftDoor.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL);
5780 
5781 	_rightDoor.postInit();
5782 	_rightDoor.setup(1800, 2, 1);
5783 	_rightDoor.setPosition(Common::Point(209, 78));
5784 	_rightDoor.fixPriority(135);
5785 	_rightDoor.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL);
5786 
5787 	_leftStaircase.postInit();
5788 	if ((_locationMode != 1) && (_locationMode != 3) && (!R2_GLOBALS.getFlag(64)))
5789 		_leftStaircase.setup(1801, 2, 1);
5790 	else
5791 		_leftStaircase.setup(1801, 2, 10);
5792 	_leftStaircase.setPosition(Common::Point(76, 142));
5793 	_leftStaircase.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL);
5794 
5795 	_rightStaircase.postInit();
5796 	if ((_locationMode != 1) && (_locationMode != 3) && (!R2_GLOBALS.getFlag(64)))
5797 		_rightStaircase.setup(1801, 1, 1);
5798 	else
5799 		_rightStaircase.setup(1801, 1, 10);
5800 	_rightStaircase.setPosition(Common::Point(243, 142));
5801 	_rightStaircase.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL);
5802 
5803 	R2_GLOBALS._player.postInit();
5804 	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
5805 	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5806 		// Standard Quinn setup
5807 		R2_GLOBALS._player.setVisage(1503);
5808 		R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
5809 	} else {
5810 		// Seeker setup dependent on whether he's holding the doors or not
5811 		if (R2_GLOBALS.getFlag(14)) {
5812 			R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
5813 			R2_GLOBALS._player.setObjectWrapper(NULL);
5814 			R2_GLOBALS._player.setup(1801, 5, 12);
5815 			R2_GLOBALS._player.setPosition(Common::Point(160, 139));
5816 			R2_GLOBALS._walkRegions.disableRegion(9);
5817 			_doors.hide();
5818 		} else {
5819 			R2_GLOBALS._player.setVisage(1507);
5820 		}
5821 		R2_GLOBALS._player._moveDiff = Common::Point(4, 2);
5822 	}
5823 
5824 	_companion.postInit();
5825 	_companion.animate(ANIM_MODE_1, NULL);
5826 	_companion.setObjectWrapper(new SceneObjectWrapper());
5827 	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5828 		if (R2_GLOBALS.getFlag(14)) {
5829 			_companion.animate(ANIM_MODE_NONE, NULL);
5830 			_companion.setObjectWrapper(NULL);
5831 			_companion.setup(1801, 5, 12);
5832 
5833 			R2_GLOBALS._walkRegions.disableRegion(9);
5834 			_doors.hide();
5835 		} else {
5836 			_companion.setup(1507, 1, 1);
5837 			_companion.setPosition(Common::Point(180, 160));
5838 		}
5839 		_companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
5840 		_companion._moveDiff = Common::Point(4, 2);
5841 	} else {
5842 		_companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
5843 		_companion.setVisage(1503);
5844 		_companion._moveDiff = Common::Point(2, 2);
5845 	}
5846 
5847 	if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) {
5848 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5849 			R2_GLOBALS._player.setPosition(Common::Point(114, 150));
5850 			R2_GLOBALS._player.setStrip(5);
5851 			if (R2_GLOBALS.getFlag(14)) {
5852 				_companion.setPosition(Common::Point(160, 139));
5853 				R2_GLOBALS._walkRegions.disableRegion(8);
5854 			} else {
5855 				_companion.setPosition(Common::Point(209, 150));
5856 				_companion.setStrip(6);
5857 				R2_GLOBALS._walkRegions.disableRegion(8);
5858 			}
5859 		} else {
5860 			if (R2_GLOBALS.getFlag(14)) {
5861 				R2_GLOBALS._player.setup(1801, 5, 12);
5862 				R2_GLOBALS._player.setPosition(Common::Point(160, 139));
5863 			} else {
5864 				R2_GLOBALS._player.setPosition(Common::Point(209, 150));
5865 				R2_GLOBALS._player.setStrip(6);
5866 			}
5867 			_companion.setPosition(Common::Point(114, 150));
5868 			_companion.setStrip(5);
5869 			R2_GLOBALS._walkRegions.disableRegion(10);
5870 			R2_GLOBALS._walkRegions.disableRegion(11);
5871 		}
5872 	} else if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5873 		R2_GLOBALS._player.setPosition(Common::Point(140, 160));
5874 		_companion.setPosition(Common::Point(180, 160));
5875 	} else {
5876 		R2_GLOBALS._player.setPosition(Common::Point(180, 160));
5877 		_companion.setPosition(Common::Point(140, 160));
5878 	}
5879 
5880 	_playerShadow.postInit();
5881 	_playerShadow.fixPriority(10);
5882 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
5883 		_playerShadow.setVisage(1111);
5884 	else
5885 		_playerShadow.setVisage(1110);
5886 
5887 	_playerShadow._effect = EFFECT_SHADOW_MAP;
5888 	_playerShadow._shadowMap = _shadowPaletteMap;
5889 
5890 	R2_GLOBALS._player._linkedActor = &_playerShadow;
5891 
5892 	_companionShadow.postInit();
5893 	_companionShadow.fixPriority(10);
5894 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
5895 		_companionShadow.setVisage(1110);
5896 	else
5897 		_companionShadow.setVisage(1111);
5898 
5899 	_companionShadow._effect = EFFECT_SHADOW_MAP;
5900 	_companionShadow._shadowMap = _shadowPaletteMap;
5901 
5902 	_companion._linkedActor = &_companionShadow;
5903 
5904 	R2_GLOBALS._player._characterScene[R2_QUINN] = 1800;
5905 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1800;
5906 
5907 	_elevatorContents.setDetails(Rect(128, 95, 190, 135), 1800, 10, -1, -1, 1, NULL);
5908 	_elevator.setDetails(Rect(95, 3, 223, 135), 1800, 0, -1, -1, 1, NULL);
5909 
5910 	// Original was calling _item3.setDetails(Rect(1800, 11, 24, 23), 25, -1, -1, -1, 1, NULL);
5911 	// This is *wrong*. The following statement is a wild guess based on good common sense
5912 	_surface.setDetails(11, 1800, 23, 24, 25);
5913 	_secBackground.setDetails(Rect(0, 0, 320, 200), 1800, 17, -1, 19, 1, NULL);
5914 
5915 	R2_GLOBALS._player.disableControl();
5916 	if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) {
5917 		if ((R2_GLOBALS.getFlag(14)) && (R2_GLOBALS._player._characterIndex == R2_SEEKER)) {
5918 			R2_GLOBALS._player.enableControl(CURSOR_USE);
5919 			R2_GLOBALS._player._canWalk = false;
5920 		} else {
5921 			R2_GLOBALS._player.enableControl(CURSOR_WALK);
5922 		}
5923 	} else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) {
5924 		if (R2_GLOBALS.getFlag(29)) {
5925 			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5926 				_sceneMode = 1814;
5927 				setAction(&_sequenceManager, this, 1814, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
5928 			} else {
5929 				_sceneMode = 1815;
5930 				setAction(&_sequenceManager, this, 1815, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
5931 			}
5932 		} else if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5933 			_sceneMode = 1816;
5934 			setAction(&_sequenceManager, this, 1816, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
5935 		} else {
5936 			_sceneMode = 1817;
5937 			setAction(&_sequenceManager, this, 1817, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
5938 		}
5939 	} else if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5940 		_sceneMode = 1800;
5941 		setAction(&_sequenceManager, this, 1800, &R2_GLOBALS._player, &_companion, NULL);
5942 	} else {
5943 		_sceneMode = 1801;
5944 		setAction(&_sequenceManager, this, 1801, &R2_GLOBALS._player, &_companion, NULL);
5945 	}
5946 
5947 	R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1800;
5948 	R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1800;
5949 }
5950 
signal()5951 void Scene1800::signal() {
5952 	switch (_sceneMode) {
5953 	case 1:
5954 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5955 			_sceneMode = 1804;
5956 			setAction(&_sequenceManager, this, 1804, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
5957 		} else {
5958 			_sceneMode = 1805;
5959 			setAction(&_sequenceManager, this, 1805, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
5960 		}
5961 		break;
5962 	case 2:
5963 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
5964 			_sceneMode = 1806;
5965 			setAction(&_sequenceManager, this, 1806, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
5966 		} else {
5967 			_sceneMode = 1807;
5968 			setAction(&_sequenceManager, this, 1807, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
5969 		}
5970 		break;
5971 	case 3:
5972 		_sceneMode = 1802;
5973 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
5974 			setAction(&_sequenceManager, this, 1802, &R2_GLOBALS._player, &_companion, NULL);
5975 		else
5976 			setAction(&_sequenceManager, this, 1803, &R2_GLOBALS._player, &_companion, NULL);
5977 		break;
5978 	case 10:
5979 	// No break on purpose
5980 	case 11:
5981 		R2_GLOBALS._player.enableControl(CURSOR_TALK);
5982 		break;
5983 	case 12:
5984 		R2_GLOBALS._player.enableControl(CURSOR_TALK);
5985 		R2_GLOBALS._player._canWalk = false;
5986 		break;
5987 	case 13:
5988 		_sceneMode = 14;
5989 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
5990 		R2_GLOBALS._player.setup(1801, 7, 1);
5991 		R2_GLOBALS._player.animate(ANIM_MODE_8, 0, NULL);
5992 		_stripManager.start(550, this);
5993 		break;
5994 	case 14:
5995 		_sceneMode = 15;
5996 		R2_GLOBALS._player.disableControl();
5997 		R2_GLOBALS._player.setup(1801, 6, 1);
5998 		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
5999 		break;
6000 	case 15:
6001 		R2_GLOBALS._player.setup(1503, 4, 1);
6002 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
6003 		R2_GLOBALS._player.enableControl(CURSOR_USE);
6004 		break;
6005 	// Cases 23 and 24 have been added to fix missing hardcoded logic in the original,
6006 	// when Seeker tries to open the door
6007 	case 23:
6008 		_sceneMode = 24;
6009 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
6010 		R2_GLOBALS._player.setup(1801, 5, 1);
6011 		R2_GLOBALS._player.animate(ANIM_MODE_8, 0, NULL);
6012 		_stripManager.start(550, this);
6013 		break;
6014 	case 24:
6015 		R2_GLOBALS._player.disableControl();
6016 		R2_GLOBALS._player.setup(1507, 4, 1);
6017 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
6018 		R2_GLOBALS._player.enableControl(CURSOR_USE);
6019 
6020 		_doors.setup(1801, 3, 1);
6021 		_doors.setPosition(Common::Point(160, 139));
6022 		_doors.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL);
6023 		_doors.show();
6024 
6025 		R2_GLOBALS._player._position.y += 2;
6026 		R2_GLOBALS._player.show();
6027 		break;
6028 	case 1800:
6029 		R2_GLOBALS._walkRegions.disableRegion(8);
6030 		if (R2_GLOBALS.getFlag(63))
6031 			R2_GLOBALS._player.enableControl(CURSOR_USE);
6032 		else {
6033 			_sceneMode = 10;
6034 			R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
6035 			_stripManager.start(544, this);
6036 		}
6037 		break;
6038 	case 1801:
6039 		R2_GLOBALS._walkRegions.disableRegion(10);
6040 		R2_GLOBALS._walkRegions.disableRegion(11);
6041 		R2_GLOBALS.setFlag(63);
6042 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
6043 		break;
6044 	case 1802:
6045 		R2_GLOBALS.clearFlag(14);
6046 		R2_GLOBALS._sceneManager.changeScene(1700);
6047 		break;
6048 	case 1804:
6049 	// No break on purpose
6050 	case 1805:
6051 	// No break on purpose
6052 	case 1806:
6053 	// No break on purpose
6054 	case 1807:
6055 		R2_GLOBALS.clearFlag(14);
6056 		R2_GLOBALS._sceneManager.changeScene(1850);
6057 		break;
6058 	case 1808:
6059 		_sceneMode = 12;
6060 		R2_GLOBALS._events.setCursor(CURSOR_WALK);
6061 		_stripManager.start(553, this);
6062 		break;
6063 	case 1812:
6064 		_sceneMode = 13;
6065 		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
6066 		break;
6067 	// Case 1813 has been added to fix Seeker missing animation in the original game
6068 	case 1813:
6069 		_sceneMode = 23;
6070 		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
6071 		break;
6072 	case 1814:
6073 	// No break on purpose
6074 	case 1815:
6075 		R2_GLOBALS._walkRegions.disableRegion(10);
6076 		R2_GLOBALS._walkRegions.disableRegion(11);
6077 		R2_GLOBALS._player.enableControl();
6078 		break;
6079 	case 1816:
6080 	// No break on purpose
6081 	case 1817:
6082 		R2_GLOBALS._walkRegions.disableRegion(8);
6083 		R2_GLOBALS._player.enableControl();
6084 		break;
6085 	default:
6086 		R2_GLOBALS._player.enableControl();
6087 		break;
6088 	}
6089 }
6090 
saveCharacter(int characterIndex)6091 void Scene1800::saveCharacter(int characterIndex) {
6092 	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
6093 		R2_GLOBALS._sound1.fadeOut2(NULL);
6094 
6095 	SceneExt::saveCharacter(characterIndex);
6096 }
6097 
6098 /*--------------------------------------------------------------------------
6099  * Scene 1850 - Rim Lift Interior
6100  *
6101  *--------------------------------------------------------------------------*/
6102 
startAction(CursorType action,Event & event)6103 bool Scene1850::Button::startAction(CursorType action, Event &event) {
6104 	if (action != CURSOR_USE)
6105 		return SceneHotspot::startAction(action, event);
6106 
6107 	Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
6108 
6109 	R2_GLOBALS._player.disableControl();
6110 	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
6111 		scene->_sceneMode = 1852;
6112 		if (R2_GLOBALS.getFlag(32))
6113 			scene->setAction(&scene->_sequenceManager1, scene, 1871, &R2_GLOBALS._player, NULL);
6114 		else
6115 			scene->setAction(&scene->_sequenceManager1, scene, 1852, &R2_GLOBALS._player, NULL);
6116 	} else if (R2_GLOBALS.getFlag(30)) {
6117 		scene->_seqNumber = 1;
6118 		scene->_sceneMode = 1860;
6119 
6120 		if (R2_GLOBALS.getFlag(32))
6121 			scene->setAction(&scene->_sequenceManager1, scene, 1860, &R2_GLOBALS._player, &scene->_robot, NULL);
6122 		else
6123 			scene->setAction(&scene->_sequenceManager1, scene, 1859, &R2_GLOBALS._player, &scene->_robot, NULL);
6124 
6125 		R2_GLOBALS.clearFlag(30);
6126 	} else {
6127 		scene->_sceneMode = 1853;
6128 
6129 		if (R2_GLOBALS.getFlag(32))
6130 			scene->setAction(&scene->_sequenceManager1, scene, 1872, &R2_GLOBALS._player, NULL);
6131 		else
6132 			scene->setAction(&scene->_sequenceManager1, scene, 1853, &R2_GLOBALS._player, NULL);
6133 	}
6134 
6135 	return true;
6136 }
6137 
startAction(CursorType action,Event & event)6138 bool Scene1850::Robot::startAction(CursorType action, Event &event) {
6139 	Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
6140 
6141 	switch (action) {
6142 	case CURSOR_USE:
6143 		if ((R2_GLOBALS._player._characterIndex != R2_SEEKER) || R2_GLOBALS.getFlag(33) || R2_GLOBALS.getFlag(30))
6144 			return SceneActor::startAction(action, event);
6145 
6146 		R2_GLOBALS._player.disableControl();
6147 		scene->_sceneMode = 1857;
6148 
6149 		if (R2_GLOBALS.getFlag(32))
6150 			scene->setAction(&scene->_sequenceManager1, scene, 1858, &R2_GLOBALS._player, &scene->_robot, NULL);
6151 		else
6152 			scene->setAction(&scene->_sequenceManager1, scene, 1857, &R2_GLOBALS._player, &scene->_robot, NULL);
6153 
6154 		R2_GLOBALS.setFlag(30);
6155 		return true;
6156 		break;
6157 	case CURSOR_LOOK:
6158 		if (R2_GLOBALS.getFlag(34))
6159 			SceneItem::display(1850, 2, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
6160 		else
6161 			SceneItem::display(1850, 1, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
6162 
6163 		return true;
6164 		break;
6165 	case R2_AIRBAG:
6166 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
6167 			if (R2_GLOBALS.getFlag(70)) {
6168 				R2_GLOBALS._player.disableControl();
6169 				scene->_sceneMode = 30;
6170 
6171 				R2_GLOBALS._events.setCursor(CURSOR_WALK);
6172 				scene->_stripManager.start(558, scene);
6173 
6174 				return true;
6175 			} else {
6176 				return SceneActor::startAction(action, event);
6177 			}
6178 		} else if (R2_GLOBALS.getFlag(30)) {
6179 			R2_GLOBALS._player.disableControl();
6180 			scene->_sceneMode = 1875;
6181 			scene->_airbag.postInit();
6182 
6183 			if (R2_GLOBALS.getFlag(32))
6184 				scene->setAction(&scene->_sequenceManager1, scene, 1876,
6185 					&R2_GLOBALS._player, &scene->_airbag, NULL);
6186 			else
6187 				scene->setAction(&scene->_sequenceManager1, scene, 1875,
6188 					&R2_GLOBALS._player, &scene->_airbag, NULL);
6189 
6190 			return true;
6191 		} else if (R2_GLOBALS.getFlag(70)) {
6192 			R2_GLOBALS._player.disableControl();
6193 			scene->_sceneMode = 20;
6194 			R2_GLOBALS._events.setCursor(CURSOR_WALK);
6195 			scene->_stripManager.start(557, scene);
6196 			R2_GLOBALS.setFlag(69);
6197 
6198 			return true;
6199 		} else {
6200 			return SceneActor::startAction(action, event);
6201 		}
6202 		break;
6203 	case R2_REBREATHER_TANK:
6204 		if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) {
6205 			if (R2_GLOBALS.getFlag(30))
6206 				return SceneActor::startAction(action, event);
6207 
6208 			R2_GLOBALS._player.disableControl();
6209 			scene->_sceneMode = 1878;
6210 			scene->setAction(&scene->_sequenceManager1, scene, 1878, &R2_GLOBALS._player,
6211 				&scene->_robot, &scene->_airbag, NULL);
6212 		}
6213 
6214 		return true;
6215 		break;
6216 	default:
6217 		return SceneActor::startAction(action, event);
6218 		break;
6219 	}
6220 }
6221 
startAction(CursorType action,Event & event)6222 bool Scene1850::Door::startAction(CursorType action, Event &event) {
6223 	if (action != CURSOR_USE)
6224 		return SceneHotspot::startAction(action, event);
6225 
6226 	if (R2_GLOBALS.getFlag(32)) {
6227 		SceneItem::display(3240, 4, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
6228 		return true;
6229 	}
6230 
6231 	Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
6232 
6233 	R2_GLOBALS._player.disableControl();
6234 	if (scene->_sceneMode == 1851)
6235 		R2_GLOBALS._player._effect = EFFECT_SHADED;
6236 
6237 	if (_position.x >= 160)
6238 		R2_GLOBALS.setFlag(29);
6239 	else
6240 		R2_GLOBALS.clearFlag(29);
6241 
6242 	if ((R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) {
6243 		if (_position.x >= 160)
6244 			scene->_seqNumber = 3;
6245 		else
6246 			scene->_seqNumber = 2;
6247 
6248 		scene->_sceneMode = 1860;
6249 
6250 		if (R2_GLOBALS.getFlag(32)) {
6251 			scene->setAction(&scene->_sequenceManager1, scene, 1860, &R2_GLOBALS._player, &scene->_robot, NULL);
6252 		} else {
6253 			scene->setAction(&scene->_sequenceManager1, scene, 1859, &R2_GLOBALS._player, &scene->_robot, NULL);
6254 		}
6255 	} else {
6256 		scene->_sceneMode = 11;
6257 		if (_position.x >= 160) {
6258 			scene->setAction(&scene->_sequenceManager1, scene, 1866, &R2_GLOBALS._player, &scene->_rightDoor, NULL);
6259 		} else {
6260 			scene->setAction(&scene->_sequenceManager1, scene, 1865, &R2_GLOBALS._player, &scene->_leftDoor, NULL);
6261 		}
6262 	}
6263 
6264 	return true;
6265 }
6266 
startAction(CursorType action,Event & event)6267 bool Scene1850::DisplayScreen::startAction(CursorType action, Event &event) {
6268 	if ((action != CURSOR_USE) || (_position.y != 120))
6269 		return SceneHotspot::startAction(action, event);
6270 
6271 	Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
6272 
6273 	R2_GLOBALS._player.disableControl();
6274 	scene->_sceneMode = 1881;
6275 
6276 	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
6277 		scene->setAction(&scene->_sequenceManager1, scene, 1881, &R2_GLOBALS._player, NULL);
6278 	} else {
6279 		scene->setAction(&scene->_sequenceManager1, scene, 1880, &R2_GLOBALS._player, NULL);
6280 	}
6281 
6282 	return true;
6283 }
6284 
6285 /*------------------------------------------------------------------------*/
6286 
Scene1850()6287 Scene1850::Scene1850() {
6288 	_sceneMode = 0;
6289 	_shadeCountdown = 0;
6290 	_shadeDirection = 0;
6291 	_shadeChanging = false;
6292 	_seqNumber = 0;
6293 }
6294 
synchronize(Serializer & s)6295 void Scene1850::synchronize(Serializer &s) {
6296 	SceneExt::synchronize(s);
6297 
6298 	s.syncAsSint16LE(_sceneMode);
6299 	s.syncAsSint16LE(_shadeCountdown);
6300 	s.syncAsSint16LE(_shadeDirection);
6301 	s.syncAsSint16LE(_shadeChanging);
6302 	s.syncAsSint16LE(_seqNumber);
6303 	s.syncAsSint16LE(_playerDest.x);
6304 	s.syncAsSint16LE(_playerDest.y);
6305 }
6306 
postInit(SceneObjectList * OwnerList)6307 void Scene1850::postInit(SceneObjectList *OwnerList) {
6308 	loadScene(1850);
6309 
6310 	if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850)
6311 		R2_GLOBALS.clearFlag(31);
6312 
6313 	_palette1.loadPalette(0);
6314 
6315 	if (R2_GLOBALS.getFlag(31)) {
6316 		_sceneMode = 1850;
6317 		g_globals->_scenePalette.loadPalette(1850);
6318 	} else {
6319 		_sceneMode = 1851;
6320 		g_globals->_scenePalette.loadPalette(1851);
6321 	}
6322 
6323 	SceneExt::postInit();
6324 
6325 	if (R2_GLOBALS._sceneManager._previousScene == 3150)
6326 		R2_GLOBALS._sound1.play(116);
6327 
6328 	_stripManager.addSpeaker(&_quinnSpeaker);
6329 	_stripManager.addSpeaker(&_seekerSpeaker);
6330 
6331 	_shadeChanging = false;
6332 	_seqNumber = 0;
6333 	_playerDest = Common::Point(0, 0);
6334 
6335 	R2_GLOBALS._player._characterScene[R2_QUINN] = 1850;
6336 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1850;
6337 
6338 	_button.setDetails(Rect(101, 56, 111, 63), 1850, 19, -1, -1, 1, NULL);
6339 
6340 	_leftDoor.postInit();
6341 	_leftDoor.setup(1850, 3, 1);
6342 	_leftDoor.setPosition(Common::Point(66, 102));
6343 	_leftDoor.setDetails(1850, 22, -1, -1, 1, (SceneItem *) NULL);
6344 
6345 	_rightDoor.postInit();
6346 	_rightDoor.setup(1850, 2, 1);
6347 	_rightDoor.setPosition(Common::Point(253, 102));
6348 	_rightDoor.setDetails(1850, 22, -1, -1, 1, (SceneItem *) NULL);
6349 
6350 	R2_GLOBALS._walkRegions.disableRegion(1);
6351 
6352 	_robot.postInit();
6353 
6354 	if (R2_GLOBALS.getFlag(34)) {
6355 		R2_GLOBALS._walkRegions.disableRegion(2);
6356 		_robot.setup(1851, 4, 3);
6357 	} else if (R2_GLOBALS.getFlag(30)) {
6358 		_robot.setup(1851, 2, 2);
6359 	} else {
6360 		R2_GLOBALS._walkRegions.disableRegion(5);
6361 		if (R2_GLOBALS.getFlag(33)) {
6362 			R2_GLOBALS._walkRegions.disableRegion(2);
6363 			_robot.setup(1851, 1, 3);
6364 		} else {
6365 			_robot.setup(1851, 2, 1);
6366 		}
6367 	}
6368 
6369 	_robot.setPosition(Common::Point(219, 130));
6370 	_robot.fixPriority(114);
6371 	_robot.setDetails(1850, -1, -1, -1, 1, (SceneItem *) NULL);
6372 
6373 	R2_GLOBALS._player.postInit();
6374 
6375 	_companion.postInit();
6376 	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
6377 		_companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
6378 	} else {
6379 		_companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
6380 	}
6381 
6382 	if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) {
6383 		R2_GLOBALS._player._effect = EFFECT_SHADED2;
6384 		_companion._effect = EFFECT_SHADED2;
6385 		if (R2_GLOBALS.getFlag(31)) {
6386 			R2_GLOBALS._player._shade = 0;
6387 			_companion._shade = 0;
6388 		} else {
6389 			R2_GLOBALS._player._shade = 6;
6390 			_companion._shade = 6;
6391 		}
6392 
6393 		if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) {
6394 			_airbag.postInit();
6395 			if (R2_GLOBALS.getFlag(34)) {
6396 				_airbag.setup(1851, 4, 2);
6397 				_airbag.fixPriority(114);
6398 			} else {
6399 				_airbag.setup(1851, 4, 1);
6400 			}
6401 
6402 			_airbag.setPosition(Common::Point(179, 113));
6403 
6404 			if ((_robot._strip == 1) && (_robot._frame == 3)){
6405 				_airbag.hide();
6406 			}
6407 
6408 			_airbag.setDetails(1850, 6, -1, -1, 1, (SceneItem *) NULL);
6409 		}
6410 
6411 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
6412 			if (R2_GLOBALS.getFlag(32)) {
6413 				R2_GLOBALS._player.setVisage(1511);
6414 				_companion.setVisage(1508);
6415 
6416 				_screen.postInit();
6417 				_screen.setup(1853, 3, 1);
6418 				_screen.setPosition(Common::Point(122, 113));
6419 				_screen.fixPriority(114);
6420 				_screen._effect = EFFECT_SHADED2;
6421 				_screen.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL);
6422 
6423 				_helmet.postInit();
6424 				_helmet.setup(1853, 3, 2);
6425 				_helmet.setPosition(Common::Point(139, 111));
6426 				_helmet.fixPriority(114);
6427 				_helmet._effect = EFFECT_SHADED2;
6428 				_helmet.setDetails(1850, 29, -1, -1, 2, (SceneItem *) NULL);
6429 
6430 				if (R2_GLOBALS.getFlag(31)) {
6431 					_screen._shade = 0;
6432 					_helmet._shade = 0;
6433 				} else {
6434 					_screen._shade = 6;
6435 					_helmet._shade = 6;
6436 				}
6437 			} else {
6438 				R2_GLOBALS._player.setVisage(1500);
6439 				_companion.setVisage(1505);
6440 			}
6441 		} else if (R2_GLOBALS.getFlag(32)) {
6442 			// Not Quinn, flag 32
6443 			R2_GLOBALS._player.setVisage(1508);
6444 			_companion.setVisage(1511);
6445 
6446 			_screen.postInit();
6447 			_screen.setup(1853, 3, 1);
6448 			_screen.setPosition(Common::Point(122, 113));
6449 			_screen.fixPriority(114);
6450 			_screen._effect = EFFECT_SHADED2;
6451 			_screen.setDetails(1850, 30, -1, -1, 2, (SceneItem *) NULL);
6452 
6453 			_helmet.postInit();
6454 			_helmet.setup(1853, 3, 2);
6455 			_helmet.setPosition(Common::Point(139, 111));
6456 			_helmet.fixPriority(114);
6457 			_helmet._effect = EFFECT_SHADED2;
6458 			_helmet.setDetails(1850, 28, -1, -1, 1, (SceneItem *) NULL);
6459 
6460 			if (R2_GLOBALS.getFlag(31)) {
6461 				_screen._shade = 0;
6462 				_helmet._shade = 0;
6463 			} else {
6464 				_screen._shade = 6;
6465 				_helmet._shade = 6;
6466 			}
6467 		} else {
6468 			// Not Quinn, nor flag 32
6469 			R2_GLOBALS._player.setVisage(1505);
6470 			_companion.setVisage(1500);
6471 		}
6472 
6473 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
6474 		R2_GLOBALS._player.setStrip(3);
6475 		R2_GLOBALS._player.setPosition(Common::Point(80, 114));
6476 
6477 		_companion.animate(ANIM_MODE_1, NULL);
6478 		_companion.setObjectWrapper(new SceneObjectWrapper());
6479 		_companion.setStrip(3);
6480 		_companion.setPosition(Common::Point(180, 96));
6481 
6482 		if (R2_GLOBALS.getFlag(30)) {
6483 			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
6484 				_companion.animate(ANIM_MODE_NONE, NULL);
6485 				_companion.setObjectWrapper(NULL);
6486 				if (R2_GLOBALS.getFlag(32)) {
6487 					_companion.setup(1854, 1, 3);
6488 				} else {
6489 					_companion.setup(1854, 2, 3);
6490 				}
6491 
6492 				_companion.setPosition(Common::Point(164, 106));
6493 			} else {
6494 				_companion.animate(ANIM_MODE_NONE, NULL);
6495 				_companion.setObjectWrapper(NULL);
6496 				if (R2_GLOBALS.getFlag(32)) {
6497 					R2_GLOBALS._player.setup(1854, 1, 3);
6498 				} else {
6499 					R2_GLOBALS._player.setup(1854, 2, 3);
6500 				}
6501 
6502 				R2_GLOBALS._player.setPosition(Common::Point(164, 106));
6503 			}
6504 		}
6505 
6506 		R2_GLOBALS._player.enableControl();
6507 	} else { // R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850
6508 		R2_GLOBALS._player._effect = EFFECT_SHADED;
6509 		_companion._effect = EFFECT_SHADED;
6510 		R2_GLOBALS._player.disableControl();
6511 		_sceneMode = 10;
6512 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
6513 			if (R2_GLOBALS.getFlag(29)) {
6514 				setAction(&_sequenceManager1, this, 1863, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
6515 			} else {
6516 				setAction(&_sequenceManager1, this, 1861, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
6517 			}
6518 		} else {
6519 			if (R2_GLOBALS.getFlag(29)) {
6520 				setAction(&_sequenceManager1, this, 1864, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
6521 			} else {
6522 				setAction(&_sequenceManager1, this, 1862, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
6523 			}
6524 		}
6525 	}
6526 
6527 	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
6528 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
6529 		_companion._moveDiff = Common::Point(5, 3);
6530 	} else {
6531 		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
6532 		_companion._moveDiff = Common::Point(3, 2);
6533 	}
6534 
6535 	_displayScreen.postInit();
6536 	_displayScreen.setup(1850, 1, 1);
6537 
6538 	if (R2_GLOBALS.getFlag(62)) {
6539 		_displayScreen.setPosition(Common::Point(159, 120));
6540 	} else {
6541 		_displayScreen.setPosition(Common::Point(159, 184));
6542 	}
6543 
6544 	_displayScreen.fixPriority(113);
6545 
6546 	if (R2_GLOBALS.getFlag(34)) {
6547 		_displayScreen.setDetails(1850, 25, -1, -1, 4, &_robot);
6548 	} else {
6549 		_displayScreen.setDetails(1850, 25, -1, -1, 2, (SceneItem *) NULL);
6550 	}
6551 
6552 	if (!R2_GLOBALS.getFlag(62)) {
6553 		_displayScreen.hide();
6554 	}
6555 
6556 	_background.setDetails(Rect(0, 0, 320, 200), 1850, 16, -1, -1, 1, NULL);
6557 
6558 	R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1850;
6559 	R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1850;
6560 }
6561 
remove()6562 void Scene1850::remove() {
6563 	g_globals->_scenePalette.loadPalette(0);
6564 
6565 	R2_GLOBALS._scenePalette._palette[765] = 255;
6566 	R2_GLOBALS._scenePalette._palette[766] = 255;
6567 	R2_GLOBALS._scenePalette._palette[767] = 255;
6568 
6569 	SceneExt::remove();
6570 }
6571 
signal()6572 void Scene1850::signal() {
6573 	switch (_sceneMode) {
6574 	case 10:
6575 		R2_GLOBALS._player._effect = EFFECT_SHADED2;
6576 		R2_GLOBALS._player._shade = 6;
6577 
6578 		_companion._effect = EFFECT_SHADED2;
6579 		_companion._shade = 6;
6580 
6581 		R2_GLOBALS._walkRegions.disableRegion(5);
6582 
6583 		if (R2_GLOBALS.getFlag(68)) {
6584 			R2_GLOBALS._player.enableControl();
6585 		} else {
6586 			R2_GLOBALS.setFlag(68);
6587 			_sceneMode = 20;
6588 			R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
6589 			_stripManager.start(554, this);
6590 		}
6591 		break;
6592 	case 11:
6593 		R2_GLOBALS.clearFlag(30);
6594 		R2_GLOBALS._sceneManager.changeScene(1800);
6595 		break;
6596 	case 15:
6597 		_sceneMode = 16;
6598 		break;
6599 	case 16:
6600 		_sceneMode = 1870;
6601 		setAction(&_sequenceManager1, this, 1870, &R2_GLOBALS._player, &_companion,
6602 			&_screen, &_helmet, NULL);
6603 		break;
6604 	case 20:
6605 		R2_GLOBALS._player.enableControl(CURSOR_TALK);
6606 		break;
6607 	case 21:
6608 		R2_GLOBALS._player.disableControl();
6609 		_sceneMode = 1877;
6610 		setAction(&_sequenceManager1, this, 1877, &R2_GLOBALS._player, &_companion,
6611 			&_robot, NULL);
6612 		break;
6613 	case 30:
6614 		R2_GLOBALS._player.disableControl();
6615 		_sceneMode = 1882;
6616 		setAction(&_sequenceManager1, this, 1882, &R2_GLOBALS._player, NULL);
6617 		break;
6618 	case 1852:
6619 	// No break on purpose:
6620 	case 1853:
6621 		if (_sceneMode == 1851) { // At this point, SceneMode can't be equal to 1851 => dead code
6622 			R2_GLOBALS.setFlag(31);
6623 			_palette1.loadPalette(1850);
6624 			_sceneMode = 1850;
6625 		} else {
6626 			R2_GLOBALS.clearFlag(31);
6627 			_palette1.loadPalette(1851);
6628 			_sceneMode = 1851;
6629 		}
6630 
6631 		_shadeChanging = true;
6632 		if (R2_GLOBALS.getFlag(30)) {
6633 			_displayScreen.setAction(&_sequenceManager2, NULL, 1867, &_displayScreen, NULL);
6634 		} else if (R2_GLOBALS.getFlag(34)) {
6635 			if (R2_GLOBALS.getFlag(62)) {
6636 				R2_GLOBALS.clearFlag(62);
6637 				_displayScreen.setAction(&_sequenceManager2, this, 1851, &_displayScreen, NULL);
6638 			} else {
6639 				R2_GLOBALS.setFlag(62);
6640 				_displayScreen.setAction(&_sequenceManager2, this, 1850, &_displayScreen, NULL);
6641 			}
6642 		} else if (R2_GLOBALS.getFlag(33)) {
6643 				R2_GLOBALS.setFlag(62);
6644 				R2_GLOBALS.setFlag(34);
6645 				R2_GLOBALS._walkRegions.disableRegion(2);
6646 
6647 				_airbag.postInit();
6648 				_airbag.setDetails(1850, 6, -1, -1, 5, &_robot);
6649 
6650 				_sceneMode = 1879;
6651 
6652 				_displayScreen.setAction(&_sequenceManager2, this, 1879, &_robot,
6653 					&_displayScreen, &_airbag, NULL);
6654 		} else {
6655 			_displayScreen.setAction(&_sequenceManager2, NULL, 1867, &_displayScreen, NULL);
6656 		}
6657 
6658 		if (R2_GLOBALS.getFlag(34))
6659 			R2_GLOBALS._scenePalette.addFader(_palette1._palette, 256, 5, NULL);
6660 		else
6661 			R2_GLOBALS._scenePalette.addFader(_palette1._palette, 256, 5, this);
6662 
6663 		if (_sceneMode == 1851)
6664 			_shadeDirection = -20;
6665 		else
6666 			_shadeDirection = 20;
6667 
6668 		_shadeCountdown = 20;
6669 
6670 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
6671 			if (_sceneMode == 1879)
6672 				_sceneMode = 1854;
6673 
6674 			if (R2_GLOBALS.getFlag(32)) {
6675 				setAction(&_sequenceManager1, NULL, 1873, &R2_GLOBALS._player, NULL);
6676 			} else {
6677 				setAction(&_sequenceManager1, NULL, 1854, &R2_GLOBALS._player, NULL);
6678 			}
6679 		} else {
6680 			if (_sceneMode == 1879)
6681 				_sceneMode = 1855;
6682 
6683 			if (R2_GLOBALS.getFlag(32)) {
6684 				setAction(&_sequenceManager1, NULL, 1874, &R2_GLOBALS._player, NULL);
6685 			} else {
6686 				setAction(&_sequenceManager1, NULL, 1855, &R2_GLOBALS._player, NULL);
6687 			}
6688 		}
6689 		break;
6690 	case 1857:
6691 		if (R2_GLOBALS.getFlag(69)) {
6692 			R2_GLOBALS._player.enableControl();
6693 			R2_GLOBALS._player._canWalk = false;
6694 		} else {
6695 			_sceneMode = 1858;
6696 			R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
6697 			_stripManager.start(555, this);
6698 			R2_GLOBALS.setFlag(69);
6699 		}
6700 		break;
6701 	case 1858:
6702 		R2_GLOBALS._player.disableControl();
6703 		_sceneMode = 1859;
6704 		setAction(&_sequenceManager1, this, 1859, &R2_GLOBALS._player, &_robot, NULL);
6705 		R2_GLOBALS.clearFlag(30);
6706 		break;
6707 	case 1859:
6708 		R2_GLOBALS.setFlag(70);
6709 		_sceneMode = 20;
6710 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
6711 		_stripManager.start(575, this);
6712 		break;
6713 	case 1860:
6714 		if (_playerDest.x != 0) {
6715 			R2_GLOBALS._player.enableControl();
6716 
6717 			PlayerMover *mover = new PlayerMover();
6718 			R2_GLOBALS._player.addMover(mover, &_playerDest, this);
6719 
6720 			_playerDest = Common::Point(0, 0);
6721 		}
6722 
6723 		switch (_seqNumber) {
6724 		case 1:
6725 			_sceneMode = 1853;
6726 			if (R2_GLOBALS.getFlag(32)) {
6727 				setAction(&_sequenceManager1, this, 1872, &R2_GLOBALS._player, NULL);
6728 			} else {
6729 				setAction(&_sequenceManager1, this, 1853, &R2_GLOBALS._player, NULL);
6730 			}
6731 			break;
6732 		case 2:
6733 			_sceneMode = 11;
6734 			setAction(&_sequenceManager1, this, 1865, &R2_GLOBALS._player, &_leftDoor, NULL);
6735 			break;
6736 		case 3:
6737 			_sceneMode = 11;
6738 			setAction(&_sequenceManager1, this, 1866, &R2_GLOBALS._player, &_rightDoor, NULL);
6739 			break;
6740 		default:
6741 			break;
6742 		}
6743 
6744 		_seqNumber = 0;
6745 		break;
6746 	case 1870:
6747 		R2_GLOBALS._walkRegions.disableRegion(5);
6748 		R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1);
6749 		R2_GLOBALS.setFlag(32);
6750 		R2_GLOBALS._player.enableControl(CURSOR_WALK);
6751 		break;
6752 	case 1875:
6753 		R2_INVENTORY.setObjectScene(R2_AIRBAG, 1850);
6754 		_sceneMode = 21;
6755 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
6756 		_stripManager.start(561, this);
6757 		break;
6758 	case 1877:
6759 		_screen.postInit();
6760 		_screen._effect = EFFECT_SHADED2;
6761 
6762 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
6763 			_screen.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL);
6764 		} else {
6765 			_screen.setDetails(1850, 30, -1, -1, 2, (SceneItem *)NULL);
6766 		}
6767 
6768 		_helmet.postInit();
6769 		_helmet._effect = EFFECT_SHADED2;
6770 
6771 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
6772 			_helmet.setDetails(1850, 29, -1, -1, 2, (SceneItem *)NULL);
6773 		} else {
6774 			_helmet.setDetails(1850, 28, -1, -1, 2, (SceneItem *)NULL);
6775 		}
6776 
6777 		if (R2_GLOBALS.getFlag(31)) {
6778 			_screen._shade = 0;
6779 			_helmet._shade = 0;
6780 		} else {
6781 			_screen._shade = 6;
6782 			_helmet._shade = 6;
6783 		}
6784 
6785 		R2_GLOBALS.clearFlag(30);
6786 		_sceneMode = 15;
6787 		setAction(&_sequenceManager1, this, 1869, &R2_GLOBALS._player, &_screen, NULL);
6788 		_companion.setAction(&_sequenceManager2, this, 1868, &_companion, &_helmet, NULL);
6789 		break;
6790 	case 1878:
6791 		R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1850);
6792 		R2_GLOBALS.setFlag(33);
6793 		R2_GLOBALS._walkRegions.disableRegion(2);
6794 		R2_GLOBALS._player.enableControl();
6795 		break;
6796 	case 1879:
6797 		R2_GLOBALS._player.enableControl();
6798 		break;
6799 	case 1881:
6800 		R2_GLOBALS._sceneManager.changeScene(1875);
6801 		break;
6802 	case 1882:
6803 		R2_INVENTORY.setObjectScene(R2_AIRBAG, 1);
6804 		R2_GLOBALS._player.enableControl();
6805 		break;
6806 	default:
6807 		R2_GLOBALS._player.enableControl();
6808 		break;
6809 	}
6810 }
6811 
process(Event & event)6812 void Scene1850::process(Event &event) {
6813 	if ( (event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_WALK)
6814 			&& (R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) {
6815 		_playerDest = event.mousePos;
6816 		R2_GLOBALS._player.disableControl();
6817 		_sceneMode = 1860;
6818 		if (R2_GLOBALS.getFlag(32)) {
6819 			setAction(&_sequenceManager1, this, 1860, &R2_GLOBALS._player, &_robot, NULL);
6820 		} else {
6821 			setAction(&_sequenceManager1, this, 1859, &R2_GLOBALS._player, &_robot, NULL);
6822 		}
6823 		R2_GLOBALS.clearFlag(30);
6824 		event.handled = true;
6825 	}
6826 
6827 	Scene::process(event);
6828 }
6829 
dispatch()6830 void Scene1850::dispatch() {
6831 	if (_shadeChanging) {
6832 		_shadeCountdown--;
6833 		if (_shadeCountdown == 0)
6834 			_shadeChanging = false;
6835 
6836 		if (_shadeDirection >= 0) {
6837 			R2_GLOBALS._player._shade = (_shadeCountdown * 6) / _shadeDirection;
6838 		} else {
6839 			R2_GLOBALS._player._shade = ((_shadeCountdown * 6) / _shadeDirection) + 6;
6840 		}
6841 		R2_GLOBALS._player._flags |= OBJFLAG_PANES;
6842 
6843 		_companion._shade = R2_GLOBALS._player._shade;
6844 		_companion._flags |= OBJFLAG_PANES;
6845 
6846 		_screen._shade = R2_GLOBALS._player._shade;
6847 		_screen._flags |= OBJFLAG_PANES;
6848 
6849 		_helmet._shade = R2_GLOBALS._player._shade;
6850 		_helmet._flags |= OBJFLAG_PANES;
6851 	}
6852 
6853 	if (R2_GLOBALS.getFlag(32)) {
6854 		_screen.setPosition(Common::Point(_displayScreen._position.x - 37, _displayScreen._position.y - 71));
6855 		_helmet.setPosition(Common::Point(_displayScreen._position.x - 20, _displayScreen._position.y - 73));
6856 	}
6857 
6858 	if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) {
6859 		_airbag.setPosition(Common::Point(_displayScreen._position.x + 20, _displayScreen._position.y - 71));
6860 	}
6861 
6862 	Scene::dispatch();
6863 }
6864 
6865 /*--------------------------------------------------------------------------
6866  * Scene 1875 - Rim Lift Computer
6867  *
6868  *--------------------------------------------------------------------------*/
6869 
Button()6870 Scene1875::Button::Button() {
6871 	_buttonId = 0;
6872 	_buttonDown = false;
6873 }
6874 
synchronize(Serializer & s)6875 void Scene1875::Button::synchronize(Serializer &s) {
6876 	SceneActor::synchronize(s);
6877 
6878 	s.syncAsSint16LE(_buttonId);
6879 	s.syncAsSint16LE(_buttonDown);
6880 }
6881 
doButtonPress()6882 void Scene1875::Button::doButtonPress() {
6883 	Scene1875 *scene = (Scene1875 *)R2_GLOBALS._sceneManager._scene;
6884 
6885 	R2_GLOBALS._sound1.play(227);
6886 
6887 	int newFrameNumber;
6888 	switch (_buttonId) {
6889 	case 3:
6890 		if ((scene->_map._frame == 1) && (scene->_button1._strip == 2)) {
6891 			R2_GLOBALS._player.disableControl();
6892 			R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
6893 			scene->_sceneMode = 10;
6894 			scene->_stripManager.start(576, scene);
6895 		} else {
6896 			R2_GLOBALS._player.disableControl();
6897 			scene->_sceneMode = 1890;
6898 			scene->_rimPosition.postInit();
6899 			scene->setAction(&scene->_sequenceManager, scene, 1890, &scene->_rimPosition, NULL);
6900 		}
6901 		break;
6902 	case 4:
6903 		newFrameNumber = scene->_map._frame + 1;
6904 		if (newFrameNumber > 6)
6905 			newFrameNumber = 1;
6906 		scene->_map.setFrame(newFrameNumber);
6907 		break;
6908 	case 5:
6909 		newFrameNumber = scene->_map._frame - 1;
6910 		if (newFrameNumber < 1)
6911 			newFrameNumber = 6;
6912 		scene->_map.setFrame(newFrameNumber);
6913 		break;
6914 	default:
6915 		break;
6916 	}
6917 }
6918 
initButton(int buttonId)6919 void Scene1875::Button::initButton(int buttonId) {
6920 	postInit();
6921 	_buttonId = buttonId;
6922 	_buttonDown = false;
6923 	setVisage(1855);
6924 
6925 	if (_buttonId == 1)
6926 		setStrip(2);
6927 	else
6928 		setStrip(1);
6929 
6930 	setFrame(_buttonId);
6931 	switch (_buttonId) {
6932 	case 1:
6933 		setPosition(Common::Point(20, 144));
6934 		break;
6935 	case 2:
6936 		setPosition(Common::Point(82, 144));
6937 		break;
6938 	case 3:
6939 		setPosition(Common::Point(136, 144));
6940 		break;
6941 	case 4:
6942 		setPosition(Common::Point(237, 144));
6943 		break;
6944 	case 5:
6945 		setPosition(Common::Point(299, 144));
6946 		break;
6947 	default:
6948 		break;
6949 	}
6950 
6951 	setDetails(1875, 6, 1, -1, 2, (SceneItem *) NULL);
6952 }
6953 
process(Event & event)6954 void Scene1875::Button::process(Event &event) {
6955 	if (!R2_GLOBALS._player._uiEnabled || event.handled)
6956 		return;
6957 
6958 	Scene1875 *scene = (Scene1875 *)R2_GLOBALS._sceneManager._scene;
6959 
6960 	if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE)
6961 			&& (_bounds.contains(event.mousePos)) && !_buttonDown) {
6962 		setStrip(2);
6963 		switch (_buttonId) {
6964 		case 1:
6965 			R2_GLOBALS._sound2.play(227);
6966 			scene->_button2.setStrip(1);
6967 			break;
6968 		case 2:
6969 			R2_GLOBALS._sound2.play(227);
6970 			scene->_button1.setStrip(1);
6971 			break;
6972 		default:
6973 			break;
6974 		}
6975 		_buttonDown = true;
6976 		event.handled = true;
6977 	}
6978 
6979 	if ((event.eventType == EVENT_BUTTON_UP) && _buttonDown) {
6980 		if ((_buttonId == 3) || (_buttonId == 4) || (_buttonId == 5)) {
6981 			setStrip(1);
6982 			doButtonPress();
6983 		}
6984 		_buttonDown = false;
6985 		event.handled = true;
6986 	}
6987 }
6988 
postInit(SceneObjectList * OwnerList)6989 void Scene1875::postInit(SceneObjectList *OwnerList) {
6990 	loadScene(1875);
6991 	SceneExt::postInit();
6992 
6993 	R2_GLOBALS._player._characterScene[R2_QUINN] = 1875;
6994 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1875;
6995 
6996 	_stripManager.addSpeaker(&_quinnSpeaker);
6997 	_stripManager.addSpeaker(&_seekerSpeaker);
6998 
6999 	_button1.initButton(1);
7000 	_button2.initButton(2);
7001 	_button3.initButton(3);
7002 	_button4.initButton(4);
7003 	_button5.initButton(5);
7004 
7005 	_map.postInit();
7006 	_map.setup(1855, 4, 1);
7007 	_map.setPosition(Common::Point(160, 116));
7008 
7009 	R2_GLOBALS._player.postInit();
7010 	R2_GLOBALS._player.hide();
7011 
7012 	if (R2_GLOBALS._sceneManager._previousScene == 1625) {
7013 		R2_GLOBALS._sound1.play(122);
7014 		R2_GLOBALS._player.disableControl();
7015 		_sceneMode = 11;
7016 		_rimPosition.postInit();
7017 		setAction(&_sequenceManager, this, 1892, &_rimPosition, NULL);
7018 	} else {
7019 		if (R2_GLOBALS._sceneManager._previousScene == 3150) {
7020 			R2_GLOBALS._sound1.play(116);
7021 		}
7022 
7023 		R2_GLOBALS._player.enableControl();
7024 		R2_GLOBALS._player._canWalk = false;
7025 	}
7026 
7027 	_screen.setDetails(Rect(43, 14, 275, 122), 1875, 9, 1, -1, 1, NULL);
7028 	_background.setDetails(Rect(0, 0, 320, 200), 1875, 3, -1, -1, 1, NULL);
7029 
7030 	R2_GLOBALS._player._characterScene[R2_QUINN] = 1875;
7031 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1875;
7032 	R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1875;
7033 	R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1875;
7034 }
7035 
signal()7036 void Scene1875::signal() {
7037 	switch (_sceneMode) {
7038 	case 10:
7039 		R2_GLOBALS._player.disableControl();
7040 		_sceneMode = 1891;
7041 		_rimPosition.postInit();
7042 		setAction(&_sequenceManager, this, 1891, &_rimPosition, NULL);
7043 		break;
7044 	case 11:
7045 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
7046 		_sceneMode = 1892;
7047 		_stripManager.start(577, this);
7048 		break;
7049 	case 1890:
7050 		_rimPosition.remove();
7051 		R2_GLOBALS._player.enableControl();
7052 		R2_GLOBALS._player._canWalk = false;
7053 		break;
7054 	case 1891:
7055 		R2_GLOBALS._player.disableControl();
7056 		R2_GLOBALS._sceneManager.changeScene(1625);
7057 		break;
7058 	case 1892:
7059 		R2_GLOBALS._player.disableControl();
7060 		R2_GLOBALS._sceneManager.changeScene(1900);
7061 		break;
7062 	default:
7063 		R2_GLOBALS._player.enableControl();
7064 		R2_GLOBALS._player._canWalk = false;
7065 		break;
7066 	}
7067 }
7068 
process(Event & event)7069 void Scene1875::process(Event &event) {
7070 	Scene::process(event);
7071 
7072 	_button1.process(event);
7073 	_button2.process(event);
7074 	_button3.process(event);
7075 	_button4.process(event);
7076 	_button5.process(event);
7077 }
7078 
7079 /*--------------------------------------------------------------------------
7080  * Scene 1900 - Spill Mountains Elevator Exit
7081  *
7082  *--------------------------------------------------------------------------*/
7083 
startAction(CursorType action,Event & event)7084 bool Scene1900::LiftDoor::startAction(CursorType action, Event &event) {
7085 	if (action != CURSOR_USE)
7086 		return SceneActor::startAction(action, event);
7087 
7088 	if ((_frame != 1) || (R2_GLOBALS._player._characterIndex != R2_SEEKER)) {
7089 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
7090 			return SceneActor::startAction(action, event);
7091 		else
7092 			return true;
7093 	}
7094 
7095 	Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
7096 
7097 	R2_GLOBALS._player.enableControl(CURSOR_USE);
7098 
7099 	if (_position.x >= 160) {
7100 		scene->_sceneMode = 1905;
7101 		scene->setAction(&scene->_sequenceManager1, scene, 1905, &R2_GLOBALS._player, &scene->_rightDoor, NULL);
7102 	} else {
7103 		R2_GLOBALS.setFlag(29);
7104 		scene->_sceneMode = 1904;
7105 		scene->setAction(&scene->_sequenceManager1, scene, 1904, &R2_GLOBALS._player, &scene->_leftDoor, NULL);
7106 	}
7107 
7108 	return true;
7109 }
7110 
changeScene()7111 void Scene1900::WestExit::changeScene() {
7112 	Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
7113 
7114 	R2_GLOBALS._player.disableControl(CURSOR_WALK);
7115 	scene->_sceneMode = 10;
7116 
7117 	Common::Point pt(-10, 135);
7118 	NpcMover *mover = new NpcMover();
7119 	R2_GLOBALS._player.addMover(mover, &pt, scene);
7120 }
7121 
changeScene()7122 void Scene1900::EastExit::changeScene() {
7123 	Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
7124 
7125 	R2_GLOBALS._player.disableControl(CURSOR_WALK);
7126 	scene->_sceneMode = 11;
7127 
7128 	Common::Point pt(330, 135);
7129 	NpcMover *mover = new NpcMover();
7130 	R2_GLOBALS._player.addMover(mover, &pt, scene);
7131 }
7132 
postInit(SceneObjectList * OwnerList)7133 void Scene1900::postInit(SceneObjectList *OwnerList) {
7134 	loadScene(1900);
7135 	SceneExt::postInit();
7136 
7137 	// Debug message, skipped
7138 
7139 	if (R2_GLOBALS._sceneManager._previousScene == -1) {
7140 		R2_GLOBALS._sceneManager._previousScene = 1925;
7141 		R2_GLOBALS._player._characterIndex = R2_SEEKER;
7142 		R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1925;
7143 	}
7144 
7145 	if (R2_GLOBALS._sceneManager._previousScene != 1875)
7146 		R2_GLOBALS._sound1.play(200);
7147 
7148 	_stripManager.setColors(60, 255);
7149 	_stripManager.setFontNumber(3);
7150 	_stripManager.addSpeaker(&_seekerSpeaker);
7151 
7152 	_westExit.setDetails(Rect(0, 105, 14, 145), EXITCURSOR_W, 2000);
7153 	_westExit.setDest(Common::Point(14, 135));
7154 
7155 	_eastExit.setDetails(Rect(305, 105, 320, 145), EXITCURSOR_E, 2000);
7156 	_eastExit.setDest(Common::Point(315, 135));
7157 
7158 	R2_GLOBALS._player.postInit();
7159 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
7160 		R2_GLOBALS._player.setup(2008, 3, 1);
7161 	else
7162 		R2_GLOBALS._player.setup(20, 3, 1);
7163 	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
7164 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
7165 		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
7166 	else
7167 		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
7168 	R2_GLOBALS._player.disableControl();
7169 
7170 	if (R2_GLOBALS._sceneManager._previousScene != 1925)
7171 		R2_GLOBALS.clearFlag(29);
7172 
7173 	_leftDoor.postInit();
7174 	_leftDoor.setup(1901, 1, 1);
7175 	_leftDoor.setPosition(Common::Point(95, 109));
7176 	_leftDoor.fixPriority(100);
7177 
7178 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
7179 		_leftDoor.setDetails(1900, 0, 1, 2, 1, (SceneItem *) NULL);
7180 	else
7181 		_leftDoor.setDetails(1900, 0, 1, -1, 1, (SceneItem *) NULL);
7182 
7183 	_rightDoor.postInit();
7184 	_rightDoor.setup(1901, 2, 1);
7185 	_rightDoor.setPosition(Common::Point(225, 109));
7186 	_rightDoor.fixPriority(100);
7187 	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
7188 		_rightDoor.setDetails(1900, 0, 1, 2, 1, (SceneItem *) NULL);
7189 	else
7190 		_rightDoor.setDetails(1900, 0, 1, -1, 1, (SceneItem *) NULL);
7191 
7192 	if (R2_GLOBALS._sceneManager._previousScene != 1875) {
7193 		_leftDoorFrame.postInit();
7194 		_leftDoorFrame.setup(1945, 6, 1);
7195 		_leftDoorFrame.setPosition(Common::Point(96, 109));
7196 		_leftDoorFrame.fixPriority(80);
7197 
7198 		_rightDoorFrame.postInit();
7199 		_rightDoorFrame.setup(1945, 6, 2);
7200 		_rightDoorFrame.setPosition(Common::Point(223, 109));
7201 		_rightDoorFrame.fixPriority(80);
7202 	}
7203 
7204 	if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1875) {
7205 		R2_GLOBALS._player._characterIndex = R2_QUINN;
7206 		_companion.postInit();
7207 		_sceneMode = 20;
7208 		R2_GLOBALS._player.setAction(&_sequenceManager1, NULL, 1901, &R2_GLOBALS._player, &_leftDoor, NULL);
7209 		_companion.setAction(&_sequenceManager2, this, 1900, &_companion, &_rightDoor, NULL);
7210 	} else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1925) {
7211 		if (R2_GLOBALS.getFlag(29)) {
7212 			R2_GLOBALS.clearFlag(29);
7213 			_leftDoor.hide();
7214 
7215 			R2_GLOBALS._player.setStrip(6);
7216 			R2_GLOBALS._player.setPosition(Common::Point(90, 106));
7217 			_sceneMode = 1906;
7218 			setAction(&_sequenceManager1, this, 1906, &R2_GLOBALS._player, &_leftDoor, NULL);
7219 		} else {
7220 			_rightDoor.hide();
7221 			R2_GLOBALS._player.setStrip(5);
7222 			R2_GLOBALS._player.setPosition(Common::Point(230, 106));
7223 			_sceneMode = 1907;
7224 			setAction(&_sequenceManager1, this, 1907, &R2_GLOBALS._player, &_rightDoor, NULL);
7225 		}
7226 
7227 		if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
7228 			_companion.postInit();
7229 			_companion.setPosition(Common::Point(30, 110));
7230 			R2_GLOBALS._walkRegions.disableRegion(1);
7231 			_companion.setup(2008, 3, 1);
7232 			_companion.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
7233 		}
7234 		R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1900;
7235 	} else {
7236 		if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
7237 			_companion.postInit();
7238 			_companion.setPosition(Common::Point(30, 110));
7239 			R2_GLOBALS._walkRegions.disableRegion(1);
7240 			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
7241 				_companion.setup(20, 3, 1);
7242 				_companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
7243 			} else {
7244 				_companion.setup(2008, 3, 1);
7245 				_companion.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
7246 			}
7247 		}
7248 
7249 		if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
7250 			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
7251 				if (R2_GLOBALS._spillLocation[R2_QUINN] == 5) {
7252 					_sceneMode = 1902;
7253 					setAction(&_sequenceManager1, this, 1902, &R2_GLOBALS._player, NULL);
7254 				} else {
7255 					_sceneMode = 1903;
7256 					setAction(&_sequenceManager1, this, 1903, &R2_GLOBALS._player, NULL);
7257 				}
7258 			} else {
7259 				if (R2_GLOBALS._spillLocation[R2_SEEKER] == 5) {
7260 					_sceneMode = 1908;
7261 					setAction(&_sequenceManager1, this, 1908, &R2_GLOBALS._player, NULL);
7262 				} else {
7263 					_sceneMode = 1909;
7264 					setAction(&_sequenceManager1, this, 1909, &R2_GLOBALS._player, NULL);
7265 				}
7266 			}
7267 		} else {
7268 			R2_GLOBALS._player.setPosition(Common::Point(160, 135));
7269 			R2_GLOBALS._player.enableControl();
7270 		}
7271 		R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1900;
7272 	}
7273 
7274 	_elevator.setDetails(Rect(77, 2, 240, 103), 1900, 6, -1, -1, 1, NULL);
7275 	_background.setDetails(Rect(0, 0, 320, 200), 1900, 3, -1, -1, 1, NULL);
7276 }
7277 
remove()7278 void Scene1900::remove() {
7279 	R2_GLOBALS._sound1.fadeOut(NULL);
7280 	SceneExt::remove();
7281 }
7282 
signal()7283 void Scene1900::signal() {
7284 	switch (_sceneMode) {
7285 	case 10:
7286 		R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 5;
7287 		R2_GLOBALS._sceneManager.changeScene(2000);
7288 		break;
7289 	case 11:
7290 		R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 6;
7291 		R2_GLOBALS._sceneManager.changeScene(2000);
7292 		break;
7293 	case 20:
7294 		++_sceneMode;
7295 		R2_GLOBALS._events.setCursor(CURSOR_WALK);
7296 		_stripManager.start(1300, this);
7297 		break;
7298 	case 21:
7299 		++_sceneMode;
7300 		R2_GLOBALS._player.disableControl();
7301 		if (R2_GLOBALS._player._action)
7302 			R2_GLOBALS._player._action->_endHandler = this;
7303 		else
7304 			signal();
7305 		break;
7306 	case 22:
7307 		_sceneMode = 1910;
7308 		_companion.setAction(&_sequenceManager2, this, 1910, &_companion, NULL);
7309 		break;
7310 	case 1904:
7311 		R2_GLOBALS._scene1925CurrLevel = -3;
7312 		// fall through
7313 	case 1905:
7314 		R2_GLOBALS._player.disableControl(CURSOR_WALK);
7315 		R2_GLOBALS._sceneManager.changeScene(1925);
7316 		break;
7317 	case 1910:
7318 		R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 2535);
7319 		R2_GLOBALS._player.disableControl(CURSOR_WALK);
7320 		R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1900;
7321 		R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1900;
7322 		R2_GLOBALS._sceneManager.changeScene(2450);
7323 		break;
7324 	case 1906:
7325 		R2_GLOBALS._scene1925CurrLevel = -3;
7326 		// fall through
7327 	default:
7328 		R2_GLOBALS._player.enableControl();
7329 		break;
7330 	}
7331 }
7332 
7333 /*--------------------------------------------------------------------------
7334  * Scene 1925 - Spill Mountains Elevator Shaft
7335  *
7336  *--------------------------------------------------------------------------*/
7337 
Scene1925()7338 Scene1925::Scene1925() {
7339 	_newSceneMode = 0;
7340 	for (int i = 0; i < 5; i++)
7341 		_levelResNum[i] = 0;
7342 }
7343 
synchronize(Serializer & s)7344 void Scene1925::synchronize(Serializer &s) {
7345 	SceneExt::synchronize(s);
7346 
7347 	s.syncAsSint16LE(_newSceneMode);
7348 	for (int i = 0; i < 5; i++)
7349 		s.syncAsSint16LE(_levelResNum[i]);
7350 }
7351 
startAction(CursorType action,Event & event)7352 bool Scene1925::Button::startAction(CursorType action, Event &event) {
7353 	if (action != CURSOR_USE)
7354 		return SceneHotspot::startAction(action, event);
7355 
7356 	if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100))
7357 		return SceneHotspot::startAction(action, event);
7358 
7359 	Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
7360 
7361 	if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20))
7362 		scene->_sceneMode = 1928;
7363 	else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200))
7364 		scene->_sceneMode = 1929;
7365 	else
7366 		scene->_sceneMode = 1930;
7367 
7368 	R2_GLOBALS._player.disableControl(CURSOR_WALK);
7369 	scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player,
7370 		&scene->_door, NULL);
7371 	return true;
7372 }
7373 
startAction(CursorType action,Event & event)7374 bool Scene1925::Ladder::startAction(CursorType action, Event &event) {
7375 	if ((!R2_GLOBALS.getFlag(29)) || (action != CURSOR_USE))
7376 		return SceneHotspot::startAction(action, event);
7377 
7378 	Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
7379 
7380 	R2_GLOBALS._player.disableControl(CURSOR_USE);
7381 	scene->_sceneMode = 0;
7382 
7383 	if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) {
7384 		scene->_westExit._enabled = false;
7385 		scene->_sceneMode = 1925;
7386 		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
7387 			&R2_GLOBALS._player, &scene->_door, NULL);
7388 		return true;
7389 	}
7390 
7391 	if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20) && (event.mousePos.y >= 30)) {
7392 		scene->_sceneMode = 1931;
7393 	} else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200) && (event.mousePos.y < 140)) {
7394 		scene->_sceneMode = 1932;
7395 	} else if ( (   ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101))
7396 		         || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))
7397 				 ) && (event.mousePos.y >= 100)) {
7398 		scene->_sceneMode = 1926;
7399 	} else if ( (   ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101))
7400 		         || ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))
7401 				 ) && (event.mousePos.y < 60)) {
7402 		scene->_sceneMode = 1927;
7403 	} else {
7404 		R2_GLOBALS._player.enableControl(CURSOR_USE);
7405 		R2_GLOBALS._player._canWalk = false;
7406 	}
7407 
7408 	if (scene->_sceneMode != 0)
7409 		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
7410 
7411 	return true;
7412 }
7413 
changeScene()7414 void Scene1925::ExitUp::changeScene() {
7415 	Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
7416 
7417 	_moving = false;
7418 	R2_GLOBALS._player.disableControl(CURSOR_USE);
7419 	scene->_sceneMode = 0;
7420 
7421 	if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) {
7422 		scene->_westExit._enabled = false;
7423 		scene->_newSceneMode = 1927;
7424 		scene->_sceneMode = 1925;
7425 		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
7426 			&R2_GLOBALS._player, &scene->_door, NULL);
7427 		return;
7428 	}
7429 
7430 	if (   ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101))
7431 		|| ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))) {
7432 		scene->_sceneMode = 1927;
7433 	} else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 200)) {
7434 		scene->_sceneMode = 1932;
7435 	}
7436 
7437 	if (scene->_sceneMode != 0)
7438 		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
7439 	else {
7440 		scene->_sceneMode = 1932;
7441 		scene->signal();
7442 	}
7443 }
7444 
changeScene()7445 void Scene1925::ExitDown::changeScene() {
7446 	Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
7447 
7448 	_moving = false;
7449 	R2_GLOBALS._player.disableControl(CURSOR_USE);
7450 	scene->_sceneMode = 0;
7451 
7452 	if ((R2_GLOBALS._player._position.x == 110) && (R2_GLOBALS._player._position.y == 100)) {
7453 		scene->_westExit._enabled = false;
7454 		scene->_newSceneMode = 1926;
7455 		scene->_sceneMode = 1925;
7456 		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
7457 			&R2_GLOBALS._player, &scene->_door, NULL);
7458 		return;
7459 	}
7460 
7461 	if (   ((R2_GLOBALS._player._position.x == 112) && (R2_GLOBALS._player._position.y == 101))
7462 		|| ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 110))) {
7463 		scene->_sceneMode = 1926;
7464 	} else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 20)) {
7465 		scene->_sceneMode = 1931;
7466 	}
7467 
7468 	if (scene->_sceneMode == 0) {
7469 		scene->_sceneMode = 1931;
7470 		scene->signal();
7471 	} else
7472 		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
7473 }
7474 
changeScene()7475 void Scene1925::WestExit::changeScene() {
7476 	Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
7477 
7478 	_moving = false;
7479 	R2_GLOBALS._player.disableControl(CURSOR_WALK);
7480 	scene->_sceneMode = 1921;
7481 	scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
7482 }
7483 
changeScene()7484 void Scene1925::EastExit::changeScene() {
7485 	Scene1925 *scene = (Scene1925 *)R2_GLOBALS._sceneManager._scene;
7486 
7487 	_moving = false;
7488 	R2_GLOBALS._player.disableControl(CURSOR_WALK);
7489 	scene->_sceneMode = 1920;
7490 	scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
7491 }
7492 
changeLevel(bool upFlag)7493 void Scene1925::changeLevel(bool upFlag) {
7494 	if (R2_GLOBALS._scene1925CurrLevel < 0)
7495 		R2_GLOBALS._scene1925CurrLevel = 3;
7496 
7497 	if (upFlag) {
7498 		R2_GLOBALS._player.setup(1925, 1, 1);
7499 		R2_GLOBALS._player.setPosition(Common::Point(154, 200));
7500 		++R2_GLOBALS._scene1925CurrLevel;
7501 	} else {
7502 		R2_GLOBALS._player.setup(1925, 1, 1);
7503 		R2_GLOBALS._player.setPosition(Common::Point(154, 20));
7504 		R2_GLOBALS._scene1925CurrLevel--;
7505 	}
7506 
7507 	switch (R2_GLOBALS._scene1925CurrLevel) {
7508 	case -1:
7509 		R2_GLOBALS._sceneManager.changeScene(1945);
7510 		return;
7511 		break;
7512 	case 3:
7513 		loadScene(_levelResNum[4]);
7514 		_button.setDetails(Rect(133, 68, 140, 77), 1925, 3, -1, 5, 2, NULL);
7515 		_door.setDetails(1925, 0, 1, 2, 2, (SceneItem *) NULL);
7516 		_door.show();
7517 		break;
7518 	case 512:
7519 		R2_GLOBALS._scene1925CurrLevel = 508;
7520 		// fall through
7521 	default:
7522 		loadScene(_levelResNum[(R2_GLOBALS._scene1925CurrLevel % 4)]);
7523 		R2_GLOBALS._sceneItems.remove(&_button);
7524 		R2_GLOBALS._sceneItems.remove(&_door);
7525 		_door.hide();
7526 		break;
7527 	}
7528 
7529 	R2_GLOBALS._player.enableControl(CURSOR_USE);
7530 	R2_GLOBALS._player._canWalk = false;
7531 }
7532 
postInit(SceneObjectList * OwnerList)7533 void Scene1925::postInit(SceneObjectList *OwnerList) {
7534 	_levelResNum[0] = 1930;
7535 	_levelResNum[1] = 1935;
7536 	_levelResNum[2] = 1940;
7537 	_levelResNum[3] = 1935;
7538 	_levelResNum[4] = 1925;
7539 
7540 	if (R2_GLOBALS.getFlag(29)) {
7541 		if ((R2_GLOBALS._scene1925CurrLevel == -3) || (R2_GLOBALS._scene1925CurrLevel == 3))
7542 			loadScene(_levelResNum[4]);
7543 		else
7544 			loadScene(_levelResNum[R2_GLOBALS._scene1925CurrLevel % 4]);
7545 	} else {
7546 		R2_GLOBALS._scene1925CurrLevel = -2;
7547 		loadScene(1920);
7548 	}
7549 	SceneExt::postInit();
7550 	R2_GLOBALS._sound1.play(220);
7551 	R2_GLOBALS._player.postInit();
7552 	R2_GLOBALS._player.disableControl();
7553 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1925;
7554 	R2_GLOBALS._player._characterIndex = R2_SEEKER;
7555 
7556 	switch (R2_GLOBALS._scene1925CurrLevel) {
7557 	case -2:
7558 		_eastExit.setDetails(Rect(203, 44, 247, 111), EXITCURSOR_E, 1925);
7559 		_ladder.setDetails(Rect(31, 3, 45, 167), 1925, 6, -1, 8, 1, NULL);
7560 		break;
7561 	case 3:
7562 		_door.setDetails(1925, 0, 1, 2, 1, (SceneItem *) NULL);
7563 		_button.setDetails(Rect(133, 68, 140, 77), 1925, 3, -1, 5, 1, NULL);
7564 		// fall through
7565 	case -3:
7566 		_westExit.setDetails(Rect(83, 38, 128, 101), EXITCURSOR_W, 1925);
7567 		// fall through
7568 	default:
7569 		_exitUp.setDetails(Rect(128, 0, 186, 10), EXITCURSOR_N, 1925);
7570 		_exitDown.setDetails(Rect(128, 160, 190, 167), EXITCURSOR_S, 1925);
7571 		_ladder.setDetails(Rect(141, 11, 167, 159),	1925, 6, -1, -1, 1, NULL);
7572 		break;
7573 	}
7574 
7575 	_door.postInit();
7576 	_door.setup(1925, 5, 1);
7577 	_door.setPosition(Common::Point(128, 35));
7578 	_door.hide();
7579 
7580 	if (R2_GLOBALS._scene1925CurrLevel == 3)
7581 		_door.show();
7582 
7583 	R2_GLOBALS._player.enableControl(CURSOR_USE);
7584 	switch (R2_GLOBALS._scene1925CurrLevel) {
7585 	case -2:
7586 		R2_GLOBALS._player.setup(20, 6, 1);
7587 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
7588 		R2_GLOBALS._player.setPosition(Common::Point(224, 109));
7589 		break;
7590 	case -3:
7591 		_door.hide();
7592 		R2_GLOBALS._player.setup(20, 5, 1);
7593 		R2_GLOBALS._player.setPosition(Common::Point(110, 100));
7594 		break;
7595 	case 0:
7596 		R2_GLOBALS._player.setup(1925, 1, 1);
7597 		R2_GLOBALS._player.setPosition(Common::Point(154, 200));
7598 		break;
7599 	default:
7600 		R2_GLOBALS._player.setup(1925, 1, 3);
7601 		R2_GLOBALS._player.setPosition(Common::Point(154, 110));
7602 		break;
7603 	}
7604 
7605 	R2_GLOBALS._player._canWalk = false;
7606 	_newSceneMode = 0;
7607 	R2_GLOBALS._sceneManager._previousScene = 1925;
7608 	_background.setDetails(Rect(27, 0, 292, 200), 1925, 9, -1, -1, 1, NULL);
7609 }
7610 
remove()7611 void Scene1925::remove() {
7612 	R2_GLOBALS._sound1.fadeOut2(NULL);
7613 	R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1925;
7614 	SceneExt::remove();
7615 }
7616 
signal()7617 void Scene1925::signal() {
7618 	switch (_sceneMode) {
7619 	case 1920:
7620 	// No break on purpose
7621 	case 1921:
7622 	// No break on purpose
7623 	case 1928:
7624 	// No break on purpose
7625 	case 1929:
7626 	// No break on purpose
7627 	case 1930:
7628 		R2_GLOBALS._scene1925CurrLevel = -3;
7629 		R2_GLOBALS._sceneManager.changeScene(1900);
7630 		break;
7631 	case 1926:
7632 	// No break on purpose
7633 	case 1931:
7634 		// Change level, down
7635 		changeLevel(false);
7636 		break;
7637 	case 1927:
7638 	// No break on purpose
7639 	case 1932:
7640 		// Change level, up
7641 		changeLevel(true);
7642 		break;
7643 	case 1925:
7644 		_westExit._enabled = false;
7645 		if (_newSceneMode != 0) {
7646 			_sceneMode = _newSceneMode;
7647 			_newSceneMode = 0;
7648 			setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
7649 		}
7650 		// fall through
7651 	default:
7652 		R2_GLOBALS._player.enableControl(CURSOR_USE);
7653 		break;
7654 	}
7655 
7656 	R2_GLOBALS._player._canWalk = false;
7657 }
7658 
7659 /*--------------------------------------------------------------------------
7660  * Scene 1945 - Spill Mountains Shaft Bottom
7661  *
7662  *--------------------------------------------------------------------------*/
7663 
Scene1945()7664 Scene1945::Scene1945() {
7665 	_nextSceneMode1 = 0;
7666 	_nextSceneMode2 = 0;
7667 	_lampUsed = CURSOR_NONE;
7668 }
7669 
synchronize(Serializer & s)7670 void Scene1945::synchronize(Serializer &s) {
7671 	SceneExt::synchronize(s);
7672 
7673 	s.syncAsSint16LE(_nextSceneMode1);
7674 	s.syncAsSint16LE(_nextSceneMode2);
7675 	s.syncAsSint16LE(_lampUsed);
7676 }
7677 
startAction(CursorType action,Event & event)7678 bool Scene1945::Ice::startAction(CursorType action, Event &event) {
7679 	Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
7680 
7681 	switch (action) {
7682 	case R2_GUNPOWDER:
7683 		R2_GLOBALS._player.disableControl();
7684 		scene->_sceneMode = 0;
7685 		if ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142))
7686 			scene->_sceneMode = 1942;
7687 		else {
7688 			scene->_sceneMode = 1940;
7689 			scene->_nextSceneMode1 = 1942;
7690 		}
7691 		// At this point the original check if _sceneMode != 0. Skipped.
7692 		scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_gunpowder, NULL);
7693 		return true;
7694 		break;
7695 	case CURSOR_USE:
7696 		R2_GLOBALS._player.disableControl(CURSOR_USE);
7697 		scene->_sceneMode = 0;
7698 		if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50) && (event.mousePos.x >= 130)) {
7699 			scene->_sceneMode = 1940;
7700 			// At this point the original check if _sceneMode != 0. Skipped.
7701 			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
7702 			return true;
7703 		} else {
7704 			R2_GLOBALS._player.enableControl(CURSOR_USE);
7705 			R2_GLOBALS._player._canWalk = false;
7706 			if (event.mousePos.x > 130)
7707 				scene->_ice.setDetails(1945, 3, -1, -1, 3, (SceneItem *) NULL);
7708 			else
7709 				scene->_ice.setDetails(1945, 3, -1, 5, 3, (SceneItem *) NULL);
7710 		}
7711 		// fall through
7712 	default:
7713 		return SceneHotspot::startAction(action, event);
7714 		break;
7715 	}
7716 }
7717 
startAction(CursorType action,Event & event)7718 bool Scene1945::Ladder::startAction(CursorType action, Event &event) {
7719 	if (action != CURSOR_USE)
7720 		return SceneHotspot::startAction(action, event);
7721 
7722 	Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
7723 
7724 	R2_GLOBALS._player.disableControl(CURSOR_USE);
7725 	scene->_sceneMode = 0;
7726 
7727 	if ((R2_GLOBALS._player._position.x == 221) && (R2_GLOBALS._player._position.y == 142)) {
7728 		scene->_sceneMode = 1949;
7729 		scene->_nextSceneMode1 = 1947;
7730 	} else if (  ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158))
7731 		      || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) {
7732 		scene->_sceneMode = 1947;
7733 	} else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50)
7734 			&& (event.mousePos.y >= 30)) {
7735 		scene->_sceneMode = 1940;
7736 	} else {
7737 		R2_GLOBALS._player.enableControl(CURSOR_USE);
7738 		R2_GLOBALS._player._canWalk = false;
7739 	}
7740 
7741 	if (scene->_sceneMode != 0)
7742 		scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
7743 
7744 	return true;
7745 }
7746 
startAction(CursorType action,Event & event)7747 bool Scene1945::Gunpowder::startAction(CursorType action, Event &event) {
7748 	if ((action == R2_ALCOHOL_LAMP_3) || (action == R2_ALCOHOL_LAMP_2)) {
7749 		Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
7750 
7751 		scene->_lampUsed = action;
7752 		R2_GLOBALS._player.disableControl();
7753 		scene->_sceneMode = 0;
7754 		if ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) {
7755 			scene->_sceneMode= 1947;
7756 			scene->_nextSceneMode1 = 1943;
7757 		} else if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50)) {
7758 			scene->_sceneMode = 1940;
7759 			scene->_nextSceneMode1 = 1943;
7760 		} else {
7761 			scene->_sceneMode = 1949;
7762 			scene->_nextSceneMode1 = 1947;
7763 			scene->_nextSceneMode2 = 1943;
7764 		}
7765 		// At this point the original check if _sceneMode != 0. Skipped.
7766 		scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
7767 		return true;
7768 	} else {
7769 		return SceneActor::startAction(action, event);
7770 	}
7771 }
7772 
changeScene()7773 void Scene1945::ExitUp::changeScene() {
7774 	Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
7775 
7776 	_moving = false;
7777 	R2_GLOBALS._player.disableControl(CURSOR_USE);
7778 	scene->_sceneMode = 0;
7779 
7780 	if ((R2_GLOBALS._player._position.x == 221) && (R2_GLOBALS._player._position.y == 142)) {
7781 		scene->_sceneMode = 1949;
7782 		scene->_nextSceneMode1 = 1947;
7783 	} else if (  ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158))
7784 		      || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) {
7785 		scene->_sceneMode = 1947;
7786 	}
7787 
7788 	if (scene->_sceneMode == 0) {
7789 		scene->_sceneMode = 1941;
7790 		signal();
7791 	} else {
7792 		scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
7793 	}
7794 }
7795 
changeScene()7796 void Scene1945::CorridorExit::changeScene() {
7797 	Scene1945 *scene = (Scene1945 *)R2_GLOBALS._sceneManager._scene;
7798 
7799 	_moving = false;
7800 	R2_GLOBALS._player.disableControl(CURSOR_USE);
7801 	scene->_sceneMode = 0;
7802 
7803 	if ((R2_GLOBALS._player._position.x == 154) && (R2_GLOBALS._player._position.y == 50)) {
7804 		scene->_sceneMode = 1940;
7805 		scene->_nextSceneMode1 = 1945;
7806 	} else if (  ((R2_GLOBALS._player._position.x == 197) && (R2_GLOBALS._player._position.y == 158))
7807 		      || ((R2_GLOBALS._player._position.x == 191) && (R2_GLOBALS._player._position.y == 142)) ) {
7808 		scene->_sceneMode = 1945;
7809 	}
7810 
7811 	if (scene->_sceneMode != 0)
7812 		scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
7813 }
7814 
postInit(SceneObjectList * OwnerList)7815 void Scene1945::postInit(SceneObjectList *OwnerList) {
7816 	loadScene(1945);
7817 	SceneExt::postInit();
7818 	R2_GLOBALS._sound1.play(220);
7819 
7820 	R2_GLOBALS._player.postInit();
7821 	R2_GLOBALS._player.enableControl(CURSOR_USE);
7822 	R2_GLOBALS._player._canWalk = false;
7823 	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1945;
7824 	R2_GLOBALS._player._characterIndex = R2_SEEKER;
7825 
7826 	_exitUp.setDetails(Rect(128, 0, 186, 10), EXITCURSOR_N, 1945);
7827 	_corridorExit.setDetails(Rect(238, 144, 274, 167), EXITCURSOR_E, 1945);
7828 
7829 	_ladder.setDetails(Rect(141, 3, 167, 126), 1945, 9, -1, -1, 1, NULL);
7830 
7831 	if (!R2_GLOBALS.getFlag(43)) {
7832 		_corridorExit._enabled = false;
7833 		_gunpowder.postInit();
7834 		_gunpowder.setup(1945, 4, 1);
7835 		_gunpowder.setPosition(Common::Point(253, 169));
7836 		_gunpowder.fixPriority(150);
7837 
7838 		if (R2_GLOBALS.getFlag(42))
7839 			_gunpowder.setDetails(1945, 15, -1, -1, 1, (SceneItem *) NULL);
7840 		else
7841 			_gunpowder.hide();
7842 
7843 		_coveringIce.postInit();
7844 		_coveringIce.setup(1945, 8, 1);
7845 		_coveringIce.setPosition(Common::Point(253, 169));
7846 		_coveringIce.fixPriority(130);
7847 
7848 		_alcoholLamp.postInit();
7849 		_alcoholLamp.setup(1945, 3, 1);
7850 		_alcoholLamp.hide();
7851 	} else {
7852 		_corridorExit._enabled = true;
7853 	}
7854 
7855 	switch (R2_GLOBALS._sceneManager._previousScene) {
7856 	case 1925:
7857 		R2_GLOBALS._scene1925CurrLevel = 0;
7858 		R2_GLOBALS.clearFlag(29);
7859 		R2_GLOBALS._player.setup(1925, 1, 10);
7860 		R2_GLOBALS._player.setPosition(Common::Point(154, 50));
7861 		break;
7862 	case 1950:
7863 		_sceneMode = 1944;
7864 		setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
7865 		R2_GLOBALS._player.disableControl(CURSOR_USE);
7866 		break;
7867 	default:
7868 		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
7869 		R2_GLOBALS._player.setup(20, 5, 1);
7870 		R2_GLOBALS._player.setPosition(Common::Point(191, 142));
7871 		break;
7872 	}
7873 
7874 	R2_GLOBALS._player._canWalk = false;
7875 	_nextSceneMode1 = 0;
7876 	_nextSceneMode2 = 0;
7877 
7878 	_ice.setDetails(11, 1945, 3, -1, 5);
7879 	_hole.setDetails(Rect(238, 144, 274, 167), 1945, 0, -1, 2, 1, NULL);
7880 	_ice2.setDetails(Rect(27, 3, 292, 167), 1945, 3, -1, -1, 1, NULL);
7881 }
7882 
remove()7883 void Scene1945::remove() {
7884 	R2_GLOBALS._sound1.fadeOut2(NULL);
7885 	SceneExt::remove();
7886 }
7887 
signal()7888 void Scene1945::signal() {
7889 	switch (_sceneMode) {
7890 	case 1940:
7891 		if (_nextSceneMode1 == 1943) {
7892 			_sceneMode = _nextSceneMode1;
7893 			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL);
7894 		} else {
7895 			_sceneMode = 1946;
7896 			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
7897 		}
7898 		return;
7899 		break;
7900 	case 1941:
7901 		if (_nextSceneMode1 == 0) {
7902 			R2_GLOBALS._scene1925CurrLevel = 0;
7903 			R2_GLOBALS.setFlag(29);
7904 			R2_GLOBALS._sceneManager.changeScene(1925);
7905 		} else {
7906 			_sceneMode = _nextSceneMode1;
7907 			_nextSceneMode1 = 0;
7908 			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
7909 		}
7910 		return;
7911 	case 1942:
7912 		R2_INVENTORY.setObjectScene(R2_GUNPOWDER, 0);
7913 		_gunpowder.setDetails(1945, 15, -1, -1, 2, (SceneItem *) NULL);
7914 		R2_GLOBALS.setFlag(42);
7915 		break;
7916 	case 1943:
7917 		R2_GLOBALS._sound1.fadeOut2(NULL);
7918 		R2_INVENTORY.setObjectScene(_lampUsed, 0);
7919 		_sceneMode = 1948;
7920 		setAction(&_sequenceManager1, this, _sceneMode, &_gunpowder, &_alcoholLamp, &_coveringIce, NULL);
7921 		R2_GLOBALS._player.setAction(&_sequenceManager2, NULL, 1941, &R2_GLOBALS._player, NULL);
7922 		return;
7923 	case 1944:
7924 		break;
7925 	case 1945:
7926 		R2_GLOBALS._sceneManager.changeScene(1950);
7927 		return;
7928 	case 1946:
7929 		if (_nextSceneMode1 == 1942) {
7930 			_sceneMode = _nextSceneMode1;
7931 			_nextSceneMode1 = 0;
7932 			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_gunpowder, NULL);
7933 			return;
7934 		}
7935 		_sceneMode = 0;
7936 		break;
7937 	case 1947:
7938 		if (_nextSceneMode1 == 1943) {
7939 			_sceneMode = _nextSceneMode1;
7940 			_nextSceneMode1 = 1948;
7941 			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL);
7942 		} else {
7943 			_sceneMode = 1941;
7944 			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
7945 		}
7946 		return;
7947 	case 1948:
7948 		R2_GLOBALS._sound1.play(220);
7949 		_corridorExit._enabled = true;
7950 		R2_GLOBALS._sceneItems.remove(&_gunpowder);
7951 		R2_GLOBALS.clearFlag(42);
7952 		R2_GLOBALS.setFlag(43);
7953 		_nextSceneMode1 = 1940;
7954 		// fall through
7955 	case 1949:
7956 		_sceneMode = _nextSceneMode1;
7957 		if (_nextSceneMode2 == 1943) {
7958 			_nextSceneMode1 = _nextSceneMode2;
7959 			_nextSceneMode2 = 0;
7960 			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_alcoholLamp, NULL);
7961 		} else {
7962 			_nextSceneMode1 = 0;
7963 			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, NULL);
7964 		}
7965 		return;
7966 	default:
7967 		break;
7968 	}
7969 
7970 	R2_GLOBALS._player.enableControl(CURSOR_USE);
7971 	R2_GLOBALS._player._canWalk = false;
7972 }
7973 
7974 } // End of namespace Ringworld2
7975 } // End of namespace TsAGE
7976