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/scenes.h"
24 #include "tsage/tsage.h"
25 #include "tsage/staticres.h"
26 #include "tsage/ringworld2/ringworld2_scenes3.h"
27
28 namespace TsAGE {
29
30 namespace Ringworld2 {
31
32 /*--------------------------------------------------------------------------
33 * Scene 3100 - ARM Base Hanager
34 *
35 *--------------------------------------------------------------------------*/
36
Scene3100()37 Scene3100::Scene3100() {
38 _fadeSound = false;
39 }
40
synchronize(Serializer & s)41 void Scene3100::synchronize(Serializer &s) {
42 SceneExt::synchronize(s);
43
44 s.syncAsSint16LE(_fadeSound);
45 }
46
startAction(CursorType action,Event & event)47 bool Scene3100::Guard::startAction(CursorType action, Event &event) {
48 if (action != CURSOR_TALK)
49 return SceneActor::startAction(action, event);
50
51 Scene3100 *scene = (Scene3100 *)R2_GLOBALS._sceneManager._scene;
52
53 R2_GLOBALS._player.disableControl();
54 scene->_sceneMode = 10;
55 R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
56 scene->_stripManager.start(606, scene);
57 return true;
58 }
59
postInit(SceneObjectList * OwnerList)60 void Scene3100::postInit(SceneObjectList *OwnerList) {
61 if (R2_GLOBALS._sceneManager._previousScene == 1000) {
62 if (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100) {
63 loadScene(3101);
64 R2_GLOBALS._uiElements._active = false;
65 } else {
66 loadScene(3100);
67 _sceneBounds = Rect(160, 0, 480, SCREEN_HEIGHT);
68 }
69 } else {
70 loadScene(3100);
71 }
72 // Original was doing it twice in a row. Skipped.
73
74 if (R2_GLOBALS._sceneManager._previousScene == 3255)
75 R2_GLOBALS._uiElements._active = false;
76
77 SceneExt::postInit();
78 _stripManager.addSpeaker(&_guardSpeaker);
79
80 if (R2_GLOBALS._sceneManager._previousScene == -1)
81 R2_GLOBALS._sceneManager._previousScene = 1000;
82
83 R2_GLOBALS._player.postInit();
84 R2_GLOBALS._player._characterIndex = R2_QUINN;
85 R2_GLOBALS._player.disableControl();
86
87 _hammerHead.postInit();
88 _hammerHead2.setDetails(Rect(212, 97, 320, 114), 3100, 3, -1, -1, 1, NULL);
89 _background.setDetails(Rect(0, 0, 480, 200), 3100, 0, -1, -1, 1, NULL);
90 _fadeSound = false;
91
92 if (R2_GLOBALS._sceneManager._previousScene == 1000) {
93 if (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100) {
94 _sceneMode = 3102;
95 _ghoul.postInit();
96 _technicians.postInit();
97 _deadBodies.postInit();
98 R2_GLOBALS._sound1.play(274);
99 _sound1.fadeSound(130);
100 setAction(&_sequenceManager, this, 3102, &_hammerHead, &R2_GLOBALS._player,
101 &_ghoul, &_technicians, &_deadBodies, NULL);
102 } else {
103 _guard.postInit();
104 _guard.setup(3110, 5, 1);
105 _guard.changeZoom(50);
106 _guard.setPosition(Common::Point(10, 149));
107 _guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);
108
109 _technicians.postInit();
110 _technicians.setup(3103, 1, 1);
111 _technicians.setPosition(Common::Point(278, 113));
112 _technicians.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
113 _technicians.animate(ANIM_MODE_2, NULL);
114
115 _fadeSound = true;
116 _hammerHead.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
117 R2_GLOBALS._sound1.play(243);
118 R2_GLOBALS._sound2.play(130);
119 _sceneMode = 3100;
120
121 setAction(&_sequenceManager, this, 3100, &R2_GLOBALS._player, &_hammerHead, NULL);
122 }
123 } else if (R2_GLOBALS._sceneManager._previousScene == 3255) {
124 _sceneMode = 3101;
125 _miranda.postInit();
126 _ghoul.postInit();
127 _fadeSound = true;
128
129 setAction(&_sequenceManager, this, 3101, &R2_GLOBALS._player, &_hammerHead,
130 &_miranda, &_ghoul, NULL);
131 } else {
132 _guard.postInit();
133 _guard.setup(3110, 5, 1);
134 _guard.changeZoom(50);
135 _guard.setPosition(Common::Point(10, 149));
136 _guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);
137
138 _technicians.postInit();
139 _technicians.setup(3103, 1, 1);
140 _technicians.setPosition(Common::Point(278, 113));
141 _technicians.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
142 _technicians.animate(ANIM_MODE_2, NULL);
143
144 _hammerHead.postInit();
145 _hammerHead.setup(3104, 4, 1);
146 _hammerHead.setPosition(Common::Point(143, 104));
147 _hammerHead.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
148
149 R2_GLOBALS._player.setup(3110, 3, 1);
150 R2_GLOBALS._player.changeZoom(50);
151 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
152 R2_GLOBALS._player.setPosition(Common::Point(160, 150));
153 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
154 R2_GLOBALS._player.enableControl(CURSOR_WALK);
155
156 R2_GLOBALS._sound1.play(243);
157 }
158
159 R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 3100;
160 }
161
remove()162 void Scene3100::remove() {
163 R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
164 R2_GLOBALS._sound1.fadeOut2(NULL);
165 R2_GLOBALS._sound2.fadeOut2(NULL);
166 _sound1.fadeOut2(NULL);
167 SceneExt::remove();
168 }
169
signal()170 void Scene3100::signal() {
171 switch (_sceneMode) {
172 case 10:
173 R2_GLOBALS._player.enableControl(CURSOR_TALK);
174 break;
175 case 3100:
176 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
177 R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
178 R2_GLOBALS._player.enableControl(CURSOR_WALK);
179 break;
180 case 3101:
181 R2_GLOBALS._sceneManager.changeScene(1000);
182 break;
183 case 3102:
184 R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1000;
185 R2_GLOBALS._sceneManager.changeScene(1000);
186 break;
187 default:
188 R2_GLOBALS._player.enableControl(CURSOR_WALK);
189 break;
190 }
191 }
192
dispatch()193 void Scene3100::dispatch() {
194 if ((_sceneMode == 3100) && _fadeSound && (R2_GLOBALS._player._position.y == 104)) {
195 _fadeSound = false;
196 R2_GLOBALS._sound2.fadeOut2(NULL);
197 }
198
199 if ((_sceneMode == 3101) && _fadeSound && (R2_GLOBALS._player._position.y < 104)) {
200 _fadeSound = false;
201 _sound1.fadeSound(130);
202 }
203
204 Scene::dispatch();
205 }
206
207 /*--------------------------------------------------------------------------
208 * Scene 3125 - Ghouls dormitory
209 *
210 *--------------------------------------------------------------------------*/
211
Scene3125()212 Scene3125::Scene3125() {
213 _soundPlayed = false;
214 }
215
synchronize(Serializer & s)216 void Scene3125::synchronize(Serializer &s) {
217 SceneExt::synchronize(s);
218
219 s.syncAsSint16LE(_soundPlayed);
220 }
221
startAction(CursorType action,Event & event)222 bool Scene3125::Background::startAction(CursorType action, Event &event) {
223 switch (action) {
224 case CURSOR_USE:
225 if (_useLineNum != -1)
226 SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
227 break;
228 case CURSOR_LOOK:
229 if (_lookLineNum != -1)
230 SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
231 break;
232 case CURSOR_TALK:
233 if (_talkLineNum != -1)
234 SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
235 break;
236 default: {
237 Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
238 return scene->display(action, event);
239 }
240 break;
241 }
242
243 return true;
244 }
245
startAction(CursorType action,Event & event)246 bool Scene3125::Table::startAction(CursorType action, Event &event) {
247 switch (action) {
248 case CURSOR_USE: {
249 Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
250
251 R2_GLOBALS._player.disableControl();
252 scene->_sceneMode = 3125;
253 scene->setAction(&scene->_sequenceManager, scene, 3125, &R2_GLOBALS._player, NULL);
254 }
255 break;
256 case CURSOR_LOOK:
257 SceneItem::display(3125, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
258 break;
259 case CURSOR_TALK:
260 SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
261 break;
262 default:
263 return SceneHotspot::startAction(action, event);
264 break;
265 }
266
267 return true;
268 }
269
startAction(CursorType action,Event & event)270 bool Scene3125::Computer::startAction(CursorType action, Event &event) {
271 switch (action) {
272 case CURSOR_USE: {
273 Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
274
275 R2_GLOBALS._player.disableControl();
276 scene->_ghoul4.postInit();
277 scene->_sceneMode = 3126;
278 scene->setAction(&scene->_sequenceManager, scene, 3126, &R2_GLOBALS._player,
279 &scene->_ghoul1, &scene->_ghoul2, &scene->_ghoul3, &scene->_door,
280 &scene->_ghoul4, NULL);
281 }
282 break;
283 case CURSOR_LOOK:
284 SceneItem::display(3125, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
285 break;
286 case CURSOR_TALK:
287 SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
288 break;
289 default:
290 return SceneHotspot::startAction(action, event);
291 break;
292 }
293
294 return true;
295 }
296
startAction(CursorType action,Event & event)297 bool Scene3125::Door::startAction(CursorType action, Event &event) {
298 if (action != CURSOR_USE)
299 return SceneActor::startAction(action, event);
300
301 Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;
302
303 R2_GLOBALS._player.disableControl();
304 scene->_sceneMode = 3176;
305 scene->setAction(&scene->_sequenceManager, scene, 3176, &R2_GLOBALS._player, &scene->_door, NULL);
306 return true;
307 }
308
postInit(SceneObjectList * OwnerList)309 void Scene3125::postInit(SceneObjectList *OwnerList) {
310 loadScene(3125);
311 SceneExt::postInit();
312 _soundPlayed = false;
313
314 _door.postInit();
315 _door.setup(3175, 1, 1);
316 _door.setPosition(Common::Point(35, 72));
317 _door.setDetails(3125, 12, 13, -1, 1, (SceneItem *)NULL);
318
319 _ghoul1.postInit();
320 _ghoul1.setup(3126, 4, 1);
321 _ghoul1.setPosition(Common::Point(71, 110));
322 _ghoul1._numFrames = 20;
323
324 _ghoul2.postInit();
325 _ghoul2.setup(3126, 1, 1);
326 _ghoul2.setPosition(Common::Point(215, 62));
327 _ghoul2.fixPriority(71);
328
329 _ghoul3.postInit();
330 _ghoul3.setup(3126, 1, 1);
331 _ghoul3.setPosition(Common::Point(171, 160));
332 _ghoul3.fixPriority(201);
333
334 _computer.setDetails(12, 3125, 9, 13, -1);
335 _table.setDetails(11, 3125, 15, 13, -1);
336 _background.setDetails(Rect(0, 0, 320, 200), 3125, 0, 1, 2, 1, NULL);
337
338 R2_GLOBALS._sound1.play(262);
339 R2_GLOBALS._player.postInit();
340
341 if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3250) {
342 _sceneMode = 3175;
343 setAction(&_sequenceManager, this, 3175, &R2_GLOBALS._player, &_door, NULL);
344 } else {
345 R2_GLOBALS._player.setup(30, 5, 1);
346 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
347 R2_GLOBALS._player.setPosition(Common::Point(89, 76));
348 R2_GLOBALS._player.enableControl();
349 }
350 R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3125;
351 }
352
signal()353 void Scene3125::signal() {
354 switch (_sceneMode) {
355 case 3125:
356 SceneItem::display(3125, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
357 _sceneMode = 3127;
358 setAction(&_sequenceManager, this, 3127, &R2_GLOBALS._player, NULL);
359 break;
360 case 3126:
361 R2_GLOBALS.setFlag(79);
362 // fall through
363 case 3176:
364 R2_GLOBALS._sceneManager.changeScene(3250);
365 break;
366 default:
367 R2_GLOBALS._player.enableControl();
368 break;
369 }
370 }
371
dispatch()372 void Scene3125::dispatch() {
373 if ((_sceneMode == 3126) && (_ghoul1._frame == 2) && !_soundPlayed) {
374 R2_GLOBALS._sound1.play(265);
375 _soundPlayed = true;
376 }
377 Scene::dispatch();
378 }
379
380 /*--------------------------------------------------------------------------
381 * Scene 3150 - Jail
382 *
383 *--------------------------------------------------------------------------*/
384
startAction(CursorType action,Event & event)385 bool Scene3150::LightFixture::startAction(CursorType action, Event &event) {
386 Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
387
388 switch (action) {
389 case CURSOR_USE:
390 if (R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150)
391 return SceneHotspot::startAction(action, event);
392
393 R2_GLOBALS._player.disableControl();
394 scene->_sceneMode = 3154;
395 scene->setAction(&scene->_sequenceManager, scene, 3154, &R2_GLOBALS._player, &scene->_bulbOrWire, NULL);
396 return true;
397 case R2_SUPERCONDUCTOR_WIRE:
398 if ((R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150) && (R2_GLOBALS.getFlag(75))) {
399 R2_GLOBALS._player.disableControl();
400 scene->_bulbOrWire.postInit();
401 scene->_bulbOrWire._effect = EFFECT_SHADED2;
402 scene->_bulbOrWire._shade = 5;
403 scene->_sceneMode = 3155;
404 scene->setAction(&scene->_sequenceManager, scene, 3155, &R2_GLOBALS._player, &scene->_bulbOrWire, NULL);
405 } else {
406 SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
407 }
408 return true;
409 default:
410 return SceneHotspot::startAction(action, event);
411 break;
412 }
413 }
414
startAction(CursorType action,Event & event)415 bool Scene3150::Toilet::startAction(CursorType action, Event &event) {
416 Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
417
418 switch (action) {
419 case R2_PILLOW:
420 R2_GLOBALS._player.disableControl();
421 scene->_water.postInit();
422 scene->_water._effect = EFFECT_SHADED2;
423 scene->_water._shade = 3;
424 R2_GLOBALS._player.disableControl();
425 scene->_sceneMode = 3158;
426 scene->setAction(&scene->_sequenceManager, scene, 3158, &R2_GLOBALS._player, &scene->_water, NULL);
427 return true;
428 case R2_FOOD_TRAY:
429 if ((R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) != 3150) &&
430 (R2_INVENTORY.getObjectScene(R2_SUPERCONDUCTOR_WIRE) == 3150)
431 && (R2_GLOBALS.getFlag(75))) {
432 scene->_foodTray.postInit();
433 scene->_foodTray._effect = EFFECT_SHADED2;
434 scene->_foodTray._shade = 3;
435 scene->_foodTray.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
436
437 R2_GLOBALS._player.disableControl();
438 scene->_sceneMode = 3159;
439 scene->setAction(&scene->_sequenceManager, scene, 3159, &R2_GLOBALS._player, &scene->_foodTray, NULL);
440 } else {
441 SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
442 }
443 return true;
444 default:
445 return SceneHotspot::startAction(action, event);
446 break;
447 }
448 }
449
startAction(CursorType action,Event & event)450 bool Scene3150::Water::startAction(CursorType action, Event &event) {
451 switch (action) {
452 case CURSOR_USE: {
453 if (R2_GLOBALS.getFlag(75))
454 return SceneActor::startAction(action, event);
455
456 Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
457
458 R2_GLOBALS._player.disableControl();
459 scene->_sceneMode = 3151;
460 scene->setAction(&scene->_sequenceManager, scene, 3151, &R2_GLOBALS._player, &scene->_water, NULL);
461 return true;
462 }
463 case R2_FOOD_TRAY:
464 return false;
465 default:
466 return SceneActor::startAction(action, event);
467 break;
468 }
469 }
470
startAction(CursorType action,Event & event)471 bool Scene3150::FoodTray::startAction(CursorType action, Event &event) {
472 if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(77)))
473 return SceneActor::startAction(action, event);
474
475 Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
476
477 R2_GLOBALS._player.disableControl();
478 scene->_sceneMode = 3157;
479 scene->setAction(&scene->_sequenceManager, scene, 3157, &R2_GLOBALS._player, &scene->_foodTray, NULL);
480 return true;
481 }
482
startAction(CursorType action,Event & event)483 bool Scene3150::ToiletFlush::startAction(CursorType action, Event &event) {
484 if (action == CURSOR_USE) {
485 Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
486
487 if (R2_GLOBALS.getFlag(75)) {
488 if (R2_GLOBALS.getFlag(77)) {
489 R2_GLOBALS._player.disableControl();
490 if (R2_GLOBALS.getFlag(76)) {
491 scene->_sceneMode = 3152;
492 scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
493 } else {
494 scene->_sceneMode = 3153;
495 scene->setAction(&scene->_sequenceManager, scene, 3153, &R2_GLOBALS._player, &scene->_water, NULL);
496 }
497 } else {
498 SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
499 }
500 } else {
501 R2_GLOBALS._player.disableControl();
502 scene->_sceneMode = 3152;
503 scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
504 }
505 return true;
506 } else {
507 return SceneActor::startAction(action, event);
508 }
509 }
510
startAction(CursorType action,Event & event)511 bool Scene3150::AirVent::startAction(CursorType action, Event &event) {
512 if ((action == R2_LASER_HACKSAW) && (!R2_GLOBALS.getFlag(80))) {
513 Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
514
515 R2_GLOBALS._player.disableControl();
516 scene->_sceneMode = 3160;
517 scene->setAction(&scene->_sequenceManager, scene, 3160, &R2_GLOBALS._player, &scene->_airVent, NULL);
518 return true;
519 }
520
521 return SceneActor::startAction(action, event);
522 }
523
changeScene()524 void Scene3150::DoorExit::changeScene() {
525 Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
526
527 _enabled = false;
528 g_globals->_events.setCursor(CURSOR_ARROW);
529 R2_GLOBALS._player.disableControl();
530 scene->_sceneMode = 11;
531
532 Common::Point pt(-20, 180);
533 NpcMover *mover = new NpcMover();
534 R2_GLOBALS._player.addMover(mover, &pt, scene);
535 }
536
changeScene()537 void Scene3150::VentExit::changeScene() {
538 Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
539
540 _enabled = false;
541 g_globals->_events.setCursor(CURSOR_ARROW);
542 R2_GLOBALS._player.disableControl();
543 scene->_sceneMode = 12;
544
545 scene->setAction(&scene->_sequenceManager, scene, 3163, &R2_GLOBALS._player, NULL);
546 }
547
postInit(SceneObjectList * OwnerList)548 void Scene3150::postInit(SceneObjectList *OwnerList) {
549 loadScene(3150);
550 if (R2_GLOBALS._sceneManager._previousScene == -1) {
551 R2_INVENTORY.setObjectScene(R2_ANCIENT_SCROLLS, 2000);
552 R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 3100;
553 R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 0;
554 R2_GLOBALS._player._characterIndex = R2_MIRANDA;
555 }
556 SceneExt::postInit();
557
558 if (R2_GLOBALS.getFlag(78)) {
559 _doorExit.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
560 _doorExit.setDest(Common::Point(70, 125));
561 }
562
563 if (R2_GLOBALS.getFlag(80)) {
564 _ventExit.setDetails(Rect(249, 36, 279, 60), EXITCURSOR_NE, 3150);
565 _ventExit.setDest(Common::Point(241, 106));
566 }
567
568 R2_GLOBALS._player.postInit();
569 R2_GLOBALS._player.disableControl();
570
571 _doorBars.postInit();
572 _doorBars.setPosition(Common::Point(64, 139));
573 if (R2_GLOBALS.getFlag(78)) {
574 _doorBars.setup(3151, 1, 5);
575 _doorBars.fixPriority(125);
576 } else {
577 _doorBars.setup(3151, 1, 1);
578 _doorBars.setDetails(3150, 8, -1, 9, 1, (SceneItem *)NULL);
579 }
580
581 if (R2_GLOBALS.getFlag(78)) {
582 _guard.postInit();
583 _guard.setup(3154, 1, 16);
584 _guard.setPosition(Common::Point(104, 129));
585 _guard._effect = EFFECT_SHADED2;
586 _guard._shade = 3;
587 _guard.setDetails(3150, 24, -1, -1, -1, (SceneItem *)NULL);
588 }
589
590 _airVent.postInit();
591 _airVent.setup(3154, 5, 1);
592 if (R2_GLOBALS.getFlag(80))
593 _airVent.setPosition(Common::Point(264, 108));
594 else
595 _airVent.setPosition(Common::Point(264, 58));
596 _airVent.fixPriority(50);
597 _airVent.setDetails(3150, 17, -1, 19, 1, (SceneItem *)NULL);
598
599 if (R2_INVENTORY.getObjectScene(R2_PILLOW) == 3150) {
600 _water.postInit();
601 if (R2_GLOBALS.getFlag(75)) {
602 if (R2_GLOBALS.getFlag(76)) {
603 R2_GLOBALS._walkRegions.disableRegion(1);
604 R2_GLOBALS._walkRegions.disableRegion(4);
605 R2_GLOBALS._walkRegions.disableRegion(5);
606 R2_GLOBALS._walkRegions.disableRegion(6);
607 _water.setup(3152, 4, 10);
608 _water.setDetails(3150, 14, -1, -1, 1, (SceneItem *)NULL);
609 } else {
610 _water.setup(3152, 7, 4);
611 _water.setDetails(3150, 13, -1, -1, 1, (SceneItem *)NULL);
612 }
613 _water.fixPriority(110);
614 _water.setPosition(Common::Point(83, 88));
615 _water._effect = EFFECT_SHADED2;
616 _water._shade = 3;
617 } else {
618 _water.setup(3152, 7, 3);
619 _water.setPosition(Common::Point(143, 70));
620 _water.setDetails(3150, 15, -1, -1, 1, (SceneItem *)NULL);
621 }
622 }
623
624 if (R2_INVENTORY.getObjectScene(R2_LIGHT_BULB) == 3150) {
625 _bulbOrWire.postInit();
626 _bulbOrWire.setup(3152, 7, 1);
627 _bulbOrWire.setPosition(Common::Point(73, 83));
628 }
629
630 if (R2_INVENTORY.getObjectScene(R2_SUPERCONDUCTOR_WIRE) == 3150) {
631 _bulbOrWire.postInit();
632 _bulbOrWire.setup(3152, 7, 2);
633 _bulbOrWire.setPosition(Common::Point(70, 55));
634 _bulbOrWire.fixPriority(111);
635 _bulbOrWire._effect = EFFECT_SHADED2;
636 _bulbOrWire._shade = 5;
637 }
638
639 if (R2_INVENTORY.getObjectScene(R2_FOOD_TRAY) == 3150) {
640 _foodTray.postInit();
641 if (R2_GLOBALS.getFlag(77)) {
642 _foodTray.setup(3152, 7, 8);
643 _foodTray.setPosition(Common::Point(82, 92));
644 _foodTray.fixPriority(111);
645 _foodTray._effect = EFFECT_SHADED2;
646 _foodTray._shade = 3;
647 } else {
648 _foodTray.setup(3152, 7, 7);
649 _foodTray.setPosition(Common::Point(155, 79));
650 }
651 _foodTray.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
652 }
653
654 _toiletFlush.postInit();
655 _toiletFlush.setup(3152, 7, 6);
656 _toiletFlush.setPosition(Common::Point(98, 73));
657 _toiletFlush.setDetails(3150, 43, -1, -1, 1, (SceneItem *)NULL);
658
659 _bed.setDetails(12, 3150, 10, -1, 12);
660 _lightFixture2.setDetails(Rect(186, 17, 210, 36), 3150, 6, -1, -1, 1, NULL);
661 _bars.setDetails(Rect(61, 21, 92, 41), 3150, 7, -1, -1, 1, NULL);
662 _lightFixture.setDetails(Rect(63, 48, 78, 58), 3150, 6, -1, -1, 1, NULL);
663 _toilet.setDetails(Rect(63, 81, 100, 95), 3150, 3, 4, -1, 1, NULL);
664 _background.setDetails(Rect(0, 0, 200, 320), 3150, 0, 1, 2, 1, NULL);
665
666 switch (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA]) {
667 case 0:
668 _sceneMode = 3150;
669 _guard.postInit();
670 _guard._effect = EFFECT_SHADED2;
671 _guard._shade = 5;
672 setAction(&_sequenceManager, this, 3150, &R2_GLOBALS._player, &_guard, &_doorBars, NULL);
673 break;
674 case 1200:
675 _sceneMode = 3162;
676 setAction(&_sequenceManager, this, 3162, &R2_GLOBALS._player, NULL);
677 break;
678 case 3275: {
679 _sceneMode = 10;
680 R2_GLOBALS._player.setup(30, 3, 1);
681 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
682 R2_GLOBALS._player.setPosition(Common::Point(-20, 180));
683 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
684
685 Common::Point pt(80, 125);
686 NpcMover *mover = new NpcMover();
687 R2_GLOBALS._player.addMover(mover, &pt, this);
688 break;
689 }
690 default:
691 if ((R2_GLOBALS._mirandaJailState == 1) && (R2_INVENTORY.getObjectScene(R2_ANCIENT_SCROLLS) == 2000)
692 && (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 3100)) {
693 // Moving story on to Miranda getting food delivered
694 ++R2_GLOBALS._mirandaJailState;
695 _sceneMode = 3156;
696 _guard.postInit();
697 _guard._effect = EFFECT_SHADED2;
698 _guard._shade = 3;
699
700 _doorBars.postInit();
701 _foodTray.postInit();
702 _foodTray._effect = EFFECT_SHADED2;
703 _foodTray._shade = 3;
704
705 setAction(&_sequenceManager, this, 3156, &R2_GLOBALS._player, &_guard, &_doorBars, &_foodTray, NULL);
706 } else {
707 if ((R2_GLOBALS._mirandaJailState != 1) && (R2_GLOBALS._mirandaJailState != 2))
708 ++R2_GLOBALS._mirandaJailState;
709
710 R2_GLOBALS._player.setup(30, 3, 1);
711 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
712 R2_GLOBALS._player.setPosition(Common::Point(155, 120));
713 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
714 R2_GLOBALS._player.enableControl();
715 }
716 }
717
718 R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150;
719 }
720
signal()721 void Scene3150::signal() {
722 switch (_sceneMode) {
723 case 11:
724 R2_GLOBALS._sceneManager.changeScene(3275);
725 break;
726 case 12:
727 R2_GLOBALS._sceneManager.changeScene(1200);
728 break;
729 case 3151:
730 _guard.remove();
731 R2_INVENTORY.setObjectScene(R2_PILLOW, 3);
732 R2_GLOBALS._player.enableControl();
733 break;
734 case 3153:
735 R2_GLOBALS.setFlag(76);
736 _water.setDetails(3150, 14, -1, -1, 3, (SceneItem *)NULL);
737 _guard.postInit();
738 _guard.setDetails(3150, 24, -1, -1, 2, (SceneItem *)NULL);
739 _sceneMode = 3161;
740 setAction(&_sequenceManager, this, 3161, &_guard, &_doorBars, NULL);
741 break;
742 case 3154:
743 _bulbOrWire.remove();
744 R2_INVENTORY.setObjectScene(R2_LIGHT_BULB, 3);
745 R2_GLOBALS._player.enableControl();
746 break;
747 case 3155:
748 R2_INVENTORY.setObjectScene(R2_SUPERCONDUCTOR_WIRE, 3150);
749 R2_GLOBALS._player.enableControl();
750 break;
751 case 3156:
752 _foodTray.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
753 R2_INVENTORY.setObjectScene(R2_FOOD_TRAY, 3150);
754 R2_GLOBALS._player.enableControl();
755 break;
756 case 3157:
757 _foodTray.remove();
758 R2_INVENTORY.setObjectScene(R2_FOOD_TRAY, 3);
759 R2_GLOBALS._player.enableControl();
760 break;
761 case 3158:
762 R2_GLOBALS.setFlag(75);
763 R2_INVENTORY.setObjectScene(R2_PILLOW, 3150);
764 _water.fixPriority(110);
765 _water.setDetails(3150, 13, -1, -1, 2, (SceneItem *)NULL);
766 R2_GLOBALS._player.enableControl();
767 break;
768 case 3159:
769 R2_GLOBALS.setFlag(77);
770 R2_INVENTORY.setObjectScene(R2_FOOD_TRAY, 3150);
771 R2_GLOBALS._player.enableControl();
772 break;
773 case 3160:
774 R2_INVENTORY.setObjectScene(R2_TOOLBOX, 3150);
775 R2_GLOBALS.setFlag(80);
776 R2_GLOBALS._sceneManager.changeScene(1200);
777 break;
778 case 3161:
779 R2_GLOBALS._sceneItems.remove(&_doorBars);
780 _doorExit.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
781 _doorExit.setDest(Common::Point(70, 125));
782 R2_GLOBALS._walkRegions.disableRegion(1);
783 R2_GLOBALS._walkRegions.disableRegion(4);
784 R2_GLOBALS._walkRegions.disableRegion(5);
785 R2_GLOBALS._walkRegions.disableRegion(6);
786 R2_GLOBALS.setFlag(78);
787 R2_GLOBALS._player.enableControl();
788 break;
789 default:
790 R2_GLOBALS._player.enableControl();
791 break;
792 }
793 }
794
dispatch()795 void Scene3150::dispatch() {
796 if (_foodTray._position.x == 155) {
797 _foodTray._effect = EFFECT_NONE;
798 _foodTray._shade = 0;
799 }
800
801 if (_guard._visage == 3154) {
802 _guard._effect = EFFECT_NONE;
803 _guard._shade = 0;
804 }
805
806 Scene::dispatch();
807 }
808
809 /*--------------------------------------------------------------------------
810 * Scene 3175 - Autopsy room
811 *
812 *--------------------------------------------------------------------------*/
813
startAction(CursorType action,Event & event)814 bool Scene3175::RoomItem::startAction(CursorType action, Event &event) {
815 switch (action) {
816 case CURSOR_USE:
817 if (_useLineNum != -1) {
818 SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
819 return true;
820 }
821 break;
822 case CURSOR_LOOK:
823 if (_lookLineNum != -1) {
824 SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
825 return true;
826 }
827 break;
828 case CURSOR_TALK:
829 if (_talkLineNum != -1) {
830 SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
831 return true;
832 }
833 break;
834 default:
835 break;
836 }
837
838 Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
839 return scene->display(action, event);
840 }
841
startAction(CursorType action,Event & event)842 bool Scene3175::Corpse::startAction(CursorType action, Event &event) {
843 switch (action) {
844 case CURSOR_USE:
845 if (_useLineNum != -1) {
846 SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
847 return true;
848 }
849 break;
850 case CURSOR_LOOK:
851 if (_lookLineNum != -1) {
852 SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
853 return true;
854 }
855 break;
856 case CURSOR_TALK:
857 if (_talkLineNum != -1) {
858 SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
859 return true;
860 }
861 break;
862 default:
863 break;
864 }
865
866 Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
867 return scene->display(action, event);
868 }
869
startAction(CursorType action,Event & event)870 bool Scene3175::Door::startAction(CursorType action, Event &event) {
871 switch (action) {
872 case CURSOR_USE: {
873 Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;
874
875 R2_GLOBALS._player.disableControl();
876 scene->_sceneMode = 3176;
877 scene->setAction(&scene->_sequenceManager, scene, 3176, &R2_GLOBALS._player, &scene->_door, NULL);
878 return true;
879 }
880 break;
881 case CURSOR_LOOK:
882 SceneItem::display(3175, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
883 return true;
884 break;
885 case CURSOR_TALK:
886 SceneItem::display(3175, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
887 return true;
888 break;
889 default:
890 return SceneActor::startAction(action, event);
891 break;
892 }
893 }
894
postInit(SceneObjectList * OwnerList)895 void Scene3175::postInit(SceneObjectList *OwnerList) {
896 loadScene(3175);
897 SceneExt::postInit();
898
899 _door.postInit();
900 _door.setup(3175, 1, 1);
901 _door.setPosition(Common::Point(35, 72));
902 _door.setDetails(3175, 9, 10, -1, 1, (SceneItem *)NULL);
903
904 _computer.postInit();
905 _computer.setup(3175, 2, 1);
906 _computer.setPosition(Common::Point(87, 148));
907
908 _corpse.postInit();
909 _corpse.setup(3175, 3, 1);
910 _corpse.setPosition(Common::Point(199, 117));
911 _corpse.setDetails(3175, 15, 16, 17, 1, (SceneItem *)NULL);
912
913 _table.setDetails(12, 3175, 3, 1, 5);
914 _autopsies.setDetails(11, 3175, 6, 7, 8);
915 _background.setDetails(Rect(0, 0, 320, 200), 3175, 0, 1, 2, 1, NULL);
916
917 R2_GLOBALS._player.postInit();
918
919 if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3250) {
920 R2_GLOBALS._player.setup(30, 5, 1);
921 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
922 R2_GLOBALS._player.setPosition(Common::Point(126, 77));
923 R2_GLOBALS._player.enableControl();
924 } else {
925 _sceneMode = 3175;
926 setAction(&_sequenceManager, this, 3175, &R2_GLOBALS._player, &_door, NULL);
927 }
928
929 R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3175;
930 }
931
signal()932 void Scene3175::signal() {
933 if (_sceneMode == 3176)
934 R2_GLOBALS._sceneManager.changeScene(3250);
935 else
936 R2_GLOBALS._player.enableControl();
937 }
938
939 /*--------------------------------------------------------------------------
940 * Scene 3200 - Cutscene : Guards - Discussion
941 *
942 *--------------------------------------------------------------------------*/
943
postInit(SceneObjectList * OwnerList)944 void Scene3200::postInit(SceneObjectList *OwnerList) {
945 loadScene(3200);
946 R2_GLOBALS._uiElements._active = false;
947 SceneExt::postInit();
948
949 _stripManager.addSpeaker(&_rockoSpeaker);
950 _stripManager.addSpeaker(&_jockoSpeaker);
951 _stripManager.addSpeaker(&_sockoSpeaker);
952
953 R2_GLOBALS._player.postInit();
954 R2_GLOBALS._player.hide();
955 R2_GLOBALS._player.disableControl();
956
957 _rocko.postInit();
958 _jocko.postInit();
959 _socko.postInit();
960
961 setAction(&_sequenceManager, this, 3200 + R2_GLOBALS._randomSource.getRandomNumber(1),
962 &_rocko, &_jocko, &_socko, NULL);
963 }
964
signal()965 void Scene3200::signal() {
966 R2_GLOBALS._sceneManager.changeScene(1200);
967 }
968
969 /*--------------------------------------------------------------------------
970 * Scene 3210 - Cutscene : Captain and Private - Discussion
971 *
972 *--------------------------------------------------------------------------*/
973
postInit(SceneObjectList * OwnerList)974 void Scene3210::postInit(SceneObjectList *OwnerList) {
975 loadScene(3210);
976 R2_GLOBALS._uiElements._active = false;
977 SceneExt::postInit();
978
979 _stripManager.addSpeaker(&_privateSpeaker);
980 _stripManager.addSpeaker(&_captainSpeaker);
981
982 R2_GLOBALS._player.postInit();
983 R2_GLOBALS._player.hide();
984 R2_GLOBALS._player.disableControl();
985
986 _captain.postInit();
987 _private.postInit();
988
989 setAction(&_sequenceManager, this, 3210 + R2_GLOBALS._randomSource.getRandomNumber(1),
990 &_captain, &_private, NULL);
991 }
992
signal()993 void Scene3210::signal() {
994 R2_GLOBALS._sceneManager.changeScene(1200);
995 }
996
997 /*--------------------------------------------------------------------------
998 * Scene 3220 - Cutscene : Guards in cargo zone
999 *
1000 *--------------------------------------------------------------------------*/
1001
postInit(SceneObjectList * OwnerList)1002 void Scene3220::postInit(SceneObjectList *OwnerList) {
1003 loadScene(3220);
1004 R2_GLOBALS._uiElements._active = false;
1005 SceneExt::postInit();
1006
1007 _stripManager.addSpeaker(&_rockoSpeaker);
1008 _stripManager.addSpeaker(&_jockoSpeaker);
1009
1010 R2_GLOBALS._player.postInit();
1011 R2_GLOBALS._player.hide();
1012 R2_GLOBALS._player.disableControl();
1013
1014 _rocko.postInit();
1015 _jocko.postInit();
1016
1017 setAction(&_sequenceManager, this, 3220 + R2_GLOBALS._randomSource.getRandomNumber(1),
1018 &_rocko, &_jocko, NULL);
1019 }
1020
signal()1021 void Scene3220::signal() {
1022 R2_GLOBALS._sceneManager.changeScene(1200);
1023 }
1024
1025 /*--------------------------------------------------------------------------
1026 * Scene 3230 - Cutscene : Guards on duty
1027 *
1028 *--------------------------------------------------------------------------*/
1029
postInit(SceneObjectList * OwnerList)1030 void Scene3230::postInit(SceneObjectList *OwnerList) {
1031 loadScene(3230);
1032 R2_GLOBALS._uiElements._active = false;
1033 SceneExt::postInit();
1034
1035 _stripManager.addSpeaker(&_rockoSpeaker);
1036 _stripManager.addSpeaker(&_jockoSpeaker);
1037
1038 R2_GLOBALS._player.postInit();
1039 R2_GLOBALS._player.hide();
1040 R2_GLOBALS._player.disableControl();
1041
1042 _rocko.postInit();
1043 _jocko.postInit();
1044 _ghoul.postInit();
1045
1046 setAction(&_sequenceManager, this, 3230 + R2_GLOBALS._randomSource.getRandomNumber(1),
1047 &_rocko, &_jocko, &_ghoul, NULL);
1048 }
1049
signal()1050 void Scene3230::signal() {
1051 R2_GLOBALS._sceneManager.changeScene(1200);
1052 }
1053
1054 /*--------------------------------------------------------------------------
1055 * Scene 3240 - Cutscene : Teal monolog
1056 *
1057 *--------------------------------------------------------------------------*/
1058
postInit(SceneObjectList * OwnerList)1059 void Scene3240::postInit(SceneObjectList *OwnerList) {
1060 loadScene(3240);
1061 R2_GLOBALS._uiElements._active = false;
1062 SceneExt::postInit();
1063
1064 _stripManager.addSpeaker(&_tealSpeaker);
1065 _stripManager.addSpeaker(&_webbsterSpeaker);
1066 _stripManager.addSpeaker(&_mirandaSpeaker);
1067
1068 R2_GLOBALS._player.postInit();
1069 R2_GLOBALS._player.hide();
1070 R2_GLOBALS._player.disableControl();
1071
1072 _teal.postInit();
1073 _webbster.postInit();
1074
1075 setAction(&_sequenceManager, this, 3240 + R2_GLOBALS._randomSource.getRandomNumber(1),
1076 &_teal, &_webbster, NULL);
1077 }
1078
signal()1079 void Scene3240::signal() {
1080 R2_GLOBALS._sceneManager.changeScene(1200);
1081 }
1082
1083 /*--------------------------------------------------------------------------
1084 * Scene 3245 - Cutscene : Discussions with Dr. Tomko
1085 *
1086 *--------------------------------------------------------------------------*/
1087
postInit(SceneObjectList * OwnerList)1088 void Scene3245::postInit(SceneObjectList *OwnerList) {
1089 loadScene(3245);
1090 R2_GLOBALS._uiElements._active = false;
1091 SceneExt::postInit();
1092
1093 _stripManager.addSpeaker(&_ralfSpeaker);
1094 _stripManager.addSpeaker(&_tomkoSpeaker);
1095
1096 R2_GLOBALS._player.postInit();
1097 R2_GLOBALS._player.hide();
1098 R2_GLOBALS._player.disableControl();
1099
1100 _ralf.postInit();
1101 _tomko.postInit();
1102
1103 if (R2_GLOBALS._scientistConvIndex < 4)
1104 ++R2_GLOBALS._scientistConvIndex;
1105
1106 if (R2_GLOBALS._scientistConvIndex >= 4) {
1107 SceneItem::display(1200, 7, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1108 signal();
1109 } else {
1110 setAction(&_sequenceManager, this, 3244 + R2_GLOBALS._scientistConvIndex,
1111 &_ralf, &_tomko, NULL);
1112 }
1113 }
1114
signal()1115 void Scene3245::signal() {
1116 R2_GLOBALS._sceneManager.changeScene(1200);
1117 }
1118
1119 /*--------------------------------------------------------------------------
1120 * Scene 3250 - Room with large stasis field negator
1121 *
1122 *--------------------------------------------------------------------------*/
1123
startAction(CursorType action,Event & event)1124 bool Scene3250::Item::startAction(CursorType action, Event &event) {
1125 switch (action) {
1126 case CURSOR_USE:
1127 if (_useLineNum != -1) {
1128 SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
1129 return true;
1130 }
1131 break;
1132 case CURSOR_LOOK:
1133 if (_lookLineNum != -1) {
1134 SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
1135 return true;
1136 }
1137 break;
1138 case CURSOR_TALK:
1139 if (_talkLineNum != -1) {
1140 SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
1141 return true;
1142 }
1143 break;
1144 default:
1145 break;
1146 }
1147
1148 Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
1149 return scene->display(action, event);
1150 }
1151
startAction(CursorType action,Event & event)1152 bool Scene3250::Door::startAction(CursorType action, Event &event) {
1153 if (action != CURSOR_USE)
1154 return SceneActor::startAction(action, event);
1155
1156 Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;
1157 R2_GLOBALS._player.disableControl();
1158
1159 switch(_position.x) {
1160 case 25:
1161 scene->_sceneMode = 3262;
1162 scene->setAction(&scene->_sequenceManager, scene, 3262, &R2_GLOBALS._player, &scene->_leftDoor, NULL);
1163 break;
1164 case 259:
1165 scene->_sceneMode = 3260;
1166 scene->setAction(&scene->_sequenceManager, scene, 3260, &R2_GLOBALS._player, &scene->_topDoor, NULL);
1167 break;
1168 case 302:
1169 scene->_sceneMode = 3261;
1170 scene->setAction(&scene->_sequenceManager, scene, 3261, &R2_GLOBALS._player, &scene->_rightDoor, NULL);
1171 break;
1172 default:
1173 break;
1174 }
1175 return true;
1176 }
1177
postInit(SceneObjectList * OwnerList)1178 void Scene3250::postInit(SceneObjectList *OwnerList) {
1179 loadScene(3250);
1180
1181 if (R2_GLOBALS._sceneManager._previousScene == -1) {
1182 R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1200;
1183 R2_GLOBALS._player._characterIndex = R2_MIRANDA;
1184 }
1185
1186 SceneExt::postInit();
1187 _leftDoor.postInit();
1188 _leftDoor.setup(3250, 6, 1);
1189 _leftDoor.setPosition(Common::Point(25, 148));
1190 _leftDoor.fixPriority(10);
1191 _leftDoor.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
1192
1193 _topDoor.postInit();
1194 _topDoor.setup(3250, 4, 1);
1195 _topDoor.setPosition(Common::Point(259, 126));
1196 _topDoor.fixPriority(10);
1197 _topDoor.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
1198
1199 _rightDoor.postInit();
1200 _rightDoor.setup(3250, 5, 1);
1201 _rightDoor.setPosition(Common::Point(302, 138));
1202 _rightDoor.fixPriority(10);
1203 _rightDoor.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);
1204
1205 _floodLights.setDetails(Rect(119, 111, 149, 168), 3250, 6, 7, 2, 1, NULL);
1206 _tnuctipunShip.setDetails(Rect(58, 85, 231, 138), 3250, 12, 7, 2, 1, NULL);
1207 _negator.setDetails(12, 3250, 3, 1, 2);
1208 _background.setDetails(Rect(0, 0, 320, 200), 3250, 0, 1, 2, 1, NULL);
1209
1210 R2_GLOBALS._player.postInit();
1211
1212 switch (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA]) {
1213 case 1200:
1214 _sceneMode = 3250;
1215 _grate.postInit();
1216 R2_GLOBALS._player._effect = EFFECT_NONE;
1217 setAction(&_sequenceManager, this, 3250, &R2_GLOBALS._player, &_grate, NULL);
1218 break;
1219 case 3125:
1220 if (R2_GLOBALS.getFlag(79)) {
1221 _sceneMode = 3254;
1222 _ghoul1.postInit();
1223 _ghoul1._effect = EFFECT_SHADED;
1224 _ghoul2.postInit();
1225 _ghoul2._effect = EFFECT_SHADED;
1226 _ghoul3.postInit();
1227 _ghoul3._effect = EFFECT_SHADED;
1228 setAction(&_sequenceManager, this, 3254, &R2_GLOBALS._player, &_rightDoor,
1229 &_ghoul1, &_ghoul2, &_ghoul3, &_leftDoor, NULL);
1230 } else {
1231 _sceneMode = 3252;
1232 setAction(&_sequenceManager, this, 3252, &R2_GLOBALS._player, &_rightDoor, NULL);
1233 }
1234 break;
1235 case 3175:
1236 _sceneMode = 3251;
1237 setAction(&_sequenceManager, this, 3251, &R2_GLOBALS._player, &_topDoor, NULL);
1238 break;
1239 case 3255:
1240 _sceneMode = 3253;
1241 setAction(&_sequenceManager, this, 3253, &R2_GLOBALS._player, &_leftDoor, NULL);
1242 break;
1243 default:
1244 R2_GLOBALS._player.setup(31, 3, 1);
1245 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1246 R2_GLOBALS._player.setPosition(Common::Point(185, 150));
1247 R2_GLOBALS._player.enableControl();
1248 break;
1249 }
1250
1251 R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3250;
1252 }
1253
signal()1254 void Scene3250::signal() {
1255 switch(_sceneMode) {
1256 case 3250:
1257 R2_GLOBALS._player._effect = EFFECT_SHADED;
1258 R2_GLOBALS._player.enableControl();
1259 break;
1260 case 3254:
1261 //No break on purpose
1262 case 3262:
1263 R2_GLOBALS._sceneManager.changeScene(3255);
1264 break;
1265 case 3260:
1266 R2_GLOBALS._sceneManager.changeScene(3175);
1267 break;
1268 case 3261:
1269 R2_GLOBALS._sceneManager.changeScene(3125);
1270 break;
1271 default:
1272 R2_GLOBALS._player.enableControl();
1273 break;
1274 }
1275 }
1276
dispatch()1277 void Scene3250::dispatch() {
1278 if ((R2_GLOBALS._player._visage == 3250) && (R2_GLOBALS._player._strip == 3) && (R2_GLOBALS._player._effect == EFFECT_NONE)) {
1279 R2_GLOBALS._player._effect = EFFECT_SHADED2;
1280 R2_GLOBALS._player._shade = 6;
1281 }
1282
1283 Scene::dispatch();
1284 }
1285
1286 /*--------------------------------------------------------------------------
1287 * Scene 3255 - Guard Post
1288 *
1289 *--------------------------------------------------------------------------*/
1290
postInit(SceneObjectList * OwnerList)1291 void Scene3255::postInit(SceneObjectList *OwnerList) {
1292 loadScene(3255);
1293 SceneExt::postInit();
1294
1295 _stripManager.addSpeaker(&_quinnSpeaker);
1296 _stripManager.addSpeaker(&_mirandaSpeaker);
1297
1298 if (R2_GLOBALS._sceneManager._previousScene == -1)
1299 R2_GLOBALS.setFlag(79);
1300
1301 R2_GLOBALS._player.postInit();
1302 R2_GLOBALS._player.disableControl();
1303
1304 if (R2_GLOBALS.getFlag(79)) {
1305 R2_GLOBALS._sound1.play(267);
1306 R2_GLOBALS._sound2.play(268);
1307 _sceneMode = 3257;
1308 _door.postInit();
1309 _quinn.postInit();
1310 _quinn._effect = EFFECT_SHADED;
1311 setAction(&_sequenceManager, this, 3257, &R2_GLOBALS._player, &_quinn, &_door, NULL);
1312 } else {
1313 _teal.postInit();
1314 _teal.setup(303, 1, 1);
1315 _teal.setPosition(Common::Point(208, 128));
1316 _guard.postInit();
1317 _guard.setup(3107, 3, 1);
1318 _guard.setPosition(Common::Point(230, 127));
1319 _sceneMode = 3255;
1320 setAction(&_sequenceManager, this, 3255, &R2_GLOBALS._player, NULL);
1321 }
1322 R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3255;
1323 }
1324
signal()1325 void Scene3255::signal() {
1326 switch (_sceneMode) {
1327 case 10:
1328 _sceneMode = 3258;
1329 _ghoul1.postInit();
1330 _ghoul2.postInit();
1331 _ghoul3.postInit();
1332 setAction(&_sequenceManager, this, 3258, &R2_GLOBALS._player, &_quinn,
1333 &_door, &_ghoul1, &_ghoul2, &_ghoul3, NULL);
1334 break;
1335 case 3256:
1336 R2_GLOBALS._sceneManager.changeScene(3250);
1337 break;
1338 case 3257:
1339 _sceneMode = 10;
1340 R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1341 _stripManager.start(607, this);
1342 break;
1343 case 3258:
1344 R2_GLOBALS._sceneManager.changeScene(3100);
1345 break;
1346 default:
1347 SceneItem::display(3255, 0, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
1348 _sceneMode = 3256;
1349 setAction(&_sequenceManager, this, 3256, &R2_GLOBALS._player, NULL);
1350 }
1351 }
1352
dispatch()1353 void Scene3255::dispatch() {
1354 if (R2_GLOBALS.getFlag(79)) {
1355 if (_ghoul1._position.y >= 95) {
1356 if (_ghoul1._position.y <= 110)
1357 _ghoul1._shade = 6 - (_ghoul1._position.y - 95) / 3;
1358 else
1359 _ghoul1._effect = EFFECT_SHADED;
1360 } else {
1361 _ghoul1._effect = EFFECT_SHADED2;
1362 _ghoul1._shade = 6;
1363 }
1364
1365 if (_ghoul2._position.y >= 95) {
1366 if (_ghoul2._position.y <= 110)
1367 _ghoul2._shade = 6 - (_ghoul2._position.y - 95) / 3;
1368 else
1369 _ghoul2._effect = EFFECT_SHADED;
1370 } else {
1371 _ghoul2._effect = EFFECT_SHADED2;
1372 _ghoul2._shade = 6;
1373 }
1374
1375 if (_ghoul3._position.y >= 95) {
1376 if (_ghoul3._position.y <= 110)
1377 _ghoul3._shade = 6 - (_ghoul3._position.y - 95) / 3;
1378 else
1379 _ghoul3._effect = EFFECT_SHADED;
1380 } else {
1381 _ghoul3._effect = EFFECT_SHADED2;
1382 _ghoul3._shade = 6;
1383 }
1384 }
1385
1386 if ((R2_GLOBALS._player._position.x > 250) && (R2_GLOBALS._player._shade == 1)) {
1387 R2_GLOBALS._player._effect = EFFECT_SHADED2;
1388 _quinn._effect = EFFECT_SHADED2;
1389 }
1390 Scene::dispatch();
1391 }
1392
1393 /*--------------------------------------------------------------------------
1394 * Scene 3260 - Computer room
1395 *
1396 *--------------------------------------------------------------------------*/
1397
startAction(CursorType action,Event & event)1398 bool Scene3260::Door::startAction(CursorType action, Event &event) {
1399 if (action != CURSOR_USE)
1400 return SceneActor::startAction(action, event);
1401
1402 Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
1403
1404 R2_GLOBALS._player.disableControl();
1405 scene->_sceneMode = 3271;
1406 scene->setAction(&scene->_sequenceManager, scene, 3271, &R2_GLOBALS._player, &scene->_door, NULL);
1407 return true;
1408 }
1409
startAction(CursorType action,Event & event)1410 bool Scene3260::Toolbox::startAction(CursorType action, Event &event) {
1411 if (action != CURSOR_USE)
1412 return SceneActor::startAction(action, event);
1413
1414 Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;
1415
1416 R2_GLOBALS._player.disableControl();
1417 scene->_sceneMode = 3272;
1418 scene->setAction(&scene->_sequenceManager, scene, 3272, &R2_GLOBALS._player, &scene->_toolbox, NULL);
1419 return true;
1420 }
1421
signal()1422 void Scene3260::Action1::signal() {
1423 SceneObjectExt *fmtObj = (SceneObjectExt *) _endHandler;
1424
1425 fmtObj->setFrame(R2_GLOBALS._randomSource.getRandomNumber(6));
1426 setDelay(120 + R2_GLOBALS._randomSource.getRandomNumber(179));
1427 }
1428
postInit(SceneObjectList * OwnerList)1429 void Scene3260::postInit(SceneObjectList *OwnerList) {
1430 loadScene(3260);
1431 R2_GLOBALS._player._characterIndex = R2_MIRANDA;
1432 SceneExt::postInit();
1433 R2_GLOBALS._sound1.play(285);
1434
1435 _door.postInit();
1436 _door.setup(3260, 6, 1);
1437 _door.setPosition(Common::Point(40, 106));
1438 _door.setDetails(3260, 18, 1, -1, 1, (SceneItem *)NULL);
1439
1440 if (R2_INVENTORY.getObjectScene(R2_TOOLBOX) == 3260) {
1441 _toolbox.postInit();
1442 _toolbox.setup(3260, 7, 1);
1443 _toolbox.setPosition(Common::Point(202, 66));
1444 _toolbox.setDetails(3260, 12, 1, -1, 1, (SceneItem *)NULL);
1445 }
1446
1447 _sceeen1.postInit();
1448 _sceeen1.setup(3260, 1, 1);
1449 _sceeen1.setPosition(Common::Point(93, 73));
1450 _sceeen1.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1451 _sceeen1.setAction(&_action1, &_sceeen1);
1452
1453 _screen2.postInit();
1454 _screen2.setup(3260, 2, 1);
1455 _screen2.setPosition(Common::Point(142, 63));
1456 _screen2.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1457 _screen2.setAction(&_action2, &_screen2);
1458
1459 _screen3.postInit();
1460 _screen3.setup(3260, 2, 1);
1461 _screen3.setPosition(Common::Point(166, 54));
1462 _screen3.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1463 _screen3.setAction(&_action3, &_screen3);
1464
1465 _screen4.postInit();
1466 _screen4.setup(3260, 2, 1);
1467 _screen4.setPosition(Common::Point(190, 46));
1468 _screen4.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1469 _screen4.setAction(&_action4, &_screen4);
1470
1471 _screen5.postInit();
1472 _screen5.setup(3260, 2, 1);
1473 _screen5.setPosition(Common::Point(142, 39));
1474 _screen5.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1475 _screen5.setAction(&_action5, &_screen5);
1476
1477 _screen6.postInit();
1478 _screen6.setup(3260, 2, 1);
1479 _screen6.setPosition(Common::Point(166, 30));
1480 _screen6.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1481 _screen6.setAction(&_action6, &_screen6);
1482
1483 _screen7.postInit();
1484 _screen7.setup(3260, 2, 1);
1485 _screen7.setPosition(Common::Point(190, 22));
1486 _screen7.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1487 _screen7.setAction(&_action7, &_screen7);
1488
1489 _screen8.postInit();
1490 _screen8.setup(3260, 2, 1);
1491 _screen8.setPosition(Common::Point(142, 14));
1492 _screen8.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1493 _screen8.setAction(&_action8, &_screen8);
1494
1495 _screen9.postInit();
1496 _screen9.setup(3260, 2, 1);
1497 _screen9.setPosition(Common::Point(166, 6));
1498 _screen9.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
1499 _screen9.setAction(&_action9, &_screen9);
1500
1501 _securityConsole.postInit();
1502 _securityConsole.setup(3260, 3, 1);
1503 _securityConsole.setPosition(Common::Point(265, 163));
1504 _securityConsole.fixPriority(180);
1505 _securityConsole._numFrames = 10;
1506 _securityConsole.setDetails(3260, 6, 1, 8, 1, (SceneItem *)NULL);
1507 _securityConsole.animate(ANIM_MODE_2, NULL);
1508
1509 _computerConsole.postInit();
1510 _computerConsole.setup(3260, 4, 1);
1511 _computerConsole.setPosition(Common::Point(127, 108));
1512 _computerConsole.fixPriority(120);
1513 _computerConsole.setAction(&_action11, &_computerConsole);
1514 _computerConsole._numFrames = 15;
1515 _computerConsole.setDetails(3260, 6, 1, 8, 1, (SceneItem *)NULL);
1516 _computerConsole.animate(ANIM_MODE_2, NULL);
1517
1518 _lightingConsole.postInit();
1519 _lightingConsole.setup(3260, 5, 1);
1520 _lightingConsole.setPosition(Common::Point(274, 65));
1521 _lightingConsole.setAction(&_action12, &_lightingConsole);
1522 _lightingConsole._numFrames = 5;
1523 _lightingConsole.setDetails(3260, 9, 1, 11, 1, (SceneItem *)NULL);
1524 _lightingConsole.animate(ANIM_MODE_2, NULL);
1525
1526 _background.setDetails(Rect(0, 0, 320, 200), 3260, 0, 1, 2, 1, NULL);
1527 R2_GLOBALS._player.postInit();
1528
1529 if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3275) {
1530 _sceneMode = 3270;
1531 setAction(&_sequenceManager, this, 3270, &R2_GLOBALS._player, &_door, NULL);
1532 } else {
1533 R2_GLOBALS._player.setup(30, 5, 1);
1534 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1535 R2_GLOBALS._player.setPosition(Common::Point(53, 113));
1536 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1537 R2_GLOBALS._player.enableControl();
1538 }
1539 R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3260;
1540 }
1541
remove()1542 void Scene3260::remove() {
1543 R2_GLOBALS._sound1.fadeOut2(NULL);
1544 SceneExt::remove();
1545 }
1546
signal()1547 void Scene3260::signal() {
1548 switch (_sceneMode) {
1549 case 3271:
1550 R2_GLOBALS._sceneManager.changeScene(3275);
1551 break;
1552 case 3272:
1553 _sceneMode = 3273;
1554 R2_GLOBALS._events.setCursor(CURSOR_WALK);
1555 SceneItem::display(3260, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
1556 R2_GLOBALS._player.disableControl();
1557 R2_INVENTORY.setObjectScene(R2_TOOLBOX, 3);
1558 R2_INVENTORY.setObjectScene(R2_LASER_HACKSAW, 3);
1559 setAction(&_sequenceManager, this, 3273, &R2_GLOBALS._player, &_toolbox, NULL);
1560 break;
1561 case 3273:
1562 _screen4.remove();
1563 R2_GLOBALS._player.enableControl();
1564 break;
1565 default:
1566 R2_GLOBALS._player.enableControl();
1567 break;
1568 }
1569 }
1570
1571 /*--------------------------------------------------------------------------
1572 * Scene 3275 - Hall
1573 *
1574 *--------------------------------------------------------------------------*/
1575
startAction(CursorType action,Event & event)1576 bool Scene3275::Door::startAction(CursorType action, Event &event) {
1577 if (action != CURSOR_USE)
1578 return SceneActor::startAction(action, event);
1579
1580 Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;
1581
1582 R2_GLOBALS._player.disableControl();
1583 scene->_sceneMode = 3275;
1584 scene->setAction(&scene->_sequenceManager, scene, 3275, &R2_GLOBALS._player, &scene->_door, NULL);
1585 return true;
1586 }
1587
changeScene()1588 void Scene3275::CellExit::changeScene() {
1589 Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;
1590
1591 scene->_sceneMode = 0;
1592 g_globals->_events.setCursor(CURSOR_ARROW);
1593 R2_GLOBALS._player.disableControl();
1594 scene->_sceneMode = 10;
1595 Common::Point pt(418, 118);
1596 NpcMover *mover = new NpcMover();
1597 R2_GLOBALS._player.addMover(mover, &pt, scene);
1598 }
1599
postInit(SceneObjectList * OwnerList)1600 void Scene3275::postInit(SceneObjectList *OwnerList) {
1601 loadScene(3275);
1602
1603 if (R2_GLOBALS._sceneManager._previousScene == -1)
1604 R2_GLOBALS._sceneManager._previousScene = 3260;
1605
1606 if (R2_GLOBALS._sceneManager._previousScene == 3150)
1607 _sceneBounds = Rect(160, 0, 480, 200);
1608
1609 SceneExt::postInit();
1610 _cellExit.setDetails(Rect(398, 60, 439, 118), SHADECURSOR_UP, 3150);
1611 _cellExit.setDest(Common::Point(418, 128));
1612
1613 _doorFrame.postInit();
1614 _doorFrame.setup(3275, 1, 7);
1615 _doorFrame.setPosition(Common::Point(419, 119));
1616
1617 _door.postInit();
1618 _door.setup(3275, 2, 1);
1619 _door.setPosition(Common::Point(56, 118));
1620 _door.setDetails(3275, 3, 4, -1, 1, (SceneItem *)NULL);
1621
1622 _emptyCell1.setDetails(Rect(153, 58, 200, 120), 3275, 6, 7, 8, 1, NULL);
1623 _emptyCell2.setDetails(Rect(275, 58, 331, 120), 3275, 6, 7, 8, 1, NULL);
1624 _securityBeams1.setDetails(Rect(0, 66, 22, 127), 3275, 9, 10, 11, 1, NULL);
1625 _securityBeams2.setDetails(Rect(457, 66, 480, 127), 3275, 9, 10, 11, 1, NULL);
1626 _background.setDetails(Rect(0, 0, 480, 200), 3275, 0, 1, 2, 1, NULL);
1627
1628 R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
1629 R2_GLOBALS._player.postInit();
1630 R2_GLOBALS._player.disableControl();
1631 if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3150) {
1632 _sceneMode = 11;
1633 R2_GLOBALS._player.setup(30, 3, 1);
1634 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1635 R2_GLOBALS._player.setPosition(Common::Point(418, 118));
1636 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1637 Common::Point pt(418, 128);
1638 NpcMover *mover = new NpcMover();
1639 R2_GLOBALS._player.addMover(mover, &pt, this);
1640 } else if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 3260) {
1641 _sceneMode = 3276;
1642 setAction(&_sequenceManager, this, 3276, &R2_GLOBALS._player, &_door, NULL);
1643 } else {
1644 R2_GLOBALS._player.setup(30, 3, 1);
1645 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
1646 R2_GLOBALS._player.setPosition(Common::Point(245, 135));
1647 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
1648 R2_GLOBALS._player.enableControl();
1649 }
1650 R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3275;
1651 }
1652
signal()1653 void Scene3275::signal() {
1654 switch (_sceneMode) {
1655 case 10:
1656 R2_GLOBALS._sceneManager.changeScene(3150);
1657 break;
1658 case 3275:
1659 R2_GLOBALS._sceneManager.changeScene(3260);
1660 break;
1661 default:
1662 R2_GLOBALS._player.enableControl();
1663 break;
1664 }
1665 }
1666
1667 /*--------------------------------------------------------------------------
1668 * Scene 3350 - Cutscene - Ship landing
1669 *
1670 *--------------------------------------------------------------------------*/
1671
postInit(SceneObjectList * OwnerList)1672 void Scene3350::postInit(SceneObjectList *OwnerList) {
1673 loadScene(3350);
1674 R2_GLOBALS._uiElements._active = false;
1675 SceneExt::postInit();
1676 R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
1677 R2_GLOBALS._sound2.play(310);
1678
1679 _rotation = R2_GLOBALS._scenePalette.addRotation(176, 203, 1);
1680 _rotation->setDelay(3);
1681
1682 R2_GLOBALS._player.postInit();
1683 R2_GLOBALS._player.hide();
1684 R2_GLOBALS._player.disableControl();
1685
1686 _miranda.postInit();
1687 _miranda.hide();
1688 _seeker.postInit();
1689 _seeker.hide();
1690 _webbster.postInit();
1691 _webbster.hide();
1692 _seatedPeople.postInit();
1693 _seatedPeople.hide();
1694 _shipFront.postInit();
1695 _shipFront.hide();
1696 _canopy.postInit();
1697 _canopy.hide();
1698 _ship.postInit();
1699 _ship.hide();
1700 _landedShip.postInit();
1701 _landedShip.hide();
1702 _shipShadow.postInit();
1703 _shipShadow.hide();
1704
1705 _sceneMode = 3350;
1706 setAction(&_sequenceManager, this, _sceneMode, &_ship, &_landedShip, &_shipShadow, NULL);
1707 }
1708
remove()1709 void Scene3350::remove() {
1710 R2_GLOBALS._sound2.fadeOut2(NULL);
1711 SceneExt::remove();
1712 }
1713
signal()1714 void Scene3350::signal() {
1715 switch (_sceneMode) {
1716 case 3350:
1717 _sceneMode = 3351;
1718 setAction(&_sequenceManager, this, 3351, &_seatedPeople, &_shipFront, &_canopy, NULL);
1719 break;
1720 case 3351:
1721 _sceneMode = 3352;
1722 setAction(&_sequenceManager, this, 3352, &_seatedPeople, &R2_GLOBALS._player,
1723 &_miranda, &_seeker, &_webbster, NULL);
1724 break;
1725 case 3352:
1726 R2_GLOBALS._sceneManager.changeScene(3395);
1727 break;
1728 default:
1729 R2_GLOBALS._player.enableControl();
1730 break;
1731 }
1732 }
1733
1734 /*--------------------------------------------------------------------------
1735 * Scene 3375 - Circular Walkway
1736 *
1737 *--------------------------------------------------------------------------*/
1738
synchronize(Serializer & s)1739 void Scene3375::synchronize(Serializer &s) {
1740 SceneExt::synchronize(s);
1741
1742 s.syncAsSint16LE(_newSceneMode);
1743 for (int i = 0; i < 4; ++i)
1744 s.syncAsSint16LE(_sceneAreas[i]);
1745 }
1746
enterArea(int sceneMode)1747 void Scene3375::enterArea(int sceneMode) {
1748 switch (sceneMode) {
1749 case 3379:
1750 R2_GLOBALS._player.setPosition(Common::Point(0, 155));
1751 _companion1.setPosition(Common::Point(-20, 163));
1752 _companion2.setPosition(Common::Point(-5, 150));
1753 _webbster.setPosition(Common::Point(-20, 152));
1754 break;
1755 case 3380:
1756 ++R2_GLOBALS._walkwaySceneNumber;
1757 if (R2_GLOBALS._walkwaySceneNumber >= 4)
1758 R2_GLOBALS._walkwaySceneNumber = 0;
1759
1760 loadScene(_sceneAreas[R2_GLOBALS._walkwaySceneNumber]);
1761
1762 R2_GLOBALS._uiElements.show();
1763 R2_GLOBALS._player.setStrip(4);
1764 R2_GLOBALS._player.setPosition(Common::Point(148, 230));
1765
1766 _companion1.setPosition(Common::Point(191, 274));
1767 _companion1._effect = EFFECT_SHADED;
1768 _companion2.setPosition(Common::Point(124, 255));
1769 _companion2._effect = EFFECT_SHADED;
1770 _webbster.setPosition(Common::Point(155, 245));
1771 _webbster._effect = EFFECT_SHADED;
1772 break;
1773 case 3381:
1774 --R2_GLOBALS._walkwaySceneNumber;
1775 if (R2_GLOBALS._walkwaySceneNumber < 0)
1776 R2_GLOBALS._walkwaySceneNumber = 3;
1777
1778 loadScene(_sceneAreas[R2_GLOBALS._walkwaySceneNumber]);
1779
1780 R2_GLOBALS._uiElements.show();
1781 R2_GLOBALS._player.setStrip(6);
1782 R2_GLOBALS._player.setPosition(Common::Point(201, 131));
1783
1784 _companion1.setPosition(Common::Point(231, 127));
1785 _companion1._effect = EFFECT_SHADED;
1786 _companion2.setPosition(Common::Point(231, 127));
1787 _companion2._effect = EFFECT_SHADED;
1788 _webbster.setPosition(Common::Point(231, 127));
1789 _webbster._effect = EFFECT_SHADED;
1790 break;
1791 default:
1792 R2_GLOBALS._player.setPosition(Common::Point(192, 155));
1793
1794 _companion1.setPosition(Common::Point(138, 134));
1795 _companion2.setPosition(Common::Point(110, 139));
1796 _webbster.setPosition(Common::Point(125, 142));
1797 break;
1798 }
1799
1800 if (R2_GLOBALS._walkwaySceneNumber == 2) {
1801 R2_GLOBALS._sceneItems.remove(&_door);
1802 for (int i = 0; i <= 12; i++)
1803 R2_GLOBALS._sceneItems.remove(&_itemArray[i]);
1804 R2_GLOBALS._sceneItems.remove(&_background);
1805
1806 _door.show();
1807 _door.setDetails(3375, 9, 10, -1, 1, (SceneItem *)NULL);
1808
1809 for (int i = 0; i <= 12; i++)
1810 _itemArray[i].setDetails(3375, 3, -1, -1);
1811
1812 _background.setDetails(Rect(0, 0, 320, 200), 3375, 0, -1, -1, 1, NULL);
1813 } else {
1814 _door.hide();
1815 R2_GLOBALS._sceneItems.remove(&_door);
1816 }
1817
1818 if (_sceneMode == 0)
1819 signal();
1820 else
1821 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
1822 }
1823
startAction(CursorType action,Event & event)1824 bool Scene3375::Companion2::startAction(CursorType action, Event &event) {
1825 if (action != CURSOR_TALK)
1826 return SceneActor::startAction(action, event);
1827
1828 Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1829
1830 scene->_sceneMode = 9999;
1831 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
1832 scene->_stripManager.start(3302, scene);
1833 else
1834 scene->_stripManager.start(3304, scene);
1835
1836 return true;
1837 }
1838
startAction(CursorType action,Event & event)1839 bool Scene3375::Companion1::startAction(CursorType action, Event &event) {
1840 if (action != CURSOR_TALK)
1841 return SceneActor::startAction(action, event);
1842
1843 Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1844
1845 scene->_sceneMode = 9999;
1846 if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
1847 scene->_stripManager.start(3302, scene);
1848 else
1849 scene->_stripManager.start(3301, scene);
1850
1851 return true;
1852 }
1853
startAction(CursorType action,Event & event)1854 bool Scene3375::Webbster::startAction(CursorType action, Event &event) {
1855 if (action != CURSOR_TALK)
1856 return SceneActor::startAction(action, event);
1857
1858 Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1859
1860 scene->_sceneMode = 9999;
1861 scene->_stripManager.start(3303, scene);
1862
1863 return true;
1864 }
1865
startAction(CursorType action,Event & event)1866 bool Scene3375::Door::startAction(CursorType action, Event &event) {
1867 if (action != CURSOR_USE)
1868 return SceneActor::startAction(action, event);
1869
1870 if (R2_GLOBALS._walkwaySceneNumber != 0) {
1871 R2_GLOBALS._walkRegions.enableRegion(2);
1872 R2_GLOBALS._walkRegions.enableRegion(3);
1873 } else {
1874 R2_GLOBALS._walkRegions.enableRegion(1);
1875 R2_GLOBALS._walkRegions.enableRegion(3);
1876 R2_GLOBALS._walkRegions.enableRegion(4);
1877 }
1878 R2_GLOBALS._walkRegions.enableRegion(6);
1879 R2_GLOBALS._walkRegions.enableRegion(7);
1880 R2_GLOBALS._walkRegions.enableRegion(8);
1881
1882 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
1883
1884 Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1885
1886 scene->_sceneMode = 3375;
1887 scene->setAction(&scene->_sequenceManager, scene, 3375, &R2_GLOBALS._player,
1888 &scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door, NULL);
1889
1890 return true;
1891 }
1892
changeScene()1893 void Scene3375::LeftExit::changeScene() {
1894 Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1895
1896 _moving = false;
1897 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
1898 scene->_sceneMode = 3376;
1899 if (R2_GLOBALS._walkwaySceneNumber != 0) {
1900 R2_GLOBALS._walkRegions.enableRegion(2);
1901 R2_GLOBALS._walkRegions.enableRegion(3);
1902 } else {
1903 R2_GLOBALS._walkRegions.enableRegion(1);
1904 R2_GLOBALS._walkRegions.enableRegion(3);
1905 R2_GLOBALS._walkRegions.enableRegion(4);
1906 }
1907 if (scene->_companion1._position.y != 163) {
1908 R2_GLOBALS._player.setStrip2(-1);
1909 scene->_companion1.setStrip2(-1);
1910 scene->_companion2.setStrip2(-1);
1911 scene->_webbster.setStrip2(-1);
1912 scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2, &scene->_webbster, NULL);
1913 } else {
1914 R2_GLOBALS._player.setStrip2(2);
1915 scene->_companion1.setStrip2(2);
1916 scene->_companion2.setStrip2(2);
1917 scene->_webbster.setStrip2(2);
1918 R2_GLOBALS._sound2.play(314);
1919
1920 Common::Point pt(50, 150);
1921 NpcMover *mover = new NpcMover();
1922 R2_GLOBALS._player.addMover(mover, &pt, scene);
1923 }
1924 }
1925
changeScene()1926 void Scene3375::DownExit::changeScene() {
1927 Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1928
1929 _moving = false;
1930 R2_GLOBALS._player._effect = EFFECT_SHADED2;
1931 R2_GLOBALS._player._shade = 4;
1932 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
1933
1934 scene->_sceneMode = 3377;
1935 scene->_newSceneMode = 3381;
1936
1937 if (R2_GLOBALS._walkwaySceneNumber != 0) {
1938 R2_GLOBALS._walkRegions.enableRegion(2);
1939 R2_GLOBALS._walkRegions.enableRegion(3);
1940 } else {
1941 R2_GLOBALS._walkRegions.enableRegion(1);
1942 R2_GLOBALS._walkRegions.enableRegion(3);
1943 R2_GLOBALS._walkRegions.enableRegion(4);
1944 }
1945 scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2, &scene->_webbster, NULL);
1946 }
1947
changeScene()1948 void Scene3375::RightExit::changeScene() {
1949 Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1950
1951 _moving = false;
1952 R2_GLOBALS._player._effect = EFFECT_SHADED2;
1953 R2_GLOBALS._player._shade = 4;
1954 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
1955
1956 scene->_sceneMode = 3378;
1957 scene->_newSceneMode = 3380;
1958
1959 if (R2_GLOBALS._walkwaySceneNumber != 0) {
1960 R2_GLOBALS._walkRegions.enableRegion(2);
1961 R2_GLOBALS._walkRegions.enableRegion(3);
1962 } else {
1963 R2_GLOBALS._walkRegions.enableRegion(1);
1964 R2_GLOBALS._walkRegions.enableRegion(3);
1965 R2_GLOBALS._walkRegions.enableRegion(4);
1966 }
1967 scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2, &scene->_webbster, NULL);
1968 }
1969
Scene3375()1970 Scene3375::Scene3375() {
1971 _newSceneMode = 0;
1972
1973 _sceneAreas[0] = 3376;
1974 _sceneAreas[1] = 3377;
1975 _sceneAreas[2] = 3375;
1976 _sceneAreas[3] = 3378;
1977 }
1978
postInit(SceneObjectList * OwnerList)1979 void Scene3375::postInit(SceneObjectList *OwnerList) {
1980 loadScene(_sceneAreas[R2_GLOBALS._walkwaySceneNumber]);
1981 SceneExt::postInit();
1982
1983 R2_GLOBALS._sound1.play(313);
1984
1985 _stripManager.setColors(60, 255);
1986 _stripManager.setFontNumber(3);
1987 _stripManager.addSpeaker(&_quinnSpeaker);
1988 _stripManager.addSpeaker(&_seekerSpeaker);
1989 _stripManager.addSpeaker(&_mirandaSpeaker);
1990 _stripManager.addSpeaker(&_webbsterSpeaker);
1991
1992 R2_GLOBALS._player._characterScene[R2_QUINN] = 3375;
1993 R2_GLOBALS._player._characterScene[R2_SEEKER] = 3375;
1994 R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3375;
1995
1996 setZoomPercents(126, 55, 200, 167);
1997 R2_GLOBALS._player.postInit();
1998
1999 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2000 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2001 else
2002 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2003
2004 R2_GLOBALS._player.changeZoom(-1);
2005
2006 switch (R2_GLOBALS._player._characterIndex) {
2007 case R2_SEEKER:
2008 if (R2_GLOBALS._sceneManager._previousScene == 3385)
2009 R2_GLOBALS._player.setup(20, 1, 1);
2010 else
2011 R2_GLOBALS._player.setup(20, 3, 1);
2012 break;
2013 case R2_MIRANDA:
2014 if (R2_GLOBALS._sceneManager._previousScene == 3385)
2015 R2_GLOBALS._player.setup(30, 1, 1);
2016 else
2017 R2_GLOBALS._player.setup(30, 3, 1);
2018 break;
2019 default:
2020 if (R2_GLOBALS._sceneManager._previousScene == 3385)
2021 R2_GLOBALS._player.setup(10, 1, 1);
2022 else
2023 R2_GLOBALS._player.setup(10, 3, 1);
2024 break;
2025 }
2026
2027 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2028 R2_GLOBALS._player.disableControl();
2029
2030 _companion1.postInit();
2031 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2032 _companion1._moveRate = 10;
2033 _companion1._moveDiff = Common::Point(3, 2);
2034 } else {
2035 _companion1._moveRate = 7;
2036 _companion1._moveDiff = Common::Point(5, 3);
2037 }
2038 _companion1.changeZoom(-1);
2039 _companion1._effect = EFFECT_SHADED;
2040
2041 int tmpStrip, tmpVisage;
2042 if (R2_GLOBALS._sceneManager._previousScene == 3385)
2043 tmpStrip = 1;
2044 else
2045 tmpStrip = 4;
2046
2047 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2048 tmpVisage = 10;
2049 else
2050 tmpVisage = 20;
2051
2052 _companion1.setup(tmpVisage, tmpStrip, 1);
2053 _companion1.animate(ANIM_MODE_1, NULL);
2054
2055 _companion2.postInit();
2056 _companion2._moveDiff = Common::Point(3, 2);
2057 _companion2.changeZoom(-1);
2058 _companion2._effect = EFFECT_SHADED;
2059 if (R2_GLOBALS._sceneManager._previousScene == 3385)
2060 tmpStrip = 1;
2061 else
2062 tmpStrip = 8;
2063
2064 if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2065 tmpVisage = 10;
2066 else
2067 tmpVisage = 30;
2068
2069 _companion2.setup(tmpVisage, tmpStrip, 1);
2070 _companion2.animate(ANIM_MODE_1, NULL);
2071
2072 _webbster.postInit();
2073 _webbster._moveRate = 7;
2074 _webbster._moveDiff = Common::Point(5, 3);
2075 _webbster.changeZoom(-1);
2076 _webbster._effect = EFFECT_SHADED;
2077 if (R2_GLOBALS._sceneManager._previousScene == 3385)
2078 tmpStrip = 1;
2079 else
2080 tmpStrip = 4;
2081
2082 _webbster.setup(40, tmpStrip, 1);
2083 _webbster.animate(ANIM_MODE_1, NULL);
2084
2085 _companion2.setDetails(3375, -1, -1, -1, 1, (SceneItem *)NULL);
2086 _webbster.setDetails(3375, 21, -1, -1, 1, (SceneItem *)NULL);
2087 _companion1.setDetails(3375, -1, -1, -1, 1, (SceneItem *)NULL);
2088
2089 _door.postInit();
2090 _door.setup(3375, 1, 1);
2091 _door.setPosition(Common::Point(254, 166));
2092 _door.fixPriority(140);
2093 _door.hide();
2094
2095 _leftExit.setDetails(Rect(0, 84, 24, 167), EXITCURSOR_W, 3375);
2096 _leftExit.setDest(Common::Point(65, 155));
2097 _downExit.setDetails(Rect(103, 152, 183, 170), SHADECURSOR_DOWN, 3375);
2098 _downExit.setDest(Common::Point(158, 151));
2099 _rightExit.setDetails(Rect(180, 75, 213, 132), EXITCURSOR_E, 3375);
2100 _rightExit.setDest(Common::Point(201, 131));
2101
2102 for (int i = 0; i <= 12; ++i)
2103 _itemArray[i].setDetails(i, 3375, 3, -1, -1);
2104
2105 _background.setDetails(Rect(0, 0, 320, 200), 3375, 0, -1, 1, 1, NULL);
2106
2107 if (R2_GLOBALS._sceneManager._previousScene == 3385)
2108 _sceneMode = 3379;
2109 else
2110 _sceneMode = 0;
2111
2112 enterArea(_sceneMode);
2113 }
2114
remove()2115 void Scene3375::remove() {
2116 R2_GLOBALS._sound1.fadeOut2(NULL);
2117 SceneExt::remove();
2118 }
2119
signalCase3379()2120 void Scene3375::signalCase3379() {
2121 switch (R2_GLOBALS._walkwaySceneNumber) {
2122 case 0:
2123 _leftExit._enabled = true;
2124 if (R2_GLOBALS._sceneManager._previousScene == 3385) {
2125 // WORKAROUND: The original disables the left entry region here for
2126 // some reason. But there's also some walk issue even I leave it enabled.
2127 // Instead, for now, add an extra walk into the properly enabled regions
2128 _sceneMode = 1;
2129 ADD_MOVER(R2_GLOBALS._player, 70, R2_GLOBALS._player._position.y);
2130 R2_GLOBALS._sceneManager._previousScene = 3375;
2131 R2_GLOBALS._player._effect = EFFECT_SHADED;
2132 _companion1._effect = EFFECT_SHADED;
2133 _companion2._effect = EFFECT_SHADED;
2134 _webbster._effect = EFFECT_SHADED;
2135
2136 return;
2137 //R2_GLOBALS._walkRegions.disableRegion(1);
2138 } else {
2139 R2_GLOBALS._walkRegions.disableRegion(3);
2140 R2_GLOBALS._walkRegions.disableRegion(4);
2141 }
2142 R2_GLOBALS._walkRegions.disableRegion(6);
2143 R2_GLOBALS._walkRegions.disableRegion(7);
2144 break;
2145 case 2:
2146 _leftExit._enabled = false;
2147 R2_GLOBALS._walkRegions.disableRegion(2);
2148 R2_GLOBALS._walkRegions.disableRegion(3);
2149 R2_GLOBALS._walkRegions.disableRegion(5);
2150 R2_GLOBALS._walkRegions.disableRegion(6);
2151 R2_GLOBALS._walkRegions.disableRegion(7);
2152 R2_GLOBALS._walkRegions.disableRegion(8);
2153 R2_GLOBALS._walkRegions.disableRegion(9);
2154 break;
2155 default:
2156 _leftExit._enabled = false;
2157 R2_GLOBALS._walkRegions.disableRegion(2);
2158 R2_GLOBALS._walkRegions.disableRegion(3);
2159 R2_GLOBALS._walkRegions.disableRegion(5);
2160 R2_GLOBALS._walkRegions.disableRegion(6);
2161 break;
2162 }
2163 R2_GLOBALS._sceneManager._previousScene = 3375;
2164 R2_GLOBALS._player._effect = EFFECT_SHADED;
2165 _companion1._effect = EFFECT_SHADED;
2166 _companion2._effect = EFFECT_SHADED;
2167 _webbster._effect = EFFECT_SHADED;
2168 R2_GLOBALS._player.enableControl(CURSOR_WALK);
2169 }
2170
signal()2171 void Scene3375::signal() {
2172 switch (_sceneMode) {
2173 case 1:
2174 R2_GLOBALS._player.enableControl();
2175 break;
2176 case 3375:
2177 R2_GLOBALS._sceneManager.changeScene(3400);
2178 break;
2179 case 3376:
2180 R2_GLOBALS._sceneManager.changeScene(3385);
2181 break;
2182 case 3377:
2183 // No break on purpose
2184 case 3378:
2185 _sceneMode = _newSceneMode;
2186 _newSceneMode = 0;
2187
2188 _companion1._effect = EFFECT_SHADED2;
2189 _companion1._shade = 4;
2190 _companion2._effect = EFFECT_SHADED2;
2191 _companion2._shade = 4;
2192 _webbster._effect = EFFECT_SHADED2;
2193 _webbster._shade = 4;
2194
2195 // HACK: Reset zooms in order to avoid giant characters on the upper right of the screen
2196 R2_GLOBALS._player.setZoom(-1);
2197 _companion1.setZoom(-1);
2198 _companion2.setZoom(-1);
2199 _webbster.setZoom(-1);
2200 //
2201
2202 enterArea(_sceneMode);
2203 break;
2204 case 3379:
2205 signalCase3379();
2206 break;
2207 case 9999:
2208 if (_companion1._position.y == 163)
2209 R2_GLOBALS._player.setStrip(1);
2210 else
2211 R2_GLOBALS._player.setStrip(3);
2212 R2_GLOBALS._player.enableControl(CURSOR_TALK);
2213 break;
2214 default:
2215 _companion1.setPriority(130);
2216 _companion2.setPriority(132);
2217 _webbster.setPriority(134);
2218 signalCase3379();
2219 break;
2220 }
2221 }
2222
dispatch()2223 void Scene3375::dispatch() {
2224 if ((R2_GLOBALS._player._position.y >= 168) && (R2_GLOBALS._player._effect == EFFECT_SHADED))
2225 R2_GLOBALS._player._effect = EFFECT_SHADED2;
2226 else if ((R2_GLOBALS._player._position.y < 168) && (R2_GLOBALS._player._effect == EFFECT_SHADED2))
2227 R2_GLOBALS._player._effect = EFFECT_SHADED;
2228
2229 if ((_companion1._position.y >= 168) && (_companion1._effect == EFFECT_SHADED))
2230 _companion1._effect = EFFECT_SHADED2;
2231 else if ((_companion1._position.y < 168) && (_companion1._effect == EFFECT_SHADED2))
2232 _companion1._effect = EFFECT_SHADED;
2233
2234 if ((_companion2._position.y >= 168) && (_companion2._effect == EFFECT_SHADED))
2235 _companion2._effect = EFFECT_SHADED2;
2236 else if ((_companion2._position.y < 168) && (_companion2._effect == EFFECT_SHADED2))
2237 _companion2._effect = EFFECT_SHADED;
2238
2239 if ((_webbster._position.y >= 168) && (_webbster._effect == EFFECT_SHADED))
2240 _webbster._effect = EFFECT_SHADED2;
2241 else if ((_webbster._position.y < 168) && (_webbster._effect == EFFECT_SHADED2))
2242 _webbster._effect = EFFECT_SHADED;
2243
2244 Scene::dispatch();
2245 }
2246
2247 /*--------------------------------------------------------------------------
2248 * Scene 3385 - Corridor
2249 *
2250 *--------------------------------------------------------------------------*/
2251
Scene3385()2252 Scene3385::Scene3385() {
2253 _playerStrip = 0;
2254 }
2255
synchronize(Serializer & s)2256 void Scene3385::synchronize(Serializer &s) {
2257 SceneExt::synchronize(s);
2258
2259 s.syncAsSint16LE(_playerStrip);
2260 }
2261
startAction(CursorType action,Event & event)2262 bool Scene3385::Companion1::startAction(CursorType action, Event &event) {
2263 if (action != CURSOR_TALK)
2264 return SceneActor::startAction(action, event);
2265
2266 Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2267
2268 scene->_sceneMode = 9999;
2269 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2270 scene->_stripManager.start(3302, scene);
2271 else
2272 scene->_stripManager.start(3304, scene);
2273
2274 return true;
2275 }
2276
startAction(CursorType action,Event & event)2277 bool Scene3385::Companion2::startAction(CursorType action, Event &event) {
2278 if (action != CURSOR_TALK)
2279 return SceneActor::startAction(action, event);
2280
2281 Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2282
2283 scene->_sceneMode = 9999;
2284 if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2285 scene->_stripManager.start(3302, scene);
2286 else
2287 scene->_stripManager.start(3301, scene);
2288
2289 return true;
2290 }
2291
startAction(CursorType action,Event & event)2292 bool Scene3385::Webbster::startAction(CursorType action, Event &event) {
2293 if (action != CURSOR_TALK)
2294 return SceneActor::startAction(action, event);
2295
2296 Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2297
2298 scene->_sceneMode = 9999;
2299 scene->_stripManager.start(3303, scene);
2300
2301 return true;
2302 }
2303
startAction(CursorType action,Event & event)2304 bool Scene3385::Door::startAction(CursorType action, Event &event) {
2305 if (action != CURSOR_USE)
2306 return SceneActor::startAction(action, event);
2307
2308 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
2309 if (R2_GLOBALS._sceneManager._previousScene == 3375)
2310 R2_GLOBALS._sound2.play(314);
2311
2312 Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2313
2314 scene->_sceneMode = 3386;
2315 scene->setAction(&scene->_sequenceManager, scene, 3386, &R2_GLOBALS._player,
2316 &scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door,
2317 NULL);
2318
2319 return true;
2320 }
2321
changeScene()2322 void Scene3385::SouthExit::changeScene() {
2323 Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2324
2325 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
2326 scene->_sceneMode = 3387;
2327
2328 if (R2_GLOBALS._sceneManager._previousScene == 3375)
2329 scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode,
2330 &R2_GLOBALS._player, &scene->_companion1, &scene->_companion2,
2331 &scene->_webbster, NULL);
2332 else
2333 scene->signal();
2334 }
2335
signal()2336 void Scene3385::Action1::signal() {
2337 int v = _actionIndex;
2338 ++_actionIndex;
2339
2340 if (v == 0)
2341 setDelay(1);
2342 else if (v == 1)
2343 R2_GLOBALS._sound2.play(314);
2344 }
2345
postInit(SceneObjectList * OwnerList)2346 void Scene3385::postInit(SceneObjectList *OwnerList) {
2347 loadScene(3385);
2348 SceneExt::postInit();
2349
2350 R2_GLOBALS._sound1.play(313);
2351
2352 _stripManager.setColors(60, 255);
2353 _stripManager.setFontNumber(3);
2354 _stripManager.addSpeaker(&_quinnSpeaker);
2355 _stripManager.addSpeaker(&_seekerSpeaker);
2356 _stripManager.addSpeaker(&_mirandaSpeaker);
2357 _stripManager.addSpeaker(&_webbsterSpeaker);
2358
2359 R2_GLOBALS._player._characterScene[R2_QUINN] = 3385;
2360 R2_GLOBALS._player._characterScene[R2_SEEKER] = 3385;
2361 R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3385;
2362
2363 if (R2_GLOBALS._sceneManager._previousScene == 3375)
2364 _playerStrip = 3;
2365 else
2366 _playerStrip = 4;
2367
2368 setZoomPercents(102, 40, 200, 160);
2369 R2_GLOBALS._player.postInit();
2370
2371 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2372 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2373 else
2374 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2375
2376 R2_GLOBALS._player.changeZoom(-1);
2377
2378 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2379 R2_GLOBALS._player.setup(20, _playerStrip, 1);
2380 else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2381 R2_GLOBALS._player.setup(30, _playerStrip, 1);
2382 else
2383 R2_GLOBALS._player.setup(10, _playerStrip, 1);
2384
2385 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2386 R2_GLOBALS._player.disableControl();
2387
2388 _companion1.postInit();
2389 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2390 _companion1._moveRate = 10;
2391 _companion1._moveDiff = Common::Point(3, 2);
2392 } else {
2393 _companion1._moveRate = 7;
2394 _companion1._moveDiff = Common::Point(5, 3);
2395 }
2396 _companion1.changeZoom(-1);
2397 _companion1._effect = EFFECT_SHADED;
2398 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2399 _companion1.setup(10, _playerStrip, 1);
2400 else
2401 _companion1.setup(20, _playerStrip, 1);
2402 _companion1.animate(ANIM_MODE_1, NULL);
2403 _companion1.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);
2404
2405 _companion2.postInit();
2406 _companion2._moveDiff = Common::Point(3, 2);
2407 _companion2.changeZoom(-1);
2408 _companion2._effect = EFFECT_SHADED;
2409 if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2410 _companion2.setup(10, _playerStrip, 1);
2411 else
2412 _companion2.setup(30, _playerStrip, 1);
2413 _companion2.animate(ANIM_MODE_1, NULL);
2414 _companion2.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);
2415
2416 _webbster.postInit();
2417 _webbster._moveDiff = Common::Point(3, 2);
2418 _webbster.changeZoom(-1);
2419 _webbster._effect = EFFECT_SHADED;
2420 _webbster.setup(40, _playerStrip, 1);
2421 _webbster.animate(ANIM_MODE_1, NULL);
2422 _webbster.setDetails(3385, 15, -1, -1, 1, (SceneItem *) NULL);
2423
2424 _southExit.setDetails(Rect(103, 152, 217, 170), SHADECURSOR_DOWN, 3395);
2425 _southExit.setDest(Common::Point(158, 151));
2426
2427 _door.postInit();
2428 _door.setPosition(Common::Point(160, 100));
2429 _door.fixPriority(90);
2430 _door.setDetails(3385, 3, 4, -1, 1, (SceneItem *) NULL);
2431
2432 if (R2_GLOBALS._sceneManager._previousScene == 3375) {
2433 R2_GLOBALS._player.setPosition(Common::Point(158, 102));
2434 _companion1.setPosition(Common::Point(164, 100));
2435 _companion1.fixPriority(98);
2436 _companion2.setPosition(Common::Point(150, 100));
2437 _companion2.fixPriority(97);
2438 _webbster.setPosition(Common::Point(158, 100));
2439 _webbster.fixPriority(96);
2440 _sceneMode = 3384;
2441 _door.setup(3385, 1, 6);
2442 _door.animate(ANIM_MODE_6, this);
2443 setAction(&_action1, &_door);
2444 } else {
2445 R2_GLOBALS._player.setPosition(Common::Point(158, 230));
2446 _companion1.setPosition(Common::Point(191, 270));
2447 _companion2.setPosition(Common::Point(124, 255));
2448 _webbster.setPosition(Common::Point(155, 245));
2449 _door.setup(3385, 1, 1);
2450 _sceneMode = 3385;
2451 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
2452 }
2453
2454 _background.setDetails(Rect(0, 0, 320, 200), 3385, 0, -1, -1, 1, NULL);
2455 R2_GLOBALS._walkwaySceneNumber = 0;
2456 }
2457
remove()2458 void Scene3385::remove() {
2459 R2_GLOBALS._sound1.fadeOut2(NULL);
2460 SceneExt::remove();
2461 }
2462
signal()2463 void Scene3385::signal() {
2464 switch (_sceneMode) {
2465 case 3386:
2466 R2_GLOBALS._sceneManager.changeScene(3375);
2467 break;
2468 case 3387:
2469 R2_GLOBALS._sceneManager.changeScene(3395);
2470 break;
2471 case 9999:
2472 if (R2_GLOBALS._sceneManager._previousScene == 3375)
2473 R2_GLOBALS._player.setStrip(3);
2474 else
2475 R2_GLOBALS._player.setStrip(4);
2476 R2_GLOBALS._player.enableControl(CURSOR_TALK);
2477 break;
2478 default:
2479 R2_GLOBALS._player.enableControl(CURSOR_WALK);
2480 break;
2481 }
2482 }
2483
2484 /*--------------------------------------------------------------------------
2485 * Scene 3395 - Walkway
2486 *
2487 *--------------------------------------------------------------------------*/
2488
Scene3395()2489 Scene3395::Scene3395() {
2490 _playerStrip = 0;
2491 }
2492
synchronize(Serializer & s)2493 void Scene3395::synchronize(Serializer &s) {
2494 SceneExt::synchronize(s);
2495
2496 s.syncAsSint16LE(_playerStrip);
2497 }
2498
startAction(CursorType action,Event & event)2499 bool Scene3395::Companion1::startAction(CursorType action, Event &event) {
2500 if (action != CURSOR_TALK)
2501 return SceneActor::startAction(action, event);
2502
2503 Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
2504
2505 scene->_sceneMode = 9999;
2506 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2507 scene->_stripManager.start(3302, scene);
2508 else
2509 scene->_stripManager.start(3304, scene);
2510
2511 return true;
2512 }
2513
startAction(CursorType action,Event & event)2514 bool Scene3395::Companion2::startAction(CursorType action, Event &event) {
2515 if (action != CURSOR_TALK)
2516 return SceneActor::startAction(action, event);
2517
2518 Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
2519
2520 scene->_sceneMode = 9999;
2521 if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2522 scene->_stripManager.start(3302, scene);
2523 else
2524 scene->_stripManager.start(3301, scene);
2525
2526 return true;
2527 }
2528
startAction(CursorType action,Event & event)2529 bool Scene3395::Webbster::startAction(CursorType action, Event &event) {
2530 if (action != CURSOR_TALK)
2531 return SceneActor::startAction(action, event);
2532
2533 Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
2534
2535 scene->_sceneMode = 9999;
2536 scene->_stripManager.start(3303, scene);
2537
2538 return true;
2539 }
2540
startAction(CursorType action,Event & event)2541 bool Scene3395::Door::startAction(CursorType action, Event &event) {
2542 if (action != CURSOR_USE)
2543 return SceneActor::startAction(action, event);
2544
2545 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
2546 if (R2_GLOBALS._sceneManager._previousScene == 3385)
2547 R2_GLOBALS._sound2.play(314);
2548
2549 Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
2550
2551 scene->_sceneMode = 3396;
2552 scene->setAction(&scene->_sequenceManager, scene, 3396, &R2_GLOBALS._player,
2553 &scene->_companion1, &scene->_companion2, &scene->_webbster, &scene->_door,
2554 NULL);
2555
2556 return true;
2557 }
2558
signal()2559 void Scene3395::Action1::signal() {
2560 int v = _actionIndex;
2561 ++_actionIndex;
2562
2563 if (v == 0)
2564 setDelay(2);
2565 else if (v == 1)
2566 R2_GLOBALS._sound2.play(314);
2567 }
2568
postInit(SceneObjectList * OwnerList)2569 void Scene3395::postInit(SceneObjectList *OwnerList) {
2570 loadScene(3395);
2571 SceneExt::postInit();
2572
2573 R2_GLOBALS._sound1.play(313);
2574
2575 _stripManager.setColors(60, 255);
2576 _stripManager.setFontNumber(3);
2577 _stripManager.addSpeaker(&_quinnSpeaker);
2578 _stripManager.addSpeaker(&_seekerSpeaker);
2579 _stripManager.addSpeaker(&_mirandaSpeaker);
2580 _stripManager.addSpeaker(&_webbsterSpeaker);
2581
2582 R2_GLOBALS._player._characterScene[R2_QUINN] = 3395;
2583 R2_GLOBALS._player._characterScene[R2_SEEKER] = 3395;
2584 R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3395;
2585
2586 if (R2_GLOBALS._sceneManager._previousScene == 3385)
2587 _playerStrip = 3;
2588 else
2589 _playerStrip = 4;
2590
2591 setZoomPercents(51, 40, 200, 137);
2592 R2_GLOBALS._player.postInit();
2593
2594 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2595 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2596 else
2597 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2598
2599 R2_GLOBALS._player.changeZoom(-1);
2600
2601 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2602 R2_GLOBALS._player.setup(20, _playerStrip, 1);
2603 else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2604 R2_GLOBALS._player.setup(30, _playerStrip, 1);
2605 else
2606 R2_GLOBALS._player.setup(10, _playerStrip, 1);
2607
2608 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2609 R2_GLOBALS._player.disableControl();
2610
2611 _companion1.postInit();
2612 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2613 _companion1._moveRate = 10;
2614 _companion1._moveDiff = Common::Point(3, 2);
2615 } else {
2616 _companion1._moveRate = 7;
2617 _companion1._moveDiff = Common::Point(5, 3);
2618 }
2619 _companion1.changeZoom(-1);
2620 _companion1._effect = EFFECT_SHADED;
2621 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2622 _companion1.setup(10, _playerStrip, 1);
2623 else
2624 _companion1.setup(20, _playerStrip, 1);
2625 _companion1.animate(ANIM_MODE_1, NULL);
2626 _companion1.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);
2627
2628 _companion2.postInit();
2629 _companion2._moveDiff = Common::Point(3, 2);
2630 _companion2.changeZoom(-1);
2631 _companion2._effect = EFFECT_SHADED;
2632 if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2633 _companion2.setup(10, _playerStrip, 1);
2634 else
2635 _companion2.setup(30, _playerStrip, 1);
2636 _companion2.animate(ANIM_MODE_1, NULL);
2637 _companion2.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);
2638
2639 _webbster.postInit();
2640 _webbster._moveDiff = Common::Point(3, 2);
2641 _webbster.changeZoom(-1);
2642 _webbster._effect = EFFECT_SHADED;
2643 _webbster.setup(40, _playerStrip, 1);
2644 _webbster.animate(ANIM_MODE_1, NULL);
2645 _webbster.setDetails(3395, 18, -1, -1, 1, (SceneItem *) NULL);
2646
2647 _door.postInit();
2648 _door.setPosition(Common::Point(159, 50));
2649 _door.fixPriority(40);
2650 _door.setDetails(3395, 6, 7, -1, 1, (SceneItem *) NULL);
2651
2652 if (R2_GLOBALS._sceneManager._previousScene == 3385) {
2653 R2_GLOBALS._player.setPosition(Common::Point(158, 53));
2654 _companion1.setPosition(Common::Point(164, 51));
2655 _companion1.fixPriority(48);
2656 _companion2.setPosition(Common::Point(150, 51));
2657 _companion2.fixPriority(47);
2658 _webbster.setPosition(Common::Point(158, 51));
2659 _webbster.fixPriority(46);
2660 _sceneMode = 3394;
2661 _door.setup(3395, 1, 7);
2662 _door.animate(ANIM_MODE_6, this);
2663 setAction(&_action1, &_door);
2664 } else {
2665 R2_GLOBALS._player.setPosition(Common::Point(158, 200));
2666 _companion1.setPosition(Common::Point(191, 255));
2667 _companion2.setPosition(Common::Point(124, 240));
2668 _webbster.setPosition(Common::Point(155, 242));
2669 _door.setup(3395, 1, 1);
2670
2671 R2_GLOBALS._walkRegions.disableRegion(1);
2672
2673 _sceneMode = 3395;
2674 setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
2675 }
2676
2677 for (int i = 0; i <= 12; i++) {
2678 _itemArray[i].setDetails(i, 3395, 0, -1, -1);
2679 }
2680
2681 _background.setDetails(Rect(0, 0, 320, 200), 3395, 3, -1, -1, 1, NULL);
2682 }
2683
remove()2684 void Scene3395::remove() {
2685 R2_GLOBALS._sound1.fadeOut2(NULL);
2686 SceneExt::remove();
2687 }
2688
signal()2689 void Scene3395::signal() {
2690 switch (_sceneMode) {
2691 case 3396:
2692 R2_GLOBALS._sceneManager.changeScene(3385);
2693 break;
2694 case 9999:
2695 if (R2_GLOBALS._sceneManager._previousScene == 3385)
2696 R2_GLOBALS._player.setStrip(3);
2697 else
2698 R2_GLOBALS._player.setStrip(4);
2699 R2_GLOBALS._player.enableControl(CURSOR_TALK);
2700 break;
2701 default:
2702 R2_GLOBALS._player.enableControl(CURSOR_WALK);
2703 break;
2704 }
2705 }
2706
2707 /*--------------------------------------------------------------------------
2708 * Scene 3400 - Confrontation
2709 *
2710 *--------------------------------------------------------------------------*/
2711
Scene3400()2712 Scene3400::Scene3400() {
2713 _soundFaded = false;
2714 }
2715
synchronize(Serializer & s)2716 void Scene3400::synchronize(Serializer &s) {
2717 SceneExt::synchronize(s);
2718
2719 s.syncAsSint16LE(_soundFaded);
2720 }
2721
postInit(SceneObjectList * OwnerList)2722 void Scene3400::postInit(SceneObjectList *OwnerList) {
2723 R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
2724 _sceneBounds = Rect(160, 0, 480, 200);
2725
2726 loadScene(3400);
2727 _soundFaded = false;
2728 SceneExt::postInit();
2729 R2_GLOBALS._sound1.play(317);
2730
2731 _stripManager.setColors(60, 255);
2732 _stripManager.setFontNumber(3);
2733 _stripManager.addSpeaker(&_quinnSpeaker);
2734 _stripManager.addSpeaker(&_seekerSpeaker);
2735 _stripManager.addSpeaker(&_mirandaSpeaker);
2736 _stripManager.addSpeaker(&_webbsterSpeaker);
2737 _stripManager.addSpeaker(&_tealSpeaker);
2738
2739 setZoomPercents(51, 46, 180, 200);
2740 R2_GLOBALS._player._characterScene[R2_QUINN] = 3400;
2741 R2_GLOBALS._player._characterScene[R2_SEEKER] = 3400;
2742 R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3400;
2743
2744 _manholeCover.postInit();
2745 _manholeCover.setup(3403, 1, 1);
2746 _manholeCover.setPosition(Common::Point(190, 103));
2747 _manholeCover.fixPriority(89);
2748
2749 R2_GLOBALS._player.postInit();
2750 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2751 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
2752 else
2753 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
2754 R2_GLOBALS._player.changeZoom(-1);
2755 R2_GLOBALS._player.setPosition(Common::Point(239, 64));
2756
2757 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2758 R2_GLOBALS._player.setup(20, 5, 1);
2759 else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2760 R2_GLOBALS._player.setup(30, 5, 1);
2761 else
2762 R2_GLOBALS._player.setup(10, 5, 1);
2763
2764 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
2765 R2_GLOBALS._player.disableControl();
2766
2767 _companion1.postInit();
2768 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2769 _companion1._numFrames = 10;
2770 _companion1._moveDiff = Common::Point(3, 2);
2771 } else {
2772 _companion1._numFrames = 7;
2773 _companion1._moveDiff = Common::Point(5, 3);
2774 }
2775 _companion1.changeZoom(-1);
2776 _companion1._effect = EFFECT_SHADED;
2777 _companion1.setPosition(Common::Point(247, 63));
2778 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2779 _companion1.setup(10, 5, 1);
2780 else
2781 _companion1.setup(20, 5, 1);
2782 _companion1.animate(ANIM_MODE_1, NULL);
2783
2784 _companion2.postInit();
2785 _companion2._moveDiff = Common::Point(3, 2);
2786 _companion2.changeZoom(-1);
2787 _companion2._effect = EFFECT_SHADED;
2788 _companion2.setPosition(Common::Point(225, 63));
2789 if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2790 _companion2.setup(10, 5, 1);
2791 else
2792 _companion2.setup(30, 5, 1);
2793 _companion2.animate(ANIM_MODE_1, NULL);
2794
2795 _webbster.postInit();
2796 _webbster._numFrames = 7;
2797 _webbster._moveDiff = Common::Point(5, 3);
2798 _webbster.changeZoom(-1);
2799 _webbster._effect = EFFECT_SHADED;
2800 _webbster.setPosition(Common::Point(235, 61));
2801 _webbster.setup(40, 3, 1);
2802 _webbster.animate(ANIM_MODE_1, NULL);
2803
2804 _door.postInit();
2805 _door.setup(3400, 1, 6);
2806 _door.setPosition(Common::Point(236, 51));
2807 _door.fixPriority(51);
2808 _door.animate(ANIM_MODE_6, NULL);
2809
2810 R2_GLOBALS.clearFlag(71);
2811 _sceneMode = 3400;
2812 setAction(&_sequenceManager, this, 3400, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
2813 }
2814
remove()2815 void Scene3400::remove() {
2816 R2_GLOBALS._sound2.fadeOut2(NULL);
2817 R2_GLOBALS._sound1.fadeOut2(NULL);
2818 SceneExt::remove();
2819 }
2820
signal()2821 void Scene3400::signal() {
2822 switch (_sceneMode) {
2823 case 3305: {
2824 // First part of discussion
2825 _tealSpeaker._object1.hide();
2826 _teal.show();
2827 _teal.setStrip(1);
2828 Common::Point pt(158, 190);
2829 NpcMover *mover = new NpcMover();
2830 _teal.addMover(mover, &pt, this);
2831 _sceneMode = 3402;
2832 setAction(&_sequenceManager, this, 3402, &R2_GLOBALS._player, &_companion1, &_companion2, &_webbster, NULL);
2833 }
2834 break;
2835 case 3306:
2836 // Teal picks up the sapphire
2837 R2_GLOBALS._sound2.play(318);
2838 _companion1.setStrip(2);
2839 R2_GLOBALS._player.setStrip(6);
2840 _companion2.setStrip(6);
2841 _webbster.setStrip(3);
2842 _teal.setStrip(1);
2843 R2_INVENTORY.setObjectScene(R2_SAPPHIRE_BLUE, 0);
2844 _stripManager.start(3307, this);
2845 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2846 _sceneMode = 3404;
2847 R2_GLOBALS._player.setAction(&_sequenceManager, this, 3404, &R2_GLOBALS._player, &_teal, &_sapphire, NULL);
2848 } else {
2849 _sceneMode = 3408;
2850 _companion1.setAction(&_sequenceManager, this, 3408, &_companion1, &_teal, &_sapphire, NULL);
2851 }
2852 break;
2853 case 3307:
2854 case 3404:
2855 case 3408:
2856 // A tasp!
2857 if (!_soundFaded) {
2858 R2_GLOBALS._sound2.fadeOut2(NULL);
2859 _soundFaded = true;
2860 } else {
2861 _sceneMode = 3308;
2862 _stripManager.start(3308, this);
2863 }
2864 break;
2865 case 3308:
2866 // Characters teleport one after the other
2867 _companion1.setStrip(2);
2868 R2_GLOBALS._player.setStrip(6);
2869 _companion2.setStrip(6);
2870 _webbster.setStrip(3);
2871 _teal.setStrip(1);
2872 _sceneMode = 3403;
2873 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2874 setAction(&_sequenceManager, this, 3403, &R2_GLOBALS._player, &_webbster, &_manholeCover, NULL);
2875 else
2876 setAction(&_sequenceManager, this, 3403, &_companion1, &_webbster, &_manholeCover, NULL);
2877 break;
2878 case 3309:
2879 // Miranda teleports away
2880 _teal.setStrip(1);
2881 _sceneMode = 3405;
2882 if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2883 setAction(&_sequenceManager, this, 3405, &R2_GLOBALS._player, &_manholeCover, NULL);
2884 else
2885 setAction(&_sequenceManager, this, 3405, &_companion2, &_manholeCover, NULL);
2886 break;
2887 case 3310:
2888 // Quinn teleports away
2889 _teal.setStrip(1);
2890 _sceneMode = 3406;
2891 if (R2_GLOBALS._player._characterIndex == R2_QUINN)
2892 setAction(&_sequenceManager, this, 3406, &R2_GLOBALS._player, &_manholeCover, NULL);
2893 else if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2894 setAction(&_sequenceManager, this, 3406, &_companion1, &_manholeCover, NULL);
2895 else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
2896 setAction(&_sequenceManager, this, 3406, &_companion2, &_manholeCover, NULL);
2897 break;
2898 case 3311:
2899 // Teal teleports away
2900 _tealSpeaker._object1.hide();
2901 _teal.show();
2902 _teal.setStrip(1);
2903 _sceneMode = 3407;
2904 setAction(&_sequenceManager, this, 3407, &_teal, &_manholeCover, NULL);
2905 break;
2906 case 3400: {
2907 // Teal enters the room
2908 _sapphire.postInit();
2909 _sapphire.hide();
2910 _teal.postInit();
2911 _teal._numFrames = 7;
2912 _teal._moveDiff = Common::Point(3, 2);
2913 _teal.changeZoom(-1);
2914 _teal._effect = EFFECT_SHADED;
2915 _teal.setPosition(Common::Point(-15, 90));
2916 _teal.setup(3402, 1, 1);
2917 _teal.animate(ANIM_MODE_1, NULL);
2918 Common::Point pt1(115, 90);
2919 NpcMover *mover1 = new NpcMover();
2920 _teal.addMover(mover1, &pt1, this);
2921 R2_GLOBALS._scrollFollower = &_teal;
2922 Common::Point pt2(203, 76);
2923 NpcMover *mover2 = new NpcMover();
2924 _webbster.addMover(mover2, &pt2, NULL);
2925 _sceneMode = 3401;
2926 }
2927 break;
2928 case 3401:
2929 // Teal first speech
2930 _sceneMode = 3305;
2931 _stripManager.start(3305, this);
2932 break;
2933 case 3402:
2934 // Betrayal of Webbster
2935 _sceneMode = 3306;
2936 _stripManager.start(3306, this);
2937 break;
2938 case 3403:
2939 // Teal: "Miranda..."
2940 R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
2941 _sceneMode = 3309;
2942 _stripManager.start(3309, this);
2943 break;
2944 case 3405:
2945 // Teal: "And Quinn..."
2946 _sceneMode = 3310;
2947 _stripManager.start(3310, this);
2948 break;
2949 case 3406:
2950 // Teal final sentence before teleporting
2951 _sceneMode = 3311;
2952 _stripManager.start(3311, this);
2953 break;
2954 case 3407:
2955 // End of scene
2956 R2_GLOBALS._sceneManager.changeScene(3600);
2957 break;
2958 default:
2959 // Unexpected scene mode
2960 R2_GLOBALS._player.enableControl();
2961 break;
2962 }
2963 }
2964
2965 /*--------------------------------------------------------------------------
2966 * Scene 3500 - Flub tube maze
2967 *
2968 *--------------------------------------------------------------------------*/
2969
Action1()2970 Scene3500::Action1::Action1() {
2971 _direction = 0;
2972 _headingRightFl = false;
2973 _turningFl = false;
2974 }
2975
synchronize(Serializer & s)2976 void Scene3500::Action1::synchronize(Serializer &s) {
2977 Action::synchronize(s);
2978
2979 s.syncAsSint16LE(_direction);
2980 s.syncAsSint16LE(_headingRightFl);
2981 if (s.getVersion() < 13) {
2982 int useless = 0;
2983 s.syncAsSint32LE(useless);
2984 }
2985 s.syncAsSint16LE(_turningFl);
2986 }
2987
handleHorzButton(int direction)2988 void Scene3500::Action1::handleHorzButton(int direction) {
2989 Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
2990
2991 // Direction: -1 == Left, 1 == Right
2992 _direction = direction;
2993 _headingRightFl = true;
2994 _turningFl = true;
2995
2996 scene->_tunnelHorzCircle.setStrip(2);
2997 scene->_tunnelHorzCircle.show();
2998
2999 if (_direction == 1)
3000 scene->_symbolRight.show();
3001 else
3002 scene->_symbolLeft.show();
3003
3004 if (scene->_shuttle._frame % 2 == 0) {
3005 scene->_shuttle._frameChange = _direction;
3006 scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3007 }
3008
3009 setActionIndex(0);
3010 }
3011
turnShuttle(bool arg1)3012 void Scene3500::Action1::turnShuttle(bool arg1) {
3013 Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3014
3015 _headingRightFl = arg1;
3016 _direction = -_direction;
3017
3018 if (_direction == 1) {
3019 scene->_symbolRight.show();
3020 scene->_symbolLeft.hide();
3021 } else {
3022 scene->_symbolLeft.show();
3023 scene->_symbolRight.hide();
3024 }
3025
3026 switch (_actionIndex) {
3027 case 4:
3028 scene->_shuttle._frameChange = _direction;
3029 scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3030 // fall through
3031 case 3:
3032 _actionIndex = 10;
3033 setDelay(0);
3034 break;
3035 case 5: {
3036 scene->_moverVertX = 160;
3037 Common::Point pt(160, 73);
3038 NpcMover *mover = new NpcMover();
3039 scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
3040
3041 scene->_moverHorzX = 160 - (_direction * 2 * 160);
3042 Common::Point pt2(scene->_moverHorzX, 73);
3043 NpcMover *mover2 = new NpcMover();
3044 scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
3045
3046 _actionIndex = 11;
3047 }
3048 break;
3049 case 6:
3050 scene->_shuttle._frameChange = _direction;
3051 scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3052 setDelay(1);
3053 // fall through
3054 case 8:
3055 scene->_tunnelHorzCircle.setStrip(2);
3056 _actionIndex = 1;
3057 break;
3058 default:
3059 break;
3060 }
3061 }
3062
signal()3063 void Scene3500::Action1::signal() {
3064 Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3065
3066 switch(_actionIndex++) {
3067 case 0:
3068 R2_GLOBALS._player.disableControl();
3069 scene->_directionChangesEnabled = false;
3070 if (scene->_speed != 0) {
3071 scene->_speed = 0;
3072 scene->_mazeChangeAmount = 0;
3073 scene->_updateIdxChangeFl = false;
3074 scene->_rotation->_idxChange = 0;
3075 }
3076 break;
3077 case 1:
3078 if ((scene->_shuttle._frame % 2) == 1) {
3079 setDelay(1);
3080 return;
3081 }
3082 // fall through
3083 case 3:
3084 scene->_shuttle._frameChange = _direction;
3085 scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3086 setDelay(1);
3087 break;
3088 case 4: {
3089 int cellId = scene->_mazeUI.getCellFromMapXY(Common::Point(scene->_mazePosition.x + 70, scene->_mazePosition.y + 46));
3090 int var2 = scene->_mazeUI.cellFromX(scene->_mazePosition.x + 70) - 70;
3091 int var4 = scene->_mazeUI.cellFromY(scene->_mazePosition.y + 46) - 46;
3092 int di = abs(var2 - scene->_mazePosition.x);
3093 int var6 = abs(var4 - scene->_mazePosition.y);
3094
3095 if ((scene->_shuttle._frame % 2) != 0) {
3096 scene->_shuttle._frameChange = _direction;
3097 scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3098 }
3099
3100 // Get the new direction starting on
3101 int direction = (scene->_action1._direction * 2 + scene->_mazeDirection);
3102 if (direction > MAZEDIR_NORTHWEST)
3103 direction = MAZEDIR_NORTH;
3104 else if (direction < MAZEDIR_NORTH)
3105 direction = MAZEDIR_WEST;
3106
3107 // Check whether movement is allowed in that direction. If so, then
3108 // movement is started again
3109 switch (direction) {
3110 case MAZEDIR_NORTH:
3111 if ( ((cellId != 2) && (cellId != 3) && (cellId != 6) && (cellId != 1) && (cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 11))
3112 || (var6 != 0)) {
3113 if ((cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 14) && (cellId != 15))
3114 _headingRightFl = false;
3115 else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
3116 _headingRightFl = false;
3117 else
3118 _headingRightFl = true;
3119 } else
3120 _headingRightFl = true;
3121 break;
3122 case MAZEDIR_EAST:
3123 if ( ((cellId != 12) && (cellId != 13) && (cellId != 11) && (cellId != 16) && (cellId != 26) && (cellId != 24) && (cellId != 15) && (cellId != 6) && (cellId != 31))
3124 || (di != 0)) {
3125 if ((cellId != 25) && (cellId != 23) && (cellId != 14) && (cellId != 5) && (cellId != 4))
3126 _headingRightFl = false;
3127 else if ((di != 0) || (var6 <= 3)) // useless, skipped: "|| (var6 == 0)"
3128 _headingRightFl = false;
3129 else
3130 _headingRightFl = true;
3131 } else
3132 _headingRightFl = true;
3133 break;
3134 case MAZEDIR_SOUTH:
3135 if ( ((cellId != 2) && (cellId != 3) && (cellId != 6) && (cellId != 1) && (cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 16) && (cellId != 31))
3136 || (var6 != 0)) {
3137 if ((cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 14) && (cellId != 15))
3138 _headingRightFl = false;
3139 else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
3140 _headingRightFl = false;
3141 else
3142 _headingRightFl = true;
3143 } else
3144 _headingRightFl = true;
3145 break;
3146 case MAZEDIR_WEST:
3147 if ( ((cellId != 12) && (cellId != 13) && (cellId != 11) && (cellId != 16) && (cellId != 25) && (cellId != 23) && (cellId != 14) && (cellId != 1) && (cellId != 31))
3148 || (var6 != 0)) {
3149 if ((cellId != 26) && (cellId != 24) && (cellId != 15) && (cellId != 5) && (cellId != 4))
3150 _headingRightFl = false;
3151 else if ((var6 <= 0) || (di != 0)) // useless, skipped: "|| (var6 == 0)"
3152 _headingRightFl = false;
3153 else
3154 _headingRightFl = true;
3155 } else
3156 _headingRightFl = true;
3157 default:
3158 break;
3159 }
3160 }
3161 // fall through
3162 case 2: {
3163 scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
3164 scene->_tunnelVertCircle._moveDiff.x = 160 - scene->_mazeChangeAmount;
3165 scene->_moverVertX = 160 - ((_direction * 2) * 160);
3166 Common::Point pt(scene->_moverVertX, 73);
3167 NpcMover *mover = new NpcMover();
3168 scene->_tunnelVertCircle.addMover(mover, &pt, this);
3169
3170 scene->_tunnelHorzCircle.setPosition(Common::Point(160 + ((_direction * 2) * 160), 73));
3171 scene->_tunnelHorzCircle._moveDiff.x = 160 - scene->_mazeChangeAmount;
3172 scene->_moverHorzX = 160;
3173 Common::Point pt2(scene->_moverHorzX, 73);
3174 NpcMover *mover2 = new NpcMover();
3175 scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
3176 }
3177 break;
3178 case 5:
3179 scene->_shuttle._frameChange = _direction;
3180 scene->_mazeDirection = scene->_shuttle.changeFrame();
3181 scene->_shuttle.setFrame(scene->_mazeDirection);
3182 setDelay(1);
3183 break;
3184 case 6:
3185 scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
3186 if (!_headingRightFl)
3187 scene->_tunnelVertCircle.setStrip(1);
3188 else
3189 scene->_tunnelVertCircle.setStrip(2);
3190 scene->_tunnelVertCircle.fixPriority(1);
3191
3192 scene->_tunnelHorzCircle.setPosition(Common::Point(-160, 73));
3193 scene->_tunnelHorzCircle.setStrip(9);
3194 scene->_tunnelHorzCircle.fixPriority(11);
3195 scene->_tunnelHorzCircle.hide();
3196 setDelay(1);
3197 break;
3198 case 7:
3199 if ((scene->_shuttle._frame % 2) == 0) {
3200 scene->_shuttle._frameChange = _direction;
3201 scene->_mazeDirection = scene->_shuttle.changeFrame();
3202 scene->_shuttle.setFrame(scene->_mazeDirection);
3203 }
3204 setDelay(1);
3205 break;
3206 case 8: {
3207 R2_GLOBALS._player.enableControl();
3208 R2_GLOBALS._player._canWalk = false;
3209 scene->_directionChangesEnabled = true;
3210 if ((scene->_shuttle._frame % 2) == 0) {
3211 scene->_shuttle._frameChange = _direction;
3212 scene->_shuttle.setFrame(scene->_shuttle.changeFrame());
3213 }
3214 // CHECKME: All the var_8 initialization was missing in the original
3215 // but it's clearly a cut and paste error from case 4.
3216 // The following code allows the switch to work properly.
3217 int var_8 = (_direction * 2 + scene->_mazeDirection);
3218 if (var_8 > 7)
3219 var_8 = 1;
3220 else if (var_8 < 1)
3221 var_8 = 7;
3222 //
3223
3224 switch (var_8 - 1) {
3225 case 0:
3226 // No break on purpose
3227 case 4:
3228 scene->_mazePosition.x = scene->_mazeUI.cellFromX(scene->_mazePosition.x + 70) - 70;
3229 break;
3230 case 2:
3231 // No break on purpose
3232 case 6:
3233 scene->_mazePosition.y = scene->_mazeUI.cellFromY(scene->_mazePosition.y + 46) - 46;
3234 break;
3235 default:
3236 break;
3237 }
3238 scene->_symbolLeft.hide();
3239 scene->_symbolRight.hide();
3240 _turningFl = false;
3241 if (!_headingRightFl) {
3242 scene->_throttle.updateSpeed();
3243 if (scene->_mazeChangeAmount == scene->_speed)
3244 scene->_aSound1.play(276);
3245 }
3246 break;
3247 }
3248 case 10: {
3249 scene->_moverVertX = 160;
3250 Common::Point pt(160, 73);
3251 NpcMover *mover = new NpcMover();
3252 scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
3253
3254 scene->_moverHorzX = 160 - (_direction * 2 * 160);
3255 Common::Point pt2(scene->_moverHorzX, 73);
3256 NpcMover *mover2 = new NpcMover();
3257 scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
3258 _actionIndex = 6;
3259 }
3260 break;
3261 case 11: {
3262 scene->_tunnelVertCircle.setStrip(2);
3263 scene->_tunnelVertCircle.setPosition(Common::Point(160, 73));
3264 scene->_moverVertX = 160 - (_direction * 2 * 160);
3265 Common::Point pt(scene->_moverVertX, 73);
3266 NpcMover *mover = new NpcMover();
3267 scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
3268 scene->_tunnelVertCircle.fixPriority(11);
3269 if (!_headingRightFl)
3270 scene->_tunnelHorzCircle.setStrip(1);
3271 else
3272 scene->_tunnelHorzCircle.setStrip(2);
3273 scene->_tunnelHorzCircle.setPosition(Common::Point(160 - (_direction * 2 * 160), 73));
3274 scene->_moverHorzX = 160;
3275 Common::Point pt2(scene->_moverHorzX, 73);
3276 NpcMover *mover2 = new NpcMover();
3277 scene->_tunnelHorzCircle.addMover(mover2, &pt2, this);
3278 scene->_tunnelHorzCircle.fixPriority(1);
3279 _actionIndex = 5;
3280 }
3281 break;
3282 default:
3283 break;
3284 }
3285 }
3286
dispatch()3287 void Scene3500::Action1::dispatch() {
3288 Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3289
3290 Action::dispatch();
3291 if ((_actionIndex == 1) && (scene->_mazeChangeAmount <= 4)) {
3292 scene->_rotation->_idxChange = 0;
3293 signal();
3294 }
3295 }
3296
3297 /*--------------------------------------------------------------------------*/
3298
Action2()3299 Scene3500::Action2::Action2() {
3300 _direction = 0;
3301 }
3302
synchronize(Serializer & s)3303 void Scene3500::Action2::synchronize(Serializer &s) {
3304 Action::synchronize(s);
3305
3306 s.syncAsSint16LE(_direction);
3307 }
3308
handleVertButton(int direction)3309 void Scene3500::Action2::handleVertButton(int direction) {
3310 Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3311
3312 // Directions : 2 == up, -1 == down
3313 _direction = direction;
3314 if (_direction == -1)
3315 scene->_horizontalSpeedDisplay.setFrame2(3);
3316 else
3317 scene->_horizontalSpeedDisplay.setFrame2(1);
3318
3319 setActionIndex(0);
3320 }
3321
signal()3322 void Scene3500::Action2::signal() {
3323 Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3324
3325 int vertX;
3326 int horzX;
3327
3328 switch (_actionIndex++) {
3329 case 0: {
3330 if (scene->_tunnelVertCircle._mover) {
3331 vertX = scene->_moverVertX;
3332 horzX = scene->_moverHorzX;
3333 } else {
3334 scene->_moverVertX = scene->_tunnelVertCircle._position.x;
3335 vertX = scene->_moverVertX;
3336 scene->_moverHorzX = scene->_tunnelHorzCircle._position.y;
3337 horzX = scene->_moverHorzX;
3338 }
3339
3340 scene->_tunnelVertCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
3341 Common::Point pt(vertX, 73 - (_direction * 12));
3342 NpcMover *mover = new NpcMover();
3343 scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
3344
3345 scene->_tunnelHorzCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
3346 Common::Point pt2(horzX, 73 - (_direction * 12));
3347 NpcMover *mover2 = new NpcMover();
3348 scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
3349 scene->_mazeChangeAmount = (scene->_mazeChangeAmount / 2) + (scene->_mazeChangeAmount % 2);
3350 setDelay(17 - scene->_mazeChangeAmount);
3351 }
3352 break;
3353 case 1: {
3354 R2_GLOBALS._sound2.play(339);
3355 if (scene->_tunnelVertCircle._mover) {
3356 vertX = scene->_moverVertX;
3357 horzX = scene->_moverHorzX;
3358 } else {
3359 vertX = scene->_tunnelVertCircle._position.x;
3360 horzX = scene->_tunnelHorzCircle._position.x;
3361 }
3362
3363 scene->_throttle.updateSpeed();
3364
3365 scene->_tunnelVertCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
3366 Common::Point pt(vertX, 73);
3367 NpcMover *mover = new NpcMover();
3368 scene->_tunnelVertCircle.addMover(mover, &pt, NULL);
3369
3370 scene->_tunnelHorzCircle._moveDiff.y = 9 - (scene->_mazeChangeAmount / 2);
3371 Common::Point pt2(horzX, 73);
3372 NpcMover *mover2 = new NpcMover();
3373 scene->_tunnelHorzCircle.addMover(mover2, &pt2, NULL);
3374
3375 scene->_horizontalSpeedDisplay.setFrame2(2);
3376 }
3377 break;
3378 default:
3379 break;
3380 }
3381 }
3382
3383 /*--------------------------------------------------------------------------*/
3384
DirectionButton()3385 Scene3500::DirectionButton::DirectionButton() {
3386 _movementId = 0;
3387 }
3388
synchronize(Serializer & s)3389 void Scene3500::DirectionButton::synchronize(Serializer &s) {
3390 NamedHotspot::synchronize(s);
3391
3392 s.syncAsSint16LE(_movementId);
3393 }
3394
startAction(CursorType action,Event & event)3395 bool Scene3500::DirectionButton::startAction(CursorType action, Event &event) {
3396 Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3397
3398 if (!scene->_directionChangesEnabled) {
3399 return true;
3400 } else if (action == CURSOR_USE) {
3401 R2_GLOBALS._sound2.play(14, nullptr, 63);
3402 scene->doMovement(_movementId);
3403 return true;
3404 } else {
3405 return SceneHotspot::startAction(action, event);
3406 }
3407 }
3408
3409 /*--------------------------------------------------------------------------*/
3410
Throttle()3411 Scene3500::Throttle::Throttle() {
3412 _deltaX = 1;
3413 _deltaY = 0;
3414 _slideDeltaY = 0;
3415 _deltaMouseY = 0;
3416 }
3417
synchronize(Serializer & s)3418 void Scene3500::Throttle::synchronize(Serializer &s) {
3419 SceneActor::synchronize(s);
3420
3421 s.syncAsSint16LE(_pos.x);
3422 s.syncAsSint16LE(_pos.y);
3423 s.syncAsSint16LE(_deltaX);
3424 s.syncAsSint16LE(_deltaY);
3425 s.syncAsSint16LE(_slideDeltaY);
3426 s.syncAsSint16LE(_deltaMouseY);
3427 }
3428
init(int xp,int yp,int dx,int dy,int speed)3429 void Scene3500::Throttle::init(int xp, int yp, int dx, int dy, int speed) {
3430 _deltaMouseY = 0;
3431 _pos = Common::Point(xp, yp);
3432 _deltaX = dx;
3433 _deltaY = dy;
3434 _slideDeltaY = _deltaY / _deltaX;
3435
3436 postInit();
3437 setup(1050, 3, 1);
3438 fixPriority(255);
3439 setSpeed(speed);
3440 }
3441
updateSpeed()3442 void Scene3500::Throttle::updateSpeed() {
3443 Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3444
3445 scene->_speed = _position.x - _pos.x;
3446 }
3447
setSpeed(int arg1)3448 void Scene3500::Throttle::setSpeed(int arg1){
3449 changePosition(Common::Point(_pos.x + arg1, _pos.y - (_slideDeltaY * arg1)));
3450 }
3451
changePosition(const Common::Point & pt)3452 void Scene3500::Throttle::changePosition(const Common::Point &pt) {
3453 setPosition(pt);
3454 }
3455
process(Event & event)3456 void Scene3500::Throttle::process(Event &event) {
3457 Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3458
3459 if (!scene->_directionChangesEnabled)
3460 return;
3461
3462 if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) && (_bounds.contains(event.mousePos))) {
3463 _deltaMouseY = 1 + event.mousePos.y - _position.y;
3464 event.eventType = EVENT_NONE;
3465 }
3466
3467 if ((event.eventType == EVENT_BUTTON_UP) && (_deltaMouseY != 0)) {
3468 _deltaMouseY = 0;
3469 event.handled = true;
3470 if (!scene->_action1._turningFl)
3471 updateSpeed();
3472 }
3473
3474 if (_deltaMouseY == 0)
3475 return;
3476
3477 R2_GLOBALS._sound2.play(338);
3478 event.handled = true;
3479
3480 int cx = event.mousePos.y - _deltaMouseY + 1;
3481 if (_pos.y >= cx) {
3482 if (_pos.y - _deltaY <= cx)
3483 changePosition(Common::Point(((_pos.y - cx) / 2) + _pos.x + ((_pos.y - cx) % 2), cx));
3484 else
3485 changePosition(Common::Point(_pos.x + _deltaX, _pos.y - _deltaY));
3486 } else {
3487 changePosition(Common::Point(_pos.x, _pos.y));
3488 }
3489 }
3490
startAction(CursorType action,Event & event)3491 bool Scene3500::Throttle::startAction(CursorType action, Event &event) {
3492 Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;
3493
3494 if (!scene->_directionChangesEnabled) {
3495 return true;
3496 } else if (action == CURSOR_USE) {
3497 return false;
3498 } else {
3499 return SceneActor::startAction(action, event);
3500 }
3501 }
3502
3503 /*--------------------------------------------------------------------------*/
3504
cellFromX(int x)3505 int16 Scene3500::MazeUI3500::cellFromX(int x) {
3506 return (_cellSize.x / 2) + x - (x % _cellSize.x);
3507 }
3508
cellFromY(int y)3509 int16 Scene3500::MazeUI3500::cellFromY(int y) {
3510 return (_cellSize.y / 2) + y - (y % _cellSize.y) - 1;
3511 }
3512
getCellFromMapXY(Common::Point pt)3513 int Scene3500::MazeUI3500::getCellFromMapXY(Common::Point pt) {
3514 int cellX = pt.x / _cellSize.x;
3515 int cellY = pt.y / _cellSize.y;
3516
3517 if ((cellX >= 0) && (cellY >= 0) && (cellX < _mapCells.x) && (cellY < _mapCells.y)) {
3518 return (int16)READ_LE_UINT16(_mapData + (_mapCells.x * cellY + cellX) * 2);
3519 } else
3520 return -1;
3521 }
3522
setMazePosition2(Common::Point & p)3523 bool Scene3500::MazeUI3500::setMazePosition2(Common::Point &p) {
3524 bool retVal = setMazePosition(p);
3525 p = _mapOffset;
3526
3527 return retVal;
3528 }
3529
3530 /*--------------------------------------------------------------------------*/
3531
Scene3500()3532 Scene3500::Scene3500() {
3533 _moverVertX = 0;
3534 _moverHorzX = 0;
3535 _rotation = NULL;
3536 _mazeChangeAmount = 0;
3537 _speed = 0;
3538 _updateIdxChangeFl = false;
3539 _mazeDirection = MAZEDIR_NONE;
3540 _nextMove = 0;
3541 _mazePosition.x = 0;
3542 _mazePosition.y = 0;
3543 _postFixupFl = true; // Set to true in fixup()
3544 _exitCounter = 0;
3545 _directionChangesEnabled = false;
3546 }
3547
synchronize(Serializer & s)3548 void Scene3500::synchronize(Serializer &s) {
3549 SceneExt::synchronize(s);
3550 SYNC_POINTER(_rotation);
3551
3552 s.syncAsSint16LE(_moverVertX);
3553 s.syncAsSint16LE(_moverHorzX);
3554 s.syncAsSint16LE(_mazeChangeAmount);
3555 s.syncAsSint16LE(_speed);
3556 s.syncAsSint16LE(_updateIdxChangeFl);
3557 s.syncAsSint16LE(_mazeDirection);
3558 s.syncAsSint16LE(_nextMove);
3559 s.syncAsSint16LE(_mazePosition.x);
3560 s.syncAsSint16LE(_mazePosition.y);
3561 s.syncAsSint16LE(_postFixupFl);
3562 s.syncAsSint16LE(_exitCounter);
3563 s.syncAsSint16LE(_directionChangesEnabled);
3564 }
3565
postInit(SceneObjectList * OwnerList)3566 void Scene3500::postInit(SceneObjectList *OwnerList) {
3567 byte tmpPal[768];
3568
3569 loadScene(1050);
3570 R2_GLOBALS._uiElements._active = false;
3571 R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
3572
3573 R2_GLOBALS._sound1.play(305);
3574 R2_GLOBALS._player._characterIndex = R2_QUINN;
3575 R2_GLOBALS._player._characterScene[R2_QUINN] = 3500;
3576 R2_GLOBALS._player._characterScene[R2_SEEKER] = 3500;
3577 R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3500;
3578 _exitCounter = 0;
3579 _postFixupFl = false;
3580 _nextMove = 0;
3581 _updateIdxChangeFl = true;
3582 _speed = 4;
3583 _mazeChangeAmount = 4;
3584 _mazePosition = Common::Point(860, 891);
3585 _rotation = R2_GLOBALS._scenePalette.addRotation(240, 254, -1);
3586 _rotation->setDelay(0);
3587 _rotation->_idxChange = 1;
3588
3589 for (int i = 240; i <= 254; i++) {
3590 int tmpIndex = _rotation->_currIndex - 240;
3591
3592 if (tmpIndex > 254)
3593 tmpIndex--;
3594
3595 tmpPal[3 * i] = R2_GLOBALS._scenePalette._palette[3 * tmpIndex];
3596 tmpPal[(3 * i) + 1] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 1];
3597 tmpPal[(3 * i) + 2] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 2];
3598 }
3599
3600 for (int i = 240; i <= 254; i++) {
3601 R2_GLOBALS._scenePalette._palette[3 * i] = tmpPal[3 * i];
3602 R2_GLOBALS._scenePalette._palette[(3 * i) + 1] = tmpPal[(3 * i) + 1];
3603 R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2];
3604 }
3605
3606 _throttle.init(38, 165, 16, 32, _speed);
3607 _throttle.setDetails(3500, 6, 7, -1, 1, (SceneItem *)NULL);
3608 R2_GLOBALS._sound1.play(276);
3609
3610 _pitchDown._movementId = 88;
3611 _pitchDown.setDetails(88, 3500, 18, 10, -1);
3612
3613 _turnLeft._movementId = 112;
3614 _turnLeft.setDetails(112, 3500, 9, 10, -1);
3615
3616 _pitchUp._movementId = 104;
3617 _pitchUp.setDetails(104, 3500, 15, 10, -1);
3618
3619 _turnRight._movementId = 96;
3620 _turnRight.setDetails(96, 3500, 12, 10, -1);
3621
3622 _tunnelVertCircle.postInit();
3623 _tunnelVertCircle.setup(1050, 1, 1);
3624 _tunnelVertCircle.setPosition(Common::Point(160, 73));
3625 _tunnelVertCircle.fixPriority(1);
3626
3627 _tunnelHorzCircle.postInit();
3628 _tunnelHorzCircle.setup(1050, 2, 1);
3629 _tunnelHorzCircle.setPosition(Common::Point(-160, 73));
3630 _tunnelHorzCircle.fixPriority(11);
3631 _tunnelHorzCircle.hide();
3632
3633 _outsideView.setDetails(27, 3500, 21, -1, -1);
3634 _mapScreen.setDetails(Rect(160, 89, 299, 182), 3500, 3, -1, -1, 1, NULL);
3635 _background.setDetails(Rect(0, 0, 320, 200), 3500, 0, -1, 2, 1, NULL);
3636
3637 _shuttle.postInit();
3638 _mazeDirection = MAZEDIR_NORTH;
3639 _shuttle.setup(1004, 1, _mazeDirection);
3640 _shuttle.setPosition(Common::Point(230, 135));
3641 _shuttle.fixPriority(200);
3642 _shuttle._frameChange = 1;
3643
3644 _symbolLeft.postInit();
3645 _symbolLeft.setup(1004, 3, 1);
3646 _symbolLeft.setPosition(Common::Point(117, 163));
3647 _symbolLeft.fixPriority(200);
3648 _symbolLeft.hide();
3649
3650 _symbolVertical.postInit();
3651 _symbolVertical.setup(1004, 3, 2);
3652 _symbolVertical.setPosition(Common::Point(126, 163));
3653 _symbolVertical.fixPriority(200);
3654
3655 _symbolRight.postInit();
3656 _symbolRight.setup(1004, 3, 3);
3657 _symbolRight.setPosition(Common::Point(135, 163));
3658 _symbolRight.fixPriority(200);
3659 _symbolRight.hide();
3660
3661 _verticalSpeedDisplay.postInit();
3662 _verticalSpeedDisplay.setup(1004, 4, _mazeChangeAmount + 1);
3663 _verticalSpeedDisplay.setPosition(Common::Point(126, 137));
3664 _verticalSpeedDisplay.fixPriority(200);
3665
3666 _horizontalSpeedDisplay.postInit();
3667 _horizontalSpeedDisplay.setup(1004, 5, 2);
3668 _horizontalSpeedDisplay.setPosition(Common::Point(126, 108));
3669 _horizontalSpeedDisplay.fixPriority(200);
3670
3671 _action1._turningFl = false;
3672
3673 _mazeUI.postInit();
3674 _mazeUI.setDisplayBounds(Rect(160, 89, 299, 182));
3675 _mazeUI.load(2);
3676 _mazeUI.setMazePosition(_mazePosition);
3677 _mazeUI.draw();
3678 _directionChangesEnabled = true;
3679
3680 R2_GLOBALS._player.postInit();
3681 R2_GLOBALS._player.hide();
3682 R2_GLOBALS._player.enableControl(CURSOR_USE);
3683 R2_GLOBALS._player._uiEnabled = false;
3684 R2_GLOBALS._player._canWalk = false;
3685 }
3686
doMovement(int id)3687 void Scene3500::doMovement(int id) {
3688 switch (id) {
3689 case -1:
3690 _throttle.updateSpeed();
3691 if (_speed != 0) {
3692 _speed--;
3693 _throttle.setSpeed(_speed);
3694 }
3695 if (_action1._turningFl)
3696 _speed = 0;
3697 break;
3698 case 1:
3699 _throttle.updateSpeed();
3700 if (_speed < 16) {
3701 ++_speed;
3702 _throttle.setSpeed(_speed);
3703 }
3704 if (_action1._turningFl)
3705 _speed = 0;
3706 break;
3707 case 88:
3708 // Up button has been pressed
3709 // The original was doing a double check on action, only one is here.
3710 if (!_action || (!_action1._turningFl)) {
3711 _action2.handleVertButton(2);
3712 if (_action && ((_action2.getActionIndex() != 0) || (_action2._direction != 2))) {
3713 _action2.signal();
3714 } else {
3715 _tunnelHorzCircle.setAction(&_action2, &_tunnelHorzCircle, NULL);
3716 }
3717 }
3718 break;
3719 case 96:
3720 // Right button has been pressed
3721 if (!_action || !_action1._turningFl || (_action1._direction == 1)) {
3722 if (_action && (_nextMove == 0) && (_action1._turningFl)) {
3723 _nextMove = id;
3724 } else if (_action && (!_action1._turningFl)) {
3725 _action1.handleHorzButton(1);
3726 _action1.signal();
3727 } else if (!_action) {
3728 _action1.handleHorzButton(1);
3729 setAction(&_action1, &_shuttle, NULL);
3730 }
3731
3732 } else {
3733 if (_nextMove != 0)
3734 _nextMove = 0;
3735
3736 _action1.turnShuttle(false);
3737 }
3738 break;
3739 case 104:
3740 // Down button has been pressed
3741 if (!_action || (!_action1._turningFl)) {
3742 _action2.handleVertButton(-1);
3743 if ((_action) && ((_action2.getActionIndex() != 0) || (_action2._direction != -1))) {
3744 _action2.signal();
3745 } else {
3746 _tunnelHorzCircle.setAction(&_action2, &_tunnelHorzCircle, NULL);
3747 }
3748 }
3749 break;
3750 case 112:
3751 // Left button has been pressed
3752 if (!_action || !_action1._turningFl || (_action1._direction == 1)) {
3753 if (_action && (_nextMove == 0) && (_action1._turningFl)) {
3754 _nextMove = id;
3755 } else if (_action && (!_action1._turningFl)) {
3756 _action1.handleHorzButton(-1);
3757 _action1.signal();
3758 } else if (!_action) {
3759 _action1.handleHorzButton(-1);
3760 setAction(&_action1, &_shuttle, NULL);
3761 }
3762
3763 } else {
3764 if (_nextMove != 0)
3765 _nextMove = 0;
3766
3767 _action1.turnShuttle(false);
3768 }
3769 break;
3770 default:
3771 _speed = id;
3772 _throttle.setSpeed(id);
3773 if (_action1._turningFl) {
3774 _speed = 0;
3775 }
3776 break;
3777 }
3778 }
3779
remove()3780 void Scene3500::remove() {
3781 R2_GLOBALS._sound2.fadeOut2(NULL);
3782 SceneExt::remove();
3783 }
3784
signal()3785 void Scene3500::signal() {
3786 R2_GLOBALS._player.enableControl(CURSOR_USE);
3787 R2_GLOBALS._player._canWalk = false;
3788 _directionChangesEnabled = true;
3789 }
3790
process(Event & event)3791 void Scene3500::process(Event &event) {
3792 if (!_directionChangesEnabled)
3793 return;
3794
3795 if (event.eventType == EVENT_KEYPRESS) {
3796 switch (event.kbd.keycode) {
3797 case Common::KEYCODE_KP7:
3798 R2_GLOBALS._sound2.play(338);
3799 doMovement(16);
3800 event.handled = true;
3801 break;
3802 case Common::KEYCODE_UP:
3803 case Common::KEYCODE_KP8:
3804 R2_GLOBALS._sound2.play(14, NULL, 63);
3805 doMovement(88);
3806 event.handled = true;
3807 break;
3808 case Common::KEYCODE_KP9:
3809 if (_speed < 16)
3810 R2_GLOBALS._sound2.play(338);
3811 doMovement(1);
3812 event.handled = true;
3813 break;
3814 case Common::KEYCODE_KP4:
3815 case Common::KEYCODE_LEFT:
3816 R2_GLOBALS._sound2.play(14, NULL, 63);
3817 doMovement(112);
3818 event.handled = true;
3819 break;
3820 case Common::KEYCODE_KP6:
3821 case Common::KEYCODE_RIGHT:
3822 R2_GLOBALS._sound2.play(14, NULL, 63);
3823 doMovement(96);
3824 event.handled = true;
3825 break;
3826 case Common::KEYCODE_KP1:
3827 R2_GLOBALS._sound2.play(338);
3828 doMovement(0);
3829 event.handled = true;
3830 break;
3831 case Common::KEYCODE_KP2:
3832 case Common::KEYCODE_DOWN:
3833 R2_GLOBALS._sound2.play(14, NULL, 63);
3834 doMovement(104);
3835 event.handled = true;
3836 break;
3837 case Common::KEYCODE_KP3:
3838 if (_speed != 0)
3839 R2_GLOBALS._sound2.play(338);
3840 doMovement(-1);
3841 event.handled = true;
3842 break;
3843 case Common::KEYCODE_KP0:
3844 R2_GLOBALS._sound2.play(338);
3845 doMovement(8);
3846 event.handled = true;
3847 break;
3848 case Common::KEYCODE_KP_PERIOD:
3849 R2_GLOBALS._sound2.play(338);
3850 doMovement(4);
3851 event.handled = true;
3852 break;
3853 default:
3854 break;
3855 }
3856 }
3857
3858 if (!event.handled)
3859 _throttle.process(event);
3860
3861 if (!event.handled)
3862 _pitchDown.process(event);
3863
3864 if (!event.handled)
3865 _turnLeft.process(event);
3866
3867 if (!event.handled)
3868 _pitchUp.process(event);
3869
3870 if (!event.handled)
3871 _turnRight.process(event);
3872
3873 Scene::process(event);
3874 }
3875
dispatch()3876 void Scene3500::dispatch() {
3877 Rect tmpRect;
3878 Scene::dispatch();
3879
3880 // WORKAROUND: The _mazeUI wasn't originally added to the scene in postInit.
3881 // This is only needed to fix old savegames
3882 if (!R2_GLOBALS._sceneObjects->contains(&_mazeUI))
3883 _mazeUI.draw();
3884
3885 if (((_shuttle._frame % 2) == 0) && (!_action1._turningFl)) {
3886 _shuttle.setFrame(_shuttle.changeFrame());
3887 _mazeDirection = _shuttle._frame;
3888 }
3889
3890 if ((_nextMove != 0) && (!_action1._turningFl)) {
3891 int move = _nextMove;
3892 _nextMove = 0;
3893 doMovement(move);
3894 }
3895
3896 if (!_rotation)
3897 return;
3898
3899 int16 newMazeX = 0;
3900 int16 newMazeY = 0;
3901 int16 mazePosX = 0;
3902 int16 mazePosY = 0;
3903 int deltaX = 0;
3904 int deltaY = 0;
3905 int cellId = 0;
3906
3907 if ((_mazeChangeAmount == 0) && !_postFixupFl) {
3908 if (_exitCounter == 2)
3909 R2_GLOBALS._sceneManager.changeScene(1000);
3910 } else {
3911 _postFixupFl = false;
3912 tmpRect.set(160, 89, 299, 182);
3913
3914 newMazeX = _mazePosition.x;
3915 newMazeY = _mazePosition.y;
3916 mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
3917 mazePosY = _mazeUI.cellFromY(_mazePosition.y + 46) - 46;
3918 deltaX = abs(mazePosX - newMazeX);
3919 deltaY = abs(mazePosY - newMazeY);
3920 int tmpCellId = 0;
3921
3922 switch (_mazeDirection) {
3923 case MAZEDIR_NORTH:
3924 cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
3925 if (((cellId == 2) || (cellId == 3) || (cellId == 6) || (cellId == 1)) ||
3926 ((cellId == 25 || cellId == 26 || cellId == 5 || cellId == 14 || cellId == 15) && deltaX > 3)) {
3927 R2_GLOBALS._sound2.play(339);
3928 _rotation->_idxChange = 0;
3929 _speed = 0;
3930 _mazeChangeAmount = 0;
3931 _updateIdxChangeFl = false;
3932 if (!_action1._turningFl)
3933 _tunnelVertCircle.hide();
3934 } else {
3935 mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
3936 newMazeY = _mazePosition.y - _mazeChangeAmount;
3937 tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
3938 if (((cellId == 23) || (cellId == 24) || (cellId == 4)) && (cellId != tmpCellId)) {
3939 newMazeY = mazePosY;
3940 R2_GLOBALS._sound2.play(339);
3941 _rotation->_idxChange = 0;
3942 _speed = 0;
3943 _mazeChangeAmount = 0;
3944 _updateIdxChangeFl = false;
3945 if (!_action1._turningFl)
3946 _tunnelVertCircle.hide();
3947 } else if ((cellId == 11) && (cellId != tmpCellId)) {
3948 newMazeY = mazePosY + 3;
3949 R2_GLOBALS._sound2.play(339);
3950 _rotation->_idxChange = 0;
3951 _speed = 0;
3952 _mazeChangeAmount = 0;
3953 _updateIdxChangeFl = false;
3954 if (!_action1._turningFl)
3955 _tunnelVertCircle.hide();
3956 } else {
3957 mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
3958 deltaY = abs(mazePosY - newMazeY);
3959 cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
3960
3961 if ( (((cellId == 23) || (cellId == 24) || (cellId == 4)) && (newMazeY <= mazePosY) && (_mazePosition.y>= mazePosY))
3962 || (((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)) && (_mazeChangeAmount >= deltaY) && (_mazeChangeAmount > 3) && (_action1._turningFl != 0)) ) {
3963 newMazeY = mazePosY;
3964 if ((cellId != 25) && (cellId != 26) && (cellId != 5) && (cellId != 14) && (cellId != 15))
3965 R2_GLOBALS._sound2.play(339);
3966 _rotation->_idxChange = 0;
3967 _speed = 0;
3968 _mazeChangeAmount = 0;
3969 _updateIdxChangeFl = false;
3970 if (!_action1._turningFl)
3971 _tunnelVertCircle.hide();
3972 } else if ((cellId == 11) && (mazePosY + 3 >= newMazeY) && (_mazePosition.y >= mazePosY + 3)) {
3973 R2_GLOBALS._sound2.play(339);
3974 _rotation->_idxChange = 0;
3975 _speed = 0;
3976 _mazeChangeAmount = 0;
3977 _updateIdxChangeFl = false;
3978 if (!_action1._turningFl)
3979 _tunnelVertCircle.hide();
3980 } else if (((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)) && (deltaX != 0) && (deltaX <= 3)) {
3981 newMazeX = mazePosX;
3982 R2_GLOBALS._sound2.play(339);
3983 } else {
3984 // Nothing
3985 }
3986 }
3987 }
3988 break;
3989 case MAZEDIR_EAST:
3990 cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
3991 if ( ((cellId == 12) || (cellId == 13) || (cellId == 11) || (cellId == 16) || (cellId == 31))
3992 || (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (deltaY > 3)) ) {
3993 R2_GLOBALS._sound2.play(339);
3994 _rotation->_idxChange = 0;
3995 _speed = 0;
3996 _mazeChangeAmount = 0;
3997 _updateIdxChangeFl = false;
3998 if (!_action1._turningFl)
3999 _tunnelVertCircle.hide();
4000 } else {
4001 mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
4002 newMazeX = _mazePosition.x + _mazeChangeAmount;
4003 tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4004 if (((cellId == 26) || (cellId == 24) || (cellId == 15)) && (cellId != tmpCellId)) {
4005 newMazeX = mazePosX;
4006 R2_GLOBALS._sound2.play(339);
4007 _rotation->_idxChange = 0;
4008 _speed = 0;
4009 _mazeChangeAmount = 0;
4010 _updateIdxChangeFl = false;
4011 if (!_action1._turningFl)
4012 _tunnelVertCircle.hide();
4013 } else if ((cellId == 6) && (cellId != tmpCellId)) {
4014 newMazeX = mazePosX - 5;
4015 R2_GLOBALS._sound2.play(339);
4016 _rotation->_idxChange = 0;
4017 _speed = 0;
4018 _mazeChangeAmount = 0;
4019 _updateIdxChangeFl = false;
4020 if (!_action1._turningFl)
4021 _tunnelVertCircle.hide();
4022 } else {
4023 mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
4024 deltaX = abs(newMazeX - mazePosX);
4025 cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4026 if ( (((cellId == 26) || (cellId == 24) || (cellId == 15)) && (newMazeX >= mazePosX) && (_mazePosition.x <= mazePosX))
4027 || (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (_mazeChangeAmount >= deltaX) && (_mazeChangeAmount <= 3) && (_action1._turningFl != 0)) ) {
4028 newMazeX = mazePosX;
4029 if ((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4))
4030 R2_GLOBALS._sound2.play(339);
4031 _rotation->_idxChange = 0;
4032 _speed = 0;
4033 _mazeChangeAmount = 0;
4034 _updateIdxChangeFl = false;
4035 if (!_action1._turningFl)
4036 _tunnelVertCircle.hide();
4037 } else if ((cellId == 6) && (mazePosX - 5 <= newMazeX) && (_mazePosition.x <= mazePosX - 5)) {
4038 newMazeX = mazePosX - 5;
4039 R2_GLOBALS._sound2.play(339);
4040 _rotation->_idxChange = 0;
4041 _speed = 0;
4042 _mazeChangeAmount = 0;
4043 _updateIdxChangeFl = false;
4044 if (!_action1._turningFl)
4045 _tunnelVertCircle.hide();
4046 } else if (((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)) && (deltaY != 0) && (deltaY <= 3)) {
4047 newMazeY = mazePosY;
4048 R2_GLOBALS._sound2.play(339);
4049 } else {
4050 // Nothing
4051 }
4052 }
4053 }
4054 break;
4055 case MAZEDIR_SOUTH:
4056 cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4057 if ( ((cellId == 2) || (cellId == 3) || (cellId == 6) || (cellId == 1))
4058 || (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (deltaX > 3)) ) {
4059 R2_GLOBALS._sound2.play(339);
4060 _rotation->_idxChange = 0;
4061 _speed = 0;
4062 _mazeChangeAmount = 0;
4063 _updateIdxChangeFl = false;
4064 if (!_action1._turningFl)
4065 _tunnelVertCircle.hide();
4066 } else {
4067 mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
4068 newMazeY = _mazePosition.y + _mazeChangeAmount;
4069 tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4070
4071 if (((cellId == 25) || (cellId == 26) || (cellId == 5)) && (cellId != tmpCellId)) {
4072 R2_GLOBALS._sound2.play(339);
4073 _rotation->_idxChange = 0;
4074 _speed = 0;
4075 _mazeChangeAmount = 0;
4076 _updateIdxChangeFl = false;
4077 if (!_action1._turningFl)
4078 _tunnelVertCircle.hide();
4079 } else if ((cellId == 16) && (cellId != tmpCellId)) {
4080 newMazeY = mazePosY - 3;
4081 R2_GLOBALS._sound2.play(339);
4082 _rotation->_idxChange = 0;
4083 _speed = 0;
4084 _mazeChangeAmount = 0;
4085 _updateIdxChangeFl = false;
4086 if (!_action1._turningFl)
4087 _tunnelVertCircle.hide();
4088 } else if ((cellId == 31) && (cellId != tmpCellId)) {
4089 newMazeY = mazePosY + 4;
4090 R2_GLOBALS._sound2.play(339);
4091 _rotation->_idxChange = 0;
4092 _speed = 0;
4093 _mazeChangeAmount = 0;
4094 _updateIdxChangeFl = false;
4095 if (!_action1._turningFl)
4096 _tunnelVertCircle.hide();
4097 } else {
4098 mazePosY = _mazeUI.cellFromY(newMazeY + 46) - 46;
4099 deltaY = abs(newMazeY - mazePosY);
4100 cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4101 if ( (((cellId == 25) || (cellId == 26) || (cellId == 5)) && (newMazeY >= mazePosY) && (_mazePosition.y <= mazePosY))
4102 || (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (_mazeChangeAmount >= deltaY) && (_mazeChangeAmount <= 3) && (_action1._turningFl != 0)) ){
4103 newMazeY = mazePosY;
4104
4105 if ((cellId != 23) && (cellId != 24) && (cellId != 4) && (cellId != 14) && (cellId != 15))
4106 R2_GLOBALS._sound2.play(339);
4107 _rotation->_idxChange = 0;
4108 _speed = 0;
4109 _mazeChangeAmount = 0;
4110 _updateIdxChangeFl = false;
4111 if (!_action1._turningFl)
4112 _tunnelVertCircle.hide();
4113 } else if ((cellId == 16) && (mazePosY - 3 <= newMazeY) && (_mazePosition.y <= mazePosY - 3)) {
4114 newMazeY = mazePosY - 3;
4115 R2_GLOBALS._sound2.play(339);
4116 _rotation->_idxChange = 0;
4117 _speed = 0;
4118 _mazeChangeAmount = 0;
4119 _updateIdxChangeFl = false;
4120 if (!_action1._turningFl)
4121 _tunnelVertCircle.hide();
4122 } else if ((cellId == 31) && (mazePosY + 4 <= newMazeY) && (_mazePosition.y <= mazePosY + 4)) {
4123 newMazeY = mazePosY + 4;
4124 _rotation->_idxChange = 0;
4125 _speed = 0;
4126 _mazeChangeAmount = 0;
4127 _updateIdxChangeFl = false;
4128 if (!_action1._turningFl)
4129 _tunnelVertCircle.hide();
4130 if ((newMazeX == 660) && (_mazeChangeAmount + 306 <= newMazeY) && (newMazeY <= 307))
4131 ++_exitCounter;
4132 else
4133 R2_GLOBALS._sound2.play(339);
4134 } else if (((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)) && (deltaX != 0) && (deltaX <= 3)) {
4135 newMazeX = mazePosX;
4136 R2_GLOBALS._sound2.play(339);
4137 } else {
4138 // Nothing
4139 }
4140 }
4141 }
4142 break;
4143 case MAZEDIR_WEST:
4144 cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4145 if ( ((cellId == 12) || (cellId == 13) || (cellId == 11) || (cellId == 16) || (cellId == 31))
4146 || (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (deltaY > 3)) ) {
4147 R2_GLOBALS._sound2.play(339);
4148 _rotation->_idxChange = 0;
4149 _speed = 0;
4150 _mazeChangeAmount = 0;
4151 _updateIdxChangeFl = false;
4152 if (!_action1._turningFl)
4153 _tunnelVertCircle.hide();
4154 } else {
4155 mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
4156 newMazeX = _mazePosition.x - _mazeChangeAmount;
4157 tmpCellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4158 if (((cellId == 25) || (cellId == 23) || (cellId == 14)) && (cellId != tmpCellId)) {
4159 newMazeX = mazePosX;
4160 R2_GLOBALS._sound2.play(339);
4161 _rotation->_idxChange = 0;
4162 _speed = 0;
4163 _mazeChangeAmount = 0;
4164 _updateIdxChangeFl = false;
4165 if (!_action1._turningFl)
4166 _tunnelVertCircle.hide();
4167 } else if ((cellId == 1) && (cellId != tmpCellId)) {
4168 newMazeX = mazePosX + 5;
4169 R2_GLOBALS._sound2.play(339);
4170 _rotation->_idxChange = 0;
4171 _speed = 0;
4172 _mazeChangeAmount = 0;
4173 _updateIdxChangeFl = false;
4174 if (!_action1._turningFl)
4175 _tunnelVertCircle.hide();
4176 } else {
4177 mazePosX = _mazeUI.cellFromX(newMazeX + 70) - 70;
4178 deltaX = abs(mazePosX - newMazeX);
4179 cellId = _mazeUI.getCellFromMapXY(Common::Point(newMazeX + 70, newMazeY + 46));
4180 if ( (((cellId == 25) || (cellId == 23) || (cellId == 14)) && (newMazeX <= mazePosX) && (_mazePosition.x >= mazePosX))
4181 || (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (_mazeChangeAmount >= deltaX) && (_mazeChangeAmount <= 3) && (_action1._turningFl)) ) {
4182 newMazeX = mazePosX;
4183 if ((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4))
4184 R2_GLOBALS._sound2.play(339);
4185 _rotation->_idxChange = 0;
4186 _speed = 0;
4187 _mazeChangeAmount = 0;
4188 _updateIdxChangeFl = false;
4189 if (!_action1._turningFl)
4190 _tunnelVertCircle.hide();
4191 } else if ((cellId == 1) && (newMazeX >= mazePosX + 5) && (_mazePosition.x >= mazePosX + 5)) {
4192 newMazeX = mazePosX + 5;
4193 R2_GLOBALS._sound2.play(339);
4194 _rotation->_idxChange = 0;
4195 _speed = 0;
4196 _mazeChangeAmount = 0;
4197 _updateIdxChangeFl = false;
4198 if (!_action1._turningFl)
4199 _tunnelVertCircle.hide();
4200 } else if (((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4)) && (deltaY != 0) && (deltaY <= 3)) {
4201 newMazeY = mazePosY;
4202 R2_GLOBALS._sound2.play(339);
4203 } else {
4204 // Nothing
4205 }
4206 }
4207 }
4208 break;
4209 default:
4210 break;
4211 }
4212
4213 if (_exitCounter < 2) {
4214 _mazePosition.x = newMazeX;
4215 _mazePosition.y = newMazeY;
4216 if (_mazeUI.setMazePosition2(_mazePosition) != 0) {
4217 _updateIdxChangeFl = false;
4218 _mazeChangeAmount = 0;
4219 _speed = 0;
4220 _rotation->setDelay(0);
4221 _rotation->_idxChange = 0;
4222 }
4223
4224 if (_exitCounter != 0)
4225 ++_exitCounter;
4226 }
4227 }
4228
4229 if (!_updateIdxChangeFl) {
4230 if (_mazeChangeAmount != _speed) {
4231 if (_mazeChangeAmount >= _speed) {
4232 if (_mazeChangeAmount == 1) {
4233 if (_action1._turningFl) {
4234 if ( ((_mazeDirection == 1) && (deltaX == 0) && (deltaY != 0) && (deltaY <= 3) && ((cellId == 25) || (cellId == 26) || (cellId == 5) || (cellId == 14) || (cellId == 15)))
4235 || ((_mazeDirection == 3) && (deltaY == 0) && (deltaX != 0) && (deltaX <= 3) && ((cellId == 25) || (cellId == 23) || (cellId == 14) || (cellId == 5) || (cellId == 4)))
4236 || ((_mazeDirection == 5) && (deltaX == 0) && (deltaY != 0) && (deltaY <= 3) && ((cellId == 23) || (cellId == 24) || (cellId == 4) || (cellId == 14) || (cellId == 15)))
4237 || ((_mazeDirection == 7) && (deltaY == 0) && (deltaX != 0) && (deltaX <= 3) && ((cellId == 26) || (cellId == 24) || (cellId == 15) || (cellId == 5) || (cellId == 4))) ){
4238 _mazeChangeAmount = 1;
4239 } else
4240 _mazeChangeAmount--;
4241 } else
4242 _mazeChangeAmount--;
4243 } else
4244 _mazeChangeAmount--;
4245 } else
4246 ++_mazeChangeAmount;
4247 _updateIdxChangeFl = true;
4248 }
4249 _verticalSpeedDisplay.setFrame2(_mazeChangeAmount + 1);
4250 }
4251
4252 if (_updateIdxChangeFl) {
4253 if (_mazeChangeAmount == 0)
4254 _rotation->_idxChange = 0;
4255 else if (_mazeChangeAmount > 8)
4256 _rotation->_idxChange = 2;
4257 else
4258 _rotation->_idxChange = 1;
4259
4260 _updateIdxChangeFl = false;
4261 }
4262
4263 if (_mazeChangeAmount != 0) {
4264 R2_GLOBALS._player._uiEnabled = false;
4265 if (_mazeChangeAmount != _speed)
4266 _aSound1.play(276);
4267 } else {
4268 R2_GLOBALS._player._uiEnabled = true;
4269 _aSound1.fadeOut2(NULL);
4270 }
4271 }
4272
4273 /*--------------------------------------------------------------------------
4274 * Scene 3600 - Cutscene - walking at gunpoint
4275 *
4276 *--------------------------------------------------------------------------*/
4277
Scene3600()4278 Scene3600::Scene3600() {
4279 _tealDead = false;
4280 _lightEntered = false;
4281 _ghoulTeleported = false;
4282 }
synchronize(Serializer & s)4283 void Scene3600::synchronize(Serializer &s) {
4284 SceneExt::synchronize(s);
4285
4286 s.syncAsSint16LE(_tealDead);
4287 s.syncAsSint16LE(_lightEntered);
4288 s.syncAsSint16LE(_ghoulTeleported);
4289 }
4290
Action3600()4291 Scene3600::Action3600::Action3600() {
4292 _part2Fl = false;
4293 _fadePct = 0;
4294 }
4295
synchronize(Serializer & s)4296 void Scene3600::Action3600::synchronize(Serializer &s) {
4297 Action::synchronize(s);
4298
4299 s.syncAsSint16LE(_part2Fl);
4300 s.syncAsSint16LE(_fadePct);
4301 }
4302
signal()4303 void Scene3600::Action3600::signal() {
4304 Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
4305
4306 switch (_actionIndex) {
4307 case 0:
4308 ++_actionIndex;
4309 setDelay(60);
4310 break;
4311 case 1:
4312 if (!_part2Fl) {
4313 _part2Fl = true;
4314 scene->_steppingDisk.setAction(NULL);
4315 R2_GLOBALS._sound2.play(330, NULL, 0);
4316 R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
4317 }
4318
4319 setDelay(1);
4320 R2_GLOBALS._scenePalette.fade((const byte *)&scene->_palette1._palette, true, _fadePct);
4321 if (_fadePct > 0)
4322 _fadePct -= 2;
4323 break;
4324 case 2:
4325 R2_GLOBALS._sound2.stop();
4326 ++_actionIndex;
4327 setDelay(3);
4328 break;
4329 case 3:
4330 R2_GLOBALS._sound2.play(330, this, 0);
4331 R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
4332 _actionIndex = 1;
4333 break;
4334 default:
4335 break;
4336 }
4337 }
4338
signal()4339 void Scene3600::Action2::signal() {
4340 Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
4341
4342 switch (_actionIndex) {
4343 case 3621:
4344 R2_GLOBALS._events.proc1();
4345 R2_GLOBALS._player.enableControl();
4346 _actionIndex = 3619;
4347 scene->_protector._state = 0;
4348 // fall through
4349 case 3619: {
4350 ++_actionIndex;
4351 scene->_protector.setup(3127, 2, 1);
4352 scene->_protector.animate(ANIM_MODE_1, NULL);
4353 NpcMover *mover = new NpcMover();
4354 scene->_protector.addMover(mover, &scene->_protector._actorDestPos, scene);
4355 }
4356 break;
4357 default:
4358 _actionIndex = 3619;
4359 setDelay(360);
4360 break;
4361 }
4362 }
4363
startAction(CursorType action,Event & event)4364 bool Scene3600::LightShaft::startAction(CursorType action, Event &event) {
4365 Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
4366
4367 if ((action != CURSOR_USE) || !scene->_action1._part2Fl)
4368 return SceneItem::startAction(action, event);
4369
4370 R2_GLOBALS._walkRegions.enableRegion(2);
4371 R2_GLOBALS._walkRegions.enableRegion(7);
4372
4373 R2_GLOBALS._player.disableControl();
4374 scene->_sceneMode = 3624;
4375 scene->_quinn.setStrip2(-1);
4376 scene->_seeker.setStrip2(-1);
4377 scene->_miranda.setStrip2(-1);
4378 scene->_webbster.setStrip2(-1);
4379
4380 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
4381 R2_GLOBALS._player.setAction(&scene->_sequenceManager3, scene, 3611, &R2_GLOBALS._player, NULL);
4382 else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
4383 R2_GLOBALS._player.setAction(&scene->_sequenceManager4, scene, 3612, &R2_GLOBALS._player, NULL);
4384 else
4385 R2_GLOBALS._player.setAction(&scene->_sequenceManager2, scene, 3610, &R2_GLOBALS._player, NULL);
4386
4387 return true;
4388 }
4389
startAction(CursorType action,Event & event)4390 bool Scene3600::Protector::startAction(CursorType action, Event &event) {
4391 Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
4392
4393 switch(action) {
4394 case CURSOR_TALK:
4395 if (_action)
4396 return SceneActor::startAction(action, event);
4397
4398 scene->_protectorSpeaker._displayMode = 1;
4399 if (!R2_GLOBALS._player._mover)
4400 R2_GLOBALS._player.addMover(NULL);
4401 if (!scene->_quinn._mover)
4402 scene->_quinn.addMover(NULL);
4403 if (!scene->_seeker._mover)
4404 scene->_seeker.addMover(NULL);
4405 if (!scene->_miranda._mover)
4406 scene->_miranda.addMover(NULL);
4407 if (!scene->_webbster._mover)
4408 scene->_webbster.addMover(NULL);
4409
4410 setup(3127, 2, 1);
4411 scene->_sceneMode = 3327;
4412 scene->_stripManager.start(3327, scene);
4413
4414 return true;
4415 case R2_SONIC_STUNNER:
4416 // No break on purpose
4417 case R2_PHOTON_STUNNER:
4418 if (action == R2_SONIC_STUNNER)
4419 R2_GLOBALS._sound3.play(43);
4420 else
4421 R2_GLOBALS._sound3.play(99);
4422
4423 if (_state != 0) {
4424 _state = 1;
4425 setup(3128, 1, 1);
4426 addMover(NULL);
4427 }
4428 scene->_action2.setActionIndex(3621);
4429
4430 if (!_action)
4431 setAction(&scene->_action2, scene, NULL);
4432
4433 animate(ANIM_MODE_5, &scene->_action2);
4434 R2_GLOBALS._player.disableControl();
4435 return true;
4436 break;
4437 default:
4438 return SceneActor::startAction(action, event);
4439 break;
4440 }
4441 }
4442
postInit(SceneObjectList * OwnerList)4443 void Scene3600::postInit(SceneObjectList *OwnerList) {
4444 if (R2_GLOBALS._sceneManager._previousScene == 3600) {
4445 R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
4446 } else {
4447 R2_GLOBALS._scrollFollower = &_steppingDisk;
4448 _sceneBounds = Rect(160, 0, 480, 200);
4449 }
4450
4451 loadScene(3600);
4452 SceneExt::postInit();
4453
4454 _stripManager.setColors(60, 255);
4455 _stripManager.setFontNumber(3);
4456 _stripManager.addSpeaker(&_quinnSpeaker);
4457 _stripManager.addSpeaker(&_seekerSpeaker);
4458 _stripManager.addSpeaker(&_mirandaSpeaker);
4459 _stripManager.addSpeaker(&_tealSpeaker);
4460 _stripManager.addSpeaker(&_protectorSpeaker);
4461
4462 setZoomPercents(142, 80, 167, 105);
4463 R2_GLOBALS._player._characterScene[R2_QUINN] = 3600;
4464 R2_GLOBALS._player._characterScene[R2_SEEKER] = 3600;
4465 R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3600;
4466
4467 _console.setDetails(33, 3600, 6, -1, -1);
4468 _tapestry1.setDetails(Rect(3, 3, 22, 45), 3600, 9, -1, -1, 1, NULL);
4469 _tapestry2.setDetails(Rect(449, 3, 475, 45), 3600, 9, -1, -1, 1, NULL);
4470
4471 _quinn.postInit();
4472 _quinn._moveDiff = Common::Point(3, 2);
4473 _quinn.changeZoom(-1);
4474 _quinn._effect = EFFECT_SHADED;
4475
4476 if (R2_GLOBALS._player._characterIndex != R2_QUINN)
4477 _quinn.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);
4478
4479 _seeker.postInit();
4480 _seeker._numFrames = 7;
4481 _seeker._moveDiff = Common::Point(5, 3);
4482 _seeker.changeZoom(-1);
4483 _seeker._effect = EFFECT_SHADED;
4484
4485 if (R2_GLOBALS._player._characterIndex != R2_SEEKER)
4486 _seeker.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
4487
4488 _miranda.postInit();
4489 _miranda._moveDiff = Common::Point(3, 2);
4490 _miranda.changeZoom(-1);
4491 _miranda._effect = EFFECT_SHADED;
4492
4493 if (R2_GLOBALS._player._characterIndex != R2_MIRANDA)
4494 _miranda.setDetails(9003, 1, -1, -1, 1, (SceneItem *) NULL);
4495
4496 R2_GLOBALS._player.postInit();
4497 R2_GLOBALS._player.changeZoom(-1);
4498 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
4499 R2_GLOBALS._player.disableControl();
4500
4501 _webbster.postInit();
4502 _webbster._numFrames = 7;
4503 _webbster._moveDiff = Common::Point(5, 3);
4504 _webbster.changeZoom(-1);
4505 _webbster._effect = EFFECT_SHADED;
4506 _webbster.setDetails(3600, 27, -1, -1, 1, (SceneItem *) NULL);
4507
4508 _teal.postInit();
4509 _teal._numFrames = 7;
4510 _teal._moveDiff = Common::Point(3, 2);
4511 _teal.changeZoom(-1);
4512 _teal._effect = EFFECT_SHADED;
4513 _teal.setDetails(3600, 12, -1, -1, 1, (SceneItem *) NULL);
4514
4515 _palette1.loadPalette(0);
4516 _palette1.loadPalette(3601);
4517
4518 if (R2_GLOBALS._sceneManager._previousScene == 3600) {
4519 _lightShaft._sceneRegionId = 200;
4520 _lightShaft.setDetails(3600, 30, -1, -1, 5, &_webbster);
4521 _tealDead = true;
4522
4523 R2_GLOBALS._walkRegions.disableRegion(2);
4524 R2_GLOBALS._walkRegions.disableRegion(7);
4525 R2_GLOBALS._walkRegions.disableRegion(14);
4526 R2_GLOBALS._walkRegions.disableRegion(15);
4527 R2_GLOBALS._walkRegions.disableRegion(16);
4528
4529 _quinn.setup(10, 5, 11);
4530 _quinn.animate(ANIM_MODE_1, NULL);
4531
4532 _seeker.setup(20, 5, 11);
4533 _seeker.animate(ANIM_MODE_1, NULL);
4534
4535 _miranda.setup(30, 5, 11);
4536 _miranda.animate(ANIM_MODE_1, NULL);
4537
4538 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
4539 _quinn.setPosition(Common::Point(76, 148));
4540 _seeker.setPosition(Common::Point(134, 148));
4541 _miranda.setPosition(Common::Point(100, 148));
4542 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
4543 R2_GLOBALS._player.setup(20, _seeker._strip, 1);
4544 R2_GLOBALS._player.setPosition(_seeker._position);
4545 _seeker.hide();
4546 } else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
4547 _quinn.setPosition(Common::Point(110, 148));
4548 _seeker.setPosition(Common::Point(76, 148));
4549 _miranda.setPosition(Common::Point(134, 148));
4550 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4551 R2_GLOBALS._player.setup(30, _miranda._strip, 1);
4552 R2_GLOBALS._player.setPosition(_miranda._position);
4553 _miranda.hide();
4554 } else {
4555 _quinn.setPosition(Common::Point(134, 148));
4556 _seeker.setPosition(Common::Point(76, 148));
4557 _miranda.setPosition(Common::Point(110, 148));
4558 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4559 R2_GLOBALS._player.setup(10, _quinn._strip, 1);
4560 R2_GLOBALS._player.setPosition(_quinn._position);
4561 _quinn.hide();
4562 }
4563 _webbster.setPosition(Common::Point(47, 149));
4564 _webbster.setup(40, 1, 11);
4565 _webbster.animate(ANIM_MODE_1, NULL);
4566
4567 _teal.setPosition(Common::Point(367, 148));
4568 _teal.setup(3601, 7, 5);
4569
4570 if (!R2_GLOBALS.getFlag(71)) {
4571 _protector.postInit();
4572 _protector._state = 0;
4573 _protector._actorDestPos = Common::Point(226, 152);
4574 _protector._moveDiff = Common::Point(3, 2);
4575 _protector.setPosition(Common::Point(284, 152));
4576 _protector.setup(3127, 2, 1);
4577 _protector.changeZoom(-1);
4578 _protector.setDetails(3600, 15, -1, 17, 1, (SceneItem *) NULL);
4579 }
4580
4581 R2_GLOBALS._sound2.play(330);
4582 _consoleLights.postInit();
4583 _consoleLights.setPosition(Common::Point(84, 156));
4584 _consoleLights.fixPriority(158);
4585 _consoleLights.setup(3601, 5, 1);
4586 _consoleLights.animate(ANIM_MODE_2, NULL);
4587
4588 _action1._part2Fl = true;
4589 _action1._fadePct = 0;
4590 _action1.setActionIndex(1);
4591
4592 _consoleLights.setAction(&_action1);
4593 _sceneMode = 3623;
4594
4595 g_globals->_events.setCursor(CURSOR_ARROW);
4596 R2_GLOBALS._player.enableControl(CURSOR_WALK);
4597 } else {
4598 _tealDead = false;
4599
4600 R2_GLOBALS._walkRegions.disableRegion(17);
4601 R2_GLOBALS._walkRegions.disableRegion(18);
4602
4603 _quinn.setPosition(Common::Point(393, 148));
4604 _seeker.setPosition(Common::Point(364, 153));
4605 _miranda.setPosition(Common::Point(413, 164));
4606
4607 R2_GLOBALS._player.hide();
4608
4609 _webbster.setPosition(Common::Point(373, 164));
4610
4611 _teal.setup(3403, 8, 11);
4612 _teal.setPosition(Common::Point(403, 155));
4613
4614 _protector.setup(3403, 7, 1);
4615 _protector.setPosition(Common::Point(405, 155));
4616
4617 _steppingDisk.postInit();
4618 _steppingDisk.setup(3600, 2, 1);
4619 _steppingDisk.setPosition(Common::Point(403, 161));
4620 _steppingDisk.fixPriority(149);
4621 _steppingDisk.changeZoom(-1);
4622
4623 _action1._part2Fl = false;
4624 _action1._fadePct = 90;
4625
4626 _sceneMode = 3600;
4627 setAction(&_sequenceManager1, this, 3600, &_seeker, &_quinn, &_miranda,
4628 &_webbster, &_teal, &_steppingDisk, NULL);
4629 }
4630 _lightEntered = false;
4631 _ghoulTeleported = R2_GLOBALS.getFlag(71);
4632
4633 R2_GLOBALS._sound1.play(326);
4634 _background.setDetails(Rect(0, 0, 480, 200), 3600, 0, -1, -1, 1, NULL);
4635 }
4636
remove()4637 void Scene3600::remove() {
4638 _consoleLights.animate(ANIM_MODE_NONE, NULL);
4639 _consoleLights.setAction(NULL);
4640 R2_GLOBALS._sound2.fadeOut2(NULL);
4641 R2_GLOBALS._sound1.fadeOut2(NULL);
4642 R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
4643 SceneExt::remove();
4644 }
4645
signal()4646 void Scene3600::signal() {
4647 switch (_sceneMode) {
4648 case 3320:
4649 // Move to the console
4650 R2_GLOBALS._walkRegions.disableRegion(14);
4651 R2_GLOBALS._scrollFollower = &_seeker;
4652 _tealSpeaker._object1.hide();
4653 _teal.show();
4654 _teal.setStrip(2);
4655 if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
4656 _sceneMode = 3602;
4657 else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
4658 _sceneMode = 3603;
4659 else
4660 _sceneMode = 3601;
4661 setAction(&_sequenceManager1, this, _sceneMode, &_seeker, &_quinn,
4662 &_miranda, &_webbster, &_teal, NULL);
4663 break;
4664 case 3321:
4665 // Teal activates console
4666 R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
4667 _tealSpeaker.stopSpeaking();
4668 _teal.show();
4669 _teal.setStrip(1);
4670 _consoleLights.postInit();
4671 _sceneMode = 3604;
4672 setAction(&_sequenceManager1, this, _sceneMode, &_teal, &_consoleLights,
4673 &_quinn, &_seeker, &_miranda, &_webbster, NULL);
4674 break;
4675 case 3322:
4676 // Teal walks toward the teleport pod, the goule protector appears
4677 _quinnSpeaker.stopSpeaking();
4678 _quinnSpeaker._displayMode = 1;
4679 _tealSpeaker.stopSpeaking();
4680 _tealSpeaker._displayMode = 7;
4681 R2_GLOBALS._scrollFollower = &_teal;
4682 _sceneMode = 3605;
4683 setAction(&_sequenceManager1, this, _sceneMode, &_teal, &_protector, &_steppingDisk, NULL);
4684 break;
4685 case 3323:
4686 // Goule protector eats Teal guts then moves
4687
4688 if (!_tealDead)
4689 _tealDead = true;
4690 else {
4691 _protectorSpeaker.stopSpeaking();
4692 _protector.show();
4693 _protector.setup(3258, 6, 1);
4694
4695 _sceneMode = 3607;
4696 _protector.setAction(&_sequenceManager1, this, _sceneMode, &_protector, NULL);
4697
4698 _protectorSpeaker.stopSpeaking();
4699 _protectorSpeaker._displayMode = 1;
4700 _quinnSpeaker._displayMode = 1;
4701 _protector.show();
4702
4703 R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
4704 R2_GLOBALS._walkRegions.enableRegion(17);
4705 R2_GLOBALS._walkRegions.enableRegion(18);
4706 R2_GLOBALS._walkRegions.disableRegion(2);
4707 R2_GLOBALS._walkRegions.disableRegion(7);
4708 R2_GLOBALS._walkRegions.disableRegion(14);
4709 R2_GLOBALS._walkRegions.disableRegion(15);
4710 R2_GLOBALS._walkRegions.disableRegion(16);
4711
4712 _consoleLights.setAction(&_action1);
4713 }
4714 break;
4715 case 3324:
4716 // No break on purpose
4717 case 3607:
4718 g_globals->_events.setCursor(CURSOR_ARROW);
4719 R2_GLOBALS._player.enableControl(CURSOR_WALK);
4720 _protector.fixPriority(-1);
4721 _sceneMode = 3623;
4722 break;
4723 case 3327:
4724 g_globals->_events.setCursor(CURSOR_ARROW);
4725 R2_GLOBALS._player.enableControl(CURSOR_WALK);
4726 _sceneMode = 3623;
4727 break;
4728 case 3450:
4729 // Speech of Teal and Quinn
4730 R2_GLOBALS._sound1.stop();
4731 _protector3400.hide();
4732 _door3400.hide();
4733
4734 _sceneBounds = Rect(40, 0, SCREEN_WIDTH + 40, SCREEN_HEIGHT);
4735 setZoomPercents(142, 80, 167, 105);
4736 loadScene(3600);
4737 R2_GLOBALS._uiElements.show();
4738 _lightShaft._sceneRegionId = 200;
4739 _lightShaft.setDetails(3600, 30, -1, -1, 5, &_webbster);
4740
4741 _consoleLights.show();
4742 _quinn.show();
4743 _seeker.show();
4744 _miranda.show();
4745 _webbster.show();
4746 _teal.show();
4747
4748 _teal.setPosition(Common::Point(298, 151));
4749
4750 _protector.postInit();
4751 _protector._state = 0;
4752 _protector._actorDestPos = Common::Point(226, 152);
4753 _protector._moveDiff = Common::Point(5, 3);
4754 _protector.setup(3403, 7, 1);
4755 _protector.setPosition(Common::Point(405, 155));
4756 _protector.changeZoom(-1);
4757 _protector.addMover(NULL);
4758 _protector.animate(ANIM_MODE_NONE);
4759 _protector.hide();
4760 _protector.setDetails(3600, 15, -1, 17, 5, &_lightShaft);
4761
4762 _steppingDisk.setup(3600, 2, 1);
4763 _steppingDisk.setPosition(Common::Point(403, 161));
4764 _steppingDisk.fixPriority(149);
4765 _steppingDisk.changeZoom(-1);
4766 _steppingDisk.show();
4767
4768 _quinnSpeaker._displayMode = 2;
4769 _tealSpeaker._displayMode = 2;
4770
4771 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
4772 R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
4773 R2_GLOBALS._player.setup(20, _seeker._strip, 1);
4774 R2_GLOBALS._player.setPosition(_seeker._position);
4775 _seeker.hide();
4776 } else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
4777 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4778 R2_GLOBALS._player.setup(30, _miranda._strip, 1);
4779 R2_GLOBALS._player.setPosition(_miranda._position);
4780 _miranda.hide();
4781 } else {
4782 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
4783 R2_GLOBALS._player.setup(10, _quinn._strip, 1);
4784 R2_GLOBALS._player.setPosition(_quinn._position);
4785 _quinn.hide();
4786 }
4787 R2_GLOBALS._player.show();
4788 R2_GLOBALS._sound1.play(326);
4789 _sceneMode = 3322;
4790 _stripManager.start(3322, this);
4791 R2_GLOBALS._sound2.play(329);
4792 break;
4793 case 3600:
4794 // First speech by Teal
4795 _sceneMode = 3320;
4796 _stripManager.start(3320, this);
4797 break;
4798 case 3601:
4799 // No break on purpose
4800 case 3602:
4801 // No break on purpose
4802 case 3603:
4803 // Teal speech near the console
4804 R2_GLOBALS._walkRegions.disableRegion(2);
4805 R2_GLOBALS._walkRegions.disableRegion(7);
4806 _tealSpeaker._displayMode = 1;
4807 _sceneMode = 3321;
4808 _stripManager.start(3321, this);
4809 break;
4810 case 3604:
4811 // Goule Protector forces the door
4812 R2_GLOBALS._sound2.fadeOut2(NULL);
4813 R2_GLOBALS._sound1.stop();
4814 R2_GLOBALS._walkRegions.enableRegion(2);
4815 R2_GLOBALS._walkRegions.enableRegion(7);
4816
4817 _steppingDisk.hide();
4818 _consoleLights.hide();
4819 R2_GLOBALS._player.hide();
4820 _quinn.hide();
4821 _seeker.hide();
4822 _miranda.hide();
4823 _webbster.hide();
4824 _teal.hide();
4825
4826 _sceneBounds = Rect(60, 0, SCREEN_WIDTH + 60, SCREEN_HEIGHT);
4827 setZoomPercents(51, 46, 180, 200);
4828
4829 loadScene(3400);
4830 R2_GLOBALS._uiElements.show();
4831 _protector3400.postInit();
4832
4833 _steppingDisk.setup(3403, 1, 1);
4834 _steppingDisk.setPosition(Common::Point(190, 103));
4835 _steppingDisk.fixPriority(89);
4836 _steppingDisk.show();
4837
4838 _door3400.postInit();
4839 _door3400.setup(3400, 1, 6);
4840 _door3400.setPosition(Common::Point(236, 51));
4841 _door3400.fixPriority(51);
4842 R2_GLOBALS._scrollFollower = &_door3400;
4843
4844 R2_GLOBALS._sound1.play(323);
4845 _sceneMode = 3450;
4846 setAction(&_sequenceManager1, this, 3450, &_protector3400, &_door3400, NULL);
4847 break;
4848 case 3605:
4849 // Goule protector jumps on Teal
4850 _protector.setup(3258, 4, 1);
4851 _protector.setAction(&_sequenceManager1, this, 3606, &_teal, &_protector,
4852 &_steppingDisk, NULL);
4853 _sceneMode = 3323;
4854 _stripManager.start(3323, this);
4855
4856 break;
4857 case 3620:
4858 // No break on purpose
4859 case 3623:
4860 if ((_protector._position.x == 226) && (_protector._position.y == 152)
4861 && _action1._part2Fl && (_protector._visage == 3127) && (!R2_GLOBALS.getFlag(71))) {
4862 R2_GLOBALS._sound2.stop();
4863 R2_GLOBALS._sound2.play(331);
4864 R2_GLOBALS.setFlag(71);
4865 _sceneMode = 3626;
4866 setAction(&_sequenceManager1, this, 3626, &_protector, NULL);
4867 }
4868 break;
4869 case 3624:
4870 R2_GLOBALS._player.disableControl();
4871 if (_lightEntered && (_quinn._position.x == 229) && (_quinn._position.y == 154) && (_seeker._position.x == 181) && (_seeker._position.y == 154) && (_miranda._position.x == 207) && (_miranda._position.y == 154) && (_webbster._position.x == 155) && (_webbster._position.y == 154)) {
4872 R2_GLOBALS._sound2.stop();
4873 R2_GLOBALS._sound2.play(331);
4874 _sceneMode = 3625;
4875 setAction(&_sequenceManager1, this, 3625, &_quinn, &_seeker, &_miranda, &_webbster, NULL);
4876 }
4877 break;
4878 case 3625:
4879 R2_GLOBALS._sound2.stop();
4880 R2_GLOBALS._sceneManager.changeScene(3700);
4881 break;
4882 case 3626:
4883 _protector.setPosition(Common::Point(0, 0));
4884 _action1.setActionIndex(2);
4885 if (R2_GLOBALS._events.getCursor() > R2_LAST_INVENT) {
4886 R2_GLOBALS._events.setCursor(CURSOR_USE);
4887 R2_GLOBALS._player.enableControl(CURSOR_USE);
4888 } else {
4889 R2_GLOBALS._player.enableControl();
4890 }
4891 R2_GLOBALS._sound2.stop();
4892 _sceneMode = 3623;
4893 break;
4894 default:
4895 break;
4896 }
4897 }
4898
process(Event & event)4899 void Scene3600::process(Event &event) {
4900 if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_ARROW)
4901 && (event.mousePos.x > 237) && (!R2_GLOBALS.getFlag(71))) {
4902 SceneItem::display(3600, 17, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
4903 event.handled = true;
4904 }
4905 Scene::process(event);
4906 }
4907
dispatch()4908 void Scene3600::dispatch() {
4909 if ((R2_GLOBALS._player.getRegionIndex() == 200) && _action1._part2Fl && !_lightEntered) {
4910 R2_GLOBALS._sound2.fadeOut2(NULL);
4911 if (_protector._mover)
4912 _protector.addMover(NULL);
4913
4914 if (R2_GLOBALS._player._action)
4915 R2_GLOBALS._player.setAction(NULL);
4916 if (R2_GLOBALS._player._mover)
4917 R2_GLOBALS._player.addMover(NULL);
4918
4919 _lightEntered = true;
4920
4921 R2_GLOBALS._walkRegions.enableRegion(2);
4922 R2_GLOBALS._walkRegions.enableRegion(7);
4923 R2_GLOBALS._player.disableControl();
4924
4925 _sceneMode = 3624;
4926
4927 _quinn.setStrip(-1);
4928 _seeker.setStrip(-1);
4929 _miranda.setStrip(-1);
4930 _webbster.setStrip(-1);
4931
4932 R2_GLOBALS._player.hide();
4933
4934 if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
4935 _seeker.setPosition(R2_GLOBALS._player._position);
4936 _seeker.show();
4937 } else if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
4938 _miranda.setPosition(R2_GLOBALS._player._position);
4939 _miranda.show();
4940 } else {
4941 _quinn.setPosition(R2_GLOBALS._player._position);
4942 _quinn.show();
4943 }
4944 _quinn.setAction(&_sequenceManager2, this, 3610, &_quinn, NULL);
4945 _seeker.setAction(&_sequenceManager3, this, 3611, &_seeker, NULL);
4946 _miranda.setAction(&_sequenceManager4, this, 3612, &_miranda, NULL);
4947 _webbster.setAction(&_sequenceManager1, this, 3613, &_webbster, NULL);
4948 }
4949
4950 if ((_protector.getRegionIndex() == 200) && _action1._part2Fl && !_ghoulTeleported) {
4951 R2_GLOBALS._sound2.fadeOut2(NULL);
4952 _sceneMode = 3620;
4953 _ghoulTeleported = true;
4954 R2_GLOBALS._player.disableControl();
4955
4956 if (R2_GLOBALS._player._mover)
4957 R2_GLOBALS._player.addMover(NULL);
4958 if (_quinn._mover)
4959 _quinn.addMover(NULL);
4960 if (_seeker._mover)
4961 _seeker.addMover(NULL);
4962 if (_miranda._mover)
4963 _miranda.addMover(NULL);
4964 if (_webbster._mover)
4965 _webbster.addMover(NULL);
4966 }
4967
4968 Scene::dispatch();
4969 }
4970
4971 /*--------------------------------------------------------------------------
4972 * Scene 3700 - Cutscene - Teleport outside
4973 *
4974 *--------------------------------------------------------------------------*/
4975
postInit(SceneObjectList * OwnerList)4976 void Scene3700::postInit(SceneObjectList *OwnerList) {
4977 loadScene(3700);
4978 R2_GLOBALS._uiElements._active = false;
4979 R2_GLOBALS._uiElements._visible = false;
4980 SceneExt::postInit();
4981 R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
4982
4983 _stripManager.setColors(60, 255);
4984 _stripManager.setFontNumber(3);
4985 _stripManager.addSpeaker(&_quinnSpeaker);
4986 _stripManager.addSpeaker(&_seekerSpeaker);
4987 _stripManager.addSpeaker(&_mirandaSpeaker);
4988
4989 _quinn.postInit();
4990 _quinn._moveDiff = Common::Point(3, 2);
4991
4992 _seeker.postInit();
4993 _seeker._numFrames = 7;
4994 _seeker._moveDiff = Common::Point(5, 3);
4995 _seeker.hide();
4996
4997 _miranda.postInit();
4998 _miranda._moveDiff = Common::Point(3, 2);
4999 _miranda.hide();
5000
5001 _webbster.postInit();
5002 _webbster._numFrames = 7;
5003 _webbster._moveDiff = Common::Point(5, 3);
5004 _webbster.hide();
5005
5006 _teleportPad.postInit();
5007
5008 R2_GLOBALS._player.disableControl();
5009 R2_GLOBALS._sound1.play(332);
5010
5011 _sceneMode = 3700;
5012 setAction(&_sequenceManager, this, 3700, &_quinn, &_seeker, &_miranda,
5013 &_webbster, &_teleportPad, NULL);
5014 }
5015
remove()5016 void Scene3700::remove() {
5017 R2_GLOBALS._sound1.fadeOut2(NULL);
5018 SceneExt::remove();
5019 }
5020
signal()5021 void Scene3700::signal() {
5022 switch (_sceneMode) {
5023 case 3328:
5024 // No break on purpose
5025 case 3329:
5026 _sceneMode = 3701;
5027 setAction(&_sequenceManager, this, 3701, &_seeker, &_miranda, &_webbster, NULL);
5028 break;
5029 case 3700:
5030 _quinn.setup(10, 6, 1);
5031 _seeker.setup(20, 5, 1);
5032 if (R2_GLOBALS.getFlag(71)) {
5033 _sceneMode = 3329;
5034 _stripManager.start(3329, this);
5035 } else {
5036 _sceneMode = 3328;
5037 _stripManager.start(3328, this);
5038 }
5039 break;
5040 case 3701:
5041 R2_GLOBALS._sceneManager.changeScene(1000);
5042 break;
5043 default:
5044 R2_GLOBALS._player.enableControl();
5045 break;
5046 }
5047 }
5048
5049 /*--------------------------------------------------------------------------
5050 * Scene 3800 - Desert
5051 *
5052 *--------------------------------------------------------------------------*/
5053
Scene3800()5054 Scene3800::Scene3800() {
5055 _desertDirection = 0;
5056 _skylineRect.set(0, 0, 320, 87);
5057 }
5058
synchronize(Serializer & s)5059 void Scene3800::synchronize(Serializer &s) {
5060 SceneExt::synchronize(s);
5061
5062 s.syncAsSint16LE(_desertDirection);
5063 }
5064
changeScene()5065 void Scene3800::NorthExit::changeScene() {
5066 Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
5067
5068 _enabled = false;
5069 R2_GLOBALS._player.disableControl();
5070 scene->_desertDirection = 1;
5071
5072 if (R2_GLOBALS.getFlag(46)) {
5073 if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
5074 R2_GLOBALS._desertPreviousDirection = 3;
5075 if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
5076 R2_GLOBALS._desertStepsRemaining--;
5077 R2_GLOBALS._desertCorrectDirection = 0;
5078 } else {
5079 R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
5080 R2_GLOBALS._desertWrongDirCtr--;
5081 }
5082 } else {
5083 ++R2_GLOBALS._desertWrongDirCtr;
5084 if (R2_GLOBALS._desertWrongDirCtr > 999)
5085 R2_GLOBALS._desertWrongDirCtr = 999;
5086 R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
5087 R2_GLOBALS._desertCorrectDirection = 3;
5088 }
5089 }
5090
5091 if (R2_GLOBALS._desertStepsRemaining == 0)
5092 scene->_sceneMode = 16;
5093 else
5094 scene->_sceneMode = 11;
5095
5096 Common::Point pt(160, 115);
5097 NpcMover *mover = new NpcMover();
5098 R2_GLOBALS._player.addMover(mover, &pt, scene);
5099 }
5100
changeScene()5101 void Scene3800::EastExit::changeScene() {
5102 Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
5103
5104 _enabled = false;
5105 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5106 scene->_desertDirection = 2;
5107
5108 if (R2_GLOBALS.getFlag(46)) {
5109 if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
5110 R2_GLOBALS._desertPreviousDirection = 4;
5111 if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
5112 R2_GLOBALS._desertStepsRemaining--;
5113 R2_GLOBALS._desertCorrectDirection = 0;
5114 } else {
5115 R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
5116 R2_GLOBALS._desertWrongDirCtr--;
5117 }
5118 } else {
5119 ++R2_GLOBALS._desertWrongDirCtr;
5120 if (R2_GLOBALS._desertWrongDirCtr > 999)
5121 R2_GLOBALS._desertWrongDirCtr = 999;
5122 R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
5123 R2_GLOBALS._desertCorrectDirection = 4;
5124 }
5125 }
5126
5127 if (R2_GLOBALS._desertStepsRemaining == 0)
5128 scene->_sceneMode = 16;
5129 else
5130 scene->_sceneMode = 12;
5131
5132 Common::Point pt(330, 145);
5133 NpcMover *mover = new NpcMover();
5134 R2_GLOBALS._player.addMover(mover, &pt, scene);
5135 }
5136
changeScene()5137 void Scene3800::SouthExit::changeScene() {
5138 Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
5139
5140 _enabled = false;
5141 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5142 scene->_desertDirection = 3;
5143
5144 if (R2_GLOBALS.getFlag(46)) {
5145 if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
5146 R2_GLOBALS._desertPreviousDirection = 1;
5147 if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
5148 R2_GLOBALS._desertStepsRemaining--;
5149 R2_GLOBALS._desertCorrectDirection = 0;
5150 } else {
5151 R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
5152 R2_GLOBALS._desertWrongDirCtr--;
5153 }
5154 } else {
5155 ++R2_GLOBALS._desertWrongDirCtr;
5156 if (R2_GLOBALS._desertWrongDirCtr > 999)
5157 R2_GLOBALS._desertWrongDirCtr = 999;
5158 R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
5159 R2_GLOBALS._desertCorrectDirection = 1;
5160 }
5161 }
5162
5163 if (R2_GLOBALS._desertStepsRemaining == 0)
5164 scene->_sceneMode = 16;
5165 else
5166 scene->_sceneMode = 13;
5167
5168 Common::Point pt(160, 220);
5169 NpcMover *mover = new NpcMover();
5170 R2_GLOBALS._player.addMover(mover, &pt, scene);
5171 }
5172
changeScene()5173 void Scene3800::WestExit::changeScene() {
5174 Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;
5175
5176 _enabled = false;
5177 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5178 scene->_desertDirection = 4;
5179
5180 if (R2_GLOBALS.getFlag(46)) {
5181 if (scene->_desertDirection == R2_GLOBALS._desertCorrectDirection) {
5182 R2_GLOBALS._desertPreviousDirection = 2;
5183 if (R2_GLOBALS._desertWrongDirCtr + 1 == 0) {
5184 R2_GLOBALS._desertStepsRemaining--;
5185 R2_GLOBALS._desertCorrectDirection = 0;
5186 } else {
5187 R2_GLOBALS._desertCorrectDirection = R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr];
5188 R2_GLOBALS._desertWrongDirCtr--;
5189 }
5190 } else {
5191 ++R2_GLOBALS._desertWrongDirCtr;
5192 if (R2_GLOBALS._desertWrongDirCtr > 999)
5193 R2_GLOBALS._desertWrongDirCtr = 999;
5194 R2_GLOBALS._desertMovements[R2_GLOBALS._desertWrongDirCtr] = R2_GLOBALS._desertCorrectDirection;
5195 R2_GLOBALS._desertCorrectDirection = 2;
5196 }
5197 }
5198
5199 if (R2_GLOBALS._desertStepsRemaining == 0)
5200 scene->_sceneMode = 16;
5201 else
5202 scene->_sceneMode = 14;
5203
5204 Common::Point pt(-10, 145);
5205 NpcMover *mover = new NpcMover();
5206 R2_GLOBALS._player.addMover(mover, &pt, scene);
5207 }
5208
initExits()5209 void Scene3800::initExits() {
5210 _northExit._enabled = true;
5211 _eastExit._enabled = true;
5212 _southExit._enabled = true;
5213 _westExit._enabled = true;
5214 _northExit._insideArea = false;
5215 _eastExit._insideArea = false;
5216 _southExit._insideArea = false;
5217 _westExit._insideArea = false;
5218 _northExit._moving = false;
5219 _eastExit._moving = false;
5220 _southExit._moving = false;
5221 _westExit._moving = false;
5222
5223 loadScene(R2_GLOBALS._maze3800SceneNumb);
5224
5225 R2_GLOBALS._uiElements.draw();
5226 }
5227
enterArea()5228 void Scene3800::enterArea() {
5229 R2_GLOBALS._player.disableControl(CURSOR_WALK);
5230
5231 switch (_desertDirection) {
5232 case 0:
5233 R2_GLOBALS._player.postInit();
5234 R2_GLOBALS._player.setVisage(10);
5235 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
5236 R2_GLOBALS._player.setPosition(Common::Point(160, 145));
5237 R2_GLOBALS._player.setStrip(3);
5238 R2_GLOBALS._player.changeZoom(-1);
5239 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
5240
5241 _quinnShadow.postInit();
5242 _quinnShadow.fixPriority(10);
5243 _quinnShadow.changeZoom(-1);
5244 _quinnShadow.setVisage(1110);
5245 _quinnShadow._effect = EFFECT_SHADOW_MAP;
5246 _quinnShadow._shadowMap = this->_shadowPaletteMap;
5247 R2_GLOBALS._player._linkedActor = &_quinnShadow;
5248
5249 switch (R2_GLOBALS._sceneManager._previousScene) {
5250 case 2600:
5251 _balloon.postInit();
5252 _harness.postInit();
5253 _quinnShadow.hide();
5254 _sceneMode = 3800;
5255 setAction(&_sequenceManager1, this, 3800, &R2_GLOBALS._player,
5256 &_balloon, &_harness, NULL);
5257 break;
5258 case 3900:
5259 _sceneMode = 15;
5260 switch (R2_GLOBALS._desertPreviousDirection - 1) {
5261 case 0: {
5262 R2_GLOBALS._player.setPosition(Common::Point(160, 220));
5263 Common::Point pt(160, 160);
5264 NpcMover *mover = new NpcMover();
5265 R2_GLOBALS._player.addMover(mover, &pt, this);
5266 }
5267 break;
5268 case 1: {
5269 R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
5270 Common::Point pt(19, 145);
5271 NpcMover *mover = new NpcMover();
5272 R2_GLOBALS._player.addMover(mover, &pt, this);
5273 }
5274 break;
5275 case 2: {
5276 R2_GLOBALS._player.setPosition(Common::Point(160, 115));
5277 Common::Point pt(160, 120);
5278 NpcMover *mover = new NpcMover();
5279 R2_GLOBALS._player.addMover(mover, &pt, this);
5280 }
5281 break;
5282 case 3: {
5283 R2_GLOBALS._player.setPosition(Common::Point(330, 145));
5284 Common::Point pt(300, 145);
5285 NpcMover *mover = new NpcMover();
5286 R2_GLOBALS._player.addMover(mover, &pt, this);
5287 }
5288 break;
5289 default:
5290 break;
5291 }
5292 break;
5293 default:
5294 R2_GLOBALS._player.enableControl(CURSOR_WALK);
5295 break;
5296 }
5297 break;
5298 case 1: {
5299 _sceneMode = 15;
5300 R2_GLOBALS._player.setPosition(Common::Point(160, 220));
5301 Common::Point pt(160, 160);
5302 NpcMover *mover = new NpcMover();
5303 R2_GLOBALS._player.addMover(mover, &pt, this);
5304 }
5305 break;
5306 case 2: {
5307 _sceneMode = 15;
5308 R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
5309 Common::Point pt(19, 145);
5310 NpcMover *mover = new NpcMover();
5311 R2_GLOBALS._player.addMover(mover, &pt, this);
5312 }
5313 break;
5314 case 3: {
5315 _sceneMode = 15;
5316 R2_GLOBALS._player.setPosition(Common::Point(160, 115));
5317 Common::Point pt(160, 120);
5318 NpcMover *mover = new NpcMover();
5319 R2_GLOBALS._player.addMover(mover, &pt, this);
5320 }
5321 break;
5322 case 4: {
5323 _sceneMode = 15;
5324 R2_GLOBALS._player.setPosition(Common::Point(330, 145));
5325 Common::Point pt(300, 145);
5326 NpcMover *mover = new NpcMover();
5327 R2_GLOBALS._player.addMover(mover, &pt, this);
5328 }
5329 break;
5330 default:
5331 break;
5332 }
5333 }
5334
postInit(SceneObjectList * OwnerList)5335 void Scene3800::postInit(SceneObjectList *OwnerList) {
5336 _desertDirection = 0;
5337
5338 initExits();
5339
5340 SceneExt::postInit();
5341 R2_GLOBALS._sound1.play(231);
5342
5343 scalePalette(65, 65, 65);
5344
5345 setZoomPercents(87, 40, 144, 100);
5346
5347 _northExit.setDetails(Rect(14, 87, 305, 125), SHADECURSOR_UP, 3800);
5348 _northExit.setDest(Common::Point(160, 126));
5349 _eastExit.setDetails(Rect(305, 87, 320, 168), EXITCURSOR_E, 3800);
5350 _eastExit.setDest(Common::Point(312, 145));
5351 _southExit.setDetails(Rect(14, 160, 305, 168), SHADECURSOR_DOWN, 3800);
5352 _southExit.setDest(Common::Point(160, 165));
5353 _westExit.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3800);
5354 _westExit.setDest(Common::Point(7, 145));
5355
5356 _background.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *) NULL);
5357
5358 enterArea();
5359 }
5360
signal()5361 void Scene3800::signal() {
5362 switch (_sceneMode) {
5363 case 11:
5364 R2_GLOBALS._maze3800SceneNumb += 15;
5365 if (R2_GLOBALS._maze3800SceneNumb > 3815)
5366 R2_GLOBALS._maze3800SceneNumb -= 20;
5367 initExits();
5368 enterArea();
5369 break;
5370 case 12:
5371 R2_GLOBALS._maze3800SceneNumb += 5;
5372 if (R2_GLOBALS._maze3800SceneNumb > 3815)
5373 R2_GLOBALS._maze3800SceneNumb = 3800;
5374 initExits();
5375 enterArea();
5376 break;
5377 case 13:
5378 R2_GLOBALS._maze3800SceneNumb -= 15;
5379 if (R2_GLOBALS._maze3800SceneNumb < 3800)
5380 R2_GLOBALS._maze3800SceneNumb += 20;
5381 initExits();
5382 enterArea();
5383 break;
5384 case 14:
5385 R2_GLOBALS._maze3800SceneNumb -= 5;
5386 if (R2_GLOBALS._maze3800SceneNumb < 3800)
5387 R2_GLOBALS._maze3800SceneNumb = 3815;
5388 initExits();
5389 enterArea();
5390 break;
5391 case 15:
5392 R2_GLOBALS._player.enableControl();
5393 break;
5394 case 16:
5395 g_globals->_sceneManager.changeScene(3900);
5396 break;
5397 case 3800:
5398 _quinnShadow.show();
5399 _balloon.remove();
5400 _harness.remove();
5401 R2_GLOBALS._player.enableControl();
5402 break;
5403 case 3805:
5404 _northExit._enabled = false;
5405 _eastExit._enabled = false;
5406 _southExit._enabled = false;
5407 _westExit._enabled = false;
5408 R2_GLOBALS._player._canWalk = false;
5409 R2_GLOBALS._events.setCursor(CURSOR_USE);
5410 break;
5411 case 3806:
5412 _northExit._enabled = true;
5413 _eastExit._enabled = true;
5414 _southExit._enabled = true;
5415 _westExit._enabled = true;
5416 R2_GLOBALS._player.enableControl();
5417 break;
5418 default:
5419 break;
5420 }
5421 }
5422
process(Event & event)5423 void Scene3800::process(Event &event) {
5424 if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == EVENT_BUTTON_DOWN)
5425 && (_skylineRect.contains(event.mousePos))) {
5426 event.handled = true;
5427 switch (R2_GLOBALS._events.getCursor()) {
5428 case CURSOR_WALK:
5429 R2_GLOBALS._player.addMover(NULL);
5430 R2_GLOBALS._player.updateAngle(event.mousePos);
5431 break;
5432 case CURSOR_LOOK:
5433 SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
5434 break;
5435 case CURSOR_USE:
5436 SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
5437 break;
5438 default:
5439 event.handled = false;
5440 break;
5441 }
5442 }
5443
5444 Scene::process(event);
5445 }
5446
5447 /*--------------------------------------------------------------------------
5448 * Scene 3900 - Forest Entrance
5449 *
5450 *--------------------------------------------------------------------------*/
5451
changeScene()5452 void Scene3900::NorthExit::changeScene() {
5453 Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
5454
5455 _enabled = false;
5456 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5457 R2_GLOBALS._desertCorrectDirection = 3;
5458 R2_GLOBALS._desertPreviousDirection = 1;
5459 R2_GLOBALS._desertStepsRemaining = 1;
5460 scene->_sceneMode = 14;
5461
5462 Common::Point pt(160, 115);
5463 NpcMover *mover = new NpcMover();
5464 R2_GLOBALS._player.addMover(mover, &pt, scene);
5465 }
5466
changeScene()5467 void Scene3900::EastExit::changeScene() {
5468 Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
5469
5470 _enabled = false;
5471 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5472 R2_GLOBALS._desertCorrectDirection = 4;
5473 R2_GLOBALS._desertPreviousDirection = 2;
5474 R2_GLOBALS._desertStepsRemaining = 1;
5475 scene->_sceneMode = 14;
5476
5477 Common::Point pt(330, 145);
5478 NpcMover *mover = new NpcMover();
5479 R2_GLOBALS._player.addMover(mover, &pt, scene);
5480 }
5481
changeScene()5482 void Scene3900::SouthExit::changeScene() {
5483 Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
5484
5485 _enabled = false;
5486 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5487 R2_GLOBALS._desertCorrectDirection = 1;
5488 R2_GLOBALS._desertPreviousDirection = 3;
5489 R2_GLOBALS._desertStepsRemaining = 1;
5490 scene->_sceneMode = 14;
5491
5492 Common::Point pt(160, 220);
5493 NpcMover *mover = new NpcMover();
5494 R2_GLOBALS._player.addMover(mover, &pt, scene);
5495 }
5496
changeScene()5497 void Scene3900::WestExit::changeScene() {
5498 Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
5499
5500 _enabled = false;
5501 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5502 R2_GLOBALS._desertCorrectDirection = 2;
5503 R2_GLOBALS._desertPreviousDirection = 4;
5504 R2_GLOBALS._desertStepsRemaining = 1;
5505 scene->_sceneMode = 14;
5506
5507 Common::Point pt(-10, 145);
5508 NpcMover *mover = new NpcMover();
5509 R2_GLOBALS._player.addMover(mover, &pt, scene);
5510 }
5511
changeScene()5512 void Scene3900::Exit5::changeScene() {
5513 Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;
5514
5515 _enabled = false;
5516 R2_GLOBALS._player.disableControl(CURSOR_ARROW);
5517 scene->_sceneMode = 13;
5518
5519 if (R2_GLOBALS._desertCorrectDirection == 4) {
5520 Common::Point pt(-10, 135);
5521 NpcMover *mover = new NpcMover();
5522 R2_GLOBALS._player.addMover(mover, &pt, scene);
5523 } else {
5524 Common::Point pt(330, 135);
5525 NpcMover *mover = new NpcMover();
5526 R2_GLOBALS._player.addMover(mover, &pt, scene);
5527 }
5528
5529 R2_GLOBALS._desertCorrectDirection = 0;
5530 }
5531
postInit(SceneObjectList * OwnerList)5532 void Scene3900::postInit(SceneObjectList *OwnerList) {
5533 if ((R2_GLOBALS._desertPreviousDirection == 2)
5534 && (R2_GLOBALS._sceneManager._previousScene != 2700))
5535 loadScene(3825);
5536 else
5537 loadScene(3820);
5538 SceneExt::postInit();
5539
5540 R2_GLOBALS._sound1.changeSound(231);
5541 setZoomPercents(87, 40, 144, 100);
5542
5543 R2_GLOBALS._player.disableControl();
5544 R2_GLOBALS._player.postInit();
5545 R2_GLOBALS._player.setVisage(10);
5546 R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
5547 R2_GLOBALS._player.setStrip(3);
5548 R2_GLOBALS._player.changeZoom(-1);
5549 R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
5550
5551 _quinnShadow.postInit();
5552 _quinnShadow.fixPriority(10);
5553 _quinnShadow.changeZoom(-1);
5554 _quinnShadow.setVisage(1110);
5555 _quinnShadow._effect = EFFECT_SHADOW_MAP;
5556 _quinnShadow._shadowMap = _shadowPaletteMap;
5557 R2_GLOBALS._player._linkedActor = &_quinnShadow;
5558
5559 if ((R2_GLOBALS._desertPreviousDirection == 2) && (R2_GLOBALS._sceneManager._previousScene != 2700)) {
5560 // loadScene(3825);
5561 R2_GLOBALS._desertCorrectDirection = 4;
5562 _northExit.setDetails(Rect(29, 87, 305, 125), SHADECURSOR_UP, 3900);
5563 _southExit.setDetails(Rect(29, 160, 305, 168), SHADECURSOR_DOWN, 3900);
5564
5565 _eastExit.setDetails(Rect(305, 87, 320, 168), EXITCURSOR_E, 3900);
5566 _eastExit.setDest(Common::Point(312, 145));
5567 _eastExit._enabled = true;
5568 _eastExit._insideArea = false;
5569 _eastExit._moving = false;
5570
5571 _westExit._enabled = false;
5572
5573 _westEnterForest.setDetails(Rect(0, 87, 29, 168), EXITCURSOR_W, 3900);
5574 _westEnterForest.setDest(Common::Point(24, 135));
5575 } else {
5576 // loadScene(3820);
5577 R2_GLOBALS._desertCorrectDirection = 2;
5578 _northExit.setDetails(Rect(14, 87, 290, 125), SHADECURSOR_UP, 3900);
5579 _southExit.setDetails(Rect(14, 160, 290, 168), SHADECURSOR_DOWN, 3900);
5580
5581 _eastExit._enabled = false;
5582
5583 _westExit.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3900);
5584 _westExit.setDest(Common::Point(7, 145));
5585 _westExit._enabled = true;
5586 _westExit._insideArea = false;
5587 _westExit._moving = false;
5588
5589 _westEnterForest.setDetails(Rect(290, 87, 320, 168), EXITCURSOR_E, 3900);
5590 _westEnterForest.setDest(Common::Point(295, 135));
5591 }
5592 _westEnterForest._enabled = true;
5593 _westEnterForest._insideArea = false;
5594 _westEnterForest._moving = false;
5595
5596 scalePalette(65, 65, 65);
5597
5598 _northExit.setDest(Common::Point(160, 126));
5599 _northExit._enabled = true;
5600 _northExit._insideArea = false;
5601 _northExit._moving = false;
5602
5603 _southExit.setDest(Common::Point(160, 165));
5604 _southExit._enabled = true;
5605 _southExit._insideArea = false;
5606 _southExit._moving = false;
5607
5608 R2_GLOBALS._uiElements.draw();
5609
5610 _skylineRect.set(0, 0, 320, 87);
5611 _background.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *)NULL);
5612 if (R2_GLOBALS._sceneManager._previousScene == 3800) {
5613 _sceneMode = 11;
5614 switch (R2_GLOBALS._desertPreviousDirection) {
5615 case 1: {
5616 // Entering from the north
5617 R2_GLOBALS._player.setPosition(Common::Point(160, 115));
5618 Common::Point pt(160, 120);
5619 NpcMover *mover = new NpcMover();
5620 R2_GLOBALS._player.addMover(mover, &pt, this);
5621 }
5622 break;
5623 case 2: {
5624 // Entering from the east
5625 R2_GLOBALS._player.setPosition(Common::Point(330, 145));
5626 Common::Point pt(300, 145);
5627 NpcMover *mover = new NpcMover();
5628 R2_GLOBALS._player.addMover(mover, &pt, this);
5629 }
5630 break;
5631 case 3: {
5632 // Entering from the south
5633 R2_GLOBALS._player.setPosition(Common::Point(160, 220));
5634 Common::Point pt(160, 160);
5635 NpcMover *mover = new NpcMover();
5636 R2_GLOBALS._player.addMover(mover, &pt, this);
5637 }
5638 break;
5639 case 4: {
5640 // Entering from the west
5641 R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
5642 Common::Point pt(19, 145);
5643 NpcMover *mover = new NpcMover();
5644 R2_GLOBALS._player.addMover(mover, &pt, this);
5645 }
5646 break;
5647 default:
5648 break;
5649 }
5650 } else if (R2_GLOBALS._sceneManager._previousScene == 2700) {
5651 _sceneMode = 12;
5652 R2_GLOBALS._player.setPosition(Common::Point(330, 135));
5653 Common::Point pt(265, 135);
5654 NpcMover *mover = new NpcMover();
5655 R2_GLOBALS._player.addMover(mover, &pt, this);
5656 } else {
5657 R2_GLOBALS._player.setPosition(Common::Point(160, 145));
5658 R2_GLOBALS._player.enableControl(CURSOR_WALK);
5659 }
5660 }
5661
signal()5662 void Scene3900::signal() {
5663 switch (_sceneMode) {
5664 case 11:
5665 // No break on purpose
5666 case 12:
5667 R2_GLOBALS._player.enableControl(CURSOR_WALK);
5668 break;
5669 case 13:
5670 R2_GLOBALS._sceneManager.changeScene(2700);
5671 break;
5672 case 14:
5673 R2_GLOBALS._sceneManager.changeScene(3800);
5674 break;
5675 case 3805:
5676 _northExit._enabled = false;
5677 _eastExit._enabled = false;
5678 _southExit._enabled = false;
5679 _westExit._enabled = false;
5680 R2_GLOBALS._player._canWalk = false;
5681 R2_GLOBALS._events.setCursor(CURSOR_USE);
5682 break;
5683 case 3806:
5684 _northExit._enabled = true;
5685 _eastExit._enabled = true;
5686 _southExit._enabled = true;
5687 _westExit._enabled = true;
5688 R2_GLOBALS._player.enableControl(CURSOR_WALK);
5689 break;
5690 default:
5691 break;
5692 }
5693 }
5694
process(Event & event)5695 void Scene3900::process(Event &event) {
5696 if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == EVENT_BUTTON_DOWN)
5697 && (_skylineRect.contains(event.mousePos))) {
5698 event.handled = true;
5699 switch (R2_GLOBALS._events.getCursor()) {
5700 case CURSOR_WALK:
5701 R2_GLOBALS._player.addMover(NULL);
5702 R2_GLOBALS._player.updateAngle(event.mousePos);
5703 break;
5704 case CURSOR_USE:
5705 SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
5706 break;
5707 case CURSOR_LOOK:
5708 SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
5709 break;
5710 default:
5711 event.handled = false;
5712 break;
5713 }
5714 }
5715 Scene::process(event);
5716 }
5717
5718 } // End of namespace Ringworld2
5719 } // End of namespace TsAGE
5720