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