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/ringworld/ringworld_scenes6.h"
24 #include "tsage/scenes.h"
25 #include "tsage/tsage.h"
26 #include "tsage/staticres.h"
27
28 namespace TsAGE {
29
30 namespace Ringworld {
31
32 /*--------------------------------------------------------------------------
33 * Scene 5000 - Caverns - Entrance
34 *
35 *--------------------------------------------------------------------------*/
36
signal()37 void Scene5000::Action1::signal() {
38 // Ship landing
39 Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
40
41 switch (_actionIndex++) {
42 case 0:
43 setDelay(10);
44 break;
45 case 1:
46 scene->_soundHandler.play(190);
47 scene->_soundHandler.holdAt(true);
48 ADD_MOVER(scene->_hotspot1, 283, 12);
49 break;
50 case 2:
51 break;
52 case 3:
53 scene->_hotspot1._moveDiff.y = 1;
54 scene->_hotspot4.setPosition(Common::Point(scene->_hotspot1._position.x,
55 scene->_hotspot1._position.y + 15));
56 scene->_hotspot4.show();
57 setDelay(15);
58 break;
59 case 4:
60 scene->_soundHandler.release();
61 ADD_MOVER(scene->_hotspot1, 233, 80);
62 break;
63 case 5:
64 scene->_hotspot3.animate(ANIM_MODE_8, 0, NULL);
65 scene->_hotspot3.show();
66 ADD_MOVER(scene->_hotspot1, 233, 90);
67 break;
68 case 6:
69 scene->_hotspot3.remove();
70 scene->_hotspot2.setPosition(Common::Point(233, 76));
71 scene->_hotspot2.show();
72 scene->_hotspot2.animate(ANIM_MODE_5, this);
73
74 scene->_hotspot4.remove();
75 break;
76 case 7:
77 setDelay(60);
78 scene->_hotspot2.remove();
79 break;
80 case 8:
81 scene->_hotspot5.show();
82 scene->_hotspot5.animate(ANIM_MODE_5, this);
83 break;
84 case 9:
85 scene->setAction(&scene->_action2);
86 break;
87 default:
88 break;
89 }
90 }
91
dispatch()92 void Scene5000::Action1::dispatch() {
93 Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
94 Action::dispatch();
95
96 if (_actionIndex == 3) {
97 if (scene->_hotspot1._percent % 2 == 0) {
98 ++scene->_hotspot1._position.y;
99 if (scene->_hotspot1._position.x > 233)
100 --scene->_hotspot1._position.x;
101 }
102
103 scene->_hotspot1.changeZoom(++scene->_hotspot1._percent);
104 scene->_hotspot1._flags |= OBJFLAG_PANES;
105
106 if (scene->_hotspot1._percent >= 100)
107 signal();
108 }
109
110 if ((_actionIndex == 5) || (_actionIndex == 6)) {
111 scene->_hotspot4.setPosition(Common::Point(scene->_hotspot1._position.x,
112 scene->_hotspot1._position.y + 15));
113 }
114 }
115
signal()116 void Scene5000::Action2::signal() {
117 Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
118
119 switch (_actionIndex++) {
120 case 0:
121 g_globals->_player.setPosition(Common::Point(217, 76));
122 setDelay(10);
123 break;
124 case 1:
125 g_globals->_player.setStrip2(3);
126 g_globals->_player.animate(ANIM_MODE_1, NULL);
127 ADD_MOVER(g_globals->_player, 214, 89);
128 break;
129 case 2:
130 if (!g_globals->getFlag(59))
131 setAction(&scene->_action3, this);
132 g_globals->_player.fixPriority(15);
133 ADD_MOVER(g_globals->_player, 208, 100);
134 break;
135 case 3:
136 ADD_MOVER(g_globals->_player, 213, 98);
137 break;
138 case 4:
139 g_globals->_player.fixPriority(20);
140 ADD_MOVER(g_globals->_player, 215, 115);
141 break;
142 case 5:
143 g_globals->_player.changeZoom(47);
144 ADD_MOVER(g_globals->_player, 220, 125);
145 break;
146 case 6:
147 ADD_MOVER(g_globals->_player, 229, 115);
148 break;
149 case 7:
150 g_globals->_player.changeZoom(-1);
151 g_globals->_player.fixPriority(35);
152 ADD_MOVER(g_globals->_player, 201, 166);
153 break;
154 case 8:
155 g_globals->_player.updateZoom();
156 ADD_MOVER(g_globals->_player, 205, 146);
157 break;
158 case 9:
159 g_globals->_player.changeZoom(-1);
160 g_globals->_player.fixPriority(50);
161 ADD_MOVER(g_globals->_player, 220, 182);
162 break;
163 case 10:
164 g_globals->_player.updateZoom();
165 ADD_MOVER(g_globals->_player, 208, 163);
166 break;
167 case 11:
168 g_globals->_player.changeZoom(-1);
169 g_globals->_player.setStrip2(-1);
170 g_globals->_player.fixPriority(-1);
171 ADD_MOVER(g_globals->_player, 208, 175);
172 break;
173 case 12:
174 g_globals->_player.setStrip(8);
175 g_globals->_player.setFrame(1);
176 setDelay(10);
177 break;
178 case 13:
179 if (!g_globals->_sceneObjects->contains(&scene->_hotspot7))
180 setDelay(10);
181 break;
182 case 14:
183 setDelay(30);
184 break;
185 case 15:
186 g_globals->_player.enableControl();
187 remove();
188 break;
189 default:
190 break;
191 }
192 }
193
signal()194 void Scene5000::Action3::signal() {
195 Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
196
197 switch (_actionIndex++) {
198 case 0:
199 setDelay(10);
200 break;
201 case 1:
202 scene->_hotspot7.postInit();
203 scene->_hotspot7.setVisage(2809);
204 scene->_hotspot7.setObjectWrapper(new SceneObjectWrapper());
205 scene->_hotspot7.setPosition(Common::Point(217, 76));
206 scene->_hotspot7.changeZoom(10);
207 scene->_hotspot7.setStrip2(3);
208 scene->_hotspot7.fixPriority(200);
209 scene->_hotspot7._moveDiff.y = 2;
210 scene->_hotspot7.animate(ANIM_MODE_1, NULL);
211 ADD_MOVER(scene->_hotspot7, 214, 89);
212
213 g_globals->_sceneItems.push_front(&scene->_hotspot7);
214 break;
215 case 2:
216 scene->_hotspot7.changeZoom(-1);
217 scene->_hotspot7.fixPriority(14);
218 ADD_MOVER(scene->_hotspot7, 208, 100);
219 break;
220 case 3:
221 ADD_MOVER(scene->_hotspot7, 213, 98);
222 break;
223 case 4:
224 scene->_hotspot7.fixPriority(19);
225 ADD_MOVER(scene->_hotspot7, 215, 115);
226 break;
227 case 5:
228 scene->_hotspot7.changeZoom(46);
229 ADD_MOVER(scene->_hotspot7, 220, 125);
230 break;
231 case 6:
232 ADD_MOVER(scene->_hotspot7, 229, 115);
233 break;
234 case 7:
235 scene->_hotspot7.changeZoom(-1);
236 scene->_hotspot7.fixPriority(34);
237 ADD_MOVER(scene->_hotspot7, 201, 166);
238 break;
239 case 8:
240 scene->_hotspot7.updateZoom();
241 ADD_MOVER(scene->_hotspot7, 205, 146);
242 break;
243 case 9:
244 scene->_hotspot7.changeZoom(-1);
245 scene->_hotspot7.fixPriority(49);
246 ADD_MOVER(scene->_hotspot7, 210, 182);
247 break;
248 case 10:
249 scene->_hotspot7.updateZoom();
250 ADD_MOVER(scene->_hotspot7, 208, 163);
251 break;
252 case 11:
253 scene->_hotspot7.changeZoom(-1);
254 scene->_hotspot7.setStrip2(-1);
255 scene->_hotspot7.fixPriority(-1);
256 ADD_MOVER(scene->_hotspot7, 175, 166);
257 break;
258 case 12:
259 ADD_MOVER(scene->_hotspot7, 126, 146);
260 break;
261 case 13:
262 scene->_hotspot7.setStrip(2);
263 remove();
264 break;
265 default:
266 break;
267 }
268 }
269
signal()270 void Scene5000::Action4::signal() {
271 Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
272
273 switch (_actionIndex++) {
274 case 0:
275 setDelay(1);
276 break;
277 case 1:
278 g_globals->_player.fixPriority(50);
279 g_globals->_player.setStrip2(4);
280 ADD_MOVER(g_globals->_player, 210, 182);
281 break;
282 case 2:
283 ADD_MOVER(g_globals->_player, 205, 146);
284 break;
285 case 3:
286 g_globals->_player.fixPriority(35);
287 ADD_MOVER(g_globals->_player, 201, 166);
288 break;
289 case 4:
290 ADD_MOVER(g_globals->_player, 229, 115);
291 break;
292 case 5:
293 g_globals->_player.fixPriority(20);
294 g_globals->_player.changeZoom(47);
295 ADD_MOVER(g_globals->_player, 220, 125);
296 break;
297 case 6:
298 ADD_MOVER(g_globals->_player, 215, 115);
299 break;
300 case 7:
301 g_globals->_player.changeZoom(-1);
302 ADD_MOVER(g_globals->_player, 213, 98);
303 break;
304 case 8:
305 g_globals->_player.fixPriority(15);
306 ADD_MOVER(g_globals->_player, 208, 100);
307 break;
308 case 9:
309 ADD_MOVER(g_globals->_player, 214, 89);
310 break;
311 case 10:
312 ADD_MOVER(g_globals->_player, 217, 76);
313 break;
314 case 11:
315 g_globals->_player.hide();
316 setDelay(60);
317 break;
318 case 12:
319 if (!g_globals->_sceneObjects->contains(&scene->_hotspot7))
320 g_globals->_sceneManager.changeScene(2320);
321 remove();
322 break;
323 default:
324 break;
325 }
326 }
327
signal()328 void Scene5000::Action5::signal() {
329 Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
330
331 switch (_actionIndex++) {
332 case 0:
333 g_globals->_player.disableControl();
334 ADD_MOVER(g_globals->_player, 91, 155);
335 break;
336 case 1:
337 g_globals->_player.setVisage(2670);
338 g_globals->_player._strip = 4;
339 g_globals->_player._frame = 1;
340 g_globals->_player.animate(ANIM_MODE_5, this);
341 break;
342 case 2:
343 SceneItem::display2(5000, g_globals->_sceneObjects->contains(&scene->_hotspot7) ? 17 : 13);
344 g_globals->_player.animate(ANIM_MODE_6, this);
345 break;
346 case 3:
347 g_globals->_player.setVisage(0);
348 g_globals->_player._strip = 8;
349 g_globals->_player.animate(ANIM_MODE_1, NULL);
350
351 g_globals->_player.enableControl();
352 remove();
353 break;
354 default:
355 break;
356 }
357 }
358
signal()359 void Scene5000::Action6::signal() {
360 // Discussion between the hero and Seeker, then the hero goes back to the lander
361 Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
362
363 switch (_actionIndex++) {
364 case 0:
365 g_globals->_player.disableControl();
366 setDelay(3);
367 break;
368 case 1:
369 g_globals->_events.setCursor(CURSOR_WALK);
370 scene->_stripManager.start(2150, this);
371 break;
372 case 2:
373 g_globals->_events.setCursor(CURSOR_NONE);
374 scene->setAction(&scene->_sequenceManager, this, 5001, &scene->_hotspot7, NULL);
375 break;
376 case 3:
377 ADD_PLAYER_MOVER(208, 163);
378 break;
379 case 4:
380 g_globals->_player.fixPriority(50);
381 g_globals->_player.setStrip2(4);
382 ADD_MOVER(g_globals->_player, 210, 182);
383 break;
384 case 5:
385 g_globals->_sceneManager.changeScene(2100);
386 break;
387 default:
388 break;
389 }
390 }
391
392 /*--------------------------------------------------------------------------*/
393
doAction(int action)394 void Scene5000::Hotspot7::doAction(int action) {
395 Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
396
397 switch (action) {
398 case CURSOR_LOOK:
399 SceneItem::display2(5000, 12);
400 break;
401 case CURSOR_TALK:
402 scene->setAction(&scene->_action6);
403 break;
404 default:
405 SceneHotspot::doAction(action);
406 break;
407 }
408 }
409
doAction(int action)410 void Scene5000::Hotspot8::doAction(int action) {
411 // Cave
412 Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
413
414 switch (action) {
415 case CURSOR_LOOK:
416 SceneItem::display2(5000, 10);
417 break;
418 case OBJECT_STUNNER:
419 SceneItem::display2(5000, 14);
420 break;
421 case OBJECT_SCANNER:
422 scene->setAction(&scene->_action5);
423 break;
424 default:
425 SceneHotspot::doAction(action);
426 break;
427 }
428 }
429
doAction(int action)430 void Scene5000::HotspotGroup1::doAction(int action) {
431 Scene5000 *scene = (Scene5000 *)g_globals->_sceneManager._scene;
432
433 if (g_globals->_sceneObjects->contains(&scene->_hotspot7))
434 scene->setAction(&scene->_action6);
435 else
436 SceneItem::display2(5000, 11);
437 }
438 /*--------------------------------------------------------------------------*/
439
Scene5000()440 Scene5000::Scene5000() :
441 _hotspot1(0, CURSOR_LOOK, 5000, 3, LIST_END),
442 _hotspot12(0, CURSOR_LOOK, 5000, 6, CURSOR_USE, 5000, 7, OBJECT_STUNNER, 5000, 14,
443 OBJECT_SCANNER, 5000, 16, LIST_END),
444 _hotspot13(0, CURSOR_LOOK, 5000, 8, CURSOR_USE, 5000, 9, OBJECT_STUNNER, 5000, 0,
445 OBJECT_SCANNER, 5000, 16, LIST_END),
446 _hotspot14(0, CURSOR_LOOK, 5000, 8, CURSOR_USE, 5000, 9, OBJECT_STUNNER, 5000, 0,
447 OBJECT_SCANNER, 5000, 16, LIST_END),
448 _hotspot15(0, CURSOR_LOOK, 5000, 2, OBJECT_STUNNER, 5000, 15, LIST_END),
449 _hotspot16(0, CURSOR_LOOK, 5000, 4, CURSOR_USE, 5000, 5, LIST_END),
450 _hotspot17(0, CURSOR_LOOK, 5000, 1, LIST_END),
451 _hotspot18(0, CURSOR_LOOK, 5000, 0, LIST_END) {
452 }
453
454
postInit(SceneObjectList * OwnerList)455 void Scene5000::postInit(SceneObjectList *OwnerList) {
456 Scene::postInit();
457 loadScene(5000);
458
459 _stripManager.addSpeaker(&_speakerSText);
460 _stripManager.addSpeaker(&_speakerQText);
461
462 g_globals->_player.postInit();
463 g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
464 g_globals->_player.setVisage(0);
465 g_globals->_player.animate(ANIM_MODE_1, NULL);
466 g_globals->_player._moveDiff = Common::Point(4, 2);
467 g_globals->_player.changeZoom(-1);
468 g_globals->_player.disableControl();
469
470 _hotspot1.postInit();
471 _hotspot1.setVisage(5001);
472 _hotspot1.setFrame2(1);
473 _hotspot1._moveDiff = Common::Point(5, 5);
474 _hotspot1.fixPriority(10);
475 _hotspot1.changeZoom(10);
476
477 _hotspot4.postInit();
478 _hotspot4.setVisage(5001);
479 _hotspot4.setStrip2(2);
480 _hotspot4._moveDiff = Common::Point(5, 1);
481 _hotspot4.fixPriority(10);
482 _hotspot4.changeZoom(100);
483 _hotspot4.animate(ANIM_MODE_8, 0, NULL);
484 _hotspot4.hide();
485
486 _hotspot2.postInit();
487 _hotspot2.setVisage(5001);
488 _hotspot2.setStrip2(3);
489 _hotspot2._numFrames = 5;
490 _hotspot2.hide();
491
492 _hotspot3.postInit();
493 _hotspot3.setVisage(5001);
494 _hotspot3.setStrip2(5);
495 _hotspot3._numFrames = 5;
496 _hotspot3.setPosition(Common::Point(233, 76));
497 _hotspot3.hide();
498
499 _hotspot5.postInit();
500 _hotspot5.setVisage(5001);
501 _hotspot5.setStrip2(4);
502 _hotspot5._numFrames = 5;
503 _hotspot5.fixPriority(15);
504 _hotspot5.setPosition(Common::Point(218, 76));
505 _hotspot5.hide();
506
507 _hotspot9.postInit();
508 _hotspot9.setVisage(5002);
509 _hotspot9.fixPriority(80);
510 _hotspot9.setPosition(Common::Point(71, 174));
511
512 _hotspot10.postInit();
513 _hotspot10.setVisage(5002);
514 _hotspot10.setStrip2(2);
515 _hotspot10.setPosition(Common::Point(87, 120));
516
517 _hotspot11.postInit();
518 _hotspot11.setVisage(5002);
519 _hotspot11.setStrip2(2);
520 _hotspot11.setFrame(3);
521 _hotspot10.setPosition(Common::Point(93, 118));
522
523 setZoomPercents(95, 10, 145, 100);
524
525 _hotspot8.setBounds(Rect(0, 73, 87, 144));
526 _hotspot18.setBounds(Rect(54, 0, 319, 85));
527 _hotspot17.setBounds(Rect(184, 0, 199, 79));
528 _hotspot13.setBounds(Rect(0, 164, 135, 200));
529 _hotspot14.setBounds(Rect(0, 0, 105, 140));
530 _hotspot15.setBounds(Rect(266, 70, 291, 85));
531 _hotspot16.setBounds(Rect(0, 86, 319, 200));
532 _hotspot12.setBounds(Rect(230, 143, 244, 150));
533
534 g_globals->_sceneItems.addItems(&_hotspot9, &_hotspot10, &_hotspot11, &_hotspot8, &_hotspot13,
535 &_hotspot14, &_hotspot12, &_hotspot15, &_hotspot17, &_hotspot18, &_hotspot16, NULL);
536
537 switch (g_globals->_sceneManager._previousScene) {
538 case 1000:
539 case 2100:
540 case 2320:
541 if (g_globals->getFlag(59)) {
542 _hotspot1.setPosition(Common::Point(233, 90));
543 _hotspot1.changeZoom(100);
544 _hotspot1.show();
545
546 _hotspot5.setFrame(1);
547 _hotspot5.animate(ANIM_MODE_5, NULL);
548 _hotspot5.setPosition(Common::Point(218, 76));
549 _hotspot5.show();
550
551 g_globals->_player.setPosition(Common::Point(217, -10));
552 g_globals->_player.disableControl();
553
554 setAction(&_action2);
555 } else {
556 g_globals->_player.setPosition(Common::Point(217, -10));
557 _hotspot1.setPosition(Common::Point(320, -10));
558 g_globals->_player.disableControl();
559
560 setAction(&_action1);
561 }
562 break;
563 default:
564 g_globals->_player.disableControl();
565 g_globals->_player.setPosition(Common::Point(0, 146));
566
567 _hotspot1.changeZoom(100);
568 _hotspot1.setPosition(Common::Point(233, 90));
569 _hotspot1.show();
570
571 _hotspot5.setFrame(_hotspot5.getFrameCount());
572 _hotspot5.show();
573
574 _sceneMode = 5004;
575 setAction(&_sequenceManager, this, 5004, &g_globals->_player, NULL);
576 break;
577 }
578
579 g_globals->_soundHandler.play(190);
580 }
581
signal()582 void Scene5000::signal() {
583 switch (_sceneMode) {
584 case 5002:
585 case 5003:
586 case 5004:
587 g_globals->_player.enableControl();
588 break;
589 case 5005:
590 g_globals->_sceneManager.changeScene(5100);
591 break;
592 default:
593 break;
594 }
595 }
596
dispatch()597 void Scene5000::dispatch() {
598 Scene::dispatch();
599
600 if (!_action) {
601 if (!g_globals->_sceneObjects->contains(&_hotspot7) && (g_globals->_player.getRegionIndex() == 10)) {
602 g_globals->_player.disableControl();
603 _sceneMode = 5005;
604 setAction(&_sequenceManager, this, 5005, &g_globals->_player, NULL);
605 }
606
607 if (g_globals->_player.getRegionIndex() == 8) {
608 g_globals->_player.disableControl();
609
610 if (g_globals->_sceneObjects->contains(&_hotspot7)) {
611 _sceneMode = 5003;
612 g_globals->_player.addMover(NULL);
613 setAction(&_sequenceManager, this, 5003, &g_globals->_player, NULL);
614 } else {
615 setAction(&_action4);
616 }
617 }
618
619 if (g_globals->_sceneObjects->contains(&_hotspot7) && (g_globals->_player.getRegionIndex() == 15)) {
620 _sceneMode = 5002;
621 g_globals->_player.disableControl();
622 g_globals->_player.addMover(NULL);
623 setAction(&_sequenceManager, this, 5002, &g_globals->_player, NULL);
624 }
625 }
626 }
627
628 /*--------------------------------------------------------------------------
629 * Scene 5100 - Caverns
630 *
631 *--------------------------------------------------------------------------*/
632
signal()633 void Scene5100::Action1::signal() {
634 // Quinn enters the cave for the first time
635 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
636
637 switch (_actionIndex++) {
638 case 0:
639 setDelay(5);
640 break;
641 case 1:
642 ADD_MOVER(g_globals->_player, 1111, 165);
643 break;
644 case 2:
645 g_globals->_player.setStrip(6);
646 g_globals->_player.setFrame(1);
647 setDelay(60);
648 break;
649 case 3:
650 if (g_globals->getFlag(10)) {
651 g_globals->_player.enableControl();
652 remove();
653 } else {
654 g_globals->setFlag(10);
655 scene->_stripManager.start(5102, this);
656 }
657 break;
658 case 4:
659 scene->_soundHandler.play(206);
660
661 scene->_hotspot5.postInit();
662 scene->_hotspot5.setVisage(5362);
663 scene->_hotspot5.setPosition(Common::Point(1160, 34));
664 scene->_hotspot5.setStrip2(2);
665 scene->_hotspot5.animate(ANIM_MODE_1, NULL);
666 scene->_hotspot5.fixPriority(10);
667
668 g_globals->_sceneItems.push_front(&scene->_hotspot5);
669 ADD_MOVER(scene->_hotspot5, 999, 14);
670 break;
671 case 5:
672 scene->_hotspot5.setStrip2(4);
673 scene->_hotspot5._frame = 1;
674 scene->_hotspot5.animate(ANIM_MODE_5, this);
675 break;
676 case 6:
677 g_globals->_player.enableControl();
678 remove();
679 break;
680 default:
681 break;
682 }
683 }
684
signal()685 void Scene5100::Action2::signal() {
686 // Quinn and Seeker exit the cave
687 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
688
689 switch (_actionIndex++) {
690 case 0:
691 g_globals->_player.disableControl();
692 setDelay(5);
693 break;
694 case 1:
695 if (scene->_hotspot8._visage == 2806)
696 setDelay(1);
697 else
698 scene->_hotspot8.animate(ANIM_MODE_5, this);
699 break;
700 case 2:
701 if (scene->_hotspot8._visage != 2806) {
702 scene->_hotspot8.setVisage(2806);
703 scene->_hotspot8.setPosition(Common::Point(548, 193));
704 scene->_hotspot8.animate(ANIM_MODE_1, NULL);
705 scene->_hotspot8._angle = 325;
706 scene->_hotspot8.setObjectWrapper(new SceneObjectWrapper());
707 scene->_hotspot8.setStrip(8);
708 }
709
710 scene->_stripManager.start(5129, this);
711 break;
712 case 3:
713 if (g_globals->_player._position.x >= 966) {
714 ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155);
715 } else {
716 ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 966, 185);
717 }
718
719 if (g_globals->_player._position.x >= 966) {
720 setDelay(1);
721 } else {
722 ADD_PLAYER_MOVER(966, 190);
723 }
724 break;
725 case 4:
726 ADD_PLAYER_MOVER_NULL(scene->_hotspot8, 1215, 155);
727 ADD_PLAYER_MOVER(1215, 155);
728 break;
729 case 5:
730 g_globals->_sceneManager.changeScene(2100);
731 break;
732 default:
733 break;
734 }
735 }
736
signal()737 void Scene5100::Action3::signal() {
738 // Quinns shots flesheater
739 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
740
741 switch (_actionIndex++) {
742 case 0:
743 g_globals->setFlag(62);
744 g_globals->_player.disableControl();
745 g_globals->_player.addMover(NULL);
746
747 scene->_hotspot2.addMover(NULL);
748 scene->_hotspot3.addMover(NULL);
749 g_globals->_player.setVisage(2672);
750
751 if (static_cast<SceneObject *>(_owner)->_position.x >= g_globals->_player._position.x)
752 g_globals->_player._strip = 4;
753 else
754 g_globals->_player._strip = 3;
755 g_globals->_player._frame = 1;
756 g_globals->_player.animate(ANIM_MODE_5, this);
757 break;
758 case 1:
759 g_globals->_player.setVisage(2674);
760 g_globals->_player.setFrame(1);
761 g_globals->_player.animate(ANIM_MODE_5, this);
762 break;
763 case 2:
764 scene->_soundHandler.play(28);
765 if (static_cast<SceneObject *>(_owner)->_position.x < g_globals->_player._position.x) {
766 scene->_hotspot2.setVisage(5130);
767 scene->_hotspot2._strip = 1;
768 scene->_hotspot2._frame = 1;
769 scene->_hotspot2.animate(ANIM_MODE_5, this);
770 scene->_hotspot2.setAction(NULL);
771
772 scene->_hotspot3.setStrip2(1);
773 ADD_PLAYER_MOVER_NULL(scene->_hotspot3, 1200, 100);
774 } else {
775 scene->_hotspot3.setVisage(5130);
776 scene->_hotspot3._strip = 1;
777 scene->_hotspot3._frame = 1;
778 scene->_hotspot3.animate(ANIM_MODE_5, this);
779 scene->_hotspot3.setAction(NULL);
780
781 scene->_hotspot2.setStrip2(2);
782 ADD_PLAYER_MOVER_NULL(scene->_hotspot2, 10, 140);
783
784 }
785
786 g_globals->_player.setVisage(2672);
787 g_globals->_player._frame = g_globals->_player.getFrameCount();
788 g_globals->_player.animate(ANIM_MODE_6, this);
789 break;
790 case 3:
791 break;
792 case 4:
793 SceneItem::display2(5100, 38);
794 g_globals->_player.enableControl();
795
796 g_globals->_player.setVisage(0);
797 g_globals->_player._strip = 8;
798 g_globals->_player.animate(ANIM_MODE_1, NULL);
799 remove();
800 break;
801 default:
802 break;
803 }
804 }
805
signal()806 void Scene5100::Action4::signal() {
807 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
808
809 switch (_actionIndex++) {
810 case 0: {
811 g_globals->_player.disableControl();
812 scene->_soundHandler.play(208);
813 SceneItem::display2(5100, 15);
814
815 ObjectMover3 *mover = new ObjectMover3();
816 scene->_hotspot2.addMover(mover, &g_globals->_player, 20, this);
817 break;
818 }
819 case 1:
820 scene->_hotspot1.postInit();
821 scene->_hotspot1.setVisage(5120);
822 scene->_hotspot1.setPosition(Common::Point(795, 161));
823 scene->_hotspot1._strip = 4;
824 scene->_hotspot1.animate(ANIM_MODE_5, this);
825 break;
826 case 2:
827 setDelay(15);
828 break;
829 case 3:
830 g_globals->_sceneManager.changeScene(5200);
831 break;
832 default:
833 break;
834 }
835 }
836
signal()837 void Scene5100::Action5::signal() {
838 // Quinns forgot the statis box in the throne room, and goes back
839 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
840
841 switch (_actionIndex++) {
842 case 0:
843 g_globals->_player.disableControl();
844 setDelay(60);
845 break;
846 case 1:
847 scene->_stripManager.start(5128, this);
848 break;
849 case 2:
850 setDelay(15);
851 break;
852 case 3:
853 scene->_sceneMode = 5106;
854 scene->setAction(&scene->_sequenceManager, scene, 5106, &g_globals->_player, &scene->_hotspot14, NULL);
855 break;
856 default:
857 break;
858 }
859 }
860
861 /*--------------------------------------------------------------------------*/
862
doAction(int action)863 void Scene5100::HotspotGroup1::doAction(int action) {
864 // Flesh Eaters
865 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
866
867 switch (action) {
868 case CURSOR_LOOK:
869 SceneItem::display2(5100, g_globals->getFlag(62) ? 41 : 26);
870 break;
871 case CURSOR_USE:
872 SceneItem::display2(5100, 11);
873 break;
874 case OBJECT_SCANNER:
875 SceneItem::display2(5100, 17);
876 break;
877 case OBJECT_STUNNER:
878 if (g_globals->getFlag(62))
879 SceneItem::display2(5100, 42);
880 else
881 setAction(&scene->_action3);
882 break;
883 default:
884 SceneHotspot::doAction(action);
885 break;
886 }
887 }
888
doAction(int action)889 void Scene5100::Hotspot4::doAction(int action) {
890 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
891
892 switch (action) {
893 case CURSOR_LOOK:
894 SceneItem::display2(5100, 31);
895 break;
896 case CURSOR_USE:
897 g_globals->_player.disableControl();
898 scene->_sceneMode = 5110;
899 scene->setAction(&scene->_sequenceManager, scene, 5110, &g_globals->_player, this, &scene->_hotspot7, NULL);
900 break;
901 case CURSOR_TALK:
902 SceneItem::display2(5100, 34);
903 break;
904 case OBJECT_STUNNER:
905 SceneItem::display2(5100, 36);
906 break;
907 case OBJECT_SCANNER:
908 SceneItem::display2(5100, 37);
909 break;
910 default:
911 SceneHotspot::doAction(action);
912 break;
913 }
914 }
915
doAction(int action)916 void Scene5100::HotspotGroup2::doAction(int action) {
917 // Bat
918 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
919
920 switch (action) {
921 case CURSOR_LOOK:
922 SceneItem::display2(5100, g_globals->getFlag(108) ? 47 : 23);
923 break;
924 case CURSOR_USE:
925 SceneItem::display2(5100, 29);
926 break;
927 case CURSOR_TALK:
928 if (_position.x >= 600)
929 SceneItem::display2(5100, 28);
930 else {
931 g_globals->_player.disableControl();
932 scene->_sceneMode = 5114;
933 scene->setAction(&scene->_sequenceManager, scene, 5114, NULL);
934 }
935 break;
936 case OBJECT_SCANNER:
937 SceneItem::display2(5100, 43);
938 break;
939 default:
940 SceneHotspot::doAction(action);
941 break;
942 }
943 }
944
doAction(int action)945 void Scene5100::Hotspot9::doAction(int action) {
946 // Rope
947 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
948
949 switch (action) {
950 case CURSOR_LOOK:
951 SceneItem::display2(5100, 32);
952 break;
953 case CURSOR_USE:
954 g_globals->_player.disableControl();
955 scene->_sceneMode = 5117;
956 scene->setAction(&scene->_sequenceManager, scene, 5117, &g_globals->_player, NULL);
957 break;
958 case OBJECT_STUNNER:
959 SceneItem::display2(5100, 35);
960 break;
961 case OBJECT_SCANNER:
962 SceneItem::display2(5100, 44);
963 break;
964 case OBJECT_BONE:
965 g_globals->_player.disableControl();
966 scene->_sceneMode = 5116;
967 scene->setAction(&scene->_sequenceManager, scene, 5116, &g_globals->_player, this, &scene->_hotspot10,
968 &scene->_hotspot4, NULL);
969 break;
970 default:
971 SceneHotspot::doAction(action);
972 break;
973 }
974 }
975
doAction(int action)976 void Scene5100::Hotspot17::doAction(int action) {
977 // Rock blocking pit entrance
978 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
979
980 switch (action) {
981 case CURSOR_LOOK:
982 SceneItem::display2(5100, 18);
983 break;
984 case CURSOR_USE:
985 if (g_globals->getFlag(67))
986 SceneItem::display2(5100, 19);
987 else {
988 g_globals->_player.disableControl();
989 scene->_sceneMode = 5101;
990 scene->setAction(&scene->_sequenceManager, scene, 5101, &g_globals->_player, this, NULL);
991 }
992 break;
993 default:
994 SceneHotspot::doAction(action);
995 break;
996 }
997 }
998
doAction(int action)999 void Scene5100::Hotspot18::doAction(int action) {
1000 switch (action) {
1001 case CURSOR_LOOK:
1002 if (g_globals->_sceneManager._previousScene != 5000) {
1003 SceneItem::display2(5100, 3);
1004 } else {
1005 switch (_index1) {
1006 case 0:
1007 SceneItem::display2(5100, 0);
1008 ++_index1;
1009 break;
1010 case 1:
1011 SceneItem::display2(5100, 1);
1012 ++_index1;
1013 break;
1014 default:
1015 SceneItem::display2(5100, 2);
1016 break;
1017 }
1018 }
1019 break;
1020 case CURSOR_USE:
1021 switch (_index2) {
1022 case 0:
1023 SceneItem::display2(5100, 8);
1024 ++_index2;
1025 break;
1026 case 1:
1027 SceneItem::display2(5100, 9);
1028 ++_index2;
1029 break;
1030 default:
1031 SceneItem::display2(5100, 10);
1032 break;
1033 }
1034 break;
1035
1036 default:
1037 SceneHotspot::doAction(action);
1038 break;
1039 }
1040 }
1041
doAction(int action)1042 void Scene5100::Hotspot19::doAction(int action) {
1043 // Pillar
1044 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
1045
1046 switch (action) {
1047 case CURSOR_LOOK:
1048 SceneItem::display2(5100, g_globals->_sceneObjects->contains(&scene->_hotspot14) ? 27 : 20);
1049 break;
1050 case CURSOR_USE:
1051 g_globals->_player.disableControl();
1052 scene->_sceneMode = 5106;
1053
1054 if (g_globals->getFlag(66))
1055 scene->setAction(&scene->_sequenceManager, scene, 5113, &g_globals->_player, NULL);
1056 else {
1057 g_globals->setFlag(66);
1058 scene->setAction(&scene->_sequenceManager, scene, 5106, &g_globals->_player, &scene->_hotspot14, NULL);
1059 }
1060 break;
1061 default:
1062 SceneHotspot::doAction(action);
1063 break;
1064 }
1065 }
1066
doAction(int action)1067 void Scene5100::Hotspot20::doAction(int action) {
1068 Scene5100 *scene = (Scene5100 *)g_globals->_sceneManager._scene;
1069
1070 switch (action) {
1071 case CURSOR_LOOK:
1072 SceneItem::display2(5100, 21);
1073 break;
1074 case CURSOR_USE:
1075 g_globals->_player.disableControl();
1076
1077 if (g_globals->getFlag(67)) {
1078 scene->_sceneMode = 5112;
1079 scene->setAction(&scene->_sequenceManager, scene, 5112, &g_globals->_player, NULL);
1080 } else {
1081 scene->_sceneMode = 5101;
1082 scene->setAction(&scene->_sequenceManager, scene, 5106, &g_globals->_player, &scene->_hotspot17, NULL);
1083 }
1084 break;
1085 default:
1086 SceneHotspot::doAction(action);
1087 break;
1088 }
1089 }
1090
1091 /*--------------------------------------------------------------------------*/
1092
Scene5100()1093 Scene5100::Scene5100() :
1094 _hotspot16(0, CURSOR_LOOK, 5100, 48, LIST_END),
1095 _hotspot21(0, CURSOR_LOOK, 5100, 4, CURSOR_USE, 5100, 5, LIST_END) {
1096 }
1097
postInit(SceneObjectList * OwnerList)1098 void Scene5100::postInit(SceneObjectList *OwnerList) {
1099 Scene::postInit();
1100 setZoomPercents(50, 10, 200, 100);
1101 _sceneMode = 0;
1102
1103 _stripManager.addSpeaker(&_speakerMText);
1104 _stripManager.addSpeaker(&_speakerQText);
1105 _stripManager.addSpeaker(&_speakerSText);
1106 _stripManager.addSpeaker(&_speakerGameText);
1107 _stripManager.addSpeaker(&_speakerBatText);
1108 _speakerQText._npc = &g_globals->_player;
1109 _speakerMText._npc = &g_globals->_player;
1110 _speakerSText._npc = &_hotspot8;
1111
1112 g_globals->_player.postInit();
1113 g_globals->_player.setVisage(0);
1114 g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
1115 g_globals->_player.animate(ANIM_MODE_1, NULL);
1116 g_globals->_player.disableControl();
1117
1118 if ((!g_globals->getFlag(66)) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) {
1119 _hotspot14.postInit();
1120 _hotspot14.setVisage(5101);
1121 _hotspot14.setPosition(Common::Point(498, 147));
1122 _hotspot14.fixPriority(200);
1123 _hotspot14._moveDiff.y = 10;
1124 }
1125
1126 _hotspot17.postInit();
1127 _hotspot17.setVisage(5101);
1128 _hotspot17._strip = 2;
1129 _hotspot17.fixPriority(200);
1130
1131 if (g_globals->getFlag(67))
1132 _hotspot17.setPosition(Common::Point(554, 192));
1133 else
1134 _hotspot17.setPosition(Common::Point(539, 179));
1135
1136 _hotspot19.setBounds(Rect(488, 115, 508, 148));
1137 _hotspot21.setBounds(Rect(1150, 85, 1173, 112));
1138 _hotspot20.setBounds(Rect(517, 193, 562, 200));
1139 g_globals->_sceneItems.addItems(&_hotspot19, &_hotspot21, NULL);
1140
1141 if (g_globals->getFlag(67)) {
1142 g_globals->_sceneItems.addItems(&_hotspot20, &_hotspot17, NULL);
1143 } else {
1144 g_globals->_sceneItems.addItems(&_hotspot17, &_hotspot20, NULL);
1145 }
1146
1147 if (!g_globals->getFlag(105)) {
1148 _hotspot4.postInit();
1149 _hotspot4.setVisage(5363);
1150 _hotspot4.setPosition(Common::Point(1025, 65));
1151 _hotspot4.setStrip(4);
1152 _hotspot4.animate(ANIM_MODE_7, 0, NULL);
1153 g_globals->_sceneItems.push_back(&_hotspot4);
1154
1155 _hotspot9.postInit();
1156 _hotspot9.setVisage(5363);
1157 _hotspot9.setPosition(Common::Point(966, 120));
1158 g_globals->_sceneItems.push_back(&_hotspot9);
1159
1160 _hotspot10.postInit();
1161 _hotspot10.setVisage(5363);
1162 _hotspot10.setPosition(Common::Point(999, 68));
1163 _hotspot10.setStrip(2);
1164
1165 _hotspot6.postInit();
1166 _hotspot6.setVisage(5362);
1167 _hotspot6.setPosition(Common::Point(1017, 34));
1168 _hotspot6._strip = 4;
1169 _hotspot6._frame = _hotspot6.getFrameCount();
1170 g_globals->_sceneItems.push_back(&_hotspot6);
1171 }
1172
1173 _hotspot16._sceneRegionId = 15;
1174 g_globals->_sceneItems.push_back(&_hotspot16);
1175
1176 if (!g_globals->getFlag(62)) {
1177 _hotspot2.postInit();
1178 _hotspot2.setVisage(5110);
1179 _hotspot2.animate(ANIM_MODE_1, NULL);
1180 _hotspot2._moveDiff.x = 4;
1181 g_globals->_sceneItems.push_back(&_hotspot2);
1182
1183 _hotspot3.postInit();
1184 _hotspot3.setVisage(5110);
1185 _hotspot3.animate(ANIM_MODE_1, NULL);
1186 _hotspot3._moveDiff.x = 4;
1187 g_globals->_sceneItems.push_back(&_hotspot3);
1188
1189 if (g_globals->getFlag(61)) {
1190 _hotspot2.setPosition(Common::Point(483, 189));
1191 _hotspot3.setPosition(Common::Point(811, 182));
1192 } else {
1193 _hotspot2.setPosition(Common::Point(610, 170));
1194 _hotspot3.setPosition(Common::Point(600, 180));
1195 }
1196 }
1197
1198 if (g_globals->getFlag(60) && (RING_INVENTORY._stasisBox._sceneNumber == 1) &&
1199 g_globals->getFlag(107) && g_globals->getFlag(67)) {
1200 _hotspot8.postInit();
1201 _hotspot8.setVisage(2806);
1202 _hotspot8.setPosition(Common::Point(557, 178));
1203 _hotspot8.animate(ANIM_MODE_1, NULL);
1204 _hotspot8.setObjectWrapper(new SceneObjectWrapper());
1205
1206 g_globals->clearFlag(59);
1207 }
1208
1209 switch (g_globals->_sceneManager._previousScene) {
1210 case 5000:
1211 default:
1212 g_globals->_player.setPosition(Common::Point(1184, 160));
1213 setAction(&_action1);
1214 break;
1215 case 5200:
1216 if (g_globals->_stripNum == 5200) {
1217 g_globals->_player.setVisage(5101);
1218 g_globals->_player.fixPriority(200);
1219 g_globals->_player.setStrip(5);
1220 g_globals->_player.setFrame(1);
1221 g_globals->_player.setPosition(Common::Point(513, 199));
1222
1223 _sceneMode = 5108;
1224 setAction(&_sequenceManager, this, 5108, &g_globals->_player, NULL);
1225 } else {
1226 g_globals->_player.setPosition(Common::Point(20, 175));
1227
1228 _hotspot13.postInit();
1229 _hotspot13.setVisage(5110);
1230 _hotspot13.setPosition(Common::Point(578, 192));
1231 _hotspot13._strip = 2;
1232
1233 _hotspot11.postInit();
1234 _hotspot11.setVisage(5110);
1235 _hotspot11.setPosition(Common::Point(5, 162));
1236 _hotspot11.setStrip2(1);
1237 _hotspot11._moveDiff = Common::Point(4, 2);
1238 _hotspot11.animate(ANIM_MODE_1, NULL);
1239
1240 ObjectMover2 *mover = new ObjectMover2();
1241 _hotspot11.addMover(mover, 15, 20, &g_globals->_player);
1242
1243 _hotspot12.postInit();
1244 _hotspot12.setVisage(5110);
1245 _hotspot12.setPosition(Common::Point(15, 164));
1246 _hotspot12.setStrip2(1);
1247 _hotspot12._moveDiff = Common::Point(4, 2);
1248 _hotspot12.animate(ANIM_MODE_1, NULL);
1249
1250 ObjectMover2 *mover2 = new ObjectMover2();
1251 _hotspot12.addMover(mover2, 25, 50, &g_globals->_player);
1252
1253 _hotspot17.setPosition(Common::Point(554, 182));
1254 g_globals->_player.disableControl();
1255
1256 _sceneMode = 5105;
1257 setAction(&_sequenceManager, this, 5105, &g_globals->_player, NULL);
1258 }
1259 break;
1260 case 5300:
1261 switch (g_globals->_stripNum) {
1262 case 5300:
1263 _sceneMode = 5111;
1264
1265 g_globals->_player.setVisage(5101);
1266 g_globals->_player.setStrip(6);
1267 g_globals->_player.fixPriority(170);
1268 g_globals->_player.setPosition(Common::Point(1168, 110));
1269
1270 setAction(&_sequenceManager, this, 5111, &g_globals->_player, NULL);
1271 _hotspot8.setPosition(Common::Point(1107, 178));
1272 break;
1273 case 5302:
1274 g_globals->_player.setPosition(Common::Point(512, 190));
1275
1276 if (g_globals->_sceneObjects->contains(&_hotspot8))
1277 setAction(&_action2);
1278 else
1279 g_globals->_player.enableControl();
1280 break;
1281 case 5303:
1282 _hotspot8.setVisage(5102);
1283 _hotspot8.setPosition(Common::Point(533, 172));
1284 g_globals->_player.setPosition(Common::Point(512, 190));
1285 setAction(&_action2);
1286 break;
1287 default:
1288 break;
1289 }
1290
1291 if (g_globals->getFlag(108)) {
1292 _hotspot6.postInit();
1293 _hotspot6.setVisage(5362);
1294 _hotspot6.setPosition(Common::Point(542, 19));
1295 _hotspot6.setStrip(6);
1296 _hotspot6.setFrame(1);
1297 g_globals->_sceneItems.push_back(&_hotspot6);
1298 } else if (RING_INVENTORY._vial._sceneNumber != 5100) {
1299 _hotspot6.postInit();
1300 _hotspot6.setVisage(5362);
1301 _hotspot6.setPosition(Common::Point(1152, 70));
1302 _hotspot6.fixPriority(170);
1303 _hotspot6.setStrip(6);
1304 _hotspot6.setFrame(1);
1305 g_globals->_sceneItems.push_back(&_hotspot6);
1306 }
1307 break;
1308 }
1309
1310 _hotspot18.setBounds(Rect(0, 0, 1280, 200));
1311 g_globals->_sceneItems.push_back(&_hotspot18);
1312
1313 _hotspot15.postInit();
1314 _hotspot15.setVisage(5140);
1315 _hotspot15.setStrip(3);
1316 _hotspot15.setPosition(Common::Point(977, 173));
1317 _hotspot15.fixPriority(1);
1318
1319 g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position);
1320 loadScene(5100);
1321 g_globals->_soundHandler.play(205);
1322 }
1323
signal()1324 void Scene5100::signal() {
1325 switch (_sceneMode) {
1326 case 5101:
1327 case 5112:
1328 g_globals->setFlag(67);
1329 g_globals->_sceneManager.changeScene(5300);
1330 break;
1331 case 5102:
1332 case 5114:
1333 g_globals->_player.enableControl();
1334 break;
1335 case 5103:
1336 if (g_globals->getFlag(61)) {
1337 SceneItem::display2(5100, 46);
1338 g_globals->_sceneManager.changeScene(5300);
1339 } else {
1340 SceneItem::display2(5100, 45);
1341 g_globals->_sceneManager.changeScene(5200);
1342 }
1343 break;
1344 case 5105:
1345 g_globals->_sceneManager.changeScene(5300);
1346 break;
1347 case 5106:
1348 g_globals->_stripNum = 5111;
1349 g_globals->_sceneManager.changeScene(5200);
1350 break;
1351 case 5108:
1352 if (!g_globals->getFlag(60))
1353 g_globals->_player.enableControl();
1354 else if (RING_INVENTORY._stasisBox._sceneNumber == 1)
1355 setAction(&_action2);
1356 else
1357 setAction(&_action5);
1358 break;
1359 case 5110:
1360 SceneItem::display2(5100, 30);
1361 g_globals->_player._angle = 325;
1362 g_globals->_player.enableControl();
1363 break;
1364 case 5111:
1365 g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
1366 g_globals->_player.setVisage(0);
1367 g_globals->_player.setStrip(6);
1368 g_globals->_player.fixPriority(-1);
1369 g_globals->_player.animate(ANIM_MODE_1, NULL);
1370
1371 if ((RING_INVENTORY._vial._sceneNumber != 5100) && !g_globals->getFlag(108)) {
1372 g_globals->setFlag(108);
1373 _sceneMode = 5130;
1374 g_globals->_player.disableControl();
1375
1376 _speakerBatText.setTextPos(Common::Point(g_globals->_sceneManager._scene->_sceneBounds.left + 20, 30));
1377 setAction(&_sequenceManager, this, 5130, &g_globals->_player, &_hotspot6, NULL);
1378 } else if (g_globals->_sceneObjects->contains(&_hotspot8)) {
1379 setAction(&_action2);
1380 } else {
1381 g_globals->_player.enableControl();
1382 }
1383 break;
1384 case 5116:
1385 g_globals->setFlag(105);
1386 RING_INVENTORY._bone._sceneNumber = 0;
1387
1388 g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
1389 g_globals->_player.setVisage(0);
1390 g_globals->_player.setStrip(6);
1391 g_globals->_player.fixPriority(-1);
1392 g_globals->_player.animate(ANIM_MODE_1, NULL);
1393 // fall through
1394 case 5117:
1395 g_globals->_player.enableControl();
1396 break;
1397 case 5130:
1398 _hotspot6.setVisage(5362);
1399 _hotspot6.setPosition(Common::Point(542, 25));
1400 _hotspot6.setStrip(6);
1401 _hotspot6.setFrame(1);
1402 g_globals->_player.enableControl();
1403 break;
1404 case 5150:
1405 g_globals->clearFlag(60);
1406 g_globals->_sceneManager.changeScene(5300);
1407 break;
1408 default:
1409 break;
1410 }
1411 }
1412
dispatch()1413 void Scene5100::dispatch() {
1414 // Flesheater trap
1415 if (_hotspot15._bounds.contains(g_globals->_player._position) && !g_globals->_player._visage) {
1416 g_globals->_player.disableControl();
1417 g_globals->_player.addMover(NULL);
1418
1419 _soundHandler.play(207);
1420 _sceneMode = 5103;
1421 setAction(&_sequenceManager, this, (g_globals->_player._position.x >= 966) ? 5104 : 5103,
1422 &g_globals->_player, &_hotspot15, NULL);
1423 }
1424
1425 if (g_globals->getFlag(61) && !g_globals->getFlag(62) &&
1426 ((g_globals->_player._position.x - _hotspot2._position.x) < 160) &&
1427 (g_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) {
1428 setAction(NULL);
1429 _sceneMode = 5150;
1430 _soundHandler.play(208);
1431
1432 if (RING_INVENTORY._vial._sceneNumber == 5100) {
1433 g_globals->_player.addMover(NULL);
1434 g_globals->_player.disableControl();
1435 SceneItem::display2(5100, 39);
1436 }
1437
1438 _hotspot2.setStrip2(1);
1439 _hotspot3.setStrip2(2);
1440
1441 ObjectMover3 *mover1 = new ObjectMover3();
1442 _hotspot2.addMover(mover1, &g_globals->_player, 20, this);
1443 ObjectMover3 *mover2 = new ObjectMover3();
1444 _hotspot3.addMover(mover2, &g_globals->_player, 20, this);
1445 }
1446
1447 if (!_action) {
1448 if (((g_globals->_player._position.x - _hotspot2._position.x) < 130) && !g_globals->getFlag(61)) {
1449 g_globals->_player._canWalk = false;
1450 g_globals->_player.addMover(NULL);
1451
1452 Common::Point pt(20, 25);
1453 PlayerMover2 *mover = new PlayerMover2();
1454 _hotspot3.addMover(mover, &pt, &g_globals->_player);
1455 setAction(&_action4);
1456 }
1457
1458 if ((g_globals->_sceneManager._scene->_backgroundBounds.right - 85) <= g_globals->_player._position.x)
1459 g_globals->_sceneManager.changeScene(5000);
1460
1461 if (g_globals->_player.getRegionIndex() == 8) {
1462 _sceneMode = 5114;
1463 setAction(&_sequenceManager, this, 5115, &g_globals->_player, NULL);
1464 }
1465 }
1466
1467 Scene::dispatch();
1468 }
1469
1470 /*--------------------------------------------------------------------------
1471 * Scene 5200 - Caverns - Throne Room
1472 *
1473 *--------------------------------------------------------------------------*/
1474
signal()1475 void Scene5200::Action1::signal() {
1476 Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene;
1477
1478 switch (_actionIndex++) {
1479 case 0:
1480 setDelay(g_globals->_randomSource.getRandomNumber(59) + 120);
1481 break;
1482 case 1:
1483 scene->_hotspot3.animate(ANIM_MODE_8, 1, this);
1484 _actionIndex = 0;
1485 break;
1486 default:
1487 break;
1488 }
1489 }
1490
signal()1491 void Scene5200::Action2::signal() {
1492 // Quinn obtains the stasis box from the flesheater throne room
1493 Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene;
1494
1495 switch (_actionIndex++) {
1496 case 0:
1497 g_globals->_player.disableControl();
1498 ADD_PLAYER_MOVER(92, 52);
1499 break;
1500 case 1:
1501 g_globals->_player.setVisage(5202);
1502 g_globals->_player._strip = 4;
1503 g_globals->_player._frame = 1;
1504 g_globals->_player.animate(ANIM_MODE_4, 3, 1, this);
1505 break;
1506 case 2:
1507 scene->_soundHandler.stop();
1508 scene->_hotspot14.remove();
1509
1510 RING_INVENTORY._stasisBox._sceneNumber = 1;
1511 g_globals->_player.animate(ANIM_MODE_5, this);
1512 break;
1513 case 3:
1514 g_globals->_player.setVisage(0);
1515 g_globals->_player._strip = 3;
1516 g_globals->_player.animate(ANIM_MODE_1, NULL);
1517
1518 scene->_hotspot8.animate(ANIM_MODE_2, NULL);
1519 ADD_MOVER(scene->_hotspot8, 141, 77);
1520 break;
1521 case 4:
1522 scene->_soundHandler.play(303);
1523
1524 scene->_hotspot8._strip = 2;
1525 scene->_hotspot8._frame = 1;
1526 scene->_hotspot8.animate(ANIM_MODE_5, this);
1527 break;
1528 case 5:
1529 g_globals->_player.enableControl();
1530 remove();
1531 break;
1532 default:
1533 break;
1534 }
1535 }
1536
signal()1537 void Scene5200::Action3::signal() {
1538 switch (_actionIndex++) {
1539 case 0:
1540 g_globals->_player.disableControl();
1541 setDelay(5);
1542 break;
1543 case 1:
1544 ADD_PLAYER_MOVER(285, 62);
1545 break;
1546 case 2:
1547 g_globals->_player.enableControl();
1548 remove();
1549 break;
1550 default:
1551 break;
1552 }
1553 }
1554
signal()1555 void Scene5200::Action4::signal() {
1556 Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene;
1557
1558 switch (_actionIndex++) {
1559 case 0:
1560 setDelay(120);
1561 break;
1562 case 1:
1563 g_globals->_soundHandler.play(209);
1564 scene->_stripManager.start(5202, this, scene);
1565 break;
1566 case 2:
1567 scene->_hotspot6.animate(ANIM_MODE_5, this);
1568 break;
1569 case 3:
1570 setDelay(10);
1571 break;
1572 case 4:
1573 scene->_stripManager.start(5204, this, scene);
1574 break;
1575 case 5:
1576 setDelay(60);
1577 break;
1578 case 6:
1579 g_globals->_sceneManager.changeScene(5100);
1580 break;
1581 default:
1582 break;
1583 }
1584 }
1585
1586 /*--------------------------------------------------------------------------*/
1587
doAction(int action)1588 void Scene5200::Hotspot9::doAction(int action) {
1589 switch (action) {
1590 case CURSOR_LOOK:
1591 if (!_state) {
1592 ++_state;
1593 SceneItem::display2(5200, 5);
1594 } else {
1595 SceneItem::display2(5200, 6);
1596 }
1597 break;
1598 case CURSOR_USE:
1599 SceneItem::display2(5200, 14);
1600 break;
1601 default:
1602 SceneHotspot::doAction(action);
1603 break;
1604 }
1605 }
1606
doAction(int action)1607 void Scene5200::Hotspot10::doAction(int action) {
1608 switch (action) {
1609 case CURSOR_LOOK:
1610 if (!_state) {
1611 ++_state;
1612 SceneItem::display2(5200, 7);
1613 } else {
1614 SceneItem::display2(5200, 8);
1615 }
1616 break;
1617 default:
1618 SceneObject::doAction(action);
1619 break;
1620 }
1621 }
1622
doAction(int action)1623 void Scene5200::Hotspot14::doAction(int action) {
1624 Scene5200 *scene = (Scene5200 *)g_globals->_sceneManager._scene;
1625
1626 switch (action) {
1627 case CURSOR_LOOK:
1628 SceneItem::display2(5200, 4);
1629 break;
1630 case CURSOR_USE:
1631 scene->setAction(&scene->_action2);
1632 break;
1633 default:
1634 break;
1635 }
1636 }
1637
1638 /*--------------------------------------------------------------------------*/
1639
Scene5200()1640 Scene5200::Scene5200() :
1641 _hotspot11(0, CURSOR_LOOK, 5200, 0, CURSOR_USE, 5200, 13, LIST_END),
1642 _hotspot12(10, CURSOR_LOOK, 5200, 9, LIST_END),
1643 _hotspot13(8, CURSOR_LOOK, 5200, 0, CURSOR_USE, 5200, 13, LIST_END) {
1644 }
1645
1646
postInit(SceneObjectList * OwnerList)1647 void Scene5200::postInit(SceneObjectList *OwnerList) {
1648 Scene::postInit();
1649 setZoomPercents(0, 150, 199, 150);
1650
1651 _hotspot9._state = 0;
1652 _hotspot10._state = 0;
1653 _stripManager.addSpeaker(&_speakerQText);
1654 _stripManager.addSpeaker(&_speakerGameText);
1655 _stripManager.addSpeaker(&_speakerFLText);
1656 _stripManager.addSpeaker(&_speakerFLL);
1657 _stripManager.addSpeaker(&_speakerQL);
1658 _stripManager.setCallback(this);
1659
1660 _speakerFLText._textPos.x = 160;
1661 _speakerQText._textPos.x = 20;
1662
1663 if (RING_INVENTORY._stasisBox._sceneNumber == 5200) {
1664 _soundHandler.play(216);
1665 _soundHandler.holdAt(true);
1666
1667 _hotspot14.postInit();
1668 _hotspot14.setVisage(5202);
1669 _hotspot14._strip = 3;
1670 _hotspot14.setPosition(Common::Point(105, 52));
1671 _hotspot14.fixPriority(90);
1672
1673 _hotspot8.postInit();
1674 _hotspot8.setVisage(5202);
1675 _hotspot8._strip = 1;
1676 _hotspot8.setPosition(Common::Point(96, 53));
1677 _hotspot8.fixPriority(90);
1678 g_globals->_sceneItems.push_back(&_hotspot14);
1679 }
1680
1681 if (g_globals->_stripNum == 5111) {
1682 // Happens when the player enters the throne room via the secret passage,
1683 // after talking with the bat. No NPCs are around and the player can
1684 // obtain the stasis box.
1685 g_globals->_soundHandler.play(205);
1686 g_globals->_player.disableControl();
1687
1688 g_globals->_player.postInit();
1689 g_globals->_player.setVisage(0);
1690 g_globals->_player.changeZoom(75);
1691 g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
1692 g_globals->_player.animate(ANIM_MODE_1, NULL);
1693 g_globals->_player.setStrip(1);
1694 g_globals->_player.setFrame(3);
1695 g_globals->_player.setPosition(Common::Point(307, 62));
1696
1697 setAction(&_action3);
1698 } else {
1699 // Happens when the player is captured by the flesh eaters the first time.
1700 g_globals->_player.postInit();
1701 g_globals->_player.setVisage(2640);
1702 g_globals->_player._strip = 1;
1703 g_globals->_player._frame = 4;
1704 g_globals->_player.setPosition(Common::Point(105, 199));
1705
1706 _hotspot5.postInit();
1707 _hotspot5.setVisage(5210);
1708 _hotspot5._frame = 2;
1709 _hotspot5.setPosition(Common::Point(189, 167));
1710
1711 _hotspot6.postInit();
1712 _hotspot6.setVisage(5210);
1713 _hotspot6._frame = 1;
1714 _hotspot6._strip = 2;
1715 _hotspot6.setPosition(Common::Point(159, 137));
1716
1717 _hotspot7.postInit();
1718 _hotspot7.setVisage(5210);
1719 _hotspot7._frame = 1;
1720 _hotspot7._strip = 4;
1721 _hotspot7.fixPriority(168);
1722 _hotspot7.setPosition(Common::Point(186, 106));
1723
1724 _hotspot1.postInit();
1725 _hotspot1.setVisage(5212);
1726 _hotspot1._frame = 1;
1727 _hotspot1.setPosition(Common::Point(62, 132));
1728
1729 _hotspot2.postInit();
1730 _hotspot2.setVisage(5212);
1731 _hotspot2._strip = 3;
1732 _hotspot2.setPosition(Common::Point(148, 141));
1733 _hotspot2.fixPriority(90);
1734
1735 _hotspot3.postInit();
1736 _hotspot3.setVisage(5212);
1737 _hotspot3._strip = 2;
1738 _hotspot3.setPosition(Common::Point(62, 109));
1739 _hotspot3.fixPriority(138);
1740 _hotspot3.setAction(&_action1);
1741
1742 _hotspot4.postInit();
1743 _hotspot4.setVisage(5212);
1744 _hotspot4._strip = 4;
1745 _hotspot4.setPosition(Common::Point(146, 110));
1746 _hotspot4.fixPriority(90);
1747
1748 g_globals->_player.disableControl();
1749 g_globals->setFlag(61);
1750
1751 setAction(&_action4);
1752 }
1753
1754 _hotspot11.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
1755 _hotspot9._sceneRegionId = 11;
1756 _hotspot10._sceneRegionId = 9;
1757 _hotspot12._sceneRegionId = 10;
1758 _hotspot13._sceneRegionId = 8;
1759
1760 g_globals->_sceneItems.addItems(&_hotspot12, &_hotspot13, &_hotspot9, &_hotspot10, &_hotspot11, NULL);
1761 g_globals->_sceneManager._scene->_sceneBounds.center(g_globals->_player._position);
1762 loadScene(5200);
1763 }
1764
stripCallback(int v)1765 void Scene5200::stripCallback(int v) {
1766 switch (v) {
1767 case 1:
1768 _hotspot7.animate(ANIM_MODE_2, NULL);
1769 break;
1770 case 2:
1771 _hotspot7.animate(ANIM_MODE_NONE, NULL);
1772 break;
1773 default:
1774 break;
1775 }
1776 }
1777
dispatch()1778 void Scene5200::dispatch() {
1779 Scene::dispatch();
1780
1781 if (!_action && (g_globals->_player.getRegionIndex() == 12)) {
1782 g_globals->_stripNum = 5200;
1783 g_globals->_sceneManager.changeScene(5100);
1784 }
1785 }
1786
1787 /*--------------------------------------------------------------------------
1788 * Scene 5300 - Caverns - Pit
1789 *
1790 *--------------------------------------------------------------------------*/
1791
signal()1792 void Scene5300::Action1::signal() {
1793 // Seeker waking up
1794 Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
1795
1796 switch (_actionIndex++) {
1797 case 0:
1798 g_globals->_player.disableControl();
1799 setDelay(3);
1800 break;
1801 case 1:
1802 scene->_hotspot2._numFrames = 4;
1803 scene->_hotspot2.animate(ANIM_MODE_8, 1, NULL);
1804 setDelay(120);
1805 break;
1806 case 2:
1807 scene->_hotspot2.animate(ANIM_MODE_NONE, NULL);
1808
1809 g_globals->_player.animate(ANIM_MODE_1, NULL);
1810 g_globals->_player.setStrip2(-1);
1811 g_globals->_player.setObjectWrapper(new SceneObjectWrapper());
1812 ADD_MOVER(g_globals->_player, 85, 170);
1813 break;
1814 case 3:
1815 scene->_hotspot2.fixPriority(-1);
1816 g_globals->_player.checkAngle(&scene->_hotspot2);
1817 setAction(&scene->_sequenceManager, this, 5305, &scene->_hotspot2, NULL);
1818 break;
1819 case 4:
1820 scene->_stripManager.start(5316, this);
1821 break;
1822 case 5:
1823 if (!g_globals->getFlag(106) || !g_globals->getFlag(107) || (RING_INVENTORY._stasisBox._sceneNumber != 1)) {
1824 g_globals->_player.enableControl();
1825 remove();
1826 } else {
1827 g_globals->setFlag(60);
1828 scene->_hotspot2._numFrames = 10;
1829
1830 if (g_globals->getFlag(67)) {
1831 scene->_sceneMode = 5310;
1832 scene->setAction(&scene->_sequenceManager, scene, 5310, &g_globals->_player, &scene->_hotspot2, NULL);
1833 } else {
1834 scene->_sceneMode = 5347;
1835 scene->setAction(&scene->_sequenceManager, scene, 5347, NULL);
1836 }
1837 }
1838 break;
1839 default:
1840 break;
1841 }
1842 }
1843
signal()1844 void Scene5300::Action2::signal() {
1845 Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
1846
1847 switch (_actionIndex++) {
1848 case 0:
1849 g_globals->_player.disableControl();
1850 setDelay(60);
1851 break;
1852 case 1:
1853 g_globals->setFlag(60);
1854 scene->_stripManager.start(5328, this);
1855 break;
1856 case 2:
1857 if (RING_INVENTORY._stasisBox._sceneNumber == 1) {
1858 g_globals->_stripNum = 5303;
1859 setDelay(5);
1860 } else {
1861 g_globals->_stripNum = 5302;
1862 scene->_stripManager.start(5329, this);
1863 }
1864 break;
1865 case 3:
1866 g_globals->_sceneManager.changeScene(5100);
1867 remove();
1868 break;
1869 default:
1870 break;
1871 }
1872 }
1873
signal()1874 void Scene5300::Action3::signal() {
1875 Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
1876
1877 switch (_actionIndex++) {
1878 case 0:
1879 g_globals->_player.disableControl();
1880 setDelay(30);
1881 break;
1882 case 1:
1883 scene->_stripManager.start(g_globals->_stripNum, this);
1884 break;
1885 case 2:
1886 g_globals->_player.enableControl();
1887 remove();
1888 break;
1889 default:
1890 break;
1891 }
1892 }
1893
1894 /*--------------------------------------------------------------------------*/
1895
doAction(int action)1896 void Scene5300::Hotspot1::doAction(int action) {
1897 Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
1898
1899 switch (action) {
1900 case CURSOR_LOOK:
1901 SceneItem::display2(5300, 24);
1902 break;
1903 case CURSOR_TALK:
1904 g_globals->_stripNum = 5312;
1905 scene->setAction(&scene->_action3);
1906 break;
1907 default:
1908 SceneHotspot::doAction(action);
1909 break;
1910 }
1911 }
doAction(int action)1912 void Scene5300::Hotspot2::doAction(int action) {
1913 // Seeker
1914 Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
1915
1916 switch (action) {
1917 case CURSOR_LOOK:
1918 SceneItem::display2(5300, 23);
1919 break;
1920 case CURSOR_USE:
1921 if (!g_globals->getFlag(106)) {
1922 g_globals->_player.disableControl();
1923 scene->_sceneMode = 5302;
1924 scene->setAction(&scene->_sequenceManager, scene, 5302, &g_globals->_player, NULL);
1925 } else {
1926 SceneItem::display2(5300, g_globals->getFlag(107) ? 25 : 20);
1927 }
1928 break;
1929 case CURSOR_TALK:
1930 if (!g_globals->getFlag(106)) {
1931 g_globals->_player.disableControl();
1932 scene->_sceneMode = 5302;
1933 scene->setAction(&scene->_sequenceManager, scene, 5302, &g_globals->_player, NULL);
1934 } else if (!g_globals->getFlag(107)) {
1935 SceneItem::display2(5300, 11);
1936 } else {
1937 g_globals->_player.disableControl();
1938
1939 if (RING_INVENTORY._stasisBox._sceneNumber != 1) {
1940 scene->_sceneMode = 5316;
1941 scene->setAction(&scene->_sequenceManager, scene, 5316, NULL);
1942 } else {
1943 g_globals->setFlag(60);
1944 if (g_globals->getFlag(67)) {
1945 scene->_sceneMode = 5315;
1946 scene->setAction(&scene->_sequenceManager, scene, 5315, this, NULL);
1947 } else {
1948 scene->_sceneMode = 5347;
1949 scene->setAction(&scene->_sequenceManager, scene, 5347, NULL);
1950 }
1951 }
1952 }
1953 break;
1954 case OBJECT_SCANNER:
1955 SceneItem::display2(5300, g_globals->getFlag(107) ? 10 : 9);
1956 break;
1957 case OBJECT_MEDKIT:
1958 if (g_globals->getFlag(106))
1959 SceneItem::display2(5300, 7);
1960 else {
1961 g_globals->setFlag(106);
1962 g_globals->_player.disableControl();
1963
1964 scene->_sceneMode = 5303;
1965 scene->setAction(&scene->_sequenceManager, scene, 5303, &g_globals->_player, NULL);
1966 }
1967 break;
1968 case OBJECT_VIAL:
1969 if (g_globals->getFlag(107)) {
1970 SceneItem::display2(5300, 8);
1971 } else {
1972 RING_INVENTORY._vial._sceneNumber = 5300;
1973 g_globals->setFlag(107);
1974 g_globals->_player.disableControl();
1975 scene->_sceneMode = 5304;
1976
1977 scene->setAction(&scene->_sequenceManager, scene, 5304, &g_globals->_player, NULL);
1978 }
1979 break;
1980 default:
1981 SceneHotspot::doAction(action);
1982 break;
1983 }
1984 }
1985
doAction(int action)1986 void Scene5300::Hotspot5::doAction(int action) {
1987 // Sharp bone
1988 Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
1989
1990 switch (action) {
1991 case CURSOR_LOOK:
1992 SceneItem::display2(5300, 27);
1993 break;
1994 case CURSOR_USE:
1995 RING_INVENTORY._bone._sceneNumber = 1;
1996 g_globals->_player.disableControl();
1997
1998 scene->_sceneMode = 5309;
1999 scene->setAction(&scene->_sequenceManager, scene, 5309, &g_globals->_player, this, NULL);
2000 break;
2001 default:
2002 SceneHotspot::doAction(action);
2003 break;
2004 }
2005 }
2006
doAction(int action)2007 void Scene5300::Hotspot6::doAction(int action) {
2008 // Left Hole
2009 Scene5300 *scene = (Scene5300 *)g_globals->_sceneManager._scene;
2010
2011 switch (action) {
2012 case CURSOR_LOOK:
2013 if (!g_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber == 1))
2014 SceneItem::display2(5300, 4);
2015 else
2016 SceneItem::display2(5300, 26);
2017 break;
2018 case CURSOR_USE:
2019 if (!g_globals->getFlag(105) || (RING_INVENTORY._vial._sceneNumber != 5100)) {
2020 g_globals->_player.disableControl();
2021 scene->_sceneMode = 5301;
2022 scene->setAction(&scene->_sequenceManager, scene, 5301, &g_globals->_player, NULL);
2023 } else {
2024 g_globals->_player.disableControl();
2025 scene->_sceneMode = 5307;
2026 RING_INVENTORY._vial._sceneNumber = 1;
2027
2028 scene->setAction(&scene->_sequenceManager, scene, 5307, &scene->_hotspot1, &g_globals->_player,
2029 &scene->_hotspot4, NULL);
2030 }
2031 break;
2032 default:
2033 SceneHotspot::doAction(action);
2034 break;
2035 }
2036 }
2037
doAction(int action)2038 void Scene5300::Hotspot7::doAction(int action) {
2039 switch (action) {
2040 case CURSOR_LOOK:
2041 if (g_globals->getFlag(63))
2042 SceneItem::display2(5300, 2);
2043 else {
2044 g_globals->setFlag(63);
2045 SceneItem::display2(5300, 0);
2046 SceneItem::display2(5300, 1);
2047 }
2048 break;
2049 case CURSOR_USE:
2050 if (g_globals->getFlag(64))
2051 SceneItem::display2(5300, 15);
2052 else {
2053 g_globals->setFlag(64);
2054 SceneItem::display2(5300, 14);
2055 }
2056 break;
2057 default:
2058 SceneHotspot::doAction(action);
2059 break;
2060 }
2061 }
2062
doAction(int action)2063 void Scene5300::Hotspot8::doAction(int action) {
2064 switch (action) {
2065 case CURSOR_LOOK:
2066 SceneItem::display2(5300, g_globals->getFlag(65) ? 6 : 5);
2067 break;
2068 case CURSOR_USE:
2069 SceneItem::display2(5300, 18);
2070 break;
2071 default:
2072 SceneHotspot::doAction(action);
2073 break;
2074 }
2075 }
2076
2077 /*--------------------------------------------------------------------------*/
2078
Scene5300()2079 Scene5300::Scene5300() :
2080 _hotspot3(0, CURSOR_LOOK, 5300, 3, CURSOR_USE, 5300, 16, LIST_END) {
2081 }
2082
synchronize(Serializer & s)2083 void Scene5300::synchronize(Serializer &s) {
2084 Scene::synchronize(s);
2085 if (s.getVersion() < 11) {
2086 int useless = 0;
2087 s.syncAsSint16LE(useless);
2088 }
2089 }
2090
postInit(SceneObjectList * OwnerList)2091 void Scene5300::postInit(SceneObjectList *OwnerList) {
2092 Scene::postInit();
2093 loadScene(5300);
2094 setZoomPercents(0, 100, 199, 100);
2095
2096 _stripManager.addSpeaker(&_speakerQR);
2097 _stripManager.addSpeaker(&_speakerQL);
2098 _stripManager.addSpeaker(&_speakerBatR);
2099 _stripManager.addSpeaker(&_speakerSR);
2100 _stripManager.addSpeaker(&_speakerSL);
2101 _stripManager.addSpeaker(&_speakerQText);
2102 _stripManager.addSpeaker(&_speakerBatText);
2103 _stripManager.addSpeaker(&_speakerSText);
2104 _stripManager.addSpeaker(&_speakerGameText);
2105
2106 if (g_globals->getFlag(106) && g_globals->getFlag(107)) {
2107 _hotspot2.postInit();
2108 _hotspot2.setVisage(2806);
2109 _hotspot2.setObjectWrapper(new SceneObjectWrapper());
2110 _hotspot2.setPosition(Common::Point(63, 170));
2111 _hotspot2.animate(ANIM_MODE_1, NULL);
2112 } else {
2113 _hotspot2.postInit();
2114 _hotspot2.setVisage(5310);
2115 _hotspot2.setPosition(Common::Point(63, 170));
2116 _hotspot2.animate(ANIM_MODE_1, NULL);
2117 _hotspot2.fixPriority(98);
2118 }
2119
2120 _hotspot1.postInit();
2121 _hotspot1.setVisage(5362);
2122 _hotspot1.setStrip2(3);
2123 _hotspot1.setFrame2(5);
2124 _hotspot1.setPosition(Common::Point(76, 48));
2125
2126 _hotspot4.postInit();
2127 _hotspot4.setVisage(5316);
2128 _hotspot4.setStrip(2);
2129 _hotspot4.setPosition(Common::Point(89, 65));
2130 _hotspot4.animate(ANIM_MODE_2, NULL);
2131 _hotspot4.hide();
2132
2133 if (g_globals->getFlag(67)) {
2134 g_globals->_player.postInit();
2135 g_globals->_player.setVisage(5316);
2136 g_globals->_player.setPosition(Common::Point(191, 27));
2137 g_globals->_player.disableControl();
2138
2139 if (g_globals->getFlag(107) && g_globals->getFlag(106)) {
2140 _hotspot2.setVisage(2806);
2141 _hotspot2.postInit();
2142 _hotspot2.setObjectWrapper(new SceneObjectWrapper());
2143 _hotspot2.animate(ANIM_MODE_1, NULL);
2144
2145 setAction(&_action2);
2146 } else {
2147 g_globals->_player.setVisage(5315);
2148 g_globals->_player.setPosition(Common::Point(204, 86));
2149 g_globals->_player.animate(ANIM_MODE_2, NULL);
2150 g_globals->_player.setStrip2(1);
2151 g_globals->_player._moveDiff.y = 12;
2152
2153 _sceneMode = 5308;
2154 setAction(&_sequenceManager, this, 5308, &g_globals->_player, NULL);
2155 }
2156 } else {
2157 _hotspot3.postInit();
2158 _hotspot3.setVisage(5301);
2159 _hotspot3.setPosition(Common::Point(172, 32));
2160 _hotspot3.fixPriority(1);
2161 _hotspot3.animate(ANIM_MODE_NONE, NULL);
2162
2163 g_globals->_player.postInit();
2164 g_globals->_player.setVisage(5315);
2165 g_globals->_player.setPosition(Common::Point(204, 86));
2166 g_globals->_player.animate(ANIM_MODE_2, NULL);
2167 g_globals->_player.setStrip2(1);
2168 g_globals->_player._moveDiff.y = 12;
2169 g_globals->_player.disableControl();
2170
2171 _sceneMode = 5306;
2172 setAction(&_sequenceManager, this, 5306, &g_globals->_player, &_hotspot3, NULL);
2173 }
2174
2175 if (RING_INVENTORY._bone._sceneNumber == 5300) {
2176 _hotspot5.postInit();
2177 _hotspot5.setVisage(5301);
2178 _hotspot5.setStrip(2);
2179 _hotspot5.setPosition(Common::Point(190, 147));
2180 g_globals->_sceneItems.push_back(&_hotspot5);
2181 }
2182
2183 _hotspot6.setBounds(Rect(74, 51, 114, 69));
2184 _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
2185 _hotspot8._sceneRegionId = 8;
2186
2187 g_globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL);
2188 g_globals->_soundHandler.play(212);
2189 }
2190
signal()2191 void Scene5300::signal() {
2192 switch (_sceneMode) {
2193 case 5301:
2194 g_globals->_stripNum = 5300;
2195 g_globals->_sceneManager.changeScene(5100);
2196 break;
2197 case 5307:
2198 _soundHandler.fadeOut(NULL);
2199 // fall through
2200 case 5302:
2201 case 5308:
2202 case 5316:
2203 case 5347:
2204 g_globals->_player.setStrip2(-1);
2205 g_globals->_player.animate(ANIM_MODE_1, NULL);
2206 g_globals->_player.enableControl();
2207 break;
2208 case 5303:
2209 g_globals->_player.animate(ANIM_MODE_1, NULL);
2210 g_globals->_player.enableControl();
2211
2212 if (g_globals->getFlag(107))
2213 setAction(&_action1);
2214 else
2215 SceneItem::display2(5300, 28);
2216 break;
2217 case 5304:
2218 g_globals->_player.animate(ANIM_MODE_1, NULL);
2219 g_globals->_player.enableControl();
2220
2221 if (g_globals->getFlag(106))
2222 setAction(&_action1);
2223 else
2224 SceneItem::display2(5300, 28);
2225 break;
2226 case 5306:
2227 g_globals->clearFlag(67);
2228 g_globals->_player.setStrip2(-1);
2229
2230 if ((RING_INVENTORY._vial._sceneNumber == 1) || (RING_INVENTORY._vial._sceneNumber == 5300))
2231 _stripManager.start(5303, this);
2232 else
2233 _stripManager.start(5302, this);
2234 _sceneMode = 5302;
2235 break;
2236 case 5309:
2237 _hotspot5.remove();
2238 g_globals->_player.enableControl();
2239 break;
2240 case 5310:
2241 _hotspot2.fixPriority(41);
2242 _sceneMode = 5315;
2243
2244 setAction(&_sequenceManager, this, 5315, &_hotspot2, NULL);
2245 break;
2246 case 5315:
2247 g_globals->_stripNum = 5302;
2248 g_globals->_sceneManager.changeScene(5100);
2249 break;
2250 default:
2251 break;
2252 }
2253 }
2254
2255 } // End of namespace Ringworld
2256
2257 } // End of namespace TsAGE
2258