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