1 /* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 *
21 */
22
23 #include "tsage/scenes.h"
24 #include "tsage/tsage.h"
25 #include "tsage/staticres.h"
26 #include "tsage/ringworld2/ringworld2_scenes2.h"
27
28 namespace TsAGE {
29
30 namespace Ringworld2 {
31
32 /*--------------------------------------------------------------------------
33 * Scene 2000 - Spill Mountains
34 *
35 *--------------------------------------------------------------------------*/
36
initPlayer()37 void Scene2000::initPlayer() {
38 R2_GLOBALS._events.setCursor(CURSOR_WALK);
39 R2_GLOBALS._player.disableControl();
40
41 switch (_mazePlayerMode) {
42 case 0:
43 R2_GLOBALS._player.setStrip(5);
44 if (_westExit._enabled) {
45 if (_eastExit._enabled)
46 R2_GLOBALS._player.setPosition(Common::Point(140, 129));
47 else
48 R2_GLOBALS._player.setPosition(Common::Point(20, 129));
49 } else
50 R2_GLOBALS._player.setPosition(Common::Point(245, 129));
51 R2_GLOBALS._player.enableControl();
52 break;
53 case 1:
54 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
55 _sceneMode = 2001;
56 else
57 _sceneMode = 2021;
58 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
59 break;
60 case 2:
61 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
62 _sceneMode = 2002;
63 else
64 _sceneMode = 2022;
65 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
66 break;
67 case 3:
68 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
69 _sceneMode = 2000;
70 else
71 _sceneMode = 2020;
72 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
73 break;
74 case 4:
75 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
76 _sceneMode = 2005;
77 else
78 _sceneMode = 2025;
79 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
80 break;
81 case 5:
82 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
83 _sceneMode = 2004;
84 else
85 _sceneMode = 2024;
86 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
87 break;
88 case 6:
89 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
90 _sceneMode = 2009;
91 else
92 _sceneMode = 2029;
93 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
94 break;
95 case 7:
96 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
97 _sceneMode = 2008;
98 else
99 _sceneMode = 2028;
100 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
101 break;
102 case 8:
103 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
104 _sceneMode = 2013;
105 else
106 _sceneMode = 2033;
107 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
108 break;
109 case 9:
110 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
111 _sceneMode = 2012;
112 else
113 _sceneMode = 2032;
114 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
115 break;
116 case 10:
117 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
118 _sceneMode = 2016;
119 else
120 _sceneMode = 2036;
121 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
122 break;
123 case 11:
124 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
125 _sceneMode = 2038;
126 else
127 _sceneMode = 2040;
128 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
129 break;
130 default:
131 break;
132 }
133 for (int i = 0; i < 11; i++) {
134 if (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] == R2_GLOBALS._spillLocation[3 + i])
135 _persons[i].show();
136 }
137
138 if ((R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER])
139 && (R2_GLOBALS._spillLocation[R2_QUINN] == R2_GLOBALS._spillLocation[R2_SEEKER])) {
140 _companion.postInit();
141 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
142 // Seeker is in room with Quinn
143 _companion.setup(20, 5, 1);
144 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
145 } else {
146 // Quinn is in room with Seeker
147 _companion.setup(2008, 5, 1);
148 _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
149 }
150 if (_westExit._enabled) {
151 if (_eastExit._enabled)
152 _companion.setPosition(Common::Point(180, 128));
153 else
154 _companion.setPosition(Common::Point(75, 128));
155 } else
156 _companion.setPosition(Common::Point(300, 128));
157 }
158 }
159
initExits()160 void Scene2000::initExits() {
161 _westExit._enabled = true;
162 _eastExit._enabled = true;
163 _southExit._enabled = false;
164 _northExit._enabled = false;
165 _doorExit._enabled = false;
166
167 _westExit._insideArea = false;
168 _eastExit._insideArea = false;
169 _southExit._insideArea = false;
170 _northExit._insideArea = false;
171 _doorExit._insideArea = false;
172
173 _westExit._moving = false;
174 _eastExit._moving = false;
175 _southExit._moving = false;
176 _northExit._moving = false;
177 _doorExit._moving = false;
178
179 for (int i = 0; i < 11; i++)
180 _persons[i].hide();
181
182 _companion.remove();
183
184 switch (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex]) {
185 case 3:
186 case 10:
187 case 16:
188 case 21:
189 _doorExit._enabled = true;
190 _doorExit._bounds.set(61, 68, 90, 125);
191 _doorExit.setDest(Common::Point(92, 129));
192 _doorExit._cursorNum = EXITCURSOR_W;
193 break;
194 case 4:
195 case 12:
196 case 25:
197 case 34:
198 _doorExit._enabled = true;
199 _doorExit._bounds.set(230, 68, 259, 125);
200 _doorExit.setDest(Common::Point(244, 129));
201 _doorExit._cursorNum = EXITCURSOR_E;
202 break;
203 default:
204 break;
205 }
206
207 switch (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] - 1) {
208 case 0:
209 case 6:
210 case 13:
211 case 18:
212 case 22:
213 case 27:
214 case 30:
215 _westExit._enabled = false;
216 loadScene(2225);
217 R2_GLOBALS._walkRegions.load(2225);
218 if (!_exitingFlag)
219 _mazePlayerMode = 0;
220 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
221 break;
222 case 1:
223 case 19:
224 _southExit._enabled = true;
225 _southExit._bounds.set(71, 130, 154, 168);
226 _southExit.setDest(Common::Point(94, 129));
227 _southExit._cursorNum = EXITCURSOR_SE;
228 loadScene(2300);
229 if (!_exitingFlag)
230 _mazePlayerMode = 0;
231 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
232 R2_GLOBALS._walkRegions.load(2000);
233 break;
234 case 2:
235 case 9:
236 case 15:
237 case 20:
238 loadScene(2150);
239 R2_GLOBALS._walkRegions.load(2000);
240 switch(R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) {
241 case 2400:
242 _mazePlayerMode = 1;
243 break;
244 case 2425:
245 case 2430:
246 case 2435:
247 case 2450:
248 _mazePlayerMode = 3;
249 break;
250 default:
251 if (!_exitingFlag)
252 _mazePlayerMode = 0;
253 break;
254 }
255 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
256 R2_GLOBALS._sceneManager._previousScene = 2000;
257 break;
258 case 3:
259 case 11:
260 case 24:
261 case 33:
262 loadScene(2175);
263 R2_GLOBALS._walkRegions.load(2000);
264 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
265 if (!_exitingFlag)
266 _mazePlayerMode = 0;
267 } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2350)
268 _mazePlayerMode = 1;
269 else
270 _mazePlayerMode = 10;
271 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
272 R2_GLOBALS._sceneManager._previousScene = 2000;
273 break;
274 case 4:
275 case 8:
276 loadScene(2000);
277 R2_GLOBALS._walkRegions.load(2000);
278 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1900)
279 _mazePlayerMode = 1;
280 else if (!_exitingFlag)
281 _mazePlayerMode = 0;
282 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
283 R2_GLOBALS._sceneManager._previousScene = 2000;
284 break;
285 case 5:
286 case 12:
287 case 17:
288 case 21:
289 case 26:
290 loadScene(2200);
291 R2_GLOBALS._walkRegions.load(2200);
292 _eastExit._enabled = false;
293 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1900)
294 _mazePlayerMode = 2;
295 else if (!_exitingFlag)
296 _mazePlayerMode = 0;
297 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
298 R2_GLOBALS._sceneManager._previousScene = 2000;
299 break;
300 case 7:
301 case 29:
302 _northExit._enabled = true;
303 _northExit._bounds.set(138, 83, 211, 125);
304 _northExit.setDest(Common::Point(188, 129));
305 _northExit._cursorNum = EXITCURSOR_NW;
306 loadScene(2250);
307 R2_GLOBALS._walkRegions.load(2000);
308 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2500)
309 _mazePlayerMode = 1;
310 else if (!_exitingFlag)
311 _mazePlayerMode = 0;
312 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
313 R2_GLOBALS._sceneManager._previousScene = 2000;
314 break;
315 case 10:
316 case 25:
317 _southExit._enabled = true;
318 _southExit._bounds.set(78, 130, 148, 168);
319 _southExit.setDest(Common::Point(100, 129));
320 _southExit._cursorNum = EXITCURSOR_SE;
321 loadScene(2075);
322 R2_GLOBALS._walkRegions.load(2000);
323 if (!_exitingFlag)
324 _mazePlayerMode = 0;
325 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
326 break;
327 case 14:
328 _southExit._enabled = true;
329 _southExit._bounds.set(160, 130, 248, 168);
330 _southExit.setDest(Common::Point(225, 129));
331 _southExit._cursorNum = EXITCURSOR_SW;
332 loadScene(2325);
333 R2_GLOBALS._walkRegions.load(2000);
334 if (!_exitingFlag)
335 _mazePlayerMode = 0;
336 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
337 break;
338 case 16:
339 case 31:
340 _northExit._enabled = true;
341 _northExit._bounds.set(122, 83, 207, 125);
342 _northExit.setDest(Common::Point(210, 129));
343 _northExit._cursorNum = EXITCURSOR_NW;
344 loadScene(2125);
345 R2_GLOBALS._walkRegions.load(2000);
346 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2400)
347 _mazePlayerMode = 2;
348 else if (!_exitingFlag)
349 _mazePlayerMode = 0;
350 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
351 R2_GLOBALS._sceneManager._previousScene = 2000;
352 break;
353 case 23:
354 _northExit._enabled = true;
355 _northExit._bounds.set(108, 83, 184, 125);
356 _northExit.setDest(Common::Point(135, 129));
357 _northExit._cursorNum = EXITCURSOR_NE;
358 loadScene(2275);
359 R2_GLOBALS._walkRegions.load(2000);
360 if (!_exitingFlag)
361 _mazePlayerMode = 0;
362 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
363 break;
364 case 28:
365 _southExit._enabled = true;
366 _southExit._bounds.set(171, 130, 241, 168);
367 _southExit.setDest(Common::Point(218, 129));
368 _southExit._cursorNum = EXITCURSOR_SW;
369 loadScene(2050);
370 R2_GLOBALS._walkRegions.load(2000);
371 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2350)
372 _mazePlayerMode = 11;
373 else if (!_exitingFlag)
374 _mazePlayerMode = 0;
375 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
376 break;
377 case 32:
378 loadScene(2025);
379 R2_GLOBALS._walkRegions.load(2000);
380 if (!_exitingFlag)
381 _mazePlayerMode = 0;
382 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000;
383 break;
384 default:
385 break;
386 }
387 _exitingFlag = false;
388 R2_GLOBALS._uiElements.show();
389 }
390
signal()391 void Scene2000::Action1::signal() {
392 Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
393
394 switch (_actionIndex) {
395 case 0: {
396 _actionIndex = 1;
397 Common::Point pt(-20, 127);
398 NpcMover *mover = new NpcMover();
399 scene->_persons[_state].addMover(mover, &pt, scene);
400 break;
401 }
402 case 1:
403 scene->_persons[_state].setPosition(Common::Point(340, 127));
404 --R2_GLOBALS._spillLocation[4 + _state];
405 _actionIndex = 0;
406 switch (_state - 1) {
407 case 0:
408 if (R2_GLOBALS._spillLocation[4] == 1)
409 _actionIndex = 10;
410 break;
411 case 2:
412 if (R2_GLOBALS._spillLocation[6] == 7)
413 _actionIndex = 10;
414 break;
415 case 4:
416 if (R2_GLOBALS._spillLocation[8] == 14)
417 _actionIndex = 10;
418 break;
419 case 6:
420 if (R2_GLOBALS._spillLocation[10] == 19)
421 _actionIndex = 10;
422 break;
423 case 7:
424 if (R2_GLOBALS._spillLocation[11] == 23)
425 _actionIndex = 10;
426 break;
427 default:
428 break;
429 }
430
431 if (R2_GLOBALS._spillLocation[3 + _state] == R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex])
432 scene->_persons[_state].show();
433 else
434 scene->_persons[_state].hide();
435
436 signal();
437 break;
438 case 5: {
439 _actionIndex = 6;
440 Common::Point pt(340, 127);
441 NpcMover *mover = new NpcMover();
442 scene->_persons[_state].addMover(mover, &pt, this);
443 break;
444 }
445 case 6:
446 scene->_persons[_state].setPosition(Common::Point(-20, 127));
447 ++R2_GLOBALS._spillLocation[3 + _state];
448 _actionIndex = 5;
449 switch (_state - 1) {
450 case 0:
451 if (R2_GLOBALS._spillLocation[4] == 5)
452 _actionIndex = 15;
453 break;
454 case 2:
455 if (R2_GLOBALS._spillLocation[6] == 13)
456 _actionIndex = 15;
457 break;
458 case 4:
459 if (R2_GLOBALS._spillLocation[8] == 16)
460 _actionIndex = 15;
461 break;
462 case 6:
463 if (R2_GLOBALS._spillLocation[10] == 22)
464 _actionIndex = 15;
465 break;
466 case 7:
467 if (R2_GLOBALS._spillLocation[11] == 27)
468 _actionIndex = 15;
469 break;
470 default:
471 break;
472 }
473
474 if (R2_GLOBALS._spillLocation[3 + _state] == R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex])
475 scene->_persons[_state].show();
476 else
477 scene->_persons[_state].hide();
478
479 signal();
480 break;
481 case 10: {
482 Common::Point pt(290, 127);
483 NpcMover *mover = new NpcMover();
484 scene->_persons[_state].addMover(mover, &pt, this);
485 _actionIndex = 11;
486 break;
487 }
488 case 11:
489 if (_state == 1)
490 scene->_persons[0].setStrip(1);
491 else if (_state == 5)
492 scene->_persons[4].setStrip(1);
493 setDelay(600);
494 _actionIndex = 12;
495 break;
496 case 12:
497 if (_state == 1)
498 scene->_persons[0].setStrip(2);
499 else if (_state == 5)
500 scene->_persons[4].setStrip(2);
501 scene->_persons[_state].setStrip(1);
502 _actionIndex = 5;
503 signal();
504 break;
505 case 15:
506 if ((R2_GLOBALS._spillLocation[3 + _state] == 13) || (R2_GLOBALS._spillLocation[3 + _state] == 22) || (R2_GLOBALS._spillLocation[3 + _state] == 27)) {
507 Common::Point pt(30, 127);
508 NpcMover *mover = new NpcMover();
509 scene->_persons[_state].addMover(mover, &pt, this);
510 _actionIndex = 16;
511 } else {
512 Common::Point pt(120, 127);
513 NpcMover *mover = new NpcMover();
514 scene->_persons[_state].addMover(mover, &pt, this);
515 _actionIndex = 16;
516 }
517 break;
518 case 16:
519 if (_state == 1)
520 scene->_persons[2].setStrip(2);
521 else if (_state == 8)
522 scene->_persons[9].setStrip(2);
523 setDelay(600);
524 _actionIndex = 17;
525 break;
526 case 17:
527 if (_state == 1)
528 scene->_persons[2].setStrip(1);
529 else if (_state == 8)
530 scene->_persons[9].setStrip(1);
531 scene->_persons[_state].setStrip(2);
532 _actionIndex = 0;
533 break;
534 case 99:
535 error("99");
536 break;
537 default:
538 break;
539 }
540 }
541
changeScene()542 void Scene2000::WestExit::changeScene() {
543 Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
544
545 scene->_exitingFlag = true;
546 _enabled = false;
547 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
548 scene->_sceneMode = 10;
549
550 Common::Point pt(-10, 129);
551 NpcMover *mover = new NpcMover();
552 R2_GLOBALS._player.addMover(mover, &pt, scene);
553 }
554
changeScene()555 void Scene2000::EastExit::changeScene() {
556 Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
557
558 scene->_exitingFlag = true;
559 _enabled = false;
560 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
561 scene->_sceneMode = 11;
562
563 Common::Point pt(330, 129);
564 NpcMover *mover = new NpcMover();
565 R2_GLOBALS._player.addMover(mover, &pt, scene);
566 }
567
changeScene()568 void Scene2000::SouthExit::changeScene() {
569 Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
570
571 scene->_exitingFlag = true;
572 _enabled = false;
573 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
574 scene->_sceneMode = 12;
575
576 switch (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex]) {
577 case 2:
578 scene->_mazePlayerMode = 4;
579 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 8;
580 break;
581 case 11:
582 scene->_mazePlayerMode = 6;
583 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 17;
584 break;
585 case 15:
586 scene->_mazePlayerMode = 8;
587 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 24;
588 break;
589 case 20:
590 scene->_mazePlayerMode = 4;
591 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 30;
592 break;
593 case 26:
594 scene->_mazePlayerMode = 6;
595 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 32;
596 break;
597 case 29:
598 scene->_mazePlayerMode = 11;
599 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 29;
600 break;
601 default:
602 break;
603 }
604
605 switch (scene->_mazePlayerMode) {
606 case 4:
607 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
608 scene->setAction(&scene->_sequenceManager, scene, 2003, &R2_GLOBALS._player, NULL);
609 else
610 scene->setAction(&scene->_sequenceManager, scene, 2023, &R2_GLOBALS._player, NULL);
611 break;
612 case 6:
613 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
614 scene->setAction(&scene->_sequenceManager, scene, 2007, &R2_GLOBALS._player, NULL);
615 else
616 scene->setAction(&scene->_sequenceManager, scene, 2027, &R2_GLOBALS._player, NULL);
617 break;
618 case 8:
619 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
620 scene->setAction(&scene->_sequenceManager, scene, 2011, &R2_GLOBALS._player, NULL);
621 else
622 scene->setAction(&scene->_sequenceManager, scene, 2031, &R2_GLOBALS._player, NULL);
623 break;
624 case 11:
625 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
626 scene->_sceneMode = 2039;
627 else
628 scene->_sceneMode = 2041;
629 scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL);
630 break;
631
632 default:
633 break;
634 }
635 }
636
changeScene()637 void Scene2000::NorthExit::changeScene() {
638 Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
639
640 scene->_exitingFlag = true;
641 _enabled = false;
642 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
643 scene->_sceneMode = 13;
644
645 switch (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex]) {
646 case 8:
647 scene->_mazePlayerMode = 5;
648 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 2;
649 break;
650 case 17:
651 scene->_mazePlayerMode = 7;
652 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 11;
653 break;
654 case 24:
655 scene->_mazePlayerMode = 9;
656 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 15;
657 break;
658 case 30:
659 scene->_mazePlayerMode = 5;
660 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 20;
661 break;
662 case 32:
663 scene->_mazePlayerMode = 7;
664 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 26;
665 break;
666 default:
667 break;
668 }
669
670 switch (scene->_mazePlayerMode) {
671 case 5:
672 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
673 scene->setAction(&scene->_sequenceManager, scene, 2006, &R2_GLOBALS._player, NULL);
674 else
675 scene->setAction(&scene->_sequenceManager, scene, 2026, &R2_GLOBALS._player, NULL);
676 break;
677 case 7:
678 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
679 scene->setAction(&scene->_sequenceManager, scene, 2010, &R2_GLOBALS._player, NULL);
680 else
681 scene->setAction(&scene->_sequenceManager, scene, 2030, &R2_GLOBALS._player, NULL);
682 break;
683 case 9:
684 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
685 scene->setAction(&scene->_sequenceManager, scene, 2014, &R2_GLOBALS._player, NULL);
686 else
687 scene->setAction(&scene->_sequenceManager, scene, 2034, &R2_GLOBALS._player, NULL);
688 break;
689 default:
690 break;
691 }
692 }
693
changeScene()694 void Scene2000::DoorExit::changeScene() {
695 Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene;
696
697 _enabled = false;
698 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
699 scene->_sceneMode = 14;
700
701 switch (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex]) {
702 case 3:
703 scene->_mazePlayerMode = 1;
704 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
705 scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL);
706 else
707 scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL);
708 break;
709 case 4:
710 scene->_mazePlayerMode = 7;
711 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
712 scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL);
713 else
714 scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL);
715 break;
716 case 10:
717 scene->_mazePlayerMode = 8;
718 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
719 scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL);
720 else
721 scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL);
722 break;
723 case 12:
724 scene->_mazePlayerMode = 3;
725 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
726 scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL);
727 else
728 scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL);
729 break;
730 case 16:
731 scene->_mazePlayerMode = 4;
732 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
733 scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL);
734 else
735 scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL);
736 break;
737 case 21:
738 scene->_mazePlayerMode = 5;
739 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
740 scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL);
741 else
742 scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL);
743 break;
744 case 25:
745 scene->_mazePlayerMode = 2;
746 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
747 scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL);
748 else
749 scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL);
750 break;
751 case 34:
752 scene->_mazePlayerMode = 6;
753 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
754 scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL);
755 else
756 scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL);
757 break;
758 default:
759 break;
760 }
761 }
762
Scene2000()763 Scene2000::Scene2000(): SceneExt() {
764 if (R2_GLOBALS._sceneManager._previousScene == -1) {
765 R2_GLOBALS._spillLocation[R2_QUINN] = 21;
766 R2_GLOBALS._spillLocation[R2_SEEKER] = 21;
767 }
768 if ((R2_GLOBALS._player._characterScene[R2_GLOBALS._player._characterIndex]
769 != R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex])
770 && (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 2350)) {
771 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 0;
772 }
773
774 _exitingFlag = false;
775 _mazePlayerMode = 0;
776 }
777
postInit(SceneObjectList * OwnerList)778 void Scene2000::postInit(SceneObjectList *OwnerList) {
779 _westExit.setDetails(Rect(0, 100, 14, 140), EXITCURSOR_W, 2000);
780 _westExit.setDest(Common::Point(14, 129));
781 _eastExit.setDetails(Rect(305, 100, 320, 140), EXITCURSOR_E, 2000);
782 _eastExit.setDest(Common::Point(315, 129));
783 _southExit.setDetails(Rect(71, 130, 154, 168), EXITCURSOR_S, 2000);
784 _southExit.setDest(Common::Point(94, 129));
785 _northExit.setDetails(Rect(138, 83, 211, 125), EXITCURSOR_N, 2000);
786 _northExit.setDest(Common::Point(188, 129));
787 _doorExit.setDetails(Rect(61, 68, 90, 125), EXITCURSOR_W, 2000);
788 _doorExit.setDest(Common::Point(92, 129));
789
790 R2_GLOBALS._sound1.play(200);
791 initExits();
792 g_globals->_sceneManager._fadeMode = FADEMODE_IMMEDIATE;
793
794 R2_GLOBALS._player.postInit();
795 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
796
797 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
798 R2_GLOBALS._player.setup(2008, 3, 1);
799 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
800 } else {
801 R2_GLOBALS._player.setup(20, 3, 1);
802 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
803 }
804
805 _action1._state = 8;
806 _action2._state = 1;
807 _action3._state = 5;
808 _action4._state = 7;
809 _action5._state = 3;
810
811 for (int i = 0; i < 11; i++)
812 _persons[i].postInit();
813
814 _persons[0].setVisage(2000);
815 _persons[0].setStrip(2);
816 _persons[0].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
817
818 _persons[1].setVisage(2001);
819 _persons[1].setStrip(2);
820 _persons[1].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
821
822 _persons[2].setVisage(2003);
823 _persons[2].setStrip(1);
824 _persons[2].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
825
826 _persons[3].setVisage(2007);
827 _persons[3].setStrip(2);
828 _persons[3].setDetails(2001, 12, -1, -1, 1, (SceneItem *)NULL);
829
830 _persons[4].setVisage(2004);
831 _persons[4].setStrip(2);
832 _persons[4].setDetails(2001, 19, -1, -1, 1, (SceneItem *)NULL);
833
834 _persons[5].setVisage(2003);
835 _persons[5].setStrip(2);
836 _persons[5].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
837
838 _persons[6].setVisage(2000);
839 _persons[6].setStrip(1);
840 _persons[6].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
841
842 _persons[7].setVisage(2000);
843 _persons[7].setStrip(2);
844 _persons[7].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
845
846 _persons[8].setVisage(2000);
847 _persons[8].setStrip(2);
848 _persons[8].setDetails(2001, 0, -1, -1, 1, (SceneItem *)NULL);
849
850 _persons[9].setVisage(2006);
851 _persons[9].setStrip(1);
852 _persons[9].setDetails(2001, 6, -1, -1, 1, (SceneItem *)NULL);
853
854 _persons[10].setVisage(2007);
855 _persons[10].setStrip(1);
856 _persons[10].setDetails(2001, 12, -1, -1, 1, (SceneItem *)NULL);
857
858 for (int i = 0; i < 11; i++) {
859 _persons[i].animate(ANIM_MODE_1, NULL);
860 _persons[i]._moveDiff.x = 3;
861 _persons[i]._moveRate = 8;
862 _persons[i].hide();
863 switch (i - 1) {
864 case 0:
865 if (R2_GLOBALS._spillLocation[3 + i] == 1)
866 ++R2_GLOBALS._spillLocation[3 + i];
867 else if (R2_GLOBALS._spillLocation[3 + i] == 5)
868 --R2_GLOBALS._spillLocation[3 + i];
869 break;
870 case 2:
871 if (R2_GLOBALS._spillLocation[3 + i] == 7)
872 ++R2_GLOBALS._spillLocation[3 + i];
873 else if (R2_GLOBALS._spillLocation[3 + i] == 13)
874 --R2_GLOBALS._spillLocation[3 + i];
875 break;
876 case 4:
877 if (R2_GLOBALS._spillLocation[3 + i] == 14)
878 ++R2_GLOBALS._spillLocation[3 + i];
879 else if (R2_GLOBALS._spillLocation[3 + i] == 16)
880 --R2_GLOBALS._spillLocation[3 + i];
881 break;
882 case 6:
883 if (R2_GLOBALS._spillLocation[3 + i] == 19)
884 ++R2_GLOBALS._spillLocation[3 + i];
885 else if (R2_GLOBALS._spillLocation[3 + i] == 22)
886 --R2_GLOBALS._spillLocation[3 + i];
887 break;
888 case 8:
889 if (R2_GLOBALS._spillLocation[3 + i] == 23)
890 ++R2_GLOBALS._spillLocation[3 + i];
891 else if (R2_GLOBALS._spillLocation[3 + i] == 27)
892 --R2_GLOBALS._spillLocation[3 + i];
893 break;
894 default:
895 break;
896 }
897 switch (R2_GLOBALS._spillLocation[3 + i] - 1) {
898 case 0:
899 case 6:
900 case 13:
901 case 18:
902 case 22:
903 case 27:
904 case 30:
905 _persons[i].setPosition(Common::Point(265, 127));
906 break;
907 case 5:
908 case 12:
909 case 17:
910 case 21:
911 case 26:
912 _persons[i].setPosition(Common::Point(55, 127));
913 break;
914 default:
915 _persons[i].setPosition(Common::Point(160, 127));
916 break;
917 }
918 }
919 _persons[1].setAction(&_action2);
920 _persons[3].setAction(&_action5);
921 _persons[5].setAction(&_action4);
922 _persons[8].setAction(&_action1);
923
924 initPlayer();
925
926 _background.setDetails(Rect(0, 0, 320, 200), 2000, 0, -1, 23, 1, NULL);
927
928 SceneExt::postInit();
929 }
930
remove()931 void Scene2000::remove() {
932 R2_GLOBALS._events.setCursor(CURSOR_WALK);
933 R2_GLOBALS._sound1.fadeOut(NULL);
934 SceneExt::remove();
935 }
936
signal()937 void Scene2000::signal() {
938 switch (_sceneMode) {
939 case 10:
940 // Leaving left-hand side of scene
941 if (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] == 6)
942 g_globals->_sceneManager.changeScene(1900);
943 else {
944 _mazePlayerMode = 1;
945 --R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex];
946 initExits();
947 initPlayer();
948 }
949 break;
950 case 11:
951 // Leaving right-hand side of scene
952 switch (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex]) {
953 case 5:
954 g_globals->_sceneManager.changeScene(1900);
955 break;
956 case 30:
957 g_globals->_sceneManager.changeScene(2500);
958 break;
959 case 34:
960 g_globals->_sceneManager.changeScene(2350);
961 break;
962 default:
963 _mazePlayerMode = 2;
964 ++R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex];
965 initExits();
966 initPlayer();
967 break;
968 }
969 break;
970 case 12:
971 case 13:
972 // Top/bottom scene exits
973 initExits();
974 initPlayer();
975 break;
976 case 14:
977 switch (_mazePlayerMode - 1) {
978 case 0:
979 g_globals->_sceneManager.changeScene(2450);
980 break;
981 case 1:
982 g_globals->_sceneManager.changeScene(2440);
983 break;
984 case 2:
985 g_globals->_sceneManager.changeScene(2435);
986 break;
987 case 3:
988 g_globals->_sceneManager.changeScene(2430);
989 break;
990 case 4:
991 g_globals->_sceneManager.changeScene(2425);
992 break;
993 case 5:
994 g_globals->_sceneManager.changeScene(2525);
995 break;
996 case 6:
997 g_globals->_sceneManager.changeScene(2530);
998 break;
999 case 7:
1000 g_globals->_sceneManager.changeScene(2535);
1001 break;
1002 default:
1003 R2_GLOBALS._player.enableControl(CURSOR_WALK);
1004 break;
1005 }
1006 break;
1007 case 2039:
1008 case 2041:
1009 g_globals->_sceneManager.changeScene(2350);
1010 break;
1011 default:
1012 R2_GLOBALS._player.enableControl();
1013 break;
1014 }
1015 }
1016
process(Event & event)1017 void Scene2000::process(Event &event) {
1018 if ((R2_GLOBALS._player._canWalk) && (event.eventType == EVENT_BUTTON_DOWN) &&
1019 (R2_GLOBALS._events.getCursor() == CURSOR_CROSSHAIRS)) {
1020
1021 Common::Point pt(event.mousePos.x, 129);
1022 PlayerMover *mover = new PlayerMover();
1023 R2_GLOBALS._player.addMover(mover, &pt, this);
1024
1025 event.handled = true;
1026 }
1027 Scene::process(event);
1028 }
1029
synchronize(Serializer & s)1030 void Scene2000::synchronize(Serializer &s) {
1031 SceneExt::synchronize(s);
1032
1033 s.syncAsByte(_exitingFlag);
1034 s.syncAsSint16LE(_mazePlayerMode);
1035 }
1036
1037 /*--------------------------------------------------------------------------
1038 * Scene 2350 - Balloon Launch Platform
1039 *
1040 *--------------------------------------------------------------------------*/
1041
startAction(CursorType action,Event & event)1042 bool Scene2350::Companion::startAction(CursorType action, Event &event) {
1043 if (action != R2_SENSOR_PROBE)
1044 return(SceneActor::startAction(action, event));
1045 return true;
1046 }
1047
startAction(CursorType action,Event & event)1048 bool Scene2350::Balloon::startAction(CursorType action, Event &event) {
1049 if ((action == R2_REBREATHER_TANK) && (R2_GLOBALS.getFlag(74))) {
1050 Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene;
1051
1052 R2_GLOBALS._player.disableControl();
1053 scene->_person.postInit();
1054 scene->_sceneMode = 2355;
1055 scene->setAction(&scene->_sequenceManager, scene, 2355, &R2_GLOBALS._player, &scene->_person, NULL);
1056 return true;
1057 }
1058
1059 return(SceneActor::startAction(action, event));
1060 }
1061
changeScene()1062 void Scene2350::ExitUp::changeScene() {
1063 Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene;
1064 _enabled = false;
1065
1066 R2_GLOBALS._player.disableControl(CURSOR_WALK);
1067 scene->_sceneMode = 12;
1068 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1069 scene->setAction(&scene->_sequenceManager, scene, 2350, &R2_GLOBALS._player, NULL);
1070 else
1071 scene->setAction(&scene->_sequenceManager, scene, 2352, &R2_GLOBALS._player, NULL);
1072 }
1073
changeScene()1074 void Scene2350::ExitWest::changeScene() {
1075 Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene;
1076
1077 R2_GLOBALS._player.disableControl(CURSOR_CROSSHAIRS);
1078 scene->_sceneMode = 11;
1079
1080 Common::Point pt(-10, 129);
1081 NpcMover *mover = new NpcMover();
1082 R2_GLOBALS._player.addMover(mover, &pt, scene);
1083
1084 }
1085
postInit(SceneObjectList * OwnerList)1086 void Scene2350::postInit(SceneObjectList *OwnerList) {
1087 loadScene(2350);
1088 SceneExt::postInit();
1089 R2_GLOBALS._sound1.play(200);
1090 _stripManager.addSpeaker(&_pharishaSpeaker);
1091 _stripManager.addSpeaker(&_quinnSpeaker);
1092
1093 if (R2_GLOBALS._sceneManager._previousScene == -1)
1094 R2_GLOBALS._player._characterScene[R2_SEEKER] = 2350;
1095
1096 _exitUp.setDetails(Rect(25, 83, 93, 125), EXITCURSOR_NW, 2350);
1097 _exitUp.setDest(Common::Point(80, 129));
1098 _exitWest.setDetails(Rect(0, 100, 14, 140), EXITCURSOR_W, 2350);
1099 _exitWest.setDest(Common::Point(14, 129));
1100
1101 R2_GLOBALS._player.postInit();
1102 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1103
1104 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1105 R2_GLOBALS._player.setup(2008, 3, 1);
1106 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1107 } else {
1108 R2_GLOBALS._player.setup(20, 3, 1);
1109 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
1110 }
1111
1112 if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
1113 _companion.postInit();
1114 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1115 _companion.setup(20, 5, 1);
1116 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
1117 } else {
1118 _companion.setup(2008, 5, 1);
1119 _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
1120 }
1121 _companion.setPosition(Common::Point(135, 128));
1122 }
1123 _balloon.postInit();
1124 _harness.postInit();
1125
1126 if (R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 2350) {
1127 _balloon.hide();
1128 _harness.hide();
1129 } else {
1130 _balloon.setup(2350, 0, 1);
1131 _balloon.setPosition(Common::Point(197, 101));
1132 _balloon.setDetails(2000, 12, -1, -1, 1, (SceneItem *)NULL);
1133 _balloon.fixPriority(10);
1134 _harness.setup(2350, 1, 2);
1135 _harness.setPosition(Common::Point(199, 129));
1136 _harness.setDetails(2000, 12, -1, -1, 1, (SceneItem *)NULL);
1137 _harness.fixPriority(10);
1138 }
1139 _background.setDetails(Rect(0, 0, 320, 200), 2000, 9, -1, -1, 1, NULL);
1140 R2_GLOBALS._player.disableControl();
1141
1142 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
1143 if (R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] != 34) {
1144 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1145 _sceneMode = 2351;
1146 else
1147 _sceneMode = 2353;
1148 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL);
1149 } else {
1150 _sceneMode = 10;
1151 R2_GLOBALS._player.setPosition(Common::Point(-20, 129));
1152 Common::Point pt(20, 129);
1153 NpcMover *mover = new NpcMover();
1154 R2_GLOBALS._player.addMover(mover, &pt, this);
1155
1156 }
1157 } else {
1158 R2_GLOBALS._player.setPosition(Common::Point(100, 129));
1159 R2_GLOBALS._player.setStrip(3);
1160 R2_GLOBALS._player.enableControl();
1161 }
1162 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2350;
1163 }
1164
remove()1165 void Scene2350::remove() {
1166 R2_GLOBALS._sound1.fadeOut(NULL);
1167 SceneExt::remove();
1168 }
1169
signal()1170 void Scene2350::signal() {
1171 switch (_sceneMode) {
1172 case 11:
1173 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 34;
1174 g_globals->_sceneManager.changeScene(2000);
1175 break;
1176 case 12:
1177 R2_GLOBALS._spillLocation[R2_GLOBALS._player._characterIndex] = 29;
1178 g_globals->_sceneManager.changeScene(2000);
1179 break;
1180 case 20:
1181 _sceneMode = 21;
1182 _stripManager.start(712, this);
1183 break;
1184 case 21:
1185 R2_GLOBALS._player.disableControl();
1186 R2_INVENTORY.setObjectScene(R2_FLUTE, 1);
1187 _sceneMode = 2354;
1188 setAction(&_sequenceManager, this, 2354, &R2_GLOBALS._player, NULL);
1189 break;
1190 case 2354:
1191 R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 2350);
1192 g_globals->_sceneManager.changeScene(2900);
1193 break;
1194 case 2355:
1195 _sceneMode = 20;
1196 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
1197 _stripManager.start(711, this);
1198 break;
1199 default:
1200 R2_GLOBALS._player.enableControl();
1201 break;
1202 }
1203 }
1204
1205 /*--------------------------------------------------------------------------
1206 * Scene 2400 - Spill Mountains: Large empty room
1207 *
1208 *--------------------------------------------------------------------------*/
1209
changeScene()1210 void Scene2400::WestExit::changeScene() {
1211 Scene2400 *scene = (Scene2400 *)R2_GLOBALS._sceneManager._scene;
1212
1213 R2_GLOBALS._player.disableControl();
1214 scene->_sceneMode = 10;
1215
1216 Common::Point pt(-10, 150);
1217 NpcMover *mover = new NpcMover();
1218 R2_GLOBALS._player.addMover(mover, &pt, scene);
1219
1220 }
1221
changeScene()1222 void Scene2400::EastExit::changeScene() {
1223 Scene2400 *scene = (Scene2400 *)R2_GLOBALS._sceneManager._scene;
1224
1225 R2_GLOBALS._player.disableControl();
1226 scene->_sceneMode = 11;
1227
1228 Common::Point pt(330, 150);
1229 NpcMover *mover = new NpcMover();
1230 R2_GLOBALS._player.addMover(mover, &pt, scene);
1231 }
1232
postInit(SceneObjectList * OwnerList)1233 void Scene2400::postInit(SceneObjectList *OwnerList) {
1234 loadScene(2400);
1235 SceneExt::postInit();
1236 _westExit.setDetails(Rect(0, 125, 14, 165), EXITCURSOR_W, 2000);
1237 _westExit.setDest(Common::Point(14, 150));
1238 _eastExit.setDetails(Rect(305, 125, 320, 165), EXITCURSOR_E, 2000);
1239 _eastExit.setDest(Common::Point(315, 150));
1240 R2_GLOBALS._player.postInit();
1241 R2_GLOBALS._player.disableControl();
1242
1243 if (R2_GLOBALS._spillLocation[R2_QUINN] == 16) {
1244 _sceneMode = 2400;
1245 setAction(&_sequenceManager, this, 2400, &R2_GLOBALS._player, NULL);
1246 } else {
1247 _sceneMode = 2401;
1248 setAction(&_sequenceManager, this, 2401, &R2_GLOBALS._player, NULL);
1249 }
1250 }
1251
signal()1252 void Scene2400::signal() {
1253 switch (_sceneMode) {
1254 case 10:
1255 R2_GLOBALS._spillLocation[R2_QUINN] = 16;
1256 g_globals->_sceneManager.changeScene(2000);
1257 break;
1258 case 11:
1259 R2_GLOBALS._spillLocation[R2_QUINN] = 17;
1260 g_globals->_sceneManager.changeScene(2000);
1261 break;
1262 default:
1263 R2_GLOBALS._player.enableControl();
1264 break;
1265 }
1266 }
1267
1268 /*--------------------------------------------------------------------------
1269 * Scene 2425 - Spill Mountains: The Hall Of Records
1270 *
1271 *--------------------------------------------------------------------------*/
1272
startAction(CursorType action,Event & event)1273 bool Scene2425::RopeDest1::startAction(CursorType action, Event &event) {
1274 if ((action == R2_CURSOR_ROPE) && (!R2_GLOBALS.getFlag(84))) {
1275 Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
1276
1277 R2_GLOBALS._player.disableControl();
1278 scene->_sceneMode = 2426;
1279 scene->setAction(&scene->_sequenceManager, scene, 2426, &R2_GLOBALS._player, &scene->_rope, NULL);
1280 R2_GLOBALS.setFlag(84);
1281 return true;
1282 } else if (action == R2_CURSOR_ROPE) {
1283 R2_GLOBALS._events.setCursor(CURSOR_USE);
1284 R2_GLOBALS._player.enableControl(CURSOR_USE);
1285 return NamedHotspot::startAction(CURSOR_USE, event);
1286 } else
1287 return NamedHotspot::startAction(action, event);
1288 }
1289
startAction(CursorType action,Event & event)1290 bool Scene2425::RopeDest2::startAction(CursorType action, Event &event) {
1291 if ((action == R2_CURSOR_ROPE) && (R2_GLOBALS.getFlag(84))) {
1292 Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
1293
1294 R2_GLOBALS._player.disableControl();
1295 scene->_sceneMode = 2427;
1296 scene->setAction(&scene->_sequenceManager, scene, 2427, &R2_GLOBALS._player, &scene->_rope, NULL);
1297 R2_GLOBALS.clearFlag(84);
1298 return true;
1299 } else if (action == R2_CURSOR_ROPE) {
1300 R2_GLOBALS._events.setCursor(CURSOR_USE);
1301 R2_GLOBALS._player.enableControl(CURSOR_USE);
1302 return NamedHotspot::startAction(CURSOR_USE, event);
1303 } else
1304 return NamedHotspot::startAction(action, event);
1305 }
1306
startAction(CursorType action,Event & event)1307 bool Scene2425::Crevasse::startAction(CursorType action, Event &event) {
1308 if (action != R2_CURSOR_ROPE)
1309 return NamedHotspot::startAction(action, event);
1310 else {
1311 Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
1312
1313 R2_GLOBALS._player.disableControl();
1314 if (R2_GLOBALS.getFlag(84)) {
1315 scene->_sceneMode = 20;
1316 scene->setAction(&scene->_sequenceManager, scene, 2427, &R2_GLOBALS._player, &scene->_rope, NULL);
1317 R2_GLOBALS.clearFlag(84);
1318 } else {
1319 scene->_sceneMode = 2425;
1320 scene->setAction(&scene->_sequenceManager, scene, 2425, &R2_GLOBALS._player, &scene->_rope, NULL);
1321 }
1322 return true;
1323 }
1324 }
1325
startAction(CursorType action,Event & event)1326 bool Scene2425::Background::startAction(CursorType action, Event &event) {
1327 if (action != R2_CURSOR_ROPE)
1328 return NamedHotspot::startAction(action, event);
1329 else {
1330 R2_GLOBALS._events.setCursor(CURSOR_USE);
1331 R2_GLOBALS._player.enableControl(CURSOR_USE);
1332 return NamedHotspot::startAction(CURSOR_USE, event);
1333 }
1334 }
1335
startAction(CursorType action,Event & event)1336 bool Scene2425::Rope::startAction(CursorType action, Event &event) {
1337 if (action == CURSOR_USE) {
1338 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
1339 R2_GLOBALS._events.setCursor(R2_CURSOR_ROPE);
1340 return true;
1341 } else {
1342 return SceneActor::startAction(action, event);
1343 }
1344 } else if (R2_GLOBALS._events.getCursor() == R2_CURSOR_ROPE)
1345 return false;
1346 else
1347 return SceneActor::startAction(action, event);
1348 }
1349
startAction(CursorType action,Event & event)1350 bool Scene2425::Pictographs::startAction(CursorType action, Event &event) {
1351 if (action != R2_CURSOR_ROPE)
1352 return SceneActor::startAction(action, event);
1353 else {
1354 R2_GLOBALS._events.setCursor(CURSOR_USE);
1355 R2_GLOBALS._player.enableControl(CURSOR_USE);
1356 return SceneActor::startAction(CURSOR_USE, event);
1357 }
1358 }
1359
changeScene()1360 void Scene2425::SouthEastExit::changeScene() {
1361 Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene;
1362
1363 _enabled = false;
1364 R2_GLOBALS._events.setCursor(CURSOR_WALK);
1365 R2_GLOBALS._player.disableControl();
1366 scene->_sceneMode = 11;
1367
1368 Common::Point pt(340, 200);
1369 NpcMover *mover = new NpcMover();
1370 R2_GLOBALS._player.addMover(mover, &pt, scene);
1371 }
1372
1373
postInit(SceneObjectList * OwnerList)1374 void Scene2425::postInit(SceneObjectList *OwnerList) {
1375 loadScene(2425);
1376 SceneExt::postInit();
1377 if (R2_GLOBALS._sceneManager._previousScene == -1) {
1378 R2_GLOBALS._player._characterIndex = R2_SEEKER;
1379 R2_GLOBALS._sceneManager._previousScene = 2000;
1380 }
1381
1382 R2_GLOBALS._sound1.play(200);
1383 _southEastExit.setDetails(Rect(270, 136, 319, 168), EXITCURSOR_SE, 2000);
1384 R2_GLOBALS._player.postInit();
1385 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1386
1387 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1388 R2_GLOBALS._player.setVisage(2008);
1389 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1390 } else {
1391 R2_GLOBALS._player.setVisage(20);
1392 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
1393 }
1394
1395 if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
1396 _pictographs1.postInit();
1397 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1398 _pictographs1.setup(20, 5, 1);
1399 _pictographs1.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
1400 } else {
1401 _pictographs1.setup(2008, 5, 1);
1402 _pictographs1.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
1403 }
1404 _pictographs1.setPosition(Common::Point(250, 185));
1405 }
1406
1407 _rope.postInit();
1408 if (R2_GLOBALS._sceneManager._previousScene == 2455)
1409 _rope.setup(2426, 1, 1);
1410 else
1411 _rope.setup(2426, 1, 2);
1412
1413 _rope.setPosition(Common::Point(290, 9));
1414 _rope.fixPriority(20);
1415 _rope.setDetails(2455, 12, -1, -1, 1, (SceneItem *)NULL);
1416 _ropeDest1.setDetails(Rect(225, 52, 248, 65), 2425, -1, -1, -1, 1, NULL);
1417 _ropeDest2.setDetails(Rect(292, 81, 316, 94), 2425, -1, -1, -1, 1, NULL);
1418
1419 _pictographs2._sceneRegionId = 11;
1420 _pictographs2._resNum = 2425;
1421 _pictographs2._lookLineNum = 3;
1422 _pictographs2._talkLineNum = -1;
1423 _pictographs2._useLineNum = 6;
1424 g_globals->_sceneItems.push_back(&_pictographs2);
1425
1426 _crevasse.setDetails(12, 2425, 7, -1, 9);
1427 _background.setDetails(Rect(0, 0, 320, 200), 2425, 0, -1, -1, 1, NULL);
1428
1429 R2_GLOBALS._player.disableControl();
1430 switch (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) {
1431 case 2000: {
1432 _sceneMode = 10;
1433 R2_GLOBALS._player.setPosition(Common::Point(340, 200));
1434
1435 Common::Point pt(280, 150);
1436 NpcMover *mover = new NpcMover();
1437 R2_GLOBALS._player.addMover(mover, &pt, this);
1438 break;
1439 }
1440 case 2425:
1441 _sceneMode = 10;
1442 R2_GLOBALS._player.setPosition(Common::Point(280, 150));
1443 signal();
1444 break;
1445 case 2455:
1446 _sceneMode = 2428;
1447 setAction(&_sequenceManager, this, 2428, &R2_GLOBALS._player, &_rope, NULL);
1448 break;
1449 default:
1450 R2_GLOBALS._player.setPosition(Common::Point(280, 150));
1451 R2_GLOBALS._player.setStrip(8);
1452 R2_GLOBALS._player.enableControl();
1453 break;
1454 }
1455 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2425;
1456 }
1457
remove()1458 void Scene2425::remove() {
1459 R2_GLOBALS._sound1.fadeOut(NULL);
1460 SceneExt::remove();
1461 }
1462
signal()1463 void Scene2425::signal() {
1464 switch (_sceneMode) {
1465 case 11:
1466 g_globals->_sceneManager.changeScene(2000);
1467 break;
1468 case 20:
1469 _sceneMode = 2425;
1470 setAction(&_sequenceManager, this, 2425, &R2_GLOBALS._player, &_rope, NULL);
1471 break;
1472 case 2425:
1473 g_globals->_sceneManager.changeScene(2455);
1474 break;
1475 default:
1476 R2_GLOBALS._player.enableControl();
1477 break;
1478 }
1479 }
1480
1481 /*--------------------------------------------------------------------------
1482 * Scene 2430 - Spill Mountains: Bedroom
1483 *
1484 *--------------------------------------------------------------------------*/
1485
startAction(CursorType action,Event & event)1486 bool Scene2430::Companion::startAction(CursorType action, Event &event) {
1487 return SceneActor::startAction(action, event);
1488 }
1489
startAction(CursorType action,Event & event)1490 bool Scene2430::GunPowder::startAction(CursorType action, Event &event) {
1491 if ((action != CURSOR_USE) || (R2_GLOBALS._player._characterIndex != 2))
1492 return SceneActor::startAction(action, event);
1493
1494 Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
1495
1496 R2_GLOBALS._player.disableControl();
1497 scene->_sceneMode = 2430;
1498 scene->setAction(&scene->_sequenceManager, scene, 2430, &R2_GLOBALS._player, &scene->_gunPowder, NULL);
1499 return true;
1500 }
1501
startAction(CursorType action,Event & event)1502 bool Scene2430::OilLamp::startAction(CursorType action, Event &event) {
1503 if ((action != CURSOR_USE) || (R2_GLOBALS._player._characterIndex != 2))
1504 return SceneActor::startAction(action, event);
1505
1506 Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
1507
1508 R2_GLOBALS._player.disableControl();
1509 scene->_sceneMode = 2435;
1510 scene->setAction(&scene->_sequenceManager, scene, 2435, &R2_GLOBALS._player, &scene->_oilLamp, NULL);
1511 return true;
1512 }
1513
changeScene()1514 void Scene2430::SouthExit::changeScene() {
1515 Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene;
1516
1517 scene->_sceneMode = 0;
1518 R2_GLOBALS._events.setCursor(CURSOR_WALK);
1519 R2_GLOBALS._player.disableControl();
1520 scene->_sceneMode = 11;
1521 Common::Point pt(108, 200);
1522 NpcMover *mover = new NpcMover();
1523 R2_GLOBALS._player.addMover(mover, &pt, scene);
1524 }
1525
postInit(SceneObjectList * OwnerList)1526 void Scene2430::postInit(SceneObjectList *OwnerList) {
1527 loadScene(2430);
1528 SceneExt::postInit();
1529 _southExit.setDetails(Rect(68, 155, 147, 168), EXITCURSOR_S, 2000);
1530 _southExit.setDest(Common::Point(108, 160));
1531
1532 if (R2_INVENTORY.getObjectScene(R2_GUNPOWDER) == 2430) {
1533 _gunPowder.postInit();
1534 _gunPowder.setup(2435, 1, 5);
1535 _gunPowder.setPosition(Common::Point(205, 119));
1536 _gunPowder.fixPriority(152);
1537 _gunPowder.setDetails(2430, 51, -1, 53, 1, (SceneItem *)NULL);
1538 }
1539
1540 if (R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_3) == 2435) {
1541 _oilLamp.postInit();
1542 _oilLamp.setup(2435, 1, 1);
1543 _oilLamp.setPosition(Common::Point(31, 65));
1544 _oilLamp.setDetails(2430, 48, -1, -1, 1, (SceneItem *)NULL);
1545 }
1546
1547 R2_GLOBALS._player.postInit();
1548 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1549 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1550 R2_GLOBALS._player.setVisage(2008);
1551 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1552 } else {
1553 R2_GLOBALS._player.setVisage(20);
1554 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
1555 }
1556 R2_GLOBALS._player.setPosition(Common::Point(100, 200));
1557
1558 if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
1559 _companion.postInit();
1560 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1561 _companion.setup(20, 5, 1);
1562 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
1563 } else {
1564 _companion.setup(2008, 5, 1);
1565 _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
1566 }
1567 _companion.setPosition(Common::Point(189, 137));
1568 R2_GLOBALS._walkRegions.disableRegion(4);
1569 }
1570
1571 _furnishings.setDetails(Rect(9, 58, 63, 92), 2430, 6, -1, -1, 1, NULL);
1572 _rug1.setDetails(Rect(20, 89, 127, 107), 2430, 9, -1, 11, 1, NULL);
1573 _mirror.setDetails(Rect(49, 7, 60, 27), 2430, 12, 13, 14, 1, NULL);
1574 _garments.setDetails(Rect(69, 10, 95, 72), 2430, 15, -1, 14, 1, NULL);
1575 _post.setDetails(Rect(198, 4, 222, 146), 2430, 30, 31, 32, 1, NULL);
1576 _bed.setDetails(Rect(155, 40, 304, 120), 2430, 21, -1, 23, 1, NULL);
1577 _towel.setDetails(Rect(249, 3, 261, 39), 2430, 24, 25, -1, 1, NULL);
1578 _bottles1.setDetails(Rect(279, 13, 305, 34), 2430, 33, -1, 18, 1, NULL);
1579 _bottles2.setDetails(Rect(11, 30, 37, 45), 2430, 33, -1, 18, 1, NULL);
1580 _clothesPile1.setDetails(Rect(116, 104, 148, 111), 2430, 39, -1, -1, 1, NULL);
1581 _clothesPile2.setDetails(Rect(66, 77, 84, 83), 2430, 39, -1, -1, 1, NULL);
1582 _rug2.setDetails(Rect(117, 118, 201, 141), 2430, 9, -1, 11, 1, NULL);
1583 _background.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
1584
1585 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
1586 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2430;
1587 Common::Point pt(108, 150);
1588 NpcMover *mover = new NpcMover();
1589 R2_GLOBALS._player.addMover(mover, &pt, this);
1590 } else {
1591 R2_GLOBALS._player.setPosition(Common::Point(105, 145));
1592 R2_GLOBALS._player.setStrip(3);
1593 R2_GLOBALS._player.enableControl();
1594 }
1595 }
1596
signal()1597 void Scene2430::signal() {
1598 switch (_sceneMode) {
1599 case 11:
1600 g_globals->_sceneManager.changeScene(2000);
1601 break;
1602 case 2430:
1603 _gunPowder.remove();
1604 R2_INVENTORY.setObjectScene(R2_GUNPOWDER, 2);
1605 R2_GLOBALS._player.enableControl();
1606 break;
1607 case 2435:
1608 _oilLamp.remove();
1609 R2_INVENTORY.setObjectScene(R2_ALCOHOL_LAMP_3, 2);
1610 R2_GLOBALS._player.enableControl();
1611 break;
1612 default:
1613 R2_GLOBALS._player.enableControl();
1614 break;
1615 }
1616 }
1617
1618 /*--------------------------------------------------------------------------
1619 * Scene 2435 - Spill Mountains: Throne room
1620 *
1621 *--------------------------------------------------------------------------*/
1622
startAction(CursorType action,Event & event)1623 bool Scene2435::Companion::startAction(CursorType action, Event &event) {
1624 return SceneActor::startAction(action, event);
1625 }
1626
startAction(CursorType action,Event & event)1627 bool Scene2435::Astor::startAction(CursorType action, Event &event) {
1628 Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
1629
1630 switch (action) {
1631 case R2_SAPPHIRE_BLUE:
1632 R2_GLOBALS._player.disableControl();
1633 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
1634 R2_GLOBALS.setFlag(82);
1635 scene->_stripManager.start(603, scene);
1636 return true;
1637 case R2_ANCIENT_SCROLLS:
1638 R2_GLOBALS._player.disableControl();
1639 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
1640 R2_GLOBALS.setFlag(82);
1641 scene->_stripManager.start(602, scene);
1642 R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2000);
1643 return true;
1644 case CURSOR_TALK:
1645 R2_GLOBALS._player.disableControl();
1646 scene->_sceneMode = 20;
1647 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
1648 if ((R2_GLOBALS._player._characterIndex == R2_QUINN) || (R2_GLOBALS.getFlag(82))) {
1649 scene->_stripManager.start(605, scene);
1650 return true;
1651 } else if (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2) {
1652 scene->_stripManager.start(601, scene);
1653 return true;
1654 } else {
1655 R2_GLOBALS.setFlag(82);
1656 scene->_stripManager.start(600, scene);
1657 return true;
1658 }
1659 default:
1660 return SceneActor::startAction(action, event);
1661 }
1662 }
1663
changeScene()1664 void Scene2435::SouthExit::changeScene() {
1665 Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
1666
1667 _enabled = false;
1668 R2_GLOBALS._events.setCursor(CURSOR_WALK);
1669 R2_GLOBALS._player.disableControl();
1670 scene->_sceneMode = 11;
1671 Common::Point pt(175, 200);
1672 NpcMover *mover = new NpcMover();
1673 R2_GLOBALS._player.addMover(mover, &pt, scene);
1674
1675 }
1676
postInit(SceneObjectList * OwnerList)1677 void Scene2435::postInit(SceneObjectList *OwnerList) {
1678 loadScene(2435);
1679 SceneExt::postInit();
1680 R2_GLOBALS._sound1.play(201);
1681 _stripManager.addSpeaker(&_quinnSpeaker);
1682 _stripManager.addSpeaker(&_seekerSpeaker);
1683 _stripManager.addSpeaker(&_pharishaSpeaker);
1684 _southExit.setDetails(Rect(142, 155, 207, 167), EXITCURSOR_S, 2000);
1685 _southExit.setDest(Common::Point(175, 160));
1686 _astor.postInit();
1687 _astor.setup(2005, 3, 1);
1688 _astor.setPosition(Common::Point(219, 106));
1689 _astor.setDetails(2001, 25, 26, -1, 1, (SceneItem *)NULL);
1690 R2_GLOBALS._player.postInit();
1691 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1692
1693 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1694 R2_GLOBALS._player.setVisage(2008);
1695 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1696 } else {
1697 R2_GLOBALS._player.setVisage(20);
1698 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
1699 }
1700 R2_GLOBALS._player.setPosition(Common::Point(175, 200));
1701 if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
1702 _companion.postInit();
1703 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1704 _companion.setup(20, 5, 1);
1705 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
1706 } else {
1707 _companion.setup(2008, 5, 1);
1708 _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
1709 }
1710 _companion.setPosition(Common::Point(107, 145));
1711 R2_GLOBALS._walkRegions.disableRegion(2);
1712 }
1713
1714 _leftWindow.setDetails(Rect(52, 44, 96, 82), 2430, 3, -1, 5, 1, NULL);
1715 _rightWindow.setDetails(Rect(117, 36, 161, 74), 2430, 3, -1, 5, 1, NULL);
1716 _background.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
1717
1718 R2_GLOBALS._player.disableControl();
1719 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
1720 _sceneMode = 10;
1721 Common::Point pt(175, 150);
1722 NpcMover *mover = new NpcMover();
1723 R2_GLOBALS._player.addMover(mover, &pt, this);
1724 } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2450) {
1725 _sceneMode = 30;
1726 Common::Point pt(175, 150);
1727 NpcMover *mover = new NpcMover();
1728 R2_GLOBALS._player.addMover(mover, &pt, this);
1729 } else {
1730 R2_GLOBALS._player.setPosition(Common::Point(210, 150));
1731 R2_GLOBALS._player.setStrip(3);
1732 R2_GLOBALS._player.enableControl();
1733 }
1734 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2435;
1735 R2_GLOBALS._spillLocation[1 + R2_GLOBALS._player._characterIndex] = 12;
1736 }
1737
remove()1738 void Scene2435::remove() {
1739 R2_GLOBALS._sound1.fadeOut2(NULL);
1740 SceneExt::remove();
1741 }
1742
signal()1743 void Scene2435::signal() {
1744 switch (_sceneMode) {
1745 case 11:
1746 g_globals->_sceneManager.changeScene(2000);
1747 break;
1748 case 20:
1749 R2_GLOBALS._player.enableControl(CURSOR_TALK);
1750 break;
1751 case 30:
1752 R2_GLOBALS._player._characterScene[R2_QUINN] = 2435;
1753 R2_GLOBALS._player._characterScene[R2_SEEKER] = 2435;
1754 R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 2435;
1755 R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 2435;
1756 R2_GLOBALS._spillLocation[R2_QUINN] = 12;
1757 R2_GLOBALS._spillLocation[R2_SEEKER] = 12;
1758 R2_GLOBALS.setFlag(81);
1759 _sceneMode = 2436;
1760 R2_GLOBALS._player.setStrip(7);
1761 _companion.postInit();
1762 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1763 _companion.setVisage(20);
1764 else
1765 _companion.setVisage(2008);
1766 setAction(&_sequenceManager, this, 2436, &_companion, NULL);
1767 break;
1768 case 2436:
1769 R2_GLOBALS._walkRegions.disableRegion(2);
1770 _sceneMode = 20;
1771 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
1772 _stripManager.start(709, this);
1773 break;
1774 default:
1775 R2_GLOBALS._player.enableControl();
1776 break;
1777 }
1778 }
1779
1780 /*--------------------------------------------------------------------------
1781 * Scene 2440 - Spill Mountains: Another bedroom
1782 *
1783 *--------------------------------------------------------------------------*/
1784
startAction(CursorType action,Event & event)1785 bool Scene2440::Companion::startAction(CursorType action, Event &event) {
1786 return SceneActor::startAction(action, event);
1787 }
1788
startAction(CursorType action,Event & event)1789 bool Scene2440::OilLamp::startAction(CursorType action, Event &event) {
1790 if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_SEEKER)) {
1791 Scene2440 *scene = (Scene2440 *)R2_GLOBALS._sceneManager._scene;
1792
1793 R2_GLOBALS._player.disableControl();
1794 scene->_sceneMode = 2440;
1795 scene->setAction(&scene->_sequenceManager, scene, 2440, &R2_GLOBALS._player, &scene->_oilLamp, NULL);
1796 return true;
1797 }
1798
1799 return SceneActor::startAction(action, event);
1800 }
1801
changeScene()1802 void Scene2440::SouthEastExit::changeScene() {
1803 Scene2440 *scene = (Scene2440 *)R2_GLOBALS._sceneManager._scene;
1804
1805 _enabled = false;
1806 R2_GLOBALS._player.disableControl();
1807 scene->_sceneMode = 11;
1808 Common::Point pt(210, 200);
1809 NpcMover *mover = new NpcMover();
1810 R2_GLOBALS._player.addMover(mover, &pt, scene);
1811 }
1812
postInit(SceneObjectList * OwnerList)1813 void Scene2440::postInit(SceneObjectList *OwnerList) {
1814 loadScene(2440);
1815 SceneExt::postInit();
1816 R2_GLOBALS._sound1.play(200);
1817 // Fix exit cursor, the original was using NW
1818 _southEastExit.setDetails(Rect(172, 155, 250, 167), EXITCURSOR_SE, 2000);
1819 _southEastExit.setDest(Common::Point(210, 160));
1820 if (R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_2) == 2440) {
1821 _oilLamp.postInit();
1822 _oilLamp.setup(2435, 1, 1);
1823 _oilLamp.setPosition(Common::Point(94, 80));
1824 _oilLamp.fixPriority(106);
1825 _oilLamp.setDetails(2430, 48, -1, -1, 1, (SceneItem *)NULL);
1826 }
1827 R2_GLOBALS._player.postInit();
1828 R2_GLOBALS._player.enableControl();
1829 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1830
1831 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1832 R2_GLOBALS._player.setVisage(2008);
1833 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1834 } else {
1835 R2_GLOBALS._player.setVisage(20);
1836 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
1837 }
1838 R2_GLOBALS._player.setPosition(Common::Point(210, 200));
1839 if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
1840 _companion.postInit();
1841 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1842 _companion.setup(20, 5, 1);
1843 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
1844 } else {
1845 _companion.setup(2008, 5, 1);
1846 _companion.setDetails(9002, 0, 5, 3, 1, (SceneItem *)NULL);
1847 }
1848 _companion.setPosition(Common::Point(38, 119));
1849 }
1850
1851 _garments.setDetails(Rect(125, 25, 142, 73), 2430, 15, -1, 14, 1, NULL);
1852 _bedspread.setDetails(Rect(124, 78, 237, 120), 2430, 36, -1, 38, 1, NULL);
1853 _post.setDetails(Rect(250, 3, 265, 133), 2430, 30, 31, 32, 1, NULL);
1854 _rug.setDetails(Rect(91, 117, 203, 140), 2430, 9, -1, 11, 1, NULL);
1855 _furnishings.setDetails(Rect(48, 78, 103, 112), 2430, 6, -1, -1, 1, NULL);
1856 _bottles.setDetails(Rect(48, 31, 73, 52), 2430, 33, -1, 18, 1, NULL);
1857 _background.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
1858
1859 R2_GLOBALS._player.disableControl();
1860
1861 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
1862 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2440;
1863 Common::Point pt(210, 150);
1864 NpcMover *mover = new NpcMover();
1865 R2_GLOBALS._player.addMover(mover, &pt, this);
1866 } else {
1867 R2_GLOBALS._player.setPosition(Common::Point(210, 150));
1868 R2_GLOBALS._player.setStrip(3);
1869 R2_GLOBALS._player.enableControl();
1870 }
1871 }
1872
remove()1873 void Scene2440::remove() {
1874 R2_GLOBALS._sound1.fadeOut2(NULL);
1875 SceneExt::remove();
1876 }
1877
signal()1878 void Scene2440::signal() {
1879 switch (_sceneMode) {
1880 case 11:
1881 g_globals->_sceneManager.changeScene(2000);
1882 break;
1883 case 2440:
1884 _oilLamp.remove();
1885 R2_INVENTORY.setObjectScene(R2_ALCOHOL_LAMP_2, 2);
1886 // fall through
1887 default:
1888 R2_GLOBALS._player.enableControl();
1889 break;
1890 }
1891 }
1892
1893 /*--------------------------------------------------------------------------
1894 * Scene 2445 - Spill Mountains:
1895 *
1896 *--------------------------------------------------------------------------*/
1897
postInit(SceneObjectList * OwnerList)1898 void Scene2445::postInit(SceneObjectList *OwnerList) {
1899 loadScene(2445);
1900 SceneExt::postInit();
1901 R2_GLOBALS._player.postInit();
1902 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1903 R2_GLOBALS._player.setVisage(10);
1904 R2_GLOBALS._player.setPosition(Common::Point(160, 140));
1905 R2_GLOBALS._player.disableControl();
1906 }
1907
signal()1908 void Scene2445::signal() {
1909 R2_GLOBALS._player.enableControl();
1910 }
1911
1912 /*--------------------------------------------------------------------------
1913 * Scene 2450 - Spill Mountains: Another bedroom
1914 *
1915 *--------------------------------------------------------------------------*/
1916
startAction(CursorType action,Event & event)1917 bool Scene2450::Parker::startAction(CursorType action, Event &event) {
1918 if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
1919 Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
1920
1921 R2_GLOBALS._player.disableControl();
1922 scene->_sceneMode = 2452;
1923 scene->setAction(&scene->_sequenceManager, scene, 2452, &R2_GLOBALS._player, &scene->_parker, NULL);
1924 return true;
1925 }
1926 return SceneActor::startAction(action, event);
1927 }
1928
startAction(CursorType action,Event & event)1929 bool Scene2450::CareTaker::startAction(CursorType action, Event &event) {
1930 if (action == CURSOR_TALK) {
1931 R2_GLOBALS._player.disableControl();
1932 if (R2_GLOBALS._stripModifier < 3) {
1933 Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
1934
1935 ++R2_GLOBALS._stripModifier;
1936 scene->_sceneMode = 20;
1937 R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1938 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1939 scene->_stripManager.start(699 + (R2_GLOBALS._stripModifier * 2), scene);
1940 else
1941 scene->_stripManager.start(700 + (R2_GLOBALS._stripModifier * 2), scene);
1942 }
1943 return true;
1944 } else {
1945 return SceneActor::startAction(action, event);
1946 }
1947 }
1948
changeScene()1949 void Scene2450::SouthWestExit::changeScene() {
1950 if ((R2_GLOBALS._player._characterIndex == R2_SEEKER) || (R2_GLOBALS.getFlag(61))) {
1951 Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
1952
1953 _enabled = false;
1954 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
1955 R2_GLOBALS._player.disableControl();
1956 scene->_sceneMode = 10;
1957 Common::Point pt(-10, 180);
1958 NpcMover *mover = new NpcMover();
1959 R2_GLOBALS._player.addMover(mover, &pt, scene);
1960 } else {
1961 _moving = false;
1962 SceneItem::display(2450, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1963 Common::Point pt(60, 140);
1964 NpcMover *mover = new NpcMover();
1965 R2_GLOBALS._player.addMover(mover, &pt, NULL);
1966 }
1967 }
1968
postInit(SceneObjectList * OwnerList)1969 void Scene2450::postInit(SceneObjectList *OwnerList) {
1970 loadScene(2450);
1971 SceneExt::postInit();
1972 R2_GLOBALS._sound1.play(200);
1973 if (R2_GLOBALS._sceneManager._previousScene == -1) {
1974 R2_GLOBALS._sceneManager._previousScene = 1900;
1975 R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1900;
1976 R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1900;
1977 }
1978 _stripManager.addSpeaker(&_quinnSpeaker);
1979 _stripManager.addSpeaker(&_seekerSpeaker);
1980 _stripManager.addSpeaker(&_caretakerSpeaker);
1981
1982 if (R2_GLOBALS.getFlag(72)) {
1983 _southWestExit.setDetails(Rect(0, 143, 47, 168), EXITCURSOR_SW, 2000);
1984 _southWestExit.setDest(Common::Point(10, 160));
1985 }
1986
1987 if (!R2_GLOBALS.getFlag(61)) {
1988 _parker.postInit();
1989 _parker.setVisage(2009);
1990 _parker.setPosition(Common::Point(190, 119));
1991 _parker.fixPriority(50);
1992 _parker.setDetails(2450, 0, -1, -1, 1, (SceneItem *)NULL);
1993 }
1994
1995 R2_GLOBALS._player.postInit();
1996 R2_GLOBALS._player.disableControl();
1997 switch (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) {
1998 case 1900:
1999 R2_GLOBALS._stripModifier = 0;
2000 R2_GLOBALS._player._characterScene[R2_QUINN] = 2450;
2001 R2_GLOBALS._player._characterScene[R2_SEEKER] = 2450;
2002 R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 2450;
2003 R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 2450;
2004 R2_GLOBALS._player.setup(2450, 1, 1);
2005 R2_GLOBALS._player.setPosition(Common::Point(126, 101));
2006 setAction(&_sequenceManager, this, 2450, &R2_GLOBALS._player, NULL);
2007 break;
2008 case 2000:
2009 _sceneMode = 2451;
2010 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2011 if (R2_GLOBALS._player._characterScene[R2_SEEKER] == 2450) {
2012 _companion.postInit();
2013 _companion.setup(20, 6, 1);
2014 _companion.setPosition(Common::Point(240, 120));
2015 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
2016 }
2017 setAction(&_sequenceManager, this, 2451, &R2_GLOBALS._player, NULL);
2018 } else {
2019 R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 2450;
2020 R2_GLOBALS._player._characterScene[R2_SEEKER] = 2450;
2021 if (R2_GLOBALS._player._characterScene[R2_QUINN] == 2450) {
2022 _companion.postInit();
2023 if (R2_GLOBALS.getFlag(61))
2024 _companion.setup(2008, 6, 1);
2025 else
2026 _companion.setup(10, 6, 1);
2027 _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
2028 _companion.setPosition(Common::Point(106, 111));
2029 }
2030 setAction(&_sequenceManager, this, 2456, &R2_GLOBALS._player, NULL);
2031 }
2032 break;
2033 case 2450:
2034 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2035 R2_GLOBALS._player.postInit();
2036 if (R2_GLOBALS.getFlag(61)) {
2037 R2_GLOBALS._player.setup(2008, 6, 1);
2038 } else {
2039 R2_GLOBALS._player.setup(10, 6, 1);
2040 }
2041 R2_GLOBALS._player.setPosition(Common::Point(106, 111));
2042 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2043 if (R2_GLOBALS.getFlag(72)) {
2044 if (R2_GLOBALS._player._characterScene[R2_SEEKER] == 2450) {
2045 _companion.postInit();
2046 _companion.setup(20, 6, 1);
2047 _companion.setPosition(Common::Point(240, 120));
2048 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
2049 }
2050 } else {
2051 _companion.postInit();
2052 _companion.setup(20, 8, 1);
2053 _companion.setPosition(Common::Point(93, 158));
2054 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
2055
2056 _careTaker.postInit();
2057 _careTaker.setup(2001, 7, 1);
2058 _careTaker.setPosition(Common::Point(34, 153));
2059 _careTaker.setDetails(2001, 40, -1, -1, 1, (SceneItem *)NULL);
2060
2061 _southWestExit._enabled = false;
2062 }
2063 } else {
2064 R2_GLOBALS._player.postInit();
2065 R2_GLOBALS._player.setup(20, 8, 1);
2066 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2067 R2_GLOBALS._player.setPosition(Common::Point(93, 158));
2068 if (R2_GLOBALS.getFlag(72)) {
2069 if (R2_GLOBALS._player._characterScene[R2_QUINN] == 2450) {
2070 _companion.postInit();
2071 if (R2_GLOBALS.getFlag(61)) {
2072 _companion.setup(2008, 6, 1);
2073 } else {
2074 _companion.setup(10, 6, 1);
2075 }
2076 _companion.setPosition(Common::Point(106, 111));
2077 _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
2078 }
2079 } else {
2080 _companion.postInit();
2081 if (R2_GLOBALS.getFlag(61)) {
2082 _companion.setup(2008, 6, 1);
2083 } else {
2084 _companion.setup(10, 6, 1);
2085 }
2086 _companion.setPosition(Common::Point(106, 111));
2087 _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
2088
2089 _careTaker.postInit();
2090 _careTaker.setup(2001, 7, 1);
2091 _careTaker.setPosition(Common::Point(34, 153));
2092 _careTaker.setDetails(2001, 40, -1, -1, 1, (SceneItem *)NULL);
2093
2094 _southWestExit._enabled = false;
2095 }
2096 }
2097 R2_GLOBALS._player.enableControl();
2098 if (!R2_GLOBALS.getFlag(72)) {
2099 R2_GLOBALS._player._canWalk = false;
2100 }
2101 break;
2102 default:
2103 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2104 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2105 if (R2_GLOBALS.getFlag(61)) {
2106 R2_GLOBALS._player.setup(2008, 3, 1);
2107 } else {
2108 R2_GLOBALS._player.setup(10, 3, 1);
2109 }
2110 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2111 } else {
2112 R2_GLOBALS._player.setVisage(20);
2113 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2114 }
2115 R2_GLOBALS._player.setPosition(Common::Point(100, 130));
2116 R2_GLOBALS._player.enableControl();
2117 break;
2118 }
2119 _post.setDetails(Rect(174, 4, 199, 123), 2430, 30, 31, 32, 1, NULL);
2120 _bedspread.setDetails(Rect(67, 73, 207, 121), 2430, 36, -1, 38, 1, NULL);
2121 _background.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
2122 }
2123
remove()2124 void Scene2450::remove() {
2125 R2_GLOBALS._sound1.fadeOut2(NULL);
2126 SceneExt::remove();
2127 }
2128
signal()2129 void Scene2450::signal() {
2130 switch (_sceneMode) {
2131 case 10:
2132 g_globals->_sceneManager.changeScene(2000);
2133 break;
2134 case 20:
2135 if (R2_GLOBALS._stripModifier == 3) {
2136 R2_GLOBALS._player.disableControl();
2137 R2_GLOBALS._stripModifier = 4;
2138 _sceneMode = 2454;
2139 setAction(&_sequenceManager, this, 2454, &_careTaker, NULL);
2140 } else {
2141 R2_GLOBALS._player.enableControl(CURSOR_TALK);
2142 if (R2_GLOBALS._stripModifier < 4)
2143 R2_GLOBALS._player._canWalk = false;
2144 }
2145 break;
2146 case 30:
2147 R2_GLOBALS._player.disableControl();
2148 _sceneMode = 2455;
2149 setAction(&_sequenceManager, this, 2455, &_companion, NULL);
2150 break;
2151 case 31:
2152 R2_GLOBALS.setFlag(61);
2153 g_globals->_sceneManager.changeScene(2435);
2154 break;
2155 case 2451:
2156 R2_GLOBALS._player.enableControl();
2157 break;
2158 case 2452:
2159 R2_GLOBALS.setFlag(61);
2160 _parker.remove();
2161 R2_GLOBALS._player.enableControl();
2162 if (!R2_GLOBALS.getFlag(72)) {
2163 R2_GLOBALS._player.setStrip(6);
2164 R2_GLOBALS._player._canWalk = false;
2165 }
2166 break;
2167 case 2453:
2168 _sceneMode = 20;
2169 R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2170 _stripManager.start(700, this);
2171 break;
2172 case 2454:
2173 _southWestExit._enabled = true;
2174 R2_GLOBALS.setFlag(72);
2175 _careTaker.remove();
2176 if (R2_GLOBALS.getFlag(61)) {
2177 g_globals->_sceneManager.changeScene(2435);
2178 } else {
2179 _sceneMode = 31;
2180 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2181 setAction(&_sequenceManager, this, 2452, &R2_GLOBALS._player, &_parker, NULL);
2182 } else {
2183 setAction(&_sequenceManager, this, 2452, &_companion, &_parker, NULL);
2184 }
2185 }
2186 break;
2187 case 2455:
2188 R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 2450;
2189 R2_GLOBALS._player._characterScene[R2_SEEKER] = 2000;
2190 R2_GLOBALS._spillLocation[R2_SEEKER] = 3;
2191 _companion.remove();
2192 R2_GLOBALS._player.enableControl(CURSOR_WALK);
2193 break;
2194 default:
2195 _companion.postInit();
2196 _companion.setDetails(9002, 0, 4, 3, 2, (SceneItem *)NULL);
2197 _careTaker.postInit();
2198 _careTaker.setDetails(2001, 40, -1, -1, 2, (SceneItem *)NULL);
2199 _sceneMode = 2453;
2200 setAction(&_sequenceManager, this, 2453, &_careTaker, &_companion, NULL);
2201 break;
2202 }
2203 }
2204
2205 /*--------------------------------------------------------------------------
2206 * Scene 2455 - Spill Mountains: Inside crevasse
2207 *
2208 *--------------------------------------------------------------------------*/
2209
startAction(CursorType action,Event & event)2210 bool Scene2455::Lamp::startAction(CursorType action, Event &event) {
2211 if (action == R2_GLASS_DOME) {
2212 if ((R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_2) == 2455) || (R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_3) == 2455)) {
2213 Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
2214
2215 R2_GLOBALS._player.disableControl();
2216 scene->_sceneMode = 2458;
2217 scene->_pool._lookLineNum = 9;
2218 scene->_lamp.remove();
2219 scene->_scrithKey.postInit();
2220 scene->_scrithKey.setDetails(2455, 16, 1, -1, 2, (SceneItem *)NULL);
2221 scene->setAction(&scene->_sequenceManager, scene, 2458, &R2_GLOBALS._player, &scene->_pool, &scene->_scrithKey, NULL);
2222 return true;
2223 }
2224 }
2225
2226 return SceneActor::startAction(action, event);
2227 }
2228
startAction(CursorType action,Event & event)2229 bool Scene2455::Pool::startAction(CursorType action, Event &event) {
2230 Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
2231
2232 switch (action) {
2233 case R2_ALCOHOL_LAMP_2:
2234 if (R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_3) != 2455) {
2235 R2_GLOBALS._player.disableControl();
2236 scene->_lamp.postInit();
2237 scene->_lamp.setup(2456, 3, 3);
2238 scene->_lamp.setPosition(Common::Point(162, 165));
2239 scene->_lamp.setDetails(2455, 15, 1, -1, 2, (SceneItem *)NULL);
2240 scene->_sceneMode = 11;
2241 scene->setAction(&scene->_sequenceManager, scene, 2457, &R2_GLOBALS._player, &scene->_pool, NULL);
2242 return true;
2243 }
2244 break;
2245 case R2_ALCOHOL_LAMP_3:
2246 if (R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_2) != 2455) {
2247 R2_GLOBALS._player.disableControl();
2248 scene->_lamp.postInit();
2249 scene->_lamp.setup(2456, 3, 3);
2250 scene->_lamp.setPosition(Common::Point(162, 165));
2251 scene->_lamp.setDetails(2455, 15, 1, -1, 2, (SceneItem *)NULL);
2252 scene->_sceneMode = 12;
2253 scene->setAction(&scene->_sequenceManager, scene, 2457, &R2_GLOBALS._player, &scene->_pool, NULL);
2254 return true;
2255 }
2256 break;
2257 default:
2258 break;
2259 }
2260
2261 return SceneActor::startAction(action, event);
2262 }
2263
startAction(CursorType action,Event & event)2264 bool Scene2455::ScrithKey::startAction(CursorType action, Event &event) {
2265 if (action == CURSOR_USE) {
2266 Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
2267
2268 R2_GLOBALS._player.disableControl();
2269 scene->_sceneMode = 2459;
2270 scene->setAction(&scene->_sequenceManager, scene, 2459, &R2_GLOBALS._player, &scene->_scrithKey, NULL);
2271 return true;
2272 }
2273
2274 return SceneActor::startAction(action, event);
2275 }
2276
changeScene()2277 void Scene2455::NorthExit::changeScene() {
2278 Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene;
2279
2280 _enabled = false;
2281 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
2282 R2_GLOBALS._player.disableControl();
2283 scene->_sceneMode = 2461;
2284 scene->setAction(&scene->_sequenceManager, scene, 2461, &R2_GLOBALS._player, NULL);
2285 }
2286
postInit(SceneObjectList * OwnerList)2287 void Scene2455::postInit(SceneObjectList *OwnerList) {
2288 loadScene(2455);
2289 SceneExt::postInit();
2290
2291 if (R2_GLOBALS._sceneManager._previousScene == -1) {
2292 R2_INVENTORY.setObjectScene(R2_GLASS_DOME, 2);
2293 R2_INVENTORY.setObjectScene(R2_ALCOHOL_LAMP_3, 2);
2294 }
2295
2296 R2_GLOBALS._sound1.play(200);
2297 _northExit.setDetails(Rect(0, 0, 320, 15), EXITCURSOR_N, 2425);
2298
2299 if (R2_INVENTORY.getObjectScene(R2_GLASS_DOME) == 2455) {
2300 _scrithKey.postInit();
2301 _scrithKey.setup(2456, 3, 1);
2302 _scrithKey.setPosition(Common::Point(176, 165));
2303 _scrithKey.setDetails(2455, 16, 1, -1, 1, (SceneItem *)NULL);
2304 } else if ((R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_3) == 2455) ||
2305 (R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_2) == 2455)) {
2306 _lamp.postInit();
2307 _lamp.setup(2456, 3, 3);
2308 _lamp.setPosition(Common::Point(162, 165));
2309 _lamp.setDetails(2455, 15, 1, -1, 1, (SceneItem *)NULL);
2310 }
2311
2312 _pool.postInit();
2313 if (R2_INVENTORY.getObjectScene(R2_GLASS_DOME) == 2455) {
2314 _pool.setup(2456, 3, 2);
2315 _pool.setDetails(2455, 9, 1, -1, 1, (SceneItem *)NULL);
2316 } else {
2317 if ((R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_3) != 2455) && (R2_INVENTORY.getObjectScene(R2_ALCOHOL_LAMP_2) != 2455))
2318 _pool.setup(2455, 1, 1);
2319 else
2320 _pool.setup(2456, 1, 1);
2321 _pool.setDetails(2455, 3, 1, -1, 1, (SceneItem *)NULL);
2322 }
2323 _pool.setPosition(Common::Point(162, 165));
2324 _pool.fixPriority(20);
2325 if (R2_INVENTORY.getObjectScene(R2_GLASS_DOME) != 2455)
2326 _pool.animate(ANIM_MODE_2, NULL);
2327
2328 R2_GLOBALS._player.postInit();
2329 _background.setDetails(Rect(0, 0, 320, 200), 2455, 0, 1, -1, 1, NULL);
2330 R2_GLOBALS._player.disableControl();
2331
2332 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2425) {
2333 _sceneMode = 2460;
2334 setAction(&_sequenceManager, this, 2460, &R2_GLOBALS._player, NULL);
2335 } else {
2336 R2_GLOBALS._player.setup(2455, 2, 9);
2337 R2_GLOBALS._player.setPosition(Common::Point(118, 165));
2338 R2_GLOBALS._player.enableControl(CURSOR_USE);
2339 R2_GLOBALS._player._canWalk = false;
2340 }
2341 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2455;
2342 }
2343
remove()2344 void Scene2455::remove() {
2345 R2_GLOBALS._sound1.fadeOut2(NULL);
2346 SceneExt::remove();
2347 }
2348
signal()2349 void Scene2455::signal() {
2350 switch (_sceneMode) {
2351 case 10:
2352 // No break on purpose
2353 case 2461:
2354 g_globals->_sceneManager.changeScene(2425);
2355 break;
2356 case 11:
2357 R2_INVENTORY.setObjectScene(R2_ALCOHOL_LAMP_2, 2455);
2358 R2_GLOBALS._player.enableControl(CURSOR_USE);
2359 R2_GLOBALS._player._canWalk = false;
2360 break;
2361 case 12:
2362 R2_INVENTORY.setObjectScene(R2_ALCOHOL_LAMP_3, 2455);
2363 R2_GLOBALS._player.enableControl(CURSOR_USE);
2364 R2_GLOBALS._player._canWalk = false;
2365 break;
2366 case 2458:
2367 R2_INVENTORY.setObjectScene(R2_GLASS_DOME, 2455);
2368 R2_GLOBALS._player.enableControl(CURSOR_USE);
2369 R2_GLOBALS._player._canWalk = false;
2370 break;
2371 case 2459:
2372 _scrithKey.remove();
2373 R2_INVENTORY.setObjectScene(R2_SCRITH_KEY, 2);
2374 R2_GLOBALS._player.enableControl(CURSOR_USE);
2375 R2_GLOBALS._player._canWalk = false;
2376 break;
2377 default:
2378 R2_GLOBALS._player.enableControl(CURSOR_USE);
2379 R2_GLOBALS._player._canWalk = false;
2380 break;
2381 }
2382 }
2383
2384 /*--------------------------------------------------------------------------
2385 * Scene 2500 - Spill Mountains: Large Ledge
2386 *
2387 *--------------------------------------------------------------------------*/
2388
changeScene()2389 void Scene2500::WestExit::changeScene() {
2390 Scene2500 *scene = (Scene2500 *)R2_GLOBALS._sceneManager._scene;
2391
2392 _enabled = false;
2393 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
2394 R2_GLOBALS._player.disableControl();
2395 scene->_sceneMode = 11;
2396
2397 Common::Point pt(20, 105);
2398 NpcMover *mover = new NpcMover();
2399 R2_GLOBALS._player.addMover(mover, &pt, scene);
2400 }
2401
postInit(SceneObjectList * OwnerList)2402 void Scene2500::postInit(SceneObjectList *OwnerList) {
2403 loadScene(2500);
2404 SceneExt::postInit();
2405
2406 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 3100)
2407 R2_GLOBALS._uiElements._active = false;
2408
2409 _stripManager.addSpeaker(&_quinnSpeaker);
2410 _stripManager.addSpeaker(&_seekerSpeaker);
2411 _stripManager.addSpeaker(&_mirandaSpeaker);
2412 _stripManager.addSpeaker(&_webbsterSpeaker);
2413
2414 if (R2_GLOBALS._sceneManager._previousScene == -1)
2415 R2_GLOBALS._sceneManager._previousScene = 2000;
2416
2417 _westExit.setDetails(Rect(30, 50, 85, 105), EXITCURSOR_W, 2000);
2418 _westExit.setDest(Common::Point(84, 104));
2419 R2_GLOBALS._player.postInit();
2420 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2421
2422 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2423 R2_GLOBALS._player.setVisage(11);
2424 R2_GLOBALS._player._moveDiff = Common::Point(2, 1);
2425 } else {
2426 R2_GLOBALS._player.setVisage(21);
2427 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2428 }
2429
2430 if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
2431 _companion.postInit();
2432 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2433 _companion.setup(21, 3, 1);
2434 _companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *)NULL);
2435 } else {
2436 _companion.setup(2008, 3, 1);
2437 _companion.changeZoom(50);
2438 _companion.setDetails(9001, 0, -1, -1, 1, (SceneItem *)NULL);
2439 }
2440 _companion.setPosition(Common::Point(141, 94));
2441 }
2442
2443 _background.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL);
2444 R2_GLOBALS._player.disableControl();
2445
2446 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
2447 _sceneMode = 10;
2448 R2_GLOBALS._player.setPosition(Common::Point(20, 105));
2449 Common::Point pt(95, 105);
2450 NpcMover *mover = new NpcMover();
2451 R2_GLOBALS._player.addMover(mover, &pt, this);
2452 } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 3100) {
2453 _sceneMode = 2500;
2454 _quinn.postInit();
2455 _ship.postInit();
2456 setAction(&_sequenceManager, this, 2500, &R2_GLOBALS._player, &_quinn, &_ship, NULL);
2457 } else {
2458 R2_GLOBALS._player.setPosition(Common::Point(160, 150));
2459 R2_GLOBALS._player.setStrip(3);
2460 R2_GLOBALS._player.enableControl();
2461 }
2462 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2500;
2463 }
2464
signal()2465 void Scene2500::signal() {
2466 switch (_sceneMode) {
2467 case 11:
2468 g_globals->_sceneManager.changeScene(2000);
2469 break;
2470 case 20:
2471 R2_GLOBALS._player.disableControl();
2472 _sceneMode = 2501;
2473 setAction(&_sequenceManager, this, 2501, &R2_GLOBALS._player, &_quinn, &_ship, NULL);
2474 break;
2475 case 2500:
2476 _sceneMode = 20;
2477 R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2478 _stripManager.start(900, this);
2479 break;
2480 case 2501:
2481 g_globals->_sceneManager.changeScene(1000);
2482 break;
2483 default:
2484 R2_GLOBALS._player.enableControl();
2485 break;
2486 }
2487 }
2488
2489 /*--------------------------------------------------------------------------
2490 * Scene 2525 - Furnace room
2491 *
2492 *--------------------------------------------------------------------------*/
2493
startAction(CursorType action,Event & event)2494 bool Scene2525::StopCock::startAction(CursorType action, Event &event) {
2495 if ((action == R2_REBREATHER_TANK) && (!R2_GLOBALS.getFlag(74))) {
2496 Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
2497
2498 R2_GLOBALS._player.disableControl();
2499 scene->_sceneMode = 2526;
2500 scene->setAction(&scene->_sequenceManager, scene, 2526, &R2_GLOBALS._player, NULL);
2501 return true;
2502 }
2503
2504 return SceneItem::startAction(action, event);
2505 }
2506
startAction(CursorType action,Event & event)2507 bool Scene2525::GlassDome::startAction(CursorType action, Event &event) {
2508 if (action != CURSOR_USE)
2509 return SceneActor::startAction(action, event);
2510
2511 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2512 Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
2513
2514 R2_GLOBALS._player.disableControl();
2515 scene->_sceneMode = 2525;
2516 scene->setAction(&scene->_sequenceManager, scene, 2525, &R2_GLOBALS._player, &scene->_glassDome, NULL);
2517 } else {
2518 SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
2519 }
2520 return true;
2521 }
2522
changeScene()2523 void Scene2525::SouthExit::changeScene() {
2524 Scene2525 *scene = (Scene2525 *)R2_GLOBALS._sceneManager._scene;
2525
2526 _enabled = false;
2527 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
2528 R2_GLOBALS._player.disableControl();
2529 scene->_sceneMode = 11;
2530
2531 Common::Point pt(R2_GLOBALS._player._position.x, 200);
2532 NpcMover *mover = new NpcMover();
2533 R2_GLOBALS._player.addMover(mover, &pt, scene);
2534 }
2535
postInit(SceneObjectList * OwnerList)2536 void Scene2525::postInit(SceneObjectList *OwnerList) {
2537 loadScene(2525);
2538 SceneExt::postInit();
2539 R2_GLOBALS._sound1.play(200);
2540 R2_GLOBALS._sound2.play(207);
2541
2542 _southExit.setDetails(Rect(86, 155, 228, 168), EXITCURSOR_S, 2000);
2543
2544 if (R2_INVENTORY.getObjectScene(R2_GLASS_DOME) == 2525) {
2545 _glassDome.postInit();
2546 _glassDome.setup(2435, 1, 2);
2547 _glassDome.setPosition(Common::Point(78, 155));
2548 _glassDome.fixPriority(155);
2549 _glassDome.setDetails(2525, 27, -1, -1, 1, (SceneItem *)NULL);
2550 }
2551
2552 _compressor.postInit();
2553 _compressor.setup(2525, 1, 1);
2554 _compressor.setPosition(Common::Point(183, 114));
2555 _compressor.setDetails(2525, 15, -1, -1, 1, (SceneItem *)NULL);
2556 _compressor.animate(ANIM_MODE_2, NULL);
2557 _compressor._numFrames = 3;
2558
2559 R2_GLOBALS._player.postInit();
2560 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2561 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2562 R2_GLOBALS._player.setup(2008, 3, 1);
2563 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2564 } else {
2565 R2_GLOBALS._player.setup(20, 3, 1);
2566 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2567 }
2568
2569 if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
2570 _companion.postInit();
2571 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2572 _companion.setup(20, 5, 1);
2573 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
2574 } else {
2575 _companion.setup(2008, 5, 1);
2576 _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
2577 }
2578 _companion.setPosition(Common::Point(209, 162));
2579
2580 R2_GLOBALS._walkRegions.disableRegion(4);
2581 }
2582
2583 _stopcock.setDetails(Rect(125, 73, 140, 86), 2525, 6, -1, -1, 1, NULL);
2584 _pipes1.setDetails(Rect(137, 11, 163, 72), 2525, 12, -1, -1, 1, NULL);
2585 _pipes2.setDetails(Rect(204, 20, 234, 78), 2525, 12, -1, -1, 1, NULL);
2586 _machine.setDetails(Rect(102, 62, 230, 134), 2525, 0, -1, -1, 1, NULL);
2587 _background.setDetails(Rect(0, 0, 320, 200), 2525, 24, -1, -1, 1, NULL);
2588
2589 R2_GLOBALS._player.disableControl();
2590
2591 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
2592 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2525;
2593 R2_GLOBALS._player.setPosition(Common::Point(160, 200));
2594 Common::Point pt(160, 150);
2595 NpcMover *mover = new NpcMover();
2596 R2_GLOBALS._player.addMover(mover, &pt, this);
2597 } else {
2598 R2_GLOBALS._player.setPosition(Common::Point(160, 150));
2599 R2_GLOBALS._player.setStrip(3);
2600 R2_GLOBALS._player.enableControl();
2601 }
2602 }
2603
remove()2604 void Scene2525::remove() {
2605 R2_GLOBALS._sound1.fadeOut2(NULL);
2606 R2_GLOBALS._sound2.fadeOut2(NULL);
2607 SceneExt::remove();
2608 }
2609
signal()2610 void Scene2525::signal() {
2611 switch (_sceneMode) {
2612 case 11:
2613 g_globals->_sceneManager.changeScene(2000);
2614 break;
2615 case 2525:
2616 _glassDome.remove();
2617 R2_INVENTORY.setObjectScene(R2_GLASS_DOME, 2);
2618 R2_GLOBALS._player.enableControl();
2619 break;
2620 case 2526:
2621 R2_GLOBALS.setFlag(74);
2622 R2_GLOBALS._player.enableControl();
2623 break;
2624 default:
2625 R2_GLOBALS._player.enableControl();
2626 break;
2627 }
2628 }
2629
2630 /*--------------------------------------------------------------------------
2631 * Scene 2530 - Spill Mountains: Well
2632 *
2633 *--------------------------------------------------------------------------*/
2634
startAction(CursorType action,Event & event)2635 bool Scene2530::Flask::startAction(CursorType action, Event &event) {
2636 if (action != CURSOR_USE)
2637 return SceneActor::startAction(action, event);
2638
2639 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2640 Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
2641
2642 R2_GLOBALS._player.disableControl();
2643 scene->_sceneMode = 2530;
2644 scene->setAction(&scene->_sequenceManager, scene, 2530, &R2_GLOBALS._player, &scene->_flask, NULL);
2645 } else {
2646 SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
2647 }
2648
2649 return true;
2650 }
2651
startAction(CursorType action,Event & event)2652 bool Scene2530::Crank::startAction(CursorType action, Event &event) {
2653 if (action != CURSOR_USE)
2654 return SceneActor::startAction(action, event);
2655
2656 Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
2657
2658 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2659 if (R2_GLOBALS.getFlag(73))
2660 SceneItem::display(2530, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
2661 else {
2662 R2_GLOBALS._player.disableControl();
2663 scene->_sceneMode = 2532;
2664 scene->setAction(&scene->_sequenceManager, scene, 2532, &R2_GLOBALS._player, &scene->_crank, NULL);
2665 }
2666 } else {
2667 if (R2_GLOBALS.getFlag(73)) {
2668 R2_GLOBALS._player.disableControl();
2669 scene->_sceneMode = 2533;
2670 scene->setAction(&scene->_sequenceManager, scene, 2533, &R2_GLOBALS._player, &scene->_crank, NULL);
2671 } else {
2672 R2_GLOBALS._player.disableControl();
2673 scene->_sceneMode = 2531;
2674 scene->setAction(&scene->_sequenceManager, scene, 2531, &R2_GLOBALS._player, &scene->_crank, NULL);
2675 }
2676 }
2677
2678 return true;
2679 }
2680
changeScene()2681 void Scene2530::SouthExit::changeScene() {
2682 Scene2530 *scene = (Scene2530 *)R2_GLOBALS._sceneManager._scene;
2683
2684 _enabled = false;
2685 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
2686 R2_GLOBALS._player.disableControl();
2687 scene->_sceneMode = 11;
2688
2689 Common::Point pt(108, 200);
2690 NpcMover *mover = new NpcMover();
2691 R2_GLOBALS._player.addMover(mover, &pt, scene);
2692 }
2693
postInit(SceneObjectList * OwnerList)2694 void Scene2530::postInit(SceneObjectList *OwnerList) {
2695 loadScene(2530);
2696 SceneExt::postInit();
2697
2698 _southExit.setDetails(Rect(68, 155, 147, 168), EXITCURSOR_S, 2000);
2699 _southExit.setDest(Common::Point(108, 160));
2700
2701 if (R2_INVENTORY.getObjectScene(R2_PURE_GRAIN_ALCOHOL) == 2530) {
2702 _flask.postInit();
2703 _flask.setup(2435, 1, 3);
2704 _flask.setPosition(Common::Point(299, 80));
2705 _flask.fixPriority(80);
2706 _flask.setDetails(2530, 28, -1, -1, 1, (SceneItem *)NULL);
2707 }
2708
2709 _crank.postInit();
2710 if (R2_GLOBALS.getFlag(73)) {
2711 _crank.setup(2531, 4, 2);
2712 _crank.setPosition(Common::Point(154, 130));
2713 } else {
2714 _crank.setup(2531, 4, 1);
2715 _crank.setPosition(Common::Point(173, 131));
2716 }
2717 _crank.setDetails(2530, 22, -1, -1, 1, (SceneItem *)NULL);
2718
2719 R2_GLOBALS._player.postInit();
2720 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2721
2722 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2723 R2_GLOBALS._player.setVisage(2008);
2724 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2725 } else {
2726 R2_GLOBALS._player.setVisage(20);
2727 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2728 }
2729 R2_GLOBALS._player.setPosition(Common::Point(100, 200));
2730
2731 if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
2732 _companion.postInit();
2733 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2734 _companion.setup(20, 5, 1);
2735 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
2736 } else {
2737 _companion.setup(2008, 5, 1);
2738 _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
2739 }
2740 _companion.setPosition(Common::Point(20, 130));
2741 R2_GLOBALS._walkRegions.disableRegion(1);
2742 }
2743
2744 _crank2.setDetails(Rect(108, 90, 135, 205), 2530, 22, -1, -1, 1, NULL);
2745 _rope.setDetails(Rect(115, 112, 206, 130), 2530, 25, -1, 27, 1, NULL);
2746 _shelf.setDetails(Rect(256, 64, 311, 85), 2530, 31, -1, 33, 1, NULL);
2747 _background.setDetails(Rect(0, 0, 320, 200), 2530, 0, 1, -1, 1, NULL);
2748
2749 R2_GLOBALS._player.disableControl();
2750
2751 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
2752 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2530;
2753 Common::Point pt(108, 150);
2754 NpcMover *mover = new NpcMover();
2755 R2_GLOBALS._player.addMover(mover, &pt, this);
2756 } else {
2757 R2_GLOBALS._player.setPosition(Common::Point(105, 145));
2758 R2_GLOBALS._player.setStrip(3);
2759 R2_GLOBALS._player.enableControl();
2760 }
2761 }
2762
signal()2763 void Scene2530::signal() {
2764 switch (_sceneMode) {
2765 case 11:
2766 g_globals->_sceneManager.changeScene(2000);
2767 break;
2768 case 2530:
2769 R2_INVENTORY.setObjectScene(R2_PURE_GRAIN_ALCOHOL, 2);
2770 _flask.remove();
2771 R2_GLOBALS._player.enableControl();
2772 break;
2773 case 2531:
2774 // No break on purpose
2775 case 2532:
2776 R2_GLOBALS.setFlag(73);
2777 R2_GLOBALS._player.enableControl();
2778 break;
2779 case 2533:
2780 R2_GLOBALS.clearFlag(73);
2781 R2_GLOBALS._player.enableControl();
2782 break;
2783 default:
2784 R2_GLOBALS._player.enableControl();
2785 break;
2786 }
2787 }
2788
2789 /*--------------------------------------------------------------------------
2790 * Scene 2535 - Spill Mountains: Tannery
2791 *
2792 *--------------------------------------------------------------------------*/
2793
startAction(CursorType action,Event & event)2794 bool Scene2535::RebreatherTank::startAction(CursorType action, Event &event) {
2795 if (action != CURSOR_USE)
2796 return SceneActor::startAction(action, event);
2797
2798 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2799 Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
2800
2801 R2_GLOBALS._player.disableControl();
2802
2803 scene->_sceneMode = (R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 2535) ? 2536 : 2537;
2804 scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
2805 &R2_GLOBALS._player, &scene->_rebreatherTank, NULL);
2806 } else {
2807 SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
2808 }
2809
2810 return true;
2811 }
2812
startAction(CursorType action,Event & event)2813 bool Scene2535::TannerMask::startAction(CursorType action, Event &event) {
2814 if (action != CURSOR_USE)
2815 return SceneActor::startAction(action, event);
2816
2817 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2818 Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
2819
2820 R2_GLOBALS._player.disableControl();
2821 scene->_sceneMode = 2535;
2822 scene->setAction(&scene->_sequenceManager, scene, 2535, &R2_GLOBALS._player, &scene->_tannerMask, NULL);
2823 } else {
2824 SceneItem::display(2530, 33, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
2825 }
2826
2827 return true;
2828 }
2829
changeScene()2830 void Scene2535::SouthExit::changeScene() {
2831 Scene2535 *scene = (Scene2535 *)R2_GLOBALS._sceneManager._scene;
2832
2833 _enabled = false;
2834 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
2835 R2_GLOBALS._player.disableControl();
2836 scene->_sceneMode = 11;
2837 Common::Point pt(210, 200);
2838 PlayerMover *mover = new PlayerMover();
2839 R2_GLOBALS._player.addMover(mover, &pt, scene);
2840 }
2841
postInit(SceneObjectList * OwnerList)2842 void Scene2535::postInit(SceneObjectList *OwnerList) {
2843 loadScene(2535);
2844 SceneExt::postInit();
2845 if (R2_GLOBALS._sceneManager._previousScene == -1) {
2846 R2_GLOBALS.setFlag(73);
2847 R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 2535);
2848 }
2849 _southExit.setDetails(Rect(172, 155, 250, 167), EXITCURSOR_S, 2000);
2850 _southExit.setDest(Common::Point(210, 160));
2851
2852 if (R2_INVENTORY.getObjectScene(R2_TANNER_MASK) == 2535) {
2853 _tannerMask.postInit();
2854 _tannerMask.setup(2435, 1, 4);
2855 _tannerMask.setPosition(Common::Point(47, 74));
2856 _tannerMask.fixPriority(74);
2857 _tannerMask.setDetails(2535, 21, -1, -1, 1, (SceneItem *)NULL);
2858 }
2859
2860 if (R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 2535) {
2861 _rebreatherTank.postInit();
2862 _rebreatherTank.setup(2535, 3, 1);
2863 _rebreatherTank.setPosition(Common::Point(203, 131));
2864 _rebreatherTank.setDetails(3, 20, -1, -1, 1, (SceneItem *)NULL);
2865 R2_GLOBALS._walkRegions.disableRegion(6);
2866 }
2867
2868 if ((R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 0) && (R2_GLOBALS.getFlag(73))) {
2869 _rebreatherTank.postInit();
2870 _rebreatherTank.setup(2536, 1, 2);
2871 _rebreatherTank.setPosition(Common::Point(164, 133));
2872 _rebreatherTank.setDetails(3, 20, -1, -1, 1, (SceneItem *)NULL);
2873 }
2874
2875 if (R2_GLOBALS.getFlag(73)) {
2876 _rope.postInit();
2877 _rope.setup(2536, 1, 1);
2878 _rope.setPosition(Common::Point(160, 130));
2879 _rope.fixPriority(122);
2880 _rope.setDetails(2535, 37, -1, -1, 1, (SceneItem *)NULL);
2881 }
2882
2883 R2_GLOBALS._player.postInit();
2884 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2885 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2886 R2_GLOBALS._player.setVisage(2008);
2887 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2888 } else {
2889 R2_GLOBALS._player.setVisage(20);
2890 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2891 }
2892 R2_GLOBALS._player.setPosition(Common::Point(210, 200));
2893
2894 if (R2_GLOBALS._player._characterScene[R2_QUINN] == R2_GLOBALS._player._characterScene[R2_SEEKER]) {
2895 _companion.postInit();
2896 if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
2897 _companion.setup(20, 5, 1);
2898 _companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *)NULL);
2899 } else {
2900 _companion.setup(2008, 5, 1);
2901 _companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *)NULL);
2902 }
2903 _companion.setPosition(Common::Point(245, 115));
2904 R2_GLOBALS._walkRegions.disableRegion(2);
2905 }
2906
2907 _roof.setDetails(Rect(96, 3, 215, 33), 2535, 3, 6, 5, 1, NULL);
2908 _skin1.setDetails(Rect(4, 43, 40, 101), 2535, 6, 7, 8, 1, NULL);
2909 _skin2.setDetails(Rect(55, 13, 140, 89), 2535, 6, 7, 8, 1, NULL);
2910 _skin3.setDetails(Rect(144, 23, 216, 76), 2535, 6, 7, 8, 1, NULL);
2911 _skin4.setDetails(Rect(227, 8, 307, 99), 2535, 6, 7, 8, 1, NULL);
2912 _depression.setDetails(Rect(116, 111, 201, 132), 2535, 18, 19, 20, 1, NULL);
2913 _background.setDetails(Rect(0, 0, 320, 200), 2535, 0, 1, -1, 1, NULL);
2914 R2_GLOBALS._player.disableControl();
2915
2916 if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) {
2917 R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2535;
2918 Common::Point pt(210, 150);
2919 PlayerMover *mover = new PlayerMover();
2920 R2_GLOBALS._player.addMover(mover, &pt, this);
2921 } else {
2922 R2_GLOBALS._player.setPosition(Common::Point(210, 150));
2923 R2_GLOBALS._player.setStrip(3);
2924 R2_GLOBALS._player.enableControl();
2925 }
2926 }
2927
signal()2928 void Scene2535::signal() {
2929 switch (_sceneMode) {
2930 case 11:
2931 g_globals->_sceneManager.changeScene(2000);
2932 break;
2933 case 2535:
2934 R2_INVENTORY.setObjectScene(R2_TANNER_MASK, R2_SEEKER);
2935 _tannerMask.remove();
2936 R2_GLOBALS._player.enableControl();
2937 break;
2938 case 2536:
2939 R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 0);
2940 R2_GLOBALS._walkRegions.enableRegion(6);
2941 if (!R2_GLOBALS.getFlag(73)) {
2942 _rebreatherTank.remove();
2943 R2_GLOBALS._player.enableControl();
2944 } else {
2945 _sceneMode = 20;
2946 _rebreatherTank.show();
2947 _rebreatherTank.setup(2536, 1, 2);
2948 _rebreatherTank.setDetails(3, 20, -1, -1, 3, (SceneItem *)NULL);
2949 _rebreatherTank.setPosition(Common::Point(164, 150));
2950 _rebreatherTank.fixPriority(130);
2951
2952 _rebreatherTank._moveDiff.y = 1;
2953 ADD_MOVER(_rebreatherTank, 164, 133);
2954 }
2955 break;
2956 case 2537:
2957 _rebreatherTank.remove();
2958 R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1);
2959 R2_GLOBALS._player.enableControl();
2960 break;
2961 case 20:
2962 // No break on purpose
2963 default:
2964 R2_GLOBALS._player.enableControl();
2965 break;
2966 }
2967 }
2968
2969 /*--------------------------------------------------------------------------
2970 * Scene 2600 - Spill Mountains: Exit
2971 *
2972 *--------------------------------------------------------------------------*/
2973
Scene2600()2974 Scene2600::Scene2600(): SceneExt() {
2975 _rotation = NULL;
2976 }
2977
synchronize(Serializer & s)2978 void Scene2600::synchronize(Serializer &s) {
2979 SceneExt::synchronize(s);
2980
2981 SYNC_POINTER(_rotation);
2982 }
2983
postInit(SceneObjectList * OwnerList)2984 void Scene2600::postInit(SceneObjectList *OwnerList) {
2985 loadScene(2600);
2986 R2_GLOBALS._uiElements._active = false;
2987 SceneExt::postInit();
2988 R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
2989
2990 R2_GLOBALS._sound1.fadeSound(214);
2991 R2_GLOBALS._sound2.play(215);
2992 _rotation = R2_GLOBALS._scenePalette.addRotation(176, 191, 1);
2993 _rotation->setDelay(3);
2994 _rotation->_countdown = 1;
2995 R2_GLOBALS._player.postInit();
2996 R2_GLOBALS._player.disableControl();
2997 _sceneMode = 2600;
2998 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2600, &R2_GLOBALS._player, NULL);
2999 }
3000
remove()3001 void Scene2600::remove() {
3002 R2_GLOBALS._sound1.fadeOut2(NULL);
3003 R2_GLOBALS._sound2.fadeOut2(NULL);
3004 R2_GLOBALS._uiElements._visible = true;
3005 // _rotation->remove();
3006 SceneExt::remove();
3007 }
3008
signal()3009 void Scene2600::signal() {
3010 if (_sceneMode == 2600)
3011 g_globals->_sceneManager.changeScene(3800);
3012 }
3013
3014 /*--------------------------------------------------------------------------
3015 * Scene 2700 - Outer Forest
3016 *
3017 *--------------------------------------------------------------------------*/
3018
Scene2700()3019 Scene2700::Scene2700(): SceneExt() {
3020 _areaMode = _moveMode = _stripNumber = 0;
3021
3022 _walkRect1.set(70, 122, 90, 132);
3023 _walkRect2.set(150, 122, 160, 132);
3024 _walkRect3.set(90, 142, 130, 157);
3025 _walkRect4.set(175, 137, 200, 147);
3026 _walkRect5.set(280, 127, 300, 137);
3027 _walkRect6.set(240, 157, 265, 167);
3028 }
3029
synchronize(Serializer & s)3030 void Scene2700::synchronize(Serializer &s) {
3031 SceneExt::synchronize(s);
3032
3033 s.syncAsSint16LE(_areaMode);
3034 s.syncAsSint16LE(_moveMode);
3035 s.syncAsSint16LE(_stripNumber);
3036 }
3037
signal()3038 void Scene2700::Action1::signal() {
3039 Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
3040
3041 setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
3042 scene->_ghoulHome6.animate(ANIM_MODE_5, NULL);
3043 }
3044
signal()3045 void Scene2700::Action2::signal() {
3046 Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
3047
3048 setDelay(300 + R2_GLOBALS._randomSource.getRandomNumber(300));
3049 scene->_ghoulHome7.animate(ANIM_MODE_5, NULL);
3050 }
3051
signal()3052 void Scene2700::Action3::signal() {
3053 Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
3054
3055 setDelay(450 + R2_GLOBALS._randomSource.getRandomNumber(450));
3056 scene->_ghoulHome8.animate(ANIM_MODE_8, 1, NULL);
3057 }
3058
signal()3059 void Scene2700::Action4::signal() {
3060 Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
3061
3062 setDelay(300 + R2_GLOBALS._randomSource.getRandomNumber(300));
3063 scene->_ghoulHome9.animate(ANIM_MODE_8, 1, NULL);
3064 }
3065
process(Event & event)3066 void Scene2700::SouthExit::process(Event &event) {
3067 SceneArea::process(event);
3068 if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
3069 Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
3070 R2_GLOBALS._player.disableControl();
3071 scene->_sceneMode = 10;
3072 scene->_moveMode = 2703;
3073 switch (scene->_areaMode) {
3074 case 0:
3075 // No break on purpose
3076 case 6:
3077 scene->_sceneMode = 2703;
3078 scene->setAction(&scene->_sequenceManager, scene, 2703, &R2_GLOBALS._player, NULL);
3079 break;
3080 case 1: {
3081 Common::Point pt(80, 137);
3082 NpcMover *mover = new NpcMover();
3083 R2_GLOBALS._player.addMover(mover, &pt, scene);
3084 break;
3085 }
3086 case 2: {
3087 Common::Point pt(155, 137);
3088 NpcMover *mover = new NpcMover();
3089 R2_GLOBALS._player.addMover(mover, &pt, scene);
3090 break;
3091 }
3092 case 3: {
3093 Common::Point pt(140, 162);
3094 NpcMover *mover = new NpcMover();
3095 R2_GLOBALS._player.addMover(mover, &pt, scene);
3096 break;
3097 }
3098 case 4: {
3099 Common::Point pt(155, 137);
3100 NpcMover *mover = new NpcMover();
3101 R2_GLOBALS._player.addMover(mover, &pt, scene);
3102 break;
3103 }
3104 case 5: {
3105 Common::Point pt(235, 132);
3106 NpcMover *mover = new NpcMover();
3107 R2_GLOBALS._player.addMover(mover, &pt, scene);
3108 break;
3109 }
3110 default:
3111 break;
3112 }
3113 }
3114 }
3115
process(Event & event)3116 void Scene2700::EastExit::process(Event &event) {
3117 SceneArea::process(event);
3118 if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
3119 Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
3120 R2_GLOBALS._player.disableControl();
3121 scene->_sceneMode = 10;
3122 scene->_moveMode = 2704;
3123 switch (scene->_areaMode) {
3124 case 0: {
3125 Common::Point pt(140, 162);
3126 NpcMover *mover = new NpcMover();
3127 R2_GLOBALS._player.addMover(mover, &pt, scene);
3128 break;
3129 }
3130 case 1: {
3131 Common::Point pt(80, 137);
3132 NpcMover *mover = new NpcMover();
3133 R2_GLOBALS._player.addMover(mover, &pt, scene);
3134 break;
3135 }
3136 case 2: {
3137 Common::Point pt(155, 137);
3138 NpcMover *mover = new NpcMover();
3139 R2_GLOBALS._player.addMover(mover, &pt, scene);
3140 break;
3141 }
3142 case 3: {
3143 Common::Point pt(155, 137);
3144 NpcMover *mover = new NpcMover();
3145 R2_GLOBALS._player.addMover(mover, &pt, scene);
3146 break;
3147 }
3148 case 4: {
3149 Common::Point pt(235, 132);
3150 NpcMover *mover = new NpcMover();
3151 R2_GLOBALS._player.addMover(mover, &pt, scene);
3152 break;
3153 }
3154 case 5:
3155 scene->_sceneMode = 2704;
3156 scene->setAction(&scene->_sequenceManager, scene, 2704, &R2_GLOBALS._player, NULL);
3157 break;
3158 case 6: {
3159 Common::Point pt(140, 162);
3160 NpcMover *mover = new NpcMover();
3161 R2_GLOBALS._player.addMover(mover, &pt, scene);
3162 break;
3163 }
3164 default:
3165 break;
3166 }
3167 }
3168 }
3169
postInit(SceneObjectList * OwnerList)3170 void Scene2700::postInit(SceneObjectList *OwnerList) {
3171 loadScene(2700);
3172 SceneExt::postInit();
3173 R2_GLOBALS._sound1.stop();
3174 R2_GLOBALS._sound2.stop();
3175
3176 _southExit.setDetails(Rect(135, 160, 185, 168), SHADECURSOR_DOWN);
3177 _eastExit.setDetails(Rect(300, 90, 320, 135), EXITCURSOR_E);
3178
3179 _ghoulHome6.postInit();
3180 _ghoulHome6.setup(2700, 1, 1);
3181 _ghoulHome6.setPosition(Common::Point(140, 29));
3182 _ghoulHome6.setAction(&_action1);
3183
3184 _ghoulHome7.postInit();
3185 _ghoulHome7.setup(2700, 2, 1);
3186 _ghoulHome7.setPosition(Common::Point(213, 32));
3187 _ghoulHome7.setAction(&_action2);
3188
3189 _ghoulHome8.postInit();
3190 _ghoulHome8.setup(2700, 3, 1);
3191 _ghoulHome8.setPosition(Common::Point(17, 39));
3192 _ghoulHome8.setAction(&_action3);
3193
3194 _ghoulHome9.postInit();
3195 _ghoulHome9.setup(2700, 5, 1);
3196 _ghoulHome9.setPosition(Common::Point(17, 71));
3197 _ghoulHome9.setAction(&_action4);
3198
3199 _ghoulHome1.setDetails(Rect(52, 38, 68, 60), 2700, 4, -1, 6, 1, NULL);
3200 _ghoulHome2.setDetails(Rect(113, 22, 127, 33), 2700, 4, -1, 6, 1, NULL);
3201 _ghoulHome3.setDetails(Rect(161, 44, 170, 52), 2700, 4, -1, 6, 1, NULL);
3202 _ghoulHome4.setDetails(Rect(221, 19, 233, 31), 2700, 4, -1, 6, 1, NULL);
3203 _ghoulHome5.setDetails(Rect(235, 59, 250, 75), 2700, 4, -1, 6, 1, NULL);
3204 _background.setDetails(Rect(0, 0, 320, 200), 2700, 4, -1, 6, 1, NULL);
3205
3206 _stripManager.setColors(60, 255);
3207 _stripManager.setFontNumber(3);
3208 _stripManager.addSpeaker(&_quinnSpeaker);
3209 _stripManager.addSpeaker(&_nejSpeaker);
3210
3211 R2_GLOBALS._player.postInit();
3212 R2_GLOBALS._player.setVisage(19);
3213 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
3214 R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
3215 R2_GLOBALS._player.disableControl();
3216
3217 if (R2_INVENTORY.getObjectScene(R2_FLUTE) == 0)
3218 R2_GLOBALS._sound1.changeSound(234);
3219
3220 if (R2_GLOBALS._sceneManager._previousScene == 2750) {
3221 _sceneMode = 2702;
3222 _areaMode = 5;
3223 setAction(&_sequenceManager, this, 2702, &R2_GLOBALS._player, NULL);
3224 } else {
3225 _areaMode = 0;
3226 if (R2_GLOBALS._sceneManager._previousScene == 3900) {
3227 _sceneMode = 2701;
3228 setAction(&_sequenceManager, this, 2701, &R2_GLOBALS._player, NULL);
3229 } else {
3230 R2_GLOBALS._player.setStrip(3);
3231 R2_GLOBALS._player.setPosition(Common::Point(164, 160));
3232 R2_GLOBALS._player.enableControl();
3233 }
3234 }
3235 }
3236
signal()3237 void Scene2700::signal() {
3238 switch (_sceneMode) {
3239 case 10:
3240 switch (_moveMode) {
3241 case 1:
3242 switch (_areaMode) {
3243 case 0:
3244 case 2:
3245 case 4:
3246 case 6:
3247 _areaMode = 3;
3248 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2705, &R2_GLOBALS._player, NULL);
3249 break;
3250 case 3: {
3251 _sceneMode = _moveMode;
3252 _areaMode = 1;
3253 Common::Point pt(80, 127);
3254 NpcMover *mover = new NpcMover();
3255 R2_GLOBALS._player.addMover(mover, &pt, this);
3256 break;
3257 }
3258 case 5:
3259 _areaMode = 4;
3260 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
3261 break;
3262 default: // includes case 1
3263 break;
3264 }
3265 break;
3266 case 2:
3267 switch (_areaMode) {
3268 case 0:
3269 case 1:
3270 case 6:
3271 _areaMode = 3;
3272 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
3273 break;
3274 case 3:
3275 case 4: {
3276 _sceneMode = _moveMode;
3277 _areaMode = 2;
3278 Common::Point pt(155, 127);
3279 NpcMover *mover = new NpcMover();
3280 R2_GLOBALS._player.addMover(mover, &pt, this);
3281 break;
3282 }
3283 case 5:
3284 _areaMode = 4;
3285 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
3286 break;
3287 default: // includes case 2
3288 break;
3289 }
3290 break;
3291 case 3:
3292 switch (_areaMode) {
3293 case 0:
3294 case 1:
3295 case 2:
3296 case 4:
3297 case 6: {
3298 _sceneMode = _moveMode;
3299 _areaMode = 3;
3300 Common::Point pt(115, 152);
3301 NpcMover *mover = new NpcMover();
3302 R2_GLOBALS._player.addMover(mover, &pt, this);
3303 break;
3304 }
3305 case 5:
3306 _areaMode = 4;
3307 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
3308 break;
3309 default: // includes case 3
3310 break;
3311 }
3312 break;
3313 case 4:
3314 switch (_areaMode) {
3315 case 0:
3316 case 1:
3317 case 6:
3318 _areaMode = 3;
3319 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
3320 break;
3321 case 2:
3322 case 3:
3323 _areaMode = 4;
3324 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2709, &R2_GLOBALS._player, NULL);
3325 break;
3326 case 4:
3327 case 5:
3328 _sceneMode = _moveMode;
3329 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2704, &R2_GLOBALS._player, NULL);
3330 break;
3331 default:
3332 break;
3333 }
3334 break;
3335 case 5:
3336 switch (_areaMode) {
3337 case 0:
3338 case 1:
3339 case 6:
3340 _areaMode = 3;
3341 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
3342 break;
3343 case 2:
3344 case 3:
3345 _areaMode = 4;
3346 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2709, &R2_GLOBALS._player, NULL);
3347 break;
3348 case 4: {
3349 _sceneMode = _moveMode;
3350 _areaMode = 5;
3351 Common::Point pt(285, 132);
3352 NpcMover *mover = new NpcMover();
3353 R2_GLOBALS._player.addMover(mover, &pt, this);
3354 break;
3355 }
3356 default: // includes case 5
3357 break;
3358 }
3359 break;
3360 case 6:
3361 switch (_areaMode) {
3362 case 0:
3363 case 3: {
3364 _sceneMode = _moveMode;
3365 _areaMode = 6;
3366 Common::Point pt(250, 162);
3367 NpcMover *mover = new NpcMover();
3368 R2_GLOBALS._player.addMover(mover, &pt, this);
3369 break;
3370 }
3371 case 1:
3372 case 2:
3373 case 4:
3374 _areaMode = 3;
3375 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2707, &R2_GLOBALS._player, NULL);
3376 break;
3377 case 5:
3378 _areaMode = 4;
3379 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
3380 break;
3381 default:
3382 break;
3383 }
3384 break;
3385 case 2703:
3386 switch (_areaMode) {
3387 case 0:
3388 case 3:
3389 case 6:
3390 _sceneMode = _moveMode;
3391 setAction(&_sequenceManager, this, 2703, &R2_GLOBALS._player, NULL);
3392 break;
3393 case 1:
3394 case 2:
3395 case 4:
3396 _areaMode = 3;
3397 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2707, &R2_GLOBALS._player, NULL);
3398 break;
3399 case 5:
3400 _areaMode = 4;
3401 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
3402 break;
3403 default:
3404 break;
3405 }
3406 break;
3407 case 2704:
3408 switch (_areaMode) {
3409 case 0:
3410 case 1:
3411 case 6:
3412 _areaMode = 3;
3413 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2706, &R2_GLOBALS._player, NULL);
3414 break;
3415 case 2:
3416 case 3:
3417 _areaMode = 4;
3418 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2709, &R2_GLOBALS._player, NULL);
3419 break;
3420 case 4:
3421 case 5:
3422 _sceneMode = _moveMode;
3423 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2704, &R2_GLOBALS._player, NULL);
3424 break;
3425 default:
3426 break;
3427 }
3428 break;
3429 case 2710:
3430 switch (_areaMode) {
3431 case 0:
3432 case 1:
3433 case 3:
3434 _areaMode = 3;
3435 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2707, &R2_GLOBALS._player, NULL);
3436 break;
3437 case 2:
3438 case 5: {
3439 _sceneMode = _moveMode;
3440 Common::Point pt(164, 160);
3441 NpcMover *mover = new NpcMover();
3442 R2_GLOBALS._player.addMover(mover, &pt, this);
3443 break;
3444 }
3445 case 4:
3446 _areaMode = 4;
3447 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2708, &R2_GLOBALS._player, NULL);
3448 break;
3449 default:
3450 break;
3451 }
3452 break;
3453 default:
3454 break;
3455 }
3456 break;
3457 case 11:
3458 R2_INVENTORY.setObjectScene(R2_FLUTE, 0);
3459 R2_GLOBALS._player.disableControl();
3460 _areaMode = 0;
3461 _sceneMode = 2700;
3462 setAction(&_sequenceManager, this, 2700, &_nej, NULL);
3463 break;
3464 case 12:
3465 R2_GLOBALS._sound1.play(234);
3466 R2_GLOBALS._events.setCursor(CURSOR_WALK);
3467 _sceneMode = 2711;
3468 _stripManager.start(_stripNumber, this);
3469 break;
3470 case 13:
3471 R2_GLOBALS._events.setCursor(CURSOR_WALK);
3472 _sceneMode = 2712;
3473 _stripManager.start(_stripNumber, this);
3474 break;
3475 case 14:
3476 R2_GLOBALS._events.setCursor(CURSOR_WALK);
3477 _sceneMode = 2713;
3478 _stripManager.start(_stripNumber, this);
3479 break;
3480 case 15:
3481 R2_GLOBALS._events.setCursor(CURSOR_WALK);
3482 _sceneMode = 11;
3483 _stripManager.start(_stripNumber, this);
3484 break;
3485 case 2700:
3486 _nej.remove();
3487 R2_GLOBALS._player.enableControl(CURSOR_WALK);
3488 break;
3489 case 2703:
3490 g_globals->_sceneManager.changeScene(3900);
3491 break;
3492 case 2704:
3493 g_globals->_sceneManager.changeScene(2750);
3494 break;
3495 case 2710:
3496 // Start of Nej assault
3497 _stripNumber = 1200;
3498 _sceneMode = 12;
3499 _nej.postInit();
3500 setAction(&_sequenceManager, this, 2710, &R2_GLOBALS._player, &_nej, NULL);
3501 break;
3502 case 2711:
3503 R2_GLOBALS._player.disableControl();
3504 _stripNumber = 1201;
3505 _sceneMode = 13;
3506 setAction(&_sequenceManager, this, 2711, &R2_GLOBALS._player, &_nej, NULL);
3507 break;
3508 case 2712:
3509 R2_GLOBALS._player.disableControl();
3510 _stripNumber = 1202;
3511 _sceneMode = 14;
3512 setAction(&_sequenceManager, this, 2712, &R2_GLOBALS._player, &_nej, NULL);
3513 break;
3514 case 2713:
3515 R2_GLOBALS._player.disableControl();
3516 _stripNumber = 1203;
3517 _sceneMode = 15;
3518 setAction(&_sequenceManager, this, 2713, &R2_GLOBALS._player, &_nej, NULL);
3519 break;
3520 default:
3521 R2_GLOBALS._player.enableControl(CURSOR_WALK);
3522 break;
3523 }
3524 }
process(Event & event)3525 void Scene2700::process(Event &event) {
3526 if ((R2_GLOBALS._player._canWalk) && (event.eventType == EVENT_BUTTON_DOWN)) {
3527 if (R2_GLOBALS._events.getCursor() == R2_FLUTE) {
3528 if (R2_GLOBALS._player._bounds.contains(event.mousePos)) {
3529 _sceneMode = 10;
3530 _moveMode = 2710;
3531 R2_GLOBALS._player.disableControl();
3532 R2_GLOBALS._events.setCursor(CURSOR_WALK);
3533
3534 switch (_areaMode) {
3535 case 0: {
3536 _sceneMode = 2710;
3537 Common::Point pt(164, 160);
3538 NpcMover *mover = new NpcMover();
3539 R2_GLOBALS._player.addMover(mover, &pt, this);
3540 break;
3541 }
3542 case 1: {
3543 Common::Point pt(80, 137);
3544 NpcMover *mover = new NpcMover();
3545 R2_GLOBALS._player.addMover(mover, &pt, this);
3546 break;
3547 }
3548 case 2: {
3549 Common::Point pt(155, 137);
3550 NpcMover *mover = new NpcMover();
3551 R2_GLOBALS._player.addMover(mover, &pt, this);
3552 break;
3553 }
3554 case 3: {
3555 Common::Point pt(140, 162);
3556 NpcMover *mover = new NpcMover();
3557 R2_GLOBALS._player.addMover(mover, &pt, this);
3558 break;
3559 }
3560 case 4: {
3561 Common::Point pt(155, 137);
3562 NpcMover *mover = new NpcMover();
3563 R2_GLOBALS._player.addMover(mover, &pt, this);
3564 break;
3565 }
3566 case 5: {
3567 Common::Point pt(235, 132);
3568 NpcMover *mover = new NpcMover();
3569 R2_GLOBALS._player.addMover(mover, &pt, this);
3570 break;
3571 }
3572 case 6: {
3573 Common::Point pt(205, 162);
3574 NpcMover *mover = new NpcMover();
3575 R2_GLOBALS._player.addMover(mover, &pt, this);
3576 break;
3577 }
3578 default:
3579 break;
3580 }
3581 } else {
3582 SceneItem::display(2700, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
3583 }
3584
3585 event.handled = true;
3586 } else if (R2_GLOBALS._events.getCursor() == CURSOR_WALK) {
3587 if (_walkRect1.contains(event.mousePos)) {
3588 if (!_walkRect1.contains(R2_GLOBALS._player._position)) {
3589 event.handled = true;
3590 _sceneMode = 10;
3591 _moveMode = 1;
3592 }
3593 } else if (_walkRect2.contains(event.mousePos)) {
3594 if (!_walkRect2.contains(R2_GLOBALS._player._position)) {
3595 event.handled = true;
3596 _sceneMode = 10;
3597 _moveMode = 2;
3598 }
3599 } else if (_walkRect3.contains(event.mousePos)) {
3600 if (!_walkRect3.contains(R2_GLOBALS._player._position)) {
3601 event.handled = true;
3602 _sceneMode = 10;
3603 _moveMode = 3;
3604 }
3605 } else if (_walkRect4.contains(event.mousePos)) {
3606 if (!_walkRect4.contains(R2_GLOBALS._player._position)) {
3607 event.handled = true;
3608 _sceneMode = 10;
3609 _moveMode = 4;
3610 }
3611 } else if (_walkRect5.contains(event.mousePos)) {
3612 if (!_walkRect5.contains(R2_GLOBALS._player._position)) {
3613 event.handled = true;
3614 _sceneMode = 10;
3615 _moveMode = 5;
3616 }
3617 } else if (_walkRect6.contains(event.mousePos)) {
3618 if (!_walkRect6.contains(R2_GLOBALS._player._position)) {
3619 event.handled = true;
3620 _sceneMode = 10;
3621 _moveMode = 6;
3622 }
3623 } else {
3624 event.handled = true;
3625 R2_GLOBALS._player.updateAngle(Common::Point(event.mousePos.x, event.mousePos.y));
3626 }
3627 if (_sceneMode == 10) {
3628 R2_GLOBALS._player.disableControl();
3629 switch (_areaMode) {
3630 case 0:
3631 if (_moveMode >= 6) {
3632 Common::Point pt(205, 162);
3633 NpcMover *mover = new NpcMover();
3634 R2_GLOBALS._player.addMover(mover, &pt, this);
3635 } else {
3636 Common::Point pt(140, 162);
3637 NpcMover *mover = new NpcMover();
3638 R2_GLOBALS._player.addMover(mover, &pt, this);
3639 }
3640 break;
3641 case 1: {
3642 Common::Point pt(80, 137);
3643 NpcMover *mover = new NpcMover();
3644 R2_GLOBALS._player.addMover(mover, &pt, this);
3645 break;
3646 }
3647 case 2: {
3648 Common::Point pt(155, 137);
3649 NpcMover *mover = new NpcMover();
3650 R2_GLOBALS._player.addMover(mover, &pt, this);
3651 break;
3652 }
3653 case 3:
3654 if (_moveMode == 1) {
3655 Common::Point pt(80, 137);
3656 NpcMover *mover = new NpcMover();
3657 R2_GLOBALS._player.addMover(mover, &pt, this);
3658 } else if (_moveMode == 6) {
3659 Common::Point pt(140, 162);
3660 NpcMover *mover = new NpcMover();
3661 R2_GLOBALS._player.addMover(mover, &pt, this);
3662 } else {
3663 Common::Point pt(155, 137);
3664 NpcMover *mover = new NpcMover();
3665 R2_GLOBALS._player.addMover(mover, &pt, this);
3666 }
3667 break;
3668 case 4:
3669 if (_moveMode == 5) {
3670 Common::Point pt(235, 132);
3671 NpcMover *mover = new NpcMover();
3672 R2_GLOBALS._player.addMover(mover, &pt, this);
3673 } else {
3674 Common::Point pt(155, 137);
3675 NpcMover *mover = new NpcMover();
3676 R2_GLOBALS._player.addMover(mover, &pt, this);
3677 }
3678 break;
3679 case 5: {
3680 Common::Point pt(235, 132);
3681 NpcMover *mover = new NpcMover();
3682 R2_GLOBALS._player.addMover(mover, &pt, this);
3683 break;
3684 }
3685 case 6: {
3686 Common::Point pt(140, 162);
3687 NpcMover *mover = new NpcMover();
3688 R2_GLOBALS._player.addMover(mover, &pt, this);
3689 break;
3690 }
3691 default:
3692 break;
3693 }
3694 }
3695 }
3696 }
3697 Scene::process(event);
3698 }
3699
3700 /*--------------------------------------------------------------------------
3701 * Scene 2750 - Inner Forest
3702 *
3703 *--------------------------------------------------------------------------*/
3704
Scene2750()3705 Scene2750::Scene2750(): SceneExt() {
3706 _areaMode = _moveMode = _stripNumber = 0;
3707 }
3708
synchronize(Serializer & s)3709 void Scene2750::synchronize(Serializer &s) {
3710 SceneExt::synchronize(s);
3711
3712 s.syncAsSint16LE(_areaMode);
3713 s.syncAsSint16LE(_moveMode);
3714 s.syncAsSint16LE(_stripNumber);
3715 }
3716
signal()3717 void Scene2750::Action1::signal() {
3718 Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
3719
3720 switch (_actionIndex) {
3721 case 1:
3722 setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(240));
3723 _actionIndex = 2;
3724 scene->_bird2.show();
3725 scene->_bird2.animate(ANIM_MODE_8, 1, NULL);
3726 break;
3727 case 2:
3728 setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(600));
3729 _actionIndex = 0;
3730 scene->_bird2.show();
3731 scene->_bird1.animate(ANIM_MODE_2, NULL);
3732 break;
3733 default:
3734 setDelay(30);
3735 _actionIndex = 1;
3736 scene->_bird1.animate(ANIM_MODE_6, NULL);
3737 scene->_folliage1.animate(ANIM_MODE_8, 1, NULL);
3738 break;
3739 }
3740 }
3741
signal()3742 void Scene2750::Action2::signal() {
3743 Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
3744
3745 setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
3746 scene->_folliage2.animate(ANIM_MODE_8, 1, NULL);
3747 }
3748
signal()3749 void Scene2750::Action3::signal() {
3750 Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
3751
3752 if (scene->_folliage3._position.x <= 320) {
3753 setDelay(1800 + R2_GLOBALS._randomSource.getRandomNumber(600));
3754 } else {
3755 setDelay(60);
3756 scene->_folliage3.setPosition(Common::Point(-10, 25));
3757 Common::Point pt(330, 45);
3758 NpcMover *mover = new NpcMover();
3759 scene->_folliage3.addMover(mover, &pt, NULL);
3760 }
3761 }
3762
signal()3763 void Scene2750::Action4::signal() {
3764 Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
3765
3766 setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
3767 scene->_folliage4.animate(ANIM_MODE_8, 1, NULL);
3768 }
3769
signal()3770 void Scene2750::Action5::signal() {
3771 Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
3772
3773 setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
3774 scene->_folliage5.animate(ANIM_MODE_8, 1, NULL);
3775 }
3776
signal()3777 void Scene2750::Action6::signal() {
3778 Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
3779
3780 setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
3781 scene->_folliage6.animate(ANIM_MODE_8, 1, NULL);
3782 }
3783
signal()3784 void Scene2750::Action7::signal() {
3785 Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
3786
3787 setDelay(600 + R2_GLOBALS._randomSource.getRandomNumber(300));
3788 scene->_folliage7.animate(ANIM_MODE_8, 1, NULL);
3789 }
3790
process(Event & event)3791 void Scene2750::WestExit::process(Event &event) {
3792 SceneArea::process(event);
3793 if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
3794 Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
3795 R2_GLOBALS._player.disableControl();
3796 scene->_sceneMode = 10;
3797 scene->_moveMode = 2752;
3798 switch (scene->_areaMode) {
3799 case 1: {
3800 scene->_sceneMode = 2752;
3801 scene->setAction(&scene->_sequenceManager, scene, 2752, &R2_GLOBALS._player, NULL);
3802 break;
3803 }
3804 case 2: {
3805 Common::Point pt(140, 142);
3806 NpcMover *mover = new NpcMover();
3807 R2_GLOBALS._player.addMover(mover, &pt, scene);
3808 break;
3809 }
3810 case 3: {
3811 Common::Point pt(210, 142);
3812 NpcMover *mover = new NpcMover();
3813 R2_GLOBALS._player.addMover(mover, &pt, scene);
3814 break;
3815 }
3816 default:
3817 break;
3818 }
3819 }
3820 }
3821
process(Event & event)3822 void Scene2750::EastExit::process(Event &event) {
3823 SceneArea::process(event);
3824 if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._player._canWalk) && (_bounds.contains(event.mousePos))) {
3825 Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
3826 R2_GLOBALS._player.disableControl();
3827 scene->_sceneMode = 10;
3828 scene->_moveMode = 2753;
3829 switch (scene->_areaMode) {
3830 case 1: {
3831 Common::Point pt(140, 142);
3832 NpcMover *mover = new NpcMover();
3833 R2_GLOBALS._player.addMover(mover, &pt, scene);
3834 break;
3835 }
3836 case 2: {
3837 Common::Point pt(210, 142);
3838 NpcMover *mover = new NpcMover();
3839 R2_GLOBALS._player.addMover(mover, &pt, scene);
3840 break;
3841 }
3842 case 3: {
3843 scene->_sceneMode = 2753;
3844 scene->setAction(&scene->_sequenceManager, scene, 2753, &R2_GLOBALS._player, NULL);
3845 break;
3846 }
3847 default:
3848 break;
3849 }
3850 }
3851 }
3852
postInit(SceneObjectList * OwnerList)3853 void Scene2750::postInit(SceneObjectList *OwnerList) {
3854 loadScene(2750);
3855 R2_GLOBALS._sound2.stop();
3856 SceneExt::postInit();
3857 _westExit.setDetails(Rect(0, 90, 20, 135), EXITCURSOR_W);
3858 _eastExit.setDetails(Rect(300, 90, 320, 135), EXITCURSOR_E);
3859
3860 _walkRect1.set(30, 127, 155, 147);
3861 _walkRect2.set(130, 142, 210, 167);
3862 _walkRect3.set(-1, 137, 290, 147);
3863
3864 if (R2_INVENTORY.getObjectScene(R2_FLUTE) == 0) {
3865 R2_GLOBALS._sound1.changeSound(235);
3866 _fire.postInit();
3867 _fire.setup(2751, 1, 1);
3868 _fire.setPosition(Common::Point(104, 158));
3869 _fire.animate(ANIM_MODE_2, NULL);
3870 }
3871
3872 _bird1.postInit();
3873 _bird1.setup(2750, 1, 1);
3874 _bird1.setPosition(Common::Point(188, 34));
3875 _bird1.animate(ANIM_MODE_2, NULL);
3876 _bird1._numFrames = 16;
3877
3878 _folliage1.postInit();
3879 _folliage1.setup(2700, 4, 1);
3880 _folliage1.setPosition(Common::Point(188, 37));
3881 _folliage1.fixPriority(26);
3882
3883 _bird2.postInit();
3884 _bird2.setup(2750, 2, 1);
3885 _bird2.setPosition(Common::Point(188, 34));
3886 _bird2.hide();
3887
3888 _bird1.setAction(&_action1);
3889
3890 _folliage2.postInit();
3891 _folliage2.setup(2750, 3, 1);
3892 _folliage2.setPosition(Common::Point(9, 167));
3893 _folliage2.fixPriority(252);
3894 _folliage2.setAction(&_action2);
3895
3896 _folliage3.postInit();
3897 _folliage3.setup(2750, 4, 1);
3898 _folliage3.setPosition(Common::Point(-10, 25));
3899 _folliage3.animate(ANIM_MODE_1, NULL);
3900 _folliage3.setStrip2(4);
3901 _folliage3._moveRate = 20;
3902 _folliage3.setAction(&_action3);
3903
3904 _folliage4.postInit();
3905 _folliage4.fixPriority(26);
3906 _folliage4.setup(2750, 5, 1);
3907 _folliage4.setPosition(Common::Point(258, 33));
3908 _folliage4.setAction(&_action4);
3909
3910 _folliage5.postInit();
3911 _folliage5.fixPriority(26);
3912 _folliage5.setup(2750, 6, 1);
3913 _folliage5.setPosition(Common::Point(61, 38));
3914 _folliage5.setAction(&_action5);
3915
3916 _folliage6.postInit();
3917 _folliage6.fixPriority(26);
3918 _folliage6.setup(2750, 7, 1);
3919 _folliage6.setPosition(Common::Point(69, 37));
3920 _folliage6.setAction(&_action6);
3921
3922 _folliage7.postInit();
3923 _folliage7.fixPriority(26);
3924 _folliage7.setup(2750, 8, 1);
3925 _folliage7.setPosition(Common::Point(80, 35));
3926 _folliage7.setAction(&_action7);
3927
3928 _ghoulHome1.setDetails(Rect(29, 50, 35, 56), 2750, 3, -1, 5, 1, NULL);
3929 _ghoulHome2.setDetails(Rect(47, 36, 54, 42), 2750, 3, -1, 5, 1, NULL);
3930 _ghoulHome3.setDetails(Rect(193, 21, 206, 34), 2750, 3, -1, 5, 1, NULL);
3931 _ghoulHome4.setDetails(Rect(301, 18, 315, 32), 2750, 3, -1, 5, 1, NULL);
3932 _background.setDetails(Rect(0, 0, 320, 200), 2700, 0, -1, 2, 1, NULL);
3933
3934 _stripManager.setColors(60, 255);
3935 _stripManager.setFontNumber(3);
3936 _stripManager.addSpeaker(&_quinnSpeaker);
3937 _stripManager.addSpeaker(&_nejSpeaker);
3938
3939 if (R2_INVENTORY.getObjectScene(R2_FLUTE) == 0) {
3940 _nej.postInit();
3941 _nej.setup(2752, 5, 1);
3942 _nej.animate(ANIM_MODE_NONE, NULL);
3943 _nej.setPosition(Common::Point(101, 148));
3944 }
3945
3946 R2_GLOBALS._player.postInit();
3947 R2_GLOBALS._player.setVisage(19);
3948 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
3949 R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
3950 R2_GLOBALS._player.disableControl();
3951
3952 if (R2_GLOBALS._sceneManager._previousScene == 2700) {
3953 if (R2_INVENTORY.getObjectScene(R2_FLUTE) == 0) {
3954 R2_GLOBALS._player.setVisage(2752);
3955 R2_GLOBALS._player.setStrip(6);
3956 R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
3957 R2_GLOBALS._player.setPosition(Common::Point(81, 165));
3958
3959 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
3960 _stripNumber = 1204;
3961 _sceneMode = 11;
3962 _stripManager.start(_stripNumber, this);
3963 } else {
3964 _sceneMode = 2750;
3965 _areaMode = 1;
3966 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2750, &R2_GLOBALS._player, NULL);
3967 }
3968 } else if (R2_GLOBALS._sceneManager._previousScene == 2800) {
3969 _sceneMode = 2751;
3970 _areaMode = 3;
3971 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2751, &R2_GLOBALS._player, NULL);
3972 } else {
3973 _areaMode = 1;
3974 R2_GLOBALS._player.setPosition(Common::Point(90, 137));
3975 R2_GLOBALS._player.setStrip(3);
3976 R2_GLOBALS._player.enableControl();
3977 }
3978 }
3979
signal()3980 void Scene2750::signal() {
3981 switch (_sceneMode) {
3982 case 10:
3983 switch (_moveMode) {
3984 case 1:
3985 switch (_areaMode) {
3986 case 2: {
3987 _sceneMode = _moveMode;
3988 _areaMode = 1;
3989 Common::Point pt(90, 137);
3990 NpcMover *mover = new NpcMover();
3991 R2_GLOBALS._player.addMover(mover, &pt, this);
3992 }
3993 break;
3994 case 3: {
3995 _areaMode = 2;
3996 Common::Point pt(140, 142);
3997 NpcMover *mover = new NpcMover();
3998 R2_GLOBALS._player.addMover(mover, &pt, this);
3999 }
4000 break;
4001 default:
4002 break;
4003 }
4004 break;
4005 case 2: {
4006 _sceneMode = _moveMode;
4007 _areaMode = 2;
4008 Common::Point pt(170, 162);
4009 NpcMover *mover = new NpcMover();
4010 R2_GLOBALS._player.addMover(mover, &pt, this);
4011 }
4012 break;
4013 case 3:
4014 switch (_areaMode) {
4015 case 1: {
4016 _areaMode = 2;
4017 Common::Point pt(210, 142);
4018 NpcMover *mover = new NpcMover();
4019 R2_GLOBALS._player.addMover(mover, &pt, this);
4020 }
4021 break;
4022 case 2: {
4023 _sceneMode = _moveMode;
4024 _areaMode = 3;
4025 Common::Point pt(270, 142);
4026 NpcMover *mover = new NpcMover();
4027 R2_GLOBALS._player.addMover(mover, &pt, this);
4028 }
4029 break;
4030 default:
4031 break;
4032 }
4033 break;
4034 case 2752:
4035 switch (_areaMode) {
4036 case 1:
4037 _sceneMode = _moveMode;
4038 setAction(&_sequenceManager, this, 2752, &R2_GLOBALS._player, NULL);
4039 break;
4040 case 2: {
4041 _areaMode = 1;
4042 Common::Point pt(20, 132);
4043 NpcMover *mover = new NpcMover();
4044 R2_GLOBALS._player.addMover(mover, &pt, this);
4045 }
4046 break;
4047 case 3: {
4048 _areaMode = 2;
4049 Common::Point pt(140, 142);
4050 NpcMover *mover = new NpcMover();
4051 R2_GLOBALS._player.addMover(mover, &pt, this);
4052 }
4053 break;
4054 default:
4055 break;
4056 }
4057 break;
4058 case 2753:
4059 switch (_areaMode) {
4060 case 1: {
4061 _areaMode = 2;
4062 Common::Point pt(210, 142);
4063 NpcMover *mover = new NpcMover();
4064 R2_GLOBALS._player.addMover(mover, &pt, this);
4065 }
4066 break;
4067 case 2: {
4068 _areaMode = 3;
4069 Common::Point pt(300, 132);
4070 NpcMover *mover = new NpcMover();
4071 R2_GLOBALS._player.addMover(mover, &pt, this);
4072 }
4073 break;
4074 case 3:
4075 _sceneMode = _moveMode;
4076 setAction(&_sequenceManager, this, 2753, &R2_GLOBALS._player, NULL);
4077 break;
4078 default:
4079 break;
4080 }
4081 break;
4082 default:
4083 break;
4084 }
4085 break;
4086 case 11:
4087 // No break on purpose
4088 case 2753:
4089 g_globals->_sceneManager.changeScene(2800);
4090 break;
4091 case 2752:
4092 g_globals->_sceneManager.changeScene(2700);
4093 break;
4094 default:
4095 R2_GLOBALS._player.enableControl(CURSOR_WALK);
4096 break;
4097 }
4098 }
4099
process(Event & event)4100 void Scene2750::process(Event &event) {
4101 if ((R2_GLOBALS._player._canWalk) && (event.eventType == EVENT_BUTTON_DOWN)
4102 && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN)) {
4103 if (_walkRect1.contains(event.mousePos)) {
4104 if (!_walkRect1.contains(R2_GLOBALS._player._position)) {
4105 event.handled = true;
4106 _sceneMode = 10;
4107 _moveMode = 1;
4108 }
4109 } else if (_walkRect2.contains(event.mousePos)) {
4110 if (!_walkRect2.contains(R2_GLOBALS._player._position)) {
4111 event.handled = true;
4112 _sceneMode = 10;
4113 _moveMode = 2;
4114 }
4115 } else if (_walkRect3.contains(event.mousePos)) {
4116 if (!_walkRect3.contains(R2_GLOBALS._player._position)) {
4117 event.handled = true;
4118 _sceneMode = 10;
4119 _moveMode = 3;
4120 }
4121 } else {
4122 event.handled = true;
4123 R2_GLOBALS._player.updateAngle(Common::Point(event.mousePos.x, event.mousePos.y));
4124 }
4125
4126 if (_sceneMode == 10) {
4127 R2_GLOBALS._player.disableControl();
4128 switch (_areaMode) {
4129 case 1: {
4130 Common::Point pt(140, 142);
4131 NpcMover *mover = new NpcMover();
4132 R2_GLOBALS._player.addMover(mover, &pt, this);
4133 }
4134 break;
4135 case 2:
4136 if (_moveMode == 1) {
4137 Common::Point pt(140, 142);
4138 NpcMover *mover = new NpcMover();
4139 R2_GLOBALS._player.addMover(mover, &pt, this);
4140 } else {
4141 Common::Point pt(210, 142);
4142 NpcMover *mover = new NpcMover();
4143 R2_GLOBALS._player.addMover(mover, &pt, this);
4144 }
4145 break;
4146 case 3: {
4147 Common::Point pt(210, 142);
4148 NpcMover *mover = new NpcMover();
4149 R2_GLOBALS._player.addMover(mover, &pt, this);
4150 }
4151 break;
4152 default:
4153 break;
4154 }
4155 }
4156 }
4157 Scene::process(event);
4158 }
4159
4160 /*--------------------------------------------------------------------------
4161 * Scene 2800 - Guard post
4162 *
4163 *--------------------------------------------------------------------------*/
4164
Scene2800()4165 Scene2800::Scene2800(): SceneExt() {
4166 _stripNumber = 0;
4167 }
4168
synchronize(Serializer & s)4169 void Scene2800::synchronize(Serializer &s) {
4170 SceneExt::synchronize(s);
4171
4172 s.syncAsSint16LE(_stripNumber);
4173 }
4174
startAction(CursorType action,Event & event)4175 bool Scene2800::Outpost::startAction(CursorType action, Event &event) {
4176 if ((action == CURSOR_USE) && (R2_GLOBALS.getFlag(47))) {
4177 Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
4178
4179 R2_GLOBALS._player.disableControl();
4180 scene->_sceneMode = 2805;
4181 scene->setAction(&scene->_sequenceManager, scene, 2805, &R2_GLOBALS._player, NULL);
4182 return true;
4183 } else
4184 return SceneHotspot::startAction(action, event);
4185 }
4186
startAction(CursorType action,Event & event)4187 bool Scene2800::Guard::startAction(CursorType action, Event &event) {
4188 Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
4189
4190 if (action == CURSOR_TALK) {
4191 R2_GLOBALS._player.disableControl();
4192 R2_GLOBALS._events.setCursor(CURSOR_WALK);
4193 R2_GLOBALS.setFlag(47);
4194 scene->_stripNumber = 1205;
4195 scene->_sceneMode = 2803;
4196 scene->_stripManager.start(scene->_stripNumber, scene);
4197 return true;
4198 } else if (action == R2_SONIC_STUNNER) {
4199 R2_GLOBALS._events.setCursor(CURSOR_ARROW);
4200 R2_GLOBALS._player.disableControl();
4201 R2_GLOBALS.setFlag(47);
4202 scene->_sceneMode = 10;
4203 scene->setAction(&scene->_sequenceManager, scene, 2802, &R2_GLOBALS._player, &scene->_nej, &scene->_guard, NULL);
4204 return true;
4205 } else
4206 return SceneActor::startAction(action, event);
4207 }
4208
signal()4209 void Scene2800::Action1::signal() {
4210 Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
4211
4212 if (R2_GLOBALS._player._position.x <= 320) {
4213 setDelay(120);
4214 Common::Point pt(330, 25);
4215 NpcMover *mover = new NpcMover();
4216 scene->_bird.addMover(mover, &pt, NULL);
4217 } else {
4218 setDelay(1800 + R2_GLOBALS._randomSource.getRandomNumber(600));
4219 scene->_bird.setPosition(Common::Point(-10, 45));
4220 }
4221 }
4222
signal()4223 void Scene2800::Action2::signal() {
4224 Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
4225
4226 switch (_actionIndex++) {
4227 case 0:
4228 setDelay(240);
4229 R2_GLOBALS._sound1.changeSound(240);
4230 R2_GLOBALS._sound2.stop();
4231 break;
4232 case 1:
4233 _object2.postInit();
4234 _object2.setVisage(2800);
4235 _object2.setStrip(1);
4236 _object2._numFrames = 8;
4237 _object2._moveRate = 8;
4238 _object2.changeZoom(100);
4239 _object2.setPosition(Common::Point(1, 1));
4240 _object2.show();
4241 _object2.animate(ANIM_MODE_5, this);
4242 break;
4243 case 2:
4244 R2_GLOBALS._sound2.play(130);
4245 _object2.setVisage(2800);
4246 _object2.setStrip(7);
4247
4248 _object3.postInit();
4249 _object3.setVisage(2800);
4250 _object3.setStrip(3);
4251 _object3._numFrames = 8;
4252 _object3._moveRate = 8;
4253 _object3.changeZoom(100);
4254 _object3.setPosition(Common::Point(300, 104));
4255 _object3.show();
4256 _object3.animate(ANIM_MODE_5, this);
4257 break;
4258 case 3:
4259 R2_GLOBALS._sound1.play(241);
4260 _object4.postInit();
4261 _object4.setVisage(2800);
4262 _object4.setStrip(2);
4263 _object4._numFrames = 4;
4264 _object4._moveRate = 4;
4265 _object4.changeZoom(100);
4266 _object4.setPosition(Common::Point(300, 104));
4267 _object4.fixPriority(105);
4268 _object4.show();
4269 _object4.animate(ANIM_MODE_5, this);
4270 break;
4271 case 4:
4272 setDelay(18);
4273 _object4.setStrip(4);
4274 scene->_guard.setVisage(2800);
4275 scene->_guard.setStrip(5);
4276 scene->_guard.setFrame(1);
4277 scene->_guard._numFrames = 5;
4278 scene->_guard._moveRate = 5;
4279 scene->_guard.setPosition(Common::Point(300, 104));
4280 scene->_guard.fixPriority(110);
4281 scene->_guard.changeZoom(100);
4282 scene->_guard.show();
4283 break;
4284 case 5:
4285 scene->_guard.animate(ANIM_MODE_5, this);
4286 break;
4287 case 6: {
4288 scene->_guard.changeZoom(-1);
4289 scene->_guard.setVisage(3107);
4290 scene->_guard.animate(ANIM_MODE_1, NULL);
4291 scene->_guard.setStrip(3);
4292 scene->_guard.setPosition(Common::Point(297, 140));
4293 scene->_guard._numFrames = 10;
4294 scene->_guard._moveRate = 10;
4295 scene->_guard._moveDiff = Common::Point(3, 2);
4296
4297 Common::Point pt(297, 160);
4298 NpcMover *mover = new NpcMover();
4299 scene->_guard.addMover(mover, &pt, this);
4300 break;
4301 }
4302 case 7: {
4303 scene->_guard.changeZoom(75);
4304 scene->_guard.updateAngle(R2_GLOBALS._player._position);
4305
4306 Common::Point pt(105, 82);
4307 NpcMover *mover = new NpcMover();
4308 R2_GLOBALS._player.addMover(mover, &pt, this);
4309 break;
4310 }
4311 case 8: {
4312 R2_GLOBALS._player._numFrames = 8;
4313 R2_GLOBALS._player._moveRate = 8;
4314 R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
4315 R2_GLOBALS._player.setObjectWrapper(NULL);
4316 R2_GLOBALS._player.setStrip(2);
4317 R2_GLOBALS._player.changeZoom(-1);
4318
4319 Common::Point pt(79, 100);
4320 NpcMover *mover = new NpcMover();
4321 R2_GLOBALS._player.addMover(mover, &pt, this);
4322 break;
4323 }
4324 case 9: {
4325 R2_GLOBALS._player._numFrames = 10;
4326 R2_GLOBALS._player._moveRate = 10;
4327 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
4328 R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
4329
4330 Common::Point pt(64, 100);
4331 NpcMover *mover = new NpcMover();
4332 R2_GLOBALS._player.addMover(mover, &pt, this);
4333 break;
4334 }
4335 case 10: {
4336 R2_GLOBALS._player.fixPriority(124);
4337 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4338
4339 Common::Point pt(160, 124);
4340 PlayerMover *mover = new PlayerMover();
4341 R2_GLOBALS._player.addMover(mover, &pt, this);
4342 break;
4343 }
4344 case 11: {
4345 R2_GLOBALS._player.fixPriority(-1);
4346
4347 Common::Point pt(160, 160);
4348 PlayerMover *mover = new PlayerMover();
4349 R2_GLOBALS._player.addMover(mover, &pt, this);
4350 break;
4351 }
4352 case 12: {
4353 Common::Point pt(270, 160);
4354 PlayerMover *mover = new PlayerMover();
4355 R2_GLOBALS._player.addMover(mover, &pt, this);
4356 break;
4357 }
4358 case 13:
4359 R2_GLOBALS._events.setCursor(CURSOR_WALK);
4360 scene->_stripNumber = 1207;
4361 scene->_stripManager.start(scene->_stripNumber, this);
4362 break;
4363 case 14: {
4364 R2_GLOBALS._player.disableControl();
4365 R2_GLOBALS._player.fixPriority(110);
4366
4367 Common::Point pt(288, 140);
4368 PlayerMover *mover = new PlayerMover();
4369 R2_GLOBALS._player.addMover(mover, &pt, this);
4370 break;
4371 }
4372 case 15:
4373 setDelay(18);
4374 scene->_guard.updateAngle(R2_GLOBALS._player._position);
4375 R2_GLOBALS._player.setVisage(2800);
4376 R2_GLOBALS._player.setStrip(6);
4377 R2_GLOBALS._player.setFrame(1);
4378 R2_GLOBALS._player.changeZoom(100);
4379 R2_GLOBALS._player.setPosition(Common::Point(300, 104));
4380 R2_GLOBALS._player._numFrames = 5;
4381 R2_GLOBALS._player._moveRate = 5;
4382 break;
4383 case 16:
4384 R2_GLOBALS._player.animate(ANIM_MODE_5, this);
4385 break;
4386 case 17:
4387 setDelay(6);
4388 _object4.setStrip(2);
4389 _object4.setFrame(11);
4390 R2_GLOBALS._player.hide();
4391 // fall through
4392 case 18:
4393 R2_GLOBALS._sound1.play(241);
4394 _object4.animate(ANIM_MODE_6, this);
4395 break;
4396 case 19:
4397 _object4.remove();
4398 _object3.animate(ANIM_MODE_6, this);
4399 break;
4400 case 20:
4401 setDelay(6);
4402 _object3.remove();
4403 _object2.setStrip(1);
4404 _object2.setFrame(19);
4405 break;
4406 case 21:
4407 setDelay(150);
4408 R2_GLOBALS._sound1.play(269);
4409 R2_GLOBALS._sound2.stop();
4410 break;
4411 case 22:
4412 scene->_sceneMode = 12;
4413 _object2.animate(ANIM_MODE_6, scene);
4414 break;
4415 default:
4416 break;
4417 }
4418 }
4419
postInit(SceneObjectList * OwnerList)4420 void Scene2800::postInit(SceneObjectList *OwnerList) {
4421 loadScene(2800);
4422 setZoomPercents(100, 50, 124, 75);
4423 R2_GLOBALS._sound1.stop();
4424 R2_GLOBALS._sound2.stop();
4425 SceneExt::postInit();
4426
4427 _bird.postInit();
4428 _bird.setup(2750, 4, 1);
4429 _bird.setPosition(Common::Point(-10, 25));
4430 _bird.animate(ANIM_MODE_1, NULL);
4431 _bird.setStrip2(4);
4432 _bird._moveRate = 20;
4433 _bird.setAction(&_action1);
4434
4435 _lightBar.postInit();
4436 _lightBar.setup(2802, 1, 1);
4437 _lightBar.setPosition(Common::Point(116, 80));
4438 _lightBar.fixPriority(111);
4439 _lightBar.animate(ANIM_MODE_2, NULL);
4440 _lightBar._numFrames = 6;
4441
4442 if (!R2_GLOBALS.getFlag(47)) {
4443 _guard.postInit();
4444 _guard.setVisage(3105);
4445 _guard.setStrip(3);
4446 _guard.setFrame(1);
4447 _guard.setZoom(50);
4448 _guard._moveDiff = Common::Point(2, 1);
4449 _guard.setPosition(Common::Point(122, 82));
4450 _guard.animate(ANIM_MODE_NONE, NULL);
4451 _guard.setDetails(2800, -1, -1, -1, 1, (SceneItem *)NULL);
4452 }
4453
4454 _background.setDetails(Rect(0, 0, 320, 200), 2800, -1, -1, -1, 1, NULL);
4455
4456 _stripManager.setColors(60, 255);
4457 _stripManager.setFontNumber(3);
4458 _stripManager.addSpeaker(&_quinnSpeaker);
4459 _stripManager.addSpeaker(&_nejSpeaker);
4460 _stripManager.addSpeaker(&_guardSpeaker);
4461
4462 if (R2_INVENTORY.getObjectScene(R2_FLUTE) == 0) {
4463 R2_GLOBALS._sound1.fadeSound(237);
4464 if (R2_GLOBALS.getFlag(47)) {
4465 _outpost.setDetails(Rect(76, 45, 155, 90), 2800, 3, -1, -1, 2, NULL);
4466 } else {
4467 _nej.postInit();
4468 _nej.setup(2752, 5, 1);
4469 _nej.animate(ANIM_MODE_NONE, NULL);
4470 _nej.changeZoom(100);
4471 _nej._moveDiff = Common::Point(2, 1);
4472 _nej.setPosition(Common::Point(101, 148));
4473 }
4474 }
4475
4476 R2_GLOBALS._player.postInit();
4477 R2_GLOBALS._player.setVisage(19);
4478 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
4479 R2_GLOBALS._player.changeZoom(100);
4480 R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
4481 R2_GLOBALS._player.disableControl();
4482
4483 if (R2_INVENTORY.getObjectScene(R2_FLUTE) != 0) {
4484 _sceneMode = 2800;
4485 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2800, &R2_GLOBALS._player, NULL);
4486 } else if (R2_GLOBALS.getFlag(47)) {
4487 R2_GLOBALS._player.setVisage(3110);
4488 R2_GLOBALS._player.changeZoom(-1);
4489 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4490 R2_GLOBALS._player.setPosition(Common::Point(160, 124));
4491 R2_GLOBALS._player.enableControl();
4492 } else {
4493 _sceneMode = 2801;
4494 R2_GLOBALS._player.setAction(&_sequenceManager, this, 2801, &R2_GLOBALS._player,
4495 &_nej, &_guard, NULL);
4496 }
4497 }
4498
signal()4499 void Scene2800::signal() {
4500 switch (_sceneMode) {
4501 case 10:
4502 R2_GLOBALS._sound1.play(238);
4503 R2_GLOBALS._events.setCursor(CURSOR_WALK);
4504 _stripNumber = 1206;
4505 _sceneMode = 2804;
4506 _stripManager.start(_stripNumber, this);
4507 break;
4508 case 11:
4509 _nej.remove();
4510 _bird.setAction(NULL);
4511 R2_GLOBALS._player.enableControl(CURSOR_WALK);
4512 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4513 _outpost.setDetails(Rect(76, 45, 155, 90), 2800, 3, -1, -1, 2, NULL);
4514 break;
4515 case 12:
4516 R2_GLOBALS._sound1.fadeOut2(NULL);
4517 R2_GLOBALS._sound2.fadeOut2(NULL);
4518 g_globals->_sceneManager.changeScene(1000);
4519 break;
4520 case 2800:
4521 g_globals->_sceneManager.changeScene(2750);
4522 break;
4523 case 2801:
4524 R2_GLOBALS._player.enableControl(CURSOR_WALK);
4525 R2_GLOBALS._player._canWalk = false;
4526 break;
4527 case 2803:
4528 R2_GLOBALS._player.disableControl();
4529 _sceneMode = 10;
4530 setAction(&_sequenceManager, this, 2803, &R2_GLOBALS._player, &_nej, &_guard, NULL);
4531 break;
4532 case 2804:
4533 R2_GLOBALS._player.disableControl();
4534 _sceneMode = 11;
4535 setAction(&_sequenceManager, this, 2804, &R2_GLOBALS._player, &_nej, NULL);
4536 break;
4537 case 2805:
4538 _bird.remove();
4539 setAction(&_action2);
4540 break;
4541 default:
4542 break;
4543 }
4544 }
4545
4546 /*--------------------------------------------------------------------------
4547 * Scene 2900 - Balloon Cutscene
4548 *
4549 *--------------------------------------------------------------------------*/
4550
startAction(CursorType action,Event & event)4551 bool Scene2900::Scenery::startAction(CursorType action, Event &event) {
4552 switch (action) {
4553 case CURSOR_USE:
4554 SceneItem::display2(1, 5 + R2_GLOBALS._randomSource.getRandomNumber(5));
4555 break;
4556 case CURSOR_LOOK:
4557 SceneItem::display2(2900, 0);
4558 break;
4559 case CURSOR_TALK:
4560 SceneItem::display2(1, 10 + R2_GLOBALS._randomSource.getRandomNumber(5));
4561 break;
4562 default:
4563 break;
4564 }
4565
4566 event.handled = true;
4567 return true;
4568 }
4569
startAction(CursorType action,Event & event)4570 bool Scene2900::ControlPanel::startAction(CursorType action, Event &event) {
4571 switch (action) {
4572 case CURSOR_USE:
4573 SceneItem::display2(2900, 5);
4574 break;
4575 case CURSOR_LOOK:
4576 SceneItem::display2(2900, 3);
4577 break;
4578 case CURSOR_TALK:
4579 SceneItem::display2(2900, 4);
4580 break;
4581 default:
4582 break;
4583 }
4584
4585 event.handled = true;
4586 return true;
4587 }
4588
startAction(CursorType action,Event & event)4589 bool Scene2900::Altimeter::startAction(CursorType action, Event &event) {
4590 switch (action) {
4591 case CURSOR_USE:
4592 SceneItem::display2(2900, 8);
4593 break;
4594 case CURSOR_LOOK:
4595 SceneItem::display2(2900, 6);
4596 break;
4597 case CURSOR_TALK:
4598 SceneItem::display2(2900, 4);
4599 break;
4600 default:
4601 break;
4602 }
4603
4604 event.handled = true;
4605 return true;
4606 }
4607
startAction(CursorType action,Event & event)4608 bool Scene2900::KnobLeft::startAction(CursorType action, Event &event) {
4609 Scene2900 *scene = (Scene2900 *)R2_GLOBALS._sceneManager._scene;
4610
4611 switch (action) {
4612 case CURSOR_USE:
4613 if (scene->_majorMinorFlag || scene->_altitudeChanging ||
4614 scene->_xAmount != scene->_xComparison) {
4615 // Let your altitude stablize first
4616 SceneItem::display2(2900, 17);
4617 } else if (R2_GLOBALS._balloonAltitude / 48 == 0) {
4618 // Maximum altitude
4619 SceneItem::display2(2900, 15);
4620 } else {
4621 // Increase altitude
4622 R2_GLOBALS._sound2.fadeSound(282);
4623 scene->_altitudeChanging = true;
4624 scene->_altitudeMajorChange = -1;
4625 scene->_xComparison = 100 - ((R2_GLOBALS._balloonAltitude / 48) - 1) * 25;
4626 }
4627 break;
4628
4629 case CURSOR_LOOK:
4630 SceneItem::display2(2900, 9);
4631 break;
4632
4633 case CURSOR_TALK:
4634 SceneItem::display2(2900, 4);
4635 break;
4636
4637 default:
4638 break;
4639 }
4640
4641 event.handled = true;
4642 return true;
4643 }
4644
startAction(CursorType action,Event & event)4645 bool Scene2900::KnobRight::startAction(CursorType action, Event &event) {
4646 switch (action) {
4647 case CURSOR_USE: {
4648 Scene2900 *scene = (Scene2900 *)R2_GLOBALS._sceneManager._scene;
4649
4650 if (scene->_majorMinorFlag || scene->_altitudeChanging ||
4651 scene->_xAmount != scene->_xComparison) {
4652 // Let your altitude stablize first
4653 SceneItem::display2(2900, 17);
4654 } else if (R2_GLOBALS._balloonAltitude / 48 >= 3) {
4655 // Altitude is too low - cannot land here
4656 SceneItem::display2(2900, 16);
4657 } else {
4658 // Decrease altitude
4659 R2_GLOBALS._sound2.fadeSound(212);
4660 scene->_altitudeChanging = true;
4661 scene->_altitudeMajorChange = 1;
4662 scene->_xComparison = 100 - ((R2_GLOBALS._balloonAltitude / 48) + 1) * 25;
4663 }
4664 break;
4665 }
4666
4667 case CURSOR_LOOK:
4668 SceneItem::display2(2900, 12);
4669 break;
4670
4671 case CURSOR_TALK:
4672 SceneItem::display2(2900, 4);
4673 break;
4674
4675 default:
4676 break;
4677 }
4678
4679 event.handled = true;
4680 return true;
4681 }
4682
startAction(CursorType action,Event & event)4683 bool Scene2900::Skip::startAction(CursorType action, Event &event) {
4684 if (action == CURSOR_USE) {
4685 Scene2900 *scene = (Scene2900 *)R2_GLOBALS._sceneManager._scene;
4686
4687 R2_GLOBALS._player.disableControl();
4688 scene->_sceneMode = 12;
4689 scene->signal();
4690 }
4691
4692 return true;
4693 }
4694
4695 /*------------------------------------------------------------------------*/
4696
signal()4697 void Scene2900::Action1::signal() {
4698 Scene2900 *scene = (Scene2900 *)R2_GLOBALS._sceneManager._scene;
4699 setDelay(3);
4700
4701 if (!scene->_majorMinorFlag && !scene->_altitudeChanging) {
4702 scene->_fadeCounter = 2;
4703 scene->_controlsActiveChanging = false;
4704 } else if (scene->_majorMinorFlag) {
4705 R2_GLOBALS._sound2.fadeOut2(NULL);
4706 } else if (scene->_fadeCounter == 0) {
4707 R2_GLOBALS._sound2.fadeOut2(NULL);
4708 } else if (!scene->_controlsActiveChanging) {
4709 scene->_knobLeftContent.hide();
4710 scene->_knobRightContent.hide();
4711 scene->_controlsActiveChanging = true;
4712 } else {
4713 --scene->_fadeCounter;
4714 scene->_knobLeftContent.show();
4715 scene->_knobRightContent.show();
4716 scene->_controlsActiveChanging = false;
4717 }
4718 }
4719
4720 /*------------------------------------------------------------------------*/
4721
Map()4722 Scene2900::Map::Map() {
4723 _mapWidth = _mapHeight = 0;
4724 _resNum = 0;
4725 _xV = _yV = 0;
4726 _bounds = Rect(40, 0, 280, 150);
4727 }
4728
load(int resNum)4729 void Scene2900::Map::load(int resNum) {
4730 byte *data = g_resourceManager->getResource(RES_BITMAP, resNum, 9999);
4731
4732 _resNum = resNum;
4733 _xV = _yV = 0;
4734 _mapWidth = READ_LE_UINT16(data);
4735 _mapHeight = READ_LE_UINT16(data + 2);
4736
4737 DEALLOCATE(data);
4738 }
4739
setPosition(const Common::Point & pos,bool initialFlag)4740 Common::Point Scene2900::Map::setPosition(const Common::Point &pos, bool initialFlag) {
4741 Common::Point p = pos;
4742 Rect updateRect;
4743
4744 if (p.x >= 0) {
4745 int xRight = p.x + _bounds.width();
4746 if (xRight > _mapWidth) {
4747 p.x = _mapWidth - _bounds.width();
4748 }
4749 } else {
4750 p.x = 0;
4751 }
4752
4753 if (p.y >= 0) {
4754 int yBottom = p.y + _bounds.height();
4755 if (yBottom > _mapHeight) {
4756 p.y = _mapHeight - _bounds.height();
4757 }
4758 } else {
4759 p.y = 0;
4760 }
4761
4762 if ((p.x != 0 || p.y != 0) && !initialFlag) {
4763 moveArea(updateRect, _xV - p.x, _yV - p.y);
4764 redraw(&updateRect);
4765 } else {
4766 redraw();
4767 }
4768
4769 _xV = p.x;
4770 _yV = p.y;
4771 return Common::Point(_xV, _yV);
4772 }
4773
redraw(Rect * updateRect)4774 void Scene2900::Map::redraw(Rect *updateRect) {
4775 int xHalfCount = _mapWidth / 160;
4776 int yHalfCount = _mapHeight / 100;
4777 int rlbNum = 0;
4778
4779 Rect blockRect(0, 0, 160, 100);
4780 Rect screenRect = _bounds;
4781 screenRect.translate(_xV - _bounds.left, _yV - _bounds.top);
4782
4783 Rect modifyRect;
4784 if (updateRect)
4785 modifyRect = *updateRect;
4786
4787 for (int xCtr = 0; xCtr < xHalfCount; ++xCtr) {
4788 for (int yCtr = 0; yCtr < yHalfCount; ++yCtr, ++rlbNum) {
4789 blockRect.moveTo(160 * xCtr, 100 * yCtr);
4790 if (blockRect.intersects(screenRect)) {
4791 // The block of the map is at least partially on-screen, so needs drawing
4792 blockRect.translate(_bounds.left - _xV, _bounds.top - _yV);
4793 byte *data = g_resourceManager->getResource(RES_BITMAP, _resNum, rlbNum);
4794
4795 drawBlock(data, blockRect.left, blockRect.top, _bounds, modifyRect);
4796
4797 DEALLOCATE(data);
4798 }
4799 }
4800 }
4801 }
4802
synchronize(Serializer & s)4803 void Scene2900::Map::synchronize(Serializer &s) {
4804 s.syncAsUint16LE(_resNum);
4805 if (s.isLoading())
4806 load(_resNum);
4807
4808 s.syncAsSint16LE(_xV);
4809 s.syncAsSint16LE(_yV);
4810 _bounds.synchronize(s);
4811 }
4812
adjustRect(Common::Rect & r1,const Common::Rect & r2)4813 int Scene2900::Map::adjustRect(Common::Rect &r1, const Common::Rect &r2) {
4814 if (r2.contains(r1))
4815 return 0;
4816 if (!r2.intersects(r1))
4817 return 1;
4818
4819 if (r1.top >= r2.top && r1.bottom <= r2.bottom) {
4820 if (r1.left >= r2.left && r1.left < r2.right) {
4821 r1.left = r2.right - 1;
4822 return 1;
4823 }
4824 if (r1.right > r2.left && r1.right <= r2.right) {
4825 r1.right = r2.left + 1;
4826 return 1;
4827 }
4828 }
4829
4830 if (r1.left < r2.left || r1.right > r2.right)
4831 return -1;
4832
4833 if (r1.top >= r2.top && r1.top < r2.bottom) {
4834 r1.top = r2.bottom - 1;
4835 return 1;
4836 }
4837 if (r1.bottom > r2.top && r1.bottom <= r2.bottom) {
4838 r1.bottom = r2.top + 1;
4839 return 1;
4840 }
4841
4842 return -1;
4843 }
4844
drawBlock(const byte * data,int xp,int yp,const Rect & bounds,const Rect & updateRect)4845 void Scene2900::Map::drawBlock(const byte *data, int xp, int yp,
4846 const Rect &bounds, const Rect &updateRect) {
4847 Rect blockRect(xp, yp, xp + 160, yp + 100);
4848 const byte *src = data;
4849
4850 if (blockRect.intersects(bounds)) {
4851 blockRect.clip(bounds);
4852
4853 if (adjustRect(blockRect, updateRect) != 0) {
4854 int width = blockRect.width();
4855 int height = blockRect.height();
4856 src += (blockRect.top - yp) * 160 + blockRect.left - xp;
4857
4858 GfxSurface &surface = R2_GLOBALS._sceneManager._scene->_backSurface;
4859 Graphics::Surface s = surface.lockSurface();
4860
4861 for (int yCtr = 0; yCtr < height; ++yCtr, src += 160) {
4862 byte *destP = (byte *)s.getBasePtr(blockRect.left, blockRect.top + yCtr);
4863 Common::copy(src, src + width, destP);
4864 }
4865
4866 surface.unlockSurface();
4867 R2_GLOBALS.gfxManager().copyFrom(surface, blockRect, blockRect);
4868 }
4869 }
4870 }
4871
moveArea(Rect & r,int xAmt,int yAmt)4872 void Scene2900::Map::moveArea(Rect &r, int xAmt, int yAmt) {
4873 Rect tempRect = r;
4874 tempRect.translate(xAmt, yAmt);
4875
4876 if (tempRect.intersects(r)) {
4877 int xpSrc, xpDest, width;
4878 int ypSrc, ypDest, height;
4879 if (xAmt >= 0) {
4880 xpSrc = tempRect.left;
4881 width = tempRect.width() - xAmt;
4882 xpDest = tempRect.left + xAmt;
4883 } else {
4884 xpSrc = tempRect.left - xAmt;
4885 width = tempRect.width() + xAmt;
4886 xpDest = tempRect.left;
4887 }
4888
4889 if (yAmt > 0) {
4890 height = tempRect.height() - yAmt;
4891 ypDest = tempRect.top + yAmt + (height - 1);
4892 ypSrc = tempRect.top + (height - 1);
4893
4894 for (int yCtr = 0; yCtr < height; ++yCtr, --ypSrc, --ypDest) {
4895 moveLine(xpSrc, ypSrc, xpDest, ypDest, width);
4896 }
4897 } else {
4898 ypSrc = tempRect.top - yAmt;
4899 height = tempRect.height() + yAmt;
4900 ypDest = tempRect.top;
4901
4902 for (int yCtr = 0; yCtr < height; ++yCtr, ++ypSrc, ++ypDest) {
4903 moveLine(xpSrc, ypSrc, xpDest, ypDest, width);
4904 }
4905 }
4906 } else {
4907 r = Rect(0, 0, 0, 0);
4908 }
4909 }
4910
moveLine(int xpSrc,int ypSrc,int xpDest,int ypDest,int width)4911 void Scene2900::Map::moveLine(int xpSrc, int ypSrc, int xpDest, int ypDest, int width) {
4912 byte buffer[SCREEN_WIDTH];
4913 assert(width <= SCREEN_WIDTH);
4914
4915 GfxSurface &surface = R2_GLOBALS.gfxManager().getSurface();
4916 Graphics::Surface s = surface.lockSurface();
4917
4918 byte *srcP = (byte *)s.getBasePtr(xpSrc, ypSrc);
4919 byte *destP = (byte *)s.getBasePtr(xpDest, ypDest);
4920 Common::copy(srcP, srcP + width, &buffer[0]);
4921 Common::copy(&buffer[0], &buffer[width], destP);
4922
4923 surface.unlockSurface();
4924 }
4925
4926 /*------------------------------------------------------------------------*/
4927
Scene2900()4928 Scene2900::Scene2900(): SceneExt() {
4929 _controlsActiveChanging = false;
4930 _altitudeChanging = false;
4931 _majorMinorFlag = false;
4932 _balloonLocation = Common::Point(550, 550);
4933 _altitudeMinorChange = 0;
4934 _altitudeMajorChange = 0;
4935 _balloonScreenPos = Common::Point(160, 100);
4936 _newAltitude = 0;
4937 _xAmount = 100;
4938 _xComparison = 100;
4939 _fadeCounter = 0;
4940 _paletteReloadNeeded = false;
4941 }
4942
synchronize(Serializer & s)4943 void Scene2900::synchronize(Serializer &s) {
4944 SceneExt::synchronize(s);
4945
4946 s.syncAsSint16LE(_controlsActiveChanging);
4947 s.syncAsSint16LE(_altitudeChanging);
4948 s.syncAsSint16LE(_majorMinorFlag);
4949 s.syncAsSint16LE(_altitudeMinorChange);
4950 s.syncAsSint16LE(_altitudeMajorChange);
4951 s.syncAsSint16LE(_balloonLocation.x);
4952 s.syncAsSint16LE(_balloonLocation.y);
4953 s.syncAsSint16LE(_balloonScreenPos.x);
4954 s.syncAsSint16LE(_balloonScreenPos.y);
4955 s.syncAsSint16LE(_newAltitude);
4956 s.syncAsSint16LE(_xAmount);
4957 s.syncAsSint16LE(_xComparison);
4958 s.syncAsSint16LE(_fadeCounter);
4959 s.syncAsSint16LE(_paletteReloadNeeded);
4960
4961 _map.synchronize(s);
4962 }
4963
postInit(SceneObjectList * OwnerList)4964 void Scene2900::postInit(SceneObjectList *OwnerList) {
4965 R2_GLOBALS._uiElements._active = false;
4966 // TODO: Determine correct colors
4967 R2_GLOBALS._gfxColors.foreground = 228;
4968 R2_GLOBALS._fontColors.background = 12;
4969 R2_GLOBALS._fontColors.foreground = 22;
4970
4971 _map.load(2950);
4972
4973 loadScene(2900);
4974 SceneExt::postInit();
4975 R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
4976
4977 _leftEdge.setup(2900, 6, 1, 22, 0, 25);
4978 _rightEdge.setup(2900, 6, 1, 280, 0, 25);
4979 _knob.setup(2900, 1, 3, 228, 199, 25);
4980
4981 _altimeterContent.postInit();
4982 _altimeterContent.setVisage(2900);
4983 _altimeterContent.setStrip(2);
4984 _altimeterContent.setFrame(1);
4985 _altimeterContent.fixPriority(10);
4986
4987 _knobLeftContent.postInit();
4988 _knobLeftContent.setVisage(2900);
4989 _knobLeftContent.setStrip(1);
4990 _knobLeftContent.setFrame(1);
4991 _knobLeftContent.setPosition(Common::Point(209, 199));
4992 _knobLeftContent.fixPriority(200);
4993
4994 _knobRightContent.postInit();
4995 _knobRightContent.setVisage(2900);
4996 _knobRightContent.setStrip(1);
4997 _knobRightContent.setFrame(2);
4998 _knobRightContent.setPosition(Common::Point(247, 199));
4999 _knobRightContent.fixPriority(200);
5000
5001 // Set up hotspots
5002 _scenery.setDetails(Rect(0, 0, 320, 150), 2900, -1, -1, -1, 1, (SceneItem *)NULL);
5003 _controlPanel.setDetails(Rect(0, 150, 320, 200), 2900, -1, -1, -1, 1, (SceneItem *)NULL);
5004 _altimeter.setDetails(Rect(42, 164, 129, 190), 2900, -1, -1, -1, 2, (SceneItem *)NULL);
5005 _knobLeft.setDetails(Rect(165, 160, 228, 200), 2900, -1, -1, -1, 2, (SceneItem *)NULL);
5006 _knobRight.setDetails(Rect(228, 160, 285, 200), 2900, -1, -1, -1, 2, (SceneItem *)NULL);
5007 _skip.postInit();
5008 _skip.setBounds(185, 50, 200, 0);
5009 R2_GLOBALS._sceneItems.push_front(&_skip);
5010
5011 // For ScummVM, we're introducing a Skip button, since the scene is a pain
5012 _skipText._color1 = R2_GLOBALS._scenePalette._colors.foreground;
5013 _skipText._color2 = R2_GLOBALS._scenePalette._colors.background;
5014 _skipText.setPosition(Common::Point(0, 185));
5015 _skipText.setup("Skip");
5016
5017 setAction(&_action1);
5018 R2_GLOBALS._player.postInit();
5019 R2_GLOBALS._player.setVisage(2900);
5020 R2_GLOBALS._player.setStrip2(3);
5021 R2_GLOBALS._player.setFrame2(1);
5022 R2_GLOBALS._player.fixPriority(15);
5023 R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
5024 R2_GLOBALS._player.disableControl();
5025
5026 if (R2_GLOBALS._sceneManager._previousScene == 2350 &&
5027 R2_GLOBALS._balloonPosition.x == 0 && R2_GLOBALS._balloonPosition.y == 0) {
5028 R2_GLOBALS._balloonAltitude = 5;
5029 _map.setPosition(Common::Point(_balloonLocation.x - 120, _balloonLocation.y - 100));
5030 _sceneMode = 10;
5031
5032 R2_GLOBALS._player.changeZoom(100);
5033 R2_GLOBALS._player.setPosition(Common::Point(160, 180));
5034 ADD_PLAYER_MOVER(160, 100);
5035
5036 _altimeterContent.setPosition(Common::Point(9, 189));
5037 } else {
5038 _balloonLocation.x = R2_GLOBALS._balloonPosition.x + 120;
5039 _balloonLocation.y = R2_GLOBALS._balloonPosition.y + 100;
5040
5041 if ((R2_GLOBALS._balloonAltitude % 8) == 0)
5042 _balloonLocation.x -= 70;
5043 else if ((R2_GLOBALS._balloonAltitude % 8) == 7)
5044 _balloonLocation.x += 70;
5045
5046 if (_balloonLocation.x <= 120)
5047 _balloonScreenPos.x = _balloonLocation.x + 40;
5048 else if (_balloonLocation.x >= 680)
5049 _balloonScreenPos.x = _balloonLocation.x - 520;
5050
5051 if ((R2_GLOBALS._balloonAltitude / 6) == 5)
5052 _balloonLocation.y -= 50;
5053 if (_balloonLocation.y <= 100)
5054 _balloonScreenPos.y = _balloonLocation.y;
5055
5056 _xAmount = _xComparison = 100 - (R2_GLOBALS._balloonAltitude / 48) * 25;
5057 _map.setPosition(Common::Point(_balloonLocation.x - 120, _balloonLocation.y - 100));
5058 _sceneMode = 11;
5059
5060 R2_GLOBALS._player.changeZoom(_xAmount);
5061 R2_GLOBALS._player.setPosition(_balloonScreenPos);
5062 R2_GLOBALS._player.enableControl();
5063 R2_GLOBALS._player._canWalk = false;
5064
5065 _altimeterContent.setPosition(Common::Point(109 - _xAmount, 189));
5066 }
5067
5068 R2_GLOBALS._sound1.play(211);
5069 }
5070
remove()5071 void Scene2900::remove() {
5072 // TODO: Figure out correct colors
5073 R2_GLOBALS._gfxColors.foreground = 59;
5074 R2_GLOBALS._fontColors.background = 4;
5075 R2_GLOBALS._fontColors.foreground = 15;
5076
5077 R2_GLOBALS._scenePalette.loadPalette(0);
5078 R2_GLOBALS._scenePalette.setEntry(255, 255, 255, 255);
5079
5080 R2_GLOBALS._sound1.fadeOut2(NULL);
5081 R2_GLOBALS._sound2.stop();
5082
5083 R2_GLOBALS._interfaceY = UI_INTERFACE_Y;
5084 SceneExt::remove();
5085 }
5086
signal()5087 void Scene2900::signal() {
5088 switch (_sceneMode) {
5089 case 10:
5090 _sceneMode = 11;
5091 R2_GLOBALS._player.enableControl();
5092 R2_GLOBALS._player._canWalk = false;
5093 break;
5094 case 12:
5095 R2_GLOBALS._sceneManager.changeScene(2600);
5096 break;
5097 default:
5098 break;
5099 }
5100 }
5101
dispatch()5102 void Scene2900::dispatch() {
5103 if (_sceneMode == 11) {
5104 _balloonLocation.x += balloonData[R2_GLOBALS._balloonAltitude].x;
5105 _balloonLocation.y += balloonData[R2_GLOBALS._balloonAltitude].y;
5106 _altitudeMinorChange = balloonData[R2_GLOBALS._balloonAltitude].v3;
5107
5108 if (_altitudeMinorChange == 0) {
5109 _majorMinorFlag = false;
5110 } else {
5111 _majorMinorFlag = true;
5112 _altitudeChanging = false;
5113 _xComparison = 100 - ((R2_GLOBALS._balloonAltitude / 48) + _altitudeMinorChange) * 25;
5114 }
5115
5116 // Zooming/altitude balloon change
5117 if (_xAmount == _xComparison) {
5118 _majorMinorFlag = false;
5119 } else {
5120 if (!_majorMinorFlag) {
5121 _xAmount = _xAmount - _altitudeMajorChange;
5122 } else {
5123 _xAmount = _xAmount - _altitudeMinorChange;
5124 }
5125
5126 if (_altitudeMinorChange == -1 || _altitudeMajorChange == -1) {
5127 if (_altimeterContent._frame == 1) {
5128 _altimeterContent.setFrame2(10);
5129 } else {
5130 _altimeterContent.setFrame2(_altimeterContent._frame - 1);
5131 }
5132 } else if (_altitudeMinorChange == -1 || _altitudeMajorChange == 1) {
5133 if (_altimeterContent._frame == 10)
5134 _altimeterContent.setFrame2(1);
5135 else
5136 _altimeterContent.setFrame2(_altimeterContent._frame + 1);
5137 }
5138
5139 _altimeterContent.setPosition(Common::Point(109 - _xAmount, 189));
5140 R2_GLOBALS._player.changeZoom(_xAmount);
5141 }
5142
5143 if (!_paletteReloadNeeded) {
5144 R2_GLOBALS._scenePalette.loadPalette(2950);
5145 R2_GLOBALS._scenePalette.refresh();
5146 }
5147
5148 R2_GLOBALS._balloonPosition = _map.setPosition(
5149 Common::Point(_balloonLocation.x - 120, _balloonLocation.y - 100), !_paletteReloadNeeded);
5150 _paletteReloadNeeded = true;
5151
5152 if (_balloonLocation.x <= 120)
5153 _balloonScreenPos.x = _balloonLocation.x + 40;
5154 else if (_balloonLocation.x >= 680)
5155 _balloonScreenPos.x = _balloonLocation.x - 520;
5156
5157 if (_balloonLocation.y <= 100)
5158 _balloonScreenPos.y = _balloonLocation.y;
5159
5160 R2_GLOBALS._player.setPosition(_balloonScreenPos);
5161
5162 if ((_balloonLocation.x % 100) == 50 && (_balloonLocation.y % 100) == 50 && !_majorMinorFlag) {
5163 // At an altitude change point, so calculate new altitude
5164 _newAltitude = R2_GLOBALS._balloonAltitude;
5165 if (_altitudeChanging) {
5166 _newAltitude += _altitudeMajorChange * 48;
5167 _altitudeChanging = false;
5168 }
5169
5170 if (balloonData[R2_GLOBALS._balloonAltitude].x > 0) {
5171 ++_newAltitude;
5172 } else if (balloonData[R2_GLOBALS._balloonAltitude].x < 0) {
5173 --_newAltitude;
5174 }
5175
5176 if (balloonData[R2_GLOBALS._balloonAltitude].y > 0) {
5177 _newAltitude -= 8;
5178 } else if (balloonData[R2_GLOBALS._balloonAltitude].y < 0) {
5179 _newAltitude += 8;
5180 }
5181
5182 if (balloonData[R2_GLOBALS._balloonAltitude].v3 > 0) {
5183 _newAltitude += 48;
5184 } else if (balloonData[R2_GLOBALS._balloonAltitude].v3 < 0) {
5185 _newAltitude -= 48;
5186 }
5187
5188 assert(_newAltitude < 193);
5189 R2_GLOBALS._balloonAltitude = _newAltitude;
5190 if (R2_GLOBALS._balloonAltitude == 189) {
5191 // Finally reached landing point
5192 _sceneMode = 12;
5193 R2_GLOBALS._player.disableControl();
5194
5195 ADD_MOVER(R2_GLOBALS._player, 160, -10);
5196 }
5197 }
5198 }
5199
5200 Scene::dispatch();
5201 }
5202
refreshBackground(int xAmount,int yAmount)5203 void Scene2900::refreshBackground(int xAmount, int yAmount) {
5204 SceneExt::refreshBackground(xAmount, yAmount);
5205
5206 _map.redraw();
5207 }
5208
5209 } // End of namespace Ringworld2
5210 } // End of namespace TsAGE
5211