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