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