1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #include "common/config-manager.h"
24 #include "tsage/ringworld/ringworld_scenes2.h"
25 #include "tsage/dialogs.h"
26 #include "tsage/scenes.h"
27 #include "tsage/tsage.h"
28 #include "tsage/staticres.h"
29 
30 namespace TsAGE {
31 
32 namespace Ringworld {
33 
34 /*--------------------------------------------------------------------------
35  * Scene 1000 - Title Screen
36  *
37  *--------------------------------------------------------------------------*/
38 
signal()39 void Scene1000::Action1::signal() {
40 	Scene1000 *scene = (Scene1000 *)g_globals->_sceneManager._scene;
41 
42 	switch (_actionIndex++) {
43 	case 0:
44 		g_globals->_player.disableControl();
45 		setDelay(10);
46 		break;
47 	case 1:
48 		scene->_object4.postInit();
49 		scene->_object4.setVisage(1001);
50 		scene->_object4._frame = 1;
51 		scene->_object4.setStrip2(5);
52 		scene->_object4.changeZoom(100);
53 		scene->_object4.animate(ANIM_MODE_2, NULL);
54 		scene->_object4.setPosition(Common::Point(403, 163));
55 		setDelay(90);
56 		break;
57 	case 2: {
58 		SceneItem::display(0, 0);
59 		scene->_object4.remove();
60 		scene->_object1.changeZoom(-1);
61 		NpcMover *mover = new NpcMover();
62 		Common::Point pt(180, 100);
63 		scene->_object1.addMover(mover, &pt, this);
64 		break;
65 	}
66 	case 3:
67 		g_globals->_sceneManager.changeScene(1400);
68 		break;
69 	default:
70 		break;
71 	}
72 
73 }
74 
signal()75 void Scene1000::Action2::signal() {
76 	switch (_actionIndex++) {
77 	case 0:
78 		g_globals->_player.disableControl();
79 		setDelay(10);
80 		break;
81 	case 1:
82 		SceneItem::display(1000, 0, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1,
83 				SET_EXT_BGCOLOR, 35, SET_WIDTH, 200, SET_KEEP_ONSCREEN, 1, LIST_END);
84 		setDelay(180);
85 		break;
86 	case 2:
87 		SceneItem::display(0, 0);
88 		g_globals->_sceneManager.changeScene(2000);
89 		break;
90 	default:
91 		break;
92 	}
93 }
94 
signal()95 void Scene1000::Action3::signal() {
96 	Scene1000 *scene = (Scene1000 *)g_globals->_sceneManager._scene;
97 
98 	switch (_actionIndex++) {
99 	case 0:
100 		g_globals->_sceneManager._scene->loadBackground(0, 0);
101 		setDelay(60);
102 		break;
103 	case 1: {
104 		NpcMover *mover = new NpcMover();
105 		Common::Point pt(158, 31);
106 		scene->_object3.addMover(mover, &pt, this);
107 		break;
108 	}
109 	case 2:
110 	case 3:
111 		setDelay(60);
112 		break;
113 	case 4:
114 		g_globals->_player.show();
115 		setDelay(240);
116 		break;
117 	case 5: {
118 		g_globals->_player.enableControl();
119 
120 		const char *SEEN_INTRO = "seen_intro";
121 		if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) {
122 			// First time being played, so show the introduction
123 			ConfMan.setBool(SEEN_INTRO, true);
124 			ConfMan.flushToDisk();
125 
126 			setDelay(1);
127 		} else {
128 			// Prompt user for whether to start play or watch introduction
129 			g_globals->_player.enableControl();
130 
131 			int rc;
132 			if (g_vm->getLanguage() == Common::ES_ESP) {
133 				rc = MessageDialog::show2(ESP_WATCH_INTRO_MSG, ESP_START_PLAY_BTN_STRING, ESP_INTRODUCTION_BTN_STRING);
134 			} else {
135 				rc = MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING);
136 			}
137 			if (rc == 0) {
138 				_actionIndex = 20;
139 				g_globals->_soundHandler.fadeOut(this);
140 			} else {
141 				setDelay(1);
142 			}
143 		}
144 
145 		g_globals->_player.disableControl();
146 		break;
147 	}
148 	case 6: {
149 		scene->_object3.remove();
150 		g_globals->_player.setStrip2(2);
151 		NpcMover *mover = new NpcMover();
152 		Common::Point pt(480, 100);
153 		g_globals->_player.addMover(mover, &pt, this);
154 		break;
155 	}
156 	case 7:
157 		g_globals->_scenePalette.loadPalette(1002);
158 		g_globals->_scenePalette.refresh();
159 		g_globals->_scenePalette.addRotation(80, 95, -1);
160 		scene->_object3.postInit();
161 		scene->_object3.setVisage(1002);
162 		scene->_object3.setStrip(1);
163 		scene->_object3.setPosition(Common::Point(284, 122));
164 		scene->_object3.changeZoom(1);
165 
166 		zoom(true);
167 		setDelay(200);
168 		break;
169 	case 8:
170 		zoom(false);
171 		setDelay(10);
172 		break;
173 	case 9:
174 		scene->_object3.setStrip(2);
175 		scene->_object3.setPosition(Common::Point(285, 155));
176 
177 		zoom(true);
178 		setDelay(400);
179 		break;
180 	case 10:
181 		zoom(false);
182 		setDelay(10);
183 		break;
184 	case 11:
185 		scene->_object3.setStrip(3);
186 		scene->_object3.setPosition(Common::Point(279, 172));
187 
188 		zoom(true);
189 		setDelay(240);
190 		break;
191 	case 12:
192 		zoom(false);
193 		setDelay(10);
194 		break;
195 	case 13:
196 		scene->_object3.setStrip(4);
197 		scene->_object3.setPosition(Common::Point(270, 128));
198 
199 		zoom(true);
200 		setDelay(300);
201 		break;
202 	case 14:
203 		zoom(false);
204 		setDelay(10);
205 		break;
206 	case 15:
207 		scene->_object3.setStrip(1);
208 		scene->_object3.setFrame(2);
209 		scene->_object3.setPosition(Common::Point(283, 137));
210 
211 		zoom(true);
212 		setDelay(300);
213 		break;
214 	case 16:
215 		zoom(false);
216 		setDelay(10);
217 		break;
218 	case 17:
219 		scene->_object3.setStrip(5);
220 		scene->_object3.setFrame(1);
221 		scene->_object3.setPosition(Common::Point(292, 192));
222 
223 		zoom(true);
224 		setDelay(300);
225 		break;
226 	case 18:
227 		zoom(false);
228 		g_globals->_scenePalette.clearListeners();
229 		g_globals->_soundHandler.fadeOut(this);
230 		break;
231 	case 19:
232 		g_globals->_sceneManager.changeScene(10);
233 		break;
234 	case 20:
235 		g_globals->_sceneManager.changeScene(30);
236 		break;
237 	default:
238 		break;
239 	}
240 }
241 
zoom(bool up)242 void Scene1000::Action3::zoom(bool up) {
243 	Scene1000 *scene = (Scene1000 *)g_globals->_sceneManager._scene;
244 
245 	if (up) {
246 		while ((scene->_object3._percent < 100) && !g_vm->shouldQuit()) {
247 			scene->_object3.changeZoom(MIN(scene->_object3._percent + 5, 100));
248 			g_globals->_sceneObjects->draw();
249 			g_globals->_events.delay(1);
250 		}
251 	} else {
252 		while ((scene->_object3._percent > 0) && !g_vm->shouldQuit()) {
253 			scene->_object3.changeZoom(MAX(scene->_object3._percent - 5, 0));
254 			g_globals->_sceneObjects->draw();
255 			g_globals->_events.delay(1);
256 		}
257 	}
258 }
259 
260 /*--------------------------------------------------------------------------*/
261 
postInit(SceneObjectList * OwnerList)262 void Scene1000::postInit(SceneObjectList *OwnerList) {
263 	Scene::postInit();
264 	setZoomPercents(0, 100, 200, 100);
265 	loadScene(1000);
266 
267 	if (g_globals->_sceneManager._previousScene == 2000) {
268 		setZoomPercents(150, 10, 180, 100);
269 		_object1.postInit();
270 		_object1.setVisage(1001);
271 		_object1._strip = 7;
272 		_object1.animate(ANIM_MODE_2, 0);
273 		_object1._moveDiff = Common::Point(1, 1);
274 		_object1.setPosition(Common::Point(120, 180));
275 
276 		setAction(&_action2);
277 
278 		g_globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y);
279 		g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
280 
281 		g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
282 		g_globals->_soundHandler.play(114);
283 	} else if (g_globals->_sceneManager._previousScene == 2222) {
284 		setZoomPercents(150, 10, 180, 100);
285 		_object1.postInit();
286 		_object1.setVisage(1001);
287 		_object1._strip = 7;
288 		_object1.animate(ANIM_MODE_2, 0);
289 		_object1._moveDiff = Common::Point(2, 2);
290 		_object1.setPosition(Common::Point(120, 180));
291 
292 		g_globals->_sceneManager._scene->_sceneBounds.center(_object1._position.x, _object1._position.y);
293 		g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
294 		g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
295 
296 		setAction(&_action1);
297 	} else {
298 		g_globals->_soundHandler.play(4);
299 		setZoomPercents(0, 10, 30, 100);
300 		_object3.postInit();
301 		_object3.setVisage(1050);
302 		_object3.changeZoom(-1);
303 		_object3.setPosition(Common::Point(158, 0));
304 
305 		g_globals->_player.postInit();
306 		g_globals->_player.setVisage(1050);
307 		g_globals->_player.setStrip(3);
308 		g_globals->_player.setPosition(Common::Point(160, 191));
309 		g_globals->_player._moveDiff.x = 12;
310 		g_globals->_player.hide();
311 		g_globals->_player.disableControl();
312 
313 		g_globals->_sceneManager._scene->_sceneBounds.center(_object3._position.x, _object3._position.y);
314 
315 		setAction(&_action3);
316 	}
317 }
318 
319 /*--------------------------------------------------------------------------
320  * Scene 1001 - Fleeing planet cutscene
321  *
322  *--------------------------------------------------------------------------*/
323 
signal()324 void Scene1001::Action1::signal() {
325 	Scene1001 *scene = (Scene1001 *)g_globals->_sceneManager._scene;
326 
327 	switch (_actionIndex++) {
328 	case 0:
329 		setDelay(10);
330 		break;
331 	case 1:
332 		scene->_object3.animate(ANIM_MODE_5, this);
333 		break;
334 	case 2: {
335 		Common::Point pt(108, 171);
336 		NpcMover *mover = new NpcMover();
337 		scene->_object3.addMover(mover, &pt, this);
338 		break;
339 	}
340 	case 3: {
341 		Common::Point pt(170, 159);
342 		NpcMover *mover = new NpcMover();
343 		scene->_object3.addMover(mover, &pt, this);
344 		break;
345 	}
346 	case 4: {
347 		scene->_object2.postInit();
348 		scene->_object2.setVisage(16);
349 		scene->_object2.setStrip2(4);
350 		scene->_object2.setPosition(Common::Point(61, 177));
351 		scene->_object2.animate(ANIM_MODE_5, this);
352 
353 		Common::Point pt(320, 100);
354 		NpcMover *mover = new NpcMover();
355 		scene->_object3.addMover(mover, &pt, this);
356 		break;
357 	}
358 	case 5: {
359 		Common::Point pt(82, 166);
360 		NpcMover *mover = new NpcMover();
361 		scene->_object2.addMover(mover, &pt, this);
362 		break;
363 	}
364 	case 6: {
365 		Common::Point pt(64, 149);
366 		NpcMover *mover = new NpcMover();
367 		scene->_object2.addMover(mover, &pt, this);
368 		break;
369 	}
370 	case 7: {
371 		Common::Point pt(15, 136);
372 		NpcMover *mover = new NpcMover();
373 		scene->_object2.addMover(mover, &pt, this);
374 		break;
375 	}
376 	case 8: {
377 		Common::Point pt(-5, 120);
378 		NpcMover *mover = new NpcMover();
379 		scene->_object2.addMover(mover, &pt, this);
380 		break;
381 	}
382 	case 9: {
383 		scene->_object1.postInit();
384 		scene->_object1.setVisage(16);
385 		scene->_object1.setStrip2(1);
386 		scene->_object1.setFrame(1);
387 		scene->_object1.setPosition(Common::Point(-75, 87));
388 		scene->_object1.animate(ANIM_MODE_2, NULL);
389 
390 		Common::Point pt(0, 100);
391 		NpcMover *mover = new NpcMover();
392 		scene->_object1.addMover(mover, &pt, this);
393 		break;
394 	}
395 	case 10: {
396 		Common::Point pt1(107, 115);
397 		NpcMover *mover1 = new NpcMover();
398 		scene->_object1.addMover(mover1, &pt1, NULL);
399 
400 		scene->_object3.setVisage(16);
401 		scene->_object3.setStrip2(5);
402 		scene->_object3.setFrame2(2);
403 		scene->_object3.setPosition(Common::Point(220, 200));
404 
405 		Common::Point pt2(187, 181);
406 		NpcMover *mover2 = new NpcMover();
407 		scene->_object3.addMover(mover2, &pt2, this);
408 		break;
409 	}
410 	case 11: {
411 		scene->_object2.setVisage(16);
412 		scene->_object2.setStrip2(5);
413 		scene->_object2.setFrame2(1);
414 		scene->_object2.setPosition(Common::Point(211, 0));
415 
416 		Common::Point pt(189, 30);
417 		NpcMover *mover = new NpcMover();
418 		scene->_object2.addMover(mover, &pt, this);
419 		break;
420 	}
421 	case 12:
422 		scene->_stripManager.start(100, this);
423 		break;
424 	case 13: {
425 		scene->_object4.postInit();
426 		scene->_object4.setVisage(16);
427 		scene->_object4.setStrip2(2);
428 		scene->_object4.setFrame(4);
429 		scene->_object4.setPosition(Common::Point(360, 80));
430 		scene->_object4.animate(ANIM_MODE_2, NULL);
431 
432 		Common::Point pt(303, 97);
433 		NpcMover *mover = new NpcMover();
434 		scene->_object4.addMover(mover, &pt, this);
435 		break;
436 	}
437 	case 14:
438 		scene->_stripManager.start(110, this);
439 		break;
440 	case 15:
441 		setDelay(10);
442 		break;
443 	case 16: {
444 		scene->_soundHandler1.play(90);
445 
446 		scene->_object6.postInit();
447 		scene->_object6.setVisage(16);
448 		scene->_object6.setStrip2(6);
449 		scene->_object6.setFrame2(2);
450 		scene->_object6._moveDiff = Common::Point(20, 20);
451 		scene->_object6.fixPriority(20);
452 		scene->_object6.setPosition(Common::Point(scene->_object2._position.x - 6, scene->_object2._position.y + 7));
453 		scene->_object6.animate(ANIM_MODE_5, NULL);
454 
455 		Common::Point pt(scene->_object6._position.x - 70, scene->_object6._position.y + 70);
456 		NpcMover *mover = new NpcMover();
457 		scene->_object6.addMover(mover, &pt, this);
458 		break;
459 	}
460 	case 17: {
461 		scene->_soundHandler1.play(90);
462 		scene->_object6.remove();
463 
464 		scene->_object7.postInit();
465 		scene->_object7.setVisage(16);
466 		scene->_object7.setStrip2(6);
467 		scene->_object7.setFrame2(1);
468 		scene->_object7._moveDiff = Common::Point(20, 20);
469 		scene->_object7.setPosition(Common::Point(scene->_object3._position.x - 28, scene->_object3._position.y - 11));
470 		scene->_object7.fixPriority(200);
471 		scene->_object7.animate(ANIM_MODE_5, NULL);
472 
473 		Common::Point pt(scene->_object7._position.x - 70, scene->_object7._position.y - 70);
474 		NpcMover *mover = new NpcMover();
475 		scene->_object7.addMover(mover, &pt, this);
476 		break;
477 	}
478 	case 18:
479 		scene->_object7.remove();
480 
481 		scene->_object5.postInit();
482 		scene->_object5.setVisage(16);
483 		scene->_object5.setPosition(Common::Point(306, 93));
484 		scene->_object5._strip = 3;
485 		scene->_object5.fixPriority(200);
486 		scene->_object5.animate(ANIM_MODE_2, NULL);
487 		setDelay(30);
488 		break;
489 	case 19: {
490 		g_globals->_soundHandler.play(91);
491 		byte adjustData[4] = {0xff, 0xff, 0xff, 0};
492 		g_globals->_scenePalette.fade(adjustData, false, 0);
493 
494 		scene->_object1._strip = 7;
495 		scene->_object1._frame = 1;
496 		scene->_object1.setPosition(Common::Point(314, 112));
497 		scene->_object1.addMover(NULL);
498 		setDelay(2);
499 		break;
500 	}
501 	case 20:
502 		g_globals->_scenePalette.loadPalette(16);
503 		g_globals->_scenePalette.refresh();
504 		setDelay(6);
505 		break;
506 	case 21:
507 		scene->_object1._numFrames = 15;
508 		scene->_object1.animate(ANIM_MODE_5, this);
509 		break;
510 	case 22:
511 		g_globals->_soundHandler.play(92);
512 		scene->_stripManager.start(111, this);
513 		break;
514 	case 23:
515 		setDelay(60);
516 		break;
517 	case 24:
518 		g_globals->_sceneManager.changeScene(2000);
519 		break;
520 	default:
521 		break;
522 	}
523 }
524 
525 /*--------------------------------------------------------------------------*/
526 
postInit(SceneObjectList * OwnerList)527 void Scene1001::postInit(SceneObjectList *OwnerList) {
528 	loadScene(16);
529 	Scene::postInit();
530 	setZoomPercents(0, 100, 200, 100);
531 
532 	_stripManager.addSpeaker(&_speakerQText);
533 	_stripManager.addSpeaker(&_speakerCText);
534 	_stripManager.addSpeaker(&_speakerCR);
535 	_stripManager.addSpeaker(&_speakerSL);
536 	_speakerQText._color1 = 11;
537 
538 	_object3.postInit();
539 	_object3.setVisage(16);
540 	_object3.setStrip2(4);
541 	_object3.setPosition(Common::Point(61, 177));
542 
543 	g_globals->_soundHandler.play(85);
544 	setAction(&_action1);
545 }
546 
547 
548 /*--------------------------------------------------------------------------
549  * Scene 1250 -
550  *
551  *--------------------------------------------------------------------------*/
552 
signal()553 void Scene1250::Action1::signal() {
554 	Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene;
555 
556 	switch (_actionIndex++) {
557 	case 0:
558 		setDelay(g_globals->_randomSource.getRandomNumber(120) + 60);
559 		break;
560 	case 1:
561 		scene->_object1.animate(ANIM_MODE_5, this);
562 		_actionIndex = 0;
563 		break;
564 	default:
565 		break;
566 	}
567 }
568 
signal()569 void Scene1250::Action2::signal() {
570 	Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene;
571 
572 	switch (_actionIndex++) {
573 	case 0:
574 		switch (g_globals->_randomSource.getRandomNumber(2)) {
575 		case 0:
576 			scene->_object2.setPosition(Common::Point(163, 75));
577 			break;
578 		case 1:
579 			scene->_object2.setPosition(Common::Point(109, 65));
580 			break;
581 		case 2:
582 			scene->_object2.setPosition(Common::Point(267, 20));
583 			break;
584 		default:
585 			break;
586 		}
587 
588 		setDelay(30);
589 		break;
590 	case 1:
591 		scene->_object2.animate(ANIM_MODE_5, this);
592 		_actionIndex = 0;
593 		break;
594 	default:
595 		break;
596 	}
597 }
598 
signal()599 void Scene1250::Action3::signal() {
600 	Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene;
601 
602 	switch (_actionIndex++) {
603 	case 0:
604 		setDelay(30);
605 		break;
606 	case 1:
607 		scene->_stripManager.start(1251, this);
608 		break;
609 	case 2:
610 		setDelay(6);
611 		break;
612 	case 3:
613 		g_globals->_sceneManager.changeScene(1000);
614 		break;
615 	default:
616 		break;
617 	}
618 }
619 
signal()620 void Scene1250::Action4::signal() {
621 	Scene1250 *scene = (Scene1250 *)g_globals->_sceneManager._scene;
622 
623 	switch (_actionIndex++) {
624 	case 0:
625 		setDelay(3);
626 		break;
627 	case 1:
628 		scene->_stripManager.start(1250, this);
629 		break;
630 	case 2:
631 		setDelay(6);
632 		break;
633 	case 3:
634 		g_globals->_sceneManager.changeScene(2000);
635 		break;
636 	default:
637 		break;
638 	}
639 }
640 
641 /*--------------------------------------------------------------------------*/
642 
postInit(SceneObjectList * OwnerList)643 void Scene1250::postInit(SceneObjectList *OwnerList) {
644 	loadScene(1250);
645 	Scene::postInit();
646 	setZoomPercents(0, 100, 200, 100);
647 
648 	_stripManager.addSpeaker(&_speakerQText);
649 	_speakerQText._textPos = Common::Point(120, 120);
650 	_speakerQText._textWidth = 180;
651 
652 	_object1.postInit();
653 	_object1.setVisage(1250);
654 	_object1.setPosition(Common::Point(126, 69));
655 	_object1.setStrip2(1);
656 	_object1._frame = 1;
657 	_object1.setAction(&_action1);
658 
659 	_object2.postInit();
660 	_object2.setVisage(1250);
661 	_object2.setPosition(Common::Point(126, 69));
662 	_object2.setStrip2(2);
663 	_object2.fixPriority(255);
664 	_object2._frame = 1;
665 	_object2.setAction(&_action2);
666 
667 	g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
668 	g_globals->_sceneOffset.x = (g_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
669 
670 	if ((g_globals->_sceneManager._previousScene != 2000) || (g_globals->_stripNum != 1250)) {
671 		setAction(&_action4);
672 	} else {
673 		setAction(&_action3);
674 		g_globals->_soundHandler.play(114);
675 	}
676 }
677 
678 /*--------------------------------------------------------------------------
679  * Scene 1400 - Ringworld Wall
680  *
681  *--------------------------------------------------------------------------*/
682 
signal()683 void Scene1400::Action1::signal() {
684 	Scene1400 *scene = (Scene1400 *)g_globals->_sceneManager._scene;
685 
686 	switch (_actionIndex++) {
687 	case 0:
688 		setDelay(5);
689 		break;
690 	case 1: {
691 		SceneItem::display(1400, 0, SET_X, 120, SET_Y, 610, SET_FONT, 2, SET_EXT_BGCOLOR, 23, SET_KEEP_ONSCREEN, -1, LIST_END);
692 
693 		Common::Point pt(160, 700);
694 		NpcMover *mover = new NpcMover();
695 		g_globals->_player.addMover(mover, &pt, this);
696 		break;
697 	}
698 	case 2: {
699 		g_globals->_player.setStrip2(3);
700 		g_globals->_player.changeZoom(100);
701 
702 		Common::Point pt(160, 100);
703 		NpcMover *mover = new NpcMover();
704 		g_globals->_player.addMover(mover, &pt, this);
705 
706 		SceneItem::display(0, 0);
707 		setDelay(360);
708 		break;
709 	}
710 	case 3:
711 		SceneItem::display(1400, 2, SET_X, 60, SET_Y, g_globals->_sceneManager._scene->_sceneBounds.bottom - 80,
712 			SET_FONT, 2, SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END);
713 		setDelay(420);
714 		break;
715 	case 4:
716 		SceneItem::display(0, 0);
717 		setDelay(360);
718 		break;
719 	case 5:
720 		SceneItem::display(1400, 3, SET_X, 60, SET_Y, g_globals->_sceneManager._scene->_sceneBounds.bottom - 80,
721 			SET_FONT, 2, SET_FG_COLOR, 23, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END);
722 		setDelay(360);
723 		break;
724 	case 6:
725 		SceneItem::display(0, 0);
726 		break;
727 	case 7: {
728 		g_globals->_player._frame = 1;
729 		g_globals->_player.setStrip2(1);
730 		g_globals->_player._numFrames = 5;
731 		g_globals->_player.animate(ANIM_MODE_5, this);
732 
733 		Common::Point pt(205, 70);
734 		NpcMover *mover = new NpcMover();
735 		g_globals->_player.addMover(mover, &pt, NULL);
736 		g_globals->_sceneManager._fadeMode = FADEMODE_NONE;
737 
738 		scene->loadScene(1402);
739 		break;
740 	}
741 	case 8:
742 		g_globals->_player.setStrip2(2);
743 		g_globals->_player._numFrames = 10;
744 		g_globals->_player.animate(ANIM_MODE_2, NULL);
745 
746 		SceneItem::display(1400, 4, SET_X, 30, SET_Y, g_globals->_player._position.y + 10, SET_FONT, 2,
747 			SET_FG_COLOR, 13, SET_POS_MODE, 0, SET_KEEP_ONSCREEN, -1, LIST_END);
748 		setDelay(300);
749 		break;
750 	case 9: {
751 		SceneItem::display(0, 0);
752 		Common::Point pt(450, 45);
753 		NpcMover *mover = new NpcMover();
754 		g_globals->_player.addMover(mover, &pt, this);
755 		break;
756 	}
757 	case 10:
758 		g_globals->_sceneManager._scrollerRect = Rect(40, 20, 280, 180);
759 		g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
760 		g_globals->_stripNum = 1500;
761 		g_globals->_soundHandler.stop();
762 
763 		g_globals->_sceneManager.changeScene(1500);
764 		break;
765 	default:
766 		break;
767 	}
768 }
769 
dispatch()770 void Scene1400::Action1::dispatch() {
771 	Action::dispatch();
772 
773 	if ((_actionIndex > 3) && (_actionIndex < 9))
774 		g_globals->_sceneText.setPosition(Common::Point(60, g_globals->_sceneManager._scene->_sceneBounds.bottom - 80));
775 
776 	if ((_actionIndex <= 2) && (g_globals->_player._percent > 22))
777 		g_globals->_player.changeZoom(100 - (800 - g_globals->_player._position.y));
778 
779 	if ((_actionIndex >= 9) && (g_globals->_player._percent > 22))
780 		g_globals->_player.changeZoom(100 - (g_globals->_player._position.x - 205));
781 }
782 
783 /*--------------------------------------------------------------------------*/
784 
postInit(SceneObjectList * OwnerList)785 void Scene1400::postInit(SceneObjectList *OwnerList) {
786 	if (g_globals->_stripNum != 1400) {
787 		loadScene(1401);
788 	} else {
789 		loadScene(1402);
790 	}
791 	Scene::postInit();
792 
793 	g_globals->_sceneManager._scrollerRect = Rect(40, 90, 280, 180);
794 	g_globals->_player.postInit();
795 	g_globals->_player.setVisage(1401);
796 	g_globals->_player.animate(ANIM_MODE_2, 0);
797 	g_globals->_player.setStrip2(4);
798 	g_globals->_player.fixPriority(4);
799 	g_globals->_player.disableControl();
800 
801 	g_globals->_player._moveDiff = Common::Point(4, 2);
802 	g_globals->_player.setPosition(Common::Point(160, 800));
803 	g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position);
804 	g_globals->_sceneManager._scene->_sceneBounds.contain(g_globals->_sceneManager._scene->_backgroundBounds);
805 	g_globals->_sceneOffset.y = (g_globals->_sceneManager._scene->_sceneBounds.top / 100) * 100;
806 
807 	setAction(&_action1);
808 	g_globals->_soundHandler.play(118);
809 }
810 
811 /*--------------------------------------------------------------------------
812  * Scene 1500 - Ringworld Space-port
813  *
814  *--------------------------------------------------------------------------*/
815 
signal()816 void Scene1500::Action1::signal() {
817 	Scene1500 *scene = (Scene1500 *)g_globals->_sceneManager._scene;
818 
819 	switch (_actionIndex++) {
820 	case 0: {
821 		scene->_object1.postInit();
822 		scene->_object1.setVisage(1501);
823 		scene->_object1._moveDiff = Common::Point(2, 1);
824 		scene->_object1.setPosition(Common::Point(204, 85));
825 		scene->_object1.animate(ANIM_MODE_2, NULL);
826 		scene->_object1._numFrames = 3;
827 		scene->_object1.changeZoom(-1);
828 
829 		Common::Point pt(238, 121);
830 		PlayerMover *mover = new PlayerMover();
831 		scene->_object1.addMover(mover, &pt, this);
832 		break;
833 	}
834 	case 1: {
835 		Common::Point pt(312, 145);
836 		PlayerMover *mover = new PlayerMover();
837 		scene->_object1.addMover(mover, &pt, this);
838 		break;
839 	}
840 	case 2: {
841 		scene->_object1.setStrip(2);
842 		scene->_object1.setFrame(1);
843 		scene->_object1._moveDiff.y = 2;
844 		scene->_object1._numFrames = 5;
845 
846 		Common::Point pt(310, 150);
847 		PlayerMover *mover = new PlayerMover();
848 		scene->_object1.addMover(mover, &pt, this);
849 		break;
850 	}
851 	case 3: {
852 		Common::Point pt(304, 165);
853 		PlayerMover *mover = new PlayerMover();
854 		scene->_object1.addMover(mover, &pt, this);
855 		break;
856 	}
857 	case 4: {
858 		scene->_object1._numFrames = 3;
859 		scene->_object1.setStrip2(3);
860 		scene->_object1.animate(ANIM_MODE_2, this);
861 
862 		Common::Point pt(94, 175);
863 		PlayerMover *mover = new PlayerMover();
864 		scene->_object1.addMover(mover, &pt, this);
865 		break;
866 	}
867 	case 5:
868 		setDelay(30);
869 		break;
870 	case 6:
871 		scene->_soundHandler.play(123);
872 		scene->_object1.setStrip2(4);
873 		scene->_object1.setFrame(1);
874 		scene->_object1.animate(ANIM_MODE_5, this);
875 		break;
876 	case 7:
877 		scene->_object1.setStrip2(5);
878 		scene->_object1.animate(ANIM_MODE_2, NULL);
879 		scene->_soundHandler.play(124, this);
880 		break;
881 	case 8:
882 		g_globals->_soundHandler.play(126, this);
883 		break;
884 	case 9:
885 		g_globals->_soundHandler.play(127);
886 		g_globals->_sceneManager.changeScene(2000);
887 		break;
888 	default:
889 		break;
890 	}
891 }
892 
signal()893 void Scene1500::Action2::signal() {
894 	Scene1500 *scene = (Scene1500 *)g_globals->_sceneManager._scene;
895 
896 	switch (_actionIndex++) {
897 	case 0:
898 		setDelay(6);
899 		break;
900 	case 1: {
901 		scene->_object2.postInit();
902 		scene->_object2.setVisage(1502);
903 		scene->_object2.fixPriority(255);
904 		scene->_object2.changeZoom(5);
905 		scene->_object2._frame = 1;
906 		scene->_object2._moveDiff = Common::Point(1, 1);
907 		scene->_object2.setPosition(Common::Point(104, 184));
908 		scene->_object2.animate(ANIM_MODE_2, NULL);
909 
910 		Common::Point pt(118, 147);
911 		NpcMover *mover = new NpcMover();
912 		scene->_object2.addMover(mover, &pt, this);
913 		break;
914 	}
915 	case 2: {
916 		scene->_object2._moveDiff.x = 5;
917 		scene->_object2.changeZoom(-1);
918 		Common::Point pt(-55, 200);
919 		NpcMover *mover = new NpcMover();
920 		scene->_object2.addMover(mover, &pt, this);
921 		break;
922 	}
923 	case 3:
924 		scene->_soundHandler.release();
925 		g_globals->_stripNum = 1505;
926 		g_globals->_sceneManager.changeScene(2400);
927 		break;
928 	default:
929 		break;
930 	}
931 }
932 
933 /*--------------------------------------------------------------------------*/
934 
postInit(SceneObjectList * OwnerList)935 void Scene1500::postInit(SceneObjectList *OwnerList) {
936 	loadScene(1500);
937 	Scene::postInit();
938 
939 	if ((g_globals->_stripNum == 1500) || ((g_globals->_stripNum != 1504) && (g_globals->_stripNum != 2751))) {
940 		g_globals->_soundHandler.play(120);
941 		setZoomPercents(105, 20, 145, 100);
942 
943 		setAction(&_action1);
944 	} else {
945 		setZoomPercents(150, 5, 200, 100);
946 
947 		_object1.postInit();
948 		_object1.setVisage(1501);
949 		_object1.setStrip2(5);
950 		_object1.setPosition(Common::Point(94, 175));
951 		_object1.animate(ANIM_MODE_2, NULL);
952 
953 		setAction(&_action2);
954 	}
955 }
956 
957 } // End of namespace Ringworld
958 
959 } // End of namespace TsAGE
960