ScummVM API documentation
saga.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef SAGA_SAGA_H
23 #define SAGA_SAGA_H
24 
25 #include "engines/engine.h"
26 
27 #include "common/array.h"
28 #include "common/random.h"
29 #include "common/memstream.h"
30 #include "common/textconsole.h"
31 
32 #include "saga/gfx.h"
33 #include "saga/detection.h"
34 
36 
47 namespace Saga {
48 
49 class SndRes;
50 class Sound;
51 class Music;
52 class Anim;
53 class Render;
54 class IsoMap;
55 class Gfx;
56 class Script;
57 class Actor;
58 class Font;
59 class Sprite;
60 class Scene;
61 class Interface;
62 class Console;
63 class Events;
64 class PalAnim;
65 class Puzzle;
66 class Resource;
67 
68 class ResourceContext;
69 
70 // #define SAGA_DEBUG 1 // define for test functions
71 #define SAGA_IMAGE_DATA_OFFSET 776
72 #define SAGA_IMAGE_HEADER_LEN 8
73 
74 // Note that IHNM has a smaller save title size than ITE
75 // We allocate the ITE save title size in savegames, to
76 // preserve savegame backwards compatibility. We only check
77 // for IHNM's save title during text input
78 #define SAVE_TITLE_SIZE 28
79 #define TITLESIZE 80
80 #define IHNM_SAVE_TITLE_SIZE 22
81 #define MAX_SAVES 96
82 #define MAX_FILE_NAME 256
83 
84 #define ID_NOTHING 0
85 #define ID_PROTAG 1
86 #define OBJECT_TYPE_SHIFT 13
87 #define OBJECT_TYPE_MASK ((1 << OBJECT_TYPE_SHIFT) - 1)
88 
89 #define IHNM_OBJ_PROFILE 0x4000
90 
91 #define memoryError(Place) error("%s Memory allocation error.", Place)
92 
93 enum ERRORCODE {
94  FAILURE = -1,
95  SUCCESS = 0
96 };
97 
98 enum VerbTypeIds {
99  kVerbITENone = 0,
100  kVerbITEPickUp = 1,
101  kVerbITELookAt = 2,
102  kVerbITEWalkTo = 3,
103  kVerbITETalkTo = 4,
104  kVerbITEOpen = 5,
105  kVerbITEClose = 6,
106  kVerbITEGive = 7,
107  kVerbITEUse = 8,
108  kVerbITEOptions = 9,
109  kVerbITEEnter = 10,
110  kVerbITELeave = 11,
111  kVerbITEBegin = 12,
112  kVerbITEWalkOnly = 13,
113  kVerbITELookOnly = 14,
114 
115 
116  kVerbIHNMNone = 0,
117  kVerbIHNMWalk = 1,
118  kVerbIHNMLookAt = 2,
119  kVerbIHNMTake = 3,
120  kVerbIHNMUse = 4,
121  kVerbIHNMTalkTo = 5,
122  kVerbIHNMSwallow = 6,
123  kVerbIHNMGive = 7,
124  kVerbIHNMPush = 8,
125  kVerbIHNMOptions = 9,
126  kVerbIHNMEnter = 10,
127  kVerbIHNMLeave = 11,
128  kVerbIHNMBegin = 12,
129  kVerbIHNMWalkOnly = 13,
130  kVerbIHNMLookOnly = 14,
131 
132  kVerbTypeIdsMax = kVerbITELookOnly + 1
133 };
134 
135 enum PanelButtonType {
136  kPanelButtonVerb = 1 << 0,
137  kPanelButtonArrow = 1 << 1,
138  kPanelButtonConverseText = 1 << 2,
139  kPanelButtonInventory = 1 << 3,
140 
141  kPanelButtonOption = 1 << 4,
142  kPanelButtonOptionSlider = 1 << 5,
143  kPanelButtonOptionSaveFiles = 1 << 6,
144  kPanelButtonOptionText = 1 << 7,
145 
146  kPanelButtonQuit = 1 << 8,
147  kPanelButtonQuitText = 1 << 9,
148 
149  kPanelButtonLoad = 1 << 10,
150  kPanelButtonLoadText = 1 << 11,
151 
152  kPanelButtonSave = 1 << 12,
153  kPanelButtonSaveText = 1 << 13,
154  kPanelButtonSaveEdit = 1 << 14,
155 
156  kPanelButtonProtectText = 1 << 15,
157  kPanelButtonProtectEdit = 1 << 16,
158 
159  kPanelAllButtons = 0xFFFFF
160 };
161 
162 enum TextStringIds {
163  kTextPickUp,
164  kTextLookAt,
165  kTextWalkTo,
166  kTextTalkTo,
167  kTextOpen,
168  kTextClose,
169  kTextGive,
170  kTextUse,
171 
172  kTextOptions,
173  kTextTest,
174  kTextDemo,
175  kTextHelp,
176  kTextQuitGame,
177  kTextFast,
178  kTextSlow,
179  kTextOn,
180  kTextOff,
181  kTextContinuePlaying,
182  kTextLoad,
183  kTextSave,
184  kTextGameOptions,
185  kTextReadingSpeed,
186  kTextMusic,
187  kTextSound,
188  kTextCancel,
189  kTextQuit,
190  kTextOK,
191  kTextMid,
192  kTextClick,
193  kText10Percent,
194  kText20Percent,
195  kText30Percent,
196  kText40Percent,
197  kText50Percent,
198  kText60Percent,
199  kText70Percent,
200  kText80Percent,
201  kText90Percent,
202  kTextMax,
203  kTextQuitTheGameQuestion,
204  kTextLoadSuccessful,
205  kTextEnterSaveGameName,
206  kTextGiveTo,
207  kTextUseWidth,
208  kTextNewSave,
209  kTextICantPickup,
210  kTextNothingSpecial,
211  kTextNoPlaceToOpen,
212  kTextNoOpening,
213  kTextDontKnow,
214  kTextShowDialog,
215  kTextEnterProtectAnswer,
216  kTextVoices,
217  kTextText,
218  kTextAudio,
219  kTextBoth,
220  kTextLoadSavedGame
221 };
222 
224  uint32 sceneLUTResourceId;
225  uint32 moduleLUTResourceId;
226  uint32 mainPanelResourceId;
227  uint32 conversePanelResourceId;
228  uint32 optionPanelResourceId;
229  uint32 mainSpritesResourceId;
230  uint32 mainPanelSpritesResourceId;
231  uint32 mainStringsResourceId;
232  // ITE specific resources
233  uint32 actorsStringsResourceId;
234  uint32 defaultPortraitsResourceId;
235  // IHNM specific resources
236  uint32 optionPanelSpritesResourceId;
237  uint32 warningPanelResourceId;
238  uint32 warningPanelSpritesResourceId;
239  uint32 psychicProfileResourceId;
240 };
241 
243  uint32 fontResourceId;
244 };
245 
246 struct GameDisplayInfo;
247 
249  const char *fileName;
250  uint16 fileType;
251  uint32 resourceId;
252 };
253 
254 enum GameObjectTypes {
255  kGameObjectNone = 0,
256  kGameObjectActor = 1,
257  kGameObjectObject = 2,
258  kGameObjectHitZone = 3,
259  kGameObjectStepZone = 4
260 };
261 
262 enum ScriptTimings {
263  kScriptTimeTicksPerSecond = (728L/10L),
264  kRepeatSpeedTicks = (728L/10L)/3,
265  kNormalFadeDuration = 320, // 64 steps, 5 msec each
266  kQuickFadeDuration = 64, // 64 steps, 1 msec each
267  kPuzzleHintTime = 30000000L // 30 secs. used in timer
268 };
269 
270 enum Directions {
271  kDirUp = 0,
272  kDirUpRight = 1,
273  kDirRight = 2,
274  kDirDownRight = 3,
275  kDirDown = 4,
276  kDirDownLeft = 5,
277  kDirLeft = 6,
278  kDirUpLeft = 7
279 };
280 
281 enum HitZoneFlags {
282  kHitZoneEnabled = (1 << 0), // Zone is enabled
283  kHitZoneExit = (1 << 1), // Causes char to exit
284 
285  // The following flag causes the zone to act differently.
286  // When the actor hits the zone, it will immediately begin walking
287  // in the specified direction, and the actual specified effect of
288  // the zone will be delayed until the actor leaves the zone.
289  kHitZoneAutoWalk = (1 << 2),
290 
291  // When set on a hit zone, this causes the character not to walk
292  // to the object (but they will look at it).
293  kHitZoneNoWalk = (1 << 2),
294 
295  // zone activates only when character stops walking
296  kHitZoneTerminus = (1 << 3),
297 
298  // Hit zones only - when the zone is clicked on it projects the
299  // click point downwards from the middle of the zone until it
300  // reaches the lowest point in the zone.
301  kHitZoneProject = (1 << 3)
302 };
303 
304 struct ImageHeader {
305  int width;
306  int height;
307 };
308 
309 struct StringsTable {
310  Common::Array<char> buffer;
311  Common::Array<char *> strings;
312 
313  const char *getString(uint index) const {
314  if (strings.size() <= index) {
315  // This occurs at the end of Ted's chapter, right after the ending cutscene
316  warning("StringsTable::getString wrong index 0x%X (%d)", index, strings.size());
317  return "";
318  }
319  return strings[index];
320  }
321 
322  void clear() {
323  strings.clear();
324  buffer.clear();
325  }
326 };
327 
329 
330 enum ColorId {
331  // DOS and AGA palettes
332  kITEDOSColorTransBlack = 0x00,
333  kITEDOSColorBrightWhite = 0x01,
334  kITEDOSColorWhite = 0x02,
335  kITEDOSColorLightGrey = 0x04,
336  kITEDOSColorGrey = 0x0a,
337  kITEDOSColorDarkGrey = 0x0b,
338  kITEDOSColorDarkGrey0C = 0x0C,
339  kITEDOSColorBlack = 0x0f,
340  kITEDOSColorYellow60 = 0x60,
341  kITEDOSColorRed = 0x65,
342  kITEDOSColorDarkBlue8a = 0x8a,
343  kITEDOSColorBlue89 = 0x89,
344  kITEDOSColorLightBlue92 = 0x92,
345  kITEDOSColorBlue = 0x93,
346  kITEDOSColorLightBlue94 = 0x94,
347  kITEDOSColorLightBlue96 = 0x96,
348  kITEDOSColorGreen = 0xba,
349 
350  // ECS palette
351 
352  // Constant colors
353  kITEECSColorTransBlack = 0x00,
354  kITEECSColorBrightWhite = 0x4f,
355  kITEECSColorWhite = kITEECSColorBrightWhite,
356  kITEECSColorBlack = 0x50,
357 
358  // ECS palette after the palette switch
359  kITEECSBottomColorGreen = 0x25,
360  kITEECSBottomColorLightBlue96 = 0x28,
361  kITEECSBottomColorWhite = 0x2f,
362  kITEECSBottomColorBrightWhite = 0x2f,
363  kITEECSBottomColorDarkGrey = 0x32,
364  kITEECSBottomColorGrey = 0x36,
365  kITEECSBottomColorBlue = 0x3b,
366  kITEECSBottomColorYellow60 = 0x3e,
367 
368  // ECS palette for options
369  kITEECSOptionsColorLightBlue94 = 0x48,
370  kITEECSOptionsColorBlue = 0x48,
371  kITEECSOptionsColorDarkBlue8a = 0x48,
372  kITEECSOptionsColorLightBlue92 = 0x48,
373  kITEECSOptionsColorLightBlue96 = 0x48,
374  kITEECSOptionsColorDarkGrey0C = 0x49,
375  kITEECSOptionsColorBlack = kITEECSColorBlack,
376  kITEECSOptionsColorBrightWhite = kITEECSColorBrightWhite,
377  kITEECSOptionsColorDarkGrey = 0x52,
378 };
379 
380 enum KnownColor {
381  kKnownColorTransparent,
382  kKnownColorBrightWhite,
383  kKnownColorWhite,
384  kKnownColorBlack,
385 
386  kKnownColorSubtitleTextColor,
387  kKnownColorSubtitleEffectColorPC98,
388  kKnownColorVerbText,
389  kKnownColorVerbTextShadow,
390  kKnownColorVerbTextActive
391 };
392 
393 struct SaveFileData {
394  char name[SAVE_TITLE_SIZE];
395  uint slotNumber;
396 };
397 
399  uint32 type;
400  uint32 size;
401  uint32 version;
402  char name[SAVE_TITLE_SIZE];
403 };
404 
405 inline int objectTypeId(uint16 objectId) {
406  return objectId >> OBJECT_TYPE_SHIFT;
407 }
408 
409 inline int objectIdToIndex(uint16 objectId) {
410  return OBJECT_TYPE_MASK & objectId;
411 }
412 
413 inline uint16 objectIndexToId(int type, int index) {
414  return (type << OBJECT_TYPE_SHIFT) | (OBJECT_TYPE_MASK & index);
415 }
416 
417 class ByteArray : public Common::Array<byte> {
418 public:
423  byte *getBuffer() {
424  return empty() ? NULL : &front();
425  }
426 
427  const byte *getBuffer() const {
428  return empty() ? NULL : &front();
429  }
430 
431  void assign(const ByteArray &src) {
432  resize(src.size());
433  if (!empty()) {
434  memcpy(&front(), &src.front(), size());
435  }
436  }
437 
439  ByteArray(const byte *array, size_type n) : Common::Array<byte>(array, n) {}
440 };
441 
443 public:
444  ByteArrayReadStreamEndian(const ByteArray & byteArray, bool bigEndian = false)
445  : Common::MemoryReadStreamEndian(byteArray.getBuffer(), byteArray.size(), bigEndian),
446  ReadStreamEndian(bigEndian) {
447  }
448 };
449 
450 class SagaEngine : public Engine {
451  friend class Scene;
452 
453 public:
454  // Engine APIs
455  Common::Error run() override;
456  bool hasFeature(EngineFeature f) const override;
457  void syncSoundSettings() override;
458  void pauseEngineIntern(bool pause) override;
459 
460  SagaEngine(OSystem *syst, const SAGAGameDescription *gameDesc);
461  ~SagaEngine() override;
462 
463  void save(const char *fileName, const char *saveName);
464  void load(const char *fileName);
465  uint32 getCurrentLoadVersion() const {
466  return _saveHeader.version;
467  }
468  void fillSaveList();
469  char *calcSaveFileName(uint slotNumber);
470  Common::String getSaveStateName(int slot) const override {
471  return Common::String::format("%s.s%02u", _targetName.c_str(), slot);
472  }
473 
474  SaveFileData *getSaveFile(uint idx);
475  uint getNewSaveSlotNumber() const;
476  bool locateSaveFile(char *saveName, uint &titleNumber);
477  bool isSaveListFull() const {
478  return _saveFilesCount == MAX_SAVES;
479  }
480  uint getSaveFilesCount() const {
481  return isSaveListFull() ? _saveFilesCount : _saveFilesCount + 1;
482  }
483 
484  bool isIHNMDemo() const { return _isIHNMDemo; }
485 
486  bool isITEAmiga() const { return getPlatform() == Common::kPlatformAmiga && getGameId() == GID_ITE; }
487  bool isAGA() const { return _gameDescription->features & GF_AGA_GRAPHICS; }
488  bool isECS() const { return _gameDescription->features & GF_ECS_GRAPHICS; }
489  unsigned getPalNumEntries() const { return isECS() ? 32 : 256; }
490  GameIntroList getIntroList() const { return _gameDescription->introList; }
491 
492  int16 _framesEsc;
493 
494  uint32 _globalFlags;
495  int16 _ethicsPoints[8];
496  int _spiritualBarometer;
497 
498  int _soundVolume;
499  int _speechVolume;
500  bool _subtitlesEnabled;
501  bool _voicesEnabled;
502  bool _voiceFilesExist;
503  int _readingSpeed;
504 
505  bool _copyProtection;
506  bool _musicWasPlaying;
507  bool _isIHNMDemo;
508  bool _hasITESceneSubstitutes;
509 
510  SndRes *_sndRes;
511  Sound *_sound;
512  Music *_music;
513  Anim *_anim;
514  Render *_render;
515  IsoMap *_isoMap;
516  Gfx *_gfx;
517  Script *_script;
518  Actor *_actor;
519  Font *_font;
520  Sprite *_sprite;
521  Scene *_scene;
522  Interface *_interface;
523  Console *_console;
524  Events *_events;
525  PalAnim *_palanim;
526  Puzzle *_puzzle;
527  Resource *_resource;
528 
529 
530  // Random number generator
532 
533 private:
534  bool decodeBGImageRLE(const byte *inbuf, size_t inbuf_len, ByteArray &outbuf);
535  void flipImage(byte *imageBuffer, int columns, int scanlines);
536  void unbankBGImage(byte *dest_buf, const byte *src_buf, int columns, int scanlines);
537  uint32 _previousTicks;
538 
539 public:
540  bool decodeBGImage(const ByteArray &imageData, ByteArray &outputBuffer, int *w, int *h, bool flip = false);
541  bool decodeBGImageMask(const ByteArray &imageData, ByteArray &outputBuffer, int *w, int *h, bool flip = false);
542  const byte *getImagePal(const ByteArray &imageData) {
543  if (imageData.size() <= SAGA_IMAGE_HEADER_LEN) {
544  return NULL;
545  }
546 
547  return &imageData.front() + SAGA_IMAGE_HEADER_LEN;
548  }
549  void loadStrings(StringsTable &stringsTable, const ByteArray &stringsData, bool isBigEndian);
550 
551  const char *getObjectName(uint16 objectId) const;
552 public:
553  int processInput();
554  Point mousePos() const;
555 
556  int getMouseClickCount() const {
557  return _mouseClickCount;
558  }
559 
560  void incrementMouseClickCount() {
561  _mouseClickCount++;
562  }
563 
564  void resetMouseClickCount() {
565  _mouseClickCount = 0;
566  }
567 
568  bool leftMouseButtonPressed() const {
569  return _leftMouseButtonPressed;
570  }
571 
572  bool rightMouseButtonPressed() const {
573  return _rightMouseButtonPressed;
574  }
575 
576  bool mouseButtonPressed() const {
577  return _leftMouseButtonPressed || _rightMouseButtonPressed;
578  }
579 
580  inline int ticksToMSec(int tick) const {
581  return tick * 1000 / kScriptTimeTicksPerSecond;
582  }
583 
584  private:
585  uint _saveFilesCount;
586  SaveFileData _saveFiles[MAX_SAVES];
587  SaveGameHeader _saveHeader;
588 
589  bool _leftMouseButtonPressed;
590  bool _rightMouseButtonPressed;
591  int _mouseClickCount;
592 
593 //current game description
594  int _gameNumber;
595  const SAGAGameDescription *_gameDescription;
596  Common::String _gameTitle;
597  Common::Rect _displayClip;
598 
599 public:
600  int32 _frameCount;
601 
602 public:
603  bool initGame();
604 
605  bool isBigEndian() const;
606  bool isMacResources() const;
607  const GameResourceDescription *getResourceDescription() const;
608 
609  GameResourceList getResourceList() const;
610  GameFontList getFontList() const;
611  GamePatchList getPatchList() const;
612 
613  int getGameId() const;
614  uint32 getFeatures() const;
615  Common::Language getLanguage() const;
616  Common::Platform getPlatform() const;
617  int getGameNumber() const;
618  int getStartSceneNumber() const;
619 
620  const ADGameFileDescription *getFilesDescriptions() const;
621  const ADGameFileDescription *getArchivesDescriptions() const;
622 
623  const Common::Rect &getDisplayClip() const { return _displayClip;}
624  Common::Error loadGameState(int slot) override;
625  Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
626  bool canLoadGameStateCurrently(Common::U32String *msg = nullptr) override;
627  bool canSaveGameStateCurrently(Common::U32String *msg = nullptr) override;
628  const GameDisplayInfo &getDisplayInfo();
629 
630  int getLanguageIndex();
631  const char *getTextString(int textStringId);
632  void getExcuseInfo(int verb, const char *&textString, int &soundResourceId);
633 
634 private:
635 
636 public:
637  ColorId KnownColor2ColorId(KnownColor knownColor);
638  void setTalkspeed(int talkspeed);
639  int getTalkspeed() const;
640 
641 #define ITE_COLOR_DISPATCHER_TYPE(NAME, TYPE) \
642  ColorId iteColor ## TYPE ## NAME() const { return isECS() ? kITEECS ## TYPE ## Color ## NAME : kITEDOSColor ## NAME; }
643 #define ITE_COLOR_DISPATCHER_BOTTOM(NAME) ITE_COLOR_DISPATCHER_TYPE(NAME, Bottom)
644 #define ITE_COLOR_DISPATCHER_OPTIONS(NAME) ITE_COLOR_DISPATCHER_TYPE(NAME, Options)
645 #define ITE_COLOR_DISPATCHER(NAME) ITE_COLOR_DISPATCHER_TYPE(NAME, )
646 
647  ITE_COLOR_DISPATCHER(Black)
648  ITE_COLOR_DISPATCHER(TransBlack)
649  ITE_COLOR_DISPATCHER(BrightWhite)
650  ITE_COLOR_DISPATCHER(White)
651 
652  ITE_COLOR_DISPATCHER_BOTTOM(DarkGrey)
653  ITE_COLOR_DISPATCHER_BOTTOM(Blue)
654  ITE_COLOR_DISPATCHER_BOTTOM(Grey)
655  ITE_COLOR_DISPATCHER_BOTTOM(White)
656  ITE_COLOR_DISPATCHER_BOTTOM(BrightWhite)
657  ITE_COLOR_DISPATCHER_BOTTOM(Green)
658 
659  ITE_COLOR_DISPATCHER_OPTIONS(DarkGrey)
660  ITE_COLOR_DISPATCHER_OPTIONS(LightBlue92)
661  ITE_COLOR_DISPATCHER_OPTIONS(LightBlue94)
662  ITE_COLOR_DISPATCHER_OPTIONS(LightBlue96)
663  ITE_COLOR_DISPATCHER_OPTIONS(DarkBlue8a)
664  ITE_COLOR_DISPATCHER_OPTIONS(DarkGrey0C)
665  ITE_COLOR_DISPATCHER_OPTIONS(Blue)
666  ITE_COLOR_DISPATCHER_OPTIONS(BrightWhite)
667 #undef ITE_COLOR_DISPATCHER
668 #undef ITE_COLOR_DISPATCHER_BOTTOM
669 #undef ITE_COLOR_DISPATCHER_OPTIONS
670 #undef ITE_COLOR_DISPATCHER_TYPE
671 };
672 
673 
674 } // End of namespace Saga
675 
676 #endif
Definition: saga.h:450
byte * getBuffer()
Definition: saga.h:423
Definition: str.h:59
Definition: sndres.h:37
Definition: font.h:144
Definition: actor.h:461
EngineFeature
Definition: engine.h:250
static String format(MSVC_PRINTF const char *fmt,...) GCC_PRINTF(1
Definition: saga.h:223
Definition: error.h:84
void warning(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
void clear()
Definition: array.h:280
Definition: isomap.h:149
Definition: detection.h:109
Definition: random.h:44
Definition: saga.h:309
Definition: rect.h:144
Definition: palanim.h:37
Definition: render.h:51
T & front()
Definition: array.h:177
Definition: displayinfo.h:43
Definition: saga.h:417
Definition: sound.h:60
Definition: memstream.h:103
Definition: resource.h:199
Definition: script.h:272
Definition: actor.h:34
Definition: saga.h:304
Definition: ustr.h:57
Definition: scene.h:176
Definition: console.h:31
Definition: puzzle.h:37
Definition: rect.h:45
Definition: saga.h:393
Definition: saga.h:442
size_type size() const
Definition: array.h:275
Definition: saga.h:242
Definition: sprite.h:46
Definition: saga.h:398
Common::String getSaveStateName(int slot) const override
Definition: saga.h:470
uint size_type
Definition: array.h:59
Definition: animation.h:100
Definition: system.h:167
Definition: saga.h:248
Definition: music.h:44
Definition: gfx.h:140
Definition: engine.h:143
Definition: interface.h:176
Platform
Definition: platform.h:46
Definition: events.h:160
Language
Definition: language.h:45
Definition: advancedDetector.h:50