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