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 * Additional copyright for this file:
8 * Copyright (C) 1995 Presto Studios, Inc.
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
14
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 *
24 */
25
26 #include "buried/biochip_right.h"
27 #include "buried/buried.h"
28 #include "buried/gameui.h"
29 #include "buried/graphics.h"
30 #include "buried/inventory_window.h"
31 #include "buried/resources.h"
32 #include "buried/scene_view.h"
33 #include "buried/sound.h"
34 #include "buried/environ/scene_base.h"
35 #include "buried/environ/scene_common.h"
36
37 #include "graphics/font.h"
38
39 namespace Buried {
40
41 class OvenDoor : public SceneBase {
42 public:
43 OvenDoor(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
44 int openAnimID = 0, int closeAnimID = 0, int openFrame = 0, int closedFrame = 0, int flagOffset = 0,
45 int left = 0, int top = 0, int right = 0, int bottom = 0);
46 int postExitRoom(Window *viewWindow, const Location &newLocation);
47 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
48 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
49
50 private:
51 int _openAnimationID;
52 int _closeAnimationID;
53 int _openFrame;
54 int _closedFrame;
55 int _flagOffset;
56 Common::Rect _clickableRegion;
57 };
58
OvenDoor(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation,int openAnimID,int closeAnimID,int openFrame,int closedFrame,int flagOffset,int left,int top,int right,int bottom)59 OvenDoor::OvenDoor(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
60 int openAnimID, int closeAnimID, int openFrame, int closedFrame, int flagOffset,
61 int left, int top, int right, int bottom) :
62 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
63 _openAnimationID = openAnimID;
64 _closeAnimationID = closeAnimID;
65 _openFrame = openFrame;
66 _closedFrame = closedFrame;
67 _flagOffset = flagOffset;
68 _clickableRegion = Common::Rect(left, top, right, bottom);
69
70 if (((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_flagOffset) == 1)
71 _staticData.navFrameIndex = _openFrame;
72 else
73 _staticData.navFrameIndex = _closedFrame;
74 }
75
postExitRoom(Window * viewWindow,const Location & newLocation)76 int OvenDoor::postExitRoom(Window *viewWindow, const Location &newLocation) {
77 if ((newLocation.orientation == 0 || newLocation.facing != _staticData.location.facing || newLocation.node != _staticData.location.node) && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_flagOffset) == 1) {
78 if (_staticData.location.timeZone == newLocation.timeZone)
79 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 7));
80
81 ((SceneViewWindow *)viewWindow)->setGlobalFlagByte(_flagOffset, 0);
82 }
83
84 return SC_TRUE;
85 }
86
mouseUp(Window * viewWindow,const Common::Point & pointLocation)87 int OvenDoor::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
88 if (_clickableRegion.contains(pointLocation)) {
89 if (((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_flagOffset) == 1) {
90 // Change the flag status
91 ((SceneViewWindow *)viewWindow)->setGlobalFlagByte(_flagOffset, 0);
92
93 // Play the specified animation
94 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(_closeAnimationID);
95 _staticData.navFrameIndex = _closedFrame;
96
97 return SC_TRUE;
98 } else {
99 // Change the flag status
100 ((SceneViewWindow *)viewWindow)->setGlobalFlagByte(_flagOffset, 1);
101
102 // Play the specified animation
103 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(_openAnimationID);
104 _staticData.navFrameIndex = _openFrame;
105 return SC_TRUE;
106 }
107 }
108
109 return SC_FALSE;
110 }
111
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)112 int OvenDoor::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
113 if (_clickableRegion.contains(pointLocation))
114 return kCursorFinger;
115
116 return kCursorArrow;
117 }
118
119 class KitchenUnitTurnOn : public SceneBase {
120 public:
121 KitchenUnitTurnOn(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
122 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
123 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
124
125 private:
126 Common::Rect _powerButton;
127 };
128
KitchenUnitTurnOn(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)129 KitchenUnitTurnOn::KitchenUnitTurnOn(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
130 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
131 _powerButton = Common::Rect(49, 125, 121, 147);
132 }
133
mouseUp(Window * viewWindow,const Common::Point & pointLocation)134 int KitchenUnitTurnOn::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
135 if (_powerButton.contains(pointLocation)) {
136 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
137
138 Location newLocation = _staticData.location;
139 newLocation.depth = 1;
140 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
141 return SC_TRUE;
142 }
143
144 return SC_FALSE;
145 }
146
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)147 int KitchenUnitTurnOn::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
148 if (_powerButton.contains(pointLocation))
149 return kCursorFinger;
150
151 return kCursorArrow;
152 }
153
154 class KitchenUnitTitleScreen : public SceneBase {
155 public:
156 KitchenUnitTitleScreen(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
157 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
158 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
159
160 private:
161 Common::Rect _menuButton;
162 Common::Rect _powerButton;
163 };
164
KitchenUnitTitleScreen(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)165 KitchenUnitTitleScreen::KitchenUnitTitleScreen(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
166 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
167 _menuButton = Common::Rect(49, 96, 121, 118);
168 _powerButton = Common::Rect(49, 125, 121, 147);
169 }
170
mouseUp(Window * viewWindow,const Common::Point & pointLocation)171 int KitchenUnitTitleScreen::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
172 if (_menuButton.contains(pointLocation)) {
173 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
174
175 Location newLocation = _staticData.location;
176 newLocation.depth = 2;
177 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
178 return SC_TRUE;
179 } else if (_powerButton.contains(pointLocation)) {
180 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
181
182 Location newLocation = _staticData.location;
183 newLocation.depth = 0;
184 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
185 return SC_TRUE;
186 }
187
188 return SC_FALSE;
189 }
190
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)191 int KitchenUnitTitleScreen::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
192 if (_powerButton.contains(pointLocation) || _menuButton.contains(pointLocation))
193 return kCursorFinger;
194
195 return kCursorArrow;
196 }
197
198 class KitchenUnitMainMenu : public SceneBase {
199 public:
200 KitchenUnitMainMenu(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
201 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
202 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
203
204 private:
205 Common::Rect _menuButton;
206 Common::Rect _powerButton;
207 Common::Rect _autoChef;
208 Common::Rect _shopNet;
209 Common::Rect _postBox;
210 };
211
KitchenUnitMainMenu(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)212 KitchenUnitMainMenu::KitchenUnitMainMenu(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
213 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
214 _menuButton = Common::Rect(49, 96, 121, 118);
215 _powerButton = Common::Rect(49, 125, 121, 147);
216 _autoChef = Common::Rect(159, 65, 251, 82);
217 _shopNet = Common::Rect(159, 94, 239, 111);
218 _postBox = Common::Rect(159, 123, 243, 140);
219 }
220
mouseUp(Window * viewWindow,const Common::Point & pointLocation)221 int KitchenUnitMainMenu::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
222 if (_powerButton.contains(pointLocation)) {
223 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
224
225 Location newLocation = _staticData.location;
226 newLocation.depth = 0;
227 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
228 return SC_TRUE;
229 } else if (_autoChef.contains(pointLocation)) {
230 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
231
232 Location newLocation = _staticData.location;
233 newLocation.depth = 5;
234 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
235 return SC_TRUE;
236 } else if (_shopNet.contains(pointLocation)) {
237 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
238
239 Location newLocation = _staticData.location;
240 newLocation.depth = 4;
241 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
242 return SC_TRUE;
243 } else if (_postBox.contains(pointLocation)) {
244 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
245
246 Location newLocation = _staticData.location;
247 newLocation.depth = 3;
248 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
249 return SC_TRUE;
250 }
251
252 return SC_FALSE;
253 }
254
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)255 int KitchenUnitMainMenu::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
256 if (_powerButton.contains(pointLocation) || _menuButton.contains(pointLocation)
257 || _autoChef.contains(pointLocation) || _shopNet.contains(pointLocation) || _postBox.contains(pointLocation))
258 return kCursorFinger;
259
260 return kCursorArrow;
261 }
262
263 class KitchenUnitAutoChef : public SceneBase {
264 public:
265 KitchenUnitAutoChef(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
266 ~KitchenUnitAutoChef();
267 void preDestructor();
268 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
269 int gdiPaint(Window *viewWindow);
270 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
271
272 private:
273 Common::Rect _menuButton;
274 Common::Rect _powerButton;
275 Common::Rect _autoChefButtons;
276 int _status;
277 Graphics::Font *_textFont;
278 int _lineHeight;
279 };
280
KitchenUnitAutoChef(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)281 KitchenUnitAutoChef::KitchenUnitAutoChef(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
282 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
283 _menuButton = Common::Rect(49, 96, 121, 118);
284 _powerButton = Common::Rect(49, 125, 121, 147);
285 _autoChefButtons = Common::Rect(135, 54, 273, 137);
286 _status = 0;
287 _lineHeight = (_vm->getLanguage() == Common::JA_JPN) ? 11 : 14;
288 _textFont = _vm->_gfx->createFont(_lineHeight);
289 }
290
~KitchenUnitAutoChef()291 KitchenUnitAutoChef::~KitchenUnitAutoChef() {
292 preDestructor();
293 }
294
preDestructor()295 void KitchenUnitAutoChef::preDestructor() {
296 delete _textFont;
297 _textFont = nullptr;
298 }
299
mouseUp(Window * viewWindow,const Common::Point & pointLocation)300 int KitchenUnitAutoChef::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
301 if (_menuButton.contains(pointLocation)) {
302 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
303
304 Location newLocation = _staticData.location;
305 newLocation.depth = 2;
306 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
307 return SC_TRUE;
308 } else if (_powerButton.contains(pointLocation)) {
309 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
310
311 Location newLocation = _staticData.location;
312 newLocation.depth = 0;
313 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
314 return SC_TRUE;
315 } else if (_autoChefButtons.contains(pointLocation)) {
316 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
317
318 _status = 1;
319 _staticData.navFrameIndex = 58;
320 viewWindow->invalidateWindow(false);
321 return SC_TRUE;
322 }
323
324 return SC_FALSE;
325 }
326
gdiPaint(Window * viewWindow)327 int KitchenUnitAutoChef::gdiPaint(Window *viewWindow) {
328 if (_status == 1) {
329 uint32 textColor = _vm->_gfx->getColor(144, 200, 248);
330 Common::String text = _vm->getString(IDFAKI_AC_ORDER_FOOD_TEXT);
331 Common::Rect rect = Common::Rect(80, 26, 294, 92);
332 rect.translate(64, 128);
333 _vm->_gfx->renderText(_vm->_gfx->getScreen(), _textFont, text, rect.left, rect.top, rect.width(), rect.height(), textColor, _lineHeight, kTextAlignLeft, true);
334 }
335
336 return SC_FALSE;
337 }
338
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)339 int KitchenUnitAutoChef::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
340 if (_powerButton.contains(pointLocation) || _menuButton.contains(pointLocation) || _autoChefButtons.contains(pointLocation))
341 return kCursorFinger;
342
343 return kCursorArrow;
344 }
345
346 class KitchenUnitShopNet : public SceneBase {
347 public:
348 KitchenUnitShopNet(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
349 ~KitchenUnitShopNet();
350 void preDestructor();
351 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
352 int onCharacter(Window *viewWindow, const Common::KeyState &character);
353 int gdiPaint(Window *viewWindow);
354 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
355 int preExitRoom(Window *viewWindow, const Location &priorLocation);
356
357 private:
358 int _status;
359 Common::String _shopNetCode;
360 Common::Rect _menuButton;
361 Common::Rect _powerButton;
362 Common::Rect _transmitButton;
363 Common::Rect _acceptButton;
364 Graphics::Font *_textFont;
365 Common::Rect _numberButtons[10];
366 int _lineHeight;
367 };
368
KitchenUnitShopNet(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)369 KitchenUnitShopNet::KitchenUnitShopNet(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
370 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
371 _status = 0;
372 _menuButton = Common::Rect(49, 96, 121, 118);
373 _powerButton = Common::Rect(49, 125, 121, 147);
374 _transmitButton = Common::Rect(176, 121, 259, 138);
375 _acceptButton = Common::Rect(140, 128, 293, 145);
376 _numberButtons[0] = Common::Rect(324, 105, 342, 122);
377 _numberButtons[1] = Common::Rect(0, 0, 0, 0); // Number 1 is obscured
378 _numberButtons[2] = Common::Rect(323, 4, 341, 21);
379 _numberButtons[3] = Common::Rect(303, 13, 321, 30);
380 _numberButtons[4] = Common::Rect(324, 29, 342, 46);
381 _numberButtons[5] = Common::Rect(303, 39, 321, 56);
382 _numberButtons[6] = Common::Rect(324, 54, 342, 71);
383 _numberButtons[7] = Common::Rect(303, 64, 321, 81);
384 _numberButtons[8] = Common::Rect(324, 79, 342, 96);
385 _numberButtons[9] = Common::Rect(303, 91, 321, 108);
386 _lineHeight = (_vm->getLanguage() == Common::JA_JPN) ? 10 : 14;
387 _textFont = _vm->_gfx->createFont(_lineHeight);
388 }
389
~KitchenUnitShopNet()390 KitchenUnitShopNet::~KitchenUnitShopNet() {
391 preDestructor();
392 }
393
preDestructor()394 void KitchenUnitShopNet::preDestructor() {
395 delete _textFont;
396 _textFont = nullptr;
397 }
398
mouseUp(Window * viewWindow,const Common::Point & pointLocation)399 int KitchenUnitShopNet::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
400 if (_menuButton.contains(pointLocation)) {
401 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
402
403 Location newLocation = _staticData.location;
404 newLocation.depth = 2;
405 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
406 return SC_TRUE;
407 } else if (_powerButton.contains(pointLocation)) {
408 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
409
410 Location newLocation = _staticData.location;
411 newLocation.depth = 0;
412 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
413 return SC_TRUE;
414 } else if (_transmitButton.contains(pointLocation) && _status == 1) {
415 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
416
417 if (_shopNetCode == _vm->getString(IDFAKI_SN_CHEESE_GIRL_CODE_TEXT)) {
418 _status = 3;
419 _staticData.navFrameIndex = 54;
420 } else if (_shopNetCode == _vm->getString(IDFAKI_SN_TRANSLATE_CHIP_CODE_TEXT)) {
421 _status = 2;
422 _staticData.navFrameIndex = 54;
423 } else if (_shopNetCode == _vm->getString(IDFAKI_SN_GENO_SINGLE_CODE_TEXT)) {
424 _status = 4;
425 _staticData.navFrameIndex = 54;
426 }
427
428 viewWindow->invalidateWindow();
429
430 switch (_status) {
431 case 2:
432 ((SceneViewWindow *)viewWindow)->startPlacedAsynchronousAnimation(206, 30, 84, 84, 6, true);
433 break;
434 case 3:
435 ((SceneViewWindow *)viewWindow)->startPlacedAsynchronousAnimation(206, 30, 84, 84, 7, true);
436 break;
437 case 4:
438 ((SceneViewWindow *)viewWindow)->startPlacedAsynchronousAnimation(206, 30, 84, 84, 8, true);
439 break;
440 }
441
442 return SC_TRUE;
443 } else if (_acceptButton.contains(pointLocation) && (_status >= 2 && _status <= 4)) {
444 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
445
446 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
447
448 GlobalFlags &flags = ((SceneViewWindow *)viewWindow)->getGlobalFlags();
449
450 if (flags.faKIPostBoxSlotA == _status || flags.faKIPostBoxSlotB == _status || flags.faKIPostBoxSlotC == _status) {
451 // Already in the post box
452 _status = 6;
453 _staticData.navFrameIndex = 55;
454 } else {
455 // Add this item to the end of the post box list
456 if (flags.faKIPostBoxSlotA == 0)
457 flags.faKIPostBoxSlotA = _status;
458 else if (flags.faKIPostBoxSlotB == 0)
459 flags.faKIPostBoxSlotB = _status;
460 else if (flags.faKIPostBoxSlotC == 0)
461 flags.faKIPostBoxSlotC = _status;
462
463 _status = 5;
464 _staticData.navFrameIndex = 55;
465 }
466
467 viewWindow->invalidateWindow(false);
468 return SC_TRUE;
469 }
470
471 for (int i = 0; i < 10; i++) {
472 if (_numberButtons[i].contains(pointLocation)) {
473 // Generate a key state
474 Common::KeyState state;
475 state.keycode = (Common::KeyCode)(Common::KEYCODE_0 + i);
476 state.ascii = '0' + i;
477 state.flags = 0;
478 onCharacter(viewWindow, state);
479 return SC_TRUE;
480 }
481 }
482
483 return SC_FALSE;
484 }
485
onCharacter(Window * viewWindow,const Common::KeyState & character)486 int KitchenUnitShopNet::onCharacter(Window *viewWindow, const Common::KeyState &character) {
487 if (_status == 0 && ((character.keycode >= Common::KEYCODE_0 && character.keycode <= Common::KEYCODE_9)
488 || character.keycode == Common::KEYCODE_BACKSPACE || character.keycode == Common::KEYCODE_DELETE)) {
489 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 9));
490
491 if (character.keycode == Common::KEYCODE_BACKSPACE || character.keycode == Common::KEYCODE_DELETE) {
492 if (!_shopNetCode.empty()) {
493 // clone2727 asks why the sound effect is being played again
494 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 9));
495
496 if (_shopNetCode.size() == 6 || _shopNetCode.size() == 11) {
497 _shopNetCode.deleteLastChar();
498 _shopNetCode.deleteLastChar();
499 _shopNetCode.deleteLastChar();
500 _shopNetCode.deleteLastChar();
501 } else {
502 _shopNetCode.deleteLastChar();
503 }
504
505 viewWindow->invalidateWindow(false);
506
507 // NOTE: Original returned here instead, but that resulted in a bad character
508 // being printed if the string was empty.
509 }
510
511 return SC_TRUE;
512 }
513
514 // Add the character to the code string
515 static const char *dashString = " - ";
516
517 switch (_shopNetCode.size()) {
518 case 0:
519 case 1:
520 case 6:
521 case 11:
522 case 12:
523 _shopNetCode += (char)(character.keycode - Common::KEYCODE_0 + '0');
524 break;
525 case 2:
526 case 7:
527 _shopNetCode += (char)(character.keycode - Common::KEYCODE_0 + '0');
528 _shopNetCode += dashString;
529 break;
530 case 13:
531 _shopNetCode += (char)(character.keycode - Common::KEYCODE_0 + '0');
532
533 if (_shopNetCode == _vm->getString(IDFAKI_SN_CHEESE_GIRL_CODE_TEXT)
534 || _shopNetCode == _vm->getString(IDFAKI_SN_TRANSLATE_CHIP_CODE_TEXT)
535 || _shopNetCode == _vm->getString(IDFAKI_SN_GENO_SINGLE_CODE_TEXT)) {
536 _status = 1;
537 _staticData.navFrameIndex = 53;
538 } else {
539 _shopNetCode.clear();
540 }
541 break;
542 }
543
544 viewWindow->invalidateWindow(false);
545 return SC_TRUE;
546 }
547
548 return SC_FALSE;
549 }
550
gdiPaint(Window * viewWindow)551 int KitchenUnitShopNet::gdiPaint(Window *viewWindow) {
552 uint32 textColor = _vm->_gfx->getColor(104, 40, 168);
553 Common::String text;
554 Common::Rect rect;
555 bool vtCenter = false;
556
557 switch (_status) {
558 case 0: // Entering code
559 case 1: // Valid code
560 text = _shopNetCode;
561 rect = Common::Rect(117, 71, 244, 88);
562 vtCenter = true;
563 break;
564 case 2: // Translate BioChip
565 text = _vm->getString(IDFAKI_SN_TRANSLATE_CHIP_ORDER_TEXT);
566 rect = Common::Rect(87, 33, 179, 87);
567 break;
568 case 3: // Cheese Girl
569 text = _vm->getString(IDFAKI_SN_CHEESE_GIRL_ORDER_TEXT);
570 rect = Common::Rect(87, 33, 179, 87);
571 break;
572 case 4: // Geno Environ Cartridge
573 text = _vm->getString(IDFAKI_SN_GENO_SINGLE_ORDER_TEXT);
574 rect = Common::Rect(87, 33, 179, 87);
575 break;
576 case 5: // Ordered the item successfully
577 text = _vm->getString(IDFAKI_SN_SUCCESSFUL_ORDER_TEXT);
578 rect = Common::Rect(80, 26, 294, 92);
579 break;
580 case 6: // Ordered the item unsuccessfully
581 text = _vm->getString(IDFAKI_SN_UNSUCCESSFUL_ORDER_TEXT);
582 rect = Common::Rect(80, 26, 294, 92);
583 break;
584 }
585
586 if (!text.empty()) {
587 rect.translate(64, 128);
588 _vm->_gfx->renderText(_vm->_gfx->getScreen(), _textFont, text, rect.left, rect.top, rect.width(), rect.height(), textColor, _lineHeight, kTextAlignLeft, vtCenter);
589 }
590
591 return SC_FALSE;
592 }
593
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)594 int KitchenUnitShopNet::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
595 if (_powerButton.contains(pointLocation) || _menuButton.contains(pointLocation))
596 return kCursorFinger;
597
598 if (_transmitButton.contains(pointLocation) && _status == 1)
599 return kCursorFinger;
600
601 if (_acceptButton.contains(pointLocation) && (_status >= 2 && _status <= 4))
602 return kCursorFinger;
603
604 for (int i = 0; i < 10; i++)
605 if (_numberButtons[i].contains(pointLocation))
606 return kCursorFinger;
607
608 return kCursorArrow;
609 }
610
preExitRoom(Window * viewWindow,const Location & priorLocation)611 int KitchenUnitShopNet::preExitRoom(Window *viewWindow, const Location &priorLocation) {
612 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
613 return SC_TRUE;
614 }
615
616 class KitchenUnitPostBox : public SceneBase {
617 public:
618 KitchenUnitPostBox(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
619 ~KitchenUnitPostBox();
620 void preDestructor();
621 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
622 int gdiPaint(Window *viewWindow);
623 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
624
625 private:
626 int _packageCount;
627 int _selectedPackage;
628 Common::Rect _menuButton;
629 Common::Rect _powerButton;
630 Common::Rect _items[3];
631 Common::Rect _replicateButton;
632 Graphics::Font *_textFont;
633 int _lineHeight;
634
635 void changeBackgroundBitmap();
636 };
637
KitchenUnitPostBox(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)638 KitchenUnitPostBox::KitchenUnitPostBox(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
639 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
640 _packageCount = 0;
641 _selectedPackage = -1;
642 _menuButton = Common::Rect(49, 96, 121, 118);
643 _powerButton = Common::Rect(49, 125, 121, 147);
644 _items[0] = Common::Rect(137, 62, 285, 79);
645 _items[1] = Common::Rect(137, 91, 285, 108);
646 _items[2] = Common::Rect(137, 120, 285, 137);
647 _replicateButton = Common::Rect(200, 150, 283, 167);
648
649 if (((SceneViewWindow *)viewWindow)->getGlobalFlags().faKIPostBoxSlotA != 0)
650 _packageCount++;
651 if (((SceneViewWindow *)viewWindow)->getGlobalFlags().faKIPostBoxSlotB != 0)
652 _packageCount++;
653 if (((SceneViewWindow *)viewWindow)->getGlobalFlags().faKIPostBoxSlotC != 0)
654 _packageCount++;
655
656 changeBackgroundBitmap();
657
658 _lineHeight = (_vm->getLanguage() == Common::JA_JPN) ? 10 : 14;
659 _textFont = _vm->_gfx->createFont(_lineHeight);
660 }
661
~KitchenUnitPostBox()662 KitchenUnitPostBox::~KitchenUnitPostBox() {
663 preDestructor();
664 }
665
preDestructor()666 void KitchenUnitPostBox::preDestructor() {
667 delete _textFont;
668 _textFont = nullptr;
669 }
670
mouseUp(Window * viewWindow,const Common::Point & pointLocation)671 int KitchenUnitPostBox::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
672 if (_menuButton.contains(pointLocation)) {
673 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
674
675 Location newLocation = _staticData.location;
676 newLocation.depth = 2;
677 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
678 return SC_TRUE;
679 } else if (_powerButton.contains(pointLocation)) {
680 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
681
682 Location newLocation = _staticData.location;
683 newLocation.depth = 0;
684 ((SceneViewWindow *)viewWindow)->jumpToScene(newLocation);
685 return SC_TRUE;
686 } else if (_replicateButton.contains(pointLocation) && _selectedPackage >= 0) {
687 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faKITakenPostboxItem = 0;
688 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
689
690 DestinationScene newScene;
691 newScene.destinationScene = _staticData.location;
692 newScene.transitionType = TRANSITION_VIDEO;
693 newScene.transitionStartFrame = -1;
694 newScene.transitionLength = -1;
695
696 switch (((SceneViewWindow *)viewWindow)->getGlobalFlagByte(offsetof(GlobalFlags, faKIPostBoxSlotA) + _selectedPackage)) {
697 case 2:
698 newScene.destinationScene.depth = 6;
699 newScene.transitionData = 9;
700 break;
701 case 3:
702 newScene.destinationScene.depth = 7;
703 newScene.transitionData = 10;
704 break;
705 case 4:
706 newScene.destinationScene.depth = 8;
707 newScene.transitionData = 11;
708 break;
709 }
710
711 // Remove the item from the post box
712 for (int i = _selectedPackage; i < _packageCount - 1; i++) {
713 byte nextPackage = ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(offsetof(GlobalFlags, faKIPostBoxSlotA) + i + 1);
714 ((SceneViewWindow *)viewWindow)->setGlobalFlagByte(offsetof(GlobalFlags, faKIPostBoxSlotA) + i, nextPackage);
715 }
716
717 // Reset the last entry to 0
718 ((SceneViewWindow *)viewWindow)->setGlobalFlagByte(offsetof(GlobalFlags, faKIPostBoxSlotA) + _packageCount - 1, 0);
719
720 // Move to the destination scene
721 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
722
723 return SC_TRUE;
724 }
725
726 for (int i = 0; i < _packageCount; i++) {
727 if (_items[i].contains(pointLocation)) {
728 _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 8));
729 _selectedPackage = i;
730 changeBackgroundBitmap();
731 viewWindow->invalidateWindow(false);
732 return SC_TRUE;
733 }
734 }
735
736 return SC_FALSE;
737 }
738
gdiPaint(Window * viewWindow)739 int KitchenUnitPostBox::gdiPaint(Window *viewWindow) {
740 uint32 textColor = _vm->_gfx->getColor(144, 200, 248);
741
742 for (int i = 0; i < _packageCount; i++) {
743 Common::String text;
744
745 switch (((SceneViewWindow *)viewWindow)->getGlobalFlagByte(offsetof(GlobalFlags, faKIPostBoxSlotA) + i)) {
746 case 2:
747 text = _vm->getString(IDFAKI_SN_TRANSLATE_CHIP_CODE_TITLE);
748 break;
749 case 3:
750 text = _vm->getString(IDFAKI_SN_CHEESE_GIRL_CODE_TITLE);
751 break;
752 case 4:
753 text = _vm->getString(IDFAKI_SN_GENO_SINGLE_CODE_TITLE);
754 break;
755 }
756
757 Common::Rect rect(_items[i]);
758 rect.translate(64, 128);
759 _vm->_gfx->renderText(_vm->_gfx->getScreen(), _textFont, text, rect.left, rect.top, rect.width(), rect.height(), textColor, _lineHeight, kTextAlignCenter, true);
760 }
761
762 return SC_FALSE;
763 }
764
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)765 int KitchenUnitPostBox::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
766 if (_powerButton.contains(pointLocation) || _menuButton.contains(pointLocation))
767 return kCursorFinger;
768
769 if (_items[0].contains(pointLocation) && _packageCount >= 0)
770 return kCursorFinger;
771
772 if (_items[1].contains(pointLocation) && _packageCount >= 1)
773 return kCursorFinger;
774
775 if (_items[2].contains(pointLocation) && _packageCount >= 2)
776 return kCursorFinger;
777
778 if (_replicateButton.contains(pointLocation) && _selectedPackage >= 0)
779 return kCursorFinger;
780
781 return kCursorArrow;
782 }
783
changeBackgroundBitmap()784 void KitchenUnitPostBox::changeBackgroundBitmap() {
785 switch (_packageCount) {
786 case 0:
787 _staticData.navFrameIndex = 41;
788 break;
789 case 1:
790 switch (_selectedPackage) {
791 case -1:
792 _staticData.navFrameIndex = 42;
793 break;
794 case 0:
795 _staticData.navFrameIndex = 45;
796 break;
797 }
798 break;
799 case 2:
800 switch (_selectedPackage) {
801 case -1:
802 _staticData.navFrameIndex = 43;
803 break;
804 case 0:
805 _staticData.navFrameIndex = 46;
806 break;
807 case 1:
808 _staticData.navFrameIndex = 48;
809 break;
810 }
811 break;
812 case 3:
813 switch (_selectedPackage) {
814 case -1:
815 _staticData.navFrameIndex = 44;
816 break;
817 case 0:
818 _staticData.navFrameIndex = 47;
819 break;
820 case 1:
821 _staticData.navFrameIndex = 49;
822 break;
823 case 2:
824 _staticData.navFrameIndex = 50;
825 break;
826 }
827 break;
828 }
829 }
830
831 class EnvironSystemControls : public SceneBase {
832 public:
833 EnvironSystemControls(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
834 int postEnterRoom(Window *viewWindow, const Location &priorLocation);
835 int preExitRoom(Window *viewWindow, const Location &newLocation);
836 int mouseDown(Window *viewWindow, const Common::Point &pointLocation);
837 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
838 int draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags);
839 int droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags);
840 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
841
842 private:
843 Common::Rect _environCart;
844 Common::Rect _environButton;
845 Common::Rect _allSatButton;
846 };
847
EnvironSystemControls(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)848 EnvironSystemControls::EnvironSystemControls(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
849 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
850 _environCart = Common::Rect(176, 70, 256, 136);
851 _environButton = Common::Rect(102, 85, 152, 143);
852 _allSatButton = Common::Rect(278, 85, 326, 143);
853 }
854
postEnterRoom(Window * viewWindow,const Location & priorLocation)855 int EnvironSystemControls::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
856 switch (((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge) {
857 case 0: // No cartridge inserted
858 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(11);
859 _staticData.navFrameIndex = 57;
860 break;
861 case 1: // Geno single inserted
862 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(7);
863 _staticData.navFrameIndex = 59;
864 break;
865 case 2: // Agent 3's cartridge inserted
866 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(9);
867 _staticData.navFrameIndex = 56;
868 break;
869 }
870
871 return SC_TRUE;
872 }
873
preExitRoom(Window * viewWindow,const Location & newLocation)874 int EnvironSystemControls::preExitRoom(Window *viewWindow, const Location &newLocation) {
875 _staticData.navFrameIndex = 50;
876
877 switch (((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge) {
878 case 0: // No cartridge inserted
879 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(12);
880 break;
881 case 1: // Geno single inserted
882 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(8);
883 _staticData.navFrameIndex = 59;
884 break;
885 case 2: // Agent 3's cartridge inserted
886 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(10);
887 _staticData.navFrameIndex = 56;
888 break;
889 }
890
891 return SC_TRUE;
892 }
893
mouseDown(Window * viewWindow,const Common::Point & pointLocation)894 int EnvironSystemControls::mouseDown(Window *viewWindow, const Common::Point &pointLocation) {
895 if (_environCart.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge > 0) {
896 int itemID = 0;
897 switch (((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge) {
898 case 1:
899 itemID = kItemGenoSingleCart;
900 break;
901 case 2:
902 itemID = kItemEnvironCart;
903 break;
904 case 3:
905 itemID = kItemClassicGamesCart; // Alas, the only time this is used in the code
906 break;
907 }
908
909 // Reset the flag and change the frame index
910 _staticData.navFrameIndex = 57;
911 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge = 0;
912
913 // Start dragging
914 Common::Point ptInventoryWindow = viewWindow->convertPointToGlobal(pointLocation);
915 ptInventoryWindow = ((GameUIWindow *)viewWindow->getParent())->_inventoryWindow->convertPointToLocal(ptInventoryWindow);
916 ((GameUIWindow *)viewWindow->getParent())->_inventoryWindow->startDraggingNewItem(itemID, ptInventoryWindow);
917 return SC_TRUE;
918 }
919
920 return SC_FALSE;
921 }
922
mouseUp(Window * viewWindow,const Common::Point & pointLocation)923 int EnvironSystemControls::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
924 DestinationScene newScene;
925 newScene.destinationScene = _staticData.location;
926 newScene.destinationScene.depth = 1;
927 newScene.transitionType = TRANSITION_VIDEO;
928 newScene.transitionData = 2;
929 newScene.transitionStartFrame = -1;
930 newScene.transitionLength = -1;
931
932 // If there is something in the slot, return here
933 if (_environCart.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge > 0)
934 return SC_FALSE;
935
936 if (_environButton.contains(pointLocation)) {
937 switch (((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge) {
938 case 0:
939 newScene.destinationScene.depth = 3;
940 newScene.transitionData = 16;
941 break;
942 case 1:
943 newScene.destinationScene.depth = 4;
944 newScene.transitionData = 16;
945 break;
946 case 2:
947 newScene.destinationScene.depth = 5;
948 newScene.transitionData = 16;
949 break;
950 }
951 } else if (_allSatButton.contains(pointLocation)) {
952 newScene.destinationScene.depth = 7;
953 newScene.transitionData = 16;
954 }
955
956 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
957 return SC_TRUE;
958 }
959
draggingItem(Window * viewWindow,int itemID,const Common::Point & pointLocation,int itemFlags)960 int EnvironSystemControls::draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
961 if ((itemID == kItemGenoSingleCart || itemID == kItemEnvironCart || itemID == kItemClassicGamesCart) &&
962 _environCart.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge == 0)
963 return 1;
964
965 return 0;
966 }
967
droppedItem(Window * viewWindow,int itemID,const Common::Point & pointLocation,int itemFlags)968 int EnvironSystemControls::droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
969 if (pointLocation.x == -1 && pointLocation.y == -1)
970 return SIC_REJECT;
971
972 if ((itemID == kItemGenoSingleCart || itemID == kItemEnvironCart || itemID == kItemClassicGamesCart) &&
973 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge == 0) {
974 switch (itemID) {
975 case kItemGenoSingleCart: {
976 _staticData.navFrameIndex = 59;
977 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge = 1;
978 viewWindow->invalidateWindow(false);
979 DestinationScene newScene;
980 newScene.destinationScene = _staticData.location;
981 newScene.destinationScene.depth = 4;
982 newScene.transitionType = TRANSITION_VIDEO;
983 newScene.transitionData = 16;
984 newScene.transitionStartFrame = -1;
985 newScene.transitionLength = -1;
986 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
987 return SIC_ACCEPT;
988 }
989 case kItemEnvironCart: {
990 _staticData.navFrameIndex = 56;
991 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge = 2;
992 viewWindow->invalidateWindow(false);
993 DestinationScene newScene;
994 newScene.destinationScene = _staticData.location;
995 newScene.destinationScene.depth = 5;
996 newScene.transitionType = TRANSITION_VIDEO;
997 newScene.transitionData = 16;
998 newScene.transitionStartFrame = -1;
999 newScene.transitionLength = -1;
1000 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1001 return SIC_ACCEPT;
1002 }
1003 }
1004
1005 viewWindow->invalidateWindow(false);
1006 return SIC_ACCEPT;
1007 }
1008
1009 return SIC_REJECT;
1010 }
1011
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1012 int EnvironSystemControls::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1013 if (_environCart.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlags().faERCurrentCartridge > 0)
1014 return kCursorOpenHand;
1015
1016 if (_environButton.contains(pointLocation) || _allSatButton.contains(pointLocation))
1017 return kCursorFinger;
1018
1019 return kCursorPutDown;
1020 }
1021
1022 class EnvironGenoVideo : public SceneBase {
1023 public:
1024 EnvironGenoVideo(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1025 int postEnterRoom(Window *viewWindow, const Location &priorLocation);
1026 int preExitRoom(Window *viewWindow, const Location &newLocation);
1027 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1028 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1029
1030 private:
1031 Common::Rect _returnRegion;
1032 };
1033
EnvironGenoVideo(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1034 EnvironGenoVideo::EnvironGenoVideo(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1035 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1036 _returnRegion = Common::Rect(136, 150, 292, 189);
1037 }
1038
postEnterRoom(Window * viewWindow,const Location & priorLocation)1039 int EnvironGenoVideo::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
1040 _vm->_sound->stop();
1041 ((SceneViewWindow *)viewWindow)->startAsynchronousAnimation(13, false);
1042 return SC_TRUE;
1043 }
1044
preExitRoom(Window * viewWindow,const Location & newLocation)1045 int EnvironGenoVideo::preExitRoom(Window *viewWindow, const Location &newLocation) {
1046 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
1047 _vm->_sound->restart();
1048 return SC_TRUE;
1049 }
1050
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1051 int EnvironGenoVideo::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1052 if (_returnRegion.contains(pointLocation)) {
1053 DestinationScene newScene;
1054 newScene.destinationScene = _staticData.location;
1055 newScene.destinationScene.depth = 1;
1056 newScene.transitionType = TRANSITION_VIDEO;
1057 newScene.transitionData = 4;
1058 newScene.transitionStartFrame = -1;
1059 newScene.transitionLength = -1;
1060 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1061 return SC_TRUE;
1062 }
1063
1064 return SC_FALSE;
1065 }
1066
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1067 int EnvironGenoVideo::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1068 if (_returnRegion.contains(pointLocation))
1069 return kCursorFinger;
1070
1071 return kCursorArrow;
1072 }
1073
1074 class FlagChangeBackground : public SceneBase {
1075 public:
1076 FlagChangeBackground(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
1077 int flagOffset = -1, byte minFlagValue = 1, int newStillFrame = 0);
1078 };
1079
FlagChangeBackground(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation,int flagOffset,byte minFlagValue,int newStillFrame)1080 FlagChangeBackground::FlagChangeBackground(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
1081 int flagOffset, byte minFlagValue, int newStillFrame) :
1082 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1083 if (flagOffset >= 0 && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(flagOffset) >= minFlagValue)
1084 _staticData.navFrameIndex = newStillFrame;
1085 }
1086
1087 class ClickZoomInTopOfBookshelf : public SceneBase {
1088 public:
1089 ClickZoomInTopOfBookshelf(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1090 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1091 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1092
1093 private:
1094 Common::Rect _awardZoom, _bookZoom;
1095 };
1096
ClickZoomInTopOfBookshelf(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1097 ClickZoomInTopOfBookshelf::ClickZoomInTopOfBookshelf(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1098 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1099 _awardZoom = Common::Rect(66, 20, 168, 64);
1100 _bookZoom = Common::Rect(206, 0, 370, 84);
1101 }
1102
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1103 int ClickZoomInTopOfBookshelf::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1104 if (_awardZoom.contains(pointLocation)) {
1105 DestinationScene newScene;
1106 newScene.destinationScene = _staticData.location;
1107 newScene.destinationScene.depth = 1;
1108 newScene.transitionType = TRANSITION_VIDEO;
1109 newScene.transitionData = 9;
1110 newScene.transitionStartFrame = -1;
1111 newScene.transitionLength = -1;
1112 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1113 return SC_TRUE;
1114 }
1115
1116 if (_bookZoom.contains(pointLocation)) {
1117 DestinationScene newScene;
1118 newScene.destinationScene = _staticData.location;
1119 newScene.destinationScene.depth = 2;
1120 newScene.transitionType = TRANSITION_VIDEO;
1121 newScene.transitionData = 11;
1122 newScene.transitionStartFrame = -1;
1123 newScene.transitionLength = -1;
1124 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1125 return SC_TRUE;
1126 }
1127
1128 return SC_FALSE;
1129 }
1130
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1131 int ClickZoomInTopOfBookshelf::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1132 if (_awardZoom.contains(pointLocation) || _bookZoom.contains(pointLocation))
1133 return kCursorMagnifyingGlass;
1134
1135 return kCursorArrow;
1136 }
1137
1138 class ClickZoomToyShelf : public SceneBase {
1139 public:
1140 ClickZoomToyShelf(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1141
1142 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1143 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1144
1145 private:
1146 Common::Rect _toyZooms[4];
1147 };
1148
ClickZoomToyShelf(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1149 ClickZoomToyShelf::ClickZoomToyShelf(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) : SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1150 _toyZooms[0] = Common::Rect(102, 8, 170, 108);
1151 _toyZooms[1] = Common::Rect(188, 24, 228, 108);
1152 _toyZooms[2] = Common::Rect(282, 24, 330, 108);
1153 _toyZooms[3] = Common::Rect(330, 28, 366, 108);
1154 }
1155
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1156 int ClickZoomToyShelf::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1157 for (int i = 0; i < 4; i++) {
1158 if (_toyZooms[i].contains(pointLocation)) {
1159 DestinationScene newScene;
1160 newScene.destinationScene = _staticData.location;
1161 newScene.destinationScene.depth = i + 1;
1162 newScene.transitionType = TRANSITION_VIDEO;
1163 newScene.transitionStartFrame = -1;
1164 newScene.transitionLength = -1;
1165
1166 static const int transitionData[4] = { 13, 16, 19, 22 };
1167 newScene.transitionData = transitionData[i];
1168
1169 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1170
1171 return SC_TRUE;
1172 }
1173 }
1174
1175 return SC_FALSE;
1176 }
1177
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1178 int ClickZoomToyShelf::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1179 for (int i = 0; i < 4; i++)
1180 if (_toyZooms[i].contains(pointLocation))
1181 return kCursorMagnifyingGlass;
1182
1183 return kCursorArrow;
1184 }
1185
1186 class ToyClick : public SceneBase {
1187 public:
1188 ToyClick(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
1189 int left = -1, int top = -1, int right = -1, int bottom = -1, int returnDepth = -1, int clickAnimation = -1, int returnAnimation = -1);
1190
1191 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1192 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1193
1194 private:
1195 Common::Rect _clickRect;
1196 int _returnDepth;
1197 int _clickAnimation;
1198 int _returnAnimation;
1199 };
1200
ToyClick(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation,int left,int top,int right,int bottom,int returnDepth,int clickAnimation,int returnAnimation)1201 ToyClick::ToyClick(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
1202 int left, int top, int right, int bottom, int returnDepth, int clickAnimation, int returnAnimation) :
1203 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1204 _clickRect = Common::Rect(left, top, right, bottom);
1205 _returnDepth = returnDepth;
1206 _clickAnimation = clickAnimation;
1207 _returnAnimation = returnAnimation;
1208 }
1209
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1210 int ToyClick::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1211 if (_clickRect.contains(pointLocation)) {
1212 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(_clickAnimation);
1213
1214 if (_clickAnimation == 17) {
1215 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faHeardAgentFigure = 1;
1216
1217 if (((SceneViewWindow *)viewWindow)->getGlobalFlags().generalWalkthroughMode == 1 && !((GameUIWindow *)viewWindow->getParent())->_inventoryWindow->isItemInInventory(kItemBioChipAI))
1218 ((SceneViewWindow *)viewWindow)->displayLiveText(_vm->getString(IDS_WM_AI_LAB_TEXT));
1219 }
1220
1221 return SC_TRUE;
1222 }
1223
1224 DestinationScene newScene;
1225 newScene.destinationScene = _staticData.location;
1226 newScene.destinationScene.depth = _returnDepth;
1227 newScene.transitionType = TRANSITION_VIDEO;
1228 newScene.transitionData = _returnAnimation;
1229 newScene.transitionStartFrame = -1;
1230 newScene.transitionLength = -1;
1231 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1232
1233 return SC_TRUE;
1234 }
1235
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1236 int ToyClick::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1237 if (_clickRect.contains(pointLocation))
1238 return kCursorFinger;
1239
1240 return kCursorPutDown;
1241 }
1242
1243 class ClickOnCoffeeTable : public SceneBase {
1244 public:
1245 ClickOnCoffeeTable(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1246 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1247 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1248
1249 private:
1250 Common::Rect _toyClickRect;
1251 Common::Rect _tazClickRect;
1252 };
1253
ClickOnCoffeeTable(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1254 ClickOnCoffeeTable::ClickOnCoffeeTable(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1255 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1256 _toyClickRect = Common::Rect(242, 56, 358, 138);
1257 _tazClickRect = Common::Rect(174, 0, 234, 56);
1258 }
1259
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1260 int ClickOnCoffeeTable::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1261 if (_toyClickRect.contains(pointLocation)) {
1262 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(31);
1263 return SC_TRUE;
1264 }
1265
1266 if (_tazClickRect.contains(pointLocation)) {
1267 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(26);
1268 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faMNTazClicked = 1;
1269
1270 if (((GameUIWindow *)viewWindow->getParent())->_inventoryWindow->isItemInInventory(kItemBioChipAI))
1271 ((SceneViewWindow *)viewWindow)->playAIComment(_staticData.location, AI_COMMENT_TYPE_SPONTANEOUS);
1272
1273 ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow->sceneChanged();
1274 return SC_TRUE;
1275 }
1276
1277 DestinationScene newScene;
1278 newScene.destinationScene = _staticData.location;
1279 newScene.destinationScene.depth = 0;
1280 newScene.transitionType = TRANSITION_VIDEO;
1281 newScene.transitionData = 32;
1282 newScene.transitionStartFrame = -1;
1283 newScene.transitionLength = -1;
1284 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1285 return SC_TRUE;
1286 }
1287
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1288 int ClickOnCoffeeTable::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1289 if (_toyClickRect.contains(pointLocation) || _tazClickRect.contains(pointLocation))
1290 return kCursorFinger;
1291
1292 return kCursorPutDown;
1293 }
1294
1295 class ClickZoomInBottomOfBookshelf : public SceneBase {
1296 public:
1297 ClickZoomInBottomOfBookshelf(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1298 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1299 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1300
1301 private:
1302 Common::Rect _leftClocks;
1303 Common::Rect _rightClocks;
1304 };
1305
ClickZoomInBottomOfBookshelf(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1306 ClickZoomInBottomOfBookshelf::ClickZoomInBottomOfBookshelf(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1307 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1308 _leftClocks = Common::Rect(72, 32, 186, 110);
1309 _rightClocks = Common::Rect(194, 10, 370, 100);
1310 }
1311
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1312 int ClickZoomInBottomOfBookshelf::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1313 if (_leftClocks.contains(pointLocation)) {
1314 DestinationScene newScene;
1315 newScene.destinationScene = _staticData.location;
1316 newScene.destinationScene.depth = 1;
1317 newScene.transitionType = TRANSITION_VIDEO;
1318 newScene.transitionData = 7;
1319 newScene.transitionStartFrame = -1;
1320 newScene.transitionLength = -1;
1321 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1322 return SC_TRUE;
1323 }
1324
1325 if (_rightClocks.contains(pointLocation)) {
1326 DestinationScene newScene;
1327 newScene.destinationScene = _staticData.location;
1328 newScene.destinationScene.depth = 2;
1329 newScene.transitionType = TRANSITION_VIDEO;
1330 newScene.transitionData = 3;
1331 newScene.transitionStartFrame = -1;
1332 newScene.transitionLength = -1;
1333 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1334 return SC_TRUE;
1335 }
1336
1337 return SC_FALSE;
1338 }
1339
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1340 int ClickZoomInBottomOfBookshelf::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1341 if (_leftClocks.contains(pointLocation) || _rightClocks.contains(pointLocation))
1342 return kCursorMagnifyingGlass;
1343
1344 return kCursorArrow;
1345 }
1346
1347 class RightClockShelf : public SceneBase {
1348 public:
1349 RightClockShelf(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1350 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1351 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1352
1353 private:
1354 Common::Rect _alienClock;
1355 Common::Rect _alarmClock;
1356 Common::Rect _pendulum;
1357 };
1358
RightClockShelf(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1359 RightClockShelf::RightClockShelf(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1360 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1361 _alienClock = Common::Rect(0, 152, 80, 189);
1362 _alarmClock = Common::Rect(82, 102, 148, 189);
1363 _pendulum = Common::Rect(274, 0, 384, 189);
1364 }
1365
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1366 int RightClockShelf::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1367 if (_alienClock.contains(pointLocation)) {
1368 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(4);
1369 return SC_TRUE;
1370 }
1371
1372 if (_alarmClock.contains(pointLocation)) {
1373 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(2);
1374 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faMNClockClicked = 1;
1375
1376 if (((GameUIWindow *)viewWindow->getParent())->_inventoryWindow->isItemInInventory(kItemBioChipAI))
1377 ((SceneViewWindow *)viewWindow)->playAIComment(_staticData.location, AI_COMMENT_TYPE_SPONTANEOUS);
1378
1379 ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow->sceneChanged();
1380 return SC_TRUE;
1381 }
1382
1383 if (_pendulum.contains(pointLocation)) {
1384 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(5);
1385 return SC_TRUE;
1386 }
1387
1388 DestinationScene newScene;
1389 newScene.destinationScene = _staticData.location;
1390 newScene.destinationScene.depth = 0;
1391 newScene.transitionType = TRANSITION_VIDEO;
1392 newScene.transitionData = 6;
1393 newScene.transitionStartFrame = -1;
1394 newScene.transitionLength = -1;
1395 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1396 return SC_TRUE;
1397 }
1398
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1399 int RightClockShelf::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1400 if (_alienClock.contains(pointLocation) || _alarmClock.contains(pointLocation) || _pendulum.contains(pointLocation))
1401 return kCursorFinger;
1402
1403 return kCursorPutDown;
1404 }
1405
1406 class MainDeskView : public SceneBase {
1407 public:
1408 MainDeskView(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1409 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1410 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1411
1412 private:
1413 Common::Rect _papers;
1414 Common::Rect _terminal;
1415 Common::Rect _vidPhone;
1416 Common::Rect _deskLight;
1417 };
1418
MainDeskView(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1419 MainDeskView::MainDeskView(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1420 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1421 _papers = Common::Rect(38, 126, 132, 154);
1422 _terminal = Common::Rect(138, 118, 274, 166);
1423 _vidPhone = Common::Rect(334, 46, 418, 142);
1424 _deskLight = Common::Rect(20, 62, 82, 122);
1425 }
1426
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1427 int MainDeskView::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1428 if (_papers.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlags().generalWalkthroughMode == 0) {
1429 DestinationScene newScene;
1430 newScene.destinationScene = _staticData.location;
1431 newScene.destinationScene.depth = 2;
1432 newScene.transitionType = TRANSITION_VIDEO;
1433 newScene.transitionData = 40;
1434 newScene.transitionStartFrame = -1;
1435 newScene.transitionLength = -1;
1436 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1437 return SC_TRUE;
1438 }
1439
1440 if (_terminal.contains(pointLocation)) {
1441 // Play the terminal access movie
1442 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(44);
1443 return SC_TRUE;
1444 }
1445
1446 if (_vidPhone.contains(pointLocation)) {
1447 // Move to the vidphone
1448 DestinationScene newScene;
1449 newScene.destinationScene = _staticData.location;
1450 newScene.destinationScene.depth = 3;
1451 newScene.transitionType = TRANSITION_VIDEO;
1452 newScene.transitionData = 42;
1453 newScene.transitionStartFrame = -1;
1454 newScene.transitionLength = -1;
1455 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1456 return SC_TRUE;
1457 }
1458
1459 if (_deskLight.contains(pointLocation)) {
1460 // Play the desk light animation
1461 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(39);
1462 return SC_TRUE;
1463 }
1464
1465 DestinationScene newScene;
1466 newScene.destinationScene = _staticData.location;
1467 newScene.destinationScene.depth = 0;
1468 newScene.transitionType = TRANSITION_VIDEO;
1469 newScene.transitionData = 45;
1470 newScene.transitionStartFrame = -1;
1471 newScene.transitionLength = -1;
1472 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1473 return SC_TRUE;
1474 }
1475
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1476 int MainDeskView::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1477 if (_papers.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlags().generalWalkthroughMode == 0)
1478 return kCursorMagnifyingGlass;
1479
1480 if (_terminal.contains(pointLocation) || _deskLight.contains(pointLocation))
1481 return kCursorFinger;
1482
1483 if (_vidPhone.contains(pointLocation))
1484 return kCursorMagnifyingGlass;
1485
1486 return kCursorPutDown;
1487 }
1488
1489 class ViewVidPhone : public SceneBase {
1490 public:
1491 ViewVidPhone(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1492 int postEnterRoom(Window *viewWindow, const Location &priorLocation);
1493 int preExitRoom(Window *viewWindow, const Location &newLocation);
1494 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1495 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1496 int movieCallback(Window *viewWindow, VideoWindow *movie, int animationID, int status);
1497
1498 private:
1499 Common::Rect _playButton;
1500 Common::Rect _pauseButton;
1501 Common::Rect _prevButton;
1502 bool _playingMovie;
1503 int _curMovie;
1504 };
1505
ViewVidPhone(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1506 ViewVidPhone::ViewVidPhone(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1507 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1508 _playButton = Common::Rect(102, 22, 120, 40);
1509 _pauseButton = Common::Rect(98, 49, 112, 63);
1510 _prevButton = Common::Rect(91, 81, 105, 95);
1511 _playingMovie = false;
1512 _curMovie = -1;
1513 }
1514
postEnterRoom(Window * viewWindow,const Location & priorLocation)1515 int ViewVidPhone::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
1516 // Play messages sound effect here
1517 _vm->_sound->playSoundEffect("BITDATA/FUTAPT/FAMN_ANS.BTA");
1518 return SC_TRUE;
1519 }
1520
preExitRoom(Window * viewWindow,const Location & newLocation)1521 int ViewVidPhone::preExitRoom(Window *viewWindow, const Location &newLocation) {
1522 if (_playingMovie) {
1523 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
1524 _playingMovie = false;
1525 _vm->_sound->restart();
1526 }
1527
1528 return SC_TRUE;
1529 }
1530
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1531 int ViewVidPhone::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1532 if (_playButton.contains(pointLocation)) {
1533 if (_curMovie == 0) {
1534 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
1535 _vm->_sound->restart();
1536 _curMovie = -1;
1537 } else {
1538 if (_playingMovie)
1539 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
1540
1541 _curMovie = 0;
1542 _vm->_sound->stop();
1543 ((SceneViewWindow *)viewWindow)->startAsynchronousAnimation(33, false);
1544 _playingMovie = true;
1545 }
1546
1547 return SC_TRUE;
1548 }
1549
1550 if (_pauseButton.contains(pointLocation)) {
1551 if (_curMovie == 1) {
1552 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
1553 _vm->_sound->restart();
1554 _curMovie = -1;
1555 } else {
1556 if (_playingMovie)
1557 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
1558
1559 _curMovie = 1;
1560 _vm->_sound->stop();
1561 ((SceneViewWindow *)viewWindow)->startAsynchronousAnimation(34, false);
1562 _playingMovie = true;
1563 }
1564
1565 return SC_TRUE;
1566 }
1567
1568 if (_prevButton.contains(pointLocation)) {
1569 if (_curMovie == 2) {
1570 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
1571 _vm->_sound->restart();
1572 _curMovie = -1;
1573 } else {
1574 if (_playingMovie)
1575 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
1576
1577 _curMovie = 2;
1578 _vm->_sound->stop();
1579 ((SceneViewWindow *)viewWindow)->startAsynchronousAnimation(35, false);
1580 _playingMovie = true;
1581 }
1582
1583 return SC_TRUE;
1584 }
1585
1586 if (_playingMovie)
1587 ((SceneViewWindow *)viewWindow)->stopAsynchronousAnimation();
1588
1589 _playingMovie = false;
1590 _vm->_sound->restart();
1591
1592 DestinationScene newScene;
1593 newScene.destinationScene = _staticData.location;
1594 newScene.destinationScene.depth = 1;
1595 newScene.transitionType = TRANSITION_VIDEO;
1596 newScene.transitionData = 43;
1597 newScene.transitionStartFrame = -1;
1598 newScene.transitionLength = -1;
1599 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1600 return SC_TRUE;
1601 }
1602
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1603 int ViewVidPhone::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1604 if (_playButton.contains(pointLocation) || _pauseButton.contains(pointLocation) || _prevButton.contains(pointLocation))
1605 return kCursorFinger;
1606
1607 return kCursorPutDown;
1608 }
1609
movieCallback(Window * viewWindow,VideoWindow * movie,int animationID,int status)1610 int ViewVidPhone::movieCallback(Window *viewWindow, VideoWindow *movie, int animationID, int status) {
1611 if (animationID == -1 && status == MOVIE_STOPPED) {
1612 _vm->_sound->restart();
1613 _playingMovie = false;
1614 _curMovie = -1;
1615 }
1616
1617 return SC_TRUE;
1618 }
1619
1620 class MainEnvironDoorDown : public SceneBase {
1621 public:
1622 MainEnvironDoorDown(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1623 int postEnterRoom(Window *viewWindow, const Location &priorLocation);
1624 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1625 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1626
1627 private:
1628 bool _doorOpen;
1629 Common::Rect _doorRect;
1630 };
1631
MainEnvironDoorDown(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1632 MainEnvironDoorDown::MainEnvironDoorDown(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1633 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1634 _doorOpen = false;
1635
1636 if (priorLocation.timeZone == _staticData.location.timeZone &&
1637 priorLocation.environment == _staticData.location.environment &&
1638 priorLocation.node == _staticData.location.node &&
1639 priorLocation.facing == _staticData.location.facing &&
1640 priorLocation.orientation == 1) {
1641 if (((SceneViewWindow *)viewWindow)->getGlobalFlags().faMNEnvironDoor == 1) {
1642 _doorOpen = true;
1643 _staticData.navFrameIndex = 220;
1644 }
1645 } else {
1646 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faMNEnvironDoor = 0;
1647 }
1648
1649 _doorRect = Common::Rect(0, 0, 432, 189);
1650 }
1651
postEnterRoom(Window * viewWindow,const Location & priorLocation)1652 int MainEnvironDoorDown::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
1653 // Play the door open movie
1654 DestinationScene newScene;
1655 newScene.destinationScene = _staticData.location;
1656 newScene.destinationScene.depth = 1;
1657 newScene.transitionType = TRANSITION_VIDEO;
1658 newScene.transitionData = 0;
1659 newScene.transitionStartFrame = -1;
1660 newScene.transitionLength = -1;
1661 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1662 return SC_FALSE;
1663 }
1664
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1665 int MainEnvironDoorDown::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1666 if (_doorRect.contains(pointLocation)) {
1667 _staticData.navFrameIndex = 220;
1668 _doorOpen = true;
1669 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faMNEnvironDoor = 1;
1670
1671 // Play the door open movie
1672 DestinationScene newScene;
1673 newScene.destinationScene = _staticData.location;
1674 newScene.destinationScene.depth = 1;
1675 newScene.transitionType = TRANSITION_VIDEO;
1676 newScene.transitionData = 0;
1677 newScene.transitionStartFrame = -1;
1678 newScene.transitionLength = -1;
1679 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1680
1681 return SC_TRUE;
1682 }
1683
1684 return SC_FALSE;
1685 }
1686
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1687 int MainEnvironDoorDown::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1688 if (_doorRect.contains(pointLocation))
1689 return kCursorFinger;
1690
1691 return kCursorPutDown;
1692 }
1693
1694 class MainEnvironDoorExit : public SceneBase {
1695 public:
1696 MainEnvironDoorExit(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1697 int postEnterRoom(Window *viewWindow, const Location &priorLocation);
1698 };
1699
MainEnvironDoorExit(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1700 MainEnvironDoorExit::MainEnvironDoorExit(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1701 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1702 }
1703
postEnterRoom(Window * viewWindow,const Location & priorLocation)1704 int MainEnvironDoorExit::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
1705 // Play the door open movie
1706 DestinationScene newScene;
1707 newScene.destinationScene = _staticData.location;
1708 newScene.destinationScene.depth = 1;
1709 newScene.transitionType = TRANSITION_VIDEO;
1710 newScene.transitionData = 14;
1711 newScene.transitionStartFrame = -1;
1712 newScene.transitionLength = -1;
1713 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1714 return SC_FALSE;
1715 }
1716
1717 class ClickOnBooks : public SceneBase {
1718 public:
1719 ClickOnBooks(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
1720 int left = -1, int top = -1, int right = -1, int bottom = -1, int cursorID = 0,
1721 int timeZone = -1, int environment = -1, int node = -1, int facing = -1, int orientation = -1, int depth = -1,
1722 int transitionType = -1, int transitionData = -1, int transitionStartFrame = -1, int transitionLength = -1,
1723 int soundFileNameID = -1, int soundLeft = -1, int soundTop = -1, int soundRight = -1, int soundBottom = -1);
1724 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1725 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1726
1727 private:
1728 int _cursorID;
1729 Common::Rect _clickRegion;
1730 DestinationScene _clickDestination;
1731 int _soundFileNameID;
1732 Common::Rect _soundRegion;
1733 };
1734
ClickOnBooks(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation,int left,int top,int right,int bottom,int cursorID,int timeZone,int environment,int node,int facing,int orientation,int depth,int transitionType,int transitionData,int transitionStartFrame,int transitionLength,int soundFileNameID,int soundLeft,int soundTop,int soundRight,int soundBottom)1735 ClickOnBooks::ClickOnBooks(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
1736 int left, int top, int right, int bottom, int cursorID,
1737 int timeZone, int environment, int node, int facing, int orientation, int depth,
1738 int transitionType, int transitionData, int transitionStartFrame, int transitionLength,
1739 int soundFileNameID, int soundLeft, int soundTop, int soundRight, int soundBottom) :
1740 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1741 _clickRegion = Common::Rect(left, top, right, bottom);
1742 _cursorID = cursorID;
1743 _clickDestination.destinationScene = Location(timeZone, environment, node, facing, orientation, depth);
1744 _clickDestination.transitionType = transitionType;
1745 _clickDestination.transitionData = transitionData;
1746 _clickDestination.transitionStartFrame = transitionStartFrame;
1747 _clickDestination.transitionLength = transitionLength;
1748 _soundFileNameID = soundFileNameID;
1749 _soundRegion = Common::Rect(soundLeft, soundTop, soundRight, soundBottom);
1750 }
1751
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1752 int ClickOnBooks::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1753 if (_soundRegion.contains(pointLocation)) {
1754 _vm->_sound->playSynchronousSoundEffect(_vm->getFilePath(_soundFileNameID), 128);
1755 ((SceneViewWindow *)viewWindow)->getGlobalFlags().faMNBooksClicked = 1;
1756
1757 ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow->sceneChanged();
1758
1759 if (((GameUIWindow *)viewWindow->getParent())->_inventoryWindow->isItemInInventory(kItemBioChipAI))
1760 ((SceneViewWindow *)viewWindow)->playAIComment(_staticData.location, AI_COMMENT_TYPE_SPONTANEOUS);
1761
1762 return SC_TRUE;
1763 }
1764
1765 if (_clickRegion.contains(pointLocation))
1766 ((SceneViewWindow *)viewWindow)->moveToDestination(_clickDestination);
1767
1768 return SC_FALSE;
1769 }
1770
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1771 int ClickOnBooks::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1772 if (_soundRegion.contains(pointLocation))
1773 return kCursorFinger;
1774
1775 if (_clickRegion.contains(pointLocation))
1776 return _cursorID;
1777
1778 return kCursorArrow;
1779 }
1780
1781 class ClickEnvironNatureScenes : public SceneBase {
1782 public:
1783 ClickEnvironNatureScenes(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1784 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1785 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1786
1787 private:
1788 Common::Rect _controls;
1789 };
1790
ClickEnvironNatureScenes(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1791 ClickEnvironNatureScenes::ClickEnvironNatureScenes(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1792 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1793 _controls = Common::Rect(0, 160, 432, 189);
1794 _staticData.navFrameIndex = 52;
1795 }
1796
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1797 int ClickEnvironNatureScenes::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1798 if (_controls.contains(pointLocation)) {
1799 DestinationScene newScene;
1800 newScene.destinationScene = _staticData.location;
1801 newScene.destinationScene.depth = 1;
1802 newScene.transitionType = TRANSITION_VIDEO;
1803 newScene.transitionData = 4;
1804 newScene.transitionStartFrame = -1;
1805 newScene.transitionLength = -1;
1806 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1807 return SC_TRUE;
1808 }
1809
1810 // Update the image
1811 _staticData.navFrameIndex++;
1812 if (_staticData.navFrameIndex > 54)
1813 _staticData.navFrameIndex = 52;
1814 viewWindow->invalidateWindow(false);
1815 return SC_TRUE;
1816 }
1817
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1818 int ClickEnvironNatureScenes::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1819 if (_controls.contains(pointLocation))
1820 return kCursorPutDown;
1821
1822 return kCursorArrow;
1823 }
1824
1825 class ViewEnvironCart : public SceneBase {
1826 public:
1827 ViewEnvironCart(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1828 int timerCallback(Window *viewWindow);
1829 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1830 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1831 };
1832
ViewEnvironCart(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1833 ViewEnvironCart::ViewEnvironCart(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1834 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1835 if (((SceneViewWindow *)viewWindow)->getGlobalFlags().lensFilterActivated == 0)
1836 _staticData.navFrameIndex = 66;
1837 }
1838
timerCallback(Window * viewWindow)1839 int ViewEnvironCart::timerCallback(Window *viewWindow) {
1840 if (((SceneViewWindow *)viewWindow)->getGlobalFlags().lensFilterActivated == 1) {
1841 _staticData.navFrameIndex = 64;
1842
1843 // Kill the ambient sound
1844 _vm->_sound->setAmbientSound();
1845
1846 // Set the research scoring flag
1847 ((SceneViewWindow *)viewWindow)->getGlobalFlags().scoreResearchEnvironCart = 1;
1848
1849 // Sit back and relax as you get abducted
1850 ((SceneViewWindow *)viewWindow)->playSynchronousAnimation(15);
1851 _staticData.navFrameIndex = 55;
1852
1853 // Empty the input queue
1854 BuriedEngine *vm = _vm;
1855 vm->removeMouseMessages(viewWindow);
1856 vm->removeKeyboardMessages(viewWindow);
1857
1858 // Make the jump to Agent 3's lair
1859 DestinationScene newScene;
1860 newScene.destinationScene = Location(3, 2, 6, 0, 0, 0);
1861 newScene.transitionType = TRANSITION_NONE;
1862 newScene.transitionData = -1;
1863 newScene.transitionStartFrame = -1;
1864 newScene.transitionLength = -1;
1865 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1866
1867 vm->removeMouseMessages(viewWindow);
1868 vm->removeKeyboardMessages(viewWindow);
1869 }
1870
1871 return SC_TRUE;
1872 }
1873
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1874 int ViewEnvironCart::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1875 // Move back
1876 DestinationScene newScene;
1877 newScene.destinationScene = _staticData.location;
1878 newScene.destinationScene.depth = 1;
1879 newScene.transitionType = TRANSITION_VIDEO;
1880 newScene.transitionData = 4;
1881 newScene.transitionStartFrame = -1;
1882 newScene.transitionLength = -1;
1883 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1884 return SC_TRUE;
1885 }
1886
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1887 int ViewEnvironCart::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1888 return kCursorFinger;
1889 }
1890
1891 class MainEnvironSitDownClick : public SceneBase {
1892 public:
1893 MainEnvironSitDownClick(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1894 int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
1895 int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
1896
1897 private:
1898 Common::Rect _environRect;
1899 };
1900
MainEnvironSitDownClick(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1901 MainEnvironSitDownClick::MainEnvironSitDownClick(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1902 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1903 _environRect = Common::Rect(120, 0, 302, 189);
1904 }
1905
mouseUp(Window * viewWindow,const Common::Point & pointLocation)1906 int MainEnvironSitDownClick::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
1907 if (_environRect.contains(pointLocation)) {
1908 DestinationScene newScene;
1909 newScene.destinationScene = _staticData.location;
1910 newScene.destinationScene.orientation = 1;
1911 newScene.destinationScene.depth = 1;
1912 newScene.transitionType = TRANSITION_NONE;
1913 newScene.transitionData = -1;
1914 newScene.transitionStartFrame = -1;
1915 newScene.transitionLength = -1;
1916 ((SceneViewWindow *)viewWindow)->moveToDestination(newScene);
1917 return SC_TRUE;
1918 }
1919
1920 return SC_FALSE;
1921 }
1922
specifyCursor(Window * viewWindow,const Common::Point & pointLocation)1923 int MainEnvironSitDownClick::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
1924 if (_environRect.contains(pointLocation))
1925 return kCursorFinger;
1926
1927 return kCursorArrow;
1928 }
1929
1930 class EnvironDoorExitSound : public SceneBase {
1931 public:
1932 EnvironDoorExitSound(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
1933 int postExitRoom(Window *viewWindow, const Location &newLocation);
1934 };
1935
EnvironDoorExitSound(BuriedEngine * vm,Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1936 EnvironDoorExitSound::EnvironDoorExitSound(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
1937 SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
1938 }
1939
postExitRoom(Window * viewWindow,const Location & newLocation)1940 int EnvironDoorExitSound::postExitRoom(Window *viewWindow, const Location &newLocation) {
1941 if (_staticData.location.timeZone == newLocation.timeZone)
1942 _vm->_sound->playSoundEffect(_vm->getFilePath(IDS_FUTAPT_ENVIRON_DOOR_CLOSE));
1943
1944 return SC_TRUE;
1945 }
1946
startFutureApartmentAmbient(int oldTimeZone,int oldEnvironment,int environment,bool fade)1947 bool SceneViewWindow::startFutureApartmentAmbient(int oldTimeZone, int oldEnvironment, int environment, bool fade) {
1948 _vm->_sound->setAmbientSound(_vm->getFilePath(4, environment, SF_AMBIENT), fade, 64);
1949 return true;
1950 }
1951
constructFutureApartmentSceneObject(Window * viewWindow,const LocationStaticData & sceneStaticData,const Location & priorLocation)1952 SceneBase *SceneViewWindow::constructFutureApartmentSceneObject(Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) {
1953 switch (sceneStaticData.classID) {
1954 case 0:
1955 // Default scene
1956 break;
1957 case 1:
1958 return new ClickPlayVideoSwitchAI(_vm, viewWindow, sceneStaticData, priorLocation, 0, kCursorFinger, offsetof(GlobalFlags, faKICoffeeSpilled), 212, 114, 246, 160);
1959 case 2:
1960 return new ClickPlayVideoSwitchAI(_vm, viewWindow, sceneStaticData, priorLocation, 1, kCursorFinger, offsetof(GlobalFlags, faKIBirdsBobbed), 150, 40, 260, 164);
1961 case 3:
1962 return new OvenDoor(_vm, viewWindow, sceneStaticData, priorLocation, 2, 3, 37, 25, offsetof(GlobalFlags, faKIOvenStatus), 0, 0, 270, 80);
1963 case 4:
1964 return new OvenDoor(_vm, viewWindow, sceneStaticData, priorLocation, 4, 5, 38, 26, offsetof(GlobalFlags, faKIOvenStatus), 0, 50, 300, 189);
1965 case 5:
1966 return new KitchenUnitTurnOn(_vm, viewWindow, sceneStaticData, priorLocation);
1967 case 6:
1968 return new KitchenUnitTitleScreen(_vm, viewWindow, sceneStaticData, priorLocation);
1969 case 7:
1970 return new KitchenUnitMainMenu(_vm, viewWindow, sceneStaticData, priorLocation);
1971 case 8:
1972 return new KitchenUnitPostBox(_vm, viewWindow, sceneStaticData, priorLocation);
1973 case 9:
1974 return new KitchenUnitShopNet(_vm, viewWindow, sceneStaticData, priorLocation);
1975 case 10:
1976 return new KitchenUnitAutoChef(_vm, viewWindow, sceneStaticData, priorLocation);
1977 case 11:
1978 return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 200, 83, 230, 116, kItemBioChipTranslate, 61, offsetof(GlobalFlags, faKITakenPostboxItem));
1979 case 12:
1980 return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 202, 80, 227, 155, kItemCheeseGirl, 59, offsetof(GlobalFlags, faKITakenPostboxItem));
1981 case 13:
1982 return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 203, 111, 225, 129, kItemGenoSingleCart, 63, offsetof(GlobalFlags, faKITakenPostboxItem));
1983 case 15:
1984 return new ClickChangeScene(_vm, viewWindow, sceneStaticData, priorLocation, 134, 0, 300, 189, kCursorFinger, 4, 2, 2, 0, 1, 1, TRANSITION_VIDEO, 0, -1, -1);
1985 case 16:
1986 return new ClickChangeScene(_vm, viewWindow, sceneStaticData, priorLocation, 163, 25, 273, 145, kCursorMagnifyingGlass, 4, 2, 2, 0, 1, 2, TRANSITION_VIDEO, 1, -1, -1);
1987 case 17:
1988 return new EnvironSystemControls(_vm, viewWindow, sceneStaticData, priorLocation);
1989 case 18:
1990 return new ClickEnvironNatureScenes(_vm, viewWindow, sceneStaticData, priorLocation);
1991 case 19:
1992 return new EnvironGenoVideo(_vm, viewWindow, sceneStaticData, priorLocation);
1993 case 20:
1994 return new ViewEnvironCart(_vm, viewWindow, sceneStaticData, priorLocation);
1995 case 21:
1996 return new ClickChangeScene(_vm, viewWindow, sceneStaticData, priorLocation, 0, 0, 432, 189, kCursorPutDown, 4, 2, 2, 0, 1, 1, TRANSITION_VIDEO, 4, -1, -1);
1997 case 22:
1998 return new InteractiveNewsNetwork(_vm, viewWindow, sceneStaticData, priorLocation, -1, 4, 2, 2, 0, 1, 1, TRANSITION_VIDEO, 4, -1, -1);
1999 case 23:
2000 return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 81, 146, 134, 189, kItemRemoteControl, 45, offsetof(GlobalFlags, faERTakenRemoteControl));
2001 case 24:
2002 return new FlagChangeBackground(_vm, viewWindow, sceneStaticData, priorLocation, offsetof(GlobalFlags, faERTakenRemoteControl), 1, 33);
2003 case 25:
2004 return new FlagChangeBackground(_vm, viewWindow, sceneStaticData, priorLocation, offsetof(GlobalFlags, faERTakenRemoteControl), 1, 21);
2005 case 26:
2006 return new FlagChangeBackground(_vm, viewWindow, sceneStaticData, priorLocation, offsetof(GlobalFlags, faERTakenRemoteControl), 1, 9);
2007 case 30:
2008 return new PlayStingers(_vm, viewWindow, sceneStaticData, priorLocation, 128, offsetof(GlobalFlags, faStingerID), offsetof(GlobalFlags, faStingerChannelID), 10, 14);
2009 case 31:
2010 return new ClickZoomInTopOfBookshelf(_vm, viewWindow, sceneStaticData, priorLocation);
2011 case 32:
2012 return new ClickChangeScene(_vm, viewWindow, sceneStaticData, priorLocation, 0, 0, 432, 189, kCursorPutDown, 4, 3, 9, 0, 1, 0, TRANSITION_VIDEO, 10, -1, -1);
2013 case 33:
2014 return new ClickOnBooks(_vm, viewWindow, sceneStaticData, priorLocation, 0, 0, 432, 189, kCursorPutDown, 4, 3, 9, 0, 1, 0, TRANSITION_VIDEO, 12, -1, -1, IDS_FUTAPT_BOOK_AUDIO_FILENAME, 182, 8, 396, 156);
2015 case 34:
2016 return new ClickZoomInBottomOfBookshelf(_vm, viewWindow, sceneStaticData, priorLocation);
2017 case 35:
2018 return new ClickChangeScene(_vm, viewWindow, sceneStaticData, priorLocation, 0, 0, 432, 189, kCursorPutDown, 4, 3, 9, 0, 0, 0, TRANSITION_VIDEO, 8, -1, -1);
2019 case 36:
2020 return new RightClockShelf(_vm, viewWindow, sceneStaticData, priorLocation);
2021 case 37:
2022 return new ClickZoomToyShelf(_vm, viewWindow, sceneStaticData, priorLocation);
2023 case 38:
2024 return new ToyClick(_vm, viewWindow, sceneStaticData, priorLocation, 82, 0, 358, 189, 0, 14, 15);
2025 case 39:
2026 return new ToyClick(_vm, viewWindow, sceneStaticData, priorLocation, 104, 0, 320, 189, 0, 17, 18);
2027 case 40:
2028 return new ToyClick(_vm, viewWindow, sceneStaticData, priorLocation, 104, 10, 270, 189, 0, 20, 21);
2029 case 41:
2030 return new ToyClick(_vm, viewWindow, sceneStaticData, priorLocation, 128, 0, 332, 189, 0, 23, 24);
2031 case 42:
2032 return new ClickChangeScene(_vm, viewWindow, sceneStaticData, priorLocation, 168, 38, 268, 108, kCursorMagnifyingGlass, 4, 3, 5, 0, 0, 1, TRANSITION_VIDEO, 28, -1, -1);
2033 case 43:
2034 return new ClickChangeScene(_vm, viewWindow, sceneStaticData, priorLocation, 0, 0, 432, 189, kCursorPutDown, 4, 3, 5, 0, 0, 0, TRANSITION_VIDEO, 29, -1, -1);
2035 case 44:
2036 return new ClickPlayLoopingVideoClip(_vm, viewWindow, sceneStaticData, priorLocation, kCursorFinger, 25, 120, 0, 299, 132, offsetof(GlobalFlags, faMNPongClicked), 1);
2037 case 45:
2038 return new ClickPlayLoopingVideoClip(_vm, viewWindow, sceneStaticData, priorLocation, kCursorFinger, 27, 0, 0, 432, 189);
2039 case 46:
2040 return new ClickChangeScene(_vm, viewWindow, sceneStaticData, priorLocation, 44, 26, 254, 144, kCursorMagnifyingGlass, 4, 3, 0, 2, 0, 1, TRANSITION_VIDEO, 30, -1, -1);
2041 case 47:
2042 return new ClickOnCoffeeTable(_vm, viewWindow, sceneStaticData, priorLocation);
2043 case 50:
2044 return new ClickChangeScene(_vm, viewWindow, sceneStaticData, priorLocation, 82, 38, 346, 138, kCursorMagnifyingGlass, 4, 3, 9, 2, 0, 1, TRANSITION_VIDEO, 38, -1, -1);
2045 case 51:
2046 return new MainDeskView(_vm, viewWindow, sceneStaticData, priorLocation);
2047 case 52:
2048 return new BrowseBook(_vm, viewWindow, sceneStaticData, priorLocation, IDBD_LETTERS_BOOK_DATA, -1, 0, 4, 3, 9, 2, 0, 1, TRANSITION_VIDEO, 41, -1, -1);
2049 case 53:
2050 return new ViewVidPhone(_vm, viewWindow, sceneStaticData, priorLocation);
2051 case 54:
2052 return new ClickPlayVideo(_vm, viewWindow, sceneStaticData, priorLocation, 36, kCursorFinger, 0, 0, 432, 189);
2053 case 56:
2054 return new MainEnvironDoorDown(_vm, viewWindow, sceneStaticData, priorLocation);
2055 case 57:
2056 return new MainEnvironDoorExit(_vm, viewWindow, sceneStaticData, priorLocation);
2057 case 58:
2058 return new MainEnvironSitDownClick(_vm, viewWindow, sceneStaticData, priorLocation);
2059 case 59:
2060 return new EnvironDoorExitSound(_vm, viewWindow, sceneStaticData, priorLocation);
2061 default:
2062 warning("Unknown Future apartment scene object %d", sceneStaticData.classID);
2063 }
2064
2065 return new SceneBase(_vm, viewWindow, sceneStaticData, priorLocation);
2066 }
2067
2068 } // End of namespace Buried
2069