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/system.h"
24 #include "graphics/palette.h"
25 #include "graphics/cursorman.h"
26
27 #include "supernova/screen.h"
28 #include "supernova/supernova.h"
29 #include "supernova/supernova1/state.h"
30 #include "supernova/supernova1/stringid.h"
31
32 namespace Supernova {
33
Room1()34 Room1::Room1() {
35 _dialogsX[0] = kStringDialogX1;
36 _dialogsX[1] = kStringDialogX2;
37 _dialogsX[2] = kStringDialogX3;
38 }
39
Intro(SupernovaEngine * vm,GameManager1 * gm)40 Intro::Intro(SupernovaEngine *vm, GameManager1 *gm) {
41 _vm = vm;
42 _gm = gm;
43
44 _fileNumber = -1;
45 _id = INTRO1;
46 _shown[0] = kShownFalse;
47
48 _objectState[0] =
49 Object(_id, kStringKeycard, kStringKeycardDescription, KEYCARD,
50 TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
51 _objectState[1] =
52 Object(_id, kStringKnife, kStringKnifeDescription, KNIFE,
53 TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
54 _objectState[2] =
55 Object(_id, kStringWatch, kStringDefaultDescription, WATCH,
56 TAKE | COMBINABLE | CARRIED, 255, 255, 8, NULLROOM, 0);
57 _objectState[3] =
58 Object(_id, kStringDiscman, kStringDiscmanDescription, DISCMAN,
59 TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
60 _objectState[4] =
61 Object(_id, kStringInventoryMoney, kStringDefaultDescription, MONEY,
62 TAKE | COMBINABLE, 255, 255, 0);
63
64 _shouldExit = false;
65
66 _introText =
67 _vm->getGameString(kStringIntro1) + '\0' +
68 _vm->getGameString(kStringIntro2) + '\0' +
69 _vm->getGameString(kStringIntro3) + '\0' +
70 _vm->getGameString(kStringIntro4) + '\0' +
71 _vm->getGameString(kStringIntro5) + '\0' +
72 _vm->getGameString(kStringIntro6) + '\0' +
73 _vm->getGameString(kStringIntro7) + '\0' +
74 _vm->getGameString(kStringIntro8) + '\0' +
75 _vm->getGameString(kStringIntro9) + '\0' +
76 _vm->getGameString(kStringIntro10) + '\0' +
77 _vm->getGameString(kStringIntro11) + '\0' +
78 _vm->getGameString(kStringIntro12) + '\0' +
79 _vm->getGameString(kStringIntro13) + '\0';
80 }
81
onEntrance()82 void Intro::onEntrance() {
83 _gm->_guiEnabled = false;
84 _vm->_allowSaveGame = false;
85 _vm->_allowLoadGame = false;
86 titleScreen();
87 cutscene();
88 leaveCutscene();
89 }
90
titleScreen()91 void Intro::titleScreen() {
92 // Newspaper
93 CursorMan.showMouse(false);
94 _vm->_screen->setViewportBrightness(0);
95 _vm->_screen->setGuiBrightness(0);
96 _vm->paletteBrightness();
97 _vm->setCurrentImage(1);
98 _vm->renderImage(0);
99 _vm->paletteFadeIn();
100 _gm->getInput();
101 _vm->paletteFadeOut();
102
103 // Title Screen
104 _vm->setCurrentImage(31);
105 _vm->renderImage(0);
106 _vm->paletteFadeIn();
107 _gm->wait(1);
108 _vm->playSound(kAudioVoiceSupernova);
109 while (_vm->_sound->isPlaying())
110 _gm->wait(1);
111 titleFadeIn();
112 _vm->renderText(kStringTitleVersion, 295, 190, kColorWhite44);
113 const Common::String& title1 = _vm->getGameString(kStringTitle1);
114 const Common::String& title2 = _vm->getGameString(kStringTitle2);
115 const Common::String& title3 = _vm->getGameString(kStringTitle3);
116 _vm->_screen->renderText(title1, 78 - Screen::textWidth(title1) / 2, 120, kColorLightBlue);
117 _vm->_screen->renderText(title2, 78 - Screen::textWidth(title2) / 2, 132, kColorWhite99);
118 _vm->_screen->renderText(title3, 78 - Screen::textWidth(title3) / 2, 142, kColorWhite99);
119 _gm->wait(1);
120 CursorMan.showMouse(true);
121 _vm->playSound(kMusicIntro);
122
123 Marquee marquee(_vm->_screen, Marquee::kMarqueeIntro, _introText.c_str());
124 while (!_vm->shouldQuit()) {
125 _gm->updateEvents();
126 marquee.renderCharacter();
127 if (_gm->_mouseClicked || _gm->_keyPressed)
128 break;
129 g_system->updateScreen();
130 g_system->delayMillis(_vm->_delay);
131 }
132 _vm->playSound(kAudioVoiceYeah);
133 while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
134 _gm->wait(1);
135 _vm->paletteFadeOut();
136 }
137
titleFadeIn()138 void Intro::titleFadeIn() {
139 byte titlePaletteColor[] = {0xfe, 0xeb};
140 byte titleNewColor[2][3] = {{255, 255, 255}, {199, 21, 21}};
141 byte newColors[2][3];
142
143 for (int brightness = 1; brightness <= 40; ++brightness) {
144 for (int colorIndex = 0; colorIndex < 2; ++colorIndex) {
145 for (int i = 0; i < 3; ++i) {
146 newColors[colorIndex][i] = (titleNewColor[colorIndex][i] * brightness) / 40;
147 }
148 }
149
150 _vm->_system->getPaletteManager()->setPalette(newColors[0], titlePaletteColor[0], 1);
151 _vm->_system->getPaletteManager()->setPalette(newColors[1], titlePaletteColor[1], 1);
152 _vm->_system->updateScreen();
153 _vm->_system->delayMillis(_vm->_delay);
154 }
155 }
156
animate(int section1,int section2,int duration)157 bool Intro::animate(int section1, int section2, int duration) {
158 Common::KeyCode key = Common::KEYCODE_INVALID;
159 while (duration) {
160 _vm->renderImage(section1);
161 if (_gm->waitOnInput(2, key))
162 return key != Common::KEYCODE_ESCAPE;
163 _vm->renderImage(section2);
164 if (_gm->waitOnInput(2, key))
165 return key != Common::KEYCODE_ESCAPE;
166 --duration;
167 }
168 return true;
169 }
170
animate(int section1,int section2,int duration,MessagePosition position,int textId)171 bool Intro::animate(int section1, int section2, int duration,
172 MessagePosition position, int textId) {
173 Common::KeyCode key = Common::KEYCODE_INVALID;
174 const Common::String& text = _vm->getGameString(textId);
175 _vm->renderMessage(text, position);
176 int delay = (MIN(text.size(), (uint)512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
177 while (delay) {
178 if (section1)
179 _vm->renderImage(section1);
180 if (_gm->waitOnInput(2, key)) {
181 _vm->removeMessage();
182 return key != Common::KEYCODE_ESCAPE;
183 }
184 if (section2)
185 _vm->renderImage(section2);
186 if (_gm->waitOnInput(2, key)) {
187 _vm->removeMessage();
188 return key != Common::KEYCODE_ESCAPE;
189 }
190 --delay;
191 }
192 _vm->removeMessage();
193 return true;
194 }
195
animate(int section1,int section2,int section3,int section4,int duration,MessagePosition position,int textId)196 bool Intro::animate(int section1, int section2, int section3, int section4,
197 int duration, MessagePosition position, int textId) {
198 Common::KeyCode key = Common::KEYCODE_INVALID;
199 const Common::String& text = _vm->getGameString(textId);
200 _vm->renderMessage(text, position);
201 if (duration == 0)
202 duration = (MIN(text.size(), (uint)512) + 20) * _vm->_textSpeed / 40;
203
204 while(duration) {
205 _vm->renderImage(section1);
206 _vm->renderImage(section3);
207 if (_gm->waitOnInput(2, key)) {
208 _vm->removeMessage();
209 return key != Common::KEYCODE_ESCAPE;
210 }
211 _vm->renderImage(section2);
212 _vm->renderImage(section4);
213 if (_gm->waitOnInput(2, key)) {
214 _vm->removeMessage();
215 return key != Common::KEYCODE_ESCAPE;
216 }
217 duration--;
218 }
219 _vm->removeMessage();
220 return true;
221 }
222
cutscene()223 void Intro::cutscene() {
224 #define exitOnEscape(X) do { \
225 Common::KeyCode key = Common::KEYCODE_INVALID; \
226 if ((_gm->waitOnInput(X, key) && key == Common::KEYCODE_ESCAPE) || _vm->shouldQuit()) { \
227 CursorMan.showMouse(true); \
228 return; \
229 } \
230 } while (0);
231
232 _vm->_system->fillScreen(kColorBlack);
233 _vm->setCurrentImage(31);
234 _vm->_screen->setGuiBrightness(255);
235 _vm->paletteBrightness();
236 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene1))
237 return;
238 _vm->_screen->setGuiBrightness(0);
239 _vm->paletteBrightness();
240 exitOnEscape(1);
241
242 _vm->setCurrentImage(9);
243 _vm->renderImage(0);
244 _vm->renderImage(1);
245 _vm->renderImage(9);
246 _vm->paletteFadeIn();
247 if (!animate(11, 10, 6, kMessageRight, kStringIntroCutscene2))
248 return;
249 _vm->renderImage(3);
250 exitOnEscape(4);
251 _vm->renderImage(4);
252 if (!animate(11, 10, 3)) {// test duration
253 _vm->removeMessage();
254 return;
255 }
256 _vm->removeMessage();
257 if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
258 return;
259 _vm->renderImage(3);
260 exitOnEscape(3);
261 _vm->renderImage(2);
262 exitOnEscape(3);
263 _vm->renderImage(7);
264 exitOnEscape(6);
265 _vm->renderImage(6);
266 exitOnEscape(6);
267 if (!animate(0, 0, 0, kMessageLeft, kStringIntroCutscene4))
268 return;
269 _vm->renderMessage(kStringIntroCutscene5, kMessageLeft);
270 exitOnEscape(28);
271 _vm->removeMessage();
272 _vm->renderMessage(kStringIntroCutscene6, kMessageLeft);
273 exitOnEscape(28);
274 _vm->removeMessage();
275
276 int textCounting[4] =
277 {kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9, kStringIntroCutscene10};
278 _vm->setCurrentImage(31);
279 _vm->renderImage(0);
280 _vm->paletteBrightness();
281 for (int i = 0; i < 4; ++i){
282 _vm->renderMessage(textCounting[i], kMessageLeft);
283 for (int j = 0; j < 28; ++j) {
284 _vm->renderImage((j % 3) + 1);
285 Common::KeyCode key = Common::KEYCODE_INVALID;
286 if (_gm->waitOnInput(1, key)) {
287 if (key == Common::KEYCODE_ESCAPE)
288 return;
289 break;
290 }
291 }
292 _vm->removeMessage();
293 }
294 _vm->renderMessage(kStringIntroCutscene11, kMessageLeft);
295 _vm->renderImage(6);
296 exitOnEscape(3);
297 _vm->renderImage(3);
298 exitOnEscape(3);
299 _vm->renderImage(4);
300 exitOnEscape(3);
301 _vm->renderImage(5);
302 exitOnEscape(3);
303 _vm->renderImage(_gm->invertSection(5));
304 exitOnEscape(18);
305 _vm->removeMessage();
306
307 _vm->setCurrentImage(9);
308 _vm->renderImage(0);
309 _vm->renderImage(1);
310 _vm->renderImage(9);
311 _vm->paletteBrightness();
312 _vm->renderBox(0, 138, 320, 62, kColorBlack);
313 _vm->paletteBrightness();
314 if (!animate(11, 10, 0, kMessageRight, kStringIntroCutscene12))
315 return;
316 _vm->renderImage(3);
317 exitOnEscape(3);
318 _vm->renderImage(4);
319 if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene13))
320 return;
321 if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene14))
322 return;
323 _vm->renderImage(12);
324 exitOnEscape(2);
325 _vm->renderImage(13);
326 exitOnEscape(2);
327 _vm->renderImage(14);
328 if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene15))
329 return;
330 if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene16))
331 return;
332 exitOnEscape(20);
333 if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene17))
334 return;
335 if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene18))
336 return;
337 if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene19))
338 return;
339 _vm->renderImage(16);
340 exitOnEscape(3);
341 _vm->renderImage(17);
342 if (!animate(19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene20))
343 return;
344 if (!animate(19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene21))
345 return;
346 if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
347 return;
348 _vm->renderImage(3);
349 exitOnEscape(3);
350 _vm->renderImage(2);
351 exitOnEscape(3);
352 _vm->renderImage(8);
353 exitOnEscape(6);
354 _vm->renderImage(6);
355 _vm->playSound(kAudioSiren);
356
357 exitOnEscape(6);
358 _vm->renderImage(3);
359 exitOnEscape(3);
360 _vm->renderImage(4);
361 _vm->renderImage(16);
362 exitOnEscape(3);
363 _vm->renderImage(15);
364 if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene22))
365 return;
366 if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene23))
367 return;
368 exitOnEscape(10);
369 _vm->renderImage(13);
370 exitOnEscape(2);
371 _vm->renderImage(12);
372 exitOnEscape(2);
373 _vm->renderImage(9);
374 if (!animate(11, 10, 0, kMessageRight, kStringIntroCutscene24))
375 return;
376 if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
377 return;
378 _vm->paletteFadeOut();
379
380 while (_vm->_sound->isPlaying())
381 exitOnEscape(1);
382
383 _vm->_system->fillScreen(kColorBlack);
384 _vm->_screen->setGuiBrightness(255);
385 _vm->paletteBrightness();
386 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene25))
387 return;
388 _vm->_screen->setGuiBrightness(5);
389 _vm->paletteBrightness();
390
391 _vm->setCurrentImage(31);
392 _vm->renderImage(0);
393 _vm->paletteFadeIn();
394 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene26))
395 return;
396 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene27))
397 return;
398 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene28))
399 return;
400 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene29))
401 return;
402 exitOnEscape(54);
403 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene30))
404 return;
405 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene31))
406 return;
407 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene32))
408 return;
409
410 CursorMan.showMouse(false);
411 _vm->_screen->setViewportBrightness(0);
412 _vm->paletteBrightness();
413 exitOnEscape(10);
414 _vm->playSound(kAudioSnoring);
415 while (_vm->_sound->isPlaying())
416 _gm->wait(1);
417 exitOnEscape(10);
418 _vm->playSound(kAudioSnoring);
419 while (_vm->_sound->isPlaying())
420 _gm->wait(1);
421 exitOnEscape(10);
422 _vm->playSound(kAudioSnoring);
423 while (_vm->_sound->isPlaying())
424 _gm->wait(1);
425 exitOnEscape(30);
426 CursorMan.showMouse(true);
427
428 _vm->setCurrentImage(22);
429 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene33))
430 return;
431 exitOnEscape(18);
432 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene34))
433 return;
434 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene35))
435 return;
436 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene36))
437 return;
438 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene37))
439 return;
440 exitOnEscape(18);
441 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene38))
442 return;
443 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene39))
444 return;
445 exitOnEscape(18);
446 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene40))
447 return;
448 if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene41))
449 return;
450 exitOnEscape(36);
451 animate(0, 0, 0, kMessageNormal, kStringIntroCutscene42);
452 _vm->removeMessage();
453
454 #undef exitOnEscape
455 }
456
leaveCutscene()457 void Intro::leaveCutscene() {
458 _vm->_screen->setViewportBrightness(255);
459 _vm->removeMessage();
460 _gm->changeRoom(CABIN_R3);
461 _gm->_guiEnabled = true;
462 _vm->_allowSaveGame = true;
463 _vm->_allowLoadGame = true;
464 }
465
ShipCorridor(SupernovaEngine * vm,GameManager1 * gm)466 ShipCorridor::ShipCorridor(SupernovaEngine *vm, GameManager1 *gm) {
467 _vm = vm;
468 _gm = gm;
469
470 _fileNumber = 17;
471 _id = CORRIDOR_ROOM;
472 _shown[0] = kShownTrue;
473 _shown[4] = kShownTrue;
474
475 _objectState[0] = Object(_id, kStringHatch, kStringDefaultDescription, HATCH1, OPENABLE | EXIT, 0, 6, 1, CABIN_L1, 15);
476 _objectState[1] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 1, 7, 2, CABIN_L2, 10);
477 _objectState[2] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 2, 8, 3, CABIN_L3, 5);
478 _objectState[3] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 5, 11, 6, CABIN_R1, 19);
479 _objectState[4] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 4, 10, 5, CABIN_R2, 14);
480 _objectState[5] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
481 _objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
482 _objectState[7] = Object(_id, kStringButton, kStringHatchButtonDescription, BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
483 _objectState[8] = Object(_id, kStringLadder, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
484 _objectState[9] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 22);
485 }
486
interact(Action verb,Object & obj1,Object & obj2)487 bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
488 if ((verb == ACTION_PRESS) && (obj1._id == BUTTON)) {
489 if (_objectState[6].hasProperty(OPENED)) {
490 _vm->playSound(kAudioSlideDoor);
491 _objectState[6].disableProperty(OPENED);
492 _vm->renderImage(8);
493 setSectionVisible(9, false);
494 _gm->wait(2);
495 _vm->renderImage(7);
496 setSectionVisible(8, false);
497 _gm->wait(2);
498 _vm->renderImage(_gm->invertSection(7));
499 } else {
500 _vm->playSound(kAudioSlideDoor);
501 _objectState[6].setProperty(OPENED);
502 _vm->renderImage(7);
503 _gm->wait(2);
504 _vm->renderImage(8);
505 setSectionVisible(7, false);
506 _gm->wait(2);
507 _vm->renderImage(9);
508 setSectionVisible(8, false);
509 }
510 return true;
511 }
512 return false;
513 }
514
ShipHall(SupernovaEngine * vm,GameManager1 * gm)515 ShipHall::ShipHall(SupernovaEngine *vm, GameManager1 *gm) {
516 _vm = vm;
517 _gm = gm;
518
519 _fileNumber = 15;
520 _id = HALL;
521 _shown[0] = kShownTrue;
522
523 _objectState[0] = Object(_id, kStringHatch, kStringCockpitHatchDescription, NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
524 _objectState[1] = Object(_id, kStringHatch, kStringKitchenHatchDescription, KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
525 _objectState[2] = Object(_id, kStringHatch, kStringStasisHatchDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
526 _objectState[3] = Object(_id, kStringSlot, kStringSlotDescription, SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
527 _objectState[4] = Object(_id, kStringLadder, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
528 _objectState[5] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR_ROOM, 19);
529 }
530
interact(Action verb,Object & obj1,Object & obj2)531 bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
532 if ((verb == ACTION_OPEN) && (obj1._id == KITCHEN_HATCH)) {
533 _vm->renderMessage(kStringShipHall1);
534 } else if ((verb == ACTION_USE) && Object::combine(obj1,obj2,KEYCARD2,SLEEP_SLOT)) {
535 if (_objectState[2].hasProperty(OPENED)) {
536 _objectState[2].disableProperty(OPENED);
537 _vm->renderImage(3);
538 setSectionVisible(4, false);
539 _gm->wait(2);
540 _vm->renderImage(2);
541 setSectionVisible(3, false);
542 _gm->wait(2);
543 _vm->renderImage(_gm->invertSection(2));
544 } else {
545 _objectState[2].setProperty(OPENED);
546 _vm->renderImage(2);
547 _gm->wait(2);
548 _vm->renderImage(3);
549 setSectionVisible(2, false);
550 _gm->wait(2);
551 _vm->renderImage(4);
552 setSectionVisible(3, false);
553 _gm->great(1);
554 }
555 } else {
556 return false;
557 }
558
559 return true;
560 }
561
ShipSleepCabin(SupernovaEngine * vm,GameManager1 * gm)562 ShipSleepCabin::ShipSleepCabin(SupernovaEngine *vm, GameManager1 *gm) {
563 _vm = vm;
564 _gm = gm;
565
566 _fileNumber = 33;
567 _id = SLEEP;
568 _shown[0] = kShownTrue;
569 _color = kColorBlack;
570
571 _objectState[0] = Object(_id, kStringHatch, kStringStasisHatchDescription2, CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
572 _objectState[1] = Object(_id, kStringHatch, kStringStasisHatchDescription2, CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
573 _objectState[2] = Object(_id, kStringComputer, kStringDefaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
574 _objectState[3] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
575 }
576
interact(Action verb,Object & obj1,Object & obj2)577 bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
578 Room *room;
579 Common::String input;
580
581 if (((verb == ACTION_LOOK) || (verb == ACTION_USE)) && (obj1._id == COMPUTER)) {
582 _gm->_guiEnabled = false;
583 setSectionVisible(4, false);
584 g_system->fillScreen(kColorDarkBlue);
585 if (_gm->_state._arrivalDaysLeft == 0) {
586 // Destination reached
587 _vm->renderText(kStringShipSleepCabin1, 60, 95, kColorWhite99);
588 _gm->getInput();
589 } else if (_gm->_state._powerOff) {
590 // Energy depleted
591 _vm->renderText(kStringShipSleepCabin2, 60, 95, kColorWhite99);
592 // Artificial coma interrupted
593 _vm->renderText(kStringShipSleepCabin3, 60, 115, kColorWhite99);
594 _gm->getInput();
595 } else if (isSectionVisible(5)) {
596 // Sleep duration in days
597 _vm->renderText(kStringShipSleepCabin4, 30, 85, kColorWhite99);
598 _vm->renderText(Common::String::format("%d",_gm->_state._timeSleep).c_str(),
599 150, 85, kColorWhite99);
600 _vm->renderText(kStringShipSleepCabin5, 30, 105, kColorWhite99);
601 _gm->getInput();
602 } else {
603 _vm->renderText(kStringShipSleepCabin6, 100, 85, kColorWhite99);
604 _gm->edit(input, 100, 105, 30);
605
606 input.toUppercase();
607 if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
608 if (input == _vm->getGameString(kStringComputerPassword)) {
609 _gm->great(6);
610 g_system->fillScreen(kColorDarkBlue);
611 _vm->renderText(kStringShipSleepCabin7, 30, 85, kColorWhite99);
612 uint daysSleep = 0;
613 do {
614 input.clear();
615 _vm->renderBox(150, 85, 150, 8, kColorDarkBlue);
616 _gm->edit(input, 150, 85, 10);
617
618 if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) {
619 break;
620 } else {
621 daysSleep = input.asUint64();
622 for (uint i = 0; i < input.size(); i++) {
623 if (!Common::isDigit(input[i])) {
624 daysSleep = 0;
625 break;
626 }
627 }
628 }
629 if (daysSleep != 0) {
630 _gm->_state._timeSleep = daysSleep;
631 _vm->renderText(kStringShipSleepCabin8, 30, 105, kColorWhite99);
632 _gm->wait(18);
633 setSectionVisible(5, true);
634 }
635 } while (daysSleep == 0);
636 } else {
637 _vm->renderText(kStringShipSleepCabin9, 100, 125, kColorLightRed);
638 _gm->wait(18);
639 }
640 }
641 }
642
643 _gm->_guiEnabled = true;
644 input.clear();
645 } else if (((verb == ACTION_WALK) || (verb == ACTION_USE)) &&
646 ((obj1._id == CABINS) || (obj1._id == CABIN))) {
647 room = _gm->_rooms[AIRLOCK];
648 if (!(obj1._id == CABIN) || !isSectionVisible(5)) {
649 _vm->renderMessage(kStringShipSleepCabin10);
650 } else if (room->getObject(5)->hasProperty(WORN)) {
651 _vm->renderMessage(kStringShipSleepCabin11);
652 } else {
653 _vm->paletteFadeOut();
654 _vm->renderImage(_gm->invertSection(5));
655 _vm->renderImage(_gm->invertSection(4));
656 room = _gm->_rooms[GENERATOR];
657 int32 *energyDaysLeft;
658 if (room->isSectionVisible(9)) {
659 energyDaysLeft = &_gm->_state._landingModuleEnergyDaysLeft;
660 } else {
661 energyDaysLeft = &_gm->_state._shipEnergyDaysLeft;
662 }
663 if (_gm->_state._timeSleep > _gm->_state._arrivalDaysLeft) {
664 _gm->_state._timeSleep = _gm->_state._arrivalDaysLeft;
665 }
666 if (_gm->_state._timeSleep >= *energyDaysLeft) {
667 _gm->_state._timeSleep = *energyDaysLeft;
668 if (room->isSectionVisible(9)) {
669 room = _gm->_rooms[LANDINGMODULE]; // Monitors off
670 room->setSectionVisible(2, false);
671 room->setSectionVisible(7, false);
672 room->setSectionVisible(8, false);
673 room->setSectionVisible(9, false);
674 room->setSectionVisible(10, false);
675 }
676 }
677 if (_gm->_state._timeSleep == _gm->_state._arrivalDaysLeft) {
678 _vm->renderImage(3);
679 room = _gm->_rooms[COCKPIT];
680 room->setSectionVisible(23, true);
681 room = _gm->_rooms[CABIN_R2];
682 room->setSectionVisible(5, false);
683 room->setSectionVisible(6, true);
684 room->getObject(2)->_click = 10;
685 room = _gm->_rooms[HOLD];
686 room->setSectionVisible(0, false);
687 room->setSectionVisible(1, true);
688 room->getObject(1)->_click = 255;
689 room->getObject(3)->_click = 255;
690 room = _gm->_rooms[GENERATOR];
691 room->setSectionVisible(6, false);
692 room->setSectionVisible(7, true);
693 room->getObject(1)->_click = 14;
694 if (room->isSectionVisible(1)) {
695 room->setSectionVisible(10, true);
696 }
697 if (room->isSectionVisible(12)) {
698 room->setSectionVisible(12, false);
699 room->setSectionVisible(11, true);
700 }
701 }
702 _gm->_state._arrivalDaysLeft -= _gm->_state._timeSleep;
703 *energyDaysLeft -= _gm->_state._timeSleep;
704 _gm->_time = ticksToMsec(786520); // 12pm
705 _gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
706 if (*energyDaysLeft == 0) {
707 _gm->turnOff();
708 room = _gm->_rooms[GENERATOR];
709 room->setSectionVisible(4, room->isSectionVisible(2));
710 }
711 if (_gm->_state._arrivalDaysLeft == 0) {
712 _gm->saveTime();
713 if (!_vm->saveGame(kSleepAutosaveSlot, "Sleep autosave"))
714 _vm->errorTempSave(true);
715 _gm->_state._dream = true;
716 _gm->loadTime();
717 }
718 _gm->wait(18);
719 _vm->paletteFadeIn();
720 if (_gm->_state._arrivalDaysLeft == 0) {
721 _vm->playSound(kAudioCrash);
722 _gm->screenShake();
723 _gm->wait(18);
724 _vm->renderMessage(kStringShipSleepCabin12);
725 }
726 }
727 } else {
728 return false;
729 }
730
731 return true;
732 }
733
animation()734 void ShipSleepCabin::animation() {
735 if (_gm->_state._powerOff && _gm->_state._arrivalDaysLeft) {
736 if (_gm->_guiEnabled) {
737 if (isSectionVisible(1)) {
738 _vm->renderImage(2);
739 setSectionVisible(1, false);
740 } else {
741 _vm->renderImage(1);
742 setSectionVisible(2, false);
743 }
744 } else {
745 if (_color == kColorLightRed) {
746 _color = kColorDarkBlue;
747 } else {
748 _color = kColorLightRed;
749 }
750
751 _vm->renderText(kStringShipSleepCabin13, 60, 75, _color);
752 }
753 } else if (isSectionVisible(5) && _gm->_guiEnabled) {
754 if (isSectionVisible(4))
755 _vm->renderImage(_gm->invertSection(4));
756 else
757 _vm->renderImage(4);
758 }
759
760 _gm->setAnimationTimer(6);
761 }
onEntrance()762 void ShipSleepCabin::onEntrance() {
763 if (_gm->_state._dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
764 _vm->renderMessage(kStringShipSleepCabin14);
765 _gm->wait(_gm->_messageDuration, true);
766 _vm->removeMessage();
767 _vm->renderMessage(kStringShipSleepCabin15);
768 _gm->wait(_gm->_messageDuration, true);
769 _vm->removeMessage();
770 _vm->renderMessage(kStringShipSleepCabin16);
771 _gm->_state._dream = false;
772 }
773 }
774
ShipCockpit(SupernovaEngine * vm,GameManager1 * gm)775 ShipCockpit::ShipCockpit(SupernovaEngine *vm, GameManager1 *gm) {
776 _vm = vm;
777 _gm = gm;
778
779 _fileNumber = 9;
780 _id = COCKPIT;
781 _shown[0] = kShownTrue;
782 _color = kColorBlack;
783
784 _objectState[0] = Object(_id, kStringInstruments, kStringInstrumentsDescription1, INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
785 _objectState[1] = Object(_id, kStringMonitor, kStringDefaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
786 _objectState[2] = Object(_id, kStringMonitor, kStringMonitorDescription, NULLOBJECT, TAKE, 1, 0, 0, NULLROOM, 0);
787 _objectState[3] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
788 }
789
interact(Action verb,Object & obj1,Object & obj2)790 bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
791 // TODO: distance and remaining time not accurate
792
793 if ((verb == ACTION_LOOK) && (obj1._id == MONITOR)) {
794 char c[2] = {0, 0};
795 _gm->_guiEnabled = false;
796 _vm->renderBox(0, 0, 320, 200, kColorBlack);
797 _vm->renderText(kStringShipCockpit1, 50, 50, kColorLightYellow);
798 if (_gm->_state._arrivalDaysLeft)
799 _vm->renderText(kStringShipCockpit2);
800 else
801 _vm->renderText(kStringShipCockpit3);
802 _vm->renderText(kStringShipCockpit4, 50, 70, kColorLightYellow);
803 _vm->renderText(kStringShipCockpit5, 50, 90, kColorLightYellow);
804 _vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft / 400).c_str());
805 _vm->renderText(",");
806 c[0] = (_gm->_state._arrivalDaysLeft / 40) % 10 + '0';
807 _vm->renderText(c);
808 c[0] = (_gm->_state._arrivalDaysLeft / 4) % 10 + '0';
809 _vm->renderText(c);
810 _vm->renderText(kStringShipCockpit6);
811 _vm->renderText(kStringShipCockpit7, 50, 110, kColorLightYellow);
812 _vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft).c_str(),
813 50, 120, kColorLightYellow);
814 _vm->renderText(kStringShipCockpit8);
815
816 _gm->getInput();
817 _gm->_guiEnabled = true;
818 } else if ((verb == ACTION_USE) && (obj1._id == INSTRUMENTS))
819 _vm->renderMessage(kStringShipCockpit9);
820 else
821 return false;
822
823 return true;
824 }
animation()825 void ShipCockpit::animation() {
826 if (!_gm->_guiEnabled) {
827 if (_color) {
828 _color = kColorBlack;
829 _gm->setAnimationTimer(5);
830 } else {
831 _color = kColorLightYellow;
832 _gm->setAnimationTimer(10);
833 }
834 _vm->renderText(kStringShipCockpit10, 50, 145, _color);
835 } else if (isSectionVisible(21)) {
836 _vm->renderImage(_gm->invertSection(21));
837 _gm->setAnimationTimer(5);
838 } else {
839 _vm->renderImage(21);
840 _gm->setAnimationTimer(10);
841 }
842
843 if (_gm->_state._powerOff) {
844 if (!_gm->_guiEnabled) {
845 _vm->renderText(kStringShipCockpit11, 97, 165, _color);
846 _vm->renderText(kStringShipCockpit12, 97, 175, _color);
847 } else if (isSectionVisible(21))
848 _vm->renderImage(22);
849 else
850 _vm->renderImage(_gm->invertSection(22));
851 }
852 }
853
onEntrance()854 void ShipCockpit::onEntrance() {
855 if (!hasSeen())
856 _vm->renderMessage(kStringShipCockpit13);
857 setRoomSeen(true);
858 }
859
ShipCabinL1(SupernovaEngine * vm,GameManager1 * gm)860 ShipCabinL1::ShipCabinL1(SupernovaEngine *vm, GameManager1 *gm) {
861 _vm = vm;
862 _gm = gm;
863
864 _fileNumber = 21;
865 _id = CABIN_L1;
866 _shown[0] = kShownTrue;
867 _shown[1] = kShownTrue;
868 _shown[2] = kShownTrue;
869 _shown[3] = kShownTrue;
870 _shown[4] = kShownTrue;
871 _shown[5] = kShownTrue;
872
873 _objectState[0] = Object(_id, kStringImage, kStringGenericDescription1, NULLOBJECT, UNNECESSARY, 5, 5, 0, NULLROOM, 0);
874 _objectState[1] = Object(_id, kStringImage, kStringGenericDescription2, NULLOBJECT, UNNECESSARY, 6, 6, 0, NULLROOM, 0);
875 _objectState[2] = Object(_id, kStringImage, kStringGenericDescription3, NULLOBJECT, UNNECESSARY, 7, 7, 0, NULLROOM, 0);
876 _objectState[3] = Object(_id, kStringMagnete, kStringMagneteDescription, NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
877 _objectState[4] = Object(_id, kStringImage, kStringGenericDescription4, NULLOBJECT, UNNECESSARY, 9, 9, 0);
878 _objectState[5] = Object(_id, kStringPen, kStringPenDescription, PEN, TAKE | COMBINABLE, 10, 10, 5 | kSectionInvert);
879 _objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | kSectionInvert, CORRIDOR_ROOM, 9);
880 _objectState[7] = Object(_id, kStringSlot, kStringSlotDescription, NULLOBJECT, COMBINABLE, 0, 0, 0);
881 _objectState[8] = Object(_id, kStringShelf, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 1, 1, 0);
882 _objectState[9] = Object(_id, kStringCompartment, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 2, 2, 0);
883 _objectState[10] = Object(_id, kStringSocket, kStringDefaultDescription, SOCKET, COMBINABLE, 4, 4, 0);
884 _objectState[11] = Object(_id, kStringToilet, kStringDefaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 22);
885 }
886
ShipCabinL2(SupernovaEngine * vm,GameManager1 * gm)887 ShipCabinL2::ShipCabinL2(SupernovaEngine *vm, GameManager1 *gm) {
888 _vm = vm;
889 _gm = gm;
890
891 _fileNumber = 21;
892 _id = CABIN_L2;
893 _shown[0] = kShownTrue;
894 _shown[16] = kShownTrue;
895
896 _objectState[0] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL1,COMBINABLE,31,31,0);
897 _objectState[1] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL2,COMBINABLE,32,32,0);
898 _objectState[2] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL3,COMBINABLE,33,33,0);
899 _objectState[3] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL4,COMBINABLE,45,45,0);
900 _objectState[4] = Object(_id, kStringShelf,kStringDefaultDescription,SHELF_L1,OPENABLE | CLOSED,25,26,17);
901 _objectState[5] = Object(_id, kStringPistol,kStringPistolDescription,PISTOL,TAKE,39,39,20);
902 _objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L2,OPENABLE | CLOSED,27,28,18);
903 _objectState[7] = Object(_id, kStringBooks,kStringBooksDescription,NULLOBJECT,UNNECESSARY,40,40,0);
904 _objectState[8] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L3,OPENABLE | CLOSED,29,30,19);
905 _objectState[9] = Object(_id, kStringSpool,kStringSpoolDescription, SPOOL,TAKE | COMBINABLE,41,41,21);
906 _objectState[10] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L4,OPENABLE | CLOSED,43,44,22);
907 _objectState[11] = Object(_id, kStringBook,kStringDefaultDescription,BOOK2,TAKE,46,46,23);
908 _objectState[12] = Object(_id, kStringUnderwear,kStringUnderwearDescription,NULLOBJECT,UNNECESSARY,34,34,0);
909 _objectState[13] = Object(_id, kStringUnderwear,kStringUnderwearDescription,NULLOBJECT,UNNECESSARY,35,35,0);
910 _objectState[14] = Object(_id, kStringClothes,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,36,36,0);
911 _objectState[15] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,37,37,0);
912 _objectState[16] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,38,38,0);
913 _objectState[17] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,23,23,0);
914 _objectState[18] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
915 _objectState[19] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | kSectionInvert,CORRIDOR_ROOM,9);
916 _objectState[20] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
917 _objectState[21] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
918 _objectState[22] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
919 _objectState[23] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
920 _objectState[24] = Object(_id, kStringFolders,kStringFoldersDescription,NULLOBJECT,UNNECESSARY,49,49,0);
921 }
922
interact(Action verb,Object & obj1,Object & obj2)923 bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
924 if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL1, KEYCARD2)) {
925 _gm->openLocker(this, getObject(4), getObject(0), 17);
926 if (getObject(5)->_click == 255)
927 _vm->renderImage(20); // Remove Pistol
928 _gm->great(2);
929 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL2, KEYCARD2)) {
930 _gm->openLocker(this, getObject(6), getObject(1), 18);
931 _gm->great(2);
932 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL3, KEYCARD2)) {
933 _gm->openLocker(this, getObject(8), getObject(2), 19);
934 if (getObject(9)->_click == 255)
935 _vm->renderImage(21); // Remove cable spool
936 _gm->great(2);
937 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL4, KEYCARD2)) {
938 _gm->openLocker(this, getObject(10), getObject(3), 22);
939 if (getObject(11)->_click == 255)
940 _vm->renderImage(23); // Remove book
941 _gm->great(2);
942 } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L1)) {
943 _gm->closeLocker(this, getObject(4), getObject(0), 17);
944 setSectionVisible(20, false);
945 } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L2))
946 _gm->closeLocker(this, getObject(6), getObject(1), 18);
947 else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L3)) {
948 _gm->closeLocker(this, getObject(8), getObject(2), 19);
949 setSectionVisible(21, false);
950 } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L4)) {
951 _gm->closeLocker(this, getObject(10), getObject(3), 22);
952 setSectionVisible(23, false);
953 } else if ((verb == ACTION_TAKE) && (obj1._id == SPOOL) && !obj1.hasProperty(CARRIED)) {
954 getObject(8)->_click = 42; // empty shelf
955 return false;
956 } else if ((verb == ACTION_TAKE) && (obj1._id == BOOK2) && !obj1.hasProperty(CARRIED)) {
957 getObject(10)->_click = 47; // empty shelf
958 return false;
959 } else
960 return false;
961
962 return true;
963 }
964
ShipCabinL3(SupernovaEngine * vm,GameManager1 * gm)965 ShipCabinL3::ShipCabinL3(SupernovaEngine *vm, GameManager1 *gm) {
966 _vm = vm;
967 _gm = gm;
968
969 _fileNumber = 21;
970 _id = CABIN_L3;
971 _shown[0] = kShownTrue;
972 _shown[6] = kShownTrue;
973 _shown[7] = kShownTrue;
974 _shown[8] = kShownTrue;
975 _shown[9] = kShownTrue;
976 _shown[12] = kShownTrue;
977
978 _objectState[0] = Object(_id, kStringPoster,kStringPosterDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
979 _objectState[1] = Object(_id, kStringPoster,kStringPosterDescription2,NULLOBJECT,UNNECESSARY,12,12,0);
980 _objectState[2] = Object(_id, kStringSpeaker,kStringDefaultDescription,NULLOBJECT,NULLTYPE,13,13,0);
981 _objectState[3] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,14,14,0);
982 _objectState[4] = Object(_id, kStringRecord,kStringRecordDescription,RECORD,TAKE | COMBINABLE,15,15,8 | kSectionInvert);
983 _objectState[5] = Object(_id, kStringRecordStand,kStringRecordStandDescription,NULLOBJECT,UNNECESSARY,16,16,0);
984 _objectState[6] = Object(_id, kStringButton,kStringDefaultDescription,TURNTABLE_BUTTON,PRESS,22,22,0);
985 _objectState[7] = Object(_id, kStringTurntable,kStringTurntableDescription,TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
986 _objectState[8] = Object(_id, kStringWire,kStringDefaultDescription,WIRE,COMBINABLE,18,18,0);
987 _objectState[9] = Object(_id, kStringWire,kStringDefaultDescription,WIRE2,COMBINABLE,19,19,0);
988 _objectState[10] = Object(_id, kStringPlug,kStringDefaultDescription,PLUG,COMBINABLE,20,20,0);
989 _objectState[11] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | kSectionInvert,CORRIDOR_ROOM,9);
990 _objectState[12] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
991 _objectState[13] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
992 _objectState[14] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
993 _objectState[15] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
994 _objectState[16] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
995 }
996
interact(Action verb,Object & obj1,Object & obj2)997 bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
998 Room *r;
999
1000 if ((verb == ACTION_USE) && Object::combine(obj1, obj2, RECORD, TURNTABLE)) {
1001 if (!_gm->_guiEnabled || isSectionVisible(15))
1002 _vm->renderMessage(kStringShipCabinL3_1);
1003 else {
1004 if (!getObject(4)->hasProperty(CARRIED))
1005 _vm->renderImage(_gm->invertSection(8));
1006 else
1007 _gm->_inventory.remove(*getObject(4));
1008 _vm->renderImage(15);
1009 getObject(4)->_click = 48;
1010 }
1011 } else if ((verb == ACTION_PRESS) && (obj1._id == TURNTABLE_BUTTON)) {
1012 if (!isSectionVisible(15)) {
1013 _vm->renderMessage(kStringShipCabinL3_2);
1014 } else if (!isSectionVisible(10) && !isSectionVisible(11) && isSectionVisible(12)) {
1015 _vm->renderImage(14);
1016 setSectionVisible(15, false);
1017 for (int i = 3; i; i--) {
1018 _vm->playSound(kAudioTurntable);
1019 while (_vm->_sound->isPlaying()) {
1020 if (isSectionVisible(13)) {
1021 _vm->renderImage(14);
1022 setSectionVisible(13, false);
1023 } else {
1024 _vm->renderImage(13);
1025 setSectionVisible(14, false);
1026 }
1027 _gm->wait(3);
1028 }
1029 }
1030
1031 _vm->renderImage(15);
1032 setSectionVisible(14, false);
1033 setSectionVisible(13, false);
1034 _vm->renderMessage(kStringShipCabinL3_3);
1035 }
1036 } else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) && (obj1._click != 15)) {
1037 _vm->renderImage(9);
1038 setSectionVisible(13, false);
1039 setSectionVisible(14, false);
1040 setSectionVisible(15, false);
1041 obj1._section = 0;
1042 _gm->takeObject(obj1);
1043 } else if ((verb == ACTION_PULL) && (obj1._id == PLUG)) {
1044 _vm->renderImage(10);
1045 setSectionVisible(7, false);
1046 obj1._click = 21;
1047 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PLUG, SOCKET)) {
1048 _vm->renderImage(7);
1049 setSectionVisible(10, false);
1050 getObject(10)->_click = 20;
1051 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE2))
1052 _vm->renderMessage(kStringShipCabinL3_4); // cutting near plug
1053 else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE)) {
1054 r = _gm->_rooms[AIRLOCK];
1055 if (!isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
1056 _vm->renderImage(25);
1057 _gm->shock();
1058 }
1059 _vm->renderImage(11);
1060 _vm->renderImage(26);
1061 setSectionVisible(12, false);
1062 } else if ((verb == ACTION_TAKE) && ((obj1._id == WIRE) || (obj1._id == WIRE2) || (obj1._id == PLUG))) {
1063 if (isSectionVisible(10) && isSectionVisible(11)) {
1064 _vm->renderImage(_gm->invertSection(10));
1065 _vm->renderImage(_gm->invertSection(11));
1066 getObject(8)->_name = kStringWireAndPlug;
1067 _gm->takeObject(*getObject(8));
1068 getObject(9)->_click = 255;
1069 getObject(10)->_click = 255;
1070 } else
1071 _vm->renderMessage(kStringShipCabinL3_5);
1072 } else
1073 return false;
1074
1075 return true;
1076 }
1077
ShipCabinR1(SupernovaEngine * vm,GameManager1 * gm)1078 ShipCabinR1::ShipCabinR1(SupernovaEngine *vm, GameManager1 *gm) {
1079 _vm = vm;
1080 _gm = gm;
1081
1082 _fileNumber = 22;
1083 _id = CABIN_R1;
1084 _shown[0] = kShownTrue;
1085 _shown[1] = kShownTrue;
1086 _shown[2] = kShownTrue;
1087
1088 _objectState[0] = Object(_id, kStringImage,kStringImageDescription1,NULLOBJECT,UNNECESSARY,5,5,0);
1089 _objectState[1] = Object(_id, kStringDrawingInstruments,kStringDrawingInstrumentsDescription,NULLOBJECT,UNNECESSARY,6,6,0);
1090 _objectState[2] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,7,7,0);
1091 _objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | kSectionInvert,CORRIDOR_ROOM,5);
1092 _objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
1093 _objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
1094 _objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
1095 _objectState[7] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
1096 _objectState[8] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
1097 }
1098
ShipCabinR2(SupernovaEngine * vm,GameManager1 * gm)1099 ShipCabinR2::ShipCabinR2(SupernovaEngine *vm, GameManager1 *gm) {
1100 _vm = vm;
1101 _gm = gm;
1102
1103 _fileNumber = 22;
1104 _id = CABIN_R2;
1105 _shown[0] = kShownTrue;
1106 _shown[3] = kShownTrue;
1107 _shown[4] = kShownTrue;
1108 _shown[5] = kShownTrue;
1109
1110 _objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
1111 _objectState[1] = Object(_id, kStringTennisRacket,kStringTennisRacketDescription,NULLOBJECT,UNNECESSARY,8,8,0);
1112 _objectState[2] = Object(_id, kStringTennisBall,kStringGenericDescription2,NULLOBJECT,UNNECESSARY,9,9,0);
1113 _objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | kSectionInvert,CORRIDOR_ROOM,5);
1114 _objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
1115 _objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
1116 _objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
1117 _objectState[7] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
1118 _objectState[8] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
1119 }
1120
ShipCabinR3(SupernovaEngine * vm,GameManager1 * gm)1121 ShipCabinR3::ShipCabinR3(SupernovaEngine *vm, GameManager1 *gm) {
1122 _vm = vm;
1123 _gm = gm;
1124
1125 _fileNumber = 22;
1126 _id = CABIN_R3;
1127 _shown[0] = kShownTrue;
1128 _shown[7] = kShownTrue;
1129 _shown[8] = kShownTrue;
1130 _shown[15] = kShownTrue;
1131
1132 _objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription2,CHESS,TAKE | COMBINABLE,12,12,7 | kSectionInvert);
1133 _objectState[1] = Object(_id, kStringBed,kStringBedDescription,NULLOBJECT,NULLTYPE,13,13,0);
1134 _objectState[2] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K1,COMBINABLE,27,27,0);
1135 _objectState[3] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K2,COMBINABLE,28,28,0);
1136 _objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K3,COMBINABLE,29,29,0);
1137 _objectState[5] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K4,COMBINABLE,30,30,0);
1138 _objectState[6] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF1,OPENABLE | CLOSED,14,18,9);
1139 _objectState[7] = Object(_id, kStringAlbums,kStringAlbumsDescription,NULLOBJECT,UNNECESSARY,14,14,0);
1140 _objectState[8] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF2,OPENABLE | CLOSED,15,19,10);
1141 _objectState[9] = Object(_id, kStringRope,kStringRopeDescription,ROPE,TAKE | COMBINABLE,15,15,12);
1142 _objectState[10] = Object(_id, kStringShelf,kStringShelfDescription,SHELF3,OPENABLE | CLOSED,16,17,11);
1143 _objectState[11] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,20,20,0);
1144 _objectState[12] = Object(_id, kStringClothes,kStringClothesDescription,NULLOBJECT,UNNECESSARY,21,21,0);
1145 _objectState[13] = Object(_id, kStringUnderwear,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
1146 _objectState[14] = Object(_id, kStringSocks,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
1147 _objectState[15] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF4,OPENABLE | CLOSED,24,25,13);
1148 _objectState[16] = Object(_id, kStringBook,kStringBookHitchhiker,BOOK,TAKE,26,26,14);
1149 _objectState[17] = Object(_id, kStringDiscman,kStringDiscmanDescription,DISCMAN,TAKE | COMBINABLE,33,33,16);
1150 _objectState[18] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | kSectionInvert,CORRIDOR_ROOM,5);
1151 _objectState[19] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
1152 _objectState[20] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
1153 _objectState[21] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
1154 _objectState[22] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
1155 _objectState[23] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
1156 }
1157
interact(Action verb,Object & obj1,Object & obj2)1158 bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
1159 if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K1, KEYCARD))
1160 _gm->openLocker(this, getObject(6), getObject(2), 9);
1161 else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K2, KEYCARD)) {
1162 _gm->openLocker(this, getObject(8), getObject(3), 10);
1163 if (getObject(9)->_click == 255)
1164 _vm->renderImage(12); // Remove rope
1165 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K3, KEYCARD)) {
1166 _gm->openLocker(this, getObject(10), getObject(4), 11);
1167 if (getObject(17)->_click == 255)
1168 _vm->renderImage(16); // Remove Discman
1169 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K4, KEYCARD)) {
1170 _gm->openLocker(this, getObject(15), getObject(5), 13);
1171 if (getObject(16)->_click == 255)
1172 _vm->renderImage(14); // Remove Book
1173 } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF1))
1174 _gm->closeLocker(this, getObject(6), getObject(2), 9);
1175 else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF2)) {
1176 setSectionVisible(12, false);
1177 _gm->closeLocker(this, getObject(8), getObject(3), 10);
1178 } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF3)) {
1179 setSectionVisible(16, false);
1180 _gm->closeLocker(this, getObject(10), getObject(4), 11);
1181 } else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF4)) {
1182 setSectionVisible(14, false);
1183 setSectionVisible(14, false);
1184 _gm->closeLocker(this, getObject(15), getObject(5), 13);
1185 } else if ((verb == ACTION_TAKE) && (obj1._id == DISCMAN) && !_gm->_rooms[0]->getObject(3)->hasProperty(CARRIED)) {
1186 getObject(10)->_click = 34; // Locker empty
1187 obj1._click = 255;
1188 _gm->takeObject(*_gm->_rooms[0]->getObject(3));
1189 _vm->renderImage(16);
1190 } else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) && obj1.hasProperty(CARRIED)) {
1191 getObject(8)->_click = 31; // Shelf empty
1192 return false;
1193 } else if ((verb == ACTION_TAKE) && (obj1._id == BOOK) && !obj1.hasProperty(CARRIED)) {
1194 getObject(15)->_click = 32; // Shelf empty
1195 return false;
1196 } else
1197 return false;
1198
1199 return true;
1200 }
1201
onEntrance()1202 void ShipCabinR3::onEntrance() {
1203 for (int i = 0; i < 3; ++i)
1204 _gm->_inventory.add(*_gm->_rooms[INTRO1]->getObject(i));
1205
1206 setRoomSeen(true);
1207 }
1208
ShipCabinBathroom(SupernovaEngine * vm,GameManager1 * gm)1209 ShipCabinBathroom::ShipCabinBathroom(SupernovaEngine *vm, GameManager1 *gm) {
1210 _vm = vm;
1211 _gm = gm;
1212
1213 _fileNumber = 23;
1214 _id = BATHROOM;
1215 _shown[0] = kShownTrue;
1216
1217 _objectState[0] = Object(_id, kStringBathroom,kStringBathroomDescription,TOILET,NULLTYPE,0,0,0);
1218 _objectState[1] = Object(_id, kStringShower,kStringDefaultDescription,SHOWER,NULLTYPE,1,1,0);
1219 _objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,BATHROOM_EXIT,EXIT,255,255,0,CABIN_R3,2);
1220 }
1221
ShipAirlock(SupernovaEngine * vm,GameManager1 * gm)1222 ShipAirlock::ShipAirlock(SupernovaEngine *vm, GameManager1 *gm) {
1223 _vm = vm;
1224 _gm = gm;
1225
1226 _fileNumber = 34;
1227 _id = AIRLOCK;
1228 _shown[0] = kShownTrue;
1229 _shown[6] = kShownTrue;
1230
1231 _objectState[0] = Object(_id, kStringHatch,kStringHatchDescription1,NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR_ROOM,10);
1232 _objectState[1] = Object(_id, kStringHatch,kStringHatchDescription2,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,HOLD,14);
1233 _objectState[2] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON1,PRESS,2,2,0);
1234 _objectState[3] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON2,PRESS,3,3,0);
1235 _objectState[4] = Object(_id, kStringHelmet,kStringHelmetDescription,HELMET,TAKE,4,4,7);
1236 _objectState[5] = Object(_id, kStringSuit,kStringSuitDescription,SUIT,TAKE,5,5,8);
1237 _objectState[6] = Object(_id, kStringLifeSupport,kStringLifeSupportDescription,LIFESUPPORT,TAKE,6,6,9);
1238 }
1239
interact(Action verb,Object & obj1,Object & obj2)1240 bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
1241 Room *r;
1242
1243 if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
1244 if (!getObject(1)->hasProperty(OPENED)) {
1245 _vm->renderImage(10);
1246 _vm->playSound(kAudioSlideDoor);
1247 if (getObject(0)->hasProperty(OPENED)) {
1248 getObject(0)->disableProperty(OPENED);
1249 _vm->renderImage(1);
1250 _gm->wait(2);
1251 _vm->renderImage(2);
1252 setSectionVisible(1, false);
1253 _gm->wait(2);
1254 _vm->renderImage(3);
1255 setSectionVisible(2, false);
1256 } else {
1257 getObject(0)->setProperty(OPENED);
1258 _vm->renderImage(2);
1259 setSectionVisible(3, false);
1260 _gm->wait(2);
1261 _vm->renderImage(1);
1262 setSectionVisible(2, false);
1263 _gm->wait(2);
1264 _vm->renderImage(_gm->invertSection(1));
1265 }
1266 _vm->renderImage(_gm->invertSection(10));
1267 }
1268 } else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
1269 if (!getObject(0)->hasProperty(OPENED)) {
1270 _vm->renderImage(11);
1271 if (getObject(1)->hasProperty(OPENED)) {
1272 _vm->playSound(kAudioSlideDoor);
1273 getObject(1)->disableProperty(OPENED);
1274 _vm->renderImage(4);
1275 _gm->wait(2);
1276 _vm->renderImage(5);
1277 setSectionVisible(4, false);
1278 _gm->wait(2);
1279 _vm->renderImage(6);
1280 setSectionVisible(5, false);
1281 _vm->renderImage(16);
1282 setSectionVisible(17, false);
1283 _gm->wait(3);
1284 _vm->renderImage(15);
1285 setSectionVisible(16, false);
1286 _gm->wait(3);
1287 _vm->renderImage(14);
1288 setSectionVisible(15, false);
1289 _gm->wait(3);
1290 _vm->renderImage(13);
1291 setSectionVisible(14, false);
1292 _gm->wait(3);
1293 _vm->renderImage(12);
1294 setSectionVisible(13, false);
1295 _gm->wait(3);
1296 _vm->renderImage(_gm->invertSection(12));
1297 } else {
1298 getObject(1)->setProperty(OPENED);
1299 _vm->renderImage(12);
1300 _gm->wait(3);
1301 _vm->renderImage(13);
1302 setSectionVisible(12, false);
1303 _gm->wait(3);
1304 _vm->renderImage(14);
1305 setSectionVisible(13, false);
1306 _gm->wait(3);
1307 _vm->renderImage(15);
1308 setSectionVisible(14, false);
1309 _gm->wait(3);
1310 _vm->renderImage(16);
1311 setSectionVisible(15, false);
1312 _gm->wait(3);
1313 _vm->renderImage(17);
1314 setSectionVisible(16, false);
1315 _vm->playSound(kAudioSlideDoor);
1316 _vm->renderImage(5);
1317 setSectionVisible(6, false);
1318 _gm->wait(2);
1319 _vm->renderImage(4);
1320 setSectionVisible(5, false);
1321 _gm->wait(2);
1322 _vm->renderImage(_gm->invertSection(4));
1323 r = _gm->_rooms[AIRLOCK];
1324 if (!r->getObject(4)->hasProperty(WORN) ||
1325 !r->getObject(5)->hasProperty(WORN) ||
1326 !r->getObject(6)->hasProperty(WORN)) {
1327 _gm->dead(kStringShipAirlock1);
1328 return true;
1329 }
1330 }
1331 _vm->renderImage(_gm->invertSection(11));
1332 }
1333 } else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER))
1334 _vm->renderMessage(getObject(1)->hasProperty(OPENED) ? kStringShipAirlock2 : kStringShipAirlock3);
1335 else
1336 return false;
1337
1338 return true;
1339 }
1340
onEntrance()1341 void ShipAirlock::onEntrance() {
1342 if (!isSectionVisible(kMaxSection - 1)) {
1343 _vm->renderMessage(kStringShipAirlock4);
1344 setSectionVisible(kMaxSection -1, kShownTrue);
1345 }
1346 if (_vm->_improved && isSectionVisible(kMaxSection - 2)) {
1347 if (_objectState[0].hasProperty(OPENED)) {
1348 _objectState[4].setProperty(WORN);
1349 _objectState[5].setProperty(WORN);
1350 _objectState[6].setProperty(WORN);
1351 interact(ACTION_PRESS, _objectState[2], _gm->_nullObject);
1352 interact(ACTION_PRESS, _objectState[3], _gm->_nullObject);
1353 } else {
1354 _objectState[4].disableProperty(WORN);
1355 _objectState[5].disableProperty(WORN);
1356 _objectState[6].disableProperty(WORN);
1357 interact(ACTION_PRESS, _objectState[3], _gm->_nullObject);
1358 interact(ACTION_PRESS, _objectState[2], _gm->_nullObject);
1359 }
1360 }
1361
1362 }
1363
ShipHold(SupernovaEngine * vm,GameManager1 * gm)1364 ShipHold::ShipHold(SupernovaEngine *vm, GameManager1 *gm) {
1365 _vm = vm;
1366 _gm = gm;
1367
1368 _fileNumber = 24;
1369 _id = HOLD;
1370 _shown[0] = kShownTrue;
1371
1372 _objectState[0] = Object(_id, kNoString,kStringDefaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
1373 _objectState[1] = Object(_id, kStringScrap,kStringScrapDescription1,SCRAP_LK,NULLTYPE,4,4,0);
1374 _objectState[2] = Object(_id, kStringTerminalStrip,kStringDefaultDescription,TERMINALSTRIP,COMBINABLE,255,255,0);
1375 _objectState[3] = Object(_id, kStringScrap,kStringScrapDescription2,NULLOBJECT,NULLTYPE,5,5,0);
1376 _objectState[4] = Object(_id, kStringReactor,kStringReactorDescription,NULLOBJECT,NULLTYPE,6,6,0);
1377 _objectState[5] = Object(_id, kStringNozzle,kStringDefaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
1378 _objectState[6] = Object(_id, kStringPumpkin,kStringPumpkinDescription,NULLOBJECT,NULLTYPE,8,8,0);
1379 _objectState[7] = Object(_id, kStringHatch,kStringDefaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPENABLE,1,2,2,LANDINGMODULE,6);
1380 _objectState[8] = Object(_id, kStringLandingModule,kStringLandingModuleDescription,NULLOBJECT,NULLTYPE,0,0,0);
1381 _objectState[9] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
1382 _objectState[10] = Object(_id, kStringHatch,kStringHatchDescription3,OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
1383 _objectState[11] = Object(_id, kStringGenerator,kStringGeneratorDescription,GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
1384 }
1385
interact(Action verb,Object & obj1,Object & obj2)1386 bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
1387 Room *room;
1388
1389 if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) && (obj1._description != kStringScrapDescription3)) {
1390 _vm->renderMessage(obj1._description);
1391 obj1._description = kStringScrapDescription3;
1392 _gm->takeObject(*getObject(2));
1393 } else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) && (obj1._id == OUTERHATCH_TOP))
1394 _vm->renderMessage(kStringShipHold1);
1395 else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) && (isSectionVisible(4) || isSectionVisible(6)))
1396 _vm->renderMessage(kStringCable1);
1397 else if (((verb == ACTION_TAKE) && (obj1._id == HOLD_WIRE)) ||
1398 ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, LANDINGMOD_HATCH)))
1399 _vm->renderMessage(kStringCable2);
1400 else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, HOLD_WIRE)) {
1401 getObject(0)->_name = kStringWireAndClip;
1402 _gm->_inventory.remove(*getObject(2));
1403 _gm->_state._terminalStripConnected = true;
1404 _gm->_state._terminalStripWire = true;
1405 _vm->renderMessage(kStringOk);
1406 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, SPOOL)) {
1407 if (!_gm->_state._terminalStripConnected)
1408 _vm->renderMessage(kStringCable3);
1409 else {
1410 _vm->renderImage(5);
1411 getObject(0)->_name = kStringWireAndPlug2;
1412 getObject(0)->_click = 10;
1413 room = _gm->_rooms[CABIN_L2];
1414 _gm->_inventory.remove(*getObject(9));
1415 }
1416 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, GENERATOR_TOP)) {
1417 if (isSectionVisible(5)) {
1418 room = _gm->_rooms[GENERATOR];
1419 room->getObject(0)->_click = 15;
1420 room->getObject(1)->_click = 13;
1421 room->setSectionVisible(6, true);
1422 room->setSectionVisible(8, true);
1423 _vm->renderImage(_gm->invertSection(5));
1424 _vm->renderImage(6);
1425 setSectionVisible(4, false);
1426 getObject(0)->_click = 11;
1427 } else
1428 _vm->renderMessage(kStringCable4);
1429 } else
1430 return false;
1431
1432 return true;
1433 }
1434
onEntrance()1435 void ShipHold::onEntrance() {
1436 if (!hasSeen())
1437 _vm->renderMessage(kStringShipHold2);
1438 _gm->_rooms[AIRLOCK]->setSectionVisible(kMaxSection - 2, kShownTrue);
1439 setRoomSeen(true);
1440 _gm->_rooms[COCKPIT]->setRoomSeen(true);
1441 }
1442
ShipLandingModule(SupernovaEngine * vm,GameManager1 * gm)1443 ShipLandingModule::ShipLandingModule(SupernovaEngine *vm, GameManager1 *gm) {
1444 _vm = vm;
1445 _gm = gm;
1446
1447 _fileNumber = 25;
1448 _id = LANDINGMODULE;
1449 _shown[0] = kShownTrue;
1450
1451 _objectState[0] = Object(_id, kStringSocket,kStringDefaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
1452 _objectState[1] = Object(_id, kStringButton,kSafetyButtonDescription,LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
1453 _objectState[2] = Object(_id, kStringMonitor,kStringDefaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
1454 _objectState[3] = Object(_id, kStringKeyboard,kStringDefaultDescription,KEYBOARD,NULLTYPE,4,4,0);
1455 _objectState[4] = Object(_id, kNoString,kStringDefaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
1456 _objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,LANDINGMOD_HATCH,EXIT | OPENABLE | OPENED | COMBINABLE, 0,0,1 | kSectionInvert,HOLD,10);
1457 }
1458
interact(Action verb,Object & obj1,Object & obj2)1459 bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
1460 if ((verb == ACTION_PRESS) && (obj1._id == LANDINGMOD_BUTTON))
1461 _vm->renderMessage(obj1._description);
1462 else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
1463 if (_gm->_state._landingModuleEnergyDaysLeft) {
1464 Room *r = _gm->_rooms[GENERATOR];
1465 if (isSectionVisible(7)) {
1466 _vm->renderImage(_gm->invertSection(9));
1467 _vm->renderImage(_gm->invertSection(2));
1468 _vm->renderImage(_gm->invertSection(8));
1469 _vm->renderImage(_gm->invertSection(7));
1470 _vm->renderImage(_gm->invertSection(10));
1471 if (r->isSectionVisible(9))
1472 _gm->_state._powerOff = true;
1473 _gm->roomBrightness();
1474 } else {
1475 _vm->renderImage(7);
1476 if (r->isSectionVisible(9))
1477 _gm->_state._powerOff = false;
1478 _gm->roomBrightness();
1479 r = _gm->_rooms[SLEEP];
1480 r->setSectionVisible(1, false);
1481 r->setSectionVisible(2, false);
1482 _gm->wait(2);
1483 _vm->renderImage(2);
1484 _gm->wait(3);
1485 _vm->renderImage(8);
1486 _gm->wait(2);
1487 _vm->renderImage(9);
1488 _gm->wait(1);
1489 _vm->renderImage(10);
1490 }
1491 }
1492 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, LANDINGMOD_BUTTON))
1493 _vm->renderMessage(kStringShipHold3);
1494 else if ((verb == ACTION_LOOK) && (obj1._id == LANDINGMOD_MONITOR) && isSectionVisible(7))
1495 _vm->renderMessage(kStringShipHold4);
1496 else if ((verb == ACTION_USE) && (obj1._id == KEYBOARD))
1497 _vm->renderMessage(kStringShipHold5);
1498 else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, LANDINGMOD_SOCKET)) {
1499 Room *r = _gm->_rooms[CABIN_L3];
1500 _gm->_inventory.remove(*r->getObject(8));
1501 getObject(4)->_name = r->getObject(8)->_name;
1502 _vm->renderImage(4);
1503 if (_gm->_state._cableConnected) {
1504 _vm->renderImage(5);
1505 getObject(4)->_click = 6;
1506 } else {
1507 getObject(4)->_click = 5;
1508 if (_gm->_state._terminalStripWire)
1509 _vm->renderImage(11);
1510 }
1511 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SPOOL, LANDINGMOD_SOCKET))
1512 _vm->renderMessage(kStringShipHold8);
1513 else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
1514 _vm->renderImage(11);
1515 getObject(4)->_name = kStringWireAndClip;
1516 Room *r = _gm->_rooms[HOLD];
1517 _gm->_inventory.remove(*r->getObject(2));
1518 _gm->_state._terminalStripConnected = true;
1519 _gm->_state._terminalStripWire = true;
1520 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, SPOOL)) {
1521 if (!_gm->_state._terminalStripConnected)
1522 _vm->renderMessage(kStringCable3);
1523 else {
1524 _vm->renderImage(5);
1525 getObject(4)->_name = kStringWireAndPlug2;
1526 getObject(4)->_click = 6;
1527 _gm->_inventory.remove(*_gm->_rooms[CABIN_L2]->getObject(9));
1528 }
1529 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, LANDINGMOD_HATCH)) {
1530 if (getObject(5)->hasProperty(OPENED)) {
1531 Room *r = _gm->_rooms[HOLD];
1532 if (isSectionVisible(5)) {
1533 r->setSectionVisible(5, true);
1534 r->getObject(0)->_click = 10;
1535 } else
1536 r->getObject(0)->_click = 9;
1537
1538 r->setSectionVisible(4, true);
1539 r->getObject(0)->_name = getObject(4)->_name;
1540 _vm->renderImage(_gm->invertSection(5));
1541 _vm->renderImage(_gm->invertSection(4));
1542 setSectionVisible(11, false);
1543 _vm->renderImage(6);
1544 getObject(4)->_click = 7;
1545 } else
1546 _vm->renderMessage(kStringShipHold6);
1547 } else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) && isSectionVisible(6))
1548 _vm->renderMessage(kStringCable1);
1549 else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) && (obj1._id == LANDINGMOD_WIRE))
1550 _vm->renderMessage(kStringCable2);
1551 else
1552 return false;
1553
1554 return true;
1555 }
1556
ShipGenerator(SupernovaEngine * vm,GameManager1 * gm)1557 ShipGenerator::ShipGenerator(SupernovaEngine *vm, GameManager1 *gm) {
1558 _vm = vm;
1559 _gm = gm;
1560
1561 _fileNumber = 18;
1562 _id = GENERATOR;
1563 _shown[0] = kShownTrue;
1564 _shown[5] = kShownTrue;
1565
1566 _objectState[0] = Object(_id, kStringGeneratorWire,kStringDefaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
1567 _objectState[1] = Object(_id, kStringEmptySpool,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
1568 _objectState[2] = Object(_id, kStringKeycard2,kStringKeycard2Description,KEYCARD2,COMBINABLE | TAKE,12,12,5 | kSectionInvert);
1569 _objectState[3] = Object(_id, kStringRope,kStringDefaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
1570 _objectState[4] = Object(_id, kStringHatch,kStringHatchDescription3,OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
1571 _objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
1572 _objectState[6] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,4,4,0);
1573 _objectState[7] = Object(_id, kStringTrap,kStringDefaultDescription,TRAP,OPENABLE,5,6,2);
1574 _objectState[8] = Object(_id, kStringWire,kStringDefaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
1575 _objectState[9] = Object(_id, kStringVoltmeter,kStringDefaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
1576 _objectState[10] = Object(_id, kStringClip,kStringDefaultDescription,CLIP,COMBINABLE,8,8,0);
1577 _objectState[11] = Object(_id, kStringWire,kStringWireDescription,SHORT_WIRE,COMBINABLE,10,10,0);
1578 _objectState[12] = Object(_id, kStringLadder,kStringDefaultDescription,LADDER,EXIT,0,0,0,HOLD,1);
1579 }
1580
interact(Action verb,Object & obj1,Object & obj2)1581 bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
1582 if ((verb == ACTION_OPEN) && (obj1._id == OUTERHATCH)) {
1583 if (obj1.hasProperty(OPENED))
1584 return false;
1585 _vm->playSound(kAudioSlideDoor);
1586 _vm->renderImage(1);
1587 if (isSectionVisible(7))
1588 _vm->renderImage(10);
1589 if (isSectionVisible(13))
1590 _vm->renderImage(13);
1591 _gm->_rooms[HOLD]->setSectionVisible(3, true);
1592 obj1.setProperty(OPENED);
1593 obj1._click = 2;
1594 _vm->playSound(kAudioDoorOpen);
1595 } else if ((verb == ACTION_CLOSE) && (obj1._id == OUTERHATCH)) {
1596 if (!obj1.hasProperty(OPENED))
1597 return false;
1598 if (isSectionVisible(11) || isSectionVisible(12))
1599 _vm->renderMessage(kStringShipHold7);
1600 else {
1601 _vm->playSound(kAudioSlideDoor);
1602 _vm->renderImage(_gm->invertSection(1));
1603 setSectionVisible(10, false);
1604 if (isSectionVisible(13))
1605 _vm->renderImage(13);
1606 _gm->_rooms[HOLD]->setSectionVisible(3, false);
1607 obj1.disableProperty(OPENED);
1608 obj1._click = 1;
1609 _vm->playSound(kAudioDoorClose);
1610 }
1611 } else if ((verb == ACTION_WALK) && (obj1._id == OUTERHATCH) &&
1612 isSectionVisible(7)) {
1613 if (!obj1.hasProperty(OPENED))
1614 _vm->renderMessage(kStringShipHold9);
1615 else if (!isSectionVisible(11))
1616 _vm->renderMessage(kStringShipHold10);
1617 else {
1618 obj1._exitRoom = ROCKS;
1619 return false;
1620 }
1621 } else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_WIRE))
1622 _vm->renderMessage(kStringCable2);
1623 else if ((verb == ACTION_PULL) && (obj1._id == SHORT_WIRE) &&
1624 (obj1._click != 11)) {
1625 _vm->renderImage(3);
1626 _vm->renderImage(4);
1627 obj1._click = 11;
1628 _gm->turnOff();
1629 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SHORT_WIRE, CLIP) &&
1630 (getObject(11)->_click == 11) && !isSectionVisible(9)) {
1631 _vm->renderImage(2);
1632 setSectionVisible(3, false);
1633 setSectionVisible(4, false);
1634 getObject(11)->_click = 10;
1635 if (_gm->_state._shipEnergyDaysLeft)
1636 _gm->turnOn();
1637 else
1638 _vm->renderImage(4);
1639 } else if ((verb == ACTION_OPEN) && (obj1._id == TRAP)) {
1640 _vm->playSound(kAudioSlideDoor);
1641 _vm->renderImage(2);
1642 if (getObject(11)->_click == 11)
1643 _vm->renderImage(3);
1644 if (_gm->_state._powerOff)
1645 _vm->renderImage(4);
1646 obj1.setProperty(OPENED);
1647 obj1._click = 6;
1648
1649 obj1._click2 = 5;
1650 _vm->playSound(kAudioDoorOpen);
1651 } else if ((verb == ACTION_CLOSE) && (obj1._id == TRAP)) {
1652 if (isSectionVisible(9))
1653 _vm->renderMessage(kStringCable1);
1654 else {
1655 setSectionVisible(3, false);
1656 return false;
1657 }
1658 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, GENERATOR_WIRE, CLIP) &&
1659 isSectionVisible(3) && (getObject(0)->_click != 16)) {
1660 _vm->renderImage(_gm->invertSection(8));
1661 _vm->renderImage(2);
1662 setSectionVisible(4, false);
1663 _vm->renderImage(3);
1664 _vm->renderImage(9);
1665 getObject(0)->_click = 16;
1666 Room *r = _gm->_rooms[LANDINGMODULE];
1667 if (_gm->_state._landingModuleEnergyDaysLeft && r->isSectionVisible(7))
1668 _gm->turnOn();
1669 else
1670 _vm->renderImage(4);
1671 _gm->_rooms[HOLD]->setSectionVisible(7, true);
1672 _gm->great(3);
1673 } else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) && (obj1._click == 16)) {
1674 _vm->renderImage(_gm->invertSection(9));
1675 _vm->renderImage(2);
1676 _vm->renderImage(3);
1677 _vm->renderImage(4);
1678 _vm->renderImage(8);
1679 obj1._click = 15;
1680 _gm->turnOff();
1681 _gm->_rooms[HOLD]->setSectionVisible(7, false);
1682 } else if ((verb == ACTION_USE) &&
1683 (Object::combine(obj1, obj2, WIRE, CLIP) ||
1684 Object::combine(obj1, obj2, SPOOL, CLIP)) &&
1685 isSectionVisible(3)) {
1686 _vm->renderMessage(kStringShipHold11);
1687 } else if ((verb == ACTION_LOOK) && (obj1._id == VOLTMETER)) {
1688 if (_gm->_state._powerOff)
1689 _vm->renderMessage(kStringShipHold12);
1690 else
1691 _vm->renderMessage(kStringShipHold13);
1692 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LADDER, ROPE)) {
1693 _vm->renderImage(13);
1694 Room *r = _gm->_rooms[CABIN_R3];
1695 _gm->_inventory.remove(*r->getObject(9));
1696 getObject(3)->_click = 18;
1697 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
1698 if (!isSectionVisible(1))
1699 _vm->renderMessage(kStringShipHold14);
1700 else {
1701 _vm->renderImage(_gm->invertSection(13));
1702 _vm->renderImage(1);
1703 if (isSectionVisible(7)) {
1704 _vm->renderImage(10);
1705 _vm->renderImage(11);
1706 } else
1707 _vm->renderImage(12);
1708
1709 Room *r = _gm->_rooms[OUTSIDE];
1710 r->setSectionVisible(1, true);
1711 r->getObject(1)->_click = 1;
1712 getObject(3)->_click = 17;
1713 }
1714 } else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_ROPE))
1715 _vm->renderMessage(kStringShipHold15);
1716 else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_WIRE) && isSectionVisible(1))
1717 _vm->renderMessage(kStringShipHold16);
1718 else
1719 return false;
1720
1721 return true;
1722 }
1723
ShipOuterSpace(SupernovaEngine * vm,GameManager1 * gm)1724 ShipOuterSpace::ShipOuterSpace(SupernovaEngine *vm, GameManager1 *gm) {
1725 _vm = vm;
1726 _gm = gm;
1727
1728 _fileNumber = 4;
1729 _id = OUTSIDE;
1730 _shown[0] = kShownTrue;
1731
1732 _objectState[0] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
1733 _objectState[1] = Object(_id, kStringRope,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
1734 }
1735
1736
1737 // Arsano
ArsanoRocks(SupernovaEngine * vm,GameManager1 * gm)1738 ArsanoRocks::ArsanoRocks(SupernovaEngine *vm, GameManager1 *gm) {
1739 _vm = vm;
1740 _gm = gm;
1741
1742 _fileNumber = 12;
1743 _id = OUTSIDE;
1744 _shown[0] = kShownTrue;
1745
1746 _objectState[0] = Object(_id, kStringRope,kStringDefaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
1747 _objectState[1] = Object(_id, kStringStone,kStringDefaultDescription,STONE,NULLTYPE,1,1,0);
1748 _objectState[2] = Object(_id, kStringStone,kStringDefaultDescription,NULLOBJECT,NULLTYPE,2,2,0);
1749 _objectState[3] = Object(_id, kStringCaveOpening,kStringCaveOpeningDescription,NULLOBJECT,NULLTYPE,255,255,0,CAVE,1);
1750 }
1751
onEntrance()1752 void ArsanoRocks::onEntrance() {
1753 _gm->great(8);
1754 }
1755
interact(Action verb,Object & obj1,Object & obj2)1756 bool ArsanoRocks::interact(Action verb, Object &obj1, Object &obj2) {
1757 if (((verb == ACTION_PULL) || (verb == ACTION_PRESS)) &&
1758 (obj1._id == STONE) && !isSectionVisible(3)) {
1759 _vm->renderImage(1);
1760 _gm->wait(2);
1761 _vm->renderImage(2);
1762 _gm->wait(2);
1763 _vm->renderImage(3);
1764 _vm->playSound(kAudioRocks);
1765 obj1._click = 3;
1766 getObject(3)->_click = 4;
1767 getObject(3)->setProperty(EXIT);
1768 return true;
1769 }
1770 return false;
1771 }
1772
ArsanoCave(SupernovaEngine * vm,GameManager1 * gm)1773 ArsanoCave::ArsanoCave(SupernovaEngine *vm, GameManager1 *gm) {
1774 _vm = vm;
1775 _gm = gm;
1776
1777 _fileNumber = 12;
1778 _id = CAVE;
1779
1780 _objectState[0] = Object(_id, kStringExit,kStringExitDescription,NULLOBJECT,EXIT,255,255,0,ROCKS,22);
1781 _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
1782 }
1783
ArsanoMeetup(SupernovaEngine * vm,GameManager1 * gm)1784 ArsanoMeetup::ArsanoMeetup(SupernovaEngine *vm, GameManager1 *gm) {
1785 _vm = vm;
1786 _gm = gm;
1787
1788 _fileNumber = 37;
1789 _id = MEETUP;
1790 _shown[0] = kShownTrue;
1791 _sign = 0;
1792 _beacon = 0;
1793
1794 _objectState[0] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
1795 _objectState[1] = Object(_id, kStringSign,kStringSignDescription,MEETUP_SIGN,NULLTYPE,0,0,0);
1796 _objectState[2] = Object(_id, kStringEntrance,kStringDefaultDescription,DOOR,EXIT,1,1,0,ENTRANCE,7);
1797 _objectState[3] = Object(_id, kStringStar,kStringDefaultDescription,STAR,NULLTYPE,2,2,0);
1798 _objectState[4] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIPS,COMBINABLE,3,3,0);
1799 _objectState[5] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIP,COMBINABLE,4,4,0);
1800 }
1801
onEntrance()1802 void ArsanoMeetup::onEntrance() {
1803 if (isSectionVisible(7)) {
1804 _gm->wait(3);
1805 _vm->renderImage(6);
1806 setSectionVisible(7, false);
1807 _gm->wait(3);
1808 _vm->renderImage(_gm->invertSection(6));
1809 }
1810 if (!(_gm->_state._greatFlag & 0x8000)) {
1811 _vm->playSound(kAudioFoundLocation);
1812 _gm->_state._greatFlag |= 0x8000;
1813 }
1814 }
1815
animation()1816 void ArsanoMeetup::animation() {
1817 _vm->renderImage(_gm->invertSection(1) + _beacon);
1818 _beacon = (_beacon + 1) % 5;
1819 _vm->renderImage(_beacon + 1);
1820 _vm->renderImage(_beacon + 8);
1821 if (isSectionVisible(_sign + 13))
1822 _vm->renderImage(_gm->invertSection(13) + _sign);
1823 else
1824 _vm->renderImage(13 + _sign);
1825
1826 _sign = (_sign + 1) % 14;
1827 _gm->setAnimationTimer(3);
1828 }
1829
interact(Action verb,Object & obj1,Object & obj2)1830 bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
1831 if ((verb == ACTION_WALK) &&
1832 ((obj1._id == SPACESHIPS) ||
1833 ((obj1._id == SPACESHIP) && !obj1.hasProperty(OPENED)))) {
1834 _vm->renderMessage(kStringArsanoMeetup1);
1835 } else if ((verb == ACTION_WALK) && (obj1._id == SPACESHIP))
1836 _gm->changeRoom(GLIDER);
1837 else if ((verb == ACTION_WALK) && (obj1._id == STAR))
1838 _vm->renderMessage(kStringArsanoMeetup2);
1839 else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
1840 _vm->setCurrentImage(26);
1841 _vm->renderImage(0);
1842 _vm->paletteBrightness();
1843 _gm->animationOff();
1844 _gm->getInput();
1845 _gm->animationOn();
1846 g_system->fillScreen(kColorBlack);
1847 _vm->renderRoom(*this);
1848 _vm->paletteBrightness();
1849 } else if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
1850 _vm->renderImage(6);
1851 _gm->wait(3);
1852 _vm->renderImage(7);
1853 setSectionVisible(6, false);
1854 _gm->wait(3);
1855
1856 return false;
1857 } else if ((verb == ACTION_LOOK) && (obj1._id == MEETUP_SIGN) && _gm->_state._language) {
1858 if (_gm->_state._language == 2)
1859 _vm->renderMessage(kStringArsanoMeetup3);
1860
1861 obj1._description = kStringSignDescription2;
1862 if (_gm->_state._language == 1)
1863 return false;
1864
1865 _gm->_state._language = 1;
1866 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP)) {
1867 getObject(5)->setProperty(OPENED);
1868 _gm->changeRoom(GLIDER);
1869 } else
1870 return false;
1871
1872 return true;
1873 }
1874
ArsanoEntrance(SupernovaEngine * vm,GameManager1 * gm)1875 ArsanoEntrance::ArsanoEntrance(SupernovaEngine *vm, GameManager1 *gm) {
1876 _vm = vm;
1877 _gm = gm;
1878
1879 _fileNumber = 10;
1880 _id = ENTRANCE;
1881 _shown[0] = kShownTrue;
1882
1883 _objectState[0] = Object(_id, kStringPorter,kStringPorterDescription,PORTER,TALK,0,0,0);
1884 _objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
1885 _objectState[2] = Object(_id, kStringSign,kStringSignDescription,KITCHEN_SIGN,NULLTYPE,2,2,0);
1886 _objectState[3] = Object(_id, kStringChewingGum,kStringDefaultDescription,SCHNUCK,TAKE,255,255,10+kSectionInvert);
1887 _objectState[4] = Object(_id, kStringGummyBears,kStringDefaultDescription,SCHNUCK,TAKE,255,255,11+kSectionInvert);
1888 _objectState[5] = Object(_id, kStringChocolateBall,kStringDefaultDescription,SCHNUCK,TAKE,255,255,12+kSectionInvert);
1889 _objectState[6] = Object(_id, kStringEgg,kStringDefaultDescription,EGG,TAKE,255,255,13+kSectionInvert);
1890 _objectState[7] = Object(_id, kStringLiquorice,kStringDefaultDescription,SCHNUCK,TAKE,255,255,14+kSectionInvert);
1891 _objectState[8] = Object(_id, kStringPill,kStringPillDescription,PILL,TAKE,255,255,0);
1892 _objectState[9] = Object(_id, kStringSlot,kStringDefaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
1893 _objectState[10] = Object(_id, kStringVendingMachine,kStringVendingMachineDescription,NULLOBJECT,NULLTYPE,5,5,0);
1894 _objectState[11] = Object(_id, kStringToilet,kStringToiletDescription,ARSANO_BATHROOM,NULLTYPE,255,255,0);
1895 _objectState[12] = Object(_id, kStringButton,kStringDefaultDescription,BATHROOM_BUTTON,PRESS,3,3,0);
1896 _objectState[13] = Object(_id, kStringSign,kStringSignDescription,BATHROOM_SIGN,NULLTYPE,4,4,0);
1897 _objectState[14] = Object(_id, kStringStaircase,kStringDefaultDescription,STAIRCASE,EXIT,8,8,0,REST,3);
1898 _objectState[15] = Object(_id, kStringExit,kStringDefaultDescription,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22);
1899 _objectState[16] = Object(_id, kStringCoins,kStringCoinsDescription,COINS,TAKE|COMBINABLE,255,255,0);
1900 _objectState[17] = Object(_id, kStringTabletPackage,kStringTabletPackageDescription,PILL_HULL,TAKE,255,255,0);
1901
1902 _dialog1[0] = kStringArsanoDialog7;
1903 _dialog1[1] = kStringArsanoDialog1;
1904 _dialog1[2] = kStringArsanoDialog8;
1905 _dialog1[3] = kStringArsanoDialog9;
1906 _dialog1[4] = kStringDialogSeparator;
1907
1908 _dialog2[0] = kStringArsanoDialog1;
1909 _dialog2[1] = kStringArsanoDialog2;
1910 _dialog2[2] = kStringArsanoDialog3;
1911 _dialog2[3] = kStringArsanoDialog4;
1912 _dialog2[4] = kStringDialogSeparator;
1913
1914 _dialog3[0] = kStringArsanoDialog5;
1915 _dialog3[1] = kStringArsanoDialog6;
1916
1917 _eyewitness = 5;
1918 }
1919
animation()1920 void ArsanoEntrance::animation() {
1921 if (!_vm->_screen->isMessageShown() && isSectionVisible(kMaxSection - 5)) {
1922 _gm->animationOff(); // to avoid recursive call
1923 _vm->playSound(kAudioSlideDoor);
1924 _vm->renderImage(8);
1925 setSectionVisible(9, false);
1926 _gm->wait(2);
1927 _vm->renderImage(7);
1928 setSectionVisible(8, false);
1929 _gm->wait(2);
1930 _vm->renderImage(6);
1931 setSectionVisible(7, false);
1932 _gm->wait(2);
1933 _vm->renderImage(5);
1934 setSectionVisible(6, false);
1935 _gm->wait(2);
1936 _vm->renderImage(_gm->invertSection(5));
1937 getObject(11)->_click = 255;
1938 setSectionVisible(kMaxSection - 5, false);
1939 _gm->animationOn();
1940 }
1941 if (isSectionVisible(2))
1942 _vm->renderImage(_gm->invertSection(2));
1943 else if (_eyewitness)
1944 --_eyewitness;
1945 else {
1946 _eyewitness = 20;
1947 _vm->renderImage(2);
1948 }
1949
1950 _gm->setAnimationTimer(4);
1951 }
1952
interact(Action verb,Object & obj1,Object & obj2)1953 bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
1954 static byte row1[6] = {1, 1, 1, 1, 1, 0};
1955 static byte row2[6] = {1, 1, 1, 1, 1, 0};
1956 static byte row3[6] = {1, 1, 0, 0, 0, 0};
1957
1958 if ((verb == ACTION_TALK) && (obj1._id == PORTER)) {
1959 if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
1960 _vm->renderMessage(kStringArsanoEntrance1);
1961 else {
1962 if (_gm->_state._language) {
1963 int e;
1964 do {
1965 if (_gm->_state._shoes == 1) {
1966 _dialog2[2] = kStringArsanoEntrance2;
1967 addSentence(2, 2);
1968 } else if (_gm->_state._shoes > 1)
1969 removeSentence(2, 2);
1970
1971 switch (e = _gm->dialog(5, row2, _dialog2, 2)) {
1972 case 0:
1973 _gm->reply(kStringArsanoEntrance3, 1, _gm->invertSection(1));
1974 _gm->reply(kStringArsanoEntrance4, 1, _gm->invertSection(1));
1975 _gm->reply(kStringArsanoEntrance5, 1, _gm->invertSection(1));
1976 removeSentence(1, 1);
1977 break;
1978 case 1:
1979 _gm->reply(kStringArsanoEntrance6, 1, _gm->invertSection(1));
1980 addSentence(1, 2);
1981 break;
1982 case 2:
1983 if (_gm->_state._shoes == 1) {
1984 _gm->reply(kStringArsanoEntrance7, 1, _gm->invertSection(1));
1985 _gm->_state._shoes = 2;
1986 } else {
1987 _gm->reply(kStringArsanoEntrance8, 1, _gm->invertSection(1));
1988 _gm->_state._shoes = 1;
1989 }
1990 break;
1991 case 3:
1992 _gm->reply(kStringArsanoEntrance9, 1, _gm->invertSection(1));
1993 }
1994 } while (e != 4);
1995 } else if (_gm->dialog(5, row2, _dialog2, 0) != 4)
1996 _gm->reply(kStringArsanoEntrance10, 1, _gm->invertSection(1));
1997 }
1998 } else if ((verb == ACTION_WALK) && (obj1._id == STAIRCASE) && (_gm->_state._shoes != 3)) {
1999 _vm->renderImage(3);
2000 _gm->wait(2);
2001 _vm->renderImage(4);
2002 setSectionVisible(3, false);
2003 if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
2004 _gm->reply(kStringDialogSeparator, 1, _gm->invertSection(1));
2005 else if (_gm->_state._language)
2006 _gm->reply(kStringArsanoEntrance11, 1, _gm->invertSection(1));
2007 else
2008 _gm->reply(kStringArsanoEntrance12, 1, _gm->invertSection(1));
2009 _vm->renderImage(3);
2010 setSectionVisible(4, false);
2011 _gm->wait(2);
2012 _vm->renderImage(_gm->invertSection(3));
2013 if (!_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
2014 if (_gm->_state._language) {
2015 if (_gm->_state._shoes)
2016 _gm->reply(kStringArsanoEntrance13, 1, _gm->invertSection(1));
2017 else
2018 _gm->reply(kStringArsanoEntrance14, 1, _gm->invertSection(1));
2019 int e = 0;
2020 while ((e < 3) && (!allSentencesRemoved(4, 1))) {
2021 switch (e = _gm->dialog(5, row1, _dialog1, 1)) {
2022 case 0:
2023 _gm->reply(kStringArsanoEntrance15, 1, 1 + kSectionInvert);
2024 break;
2025 case 1:
2026 _gm->reply(kStringArsanoEntrance3, 1, 1 + kSectionInvert);
2027 _gm->reply(kStringArsanoEntrance4, 1, 1 + kSectionInvert);
2028 _gm->reply(kStringArsanoEntrance5, 1, 1 + kSectionInvert);
2029 removeSentence(0, 2);
2030 break;
2031 case 2:
2032 _gm->reply(kStringArsanoEntrance7, 1, 1 + kSectionInvert);
2033 _gm->_state._shoes = 2;
2034 break;
2035 case 3:
2036 _vm->renderImage(3);
2037 _gm->wait(2);
2038 _vm->renderImage(4);
2039 setSectionVisible(3, false);
2040 _gm->reply(kStringArsanoEntrance16, 1, 1 + kSectionInvert);
2041 _vm->renderImage(3);
2042 setSectionVisible(4, false);
2043 _gm->wait(2);
2044 _vm->renderImage(_gm->invertSection(3));
2045 break;
2046 }
2047 removeSentence(0, 1);
2048 }
2049 } else {
2050 _gm->dialog(2, row3, _dialog3, 0);
2051 _gm->reply(kStringArsanoEntrance10, 1, 1 + kSectionInvert);
2052 }
2053 }
2054 } else if ((verb == ACTION_PRESS) && (obj1._id == BATHROOM_BUTTON)) {
2055 _vm->playSound(kAudioSlideDoor);
2056 _vm->renderImage(5);
2057 _gm->wait(2);
2058 _vm->renderImage(6);
2059 setSectionVisible(5, false);
2060 _gm->wait(2);
2061 _vm->renderImage(7);
2062 setSectionVisible(6, false);
2063 _gm->wait(2);
2064 _vm->renderImage(8);
2065 setSectionVisible(7, false);
2066 _gm->wait(2);
2067 _vm->renderImage(9);
2068 setSectionVisible(8, false);
2069 getObject(11)->_click = 9;
2070 } else if ((verb == ACTION_WALK) && (obj1._id == ARSANO_BATHROOM)) {
2071 if (_gm->_state._coins) {
2072 if (_gm->_state._shoes == 2) {
2073 _vm->renderMessage(kStringArsanoEntrance17);
2074 _gm->_state._shoes = 3;
2075 removeSentence(2, 2);
2076 removeSentence(3, 2);
2077 } else if (_gm->_state._shoes == 3) {
2078 _vm->renderMessage(kStringArsanoEntrance18);
2079 _gm->_state._shoes = 2;
2080 } else
2081 _vm->renderMessage(kStringArsanoEntrance19);
2082 } else {
2083 if (_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN))
2084 _vm->renderMessage(kStringArsanoEntrance20);
2085 else {
2086 _vm->renderMessage(kStringArsanoEntrance21);
2087 _gm->wait(_gm->_messageDuration, true);
2088 _vm->removeMessage();
2089 _vm->renderMessage(kStringArsanoEntrance22);
2090 _gm->takeObject(*getObject(16));
2091 _gm->_state._coins = 5;
2092 }
2093 }
2094 // This shown object is an abuse in the original engine as it's not a real shown variable
2095 // It's an internal (boolean) status
2096 _shown[kMaxSection - 5] = kShownTrue;
2097 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COINS, CAR_SLOT)) {
2098 if ((_gm->_state._coins < 5) && (getObject(7 - _gm->_state._coins)->_click == 7))
2099 _vm->renderMessage(kStringArsanoEntrance23);
2100 else {
2101 _vm->renderImage(15 - _gm->_state._coins);
2102 getObject(8 - _gm->_state._coins)->_click = 7;
2103 --_gm->_state._coins;
2104 if (_gm->_state._coins == 1)
2105 getObject(16)->_name = kStringCoin;
2106
2107 if (_gm->_state._coins == 0) {
2108 _gm->_inventory.remove(*getObject(16));
2109 _gm->_state._coins = 255;
2110 }
2111 }
2112 } else if ((verb == ACTION_LOOK) && (obj1._id == KITCHEN_SIGN) && _gm->_state._language) {
2113 if (_gm->_state._language == 2)
2114 _vm->renderMessage(kStringArsanoEntrance24);
2115 obj1._description = kStringDoorDescription5;
2116 if (_gm->_state._language == 1)
2117 return false;
2118 _gm->_state._language = 1;
2119 } else if ((verb == ACTION_LOOK) && (obj1._id == BATHROOM_SIGN) && _gm->_state._language) {
2120 if (_gm->_state._language == 2)
2121 _vm->renderMessage(kStringArsanoEntrance25);
2122 obj1._description = kStringDoorDescription6;
2123 if (_gm->_state._language == 1)
2124 return false;
2125 _gm->_state._language = 1;
2126 } else if ((verb == ACTION_WALK) && (obj1._id == MEETUP_EXIT)) {
2127 if (!((_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) &&
2128 (_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN)) &&
2129 (_gm->_rooms[AIRLOCK]->getObject(6)->hasProperty(WORN)))) {
2130 _vm->renderMessage(kStringArsanoEntrance26);
2131 _gm->_rooms[AIRLOCK]->getObject(4)->setProperty(WORN);
2132 _gm->_rooms[AIRLOCK]->getObject(5)->setProperty(WORN);
2133 _gm->_rooms[AIRLOCK]->getObject(6)->setProperty(WORN);
2134 _gm->wait(_gm->_messageDuration, true);
2135 _vm->removeMessage();
2136 }
2137 return false;
2138 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, PORTER))
2139 _vm->renderMessage(kStringArsanoEntrance27);
2140 else
2141 return false;
2142
2143 return true;
2144 }
2145
ArsanoRemaining(SupernovaEngine * vm,GameManager1 * gm)2146 ArsanoRemaining::ArsanoRemaining(SupernovaEngine *vm, GameManager1 *gm) {
2147 _vm = vm;
2148 _gm = gm;
2149
2150 _fileNumber = 28;
2151 _id = REST;
2152 _shown[0] = kShownTrue;
2153
2154 _objectState[0] = Object(_id, kStringStaircase,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
2155 _objectState[1] = Object(_id, kStringChair,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
2156 _objectState[2] = Object(_id, kStringShoes,kStringShoesDescription,NULLOBJECT,NULLTYPE,2,2,0);
2157
2158 _chewing = kShownTrue;
2159 _i = 0;
2160 }
2161
animation()2162 void ArsanoRemaining::animation() {
2163 switch (_i) {
2164 case 0:
2165 _vm->renderImage(1);
2166 _vm->renderImage(_gm->invertSection(4));
2167 break;
2168 case 1:
2169 _vm->renderImage(_gm->invertSection(1));
2170 _vm->renderImage(4);
2171 break;
2172 case 2:
2173 _vm->renderImage(2);
2174 _vm->renderImage(_gm->invertSection(4));
2175 break;
2176
2177 case 3:
2178 _vm->renderImage(7); // Dragon
2179 _vm->renderImage(_gm->invertSection(2));
2180 _vm->renderImage(4);
2181 break;
2182 case 4:
2183 _vm->renderImage(8);
2184 setSectionVisible(7, false);
2185 _vm->renderImage(2);
2186 _vm->renderImage(_gm->invertSection(4));
2187 break;
2188 case 5:
2189 _vm->renderImage(_gm->invertSection(8));
2190 _vm->renderImage(_gm->invertSection(2));
2191 break;
2192 case 6:
2193 _vm->renderImage(3);
2194 _vm->renderImage(2);
2195 break;
2196 case 7:
2197 _vm->renderImage(_gm->invertSection(3));
2198 _vm->renderImage(_gm->invertSection(2));
2199 break;
2200 case 8:
2201 _vm->renderImage(3);
2202 break;
2203 case 9:
2204 _vm->renderImage(14); // Card Player 1
2205 _vm->renderImage(4);
2206 _vm->renderImage(_gm->invertSection(3));
2207 break;
2208 case 10:
2209 _vm->renderImage(15);
2210 _vm->renderImage(14);
2211 _vm->renderImage(_gm->invertSection(4));
2212 _vm->renderImage(3);
2213 break;
2214 case 11:
2215 _vm->renderImage(16);
2216 setSectionVisible(15, false);
2217 _vm->renderImage(4);
2218 _vm->renderImage(_gm->invertSection(3));
2219 break;
2220 case 12:
2221 _vm->renderImage(17);
2222 setSectionVisible(16, false);
2223 _vm->renderImage(_gm->invertSection(4));
2224 _vm->renderImage(3);
2225 break;
2226 case 13:
2227 _vm->renderImage(_gm->invertSection(17));
2228 _vm->renderImage(4);
2229 _vm->renderImage(_gm->invertSection(3));
2230 break;
2231 case 14:
2232 _vm->renderImage(_gm->invertSection(4));
2233 break;
2234 case 15:
2235 _vm->renderImage(6);
2236 break;
2237 case 16:
2238 _vm->renderImage(18); // Card Player 2
2239 _vm->renderImage(5);
2240 break;
2241 case 17:
2242 _vm->renderImage(19);
2243 setSectionVisible(18, false);
2244 _vm->renderImage(_gm->invertSection(5));
2245 break;
2246 case 18:
2247 _vm->renderImage(20);
2248 setSectionVisible(19, false);
2249 _vm->renderImage(5);
2250 break;
2251 case 19:
2252 _vm->renderImage(21);
2253 setSectionVisible(20, false);
2254 _vm->renderImage(_gm->invertSection(5));
2255 break;
2256 case 20:
2257 _vm->renderImage(_gm->invertSection(21));
2258 _vm->renderImage(5);
2259 break;
2260 case 21:
2261 _vm->renderImage(_gm->invertSection(5));
2262 break;
2263 case 22:
2264 _vm->renderImage(5);
2265 break;
2266 case 23:
2267 _vm->renderImage(10);
2268 _chewing = false;
2269 _vm->renderImage(_gm->invertSection(5));
2270 break;
2271 case 24:
2272 _vm->renderImage(11);
2273 setSectionVisible(10, false);
2274 break;
2275 case 25:
2276 _vm->renderImage(12);
2277 setSectionVisible(11, false);
2278 break;
2279 case 26:
2280 _vm->renderImage(13);
2281 setSectionVisible(12, false);
2282 break;
2283 case 27:
2284 _vm->renderImage(12);
2285 setSectionVisible(13, false);
2286 break;
2287 case 28:
2288 _vm->renderImage(11);
2289 setSectionVisible(12, false);
2290 break;
2291 case 29:
2292 _vm->renderImage(10);
2293 setSectionVisible(11, false);
2294 break;
2295 case 30:
2296 _vm->renderImage(_gm->invertSection(10));
2297 _chewing = true;
2298 break;
2299 case 31:
2300 _vm->renderImage(22); // Card Player 3
2301 break;
2302 case 32:
2303 _vm->renderImage(_gm->invertSection(22));
2304 break;
2305 case 33:
2306 _vm->renderImage(_gm->invertSection(6));
2307 break;
2308 case 34:
2309 _vm->renderImage(4);
2310 }
2311
2312 _i = (_i + 1) % 35;
2313 if (_chewing) {
2314 if (isSectionVisible(9))
2315 _vm->renderImage(_gm->invertSection(9));
2316 else
2317 _vm->renderImage(9);
2318 }
2319 _gm->setAnimationTimer(3);
2320 }
2321
ArsanoRoger(SupernovaEngine * vm,GameManager1 * gm)2322 ArsanoRoger::ArsanoRoger(SupernovaEngine *vm, GameManager1 *gm) {
2323 _vm = vm;
2324 _gm = gm;
2325
2326 _fileNumber = 29;
2327 _id = ROGER;
2328 _shown[0] = kShownTrue;
2329
2330 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19);
2331 _objectState[1] = Object(_id, kStringFrogFace,kStringDefaultDescription,ROGER_W,TALK,0,0,0);
2332 _objectState[2] = Object(_id, kStringScrible,kStringScribleDescription,NULLOBJECT,NULLTYPE,3,3,0);
2333 _objectState[3] = Object(_id, kStringWallet,kStringDefaultDescription,WALLET,TAKE,1,1,4);
2334 _objectState[4] = Object(_id, kStringMenu,kStringMenuDescription,NULLOBJECT,UNNECESSARY,2,2,0);
2335 _objectState[5] = Object(_id, kStringCup,kStringCupDescription,CUP,UNNECESSARY,4,4,0);
2336 _objectState[6] = Object(_id, kStringChessGame,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
2337 _objectState[7] = Object(_id, kStringBill,kStringBillDescription,NULLOBJECT,TAKE|COMBINABLE,255,255,0);
2338 _objectState[8] = Object(_id, kStringKeycard3,kStringDefaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
2339
2340 _dialog1[0] = kStringDialogArsanoRoger1;
2341 _dialog1[1] = kStringDialogArsanoRoger2;
2342 _dialog1[2] = kStringDialogArsanoRoger3;
2343 _dialog1[3] = kStringDialogSeparator;
2344
2345 _eyewitness = 5;
2346 _hands = 0;
2347 }
2348
onEntrance()2349 void ArsanoRoger::onEntrance() {
2350 if (!sentenceRemoved(0, 2)) {
2351 _gm->say(kStringArsanoRoger1);
2352 _gm->reply(kStringArsanoRoger2, 2, 2 + kSectionInvert);
2353 removeSentence(0, 2);
2354 }
2355 }
2356
animation()2357 void ArsanoRoger::animation() {
2358 if (isSectionVisible(1))
2359 _vm->renderImage(_gm->invertSection(1));
2360 else if (isSectionVisible(10)) {
2361 _vm->renderImage(12);
2362 setSectionVisible(10, false);
2363 setSectionVisible(12, false);
2364 } else if (_eyewitness) {
2365 --_eyewitness;
2366 } else {
2367 _eyewitness = 20;
2368 if (isSectionVisible(3))
2369 _vm->renderImage(10);
2370 else
2371 _vm->renderImage(1);
2372 }
2373
2374 if (isSectionVisible(3)) {
2375 setSectionVisible(5 + _hands, false);
2376 _hands = (_hands + 1) % 5;
2377 _vm->renderImage(5 + _hands);
2378 }
2379 _gm->setAnimationTimer(4);
2380 }
2381
interact(Action verb,Object & obj1,Object & obj2)2382 bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
2383 static byte row1[6] = {1, 1, 1, 1, 0, 0};
2384
2385 if ((verb == ACTION_TAKE) && (obj1._id == WALLET)) {
2386 if (isSectionVisible(3)) {
2387 _gm->great(0);
2388 return false;
2389 }
2390 _gm->reply(kStringArsanoRoger3, 2, 2 + kSectionInvert);
2391 } else if ((verb == ACTION_USE) && (obj1._id == CUP))
2392 _vm->renderMessage(kStringArsanoRoger4);
2393 else if ((verb == ACTION_TALK) && (obj1._id == ROGER_W)) {
2394 if (isSectionVisible(3))
2395 _vm->renderMessage(kStringArsanoRoger5);
2396 else {
2397 switch (_gm->dialog(4, row1, _dialog1, 1)) {
2398 case 0:
2399 _gm->reply(kStringArsanoRoger6, 2, 2 + kSectionInvert);
2400 _gm->reply(kStringArsanoRoger7, 2, 2 + kSectionInvert);
2401 break;
2402 case 1:
2403 _gm->reply(kStringArsanoRoger8, 2, 2 + kSectionInvert);
2404 _gm->reply(kStringArsanoRoger9, 2, 2 + kSectionInvert);
2405 _gm->say(kStringArsanoRoger10);
2406 break;
2407 case 2:
2408 _gm->reply(kStringArsanoRoger11, 2, 2 + kSectionInvert);
2409 _gm->say(kStringArsanoRoger12);
2410 _gm->reply(kStringArsanoRoger13, 2, 2 + kSectionInvert);
2411 _gm->say(kStringArsanoRoger14);
2412 _gm->reply(kStringArsanoRoger15, 2, 2 + kSectionInvert);
2413 _gm->reply(kStringArsanoRoger16, 2, 2 + kSectionInvert);
2414 _gm->say(kStringArsanoRoger17);
2415 _gm->say(kStringArsanoRoger18);
2416 _gm->reply(kStringArsanoRoger19, 2, 2 + kSectionInvert);
2417 _gm->say(kStringArsanoRoger20);
2418 _gm->say(kStringArsanoRoger21);
2419 _gm->reply(kStringArsanoRoger22, 2, 2 + kSectionInvert);
2420 _gm->say(kStringArsanoRoger23);
2421 _gm->reply(kStringArsanoRoger24, 2, 2 + kSectionInvert);
2422 _gm->reply(kStringArsanoRoger25, 2, 2 + kSectionInvert);
2423 _gm->say(kStringArsanoRoger26);
2424 _gm->reply(kStringArsanoRoger27, 2, 2 + kSectionInvert);
2425 _gm->reply(kStringArsanoRoger28, 2, 2 + kSectionInvert);
2426 _gm->say(kStringArsanoRoger29);
2427 _gm->reply(kStringArsanoRoger30, 2, 2 + kSectionInvert);
2428 _gm->reply(kStringArsanoRoger31, 2, 2 + kSectionInvert);
2429 _gm->say(kStringArsanoRoger32);
2430 _gm->reply(kStringArsanoRoger33, 2, 2 + kSectionInvert);
2431 _gm->say(kStringArsanoRoger34);
2432 _gm->reply(kStringArsanoRoger35, 2, 2 + kSectionInvert);
2433 }
2434 }
2435 } else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, CHESS, ROGER_W)) ||
2436 ((verb == ACTION_GIVE) && (obj1._id == CHESS) && (obj2._id == ROGER_W))) {
2437 _vm->renderImage(11);
2438 _gm->great(0);
2439 _gm->say(kStringArsanoRoger36);
2440 _gm->reply(kStringArsanoRoger37, 2, 2 + kSectionInvert);
2441 _gm->say(kStringArsanoRoger38);
2442 _vm->paletteFadeOut();
2443 _gm->_inventory.remove(*_gm->_rooms[CABIN_R3]->getObject(0)); // Chess board
2444 g_system->fillScreen(kColorBlack);
2445 _vm->_screen->setGuiBrightness(255);
2446 _vm->paletteBrightness();
2447 _vm->renderMessage(kStringArsanoRoger39);
2448 _gm->wait(_gm->_messageDuration, true);
2449 _vm->removeMessage();
2450 _vm->_screen->setGuiBrightness(0);
2451 _vm->paletteBrightness();
2452 _gm->_time += ticksToMsec(125000); // 2 hours
2453 _gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
2454 _gm->_state._eventTime = _gm->_time + ticksToMsec(4000);
2455 _gm->_state._eventCallback = kSupernovaFn;
2456 setSectionVisible(11, false);
2457 setSectionVisible(1, false);
2458 _vm->renderRoom(*this);
2459 _vm->renderImage(3);
2460 getObject(3)->_click = 5;
2461 getObject(5)->_click = 6;
2462 getObject(6)->_click = 7;
2463 _vm->paletteFadeIn();
2464 _vm->renderMessage(kStringArsanoRoger40);
2465 _gm->wait(_gm->_messageDuration, true);
2466 _vm->removeMessage();
2467 } else
2468 return false;
2469
2470 return true;
2471 }
2472
ArsanoGlider(SupernovaEngine * vm,GameManager1 * gm)2473 ArsanoGlider::ArsanoGlider(SupernovaEngine *vm, GameManager1 *gm) {
2474 _vm = vm;
2475 _gm = gm;
2476
2477 _fileNumber = 19;
2478 _id = GLIDER;
2479 _shown[0] = kShownTrue;
2480 _sinus = 0;
2481
2482 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15);
2483 _objectState[1] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON1,PRESS,0,0,0);
2484 _objectState[2] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON2,PRESS,1,1,0);
2485 _objectState[3] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON3,PRESS,2,2,0);
2486 _objectState[4] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON4,PRESS,3,3,0);
2487 _objectState[5] = Object(_id, kStringKeycard,kStringDefaultDescription,GLIDER_KEYCARD,TAKE|COMBINABLE,255,255,0);
2488 _objectState[6] = Object(_id, kStringSlot,kStringDefaultDescription,GLIDER_SLOT,COMBINABLE,4,4,0);
2489 _objectState[7] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE,5,6,6);
2490 _objectState[8] = Object(_id, kStringKeyboard,kStringDefaultDescription,GLIDER_BUTTONS,NULLTYPE,7,7,0);
2491 _objectState[9] = Object(_id, kStringAnnouncement,kStringAnnouncementDescription,GLIDER_DISPLAY,NULLTYPE,8,8,0);
2492 _objectState[10] = Object(_id, kStringInstruments,kStringAnnouncementDescription,GLIDER_INSTRUMENTS,NULLTYPE,9,9,0);
2493 }
2494
animation()2495 void ArsanoGlider::animation() {
2496 if (isSectionVisible(8)) {
2497 setSectionVisible(24 + _sinus, false);
2498 _sinus = (_sinus + 1) % 14;
2499 _vm->renderImage(24 + _sinus);
2500 } else if (isSectionVisible(24 + _sinus))
2501 _vm->renderImage(_gm->invertSection(24 + _sinus));
2502
2503 _gm->setAnimationTimer(2);
2504 }
2505
interact(Action verb,Object & obj1,Object & obj2)2506 bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
2507 static char l, r;
2508 if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, GLIDER_SLOT)) {
2509 _vm->renderImage(5);
2510 _gm->wait(7);
2511 _vm->renderImage(8);
2512 getObject(5)->_click = 10;
2513 _gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
2514 } else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) &&
2515 (obj1._id == GLIDER_KEYCARD)) {
2516 _vm->renderImage(_gm->invertSection(5));
2517 _vm->renderImage(_gm->invertSection(8));
2518 getObject(5)->_click = 255;
2519 _gm->takeObject(*_gm->_rooms[ROGER]->getObject(8));
2520 for (int i = 9; i <= 22; i++)
2521 _vm->renderImage(_gm->invertSection(i));
2522 l = r = 0;
2523 } else if ((verb == ACTION_PRESS) &&
2524 (obj1._id >= GLIDER_BUTTON1) && (obj1._id <= GLIDER_BUTTON4)) {
2525 int i = obj1._id - GLIDER_BUTTON1 + 1;
2526 _vm->renderImage(i);
2527 if (isSectionVisible(8)) {
2528 l = 0;
2529 r = 0;
2530 for (int j = 1; j < 8; j++) {
2531 if (isSectionVisible(j + 8))
2532 l = j;
2533 if (isSectionVisible(j + 15))
2534 r = j;
2535 }
2536 switch (i) {
2537 case 1:
2538 if (l < 7) {
2539 l++;
2540 _vm->renderImage(l + 8);
2541 }
2542 break;
2543 case 3:
2544 if (r < 7) {
2545 r++;
2546 _vm->renderImage(r + 15);
2547 }
2548 break;
2549 case 2:
2550 if (l) {
2551 _vm->renderImage(_gm->invertSection(l + 8));
2552 l--;
2553 }
2554 break;
2555 case 4:
2556 if (r) {
2557 _vm->renderImage(_gm->invertSection(r + 15));
2558 r--;
2559 }
2560 }
2561 }
2562 _gm->wait(4);
2563 _vm->renderImage(_gm->invertSection(i));
2564 } else if ((verb == ACTION_USE) && (obj1._id == GLIDER_BUTTONS))
2565 _vm->renderMessage(kStringArsanoGlider1);
2566 else
2567 return false;
2568
2569 return true;
2570 }
2571
ArsanoMeetup2(SupernovaEngine * vm,GameManager1 * gm)2572 ArsanoMeetup2::ArsanoMeetup2(SupernovaEngine *vm, GameManager1 *gm) {
2573 _vm = vm;
2574 _gm = gm;
2575
2576 _fileNumber = 38;
2577 _id = MEETUP2;
2578 _shown[0] = kShownTrue;
2579
2580 _objectState[0] = Object(_id, kStringRoger, kStringDefaultDescription, ROGER_W, TALK, 255, 255, 0);
2581 _objectState[1] = Object(_id, kStringSpaceshift, kStringDefaultDescription, SPACESHIP, COMBINABLE, 255, 255, 0);
2582 _objectState[2] = Object(_id, kStringCave, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CAVE, 22);
2583
2584 _dialog1[0] = kStringDialogArsanoMeetup2_1;
2585 _dialog1[1] = kStringDialogArsanoMeetup2_2;
2586 _dialog2[0] = kStringDialogArsanoMeetup2_3;
2587 _dialog2[1] = kStringDialogArsanoMeetup2_4;
2588 _dialog3[0] = kStringDialogArsanoMeetup2_5;
2589 _dialog3[1] = kStringDialogArsanoMeetup2_6;
2590 _dialog3[2] = kStringDialogArsanoMeetup2_7;
2591 _dialog3[3] = kStringDialogArsanoMeetup2_8;
2592 _dialog4[0] = kStringDialogArsanoMeetup2_9;
2593 _dialog4[1] = kStringDialogArsanoMeetup2_10;
2594 _dialog4[2] = kStringDialogArsanoMeetup2_11;
2595 }
2596
onEntrance()2597 void ArsanoMeetup2::onEntrance() {
2598 if (sentenceRemoved(0, 1)) {
2599 if (sentenceRemoved(1, 1))
2600 _vm->renderMessage(kStringArsanoMeetup2_2); // All spaceships have left the planet, except one ...
2601 else
2602 shipStart();
2603 } else if (sentenceRemoved(1, 1))
2604 _vm->renderMessage(kStringArsanoMeetup2_1); // All spaceships have left the planet
2605
2606 addAllSentences(1);
2607 }
2608
interact(Action verb,Object & obj1,Object & obj2)2609 bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
2610 static byte row1[6] = {1, 1, 0, 0, 0, 0};
2611 static byte row2[6] = {1, 1, 0, 0, 0, 0};
2612 static byte row3[6] = {1, 1, 1, 1, 0, 0};
2613 static byte row4[6] = {2, 1, 0, 0, 0, 0};
2614
2615 if (((verb == ACTION_WALK) &&
2616 ((obj1._id == SPACESHIP) || (obj1._id == ROGER_W))) ||
2617 ((verb == ACTION_TALK) && (obj1._id == ROGER_W))) {
2618 _gm->changeRoom(INTRO1);
2619 _vm->setCurrentImage(30);
2620 _vm->renderImage(0);
2621 _vm->paletteBrightness();
2622 bool found;
2623 if (sentenceRemoved(0, 2) || sentenceRemoved(1, 2)) {
2624 _gm->reply(kStringArsanoMeetup2_3, 1, 1 + kSectionInvert);
2625 found = !_gm->dialog(2, row4, _dialog4, 0);
2626 if (!(found))
2627 _gm->reply(kStringArsanoMeetup2_4, 1, 1 + kSectionInvert);
2628 } else {
2629 _gm->reply(kStringArsanoMeetup2_5, 1, 1 + kSectionInvert);
2630 _gm->reply(kStringArsanoMeetup2_6, 1, 1 + kSectionInvert);
2631 found = !_gm->dialog(2, row1, _dialog1, 0);
2632 removeSentence(0, 2);
2633 }
2634 if (found) {
2635 _gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(3));
2636 _gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(7));
2637 _gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
2638 _gm->reply(kStringArsanoMeetup2_7, 1, 1 + kSectionInvert);
2639 _gm->reply(kStringArsanoMeetup2_8, 1, 1 + kSectionInvert);
2640 bool flight = _gm->dialog(2, row2, _dialog2, 0);
2641 if (flight) {
2642 _gm->reply(kStringArsanoMeetup2_9, 1, 1 + kSectionInvert);
2643 _gm->dialog(4, row3, _dialog3, 0);
2644 _gm->reply(kStringArsanoMeetup2_10, 1, 1 + kSectionInvert);
2645 } else
2646 _gm->reply(kStringArsanoMeetup2_11, 1, 1 + kSectionInvert);
2647
2648 _gm->changeRoom(MEETUP2);
2649 _gm->_rooms[MEETUP2]->setSectionVisible(12, false);
2650 _gm->_rooms[MEETUP2]->getObject(0)->_click = 255;
2651 _gm->_rooms[MEETUP2]->getObject(1)->_click = 255;
2652 _vm->renderRoom(*this);
2653 _vm->paletteBrightness();
2654 shipStart();
2655 if (flight) {
2656 _vm->setCurrentImage(13);
2657 _vm->renderImage(0);
2658 _vm->paletteBrightness();
2659 _gm->wait(36);
2660 for (int i = 1; i <= 13; i++) {
2661 if (i > 1)
2662 _vm->renderImage(_gm->invertSection(i - 1));
2663 _vm->renderImage(i);
2664 _gm->wait(2);
2665 }
2666 _vm->renderImage(_gm->invertSection(13));
2667 _gm->wait(20);
2668 _vm->setCurrentImage(14);
2669 _vm->renderImage(0);
2670 _vm->paletteBrightness();
2671 _gm->wait(36);
2672 for (int i = 1; i <= 13; i++) {
2673 if (i > 1)
2674 _vm->renderImage(_gm->invertSection(i - 1));
2675 _vm->renderImage(i);
2676 _gm->wait(2);
2677 }
2678 _vm->renderImage(_gm->invertSection(13));
2679 _gm->wait(9);
2680 _vm->playSound(kAudioCrash);
2681 for (int i = 14; i <= 19; i++) {
2682 _vm->renderImage(i);
2683 _gm->wait(3);
2684 }
2685 _vm->paletteFadeOut();
2686 _vm->setCurrentImage(11);
2687 _vm->renderImage(0);
2688 _vm->paletteFadeIn();
2689 _gm->wait(18);
2690 _vm->renderMessage(kStringArsanoMeetup2_12);
2691 _gm->great(0);
2692 _gm->wait(_gm->_messageDuration, true);
2693 _vm->removeMessage();
2694 _vm->paletteFadeOut();
2695 g_system->fillScreen(kColorBlack);
2696 _gm->_state._dream = false;
2697 if (!_vm->loadGame(kSleepAutosaveSlot))
2698 _vm->errorTempSave(false);
2699 _gm->loadTime();
2700 _gm->_rooms[CAVE]->getObject(1)->_exitRoom = MEETUP3;
2701 _gm->_state._dream = true;
2702 }
2703 } else {
2704 _gm->changeRoom(MEETUP2);
2705 _vm->renderRoom(*this);
2706 }
2707 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP))
2708 _vm->renderMessage(kStringArsanoMeetup2_13);
2709 else
2710 return false;
2711
2712 return true;
2713 }
2714
shipStart()2715 void ArsanoMeetup2::shipStart() {
2716 _gm->wait(12);
2717 for (int i = 2; i <= 11; ++i) {
2718 if (i >= 9)
2719 _vm->renderImage(i - 1 + kSectionInvert);
2720 else
2721 setSectionVisible(i - 1, false);
2722 _vm->renderImage(i);
2723 _gm->wait(2);
2724 }
2725 _vm->renderImage(11 + kSectionInvert);
2726 }
2727
ArsanoMeetup3(SupernovaEngine * vm,GameManager1 * gm)2728 ArsanoMeetup3::ArsanoMeetup3(SupernovaEngine *vm, GameManager1 *gm) {
2729 _vm = vm;
2730 _gm = gm;
2731
2732 _fileNumber = 39;
2733 _id = MEETUP3;
2734 _shown[0] = kShownTrue;
2735
2736 _objectState[0] = Object(_id, kStringUfo,kStringUfoDescription,UFO,EXIT,0,0,0,NULLROOM,3);
2737 _objectState[1] = Object(_id, kStringStar,kStringDefaultDescription,STAR,NULLTYPE,1,1,0);
2738 _objectState[2] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
2739
2740 _dialog2[0] = kStringArsanoDialog1;
2741 _dialog2[1] = kStringDialogArsanoMeetup3_1;
2742 _dialog2[2] = kStringDialogArsanoMeetup3_2;
2743 _dialog2[3] = kStringDialogArsanoMeetup3_3;
2744 _dialog3[0] = kStringDialogArsanoMeetup3_4;
2745 _dialog3[1] = kStringDialogArsanoMeetup3_5;
2746 }
2747
interact(Action verb,Object & obj1,Object & obj2)2748 bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
2749 byte row2[6] = {1, 1, 1, 1, 0, 0};
2750 byte row3[6] = {1, 1, 0, 0, 0, 0};
2751 byte rowsX[6] = {1, 1, 1, 0, 0, 0};
2752
2753 if ((verb == ACTION_WALK) && (obj1._id == STAR))
2754 _vm->renderMessage(kStringArsanoMeetup2);
2755 else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
2756 _vm->setCurrentImage(26);
2757 _vm->renderImage(0);
2758 _vm->paletteBrightness();
2759 _gm->getInput();
2760 g_system->fillScreen(kColorBlack);
2761 _vm->renderRoom(*this);
2762 } else if ((verb == ACTION_WALK) && (obj1._id == UFO)) {
2763 g_system->fillScreen(kColorBlack);
2764 _vm->setCurrentImage(36);
2765 _vm->renderImage(0);
2766 _vm->paletteBrightness();
2767 _gm->dialog(3, rowsX, _dialogsX, 0);
2768 _vm->renderImage(1);
2769 _gm->wait(3);
2770 _vm->renderImage(2);
2771 _gm->wait(3);
2772 _vm->renderImage(3);
2773 _gm->wait(6);
2774 _vm->renderImage(4);
2775 _vm->playSound(kAudioGunShot);
2776
2777 while (_vm->_sound->isPlaying())
2778 _gm->wait(1);
2779
2780 _vm->renderImage(5);
2781 _gm->wait(3);
2782 _vm->renderImage(4);
2783 _vm->playSound(kAudioGunShot);
2784
2785 while (_vm->_sound->isPlaying())
2786 _gm->wait(1);
2787
2788 _vm->renderImage(5);
2789 _vm->paletteFadeOut();
2790 _gm->wait(12);
2791 _vm->setCurrentImage(0);
2792 _vm->renderImage(0);
2793 _vm->paletteFadeIn();
2794 _gm->wait(18);
2795 _gm->reply(kStringArsanoMeetup3_1, 2, 2 + kSectionInvert);
2796 _gm->wait(10);
2797 _gm->reply(kStringArsanoMeetup3_2, 1, 1 + kSectionInvert);
2798
2799 do {
2800 int i = _gm->dialog(4, row2, _dialog2, 2);
2801 switch (i) {
2802 case 0:
2803 _gm->reply(kStringArsanoMeetup3_3, 1, 1 + kSectionInvert);
2804 _gm->reply(kStringArsanoMeetup3_4, 1, 1 + kSectionInvert);
2805 break;
2806 case 1:
2807 _gm->reply(kStringArsanoMeetup3_5, 2, 2 + kSectionInvert);
2808 _gm->say(kStringArsanoMeetup3_6);
2809 _gm->reply(kStringArsanoMeetup3_7, 2, 2 + kSectionInvert);
2810 _gm->reply(kStringArsanoMeetup3_8, 2, 2 + kSectionInvert);
2811 _gm->reply(kStringArsanoMeetup3_9, 2, 2 + kSectionInvert);
2812 _gm->reply(kStringArsanoMeetup3_10, 2, 2 + kSectionInvert);
2813 _gm->reply(kStringArsanoMeetup3_11, 2, 2 + kSectionInvert);
2814 if (_gm->dialog(2, row3, _dialog3, 0)) {
2815 _gm->reply(kStringArsanoMeetup3_12, 2, 2 + kSectionInvert);
2816 _gm->say(kStringArsanoMeetup3_13);
2817 }
2818 _gm->reply(kStringArsanoMeetup3_14, 2, 2 + kSectionInvert);
2819 _gm->reply(kStringArsanoMeetup3_15, 2, 2 + kSectionInvert);
2820 _gm->reply(kStringArsanoMeetup3_16, 2, 2 + kSectionInvert);
2821 _gm->reply(kStringArsanoMeetup3_17, 2, 2 + kSectionInvert);
2822 if (_gm->dialog(2, row3, _dialog3, 0)) {
2823 _gm->reply(kStringArsanoMeetup3_12, 2, 2 + kSectionInvert);
2824 _gm->say(kStringArsanoMeetup3_13);
2825 }
2826 _gm->reply(kStringArsanoMeetup3_18, 2, 2 + kSectionInvert);
2827 break;
2828 case 2:
2829 _gm->reply(kStringArsanoMeetup3_19, 2, 2 + kSectionInvert);
2830 _gm->reply(kStringArsanoMeetup3_20, 2, 2 + kSectionInvert);
2831 break;
2832 case 3:
2833 _gm->reply(kStringArsanoMeetup3_21, 1, 1 + kSectionInvert);
2834 _gm->reply(kStringArsanoMeetup3_22, 1, 1 + kSectionInvert);
2835 _gm->say(kStringArsanoMeetup3_23);
2836 _gm->reply(kStringArsanoMeetup3_24, 1, 1 + kSectionInvert);
2837 _gm->reply(kStringArsanoMeetup3_25, 1, 1 + kSectionInvert);
2838 }
2839 removeSentence(2, 2);
2840 } while (!allSentencesRemoved(4, 2));
2841 _gm->say(kStringArsanoMeetup3_26);
2842 _gm->reply(kStringArsanoMeetup3_27, 1, 1 + kSectionInvert);
2843 _gm->reply(kStringArsanoMeetup3_28, 1, 1 + kSectionInvert);
2844 _vm->paletteFadeOut();
2845 // Remove all objects from the inventory except the Knife, Watch and Discman
2846 bool has_knife = _gm->_rooms[INTRO1]->getObject(1)->hasProperty(CARRIED);
2847 bool has_watch = _gm->_rooms[INTRO1]->getObject(2)->hasProperty(CARRIED);
2848 bool has_discman = _gm->_rooms[INTRO1]->getObject(3)->hasProperty(CARRIED);
2849 _gm->_inventory.clear();
2850 _gm->_inventoryScroll = 0;
2851 if (has_knife)
2852 _gm->_inventory.add(*_gm->_rooms[INTRO1]->getObject(1));
2853 if (has_watch)
2854 _gm->_inventory.add(*_gm->_rooms[INTRO1]->getObject(2));
2855 if (has_discman)
2856 _gm->_inventory.add(*_gm->_rooms[INTRO1]->getObject(3));
2857 _gm->changeRoom(CELL);
2858 _gm->_state._dream = true;
2859 } else
2860 return false;
2861
2862 return true;
2863 }
2864
2865 // Axacuss
AxacussCell(SupernovaEngine * vm,GameManager1 * gm)2866 AxacussCell::AxacussCell(SupernovaEngine *vm, GameManager1 *gm) {
2867 _vm = vm;
2868 _gm = gm;
2869
2870 _fileNumber = 43;
2871 _id = CELL;
2872 _shown[0] = kShownTrue;
2873 _shown[1] = kShownTrue;
2874 _shown[31] = kShownTrue;
2875
2876 _objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,CELL_BUTTON,PRESS,1,1,0);
2877 _objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+kSectionInvert,CORRIDOR4,1);
2878 _objectState[2] = Object(_id, kStringTray,kStringTrayDescription,TRAY,UNNECESSARY,255,255,0);
2879 _objectState[3] = Object(_id, kStringLamp,kStringLampDescription,NULLOBJECT,COMBINABLE,3,3,0);
2880 _objectState[4] = Object(_id, kStringEyes,kStringEyesDescription,NULLOBJECT,NULLTYPE,4,4,0);
2881 _objectState[5] = Object(_id, kStringWire,kStringDefaultDescription,CELL_WIRE,COMBINABLE|TAKE,6,6,0);
2882 _objectState[6] = Object(_id, kStringSocket,kStringSocketDescription,SOCKET,COMBINABLE,5,5,0);
2883 _objectState[7] = Object(_id, kStringMetalBlock,kStringMetalBlockDescription,MAGNET,TAKE|COMBINABLE,255,255,30);
2884 _objectState[8] = Object(_id, kStringRobot,kStringRobotDescription,NULLOBJECT,NULLTYPE,255,255,0);
2885 _objectState[9] = Object(_id, kStringTable,kStringTableDescription,CELL_TABLE,COMBINABLE,2,2,0);
2886 }
2887
onEntrance()2888 void AxacussCell::onEntrance() {
2889 if (_gm->_state._dream) {
2890 _vm->renderMessage(kStringAxacussCell_1);
2891 _gm->_time = ticksToMsec(500000);
2892 _gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
2893 _gm->_state._powerOff = false;
2894 _gm->_state._dream = false;
2895 }
2896 }
2897
animation()2898 void AxacussCell::animation() {
2899 ++_gm->_state._timeRobot;
2900
2901 if (_gm->_state._timeRobot == 299) {
2902 _vm->renderImage(_gm->invertSection(31));
2903 _vm->renderImage(28);
2904 getObject(0)->_click = 255;
2905 getObject(1)->resetProperty(EXIT | OPENABLE | OPENED | CLOSED);
2906 } else if ((_gm->_state._timeRobot >= 301) && (_gm->_state._timeRobot <= 320)) {
2907 _vm->renderImage(_gm->invertSection(329 - _gm->_state._timeRobot));
2908 _vm->renderImage(328 - _gm->_state._timeRobot);
2909 } else if (_gm->_state._timeRobot == 321) {
2910 _vm->renderImage(31);
2911 setSectionVisible(8, false);
2912 getObject(0)->_click = 1;
2913 getObject(1)->resetProperty(EXIT | OPENABLE | CLOSED);
2914 }
2915
2916 if (_gm->_state._timeRobot == 599) {
2917 _vm->renderImage(_gm->invertSection(31));
2918 _vm->renderImage(8);
2919 getObject(0)->_click = 255;
2920 getObject(1)->resetProperty(EXIT | OPENABLE | OPENED | CLOSED);
2921 } else if ((_gm->_state._timeRobot >= 601) && (_gm->_state._timeRobot <= 620)) {
2922 _vm->renderImage(_gm->_state._timeRobot - 593 + kSectionInvert);
2923 _vm->renderImage(_gm->_state._timeRobot - 592);
2924 } else if (_gm->_state._timeRobot == 621) {
2925 _vm->renderImage(31);
2926 setSectionVisible(28, false);
2927 getObject(0)->_click = 1;
2928 getObject(1)->resetProperty(EXIT | OPENABLE | CLOSED);
2929 } else if (_gm->_state._timeRobot == 700)
2930 _gm->_state._timeRobot = 0;
2931 else if (_gm->_state._timeRobot == 10002) {
2932 _vm->renderImage(18 + kSectionInvert);
2933 _vm->renderImage(29);
2934 _vm->renderImage(7);
2935 getObject(2)->_click = 13;
2936 } else if (_gm->_state._timeRobot == 10003) {
2937 setSectionVisible(29, false);
2938 _vm->renderImage(30);
2939 getObject(8)->_click = 12;
2940 getObject(7)->_click = 14;
2941 _vm->playSound(kAudioRobotBreaks);
2942 } else if (_gm->_state._timeRobot == 10010)
2943 --_gm->_state._timeRobot;
2944
2945 if (_gm->_state._timeRobot == 312) {
2946 _vm->renderImage(7);
2947 getObject(2)->_click = 13;
2948 } else if (_gm->_state._timeRobot == 610) {
2949 setSectionVisible(7, false);
2950 getObject(2)->_click = 255;
2951 }
2952
2953 if ((isSectionVisible(6)) &&
2954 ((_gm->_state._timeRobot == 310) || (_gm->_state._timeRobot == 610))) {
2955 _vm->playSound(kAudioRobotShock);
2956 _gm->_state._timeRobot = 10000;
2957 }
2958
2959 _gm->setAnimationTimer(3);
2960 }
2961
interact(Action verb,Object & obj1,Object & obj2)2962 bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
2963 if ((verb == ACTION_PRESS) && (obj1._id == CELL_BUTTON))
2964 _vm->renderMessage(kStringAxacussCell_2);
2965 else if ((verb == ACTION_PULL) && (obj1._id == CELL_WIRE) &&
2966 !isSectionVisible(2) &&
2967 !isSectionVisible(3) &&
2968 !isSectionVisible(5)) {
2969 if (isSectionVisible(1)) {
2970 _vm->renderImage(_gm->invertSection(1));
2971 _vm->renderImage(2);
2972 getObject(5)->_click = 7;
2973 } else if (isSectionVisible(4)) {
2974 _vm->renderImage(_gm->invertSection(4));
2975 _vm->renderImage(3);
2976 getObject(5)->_click = 8;
2977 } else if (isSectionVisible(6)) {
2978 _vm->renderImage(_gm->invertSection(6));
2979 _vm->renderImage(5);
2980 getObject(5)->_click = 10;
2981 }
2982 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, SOCKET) &&
2983 !isSectionVisible(1) && !isSectionVisible(4) && !isSectionVisible(6)) {
2984 if (isSectionVisible(2)) {
2985 _vm->renderImage(_gm->invertSection(2));
2986 _vm->renderImage(1);
2987 getObject(5)->_click = 6;
2988 } else if (isSectionVisible(3)) {
2989 _vm->renderImage(_gm->invertSection(3));
2990 _vm->renderImage(4);
2991 getObject(5)->_click = 9;
2992 } else if (isSectionVisible(5)) {
2993 _vm->renderImage(_gm->invertSection(5));
2994 _vm->renderImage(6);
2995 getObject(5)->_click = 11;
2996 } else {
2997 _gm->_inventory.remove(*getObject(5));
2998 _vm->renderImage(4);
2999 getObject(5)->_click = 9;
3000 }
3001 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, KNIFE) &&
3002 ((isSectionVisible(1)) || (isSectionVisible(2)))) {
3003 if (isSectionVisible(1))
3004 _gm->shock();
3005 else {
3006 _vm->renderImage(_gm->invertSection(2));
3007 _vm->renderImage(3);
3008 getObject(5)->_click = 8;
3009 }
3010 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, CELL_TABLE) &&
3011 !isSectionVisible(1) &&
3012 !isSectionVisible(2) &&
3013 !isSectionVisible(5) &&
3014 !isSectionVisible(6)) {
3015 if (isSectionVisible(3)) {
3016 _vm->renderImage(_gm->invertSection(3));
3017 _vm->renderImage(5);
3018 getObject(5)->_click = 10;
3019 } else if (isSectionVisible(4)) {
3020 _vm->renderImage(_gm->invertSection(4));
3021 _vm->renderImage(6);
3022 _gm->shock();
3023 } else {
3024 _gm->_inventory.remove(*getObject(5));
3025 _vm->renderImage(5);
3026 getObject(5)->_click = 10;
3027 }
3028 } else if ((verb == ACTION_TAKE) && (obj1._id == CELL_WIRE) && !(obj1.hasProperty(CARRIED))) {
3029 if (isSectionVisible(3)) {
3030 _vm->renderImage(_gm->invertSection(3));
3031 _gm->takeObject(obj1);
3032 } else if (isSectionVisible(5)) {
3033 _vm->renderImage(_gm->invertSection(5));
3034 _gm->takeObject(obj1);
3035 } else
3036 _vm->renderMessage(kStringAxacussCell_3);
3037 } else if ((verb == ACTION_WALK) && (obj1._id == CELL_DOOR) && (obj1.hasProperty(OPENED))) {
3038 if (isSectionVisible(30) || isSectionVisible(29))
3039 return false;
3040 _vm->playSound(kAudioGunShot);
3041
3042 while (_vm->_sound->isPlaying())
3043 _gm->wait(1);
3044
3045 _vm->playSound(kAudioGunShot);
3046 _vm->playSound(kAudioGunShot);
3047 _gm->dead(kStringAxacussCell_4);
3048 } else if ((verb == ACTION_USE) && (obj1._id == TRAY))
3049 _vm->renderMessage(kStringAxacussCell_5);
3050 else if ((verb == ACTION_TAKE) && (obj1._id == MAGNET)) {
3051 if (isSectionVisible(6))
3052 _gm->shock();
3053 _gm->takeObject(obj1);
3054 _vm->renderMessage(kStringOk);
3055 } else
3056 return false;
3057
3058 return true;
3059 }
3060
AxacussCorridor1(SupernovaEngine * vm,GameManager1 * gm)3061 AxacussCorridor1::AxacussCorridor1(SupernovaEngine *vm, GameManager1 *gm) {
3062 _vm = vm;
3063 _gm = gm;
3064
3065 _fileNumber = 16;
3066 _id = CORRIDOR1;
3067 _shown[0] = kShownTrue;
3068 _shown[3] = kShownTrue;
3069 _shown[4] = kShownTrue;
3070 _shown[5] = kShownTrue;
3071 _shown[13] = kShownTrue;
3072 _shown[21] = kShownTrue;
3073 _shown[23] = kShownTrue;
3074 _shown[25] = kShownTrue;
3075
3076 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,GUARD3,2);
3077 _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR2,22);
3078 }
3079
onEntrance()3080 void AxacussCorridor1::onEntrance() {
3081 _gm->corridorOnEntrance();
3082 }
3083
3084
AxacussCorridor2(SupernovaEngine * vm,GameManager1 * gm)3085 AxacussCorridor2::AxacussCorridor2(SupernovaEngine *vm, GameManager1 *gm) {
3086 _vm = vm;
3087 _gm = gm;
3088
3089 _fileNumber = 16;
3090 _id = CORRIDOR2;
3091 _shown[0] = kShownTrue;
3092 _shown[2] = kShownTrue;
3093 _shown[3] = kShownTrue;
3094 _shown[4] = kShownTrue;
3095 _shown[5] = kShownTrue;
3096 _shown[17] = kShownTrue;
3097 _shown[21] = kShownTrue;
3098 _shown[24] = kShownTrue;
3099
3100 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR1,2);
3101 _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR3,22);
3102 _objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,CORRIDOR4,14);
3103 }
3104
onEntrance()3105 void AxacussCorridor2::onEntrance() {
3106 _gm->corridorOnEntrance();
3107 }
3108
AxacussCorridor3(SupernovaEngine * vm,GameManager1 * gm)3109 AxacussCorridor3::AxacussCorridor3(SupernovaEngine *vm, GameManager1 *gm) {
3110 _vm = vm;
3111 _gm = gm;
3112
3113 _fileNumber = 16;
3114 _id = CORRIDOR3;
3115 _shown[0] = kShownTrue;
3116 _shown[3] = kShownTrue;
3117 _shown[5] = kShownTrue;
3118 _shown[19] = kShownTrue;
3119 _shown[23] = kShownTrue;
3120
3121 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR2,2);
3122 }
3123
onEntrance()3124 void AxacussCorridor3::onEntrance() {
3125 _gm->corridorOnEntrance();
3126 }
3127
onEntrance()3128 void AxacussCorridor4::onEntrance() {
3129 _gm->great(4);
3130 if (_gm->_state._corridorSearch || _gm->_rooms[GUARD]->isSectionVisible(1))
3131 _gm->busted(0);
3132 }
3133
AxacussCorridor4(SupernovaEngine * vm,GameManager1 * gm)3134 AxacussCorridor4::AxacussCorridor4(SupernovaEngine *vm, GameManager1 *gm) {
3135 _vm = vm;
3136 _gm = gm;
3137
3138 _fileNumber = 16;
3139 _id = CORRIDOR4;
3140 _shown[0] = kShownTrue;
3141 _shown[1] = kShownTrue;
3142 _shown[2] = kShownTrue;
3143 _shown[8] = kShownTrue;
3144 _shown[9] = kShownTrue;
3145 _shown[11] = kShownTrue;
3146 _shown[15] = kShownTrue;
3147 _shown[18] = kShownTrue;
3148 _shown[20] = kShownTrue;
3149 _shown[26] = kShownTrue;
3150
3151 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
3152 _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,GUARD,14);
3153 _objectState[2] = Object(_id, kStringCellDoor,kStringCellDoorDescription,DOOR,EXIT|OPENABLE|OPENED|CLOSED,7,7,0,CELL,16);
3154 _objectState[3] = Object(_id, kStringLaptop,kStringDefaultDescription,NEWSPAPER,TAKE,6,6,8);
3155 _objectState[4] = Object(_id, kStringWristwatch,kStringDefaultDescription,WATCH,TAKE|COMBINABLE,255,255,8);
3156 _objectState[5] = Object(_id, kStringTable,kStringDefaultDescription,TABLE,COMBINABLE,5,5,0);
3157 }
3158
animation()3159 void AxacussCorridor4::animation() {
3160 }
3161
interact(Action verb,Object & obj1,Object & obj2)3162 bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
3163 if ((verb == ACTION_TAKE) && (obj1._id == NEWSPAPER)) {
3164 setSectionVisible(9, false);
3165 _gm->takeObject(obj1);
3166 if (isSectionVisible(29))
3167 _vm->renderImage(29);
3168 } else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, TABLE, WATCH)) ||
3169 ((verb == ACTION_GIVE) && (obj1._id == WATCH) && (obj2._id == TABLE))) {
3170 if (obj1._id == WATCH)
3171 _gm->_inventory.remove(obj1);
3172 else
3173 _gm->_inventory.remove(obj2);
3174
3175 _vm->renderImage(29);
3176 getObject(4)->_click = 8;
3177 } else if ((verb == ACTION_TAKE) && (obj1._id == WATCH) && !obj1.hasProperty(CARRIED)) {
3178 setSectionVisible(29, false);
3179 getObject(4)->_click = 255;
3180 _gm->takeObject(*_gm->_rooms[INTRO1]->getObject(2));
3181 if (isSectionVisible(9))
3182 _vm->renderImage(9);
3183 } else
3184 return false;
3185
3186 return true;
3187 }
3188
AxacussCorridor5(SupernovaEngine * vm,GameManager1 * gm)3189 AxacussCorridor5::AxacussCorridor5(SupernovaEngine *vm, GameManager1 *gm) {
3190 _vm = vm;
3191 _gm = gm;
3192
3193 _fileNumber = 16;
3194 _id = CORRIDOR5;
3195 _shown[0] = kShownTrue;
3196 _shown[3] = kShownTrue;
3197 _shown[4] = kShownTrue;
3198 _shown[5] = kShownTrue;
3199 _shown[12] = kShownTrue;
3200 _shown[22] = kShownTrue;
3201 _shown[23] = kShownTrue;
3202 _shown[24] = kShownTrue;
3203
3204 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
3205 _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
3206
3207 _dialog1[0] = kStringDialogAxacussCorridor5_1;
3208 _dialog1[1] = kStringDialogAxacussCorridor5_2;
3209 _dialog2[0] = kStringDialogAxacussCorridor5_3;
3210 _dialog2[1] = kStringDialogAxacussCorridor5_4;
3211 _dialog3[0] = kStringDialogAxacussCorridor5_5;
3212 _dialog3[1] = kStringDialogAxacussCorridor5_6;
3213 _dialog3[2] = kStringDialogAxacussCorridor5_7;
3214 _dialog3[3] = kStringDialogAxacussCorridor5_7;
3215
3216 _rows[0] = 1;
3217 _rows[1] = 1;
3218 _rows[2] = 1;
3219 _rows[3] = 1;
3220 _rows[4] = 0;
3221 _rows[5] = 0;
3222 }
3223
onEntrance()3224 void AxacussCorridor5::onEntrance() {
3225 _gm->corridorOnEntrance();
3226 }
3227
handleMoneyDialog()3228 bool AxacussCorridor5::handleMoneyDialog() {
3229 if (_gm->dialog(2, _rows, _dialog2, 0) == 0) {
3230 _gm->reply(kStringAxacussCorridor5_5, 1, 1 + kSectionInvert);
3231 addAllSentences(2);
3232 if (_gm->_state._money == 0) {
3233 removeSentence(2, 2);
3234 removeSentence(3, 2);
3235 } else {
3236 Common::String string = _vm->getGameString(kStringDialogAxacussCorridor5_7);
3237 _vm->setGameString(kStringPlaceholder1, Common::String::format(string.c_str(), _gm->_state._money - 200));
3238 _vm->setGameString(kStringPlaceholder2, Common::String::format(string.c_str(), _gm->_state._money));
3239 _dialog3[2] = kStringPlaceholder1;
3240 _dialog3[3] = kStringPlaceholder2;
3241 }
3242 switch (_gm->dialog(4, _rows, _dialog3, 2)) {
3243 case 1:
3244 _gm->wait(3);
3245 _vm->renderImage(1);
3246 _vm->playSound(kAudioVoiceHalt);
3247 _vm->renderImage(_gm->invertSection(1));
3248 _gm->wait(5);
3249 _vm->renderImage(2);
3250 _gm->wait(2);
3251 _gm->shot(3, _gm->invertSection(3));
3252 break;
3253 case 2:
3254 if (_gm->_state._money > 1100) {
3255 stopInteract(_gm->_state._money - 200);
3256 return true;
3257 }
3258 _gm->reply(kStringAxacussCorridor5_6, 1, 1 + kSectionInvert);
3259 break;
3260 case 3:
3261 if (_gm->_state._money >= 900) {
3262 stopInteract(_gm->_state._money);
3263 return true;
3264 }
3265 _gm->reply(kStringAxacussCorridor5_6, 1, 1 + kSectionInvert);
3266 break;
3267 }
3268 }
3269 return false;
3270 }
3271
stopInteract(int sum)3272 void AxacussCorridor5::stopInteract(int sum) {
3273 _gm->reply(kStringAxacussCorridor5_7, 1, 1 + kSectionInvert);
3274 _gm->great(0);
3275 _gm->changeRoom(ELEVATOR);
3276 _gm->takeMoney(-sum);
3277 }
3278
interact(Action verb,Object & obj1,Object & obj2)3279 bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
3280 if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
3281 g_system->fillScreen(kColorBlack);
3282 _vm->setCurrentImage(41);
3283 _vm->renderImage(0);
3284 _vm->paletteBrightness();
3285 if (_gm->_guiEnabled) {
3286 _gm->reply(kStringAxacussCorridor5_1, 1, 1 + kSectionInvert);
3287 if (handleMoneyDialog())
3288 return true;
3289 } else {
3290 _gm->_guiEnabled = true;
3291 _gm->reply(kStringAxacussCorridor5_2, 1, 1 + kSectionInvert);
3292 if (_gm->dialog(2, _rows, _dialog1, 0))
3293 _gm->reply(kStringAxacussCorridor5_3, 1, 1 + kSectionInvert);
3294 else {
3295 _gm->reply(kStringAxacussCorridor5_4, 1, 1 + kSectionInvert);
3296 if (handleMoneyDialog())
3297 return true;
3298 }
3299 }
3300 g_system->fillScreen(kColorBlack);
3301 return true;
3302 }
3303 return false;
3304 }
3305
AxacussCorridor6(SupernovaEngine * vm,GameManager1 * gm)3306 AxacussCorridor6::AxacussCorridor6(SupernovaEngine *vm, GameManager1 *gm) {
3307 _vm = vm;
3308 _gm = gm;
3309
3310 _fileNumber = 16;
3311 _id = CORRIDOR6;
3312 _shown[0] = kShownTrue;
3313 _shown[3] = kShownTrue;
3314 _shown[4] = kShownTrue;
3315 _shown[5] = kShownTrue;
3316 _shown[6] = kShownTrue;
3317 _shown[22] = kShownTrue;
3318 _shown[24] = kShownTrue;
3319 _shown[25] = kShownTrue;
3320
3321 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
3322 _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
3323 _objectState[2] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
3324 }
3325
onEntrance()3326 void AxacussCorridor6::onEntrance() {
3327 _gm->corridorOnEntrance();
3328 }
3329
interact(Action verb,Object & obj1,Object & obj2)3330 bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
3331 if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
3332 (obj1.hasProperty(OPENED))) {
3333 _vm->renderImage(6);
3334 setSectionVisible(7, false);
3335 obj1.resetProperty(EXIT | OPENABLE | CLOSED);
3336 _gm->_rooms[CORRIDOR8]->setSectionVisible(27, false);
3337 _gm->_rooms[CORRIDOR8]->setSectionVisible(28, true);
3338 _gm->_rooms[CORRIDOR8]->getObject(0)->disableProperty(OPENED);
3339 _vm->playSound(kAudioDoorClose);
3340 } else
3341 return false;
3342
3343 return true;
3344 }
3345
AxacussCorridor7(SupernovaEngine * vm,GameManager1 * gm)3346 AxacussCorridor7::AxacussCorridor7(SupernovaEngine *vm, GameManager1 *gm) {
3347 _vm = vm;
3348 _gm = gm;
3349
3350 _fileNumber = 16;
3351 _id = CORRIDOR7;
3352 _shown[0] = kShownTrue;
3353 _shown[3] = kShownTrue;
3354 _shown[4] = kShownTrue;
3355 _shown[5] = kShownTrue;
3356 _shown[10] = kShownTrue;
3357 _shown[21] = kShownTrue;
3358 _shown[24] = kShownTrue;
3359 _shown[25] = kShownTrue;
3360
3361 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR6,2);
3362 _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
3363 }
3364
onEntrance()3365 void AxacussCorridor7::onEntrance() {
3366 _gm->corridorOnEntrance();
3367 }
3368
AxacussCorridor8(SupernovaEngine * vm,GameManager1 * gm)3369 AxacussCorridor8::AxacussCorridor8(SupernovaEngine *vm, GameManager1 *gm) {
3370 _vm = vm;
3371 _gm = gm;
3372
3373 _fileNumber = 16;
3374 _id = CORRIDOR8;
3375 _shown[0] = kShownTrue;
3376 _shown[1] = kShownTrue;
3377 _shown[4] = kShownTrue;
3378 _shown[15] = kShownTrue;
3379 _shown[20] = kShownTrue;
3380 _shown[22] = kShownTrue;
3381 _shown[28] = kShownTrue;
3382
3383 _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
3384 _objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
3385 }
3386
onEntrance()3387 void AxacussCorridor8::onEntrance() {
3388 _gm->corridorOnEntrance();
3389 }
3390
interact(Action verb,Object & obj1,Object & obj2)3391 bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
3392 if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
3393 _vm->renderImage(27);
3394 setSectionVisible(28, false);
3395 obj1.setProperty(OPENED);
3396 _gm->_rooms[CORRIDOR6]->setSectionVisible(6, false);
3397 _gm->_rooms[CORRIDOR6]->setSectionVisible(7, true);
3398 _gm->_rooms[CORRIDOR6]->getObject(2)->resetProperty(EXIT | OPENED | OPENABLE);
3399 _gm->_rooms[CORRIDOR6]->getObject(2)->_click = 4;
3400 _vm->playSound(kAudioDoorOpen);
3401 } else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && (obj1._type & OPENED)) {
3402 _vm->renderImage(28);
3403 setSectionVisible(27, false);
3404 obj1.disableProperty(OPENED);
3405 _gm->_rooms[CORRIDOR6]->setSectionVisible(6, true);
3406 _gm->_rooms[CORRIDOR6]->setSectionVisible(7, false);
3407 _gm->_rooms[CORRIDOR6]->getObject(2)->resetProperty(EXIT | CLOSED | OPENABLE);
3408 _vm->playSound(kAudioDoorClose);
3409 } else
3410 return false;
3411
3412 return true;
3413 }
3414
AxacussCorridor9(SupernovaEngine * vm,GameManager1 * gm)3415 AxacussCorridor9::AxacussCorridor9(SupernovaEngine *vm, GameManager1 *gm) {
3416 _vm = vm;
3417 _gm = gm;
3418
3419 _fileNumber = 16;
3420 _id = CORRIDOR9;
3421 _shown[0] = kShownTrue;
3422 _shown[1] = kShownTrue;
3423 _shown[3] = kShownTrue;
3424 _shown[14] = kShownTrue;
3425 _shown[19] = kShownTrue;
3426 _shown[23] = kShownTrue;
3427 _shown[28] = kShownTrue;
3428
3429 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
3430 _objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
3431 }
3432
onEntrance()3433 void AxacussCorridor9::onEntrance() {
3434 _gm->corridorOnEntrance();
3435 }
3436
interact(Action verb,Object & obj1,Object & obj2)3437 bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {
3438 if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && (obj1.hasProperty(OPENED))) {
3439 _vm->renderImage(28);
3440 setSectionVisible(27, false);
3441 obj1.disableProperty(OPENED);
3442 _gm->_rooms[GUARD]->setSectionVisible(6, false);
3443 _gm->_rooms[GUARD]->getObject(2)->disableProperty(OPENED);
3444 _vm->playSound(kAudioDoorClose);
3445 } else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
3446 _vm->renderImage(27);
3447 setSectionVisible(28, false);
3448 obj1.setProperty(OPENED);
3449 _gm->_rooms[GUARD]->setSectionVisible(6, true);
3450 _gm->_rooms[GUARD]->getObject(2)->setProperty(OPENED);
3451 _vm->playSound(kAudioDoorOpen);
3452 if (!_gm->_rooms[GUARD]->isSectionVisible(1))
3453 _gm->busted(0);
3454 } else
3455 return false;
3456
3457 return true;
3458 }
3459
AxacussBcorridor(SupernovaEngine * vm,GameManager1 * gm)3460 AxacussBcorridor::AxacussBcorridor(SupernovaEngine *vm, GameManager1 *gm) {
3461 _vm = vm;
3462 _gm = gm;
3463
3464 _fileNumber = 6;
3465 _id = BCORRIDOR;
3466 _shown[0] = kShownTrue;
3467 _shown[3] = kShownTrue;
3468
3469 _objectState[0] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR1,NULLTYPE,4,4,0);
3470 _objectState[1] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR2,NULLTYPE,5,5,0);
3471 _objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,6,6,0,CORRIDOR8,2);
3472 _objectState[3] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,7,7,0,CORRIDOR9,22);
3473 _objectState[4] = Object(_id, kStringDoor,kStringDoorDescription1,DOOR1,EXIT|OPENABLE|CLOSED|OCCUPIED,0,0,1,OFFICE_L1,6);
3474 _objectState[5] = Object(_id, kStringDoor,kStringDoorDescription2,DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
3475 _objectState[6] = Object(_id, kStringDoor,kStringDoorDescription3,DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
3476 _objectState[7] = Object(_id, kStringDoor,kStringDoorDescription4,DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
3477 }
3478
onEntrance()3479 void AxacussBcorridor::onEntrance() {
3480 if (_gm->_state._corridorSearch)
3481 _gm->busted(0);
3482 else if (isSectionVisible(7))
3483 _gm->busted(-1);
3484 }
3485
interact(Action verb,Object & obj1,Object & obj2)3486 bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
3487 if (obj1.hasProperty(EXIT) ||
3488 ((verb == ACTION_USE) && obj1.hasProperty(COMBINABLE) && obj2.hasProperty(EXIT))) {
3489 _gm->_state._playerHidden = false;
3490 }
3491
3492 if ((verb == ACTION_CLOSE) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4) && obj1.hasProperty(OPENED)) {
3493 _vm->renderImage(_gm->invertSection(obj1._id - DOOR1 + 1));
3494 _vm->playSound(kAudioDoorClose);
3495 obj1.disableProperty(OPENED);
3496 obj1.setProperty(CLOSED);
3497 if (obj1.hasProperty(OCCUPIED)) {
3498 _gm->_state._destination = 255;
3499 obj1.disableProperty(OCCUPIED);
3500 obj1.setProperty(CAUGHT);
3501 if (!_gm->_rooms[OFFICE_L1 + obj1._id - DOOR1]->isSectionVisible(4))
3502 _gm->search(180);
3503 else
3504 _gm->_state._eventTime = kMaxTimerValue;
3505 }
3506 } else if (((verb == ACTION_WALK) || ((verb == ACTION_OPEN) && !obj1.hasProperty(OPENED))) &&
3507 (obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
3508 obj1.hasProperty(OCCUPIED)) {
3509 _vm->renderMessage(kStringDontEnter);
3510 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR1) &&
3511 !getObject(4)->hasProperty(OPENED)) {
3512 if (getObject(4)->hasProperty(OCCUPIED))
3513 _vm->renderMessage(kStringDontEnter);
3514 else {
3515 _vm->renderImage(1);
3516 _vm->playSound(kAudioDoorOpen);
3517 if (getObject(4)->hasProperty(CAUGHT)) {
3518 _gm->busted(11);
3519 return true;
3520 }
3521 getObject(4)->resetProperty(EXIT | OPENABLE | OPENED);
3522 }
3523 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR2) && !getObject(5)->hasProperty(OPENED)) {
3524 if (getObject(5)->hasProperty(OCCUPIED))
3525 _vm->renderMessage(kStringDontEnter);
3526 else {
3527 _vm->renderImage(2);
3528 _vm->playSound(kAudioDoorOpen);
3529 if (getObject(5)->hasProperty(CAUGHT)) {
3530 _gm->busted(16);
3531 return true;
3532 }
3533 getObject(5)->resetProperty(EXIT | OPENABLE | OPENED);
3534 }
3535 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR3) && !getObject(6)->hasProperty(OPENED)) {
3536 if (getObject(6)->hasProperty(OCCUPIED))
3537 _vm->renderMessage(kStringDontEnter);
3538 else {
3539 _vm->renderImage(3);
3540 _vm->playSound(kAudioDoorOpen);
3541 if (getObject(6)->hasProperty(CAUGHT)) {
3542 _gm->busted(15);
3543 return true;
3544 }
3545 getObject(6)->resetProperty(EXIT | OPENABLE | OPENED);
3546 }
3547 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR4) && !getObject(7)->hasProperty(OPENED)) {
3548 if (getObject(7)->hasProperty(OCCUPIED)) {
3549 _vm->renderMessage(kStringDontEnter);
3550 } else {
3551 _vm->renderImage(4);
3552 _vm->playSound(kAudioDoorOpen);
3553 if (getObject(7)->hasProperty(CAUGHT)) {
3554 _gm->busted(20);
3555 return true;
3556 }
3557 getObject(7)->resetProperty(EXIT | OPENABLE | OPENED);
3558 }
3559 } else if ((verb == ACTION_LOOK) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4)) {
3560 _gm->_state._nameSeen[obj1._id - DOOR1] = true;
3561 return false;
3562 } else if ((verb == ACTION_WALK) && ((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
3563 _vm->renderMessage(kStringAxacussBcorridor_1);
3564 _gm->_state._playerHidden = true;
3565 } else
3566 return false;
3567
3568 return true;
3569 }
3570
AxacussIntersection(SupernovaEngine * vm,GameManager1 * gm)3571 AxacussIntersection::AxacussIntersection(SupernovaEngine *vm, GameManager1 *gm) {
3572 _vm = vm;
3573 _gm = gm;
3574
3575 _fileNumber = 40;
3576 _id = GUARD;
3577 _shown[0] = kShownTrue;
3578
3579 _objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CORRIDOR4, 21);
3580 _objectState[1] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 3, 3, 0, CORRIDOR7, 5);
3581 _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 6, CORRIDOR9, 3);
3582 _objectState[3] = Object(_id, kStringAxacussan, kStringAxacussanDescription, GUARDIAN, TALK, 0, 0, 0);
3583 _objectState[4] = Object(_id, kStringImage, kStringImageDescription2, NULLOBJECT, NULLTYPE, 2, 2, 0);
3584 _objectState[5] = Object(_id, kStringMastercard, kStringMastercardDescription, MASTERKEYCARD, TAKE | COMBINABLE, 255, 255, 1);
3585 }
3586
interact(Action verb,Object & obj1,Object & obj2)3587 bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
3588 byte rowsX[6] = {1, 1, 1, 0, 0, 0};
3589
3590 if (((verb == ACTION_WALK) || (verb == ACTION_OPEN)) && (obj1._id == DOOR) && !isSectionVisible(1))
3591 _gm->guardShot();
3592 else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
3593 _gm->_rooms[CORRIDOR9]->setSectionVisible(27, true);
3594 _gm->_rooms[CORRIDOR9]->setSectionVisible(28, false);
3595 _gm->_rooms[CORRIDOR9]->getObject(1)->setProperty(OPENED);
3596 return false;
3597 } else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
3598 _gm->_rooms[CORRIDOR9]->setSectionVisible(27, false);
3599 _gm->_rooms[CORRIDOR9]->setSectionVisible(28, true);
3600 _gm->_rooms[CORRIDOR9]->getObject(1)->disableProperty(OPENED);
3601 return false;
3602 } else if ((verb == ACTION_TALK) && (obj1._id == GUARDIAN)) {
3603 _gm->dialog(3, rowsX, _dialogsX, 0);
3604 _gm->guardShot();
3605 } else if ((verb == ACTION_TAKE) && (obj1._id == MASTERKEYCARD)) {
3606 _gm->great(0);
3607 setSectionVisible(7, false);
3608 return false;
3609 } else if ((verb == ACTION_USE) && (Object::combine(obj1, obj2, MAGNET, GUARDIAN) || Object::combine(obj1, obj2, KNIFE, GUARDIAN)))
3610 _vm->renderMessage(kStringArsanoEntrance27);
3611 else
3612 return false;
3613
3614 return true;
3615 }
3616
AxacussExit(SupernovaEngine * vm,GameManager1 * gm)3617 AxacussExit::AxacussExit(SupernovaEngine *vm, GameManager1 *gm) {
3618 _vm = vm;
3619 _gm = gm;
3620
3621 _fileNumber = 42;
3622 _id = GUARD3;
3623 _shown[0] = kShownTrue;
3624
3625 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22);
3626 _objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,0,0,0,NULLROOM,20);
3627 _objectState[2] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,15);
3628 _objectState[3] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,2,2,11,OFFICE_L,0);
3629 _objectState[4] = Object(_id, kStringLamp2,kStringDefaultDescription,LAMP,COMBINABLE,3,3,0);
3630 _objectState[5] = Object(_id, kStringAxacussan,kStringDefaultDescription,GUARDIAN,TALK,5,5,0);
3631 _objectState[6] = Object(_id, kStringImage,kStringGenericDescription5,NULLOBJECT,NULLTYPE,4,4,0);
3632 }
3633
interact(Action verb,Object & obj1,Object & obj2)3634 bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
3635 byte rowsX[6] = {1, 1, 1, 0, 0, 0};
3636
3637 if (((verb == ACTION_WALK) || (verb == ACTION_OPEN)) && (obj1._id == DOOR) && !_gm->_state._powerOff)
3638 _gm->guard3Shot();
3639 else if ((verb == ACTION_TALK) && (obj1._id == GUARDIAN)) {
3640 _gm->dialog(3, rowsX, _dialogsX,0);
3641 _gm->guard3Shot();
3642 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LAMP, MAGNET)) {
3643 _gm->_inventory.remove(*_gm->_rooms[CELL]->getObject(7));
3644 for (int i = 4; i <= 11; i++) {
3645 _vm->renderImage(i);
3646 if (i == 11)
3647 _vm->playSound(kAudioSmash); // 046/4020
3648 _gm->wait(1);
3649 _vm->renderImage(i + kSectionInvert);
3650 }
3651 _gm->_state._powerOff = true;
3652 _objectState[5]._click = 255;
3653
3654 _gm->search(450);
3655 _gm->roomBrightness();
3656 } else if ((verb == ACTION_USE) && (Object::combine(obj1,obj2,MAGNET,GUARDIAN) || Object::combine(obj1,obj2,KNIFE,GUARDIAN)))
3657 _vm->renderMessage(kStringArsanoEntrance27);
3658 else
3659 return false;
3660
3661 return true;
3662 }
3663
AxacussOffice1(SupernovaEngine * vm,GameManager1 * gm)3664 AxacussOffice1::AxacussOffice1(SupernovaEngine *vm, GameManager1 *gm) {
3665 _vm = vm;
3666 _gm = gm;
3667
3668 _fileNumber = 7;
3669 _id = OFFICE_L1;
3670 _shown[0] = kShownTrue;
3671 _shown[2] = kShownTrue;
3672 _shown[7] = kShownTrue;
3673 _shown[9] = kShownTrue;
3674 _shown[16] = kShownTrue;
3675
3676 _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
3677 _objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
3678 _objectState[2] = Object(_id, kStringMoney,kStringMoneyDescription1,MONEY,TAKE,255,255,0);
3679 _objectState[3] = Object(_id, kStringLocker,kStringLockerDescription,LOCKER,OPENABLE|CLOSED,5,5,0);
3680 _objectState[4] = Object(_id, kStringLetter,kStringDefaultDescription,LETTER,UNNECESSARY,3,3,0);
3681 }
3682
interact(Action verb,Object & obj1,Object & obj2)3683 bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
3684 Common::String input;
3685 if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
3686 obj1.hasProperty(OPENED)) {
3687 _vm->renderImage(_gm->invertSection(9));
3688 obj1.disableProperty(OPENED);
3689 obj1.setProperty(CLOSED);
3690 _vm->playSound(kAudioDoorClose);
3691 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
3692 !getObject(0)->hasProperty(OPENED)) {
3693 _vm->renderImage(9);
3694 getObject(0)->disableProperty(CLOSED);
3695 getObject(0)->setProperty(OPENED);
3696 _vm->playSound(kAudioDoorOpen);
3697 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
3698 _vm->renderImage(4);
3699 setSectionVisible(16, false);
3700 _vm->playSound(kAudioSmash);
3701 } else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
3702 if (isSectionVisible(4))
3703 _vm->renderMessage(kStringBroken);
3704 else
3705 _gm->telomat(0);
3706 } else if (((verb == ACTION_OPEN) || (verb == ACTION_USE)) &&
3707 (obj1._id == LOCKER) &&
3708 !obj1.hasProperty(OPENED)) {
3709 _vm->renderMessage(kStringAxacussOffice1_1);
3710 _vm->renderBox(160, 70, 70, 10, kColorDarkBlue);
3711 _gm->edit(input, 161, 71, 10);
3712
3713 _vm->removeMessage();
3714 if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
3715 if (!input.equals("89814")) {
3716 if (input.equals("41898"))
3717 _vm->renderMessage(kStringAxacussOffice1_2);
3718 else
3719 _vm->renderMessage(kStringAxacussOffice1_3);
3720 } else {
3721 _vm->renderImage(6);
3722 setSectionVisible(7, false);
3723 obj1.resetProperty(OPENABLE | OPENED);
3724 if (getObject(2)->hasProperty(TAKE)) {
3725 _vm->renderImage(8);
3726 getObject(2)->_click = 9;
3727 }
3728 _vm->playSound(kAudioDoorOpen);
3729 _gm->great(7);
3730 }
3731 }
3732 } else if ((verb == ACTION_CLOSE) && (obj1._id == LOCKER) && obj1.hasProperty(OPENED)) {
3733 _vm->renderImage(7);
3734 setSectionVisible(6, false);
3735 obj1.resetProperty(OPENABLE | CLOSED);
3736 setSectionVisible(8, false);
3737 getObject(2)->_click = 255;
3738 _vm->playSound(kAudioDoorClose);
3739 } else if ((verb == ACTION_TAKE) && (obj1._id == MONEY)) {
3740 _vm->renderImage(6);
3741 setSectionVisible(8, false);
3742 getObject(2)->_click = 255;
3743 getObject(2)->resetProperty();
3744 _gm->takeMoney(500);
3745 } else if ((verb == ACTION_LOOK) && (obj1._id == LETTER)) {
3746 g_system->fillScreen(kColorBlack);
3747 _vm->renderText(kStringAxacussOffice1_4, 10, 10, 4);
3748 _vm->renderText(kStringAxacussOffice1_5, 270, 10, 4);
3749 _vm->renderText(kStringAxacussOffice1_6, 10, 60, 4);
3750 _vm->renderText(kStringAxacussOffice1_7, 10, 75, 4);
3751 _vm->renderText(kStringAxacussOffice1_8, 10, 86, 4);
3752 _vm->renderText(kStringAxacussOffice1_9, 10, 97, 4);
3753 _vm->renderText(kStringAxacussOffice1_10, 10, 108, 4);
3754 _vm->renderText(kStringAxacussOffice1_11, 10, 119, 4);
3755 _vm->renderText(kStringAxacussOffice1_12, 10, 130, 4);
3756 _vm->renderText(kStringAxacussOffice1_13, 10, 147, 4);
3757 _vm->renderText(kStringAxacussOffice1_14, 200, 170, 4);
3758 _vm->renderText(kStringAxacussOffice1_15, 200, 181, 4);
3759 _gm->getInput();
3760 g_system->fillScreen(kColorBlack);
3761 _vm->renderMessage(kStringAxacussOffice1_16);
3762 } else
3763 return false;
3764
3765 return true;
3766 }
3767
AxacussOffice2(SupernovaEngine * vm,GameManager1 * gm)3768 AxacussOffice2::AxacussOffice2(SupernovaEngine *vm, GameManager1 *gm) {
3769 _vm = vm;
3770 _gm = gm;
3771
3772 _fileNumber = 7;
3773 _id = OFFICE_L2;
3774 _shown[0] = kShownTrue;
3775 _shown[1] = kShownTrue;
3776 _shown[9] = kShownTrue;
3777 _shown[16] = kShownTrue;
3778
3779 _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
3780 _objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
3781 _objectState[2] = Object(_id, kStringCube,kStringGenericDescription6,NULLOBJECT,NULLTYPE,0,0,0);
3782 _objectState[3] = Object(_id, kStringImage,kStringGenericDescription7,NULLOBJECT,NULLTYPE,1,1,0);
3783 _objectState[4] = Object(_id, kStringStrangeThing,kStringGenericDescription8,NULLOBJECT,UNNECESSARY,2,2,0);
3784 }
3785
interact(Action verb,Object & obj1,Object & obj2)3786 bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
3787 if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
3788 obj1.hasProperty(OPENED)) {
3789 _vm->renderImage(_gm->invertSection(9));
3790 obj1.disableProperty(OPENED);
3791 obj1.setProperty(CLOSED);
3792 _vm->playSound(kAudioDoorClose);
3793 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) && !getObject(0)->hasProperty(OPENED)) {
3794 _vm->renderImage(9);
3795 getObject(0)->disableProperty(CLOSED);
3796 getObject(0)->setProperty(OPENED);
3797 _vm->playSound(kAudioDoorOpen);
3798 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
3799 _vm->renderImage(4);
3800 setSectionVisible(16, false);
3801 _vm->playSound(kAudioSmash);
3802 } else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
3803 if (isSectionVisible(4))
3804 _vm->renderMessage(kStringBroken);
3805 else
3806 _gm->telomat(1);
3807 } else
3808 return false;
3809
3810 return true;
3811 }
3812
AxacussOffice3(SupernovaEngine * vm,GameManager1 * gm)3813 AxacussOffice3::AxacussOffice3(SupernovaEngine *vm, GameManager1 *gm) {
3814 _vm = vm;
3815 _gm = gm;
3816
3817 _fileNumber = 8;
3818 _id = OFFICE_R1;
3819 _shown[0] = kShownTrue;
3820 _shown[1] = kShownTrue;
3821 _shown[3] = kShownTrue;
3822
3823 _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
3824 _objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
3825 _objectState[2] = Object(_id, kStringImage,kStringImageDescription2,NULLOBJECT,UNNECESSARY,1,1,0);
3826 _objectState[3] = Object(_id, kStringImage,kStringImageDescription2,PAINTING,UNNECESSARY,2,2,0);
3827 _objectState[4] = Object(_id, kStringPlant,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,3,3,0);
3828 _objectState[5] = Object(_id, kNoString,kStringDefaultDescription,MONEY,TAKE|COMBINABLE,255,255,0);
3829 }
3830
interact(Action verb,Object & obj1,Object & obj2)3831 bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
3832 if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
3833 obj1.hasProperty(OPENED)) {
3834 _vm->renderImage(_gm->invertSection(3));
3835 obj1.disableProperty(OPENED);
3836 obj1.setProperty(CLOSED);
3837 _vm->playSound(kAudioDoorClose);
3838 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
3839 !getObject(0)->hasProperty(OPENED)) {
3840 _vm->renderImage(3);
3841 getObject(0)->disableProperty(CLOSED);
3842 getObject(0)->setProperty(OPENED);
3843 _vm->playSound(kAudioDoorOpen);
3844 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
3845 _vm->renderImage(4);
3846 _vm->playSound(kAudioSmash);
3847 } else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
3848 if (isSectionVisible(4))
3849 _vm->renderMessage(kStringBroken);
3850 else
3851 _gm->telomat(2);
3852 } else if ((verb == ACTION_LOOK) && (obj1._id == PAINTING)) {
3853 _vm->renderMessage(kStringAxacussOffice3_1);
3854 _gm->takeMoney(300);
3855 obj1._id = NULLOBJECT;
3856 } else
3857 return false;
3858
3859 return true;
3860 }
3861
AxacussOffice4(SupernovaEngine * vm,GameManager1 * gm)3862 AxacussOffice4::AxacussOffice4(SupernovaEngine *vm, GameManager1 *gm) {
3863 _vm = vm;
3864 _gm = gm;
3865
3866 _fileNumber = 8;
3867 _id = OFFICE_R2;
3868 _shown[0] = kShownTrue;
3869 _shown[2] = kShownTrue;
3870 _shown[3] = kShownTrue;
3871
3872 _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
3873 _objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
3874 _objectState[2] = Object(_id, kStringStatue,kStringStatueDescription,NULLOBJECT,UNNECESSARY,6,6,0);
3875 _objectState[3] = Object(_id, kStringPlant,kStringPlantDescription,NULLOBJECT,UNNECESSARY,5,5,0);
3876 }
3877
interact(Action verb,Object & obj1,Object & obj2)3878 bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
3879 if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
3880 _vm->renderImage(_gm->invertSection(3));
3881 obj1.disableProperty(OPENED);
3882 obj1.setProperty(CLOSED);
3883 _vm->playSound(kAudioDoorClose);
3884 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
3885 !getObject(0)->hasProperty(OPENED)) {
3886 _vm->renderImage(3);
3887 getObject(0)->disableProperty(CLOSED);
3888 getObject(0)->setProperty(OPENED);
3889 _vm->playSound(kAudioDoorOpen);
3890 } else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
3891 _vm->renderImage(4);
3892 _vm->playSound(kAudioSmash);
3893 } else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
3894 if (isSectionVisible(4))
3895 _vm->renderMessage(kStringBroken);
3896 else
3897 _gm->telomat(3);
3898 } else
3899 return false;
3900
3901 return true;
3902 }
3903
AxacussOffice5(SupernovaEngine * vm,GameManager1 * gm)3904 AxacussOffice5::AxacussOffice5(SupernovaEngine *vm, GameManager1 *gm) {
3905 _vm = vm;
3906 _gm = gm;
3907
3908 _fileNumber = 7;
3909 _id = OFFICE_L;
3910 _shown[0] = kShownTrue;
3911 _shown[3] = kShownTrue;
3912 _shown[5] = kShownTrue;
3913 _shown[17] = kShownTrue;
3914
3915 _objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
3916 _objectState[1] = Object(_id, kStringComputer,kStringComputerDescription,COMPUTER,COMBINABLE,4,4,0);
3917 _objectState[2] = Object(_id, kStringGraffiti,kStringGraffitiDescription,NULLOBJECT,NULLTYPE,7,7,0);
3918 _objectState[3] = Object(_id, kStringMoney,kStringMoneyDescription2,MONEY,TAKE,8,8,0);
3919 }
3920
onEntrance()3921 void AxacussOffice5::onEntrance() {
3922 _gm->great(5);
3923 }
3924
interact(Action verb,Object & obj1,Object & obj2)3925 bool AxacussOffice5::interact(Action verb, Object &obj1, Object &obj2) {
3926 if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
3927 _vm->renderImage(4);
3928 _vm->playSound(kAudioSmash);
3929 } else if ((verb == ACTION_TAKE) && (obj1._id == MONEY)) {
3930 _vm->renderImage(_gm->invertSection(5));
3931 obj1._click = 255;
3932 _gm->takeMoney(350);
3933 } else
3934 return false;
3935
3936 return true;
3937 }
3938
AxacussElevator(SupernovaEngine * vm,GameManager1 * gm)3939 AxacussElevator::AxacussElevator(SupernovaEngine *vm, GameManager1 *gm) {
3940 _vm = vm;
3941 _gm = gm;
3942
3943 _fileNumber = 3;
3944 _id = ELEVATOR;
3945 _shown[0] = kShownTrue;
3946
3947 _objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON1,PRESS,0,0,0);
3948 _objectState[1] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON2,PRESS,1,1,0);
3949 _objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,DOOR,EXIT,255,255,0,NULLROOM,22);
3950 _objectState[3] = Object(_id, kStringJungle,kStringJungleDescription,JUNGLE,NULLTYPE,255,255,0,STATION,2);
3951 }
3952
interact(Action verb,Object & obj1,Object & obj2)3953 bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
3954 if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
3955 g_system->fillScreen(kColorBlack);
3956 _vm->setCurrentImage(41);
3957 _vm->renderImage(0);
3958 _vm->paletteBrightness();
3959 _gm->reply(kStringAxacussElevator_1, 1, 1 + kSectionInvert);
3960 _gm->say(kStringAxacussElevator_2);
3961 g_system->fillScreen(kColorBlack);
3962 } else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
3963 if (!isSectionVisible(3)) {
3964 _vm->renderImage(1);
3965 getObject(2)->resetProperty();
3966 _vm->playSound(kAudioSlideDoor);
3967 _gm->wait(25);
3968 for (int i = 3; i <= 7; i++) {
3969 _gm->wait(2);
3970 _vm->renderImage(i);
3971 }
3972 getObject(3)->resetProperty(EXIT);
3973 getObject(3)->_click = 2;
3974 _vm->renderImage(_gm->invertSection(1));
3975 if (!(_gm->_state._greatFlag & 0x4000)) {
3976 _vm->playSound(kAudioFoundLocation);
3977 _gm->_state._greatFlag |= 0x4000;
3978 }
3979 }
3980 } else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
3981 if (isSectionVisible(3)) {
3982 _vm->renderImage(2);
3983 getObject(3)->resetProperty();
3984 getObject(3)->_click = 255;
3985 _vm->playSound(kAudioSlideDoor);
3986 for (int i = 7; i >= 3; i--) {
3987 _gm->wait(2);
3988 _vm->renderImage(_gm->invertSection(i));
3989 }
3990 _gm->wait(25);
3991 _vm->playSound(kAudioSlideDoor);
3992 getObject(2)->resetProperty(EXIT);
3993 _vm->renderImage(_gm->invertSection(2));
3994 }
3995 } else if ((verb == ACTION_WALK) && (obj1._id == JUNGLE)) {
3996 _vm->paletteFadeOut();
3997 g_system->fillScreen(kColorBlack);
3998 _vm->_screen->setGuiBrightness(255);
3999 _vm->paletteBrightness();
4000 _vm->renderMessage(kStringAxacussElevator_3);
4001 _gm->wait(_gm->_messageDuration, true);
4002 _vm->removeMessage();
4003 _vm->_screen->setGuiBrightness(0);
4004 _vm->paletteBrightness();
4005 _gm->_time += ticksToMsec(125000); // 2 hours
4006 _gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
4007 return false;
4008 } else
4009 return false;
4010
4011 return true;
4012 }
4013
AxacussStation(SupernovaEngine * vm,GameManager1 * gm)4014 AxacussStation::AxacussStation(SupernovaEngine *vm, GameManager1 *gm) {
4015 _vm = vm;
4016 _gm = gm;
4017
4018 _fileNumber = 5;
4019 _id = STATION;
4020 _shown[0] = kShownTrue;
4021 _objectState[0] = Object(_id, kStringSign,kStringDefaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
4022 _objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
4023 }
4024
interact(Action verb,Object & obj1,Object & obj2)4025 bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
4026 if ((verb == ACTION_LOOK) && (obj1._id == STATION_SIGN)) {
4027 _gm->changeRoom(SIGN_ROOM);
4028 } else if ((verb == ACTION_WALK) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
4029 _gm->great(0);
4030 _gm->_guiEnabled = false;
4031 _vm->paletteFadeOut();
4032 _vm->_system->fillScreen(kColorBlack);
4033 _gm->changeRoom(OUTRO);
4034 } else
4035 return false;
4036
4037 return true;
4038 }
4039
AxacussSign(SupernovaEngine * vm,GameManager1 * gm)4040 AxacussSign::AxacussSign(SupernovaEngine *vm, GameManager1 *gm) {
4041 _vm = vm;
4042 _gm = gm;
4043
4044 _fileNumber = 32;
4045 _id = SIGN_ROOM;
4046 _shown[0] = kShownTrue;
4047 _shown[1] = kShownTrue;
4048
4049 _objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,STATION,22);
4050 _objectState[1] = Object(_id, kStringSlot,kStringDefaultDescription,STATION_SLOT,COMBINABLE,0,0,0);
4051 }
4052
interact(Action verb,Object & obj1,Object & obj2)4053 bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
4054 if ((verb == ACTION_USE) && Object::combine(obj1, obj2, STATION_SLOT, MONEY) &&
4055 isSectionVisible(1)) {
4056 _gm->takeMoney(-180);
4057 _vm->renderImage(2);
4058 setSectionVisible(1, false);
4059 _gm->_state._eventTime = _gm->_time + ticksToMsec(600);
4060 _gm->_state._eventCallback = kTaxiFn;
4061 return true;
4062 }
4063 return false;
4064 }
4065
4066
Outro(SupernovaEngine * vm,GameManager1 * gm)4067 Outro::Outro(SupernovaEngine *vm, GameManager1 *gm) {
4068 _vm = vm;
4069 _gm = gm;
4070
4071 _fileNumber = -1;
4072 _id = OUTRO;
4073 _shown[0] = kShownFalse;
4074
4075 _outroText =
4076 _vm->getGameString(kStringOutro1) + '\0' +
4077 _vm->getGameString(kStringOutro2) + '\0' +
4078 _vm->getGameString(kStringOutro3) + '\0' +
4079 _vm->getGameString(kStringOutro4) + '\0' +
4080 _vm->getGameString(kStringOutro5) + '\0' +
4081 _vm->getGameString(kStringOutro6) + '\0' +
4082 _vm->getGameString(kStringOutro7) + '\0' +
4083 _vm->getGameString(kStringOutro8) + '\0' +
4084 _vm->getGameString(kStringOutro9) + '\0' +
4085 _vm->getGameString(kStringOutro10) + '\0' +
4086 _vm->getGameString(kStringOutro11) + '\0' +
4087 _vm->getGameString(kStringOutro12) + '\0' +
4088 _vm->getGameString(kStringOutro13) + '\0' +
4089 _vm->getGameString(kStringOutro14) + '\0';
4090 }
4091
onEntrance()4092 void Outro::onEntrance() {
4093 _vm->setCurrentImage(35);
4094 _vm->renderImage(0);
4095 _vm->renderImage(1);
4096 _vm->paletteFadeIn();
4097 _gm->wait(10);
4098 for (int i = 8; i <= 21; i++) {
4099 _vm->renderImage(i);
4100 _gm->wait(2);
4101 _vm->renderImage(_gm->invertSection(i));
4102 }
4103 _gm->wait(18);
4104 _vm->renderImage(_gm->invertSection(1));
4105 for (int i = 2; i <= 7; i++) {
4106 _vm->renderImage(i);
4107 _gm->wait(3);
4108 _vm->renderImage(_gm->invertSection(i));
4109 }
4110
4111 _vm->playSound(kMusicOutro);
4112 Marquee marquee(_vm->_screen, Marquee::kMarqueeOutro, _outroText.c_str());
4113 while (!_vm->shouldQuit()) {
4114 _gm->updateEvents();
4115 marquee.renderCharacter();
4116 if (_gm->_mouseClicked || _gm->_keyPressed)
4117 break;
4118 g_system->updateScreen();
4119 g_system->delayMillis(_vm->_delay);
4120 }
4121 _vm->paletteFadeOut();
4122 _vm->setCurrentImage(55);
4123 _vm->renderImage(0);
4124 _vm->paletteFadeIn();
4125 _gm->getInput();
4126 _vm->paletteFadeOut();
4127 _vm->_screen->setViewportBrightness(1);
4128
4129 Common::Event event;
4130 event.type = Common::EVENT_RTL;
4131 _vm->getEventManager()->pushEvent(event);
4132 }
4133
animation()4134 void Outro::animation() {
4135 }
4136
animate(int filenumber,int section1,int section2,int duration)4137 void Outro::animate(int filenumber, int section1, int section2, int duration) {
4138 _vm->setCurrentImage(filenumber);
4139 while (duration) {
4140 _vm->renderImage(section1);
4141 _gm->wait(2);
4142 _vm->renderImage(section2);
4143 _gm->wait(2);
4144 --duration;
4145 }
4146 }
4147
animate(int filenumber,int section1,int section2,int duration,MessagePosition position,const char * text)4148 void Outro::animate(int filenumber, int section1, int section2, int duration,
4149 MessagePosition position, const char *text) {
4150 _vm->renderMessage(text, position);
4151 int delay = (Common::strnlen(text, 512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
4152 _vm->setCurrentImage(filenumber);
4153 while (delay) {
4154 if (section1)
4155 _vm->renderImage(section1);
4156 _gm->wait(2);
4157 if (section2)
4158 _vm->renderImage(section2);
4159 _gm->wait(2);
4160 --delay;
4161 }
4162 _vm->removeMessage();
4163 }
4164
animate(int filenumber,int section1,int section2,int section3,int section4,int duration,MessagePosition position,const char * text)4165 void Outro::animate(int filenumber, int section1, int section2, int section3, int section4,
4166 int duration, MessagePosition position, const char *text) {
4167 _vm->renderMessage(text, position);
4168 if (duration == 0)
4169 duration = (Common::strnlen(text, 512) + 20) * _vm->_textSpeed / 40;
4170
4171 _vm->setCurrentImage(filenumber);
4172 while(duration) {
4173 _vm->renderImage(section1);
4174 _vm->renderImage(section3);
4175 _gm->wait(2);
4176 _vm->renderImage(section2);
4177 _vm->renderImage(section4);
4178 _gm->wait(2);
4179 duration--;
4180 }
4181 _vm->removeMessage();
4182 }
4183
4184 }
4185