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