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