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 #ifndef BURIED_SCENE_COMMON_H
27 #define BURIED_SCENE_COMMON_H
28 
29 #include "buried/avi_frames.h"
30 #include "buried/bookdata.h"
31 #include "buried/inndata.h"
32 #include "buried/environ/scene_base.h"
33 
34 namespace Buried {
35 
36 class BasicDoor : public SceneBase {
37 public:
38 	BasicDoor(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
39 			int left = -1, int top = -1, int right = -1, int bottom = -1, int timeZone = -1, int environment = -1,
40 			int node = -1, int facing = -1, int orientation = -1, int depth = -1, int transitionType = -1, int transitionData = -1,
41 			int transitionStartFrame = -1, int transitionLength = -1, int openingSoundID = -1);
42 
43 	int mouseDown(Window *viewWindow, const Common::Point &pointLocation);
44 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
45 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
46 
47 	bool _clicked;
48 	Common::Rect _clickable;
49 	DestinationScene _destData;
50 	int _openingSoundID;
51 };
52 
53 class TurnDepthPreChange : public SceneBase {
54 public:
55 	TurnDepthPreChange(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
56 			int flagOffset = -1, int upDepth = -1, int leftDepth = -1, int rightDepth = -1, int downDepth = -1, int forwardDepth = -1);
57 };
58 
59 class GenericItemAcquire : public SceneBase {
60 public:
61 	GenericItemAcquire(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
62 			int left = 0, int top = 0, int right = 0, int bottom = 0, int itemID = 0, int clearStillFrame = 0, int itemFlagOffset = 0);
63 	int mouseDown(Window *viewWindow, const Common::Point &pointLocation);
64 	virtual int droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags);
65 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
66 
67 protected:
68 	bool _itemPresent;
69 	Common::Rect _acquireRegion;
70 	int _fullFrameIndex;
71 	int _clearFrameIndex;
72 	int _itemID;
73 	int _itemFlagOffset;
74 };
75 
76 class PlaySoundExitingFromScene : public SceneBase {
77 public:
78 	PlaySoundExitingFromScene(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
79 			int soundFileNameID = -1);
80 	int postExitRoom(Window *viewWindow, const Location &newLocation);
81 
82 private:
83 	int _soundFileNameID;
84 };
85 
86 class PlaySoundExitingFromSceneDeux : public SceneBase {
87 public:
88 	PlaySoundExitingFromSceneDeux(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
89 			int soundFileNameID = -1);
90 	int postExitRoom(Window *viewWindow, const Location &newLocation);
91 
92 private:
93 	int _soundFileNameID;
94 };
95 
96 class PlaySoundEnteringScene : public SceneBase {
97 public:
98 	PlaySoundEnteringScene(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
99 			int soundFileNameID = -1, int flagOffset = -1);
100 	int postEnterRoom(Window *viewWindow, const Location &priorLocation);
101 
102 private:
103 	int _soundFileNameID;
104 	int _flagOffset;
105 };
106 
107 class ClickChangeScene : public SceneBase {
108 public:
109 	ClickChangeScene(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
110 			int left = -1, int top = -1, int right = -1, int bottom = -1, int cursorID = 0,
111 			int timeZone = -1, int environment = -1, int node = -1, int facing = -1, int orientation = -1, int depth = -1,
112 			int transitionType = -1, int transitionData = -1, int transitionStartFrame = -1, int transitionLength = -1);
113 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
114 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
115 
116 private:
117 	int _cursorID;
118 	Common::Rect _clickRegion;
119 	DestinationScene _clickDestination;
120 };
121 
122 class ClickPlayVideoSwitchAI : public SceneBase {
123 public:
124 	ClickPlayVideoSwitchAI(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
125 			int animID = 0, int cursorID = 0, int flagOffset = 0, int left = 0, int top = 0, int right = 0, int bottom = 0);
126 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
127 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
128 
129 private:
130 	int _cursorID;
131 	int _animID;
132 	Common::Rect _clickRegion;
133 	int _flagOffset;
134 };
135 
136 class ClickChangeSceneSetFlag : public ClickChangeScene {
137 public:
138 	ClickChangeSceneSetFlag(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
139 			int left = -1, int top = -1, int right = -1, int bottom = -1, int cursorID = 0,
140 			int timeZone = -1, int environment = -1, int node = -1, int facing = -1, int orientation = -1, int depth = -1,
141 			int transitionType = -1, int transitionData = -1, int transitionStartFrame = -1, int transitionLength = -1, int flagIndex = -1);
142 };
143 
144 class PlayStingers : public SceneBase {
145 public:
146 	PlayStingers(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
147 			int stingerVolume = 127, int lastStingerFlagOffset = -1, int effectIDFlagOffset = -1, int firstStingerFileID = -1, int lastStingerFileID = -1);
148 	int postEnterRoom(Window *viewWindow, const Location &priorLocation);
149 
150 private:
151 	int _stingerVolume;
152 	int _lastStingerFlagOffset;
153 	int _effectIDFlagOffset;
154 	int _firstStingerFileID;
155 	int _lastStingerFileID;
156 };
157 
158 class ClickPlaySound : public SceneBase {
159 public:
160 	ClickPlaySound(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
161 			int flagOffset = -1, int soundID = 0, int cursorID = 0, int left = 0, int top = 0, int right = 0, int bottom = 0);
162 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
163 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
164 
165 private:
166 	int _cursorID;
167 	int _soundID;
168 	Common::Rect _clickRegion;
169 	int _flagOffset;
170 };
171 
172 class ClickZoom : public SceneBase {
173 public:
174 	ClickZoom(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
175 			int animInID = -1, int stillInID = -1, int animOutID = -1, int stillOutID = -1,
176 			int cursorID = 0, int left = 0, int top = 0, int right = 0, int bottom = 0);
177 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
178 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
179 
180 private:
181 	int _cursorID;
182 	Common::Rect _clickRegion;
183 	int _animInID;
184 	int _stillInID;
185 	int _animOutID;
186 	int _stillOutID;
187 	bool _zoomedIn;
188 	LocationStaticData _savedNavData;
189 };
190 
191 class PlaySoundEnteringFromScene : public SceneBase {
192 public:
193 	PlaySoundEnteringFromScene(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
194 			int soundFileNameID = -1, int timeZone = -1, int environment = -1, int node = -1, int facing = -1, int orientation = -1, int depth = -1);
195 	int postEnterRoom(Window *viewWindow, const Location &priorLocation);
196 
197 private:
198 	Location _soundLocation;
199 	int _soundFileNameID;
200 };
201 
202 class SetFlagOnEntry : public SceneBase {
203 public:
204 	SetFlagOnEntry(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
205 			int flagOffset = -1, byte flagNewValue = 1);
206 };
207 
208 class InteractiveNewsNetwork : public SceneBase {
209 public:
210 	InteractiveNewsNetwork(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
211 			int enterTransition = -1, int timeZone = -1, int environment = -1, int node = -1, int facing = -1, int orientation = -1, int depth = -1,
212 			int transitionType = -1, int transitionData = -1, int transitionStartFrame = -1, int transitionLength = -1);
213 	~InteractiveNewsNetwork();
214 	int postEnterRoom(Window *viewWindow, const Location &priorLocation);
215 	int preExitRoom(Window *viewWindow, const Location &newLocation);
216 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
217 	int paint(Window *viewWindow, Graphics::Surface *preBuffer);
218 	int movieCallback(Window *viewWindow, VideoWindow *movie, int animationID, int status);
219 	int timerCallback(Window *viewWindow);
220 
221 private:
222 	int _enterTransition;
223 	int _currentMovieFrame;
224 	DestinationScene _returnDestination;
225 	AVIFrames _stillFrames;
226 	Common::Array<INNFrame> _frameDatabase;
227 	Common::Array<INNMediaElement> _movieDatabase;
228 	Common::Array<byte> _hyperLinkHistory;
229 	bool _playingMovie;
230 	bool _loopingMovie;
231 	bool _playingAudio;
232 	int _audioChannel;
233 
234 	void loadFrameDatabase();
235 	void loadMovieDatabase();
236 };
237 
238 class DisplayMessageWithEvidenceWhenEnteringNode : public SceneBase {
239 public:
240 	DisplayMessageWithEvidenceWhenEnteringNode(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
241 			int evidenceID = -1, int messageBoxTextID = -1);
242 	int postEnterRoom(Window *viewWindow, const Location &priorLocation);
243 
244 private:
245 	int _messageBoxTextID;
246 	byte _evidenceID;
247 };
248 
249 class ClickPlayLoopingVideoClip : public SceneBase {
250 public:
251 	ClickPlayLoopingVideoClip(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
252 			int cursorID = 0, int animID = -1, int left = 0, int top = 0, int right = 0, int bottom = 0, int flagOffset = -1, int newFlagValue = -1);
253 	int preExitRoom(Window *viewWindow, const Location &newLocation);
254 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
255 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
256 
257 private:
258 	int _cursorID;
259 	int _animID;
260 	Common::Rect _clickRegion;
261 	int _flagOffset;
262 	int _flagValue;
263 	bool _playing;
264 };
265 
266 class OneShotEntryVideoWarning : public SceneBase {
267 public:
268 	OneShotEntryVideoWarning(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
269 			int animID = 0, int flagOffset = 0, int warningMessageID = -1);
270 	int postEnterRoom(Window *viewWindow, const Location &priorLocation);
271 
272 private:
273 	int _animID;
274 	int _flagOffset;
275 	int _warningMessageID;
276 };
277 
278 class DisableForwardMovement : public SceneBase {
279 public:
280 	DisableForwardMovement(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
281 			int flagOffset = -1, int flagValue = 1);
282 };
283 
284 class CycleEntryVideoWarning : public SceneBase {
285 public:
286 	CycleEntryVideoWarning(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
287 			int animIDA = 0, int animIDB = 0, int flagOffset = 0, int warningMessageID = -1);
288 	int postEnterRoom(Window *viewWindow, const Location &priorLocation);
289 
290 private:
291 	int _animIDA;
292 	int _animIDB;
293 	int _flagOffset;
294 	int _warningMessageID;
295 };
296 
297 class ClickPlayVideoSwitch : public SceneBase {
298 public:
299 	ClickPlayVideoSwitch(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
300 			int animID = 0, int cursorID = -1, int flagOffset = 0, int left = 0, int top = 0, int right = 0, int bottom = 0);
301 
302 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
303 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
304 
305 private:
306 	int _cursorID;
307 	int _animID;
308 	Common::Rect _clickRegion;
309 	int _flagOffset;
310 };
311 
312 class ClickPlayVideo : public SceneBase {
313 public:
314 	ClickPlayVideo(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
315 			int animID = 0, int cursorID = -1, int left = 0, int top = 0, int right = 0, int bottom = 0);
316 
317 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
318 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
319 
320 private:
321 	int _cursorID;
322 	int _animID;
323 	Common::Rect _clickRegion;
324 };
325 
326 class VideoDeath : public SceneBase {
327 public:
328 	VideoDeath(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation, int deathID = 0, int messageTextID = -1);
329 	int postEnterRoom(Window *viewWindow, const Location &priorLocation);
330 	int postExitRoom(Window *viewWindow, const Location &newLocation);
331 
332 private:
333 	int _deathID;
334 	int _messageTextID;
335 };
336 
337 class ClickChangeDepth : public SceneBase {
338 public:
339 	ClickChangeDepth(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
340 			int newDepth = 0, int cursorID = 0, int left = -1, int top = -1, int right = -1, int bottom = -1);
341 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
342 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
343 
344 private:
345 	int _newDepth;
346 	int _cursorID;
347 	Common::Rect _clickableRegion;
348 };
349 
350 class OpenFirstItemAcquire : public SceneBase {
351 public:
352 	OpenFirstItemAcquire(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
353 			int openLeft = 0, int openTop = 0, int openRight = 0, int openBottom = 0, int getLeft = 0, int getTop = 0, int getRight = 0,
354 			int getBottom = 0, int animOpenWith = 0, int animOpenWithout = 0, int itemID = 0, int fullStillFrame = 0, int clearStillFrame = 0,
355 			int itemFlagOffset = 0);
356 	int mouseDown(Window *viewWindow, const Common::Point &pointLocation);
357 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
358 	int droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags);
359 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
360 
361 private:
362 	bool _itemPresent;
363 	bool _open;
364 	Common::Rect _openClickRegion;
365 	Common::Rect _acquireRegion;
366 	int _fullFrameIndex;
367 	int _clearFrameIndex;
368 	int _itemID;
369 	int _itemFlagOffset;
370 	int _animOpenWith;
371 	int _animOpenWithout;
372 };
373 
374 class BrowseBook : public SceneBase {
375 public:
376 	BrowseBook(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
377 			int bookResID = 0, int textStartResID = -1, int startingPageID = 0, int timeZone = -1, int environment = -1,
378 			int node = -1, int facing = -1, int orientation = -1, int depth = -1, int transitionType = -1, int transitionData = -1,
379 			int transitionStartFrame = -1, int transitionLength = -1);
380 	int gdiPaint(Window *viewWindow);
381 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
382 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
383 	int mouseMove(Window *viewWindow, const Common::Point &pointLocation);
384 
385 private:
386 	int pageChanged(Window *viewWindow);
387 	int textTranslated(Window *viewWindow);
388 
389 	Common::Array<BookPage> _bookDatabase;
390 	int _curPage;
391 	Common::Rect _top, _bottom, _left, _right, _putDown;
392 	DestinationScene _putDownDestination;
393 	int _translatedTextResourceID;
394 	int _curLineIndex;
395 };
396 
397 class ClickPlaySoundSynchronous : public SceneBase {
398 public:
399 	ClickPlaySoundSynchronous(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
400 			int flagOffset = -1, int soundID = 0, int cursorID = 0, int left = 0, int top = 0, int right = 0, int bottom = 0);
401 	int mouseUp(Window *viewWindow, const Common::Point &pointLocation);
402 	int specifyCursor(Window *viewWindow, const Common::Point &pointLocation);
403 
404 private:
405 	int _cursorID;
406 	int _soundID;
407 	Common::Rect _clickRegion;
408 	int _flagOffset;
409 };
410 
411 class TrialRecallScene : public SceneBase {
412 public:
413 	TrialRecallScene(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
414 	int postEnterRoom(Window *viewWindow, const Location &priorLocation);
415 };
416 
417 } // End of namespace Buried
418 
419 #endif
420