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 "common/scummsys.h"
24 #include "mads/mads.h"
25 #include "mads/scene.h"
26 #include "mads/nebular/nebular_scenes.h"
27 #include "mads/nebular/nebular_scenes5.h"
28
29 namespace MADS {
30
31 namespace Nebular {
32
setAAName()33 void Scene5xx::setAAName() {
34 _game._aaName = Resources::formatAAName(5);
35 }
36
setPlayerSpritesPrefix()37 void Scene5xx::setPlayerSpritesPrefix() {
38 _vm->_sound->command(5);
39
40 Common::String oldName = _game._player._spritesPrefix;
41
42 if ((_scene->_nextSceneId == 502) || (_scene->_nextSceneId == 504) || (_scene->_nextSceneId == 505) || (_scene->_nextSceneId == 515))
43 _game._player._spritesPrefix = "";
44 else if (_globals[kSexOfRex] == REX_MALE)
45 _game._player._spritesPrefix = "RXM";
46 else if ((_scene->_nextSceneId == 501) || (_scene->_nextSceneId == 503) || (_scene->_nextSceneId == 551))
47 _game._player._spritesPrefix = "ROX";
48
49 _game._player._scalingVelocity = true;
50
51 if ((_scene->_nextSceneId == 512) || (_scene->_nextSceneId == 507))
52 _game._player._scalingVelocity = false;
53
54 if (oldName != _game._player._spritesPrefix)
55 _game._player._spritesChanged = true;
56
57 _vm->_palette->setEntry(16, 10, 63, 63);
58 _vm->_palette->setEntry(17, 10, 45, 45);
59 }
60
sceneEntrySound()61 void Scene5xx::sceneEntrySound() {
62 if (!_vm->_musicFlag) {
63 _vm->_sound->command(2);
64 return;
65 }
66
67 switch (_scene->_nextSceneId) {
68 case 501:
69 case 502:
70 case 504:
71 case 505:
72 case 506:
73 case 507:
74 case 508:
75 case 511:
76 case 512:
77 case 513:
78 case 515:
79 case 551:
80 if (_scene->_priorSceneId == 503)
81 _vm->_sound->command(38);
82 else
83 _vm->_sound->command(29);
84 break;
85 case 503:
86 _vm->_sound->command(41);
87 break;
88 default:
89 break;
90 }
91 }
92
93 /*------------------------------------------------------------------------*/
94
Scene501(MADSEngine * vm)95 Scene501::Scene501(MADSEngine *vm) : Scene5xx(vm) {
96 _mainSequenceId = -1;
97 _mainSpriteId = -1;
98 _doorHotspotid = -1;
99
100 _rexPunched = false;
101 }
102
synchronize(Common::Serializer & s)103 void Scene501::synchronize(Common::Serializer &s) {
104 Scene5xx::synchronize(s);
105
106 s.syncAsSint16LE(_mainSequenceId);
107 s.syncAsSint16LE(_mainSpriteId);
108 s.syncAsSint16LE(_doorHotspotid);
109 s.syncAsByte(_rexPunched);
110 }
111
setup()112 void Scene501::setup() {
113 setPlayerSpritesPrefix();
114 setAAName();
115 _scene->addActiveVocab(NOUN_DOOR);
116 _scene->addActiveVocab(VERB_WALK_THROUGH);
117 }
118
handleSlotActions()119 void Scene501::handleSlotActions() {
120 switch (_game._trigger) {
121 case 0:
122 _game._player._stepEnabled = false;
123 _game._player._visible = false;
124 int numTicks, frameIndex;
125 if (_globals[kSexOfRex] == REX_MALE) {
126 _mainSpriteId = _globals._spriteIndexes[4];
127 numTicks = 8;
128 frameIndex = 3;
129 } else {
130 _mainSpriteId = _globals._spriteIndexes[5];
131 numTicks = 10;
132 frameIndex = 2;
133 }
134
135 _mainSequenceId = _scene->_sequences.startPingPongCycle(_mainSpriteId, false, numTicks, 1, 0, 0);
136 _scene->_sequences.setAnimRange(_mainSequenceId, 1, frameIndex);
137 _scene->_sequences.setMsgLayout(_mainSequenceId);
138 _vm->_sound->command(10);
139 _scene->_sequences.addSubEntry(_mainSequenceId, SEQUENCE_TRIGGER_SPRITE, frameIndex, 1);
140 _scene->_sequences.addSubEntry(_mainSequenceId, SEQUENCE_TRIGGER_EXPIRE, 0, 2);
141 break;
142
143 case 1:
144 _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 6, 0, 0);
145 break;
146
147 case 2:
148 _scene->_sequences.updateTimeout(-1, _mainSequenceId);
149 _game._player._visible = true;
150 _scene->_sequences.addTimer(15, 3);
151 break;
152
153 case 3:
154 _game._player.walk(Common::Point(282, 110), FACING_NORTH);
155 _scene->_sequences.addTimer(60, 4);
156 break;
157
158 default:
159 break;
160 }
161 }
162
enter()163 void Scene501::enter() {
164 _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1));
165 _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0));
166 _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
167
168 if (_globals[kSexOfRex] == REX_MALE) {
169 _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXMRC_9");
170 _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*RXCD_7");
171 } else {
172 _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*ROXRC_9");
173 _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*ROXCD_7");
174 }
175
176 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
177 int idx = _scene->_dynamicHotspots.add(NOUN_DOOR, VERB_WALK_THROUGH, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
178 _doorHotspotid = _scene->_dynamicHotspots.setPosition(idx,Common::Point(282, 110), FACING_NORTH);
179 _scene->_dynamicHotspots.setCursor(_doorHotspotid, CURSOR_GO_UP);
180 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
181 _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
182 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
183 _rexPunched = true;
184
185 if (_scene->_priorSceneId == 504) {
186 _game._player._stepEnabled = false;
187 _game._player._playerPos = Common::Point(74, 121);
188 _game._player._facing = FACING_NORTHWEST;
189 _game._player._visible = false;
190 _game._player._stepEnabled = false;
191 _scene->_sequences.remove(_globals._sequenceIndexes[2]);
192 _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
193 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
194 if (_globals[kSexOfRex] == REX_MALE)
195 _scene->loadAnimation(formAnimName('G', 2), 70);
196 else
197 _scene->loadAnimation(formAnimName('R', 2), 70);
198 } else if (_scene->_priorSceneId == 503) {
199 _game._player._playerPos = Common::Point(317, 102);
200 _game._player._facing = FACING_SOUTHWEST;
201 _scene->_sequences.addTimer(15, 80);
202 } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
203 _game._player._playerPos = Common::Point(299, 131);
204
205 if (_scene->_roomChanged) {
206 _game._objects.addToInventory(OBJ_FAKE_ID);
207 _game._objects.addToInventory(OBJ_SECURITY_CARD);
208 _game._objects.addToInventory(OBJ_ID_CARD);
209 }
210
211 sceneEntrySound();
212 _game.loadQuoteSet(0x275, 0x276, 0x277, 0);
213
214 if (!_game._visitedScenes._sceneRevisited)
215 _scene->_sequences.addTimer(2, 90);
216 }
217
step()218 void Scene501::step() {
219 if (_game._trigger == 90)
220 _vm->_dialogs->show(50127);
221
222 if (_game._trigger >= 80) {
223 switch (_game._trigger) {
224 case 80:
225 _game._player._stepEnabled = false;
226 _scene->_sequences.remove(_globals._sequenceIndexes[3]);
227 _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 6, 0, 0);
228 _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
229 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
230 _vm->_sound->command(11);
231 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
232 break;
233
234 case 81:
235 _scene->_dynamicHotspots.remove(_doorHotspotid);
236 _game._player.walk(Common::Point(276, 110), FACING_SOUTHWEST);
237 _scene->_sequences.addTimer(120, 82);
238 break;
239
240 case 82:
241 _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
242 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
243 _vm->_sound->command(12);
244 _doorHotspotid = _scene->_dynamicHotspots.add(NOUN_DOOR, VERB_WALK_THROUGH, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
245 _scene->_dynamicHotspots.setPosition(_globals._sequenceIndexes[3], Common::Point(282, 110), FACING_NORTH);
246 _scene->_dynamicHotspots.setCursor(_doorHotspotid, CURSOR_GO_UP);
247 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 83);
248 break;
249
250 case 83:
251 _game._player._stepEnabled = true;
252 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
253 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
254 break;
255
256 default:
257 break;
258 }
259 }
260
261 if (_game._trigger >= 70 && _game._trigger <= 73) {
262 switch (_game._trigger) {
263 case 70:
264 _game._player._visible = true;
265 _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
266 _scene->_sequences.addTimer(15, 71);
267 break;
268
269 case 71:
270 _game._player.walk(Common::Point(92, 130), FACING_SOUTH);
271 _scene->_sequences.addTimer(30, 72);
272 break;
273
274 case 72:
275 _scene->_sequences.remove(_globals._sequenceIndexes[2]);
276 _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
277 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
278 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
279 break;
280
281 case 73:
282 _game._player._stepEnabled = true;
283 _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
284 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
285 break;
286
287 default:
288 break;
289 }
290 }
291 }
292
preActions()293 void Scene501::preActions() {
294 if (_action.isAction(VERB_WALK_DOWN) && (_action.isObject(NOUN_STREET_TO_EAST) || _action.isObject(NOUN_SIDEWALK_TO_EAST)))
295 _game._player._walkOffScreenSceneId = 551;
296 }
297
actions()298 void Scene501::actions() {
299 if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
300 switch (_game._trigger) {
301 case 0:
302 _game._player._stepEnabled = false;
303 _scene->_sequences.remove(_globals._sequenceIndexes[2]);
304 _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
305 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
306 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
307 break;
308
309 case 1: {
310 int syncIdx = _globals._sequenceIndexes[2];
311 _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
312 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
313 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
314 _scene->_sequences.addTimer(15, 2);
315 }
316 break;
317
318 case 2:
319 _game._player._visible = false;
320 if (_globals[kSexOfRex] == REX_MALE)
321 _mainSpriteId = _globals._spriteIndexes[6];
322 else
323 _mainSpriteId = _globals._spriteIndexes[7];
324
325 _mainSequenceId = _scene->_sequences.addSpriteCycle(_mainSpriteId, false, 8, 1, 0, 0);
326 _scene->_sequences.setMsgLayout(_mainSequenceId);
327 _scene->_sequences.addSubEntry(_mainSequenceId, SEQUENCE_TRIGGER_EXPIRE, 0, 3);
328 break;
329
330 case 3: {
331 int syncIdx = _mainSequenceId;
332 _mainSequenceId = _scene->_sequences.startCycle(_mainSpriteId, false, -2);
333 _scene->_sequences.setMsgLayout(_mainSequenceId);
334 _scene->_sequences.updateTimeout(_mainSequenceId, syncIdx);
335 _scene->_sequences.addTimer(30, 4);
336 }
337 break;
338
339 case 4:
340 _scene->_nextSceneId = 504;
341 break;
342
343 default:
344 break;
345 }
346 } else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT))
347 _vm->_dialogs->show(50113);
348 else if (_action.isAction(VERB_PUT, NOUN_FAKE_ID, NOUN_CARD_SLOT)) {
349 switch (_game._trigger) {
350 case 0:
351 case 1:
352 case 2:
353 case 3:
354 handleSlotActions();
355 break;
356
357 case 4:
358 if (_globals[kSexOfRex] == REX_MALE) {
359 _game._player._visible = false;
360 _vm->_sound->command(13);
361 _scene->loadAnimation(formAnimName('G', 1), 5);
362 } else {
363 _rexPunched = false;
364 _scene->_kernelMessages.reset();
365 _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 6, 120, _game.getQuote(0x277));
366 }
367 break;
368
369 case 5:
370 _game._player._visible = true;
371 _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
372 _scene->_sequences.addTimer(30, 6);
373 break;
374
375 case 6:
376 if (_globals[kSexOfRex] == REX_MALE) {
377 if (_rexPunched) {
378 _scene->_kernelMessages.reset();
379 _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x275));
380 _rexPunched = false;
381 } else {
382 _scene->_kernelMessages.reset();
383 _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x276));
384 }
385 }
386 _game._player._stepEnabled = true;
387 break;
388
389 default:
390 break;
391 }
392 } else if (_action.isAction(VERB_PUT, NOUN_ID_CARD, NOUN_CARD_SLOT)) {
393 switch (_game._trigger) {
394 case 0:
395 case 1:
396 case 2:
397 case 3:
398 handleSlotActions();
399 break;
400
401 case 4:
402 _scene->_sequences.remove(_globals._sequenceIndexes[3]);
403 _scene->_dynamicHotspots.remove(_doorHotspotid);
404 _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
405 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
406 _vm->_sound->command(11);
407 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
408 break;
409
410 case 6:
411 _game._player.walk(Common::Point(317, 102), FACING_NORTHEAST);
412 _scene->_sequences.addTimer(120, 7);
413 break;
414
415 case 7: {
416 _vm->_sound->command(12);
417 int syncIdx = _globals._sequenceIndexes[3];
418 _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
419 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
420 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
421 _vm->_sound->command(12);
422 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 8);
423 }
424 break;
425
426 case 8: {
427 int syncIdx = _globals._sequenceIndexes[3];
428 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
429 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
430 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
431 _scene->_nextSceneId = 503;
432 }
433 break;
434
435 default:
436 break;
437 }
438 } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_STREET))
439 _vm->_dialogs->show(50121);
440 else if (_action.isAction(VERB_LOOK, NOUN_DOOR))
441 _vm->_dialogs->show(50110);
442 else if (_action.isAction(VERB_LOOK, NOUN_CARD_SLOT))
443 _vm->_dialogs->show(50112);
444 else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
445 _vm->_dialogs->show(50114);
446 else if (_action.isAction(VERB_TAKE, NOUN_SIGN))
447 _vm->_dialogs->show(50115);
448 else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK_TO_EAST))
449 _vm->_dialogs->show(50118);
450 else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK_TO_WEST) || _action.isAction(VERB_LOOK, NOUN_STREET_TO_WEST)
451 || _action.isAction(VERB_WALK_DOWN, NOUN_SIDEWALK_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_WEST))
452 _vm->_dialogs->show(50119);
453 else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
454 _vm->_dialogs->show(50120);
455 else if (_action.isAction(VERB_OPEN, NOUN_DOOR))
456 _vm->_dialogs->show(50122);
457 else if (_action.isAction(VERB_LOOK, NOUN_FIRE_HYDRANT))
458 _vm->_dialogs->show(50123);
459 else if (_action.isAction(VERB_OPEN, NOUN_FIRE_HYDRANT))
460 _vm->_dialogs->show(50124);
461 else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT_OVERHEAD))
462 _vm->_dialogs->show(50125);
463 else if (_action.isAction(VERB_LOOK, NOUN_PIPES) || _action.isAction(VERB_LOOK, NOUN_PIPE))
464 _vm->_dialogs->show(50126);
465 else if (_action.isAction(VERB_LOOK, NOUN_CAR)) {
466 if (!_game._visitedScenes.exists(504))
467 _vm->_dialogs->show(50116);
468 else
469 _vm->_dialogs->show(50117);
470 } else
471 return;
472
473 _action._inProgress = false;
474 }
475
476 /*------------------------------------------------------------------------*/
477
setup()478 void Scene502::setup() {
479 _game._player._spritesPrefix = "";
480 // The original is using Scene5xx_setAAName()
481 _game._aaName = Resources::formatAAName(5);
482 }
483
enter()484 void Scene502::enter() {
485 if (_globals[kSexOfRex] == REX_MALE)
486 _handSpriteId = _scene->_sprites.addSprites("*REXHAND");
487 else
488 _handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
489
490 teleporterEnter();
491
492 // The original uses scene5xx_sceneEntrySound
493 if (!_vm->_musicFlag)
494 _vm->_sound->command(2);
495 else if (_scene->_priorSceneId == 503)
496 _vm->_sound->command(38);
497 else
498 _vm->_sound->command(29);
499 }
500
step()501 void Scene502::step() {
502 teleporterStep();
503 }
504
actions()505 void Scene502::actions() {
506 if (teleporterActions()) {
507 _action._inProgress = false;
508 return;
509 }
510
511 if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT) || _action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
512 _vm->_dialogs->show(50210);
513 else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD))
514 _vm->_dialogs->show(50211);
515 else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
516 _vm->_dialogs->show(50212);
517 else if (_action.isAction(VERB_LOOK, NOUN_0_KEY) || _action.isAction(VERB_LOOK, NOUN_1_KEY)
518 || _action.isAction(VERB_LOOK, NOUN_2_KEY) || _action.isAction(VERB_LOOK, NOUN_3_KEY)
519 || _action.isAction(VERB_LOOK, NOUN_4_KEY) || _action.isAction(VERB_LOOK, NOUN_5_KEY)
520 || _action.isAction(VERB_LOOK, NOUN_6_KEY) || _action.isAction(VERB_LOOK, NOUN_7_KEY)
521 || _action.isAction(VERB_LOOK, NOUN_8_KEY) || _action.isAction(VERB_LOOK, NOUN_9_KEY)
522 || _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_ENTER_KEY)
523 || _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
524 _vm->_dialogs->show(50213);
525 else if (_action.isAction(VERB_LOOK, NOUN_DEVICE) || _action._lookFlag)
526 _vm->_dialogs->show(50214);
527 else
528 return;
529
530 _action._inProgress = false;
531 }
532
533 /*------------------------------------------------------------------------*/
534
Scene503(MADSEngine * vm)535 Scene503::Scene503(MADSEngine *vm) : Scene5xx(vm) {
536 _detonatorHotspotId = -1;
537 }
538
synchronize(Common::Serializer & s)539 void Scene503::synchronize(Common::Serializer &s) {
540 Scene5xx::synchronize(s);
541
542 s.syncAsSint16LE(_detonatorHotspotId);
543 }
544
setup()545 void Scene503::setup() {
546 setPlayerSpritesPrefix();
547 setAAName();
548 _scene->addActiveVocab(NOUN_DETONATORS);
549 _scene->addActiveVocab(VERB_WALKTO);
550 }
551
enter()552 void Scene503::enter() {
553 _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1));
554
555 if (_globals[kSexOfRex] == REX_MALE)
556 _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMBD_2");
557 else
558 _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*ROXBD_2");
559
560 if (_game._objects[OBJ_DETONATORS]._roomNumber == _scene->_currentSceneId) {
561 _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
562 _detonatorHotspotId = _scene->_dynamicHotspots.add(NOUN_DETONATORS, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
563 _scene->_dynamicHotspots.setPosition(_detonatorHotspotId, Common::Point(254, 135), FACING_SOUTH);
564 }
565
566 if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
567 _game._player._playerPos = Common::Point(191, 152);
568 _game._player._facing = FACING_NORTHWEST;
569 }
570
571 sceneEntrySound();
572 }
573
actions()574 void Scene503::actions() {
575 if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
576 _scene->_nextSceneId = 501;
577 else if (_action.isAction(VERB_TAKE, NOUN_DETONATORS)) {
578 if ( _game._trigger || !_game._objects.isInInventory(OBJ_DETONATORS)) {
579 switch (_game._trigger) {
580 case 0:
581 _game._player._stepEnabled = false;
582 _game._player._visible = false;
583 if (_globals[kSexOfRex] == REX_MALE) {
584 _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
585 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 3);
586 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
587 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 3, 1);
588 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
589 } else {
590 _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], true, 8, 1, 0, 0);
591 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
592 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
593 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 1);
594 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
595 }
596 break;
597
598 case 1:
599 _vm->_sound->command(9);
600 _scene->_sequences.remove(_globals._sequenceIndexes[1]);
601 _scene->_dynamicHotspots.remove(_detonatorHotspotId);
602 _game._objects.addToInventory(OBJ_DETONATORS);
603 _vm->_dialogs->showItem(OBJ_DETONATORS, 50326);
604 break;
605
606 case 2:
607 if (_globals[kSexOfRex] == REX_MALE)
608 _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
609 else
610 _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
611
612 _game._player._visible = true;
613 _game._player._stepEnabled = true;
614 break;
615
616 default:
617 break;
618 }
619 }
620 } else if (_action._lookFlag)
621 _vm->_dialogs->show(50328);
622 else if (_action.isAction(VERB_LOOK, NOUN_MONITORING_EQUIPMENT))
623 _vm->_dialogs->show(50310);
624 else if (_action.isAction(VERB_LOOK, NOUN_PHOTON_RIFLES))
625 _vm->_dialogs->show(50311);
626 else if (_action.isAction(VERB_TAKE, NOUN_PHOTON_RIFLES) || _action.isAction(VERB_TAKE, NOUN_NUCLEAR_SLINGSHOT))
627 _vm->_dialogs->show(50312);
628 else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY_CASE))
629 _vm->_dialogs->show(50313);
630 else if (_action.isAction(VERB_LOOK, NOUN_NUCLEAR_SLINGSHOT))
631 _vm->_dialogs->show(50314);
632 else if (_action.isAction(VERB_LOOK, NOUN_WATER_COOLER))
633 _vm->_dialogs->show(50315);
634 else if (_action.isAction(VERB_LOOK, NOUN_STORAGE_BOX))
635 _vm->_dialogs->show(50316);
636 else if (_action.isAction(VERB_OPEN, NOUN_STORAGE_BOX))
637 _vm->_dialogs->show(50317);
638 else if (_action.isAction(VERB_LOOK, NOUN_WARNING_LABEL))
639 _vm->_dialogs->show(50318);
640 else if (_action.isAction(VERB_LOOK, NOUN_DESK))
641 _vm->_dialogs->show(50319);
642 else if (_action.isAction(VERB_LOOK, NOUN_MONITOR))
643 _vm->_dialogs->show(50320);
644 else if (_action.isAction(VERB_LOOK, NOUN_FILE_CABINETS))
645 _vm->_dialogs->show(50322);
646 else if (_action.isAction(VERB_LOOK, NOUN_BOX)) {
647 if (_game._objects.isInRoom(OBJ_DETONATORS))
648 _vm->_dialogs->show(50323);
649 else
650 _vm->_dialogs->show(50324);
651 } else if (_action.isAction(VERB_LOOK, NOUN_DETONATORS) && (_action._savedFields._mainObjectSource == 4))
652 _vm->_dialogs->show(50325);
653 else if (_action.isAction(VERB_LOOK, NOUN_WINDOWS))
654 _vm->_dialogs->show(50327);
655 else if (_action.isAction(VERB_OPEN, NOUN_DISPLAY_CASE))
656 _vm->_dialogs->show(50329);
657 else if (_action.isAction(VERB_THROW, NOUN_DISPLAY_CASE) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)))
658 _vm->_dialogs->show(50330);
659 else
660 return;
661
662 _action._inProgress = false;
663 }
664
665 /*------------------------------------------------------------------------*/
666
Scene504(MADSEngine * vm)667 Scene504::Scene504(MADSEngine *vm) : Scene5xx(vm) {
668 _carAnimationMode = -1;
669 _carFrame = -1;
670 }
671
synchronize(Common::Serializer & s)672 void Scene504::synchronize(Common::Serializer &s) {
673 Scene5xx::synchronize(s);
674
675 s.syncAsSint16LE(_carAnimationMode);
676 s.syncAsSint16LE(_carFrame);
677 }
678
setup()679 void Scene504::setup() {
680 _game._player._spritesPrefix = "";
681 setAAName();
682 }
683
enter()684 void Scene504::enter() {
685 _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 2));
686
687 for (int i = 0; i < 4; i++)
688 _globals._spriteIndexes[5 + i] = _scene->_sprites.addSprites(formAnimName('m', i));
689
690 if (_globals[kSexOfRex] == REX_MALE)
691 _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0));
692 else {
693 _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 1));
694 _scene->changeVariant(1);
695 }
696
697 _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
698 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 0);
699 _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0);
700 _carFrame = -1;
701
702 if ((_scene->_priorSceneId == 505) && (_globals[kHoverCarDestination] != _globals[kHoverCarLocation])){
703 _carAnimationMode = 1;
704 _scene->loadAnimation(formAnimName('A', -1));
705 _vm->_sound->command(14);
706 _scene->_sequences.addTimer(1, 70);
707 _game._player._stepEnabled = false;
708 } else {
709 _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 3));
710 _carAnimationMode = 1;
711 _scene->loadAnimation(formAnimName('A', -1));
712 if ((_scene->_priorSceneId != RETURNING_FROM_DIALOG) && (_scene->_priorSceneId != 505))
713 _globals[kHoverCarLocation] = _scene->_priorSceneId;
714
715 _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1);
716 }
717
718 if (_globals[kTimebombTimer] > 10500)
719 _globals[kTimebombTimer] = 10500;
720
721 sceneEntrySound();
722 }
723
step()724 void Scene504::step() {
725 if ((_carAnimationMode == 1) && (_scene->_animation[0] != nullptr)) {
726 if (_scene->_animation[0]->getCurrentFrame() != _carFrame) {
727 _carFrame = _scene->_animation[0]->getCurrentFrame();
728 int nextFrame;
729
730 if (_carFrame == 1)
731 nextFrame = 0;
732 else
733 nextFrame = -1;
734
735 if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
736 _scene->_animation[0]->setCurrentFrame(nextFrame);
737 _carFrame = nextFrame;
738 }
739 }
740 }
741
742
743 if (_game._trigger >= 70) {
744 switch (_game._trigger) {
745 case 70:
746 if (_globals[kHoverCarDestination] != -1) {
747 _game._player._stepEnabled = false;
748 _scene->freeAnimation();
749 _carAnimationMode = 2;
750 if (((_globals[kHoverCarLocation] >= 500 && _globals[kHoverCarLocation] <= 599) &&
751 (_globals[kHoverCarDestination] >= 500 && _globals[kHoverCarDestination] <= 599)) ||
752 ((_globals[kHoverCarLocation] >= 600 && _globals[kHoverCarLocation] <= 699) &&
753 (_globals[kHoverCarDestination] >= 600 && _globals[kHoverCarDestination] <= 699))) {
754 _scene->loadAnimation(formAnimName('A', -1), 71);
755 } else if (_globals[kHoverCarLocation] > _globals[kHoverCarDestination])
756 _scene->loadAnimation(formAnimName('C', -1), 71);
757 else
758 _scene->loadAnimation(formAnimName('B', -1), 71);
759 }
760 break;
761
762 case 71:
763 _vm->_sound->command(15);
764 _scene->_nextSceneId = _globals[kHoverCarDestination];
765 break;
766
767 default:
768 break;
769 }
770 }
771
772 if ((_globals[kTimebombTimer] >= 10800) && (_globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) && (_game._difficulty != 3)) {
773 _globals[kTimebombStatus] = TIMEBOMB_DEAD;
774 _globals[kTimebombTimer] = 0;
775 _globals[kCheckDaemonTimebomb] = false;
776 _scene->_nextSceneId = 620;
777 }
778 }
779
preActions()780 void Scene504::preActions() {
781 _game._player._needToWalk = false;
782 }
783
actions()784 void Scene504::actions() {
785 if (_action.isAction(VERB_EXIT_FROM, NOUN_CAR)) {
786 _vm->_sound->command(15);
787 _scene->_nextSceneId = _globals[kHoverCarLocation];
788 } else if (_action.isAction(VERB_ACTIVATE, NOUN_CAR_CONTROLS)) {
789 switch (_game._trigger) {
790 case 0:
791 _game._player._stepEnabled = false;
792 _vm->_sound->command(39);
793 _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
794 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
795 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
796 _scene->_sequences.remove(_globals._sequenceIndexes[7]);
797 _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 18, 0, 0, 0);
798 _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
799 break;
800
801 case 1: {
802 int syncIdx = _globals._sequenceIndexes[3];
803 _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
804 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 13);
805 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 6);
806 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
807 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
808 }
809 break;
810
811 case 2:
812 _scene->_sequences.addTimer(10, 3);
813 break;
814
815 case 3:
816 _scene->_sequences.remove(_globals._sequenceIndexes[5]);
817 if (_globals[kSexOfRex] == REX_MALE) {
818 _vm->_sound->command(34);
819 _scene->_sequences.addTimer(60, 4);
820 _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
821 _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
822 } else {
823 _vm->_sound->command(40);
824 _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 18, 0, 0, 0);
825 _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 14);
826 _scene->_sequences.addTimer(120, 5);
827 }
828 break;
829
830 case 4:
831 _game._player._stepEnabled = true;
832 _globals[kHoverCarDestination] = _globals[kHoverCarLocation];
833 _scene->_nextSceneId = 505;
834 break;
835
836 case 5:
837 _game._player._stepEnabled = true;
838 _scene->_sequences.remove(_globals._sequenceIndexes[8]);
839 _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1);
840 _vm->_dialogs->show(50421);
841 break;
842
843 default:
844 break;
845 }
846 } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_INTERIOR_OF_CAR))
847 _vm->_dialogs->show(50412);
848 else if (_action.isAction(VERB_LOOK, NOUN_GLOVE_COMPARTMENT))
849 _vm->_dialogs->show(50410);
850 else if (_action.isAction(VERB_LOOK, NOUN_CAR_CONTROLS) || _action.isAction(VERB_LOOK, NOUN_DASHBOARD))
851 _vm->_dialogs->show(50411);
852 else if (_action.isAction(VERB_LOOK, NOUN_SCENT_PACKET))
853 _vm->_dialogs->show(50413);
854 else if (_action.isAction(VERB_LOOK, NOUN_SODA_CANS))
855 _vm->_dialogs->show(50414);
856 else if (_action.isAction(VERB_LOOK, NOUN_KITTY))
857 _vm->_dialogs->show(50415);
858 else if (_action.isAction(VERB_LOOK, NOUN_WINDSHIELD) || _action.isAction(VERB_LOOK_THROUGH, NOUN_WINDSHIELD))
859 _vm->_dialogs->show(50416);
860 else if (_action.isAction(VERB_LOOK, NOUN_REARVIEW_MIRROR))
861 _vm->_dialogs->show(50417);
862 else if (_action.isAction(VERB_TAKE, NOUN_REARVIEW_MIRROR))
863 _vm->_dialogs->show(50418);
864 else if (_action.isAction(VERB_LOOK, NOUN_MOLDY_SOCK))
865 _vm->_dialogs->show(50419);
866 else if (_action.isAction(VERB_TAKE, NOUN_MOLDY_SOCK))
867 _vm->_dialogs->show(50420);
868 else
869 return;
870
871 _action._inProgress = false;
872 }
873
874 /*------------------------------------------------------------------------*/
875
Scene505(MADSEngine * vm)876 Scene505::Scene505(MADSEngine *vm) : Scene5xx(vm) {
877 _frame = -1;
878 _nextButtonId = -1;
879 _homeSelectedId = -1;
880 _selectedId = -1;
881 _activeCars = -1;
882
883 for (int i = 0; i < 9; i++)
884 _carLocations[i] = -1;
885 }
886
synchronize(Common::Serializer & s)887 void Scene505::synchronize(Common::Serializer &s) {
888 Scene5xx::synchronize(s);
889
890 s.syncAsSint16LE(_frame);
891 s.syncAsSint16LE(_nextButtonId);
892 s.syncAsSint16LE(_homeSelectedId);
893 s.syncAsSint16LE(_selectedId);
894 s.syncAsSint16LE(_activeCars);
895
896 for (int i = 0; i < 9; i++)
897 s.syncAsSint16LE(_carLocations[i]);
898 }
899
setup()900 void Scene505::setup() {
901 _game._player._spritesPrefix = "";
902 setAAName();
903 }
904
enter()905 void Scene505::enter() {
906 for (int i = 0; i < 9; i++)
907 _globals._spriteIndexes[i] = _scene->_sprites.addSprites(formAnimName('a', i + 1));
908
909 _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('b', 1));
910 _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('g', 1));
911 _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('g', 0));
912 _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('t', -1));
913 _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('e', -1));
914
915 if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
916 _globals._sequenceIndexes[12] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[12], false, 6, 1, 0, 0);
917
918 _globals._sequenceIndexes[13] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[13], false, 6, 1, 120, 0);
919 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 60);
920 _scene->_sequences.addTimer(30, 62);
921
922 _carLocations[0] = 501;
923 _carLocations[1] = 506;
924 _carLocations[2] = 511;
925 _carLocations[3] = 513;
926 _carLocations[4] = 601;
927 _carLocations[5] = 604;
928 _carLocations[6] = 607;
929 _carLocations[7] = 609;
930 _carLocations[8] = 612;
931
932 _activeCars = false;
933
934 for (int i = 0; i < 9; i++) {
935 if (_globals[kHoverCarLocation] == _carLocations[i]) {
936 _homeSelectedId = i;
937 if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
938 _selectedId = i;
939 }
940 }
941
942 _game._player._visible = false;
943 _game._player._stepEnabled = false;
944 _frame = -1;
945 _scene->loadAnimation(formAnimName('a', -1));
946 _scene->_animation[0]->setCurrentFrame(86);
947
948 sceneEntrySound();
949 _vm->_sound->command(16);
950 }
951
step()952 void Scene505::step() {
953 if (_frame != _scene->_animation[0]->getCurrentFrame()) {
954 _frame = _scene->_animation[0]->getCurrentFrame();
955 int resetFrame = -1;
956
957 switch (_frame) {
958 case 4:
959 case 24:
960 case 33:
961 case 53:
962 case 62:
963 case 82:
964 if (_nextButtonId == 0x38A)
965 resetFrame = 4;
966 else if (_nextButtonId == 0x38B)
967 resetFrame = 33;
968 else if (_nextButtonId == 0x2DE)
969 resetFrame = 62;
970
971 break;
972
973 case 15:
974 case 44:
975 case 73: {
976 int this_button;
977 int old_select;
978 _vm->_sound->command(17);
979 old_select = _selectedId;
980 if (_frame == 15) {
981 this_button = 0x38A;
982 _selectedId = (_selectedId + 1) % 9;
983 } else if (_frame == 44) {
984 this_button = 0x38B;
985 _selectedId--;
986 if (_selectedId < 0)
987 _selectedId = 8;
988 } else {
989 this_button = 0x2DE;
990 if ((_globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) && (_carLocations[_selectedId] == 501))
991 _vm->_dialogs->show(431);
992 else if (_selectedId != _homeSelectedId) {
993 _nextButtonId = 0;
994 _activeCars = true;
995 _game._player._stepEnabled = false;
996 _scene->_sequences.remove(_globals._sequenceIndexes[1]);
997 _scene->_sequences.remove(_globals._sequenceIndexes[0]);
998 _scene->_sequences.remove(_globals._sequenceIndexes[13]);
999 _globals._sequenceIndexes[13] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[13], false, 6, 1, 0, 0);
1000 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[13], SEQUENCE_TRIGGER_EXPIRE, 0, 63);
1001 _vm->_sound->command(18);
1002 }
1003 }
1004
1005 if (_nextButtonId == this_button)
1006 _nextButtonId = 0;
1007
1008 if (old_select != _selectedId) {
1009 _scene->_sequences.remove(_globals._sequenceIndexes[11]);
1010 _globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, _selectedId + 1);
1011 if (old_select != _homeSelectedId)
1012 _scene->_sequences.remove(_globals._sequenceIndexes[0]);
1013
1014 if (_selectedId != _homeSelectedId) {
1015 _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0 + _selectedId], false, 24, 0, 0, 0);
1016 _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
1017 }
1018 }
1019 break;
1020 }
1021
1022 case 18:
1023 case 19:
1024 case 20:
1025 case 21:
1026 case 22:
1027 case 23:
1028 if (_nextButtonId == 0x38A)
1029 resetFrame = 29 - _frame;
1030
1031 break;
1032
1033 case 26:
1034 case 55:
1035 case 84:
1036 if (_nextButtonId != 0)
1037 resetFrame = 3;
1038
1039 break;
1040
1041 case 27:
1042 case 56:
1043 case 85:
1044 if (_nextButtonId != 0)
1045 resetFrame = 2;
1046
1047 break;
1048
1049 case 29:
1050 case 58:
1051 case 87:
1052 if (_activeCars)
1053 _globals[kHoverCarDestination] = _carLocations[_selectedId];
1054
1055 if (_nextButtonId == 0x38A)
1056 resetFrame = 0;
1057 else if (_nextButtonId == 0x38B)
1058 resetFrame = 29;
1059 else if (_nextButtonId == 0x2DE)
1060 resetFrame = 58;
1061 else
1062 resetFrame = 86;
1063 break;
1064
1065 case 47:
1066 case 48:
1067 case 49:
1068 case 50:
1069 case 51:
1070 case 52:
1071 if (_nextButtonId == 0x38B)
1072 resetFrame = 87 - _frame;
1073
1074 break;
1075
1076 case 76:
1077 case 77:
1078 case 78:
1079 case 79:
1080 case 80:
1081 case 81:
1082 if (_nextButtonId == 0x2DE)
1083 resetFrame = 145 - _frame;
1084
1085 break;
1086
1087 default:
1088 break;
1089 }
1090
1091 if ((resetFrame >= 0) && (resetFrame != _scene->_animation[0]->getCurrentFrame())) {
1092 _scene->_animation[0]->setCurrentFrame(resetFrame);
1093 _frame = resetFrame;
1094 }
1095 }
1096
1097 switch (_game._trigger) {
1098 case 60: {
1099 _game._player._stepEnabled = true;
1100 int syncIdx = _globals._sequenceIndexes[13];
1101 _globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, -2);
1102 _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
1103 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[13], syncIdx);
1104 _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[_homeSelectedId], false, 1);
1105 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
1106 _globals._sequenceIndexes[11] = _scene->_sequences.startCycle(_globals._spriteIndexes[11], false, _selectedId + 1);
1107
1108 if (_selectedId != _homeSelectedId) {
1109 _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0 + _selectedId], false, 24, 0, 0, 0);
1110 _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
1111 }
1112 break;
1113 }
1114
1115 case 61:
1116 _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 8, 0, 0, 0);
1117 _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
1118 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[10], _globals._sequenceIndexes[9]);
1119 break;
1120
1121 case 62:
1122 _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 8, 1, 0, 0);
1123 _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
1124 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
1125 break;
1126
1127 case 63:
1128 _globals[kHoverCarDestination] = _carLocations[_selectedId];
1129 _scene->_nextSceneId = 504;
1130 break;
1131
1132 default:
1133 break;
1134 }
1135 }
1136
actions()1137 void Scene505::actions() {
1138 if (_action.isAction(VERB_PRESS))
1139 _nextButtonId = _action._activeAction._objectNameId;
1140 else if (_action.isAction(VERB_RETURN_TO, NOUN_INSIDE_OF_CAR))
1141 _scene->_nextSceneId = 504;
1142 else if (_action.isAction(VERB_LOOK, NOUN_VIEW_SCREEN))
1143 _vm->_dialogs->show(50510);
1144 else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL))
1145 _vm->_dialogs->show(50511);
1146 else
1147 return;
1148
1149 _action._inProgress = false;
1150 }
1151
1152 /*------------------------------------------------------------------------*/
1153
Scene506(MADSEngine * vm)1154 Scene506::Scene506(MADSEngine *vm) : Scene5xx(vm), _doorPos(0, 0) {
1155 _heroFacing = FACING_DUMMY;
1156
1157 _doorDepth = -1;
1158 _doorSpriteIdx = -1;
1159 _doorSequenceIdx = -1;
1160 _doorWord = -1;
1161
1162 _labDoorFl = false;
1163 _firstDoorFl = false;
1164 _actionFl = false;
1165 }
1166
synchronize(Common::Serializer & s)1167 void Scene506::synchronize(Common::Serializer &s) {
1168 Scene5xx::synchronize(s);
1169
1170 s.syncAsSint16LE(_doorPos.x);
1171 s.syncAsSint16LE(_doorPos.y);
1172
1173 s.syncAsByte(_heroFacing);
1174
1175 s.syncAsSint16LE(_doorDepth);
1176 s.syncAsSint16LE(_doorSpriteIdx);
1177 s.syncAsSint16LE(_doorSequenceIdx);
1178 s.syncAsSint16LE(_doorWord);
1179
1180 s.syncAsByte(_labDoorFl);
1181 s.syncAsByte(_firstDoorFl);
1182 s.syncAsByte(_actionFl);
1183 }
1184
setup()1185 void Scene506::setup() {
1186 setPlayerSpritesPrefix();
1187 setAAName();
1188 _scene->addActiveVocab(VERB_WALK_INTO);
1189 _scene->addActiveVocab(NOUN_SOFTWARE_STORE);
1190 _scene->addActiveVocab(NOUN_LABORATORY);
1191 }
1192
enter()1193 void Scene506::enter() {
1194 _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('q', 0));
1195 _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('q', 1));
1196 _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', -1));
1197 _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_3");
1198
1199 _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
1200 int idx = _scene->_dynamicHotspots.add(NOUN_LABORATORY, VERB_WALK_INTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
1201 int hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(65, 125), FACING_NORTHWEST);
1202 _scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
1203 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
1204 _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
1205 idx = _scene->_dynamicHotspots.add(NOUN_SOFTWARE_STORE, VERB_WALK_INTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
1206 hotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(112, 102), FACING_NORTHWEST);
1207 _scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
1208 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13);
1209
1210 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
1211 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
1212 _firstDoorFl = true;
1213 _actionFl = false;
1214
1215 if (_scene->_priorSceneId == 508) {
1216 _game._player._playerPos = Common::Point(16, 111);
1217 _game._player._facing = FACING_SOUTHEAST;
1218 _scene->_sequences.addTimer(15, 80);
1219 _game._player._stepEnabled = false;
1220 } else if (_scene->_priorSceneId == 507) {
1221 _game._player._playerPos = Common::Point(80, 102);
1222 _game._player._facing = FACING_SOUTHEAST;
1223 _scene->_sequences.addTimer(60, 80);
1224 _game._player._stepEnabled = false;
1225 } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
1226 _game._player._playerPos = Common::Point(138, 116);
1227 _game._player._facing = FACING_NORTHEAST;
1228 _game._player._visible = false;
1229 _game._player._stepEnabled = false;
1230 _scene->_sequences.remove(_globals._sequenceIndexes[3]);
1231 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
1232 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
1233 _scene->loadAnimation(formAnimName('R', 1), 70);
1234 }
1235 sceneEntrySound();
1236 }
1237
step()1238 void Scene506::step() {
1239 if (_game._trigger >= 80) {
1240 if (_firstDoorFl) {
1241 _heroFacing = FACING_SOUTHEAST;
1242 if (_scene->_priorSceneId == 507) {
1243 _doorPos = Common::Point(112, 102);
1244 _doorWord = 0x336;
1245 } else {
1246 _doorPos = Common::Point(65, 125);
1247 _doorWord = 0x37D;
1248 }
1249 }
1250 handleDoorSequences();
1251 }
1252
1253 if (_game._trigger >= 70) {
1254 switch (_game._trigger) {
1255 case 70:
1256 _game._player._visible = true;
1257 _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
1258 _scene->_sequences.addTimer(6, 71);
1259 break;
1260
1261 case 71:
1262 _scene->_sequences.remove(_globals._sequenceIndexes[3]);
1263 _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
1264 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
1265 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
1266 break;
1267
1268 case 72:
1269 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
1270 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
1271 _game._player._stepEnabled = true;
1272 break;
1273
1274 default:
1275 break;
1276 }
1277 }
1278 }
1279
handleDoorSequences()1280 void Scene506::handleDoorSequences() {
1281 _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
1282
1283 if (_firstDoorFl) {
1284 if (_action.isAction(VERB_WALK_INTO, NOUN_SOFTWARE_STORE) || ((_scene->_priorSceneId == 507) && !_actionFl)) {
1285 _doorDepth = 13;
1286 _doorSpriteIdx = _globals._spriteIndexes[2];
1287 _doorSequenceIdx = _globals._sequenceIndexes[2];
1288 _labDoorFl = false;
1289 } else {
1290 _doorDepth = 10;
1291 _doorSpriteIdx = _globals._spriteIndexes[1];
1292 _doorSequenceIdx = _globals._sequenceIndexes[1];
1293 _labDoorFl = true;
1294 }
1295 _firstDoorFl = false;
1296 }
1297
1298 switch (_game._trigger) {
1299 case 0:
1300 case 80:
1301 _game._player._stepEnabled = false;
1302 _scene->_sequences.remove(_doorSequenceIdx);
1303 _doorSequenceIdx = _scene->_sequences.addSpriteCycle(_doorSpriteIdx, false, 7, 1, 0, 0);
1304 _scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
1305 _scene->changeVariant(1);
1306 _scene->_sequences.addSubEntry(_doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 81);
1307 break;
1308
1309
1310 case 81:
1311 _doorSequenceIdx = _scene->_sequences.startCycle(_doorSpriteIdx, false, -2);
1312 _scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
1313 _game._player._walkAnywhere = true;
1314 _game._player.walk(_doorPos, _heroFacing);
1315 _scene->_sequences.addTimer(120, 82);
1316 break;
1317
1318 case 82:
1319 _scene->_sequences.remove(_doorSequenceIdx);
1320 _doorSequenceIdx = _scene->_sequences.addReverseSpriteCycle(_doorSpriteIdx, false, 7, 1, 0, 0);
1321 _scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
1322 if (_actionFl)
1323 _scene->_sequences.addSubEntry(_doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 84);
1324 else
1325 _scene->_sequences.addSubEntry(_doorSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 83);
1326
1327 break;
1328
1329 case 83: {
1330 _doorSequenceIdx = _scene->_sequences.startCycle(_doorSpriteIdx, false, 1);
1331 int idx = _scene->_dynamicHotspots.add(_doorWord, VERB_WALK_INTO, _doorSequenceIdx, Common::Rect(0, 0, 0, 0));
1332 int hotspotId = _scene->_dynamicHotspots.setPosition(idx, _doorPos, FACING_NORTHWEST);
1333 _scene->_dynamicHotspots.setCursor(hotspotId, CURSOR_GO_LEFT);
1334 _scene->_sequences.setDepth(_doorSequenceIdx, _doorDepth);
1335 _firstDoorFl = true;
1336 if (_labDoorFl) {
1337 _globals._spriteIndexes[1] = _doorSpriteIdx;
1338 _globals._sequenceIndexes[1] = _doorSequenceIdx;
1339 } else {
1340 _globals._spriteIndexes[2] = _doorSpriteIdx;
1341 _globals._sequenceIndexes[2] = _doorSequenceIdx;
1342 }
1343 _game._player._stepEnabled = true;
1344
1345 }
1346 break;
1347
1348 case 84:
1349 _actionFl = false;
1350 _game._player._stepEnabled = true;
1351 if (_labDoorFl)
1352 _scene->_nextSceneId = 508;
1353 else
1354 _scene->_nextSceneId = 507;
1355
1356 break;
1357
1358 default:
1359 break;
1360 }
1361 }
1362
actions()1363 void Scene506::actions() {
1364 if (_action.isAction(VERB_WALK_INTO, NOUN_LABORATORY)) {
1365 if (_firstDoorFl) {
1366 _heroFacing = FACING_NORTHWEST;
1367 _doorPos = Common::Point(16, 111);
1368 }
1369 _actionFl = true;
1370 handleDoorSequences();
1371 } else if (_action.isAction(VERB_WALK_INTO, NOUN_SOFTWARE_STORE)) {
1372 if (_firstDoorFl) {
1373 _heroFacing = FACING_NORTHWEST;
1374 _doorPos = Common::Point(80, 102);
1375 }
1376 _actionFl = true;
1377 handleDoorSequences();
1378 } else if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
1379 switch (_game._trigger) {
1380 case 0:
1381 _game._player._stepEnabled = false;
1382 _scene->_sequences.remove(_globals._sequenceIndexes[3]);
1383 _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
1384 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
1385 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
1386 break;
1387
1388 case 1: {
1389 int syncIdx = _globals._sequenceIndexes[3];
1390 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
1391 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
1392 _scene->_sequences.addTimer(6, 2);
1393 }
1394 break;
1395
1396 case 2:
1397 _game._player._visible = false;
1398 _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0);
1399 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
1400 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
1401 break;
1402
1403 case 3: {
1404 int syncIdx = _globals._sequenceIndexes[4];
1405 _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
1406 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
1407 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
1408 _scene->_nextSceneId = 504;
1409 }
1410 break;
1411
1412 default:
1413 break;
1414 }
1415 } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_STREET))
1416 _vm->_dialogs->show(50618);
1417 else if (_action.isAction(VERB_LOOK, NOUN_RESTAURANT))
1418 _vm->_dialogs->show(50610);
1419 else if (_action.isAction(VERB_LOOK, NOUN_MOTEL))
1420 _vm->_dialogs->show(50611);
1421 else if (_action.isAction(VERB_LOOK, NOUN_CYCLE_SHOP))
1422 _vm->_dialogs->show(50612);
1423 else if (_action.isAction(VERB_LOOK, NOUN_AIR_BIKE))
1424 _vm->_dialogs->show(50613);
1425 else if (_action.isAction(VERB_TAKE, NOUN_AIR_BIKE))
1426 _vm->_dialogs->show(50614);
1427 else if (_action.isAction(VERB_LOOK, NOUN_SOFTWARE_STORE))
1428 _vm->_dialogs->show(50615);
1429 else if (_action.isAction(VERB_LOOK, NOUN_LABORATORY))
1430 _vm->_dialogs->show(50616);
1431 else if (_action.isAction(VERB_LOOK, NOUN_STREET_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_WEST))
1432 _vm->_dialogs->show(50617);
1433 else if (_action.isAction(VERB_LOOK, NOUN_SOFTWARE_STORE_SIGN))
1434 _vm->_dialogs->show(50619);
1435 else if (_action.isAction(VERB_LOOK, NOUN_CAR))
1436 _vm->_dialogs->show(50620);
1437 else if (_action.isAction(VERB_LOOK, NOUN_SKY))
1438 _vm->_dialogs->show(50621);
1439 else
1440 return;
1441
1442 _action._inProgress = false;
1443 }
1444
1445 /*------------------------------------------------------------------------*/
1446
Scene507(MADSEngine * vm)1447 Scene507::Scene507(MADSEngine *vm) : Scene5xx(vm) {
1448 _penlightHotspotId = -1;
1449 }
1450
synchronize(Common::Serializer & s)1451 void Scene507::synchronize(Common::Serializer &s) {
1452 Scene5xx::synchronize(s);
1453
1454 s.syncAsSint16LE(_penlightHotspotId);
1455 }
1456
setup()1457 void Scene507::setup() {
1458 setPlayerSpritesPrefix();
1459 setAAName();
1460 _scene->addActiveVocab(NOUN_PENLIGHT);
1461 _scene->addActiveVocab(VERB_WALKTO);
1462 }
1463
enter()1464 void Scene507::enter() {
1465 _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', -1));
1466 _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRD_3");
1467
1468 if ((_game._difficulty != DIFFICULTY_EASY) && (_game._objects[OBJ_PENLIGHT]._roomNumber == _scene->_currentSceneId)) {
1469 _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
1470 _penlightHotspotId = _scene->_dynamicHotspots.add(NOUN_PENLIGHT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
1471 _scene->_dynamicHotspots.setPosition(_penlightHotspotId, Common::Point(233, 152), FACING_SOUTHEAST);
1472 }
1473
1474 if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
1475 _game._player._playerPos = Common::Point(121, 147);
1476 _game._player._facing = FACING_NORTH;
1477 }
1478
1479 sceneEntrySound();
1480 }
actions()1481 void Scene507::actions() {
1482 if (_action.isAction(VERB_WALK_THROUGH, NOUN_ENTRANCE))
1483 _scene->_nextSceneId = 506;
1484 else if (_action.isAction(VERB_TAKE, NOUN_PENLIGHT)) {
1485 if (_game._trigger || !_game._objects.isInInventory(OBJ_PENLIGHT)) {
1486 switch (_game._trigger) {
1487 case 0:
1488 _game._player._stepEnabled = false;
1489 _game._player._visible = false;
1490 _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
1491 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 5);
1492 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
1493 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 5, 1);
1494 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
1495 break;
1496
1497 case 1:
1498 _scene->_sequences.remove(_globals._sequenceIndexes[1]);
1499 _scene->_dynamicHotspots.remove(_penlightHotspotId);
1500 _vm->_sound->command(27);
1501 _game._objects.addToInventory(OBJ_PENLIGHT);
1502 _vm->_dialogs->showItem(OBJ_PENLIGHT, 50730);
1503 break;
1504
1505 case 2:
1506 _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
1507 _game._player._visible = true;
1508 _game._player._stepEnabled = true;
1509 break;
1510
1511 default:
1512 break;
1513 }
1514 }
1515 } else if (_action._lookFlag)
1516 _vm->_dialogs->show(50722);
1517 else if (_action.isAction(VERB_LOOK, NOUN_SWIRLING_LIGHT))
1518 _vm->_dialogs->show(50710);
1519 else if (_action.isAction(VERB_TAKE, NOUN_SWIRLING_LIGHT))
1520 _vm->_dialogs->show(50711);
1521 else if (_action.isAction(VERB_LOOK, NOUN_OLD_SOFTWARE))
1522 _vm->_dialogs->show(50712);
1523 else if (_action.isAction(VERB_TAKE, NOUN_OLD_SOFTWARE))
1524 _vm->_dialogs->show(50713);
1525 else if (_action.isAction(VERB_LOOK, NOUN_ADVERTISEMENT))
1526 _vm->_dialogs->show(50714);
1527 else if (_action.isAction(VERB_LOOK, NOUN_ADVERTISING_POSTER))
1528 _vm->_dialogs->show(50715);
1529 else if (_action.isAction(VERB_LOOK, NOUN_SIGN)) {
1530 if (_scene->_customDest.x < 100)
1531 _vm->_dialogs->show(50726);
1532 else
1533 _vm->_dialogs->show(50716);
1534 } else if (_action.isAction(VERB_LOOK, NOUN_HOTTEST_SOFTWARE))
1535 _vm->_dialogs->show(50717);
1536 else if (_action.isAction(VERB_LOOK, NOUN_SOFTWARE_SHELF))
1537 _vm->_dialogs->show(50718);
1538 else if (_action.isAction(VERB_LOOK, NOUN_SENSOR))
1539 _vm->_dialogs->show(50719);
1540 else if (_action.isAction(VERB_LOOK, NOUN_CASH_REGISTER))
1541 _vm->_dialogs->show(50720);
1542 else if (_action.isAction(VERB_LOOK, NOUN_PAD_OF_PAPER))
1543 _vm->_dialogs->show(50721);
1544 else if (_action.isAction(VERB_OPEN, NOUN_CASH_REGISTER))
1545 _vm->_dialogs->show(50723);
1546 else if (_action.isAction(VERB_LOOK, NOUN_BARGAIN_VAT))
1547 _vm->_dialogs->show(50724);
1548 else if (_action.isAction(VERB_LOOK, NOUN_WINDOW))
1549 _vm->_dialogs->show(50725);
1550 else if (_action.isAction(VERB_WALK_BEHIND, NOUN_COUNTER)) {
1551 // WORKAROUND: Empty handling to prevent default "can't do that" dialogs showing
1552 } else if (_action.isAction(VERB_LOOK, NOUN_COUNTER)) {
1553 if (_game._objects.isInRoom(OBJ_PENLIGHT))
1554 _vm->_dialogs->show(50728);
1555 else
1556 _vm->_dialogs->show(50727);
1557 } else if (_action.isAction(VERB_LOOK, NOUN_PENLIGHT) && !_game._objects.isInInventory(OBJ_PENLIGHT)) {
1558 if (_game._objects.isInRoom(OBJ_PENLIGHT))
1559 _vm->_dialogs->show(50729);
1560 } else if (_action.isAction(VERB_LOOK, NOUN_EMERGENCY_LIGHT))
1561 _vm->_dialogs->show(50731);
1562 else
1563 return;
1564
1565 _action._inProgress = false;
1566 }
1567
1568 /*------------------------------------------------------------------------*/
1569
Scene508(MADSEngine * vm)1570 Scene508::Scene508(MADSEngine *vm) : Scene5xx(vm) {
1571 _chosenObject = -1;
1572 }
1573
synchronize(Common::Serializer & s)1574 void Scene508::synchronize(Common::Serializer &s) {
1575 Scene5xx::synchronize(s);
1576
1577 s.syncAsSint16LE(_chosenObject);
1578 }
1579
setup()1580 void Scene508::setup() {
1581 setPlayerSpritesPrefix();
1582 setAAName();
1583 _scene->addActiveVocab(NOUN_SPINACH_PATCH_DOLL);
1584 _scene->addActiveVocab(VERB_WALKTO);
1585 _scene->addActiveVocab(NOUN_LASER_BEAM);
1586 }
1587
enter()1588 void Scene508::enter() {
1589 _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 0));
1590 _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('m', 0));
1591 _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('h', 0));
1592 _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('l', 2));
1593 _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('t', 0));
1594 _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*RXMRC_9");
1595 _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('l', 3));
1596
1597 if (!_game._visitedScenes._sceneRevisited) {
1598 _globals[kLaserOn] = false;
1599 _chosenObject = 0;
1600 }
1601
1602 if (!_globals[kLaserOn]) {
1603 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
1604 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
1605 _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
1606 int idx = _scene->_dynamicHotspots.add(NOUN_SPINACH_PATCH_DOLL, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
1607 _scene->_dynamicHotspots.setPosition(idx, Common::Point(57, 116), FACING_NORTHEAST);
1608 _scene->_hotspots.activate(NOUN_HOLE, false);
1609 _scene->_hotspots.activate(NOUN_LASER_BEAM, false);
1610 } else {
1611 _scene->changeVariant(1);
1612 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
1613 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
1614 _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
1615 _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 11);
1616 int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
1617 _scene->_dynamicHotspots.setPosition(idx, Common::Point(57, 116), FACING_NORTHEAST);
1618 _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 0);
1619 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 6, 8);
1620 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 6);
1621 if (_globals[kLaserHoleIsThere]) {
1622 _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, -2);
1623 _scene->_hotspots.activate(NOUN_HOLE, true);
1624 _scene->_hotspots.activate(NOUN_LASER_BEAM, true);
1625 }
1626 _vm->_sound->command(21);
1627 }
1628 _vm->_sound->command(20);
1629
1630 if (_scene->_priorSceneId == 515) {
1631 _game._player._playerPos = Common::Point(57, 116);
1632 _game._player._facing = FACING_NORTHEAST;
1633 } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
1634 _game._player._playerPos = Common::Point(289, 139);
1635 _game._player._facing = FACING_WEST;
1636 }
1637
1638 sceneEntrySound();
1639 _game.loadQuoteSet(0x273, 0);
1640
1641 if (_scene->_roomChanged) {
1642 _game._objects.addToInventory(OBJ_COMPACT_CASE);
1643 _game._objects.addToInventory(OBJ_REARVIEW_MIRROR);
1644 }
1645 }
1646
preActions()1647 void Scene508::preActions() {
1648 if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
1649 _game._player._walkOffScreenSceneId = 506;
1650 }
1651
handlePedestral()1652 void Scene508::handlePedestral() {
1653 if (!_globals[kLaserOn])
1654 _vm->_dialogs->show(50835);
1655
1656 if (_globals[kLaserHoleIsThere])
1657 _vm->_dialogs->show(50836);
1658
1659 if (_globals[kLaserOn] && !_globals[kLaserHoleIsThere]) {
1660 switch (_game._trigger) {
1661 case 0:
1662 _game._player._stepEnabled = false;
1663 _game._player._visible = false;
1664 _globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], false, 9, 1, 0, 0);
1665 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
1666 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[6]);
1667 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 4, 1);
1668 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
1669 break;
1670
1671 case 1:
1672 if (_chosenObject == 2)
1673 _game._objects.removeFromInventory(OBJ_COMPACT_CASE, 1);
1674 else
1675 _game._objects.removeFromInventory(OBJ_REARVIEW_MIRROR, 1);
1676
1677 _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1, 0, 0);
1678 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
1679 break;
1680
1681 case 2:
1682 _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, -2);
1683 _scene->_hotspots.activate(NOUN_HOLE, true);
1684 _scene->_hotspots.activate(NOUN_LASER_BEAM, true);
1685 break;
1686
1687 case 3:
1688 _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[6]);
1689 _game._player._visible = true;
1690 _scene->_sequences.addTimer(120, 4);
1691 break;
1692
1693 case 4:
1694 _vm->_dialogs->show(50834);
1695 _globals[kLaserHoleIsThere] = true;
1696 _scene->_nextSceneId = 515;
1697 break;
1698
1699 default:
1700 break;
1701 }
1702 }
1703 }
1704
actions()1705 void Scene508::actions() {
1706 if (_action.isAction(VERB_PULL, NOUN_LEVER)) {
1707 if (!_globals[kLaserOn]) {
1708 switch (_game._trigger) {
1709 case 0:
1710 _game._player._stepEnabled = false;
1711 _scene->_kernelMessages.reset();
1712 _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 2, 120, _game.getQuote(0x273));
1713 break;
1714
1715 case 2:
1716 _game._player._visible = false;
1717 _scene->_sequences.remove(_globals._sequenceIndexes[3]);
1718 _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 10, 1, 0, 0);
1719 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 7);
1720 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], -1);
1721 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
1722 break;
1723
1724 case 3:
1725 _vm->_sound->command(19);
1726 _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 1, 0, 0);
1727 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 6);
1728 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
1729 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
1730 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
1731 _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[1]);
1732 _game._player._visible = true;
1733 _scene->_sequences.addTimer(15, 5);
1734 break;
1735
1736 case 4:
1737 _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 0);
1738 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 6, 8);
1739 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 6);
1740 break;
1741
1742 case 5:
1743 _scene->_sequences.remove(_globals._sequenceIndexes[5]);
1744 _scene->loadAnimation(formAnimName('B', 1), 6);
1745 break;
1746
1747 case 6: {
1748 _vm->_sound->command(22);
1749 _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
1750 _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 11);
1751 int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
1752 _scene->_dynamicHotspots.setPosition(idx, Common::Point(57, 116), FACING_NORTHEAST);
1753 _scene->_kernelMessages.reset();
1754 _scene->changeVariant(1);
1755 _scene->_sequences.addTimer(30, 7);
1756 }
1757 break;
1758
1759 case 7:
1760 _globals[kLaserOn] = true;
1761 _vm->_dialogs->show(50833);
1762 _game._player._stepEnabled = true;
1763 break;
1764
1765 default:
1766 break;
1767 }
1768 } else {
1769 _vm->_dialogs->show(50837);
1770 }
1771 } else if (_action.isAction(VERB_REFLECT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM) || _action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_PEDESTAL) || _action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM)) {
1772 _chosenObject = 1;
1773 handlePedestral();
1774 } else if (_action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_PEDESTAL) || _action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM) || _action.isAction(VERB_REFLECT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM)) {
1775 _chosenObject = 2;
1776 handlePedestral();
1777 } else if (_action._lookFlag)
1778 _vm->_dialogs->show(50822);
1779 else if (_action.isAction(VERB_LOOK, NOUN_TARGET_AREA))
1780 _vm->_dialogs->show(50810);
1781 else if (_action.isAction(VERB_LOOK, NOUN_SPINACH_PATCH_DOLL))
1782 _vm->_dialogs->show(50811);
1783 else if (_action.isAction(VERB_TAKE, NOUN_SPINACH_PATCH_DOLL))
1784 _vm->_dialogs->show(50812);
1785 else if (_action.isAction(VERB_LOOK, NOUN_SAND_BAGS))
1786 _vm->_dialogs->show(50816);
1787 else if (_action.isAction(VERB_TAKE, NOUN_SAND_BAGS))
1788 _vm->_dialogs->show(50817);
1789 else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_STATION))
1790 _vm->_dialogs->show(50818);
1791 else if (_action.isAction(VERB_LOOK, NOUN_MONITOR)) {
1792 if (_globals[kLaserOn])
1793 _vm->_dialogs->show(50820);
1794 else
1795 _vm->_dialogs->show(50819);
1796 } else if (_action.isAction(VERB_LOOK, NOUN_LASER_CANNON)) {
1797 if (_globals[kLaserOn])
1798 _vm->_dialogs->show(50822);
1799 else
1800 _vm->_dialogs->show(50821);
1801 } else if (_action.isAction(VERB_TAKE, NOUN_LASER_CANNON))
1802 _vm->_dialogs->show(50823);
1803 else if (_action.isAction(VERB_LOOK, NOUN_LEVER)) {
1804 if (_globals[kLaserOn])
1805 _vm->_dialogs->show(50825);
1806 else
1807 _vm->_dialogs->show(50824);
1808 } else if (_action.isAction(VERB_PUSH, NOUN_LEVER))
1809 _vm->_dialogs->show(50826);
1810 else if (_action.isAction(VERB_LOOK, NOUN_LASER_BEAM)) {
1811 if (_globals[kLaserHoleIsThere])
1812 _vm->_dialogs->show(50828);
1813 else
1814 _vm->_dialogs->show(50827);
1815 } else if (_action.isAction(VERB_TAKE, NOUN_LASER_BEAM))
1816 _vm->_dialogs->show(50829);
1817 else if (_action.isAction(VERB_LOOK, NOUN_CEILING)) {
1818 if (_globals[kLaserHoleIsThere])
1819 _vm->_dialogs->show(50831);
1820 else
1821 _vm->_dialogs->show(50830);
1822 } else if (_action.isAction(VERB_LOOK, NOUN_WALL))
1823 _vm->_dialogs->show(50832);
1824 else if (_action.isAction(VERB_LOOK, NOUN_PEDESTAL)) {
1825 if (!_globals[kLaserOn])
1826 _vm->_dialogs->show(50813);
1827 else if (!_globals[kLaserHoleIsThere])
1828 _vm->_dialogs->show(50814);
1829 else
1830 _vm->_dialogs->show(50815);
1831 } else
1832 return;
1833
1834 _action._inProgress = false;
1835 }
1836
1837 /*------------------------------------------------------------------------*/
1838
Scene511(MADSEngine * vm)1839 Scene511::Scene511(MADSEngine *vm) : Scene5xx(vm) {
1840 _handingLine = false;
1841 _lineMoving = false;
1842
1843 _lineAnimationMode = -1;
1844 _lineFrame = -1;
1845 _lineAnimationPosition = -1;
1846 }
1847
synchronize(Common::Serializer & s)1848 void Scene511::synchronize(Common::Serializer &s) {
1849 Scene5xx::synchronize(s);
1850
1851 s.syncAsByte(_handingLine);
1852 s.syncAsByte(_lineMoving);
1853
1854 s.syncAsSint16LE(_lineAnimationMode);
1855 s.syncAsSint16LE(_lineFrame);
1856 s.syncAsSint16LE(_lineAnimationPosition);
1857 }
1858
setup()1859 void Scene511::setup() {
1860 setPlayerSpritesPrefix();
1861 setAAName();
1862 _scene->addActiveVocab(NOUN_BOAT);
1863 _scene->addActiveVocab(NOUN_FISHING_LINE);
1864 _scene->addActiveVocab(VERB_WALKTO);
1865 }
1866
enter()1867 void Scene511::enter() {
1868 _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
1869 _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_6");
1870
1871 if (_scene->_priorSceneId != RETURNING_FROM_DIALOG)
1872 _handingLine = false;
1873
1874 if (_globals[kBoatRaised]) {
1875 _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 0));
1876 _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1);
1877 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3);
1878 _scene->_hotspots.activate(NOUN_BOAT, false);
1879 int idx = _scene->_dynamicHotspots.add(NOUN_BOAT, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
1880 _scene->_dynamicHotspots.setPosition(idx, Common::Point(75, 124), FACING_NORTH);
1881 _scene->_hotspots.activate(NOUN_ROPE, false);
1882 } else {
1883 _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('b', 2));
1884 _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 3));
1885 _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('b', 1));
1886
1887 _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 1, 1, 0, 0);
1888 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 5);
1889
1890 _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
1891 _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
1892
1893 _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1);
1894 _scene->_sequences.setDepth(_globals._sequenceIndexes[6],5);
1895
1896 _scene->_hotspots.activate(NOUN_ROPE, true);
1897 _scene->_hotspots.activate(NOUN_BOAT, true);
1898 _scene->changeVariant(1);
1899 }
1900
1901 int frame = 0;
1902 if (_globals[kLineStatus] == 2)
1903 frame = -1;
1904 else if (_globals[kLineStatus] == 3)
1905 frame = -2;
1906
1907 if (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3) {
1908 _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('b', 4));
1909 _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, frame);
1910 int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
1911 _scene->_dynamicHotspots.setPosition(idx, Common::Point(26, 153), FACING_NORTHEAST);
1912 _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 3);
1913 if (_globals[kBoatRaised])
1914 _scene->changeVariant(2);
1915 }
1916
1917 _lineFrame = -1;
1918 _lineMoving = false;
1919
1920 _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
1921 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
1922
1923 if (_scene->_priorSceneId == 512) {
1924 _game._player._playerPos = Common::Point(60, 112);
1925 _game._player._facing = FACING_SOUTHEAST;
1926 } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
1927 _game._player._playerPos = Common::Point(55, 152);
1928 _game._player._facing = FACING_NORTHWEST;
1929 _game._player._visible = false;
1930 _game._player._stepEnabled = false;
1931 _scene->_sequences.remove(_globals._sequenceIndexes[1]);
1932 _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
1933 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
1934 _scene->loadAnimation(formAnimName('R', 1), 70);
1935 } else if (_handingLine) {
1936 _game._player._visible = false;
1937 _lineAnimationMode = 1;
1938 _lineAnimationPosition = 1;
1939 _scene->loadAnimation(formAnimName('R', -1));
1940 _lineFrame = 2;
1941 }
1942 sceneEntrySound();
1943 }
1944
step()1945 void Scene511::step() {
1946 if ((_lineAnimationMode == 1) && _scene->_animation[0]) {
1947 if (_lineFrame != _scene->_animation[0]->getCurrentFrame()) {
1948 _lineFrame = _scene->_animation[0]->getCurrentFrame();
1949 int resetFrame = -1;
1950
1951 if ((_lineAnimationPosition == 2) && (_lineFrame == 14))
1952 _lineMoving = false;
1953
1954 if (_lineAnimationPosition == 1) {
1955 if (_lineFrame == 3) {
1956 _lineMoving = false;
1957 resetFrame = 2;
1958 }
1959
1960 if (_handingLine)
1961 resetFrame = 2;
1962 }
1963
1964 if ((resetFrame >= 0) && (resetFrame != _scene->_animation[0]->getCurrentFrame())) {
1965 _scene->_animation[0]->setCurrentFrame(resetFrame);
1966 _lineFrame = resetFrame;
1967 }
1968 }
1969 }
1970
1971 switch (_game._trigger) {
1972 case 70:
1973 _game._player._visible = true;
1974 _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
1975 _scene->_sequences.addTimer(6, 71);
1976 break;
1977
1978 case 71:
1979 _scene->_sequences.remove(_globals._sequenceIndexes[1]);
1980 _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
1981 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
1982 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
1983 break;
1984
1985 case 72:
1986 _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
1987 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
1988 _game._player._stepEnabled = true;
1989 break;
1990
1991 default:
1992 break;
1993 }
1994 }
1995
preActions()1996 void Scene511::preActions() {
1997 if (!_handingLine)
1998 return;
1999
2000 if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_FISHING_LINE) || _action.isAction(VERB_TALKTO))
2001 _game._player._needToWalk = false;
2002
2003 if ((!_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_BOAT) || !_action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_BOAT)) && _game._player._needToWalk) {
2004 if (_game._trigger == 0) {
2005 _game._player._readyToWalk = false;
2006 _game._player._stepEnabled = false;
2007 _scene->freeAnimation ();
2008 _lineAnimationMode = 2;
2009 _scene->loadAnimation(formAnimName('R',2), 1);
2010 } else if (_game._trigger == 1) {
2011 _game._player._visible = true;
2012 _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
2013 _game._objects.setRoom(OBJ_FISHING_LINE, 1);
2014 _handingLine = false;
2015 _game._player._stepEnabled = true;
2016 _game._player._readyToWalk = true;
2017 }
2018 }
2019 }
2020
actions()2021 void Scene511::actions() {
2022 if (_action.isAction(VERB_WALK_INTO, NOUN_RESTAURANT))
2023 _scene->_nextSceneId = 512;
2024 else if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
2025 switch (_game._trigger) {
2026 case 0:
2027 _game._player._stepEnabled = false;
2028 _scene->_sequences.remove(_globals._sequenceIndexes[1]);
2029 _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
2030 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
2031 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
2032 break;
2033
2034 case 1: {
2035 int syncIdx = _globals._sequenceIndexes[1];
2036 _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
2037 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
2038 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx);
2039 _scene->_sequences.addTimer(6, 2);
2040 }
2041 break;
2042
2043 case 2:
2044 _game._player._visible = false;
2045 _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 8, 1, 0, 0);
2046 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
2047 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
2048 break;
2049
2050 case 3: {
2051 int syncIdx = _globals._sequenceIndexes[4];
2052 _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
2053 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
2054 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
2055 _scene->_nextSceneId = 504;
2056 }
2057 break;
2058
2059 default:
2060 break;
2061 }
2062 } else if (_action.isAction(VERB_TAKE, NOUN_FISHING_LINE)) {
2063 if (!_globals[kBoatRaised]) {
2064 if (_globals[kLineStatus] == 2) {
2065 if (_globals[kLineStatus] != 3) {
2066 if (_game._trigger == 0) {
2067 _game._player._stepEnabled = false;
2068 _game._player._visible = false;
2069 _game._player.update();
2070 _lineAnimationMode = 1;
2071 _lineAnimationPosition = 1;
2072 _lineMoving = true;
2073 _scene->loadAnimation(formAnimName('R', -1));
2074 _scene->_sequences.addTimer(1, 1);
2075 } else if (_game._trigger == 1) {
2076 if (_lineMoving) {
2077 _scene->_sequences.addTimer(1, 1);
2078 } else {
2079 _game._objects.addToInventory(OBJ_FISHING_LINE);
2080 _lineMoving = true;
2081 _handingLine = true;
2082 _game._player._stepEnabled = true;
2083 }
2084 }
2085 } else
2086 _vm->_dialogs->show(51129);
2087 } else
2088 return;
2089 } else {
2090 _vm->_dialogs->show(51130);
2091 }
2092 } else if (_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_BOAT) ||
2093 _action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_BOAT)) {
2094 if (_globals[kBoatRaised])
2095 _vm->_dialogs->show(51131);
2096 else if (_globals[kLineStatus] == 1)
2097 _vm->_dialogs->show(51130);
2098 else if (!_globals[kBoatRaised] && _handingLine) {
2099 if (_globals[kLineStatus] != 3) {
2100 if (_game._trigger == 0) {
2101 _game._player._stepEnabled = false;
2102 _scene->_sequences.remove(_globals._sequenceIndexes[7]);
2103 _lineMoving = true;
2104 _lineAnimationPosition = 2;
2105 _scene->_sequences.addTimer(1, 1);
2106 } else if (_game._trigger == 1) {
2107 if (_lineMoving)
2108 _scene->_sequences.addTimer(1, 1);
2109 else {
2110 _game._player._visible = true;
2111 _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, -2);
2112 _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 4);
2113 int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[7], Common::Rect(0, 0, 0, 0));
2114 _scene->_dynamicHotspots.setPosition(idx, Common::Point(26, 153), FACING_NORTHEAST);
2115 _game._objects.removeFromInventory(OBJ_FISHING_LINE, 1);
2116 _handingLine = false;
2117 _lineMoving = true;
2118 _globals[kLineStatus] = 3;
2119 _game._player._stepEnabled = true;
2120
2121 if (_scene->_animation[0])
2122 _scene->_animation[0]->eraseSprites();
2123 _game._player.update();
2124 }
2125 }
2126 }
2127 }
2128 } else if (_action.isAction(VERB_LOOK, NOUN_STREET) || _action._lookFlag) {
2129 if (_globals[kLineStatus] == 2)
2130 _vm->_dialogs->show(51110);
2131 else {
2132 if (_globals[kLineStatus] == 3)
2133 _vm->_dialogs->show(51111);
2134 else
2135 _vm->_dialogs->show(51112);
2136 }
2137 } else if (_action.isAction(VERB_LOOK, NOUN_CAR))
2138 _vm->_dialogs->show(51113);
2139 else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK))
2140 _vm->_dialogs->show(51114);
2141 else if (_action.isAction(VERB_WALK_DOWN, NOUN_SIDEWALK_TO_EAST) || _action.isAction(VERB_WALK_DOWN, NOUN_SIDEWALK_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_EAST))
2142 _vm->_dialogs->show(51115);
2143 else if (_action.isAction(VERB_LOOK, NOUN_PLEASURE_DOME))
2144 _vm->_dialogs->show(51116);
2145 else if (_action.isAction(VERB_LOOK, NOUN_TICKET_BOOTH))
2146 _vm->_dialogs->show(51117);
2147 else if (_action.isAction(VERB_LOOK, NOUN_DOME_ENTRANCE))
2148 _vm->_dialogs->show(51118);
2149 else if (_action.isAction(VERB_UNLOCK, NOUN_PADLOCK_KEY, NOUN_DOME_ENTRANCE) || _action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_DOME_ENTRANCE))
2150 _vm->_dialogs->show(51119);
2151 else if ( (_action.isAction(VERB_PUT) || _action.isAction(VERB_THROW))
2152 && (_action.isObject(NOUN_TIMEBOMB) || _action.isObject(NOUN_BOMB) || _action.isObject(NOUN_BOMBS))
2153 && _action.isObject(NOUN_DOME_ENTRANCE))
2154 _vm->_dialogs->show(51120);
2155 else if (_action.isAction(VERB_LOOK, NOUN_RESTAURANT)) {
2156 if (_globals[kBoatRaised])
2157 _vm->_dialogs->show(51121);
2158 else
2159 _vm->_dialogs->show(51128);
2160 } else if (_action.isAction(VERB_LOOK, NOUN_PORTHOLE))
2161 _vm->_dialogs->show(51122);
2162 else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 2))
2163 _vm->_dialogs->show(51126);
2164 else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_action._mainObjectSource == CAT_HOTSPOT) && (_globals[kLineStatus] == 3))
2165 _vm->_dialogs->show(51133);
2166 else if (_action.isAction(VERB_LOOK, NOUN_STATUE))
2167 _vm->_dialogs->show(51127);
2168 else if (_action.isAction(VERB_LOOK, NOUN_BOAT))
2169 if (_globals[kBoatRaised])
2170 _vm->_dialogs->show(51123);
2171 else if (_globals[kLineStatus] != 3)
2172 _vm->_dialogs->show(51124);
2173 else
2174 _vm->_dialogs->show(51125);
2175 else if (_action.isAction(VERB_LOOK, NOUN_FISHING_LINE) && (_globals[kLineStatus] == 3))
2176 _vm->_dialogs->show(51125);
2177 else
2178 return;
2179
2180 _action._inProgress = false;
2181 }
2182
2183 /*------------------------------------------------------------------------*/
2184
Scene512(MADSEngine * vm)2185 Scene512::Scene512(MADSEngine *vm) : Scene5xx(vm) {
2186 _fishingRodHotspotId = -1;
2187 _keyHotspotId = -1;
2188 }
2189
synchronize(Common::Serializer & s)2190 void Scene512::synchronize(Common::Serializer &s) {
2191 Scene5xx::synchronize(s);
2192
2193 s.syncAsSint16LE(_fishingRodHotspotId);
2194 s.syncAsSint16LE(_keyHotspotId);
2195 }
2196
setup()2197 void Scene512::setup() {
2198 setPlayerSpritesPrefix();
2199 setAAName();
2200 _scene->addActiveVocab(NOUN_FISHING_ROD);
2201 _scene->addActiveVocab(VERB_WALKTO);
2202 _scene->addActiveVocab(NOUN_PADLOCK_KEY);
2203 _scene->addActiveVocab(NOUN_REGISTER_DRAWER);
2204 }
2205
enter()2206 void Scene512::enter() {
2207 _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('r', -1));
2208 _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_9");
2209 _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RXMRC_8");
2210 _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
2211 _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 1));
2212 _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 2));
2213 _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 3));
2214
2215 if (_game._objects[OBJ_FISHING_ROD]._roomNumber == _scene->_currentSceneId) {
2216 _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0);
2217 _fishingRodHotspotId = _scene->_dynamicHotspots.add(NOUN_FISHING_ROD, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
2218 _scene->_dynamicHotspots.setPosition(_fishingRodHotspotId, Common::Point(199, 101), FACING_NORTHEAST);
2219 }
2220
2221 if (!_game._visitedScenes._sceneRevisited)
2222 _globals[kRegisterOpen] = false;
2223
2224 _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
2225 if (_game._difficulty == DIFFICULTY_EASY) {
2226 if (_game._objects[OBJ_PADLOCK_KEY]._roomNumber == _scene->_currentSceneId) {
2227 _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 0, 0, 0);
2228 _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 3);
2229 _keyHotspotId = _scene->_dynamicHotspots.add(NOUN_PADLOCK_KEY, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
2230 _scene->_dynamicHotspots.setPosition(_keyHotspotId, Common::Point(218, 152), FACING_NORTHEAST);
2231 }
2232 if (_globals[kRegisterOpen]) {
2233 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
2234 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
2235 _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
2236 }
2237 } else if (_globals[kRegisterOpen]) {
2238 if (_game._objects[OBJ_PADLOCK_KEY]._roomNumber == _scene->_currentSceneId) {
2239 _scene->_hotspots.activate(NOUN_PADLOCK_KEY, true);
2240 _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
2241 _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 3);
2242 } else {
2243 _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
2244 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
2245 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
2246 }
2247 } else
2248 _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
2249
2250 if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
2251 _game._player._playerPos = Common::Point(144, 152);
2252 _game._player._facing = FACING_NORTHEAST;
2253 }
2254
2255 sceneEntrySound();
2256 }
2257
actions()2258 void Scene512::actions() {
2259 if (_action.isAction(VERB_WALK, NOUN_OUTSIDE))
2260 _scene->_nextSceneId = 511;
2261 else if (_action.isAction(VERB_TAKE, NOUN_FISHING_ROD)) {
2262 if (_game._trigger || !_game._objects.isInInventory(OBJ_FISHING_ROD)) {
2263 switch (_game._trigger) {
2264 case 0:
2265 _game._player._stepEnabled = false;
2266 _game._player._visible = false;
2267 _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
2268 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
2269 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 5, 1);
2270 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
2271 break;
2272
2273 case 1:
2274 _vm->_sound->command(9);
2275 _scene->_sequences.remove(_globals._sequenceIndexes[1]);
2276 _scene->_dynamicHotspots.remove(_fishingRodHotspotId);
2277 _game._objects.addToInventory(OBJ_FISHING_ROD);
2278 _vm->_dialogs->showItem(OBJ_FISHING_ROD, 51217);
2279 break;
2280
2281 case 2:
2282 _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
2283 _game._player._visible = true;
2284 _game._player._stepEnabled = true;
2285 break;
2286
2287 default:
2288 break;
2289 }
2290 }
2291 } else if (_action.isAction(VERB_OPEN, NOUN_CASH_REGISTER)) {
2292 if (!_globals[kRegisterOpen]) {
2293 switch (_game._trigger) {
2294 case 0:
2295 _vm->_dialogs->show(51236);
2296 _game._player._stepEnabled = false;
2297 _game._player._facing = FACING_NORTH;
2298 _scene->_sequences.addTimer(15, 1);
2299 break;
2300
2301 case 1:
2302 _game._player._visible = false;
2303 _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 9, 1, 0, 0);
2304 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 3);
2305 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[8]);
2306 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
2307 break;
2308
2309 case 2:
2310 _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[8]);
2311 _game._player._visible = true;
2312 _scene->_sequences.addTimer(30, 3);
2313 break;
2314
2315 case 3:
2316 _game._player._facing = FACING_NORTHEAST;
2317 if (!_game._objects.isInRoom(OBJ_PADLOCK_KEY) || (_game._difficulty == DIFFICULTY_EASY)) {
2318 _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
2319 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
2320 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
2321 } else {
2322 _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
2323 _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 3);
2324 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 5);
2325 }
2326 _vm->_sound->command(23);
2327 break;
2328
2329 case 4:
2330 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
2331 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
2332 _scene->_sequences.addTimer(60, 6);
2333 break;
2334
2335 case 5:
2336 _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 14, 0, 0, 0);
2337 _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 3);
2338 _scene->_hotspots.activate(NOUN_PADLOCK_KEY, true);
2339 _scene->_sequences.addTimer(60, 6);
2340 break;
2341
2342 case 6:
2343 _globals[kRegisterOpen] = true;
2344 _game._player._stepEnabled = true;
2345 break;
2346
2347 default:
2348 break;
2349 }
2350 } else
2351 _vm->_dialogs->show(51239);
2352 } else if (_action.isAction(VERB_CLOSE, NOUN_CASH_REGISTER) && _globals[kRegisterOpen]) {
2353 switch (_game._trigger) {
2354 case 0:
2355 _game._player._stepEnabled = false;
2356 _game._player._visible = false;
2357 _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 10, 1, 0, 0);
2358 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2);
2359 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
2360 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
2361 break;
2362
2363 case 1:
2364 _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
2365 _game._player._visible = true;
2366 if (!_game._objects.isInRoom(OBJ_PADLOCK_KEY) || _game._difficulty == DIFFICULTY_EASY) {
2367 _scene->_sequences.remove(_globals._sequenceIndexes[3]);
2368 _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0);
2369 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
2370 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
2371 } else {
2372 _scene->_sequences.remove(_globals._sequenceIndexes[5]);
2373 _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 12, 1, 0, 0);
2374 _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 3);
2375 _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
2376 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
2377 }
2378 break;
2379
2380 case 2:
2381 _globals[kRegisterOpen] = false;
2382 _game._player._stepEnabled = true;
2383 break;
2384
2385 default:
2386 break;
2387 }
2388 } else if (_action.isAction(VERB_TAKE, NOUN_PADLOCK_KEY)) {
2389 if (_game._trigger || !_game._objects.isInInventory(OBJ_PADLOCK_KEY)) {
2390 switch (_game._trigger) {
2391 case 0:
2392 _game._player._stepEnabled = false;
2393 _game._player._visible = false;
2394
2395 int endVal;
2396 if (_game._player._playerPos == Common::Point(218, 152))
2397 endVal = 3;
2398 else
2399 endVal = 2;
2400
2401 _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 10, 1, 0, 0);
2402 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, endVal);
2403 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
2404 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, endVal, 1);
2405 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
2406 break;
2407
2408 case 1:
2409 if (_game._player._playerPos == Common::Point(218, 152)) {
2410 _scene->_sequences.remove(_globals._sequenceIndexes[6]);
2411 _scene->_dynamicHotspots.remove(_keyHotspotId);
2412 } else {
2413 _scene->_sequences.remove(_globals._sequenceIndexes[5]);
2414 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
2415 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
2416 _scene->_hotspots.activate(NOUN_PADLOCK_KEY, false);
2417 }
2418 _vm->_sound->command(9);
2419 _game._objects.addToInventory(OBJ_PADLOCK_KEY);
2420 _vm->_dialogs->showItem(OBJ_PADLOCK_KEY, 51226);
2421 break;
2422
2423 case 2:
2424 _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
2425 _game._player._visible = true;
2426 _game._player._stepEnabled = true;
2427 break;
2428
2429 default:
2430 break;
2431 }
2432 }
2433 } else if (_action._lookFlag)
2434 _vm->_dialogs->show(51225);
2435 else if (_action.isAction(VERB_LOOK, NOUN_PADLOCK_KEY) && _game._objects.isInRoom(OBJ_PADLOCK_KEY))
2436 _vm->_dialogs->show(51215);
2437 else if (_action.isAction(VERB_LOOK, NOUN_FISHING_ROD) && (!_scene->_animation[0] ||
2438 _scene->_animation[0]->getCurrentFrame() == 4))
2439 _vm->_dialogs->show(51216);
2440 else if (_action.isAction(VERB_LOOK, NOUN_SHIPS_WHEEL))
2441 _vm->_dialogs->show(51218);
2442 else if (_action.isAction(VERB_TAKE, NOUN_SHIPS_WHEEL))
2443 _vm->_dialogs->show(51219);
2444 else if (_action.isAction(VERB_LOOK, NOUN_PORTHOLE) || _action.isAction(VERB_PEER_THROUGH, NOUN_PORTHOLE))
2445 _vm->_dialogs->show(51220);
2446 else if (_action.isAction(VERB_LOOK, NOUN_TABLE))
2447 _vm->_dialogs->show(51221);
2448 else if (_action.isAction(VERB_LOOK, NOUN_STARFISH))
2449 _vm->_dialogs->show(51222);
2450 else if (_action.isAction(VERB_TAKE, NOUN_STARFISH))
2451 _vm->_dialogs->show(51223);
2452 else if (_action.isAction(VERB_LOOK, NOUN_OUTSIDE))
2453 _vm->_dialogs->show(51224);
2454 else if (_action.isAction(VERB_LOOK, NOUN_POSTER))
2455 _vm->_dialogs->show(51227);
2456 else if (_action.isAction(VERB_TAKE, NOUN_POSTER))
2457 _vm->_dialogs->show(51228);
2458 else if (_action.isAction(VERB_LOOK, NOUN_TROPHY)) {
2459 if (_game._visitedScenes.exists(604))
2460 _vm->_dialogs->show(51229);
2461 else
2462 _vm->_dialogs->show(51230);
2463 } else if (_action.isAction(VERB_LOOK, NOUN_CHAIR))
2464 _vm->_dialogs->show(51231);
2465 else if (_action.isAction(VERB_LOOK, NOUN_ROPE))
2466 _vm->_dialogs->show(51232);
2467 else if (_action.isAction(VERB_TAKE, NOUN_ROPE))
2468 _vm->_dialogs->show(51233);
2469 else if (_action.isAction(VERB_LOOK, NOUN_LAMP))
2470 _vm->_dialogs->show(51234);
2471 else if (_action.isAction(VERB_WALK_BEHIND, NOUN_COUNTER)) {
2472 // WORKAROUND: Empty handling to prevent default "can't do that" dialogs showing
2473 } else if (_action.isAction(VERB_LOOK, NOUN_COUNTER))
2474 _vm->_dialogs->show(51235);
2475 else if (_action.isAction(VERB_LOOK, NOUN_ICE_CHESTS))
2476 _vm->_dialogs->show(51237);
2477 else if (_action.isAction(VERB_OPEN, NOUN_ICE_CHESTS))
2478 _vm->_dialogs->show(51238);
2479 else if (_action.isAction(VERB_LOOK, NOUN_CASH_REGISTER)) {
2480 if (!_globals[kRegisterOpen])
2481 _vm->_dialogs->show(51212);
2482 else if (_game._objects.isInRoom(OBJ_PADLOCK_KEY))
2483 _vm->_dialogs->show(51214);
2484 else
2485 _vm->_dialogs->show(51213);
2486 } else
2487 return;
2488
2489 _action._inProgress = false;
2490 }
2491
2492 /*------------------------------------------------------------------------*/
2493
setup()2494 void Scene513::setup() {
2495 setPlayerSpritesPrefix();
2496 setAAName();
2497 _scene->addActiveVocab(NOUN_ELEVATOR_DOOR);
2498 _scene->addActiveVocab(VERB_WALKTO);
2499 }
2500
enter()2501 void Scene513::enter() {
2502 _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0));
2503 _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0));
2504 _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_9");
2505 _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXMRC_9");
2506
2507 _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
2508 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
2509
2510 _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
2511 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
2512
2513 if ((_scene->_priorSceneId == 751) || (_scene->_priorSceneId == 701)) {
2514 _game._player._playerPos = Common::Point(296, 147);
2515 _game._player._facing = FACING_WEST;
2516 _game._player._stepEnabled = false;
2517 _scene->_sequences.addTimer(15, 80);
2518 } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
2519 _game._player._playerPos = Common::Point(63, 149);
2520 _game._player._facing = FACING_NORTHEAST;
2521 _game._player._visible = false;
2522 _game._player._stepEnabled = false;
2523 _scene->_sequences.remove(_globals._sequenceIndexes[1]);
2524 _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
2525 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
2526 _scene->loadAnimation(formAnimName('R', 1), 70);
2527 }
2528
2529 sceneEntrySound();
2530
2531 if (_scene->_roomChanged)
2532 _game._objects.addToInventory(OBJ_SECURITY_CARD);
2533
2534 _game.loadQuoteSet(0x278, 0);
2535 }
2536
step()2537 void Scene513::step() {
2538 switch (_game._trigger) {
2539 case 80:
2540 _game._player._stepEnabled = false;
2541 _scene->_sequences.remove(_globals._sequenceIndexes[2]);
2542 _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
2543 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
2544 _vm->_sound->command(24);
2545 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
2546 break;
2547
2548 case 81:
2549 _game._player.walk(Common::Point(265, 152), FACING_WEST);
2550 _scene->_sequences.addTimer(120, 82);
2551 break;
2552
2553 case 82:
2554 _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
2555 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
2556 _vm->_sound->command(25);
2557 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 83);
2558 break;
2559
2560 case 83:
2561 _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
2562 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
2563 _game._player._stepEnabled = true;
2564 break;
2565
2566 default:
2567 break;
2568 }
2569
2570 switch (_game._trigger) {
2571 case 70:
2572 _game._player._visible = true;
2573 _game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
2574 _scene->_sequences.addTimer(6, 71);
2575 break;
2576
2577 case 71:
2578 _scene->_sequences.remove(_globals._sequenceIndexes[1]);
2579 _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
2580 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
2581 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
2582 break;
2583
2584 case 72:
2585 _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2);
2586 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
2587 _game._player._stepEnabled = true;
2588 break;
2589
2590 default:
2591 break;
2592 }
2593 }
2594
actions()2595 void Scene513::actions() {
2596 if (_action.isAction(VERB_GET_INTO, NOUN_CAR)) {
2597 switch (_game._trigger) {
2598 case 0:
2599 _game._player._stepEnabled = false;
2600 _scene->_sequences.remove(_globals._sequenceIndexes[1]);
2601 _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0);
2602 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
2603 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
2604 break;
2605
2606 case 1: {
2607 int syncIdx = _globals._sequenceIndexes[1];
2608 _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
2609 _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
2610 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx);
2611 _scene->_sequences.addTimer(6, 2);
2612 }
2613 break;
2614
2615 case 2:
2616 _game._player._visible = false;
2617 _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 10, 1, 0, 0);
2618 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
2619 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
2620 break;
2621
2622 case 3: {
2623 int syncIdx = _globals._sequenceIndexes[3];
2624 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
2625 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
2626 _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
2627 _scene->_nextSceneId = 504;
2628 }
2629 break;
2630
2631 default:
2632 break;
2633 }
2634 } else if (_action.isAction(VERB_PUT, NOUN_ID_CARD, NOUN_CARD_SLOT) || _action.isAction(VERB_PUT, NOUN_FAKE_ID, NOUN_CARD_SLOT)) {
2635 switch (_game._trigger) {
2636 case 0:
2637 _game._player._stepEnabled = false;
2638 _game._player._visible = false;
2639 _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 7, 1, 0, 0);
2640 _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 2);
2641 _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]);
2642 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
2643 break;
2644
2645 case 1:
2646 _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[4]);
2647 _game._player._visible = true;
2648 _scene->_sequences.remove(_globals._sequenceIndexes[2]);
2649 _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
2650 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
2651 _vm->_sound->command(24);
2652 _scene->_kernelMessages.reset();
2653 _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x278));
2654 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
2655 break;
2656
2657 case 2:
2658 _game._player.walk(Common::Point(296, 147), FACING_WEST);
2659 _scene->_sequences.addTimer(120, 3);
2660 break;
2661
2662 case 3:
2663 _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0);
2664 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
2665 _vm->_sound->command(25);
2666 _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
2667 break;
2668
2669 case 4:
2670 _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
2671 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
2672 _game._player._stepEnabled = true;
2673 if (_globals[kCityFlooded])
2674 _scene->_nextSceneId = 701;
2675 else
2676 _scene->_nextSceneId = 751;
2677
2678 break;
2679
2680 default:
2681 break;
2682 }
2683 } else if ((_action._lookFlag) || _action.isAction(VERB_LOOK, NOUN_STREET))
2684 _vm->_dialogs->show(51318);
2685 else if (_action.isAction(VERB_LOOK, NOUN_ELEVATOR))
2686 _vm->_dialogs->show(51310);
2687 else if (_action.isAction(VERB_LOOK, NOUN_ELEVATOR_DOOR))
2688 _vm->_dialogs->show(51311);
2689 else if (_action.isAction(VERB_LOOK, NOUN_CARD_SLOT))
2690 _vm->_dialogs->show(51312);
2691 else if (_action.isAction(VERB_LOOK, NOUN_HANDICAP_SIGN))
2692 _vm->_dialogs->show(51313);
2693 else if (_action.isAction(VERB_LOOK, NOUN_BIKE_RACK))
2694 _vm->_dialogs->show(51314);
2695 else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
2696 _vm->_dialogs->show(51315);
2697 else if (_action.isAction(VERB_LOOK, NOUN_SIGN))
2698 _vm->_dialogs->show(51316);
2699 else if (_action.isAction(VERB_LOOK, NOUN_STREET_TO_WEST) || _action.isAction(VERB_WALK_DOWN, NOUN_STREET_TO_WEST))
2700 _vm->_dialogs->show(51317);
2701 else if (_action.isAction(VERB_OPEN, NOUN_ELEVATOR_DOOR) || _action.isAction(VERB_OPEN, NOUN_ELEVATOR))
2702 _vm->_dialogs->show(51319);
2703 else if (_action.isAction(VERB_LOOK, NOUN_CAR))
2704 _vm->_dialogs->show(51321);
2705 else if (_action.isAction(VERB_LOOK, NOUN_BRICK_WALL))
2706 _vm->_dialogs->show(51322);
2707 else if (_action.isAction(VERB_PUT, NOUN_SECURITY_CARD, NOUN_CARD_SLOT))
2708 _vm->_dialogs->show(51320);
2709 else
2710 return;
2711
2712 _action._inProgress = false;
2713 }
2714
2715 /*------------------------------------------------------------------------*/
2716
setup()2717 void Scene515::setup() {
2718 _game._player._spritesPrefix = "";
2719 setAAName();
2720 }
2721
enter()2722 void Scene515::enter() {
2723 _game._player._visible = false;
2724 _game._player._stepEnabled = false;
2725 _scene->_sequences.addTimer(30, 70);
2726
2727 sceneEntrySound();
2728 }
2729
step()2730 void Scene515::step() {
2731 if (_game._trigger == 70)
2732 _scene->loadAnimation(formAnimName('A', -1), 71);
2733 else if (_game._trigger == 71)
2734 _scene->_nextSceneId = 508;
2735 }
2736
2737 /*------------------------------------------------------------------------*/
2738
setup()2739 void Scene551::setup() {
2740 setPlayerSpritesPrefix();
2741 setAAName();
2742 }
2743
enter()2744 void Scene551::enter() {
2745 if (_globals[kSexOfRex] == REX_MALE)
2746 _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
2747 else
2748 _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 1));
2749
2750 if (_scene->_priorSceneId == 501)
2751 _game._player._playerPos = Common::Point(18, 130);
2752 else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
2753 _game._player._playerPos = Common::Point(124, 119);
2754 _game._player._facing = FACING_NORTH;
2755 }
2756
2757 if (_globals[kTeleporterCommand]) {
2758 _game._player._visible = false;
2759 _game._player._stepEnabled = false;
2760
2761 char sepChar;
2762 if (_globals[kSexOfRex] == REX_MALE)
2763 sepChar = 'e';
2764 else
2765 sepChar = 'u';
2766
2767 int suffixNum;
2768 int trigger;
2769
2770 switch (_globals[kTeleporterCommand]) {
2771 case 1:
2772 suffixNum = 3;
2773 trigger = 75;
2774 _globals[kTeleporterUnderstood] = true;
2775 break;
2776
2777 case 2:
2778 suffixNum = 1;
2779 trigger = 80;
2780 break;
2781
2782 case 4:
2783 suffixNum = 2;
2784 trigger = 90;
2785 break;
2786
2787 default:
2788 trigger = 0;
2789 suffixNum = 0;
2790 }
2791
2792 _globals[kTeleporterCommand] = 0;
2793
2794 if (suffixNum > 0)
2795 _scene->loadAnimation(formAnimName(sepChar, suffixNum), trigger);
2796 else {
2797 _game._player._visible = true;
2798 _game._player._stepEnabled = true;
2799 }
2800 }
2801
2802 sceneEntrySound();
2803 }
2804
step()2805 void Scene551::step() {
2806 switch (_game._trigger) {
2807 case 75:
2808 _game._player._stepEnabled = true;
2809 _game._player._visible = true;
2810 _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
2811 break;
2812
2813 case 80:
2814 _globals[kTeleporterCommand] = 1;
2815 _scene->_nextSceneId = _globals[kTeleporterDestination];
2816 _scene->_reloadSceneFlag = true;
2817 break;
2818
2819 case 90:
2820 if (_globals[kSexOfRex] == REX_MALE) {
2821 _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
2822 _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8);
2823 } else {
2824 _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2);
2825 _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
2826 }
2827 _vm->_sound->command(28);
2828 _scene->_sequences.addTimer(60, 91);
2829 break;
2830
2831 case 91:
2832 _scene->_reloadSceneFlag = true;
2833 break;
2834
2835 default:
2836 break;
2837 }
2838 }
2839
preActions()2840 void Scene551::preActions() {
2841 if (_action.isAction(VERB_WALK_DOWN) && (_action.isObject(NOUN_STREET_TO_WEST) || _action.isObject(NOUN_SIDEWALK_TO_WEST)))
2842 _game._player._walkOffScreenSceneId = 501;
2843 }
2844
actions()2845 void Scene551::actions() {
2846 if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER))
2847 _scene->_nextSceneId = 502;
2848 else if ((_action._lookFlag))
2849 _vm->_dialogs->show(55117);
2850 else if (_action.isAction(VERB_LOOK, NOUN_SKELETON))
2851 _vm->_dialogs->show(55110);
2852 else if (_action.isAction(VERB_LOOK, NOUN_ELEVATOR_SHAFT))
2853 _vm->_dialogs->show(55111);
2854 else if (_action.isAction(VERB_WALKTO, NOUN_ELEVATOR_SHAFT))
2855 _vm->_dialogs->show(55112);
2856 else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
2857 _vm->_dialogs->show(55113);
2858 else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
2859 _vm->_dialogs->show(55114);
2860 else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK_TO_WEST)) {
2861 if (_game._visitedScenes.exists(505))
2862 _vm->_dialogs->show(55116);
2863 else
2864 _vm->_dialogs->show(55115);
2865 } else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK))
2866 _vm->_dialogs->show(55118);
2867 else if (_action.isAction(VERB_LOOK, NOUN_EQUIPMENT_OVERHEAD))
2868 _vm->_dialogs->show(55119);
2869 else if (_action.isAction(VERB_LOOK, NOUN_RAILING))
2870 _vm->_dialogs->show(55120);
2871 else
2872 return;
2873
2874 _action._inProgress = false;
2875 }
2876
2877 /*------------------------------------------------------------------------*/
2878
2879 } // End of namespace Nebular
2880 } // End of namespace MADS
2881