ScummVM API documentation
prince.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 PRINCE_PRINCE_H
23 #define PRINCE_PRINCE_H
24 
25 #include "common/random.h"
26 #include "common/system.h"
27 #include "common/debug.h"
28 #include "common/debug-channels.h"
29 #include "common/textconsole.h"
30 #include "common/rect.h"
31 #include "common/events.h"
32 #include "common/endian.h"
33 #include "common/savefile.h"
34 #include "common/serializer.h"
35 
36 #include "image/bmp.h"
37 
38 #include "gui/debugger.h"
39 
40 #include "engines/engine.h"
41 #include "engines/util.h"
42 
43 #include "audio/mixer.h"
44 
45 #include "video/flic_decoder.h"
46 
47 #include "prince/mob.h"
48 #include "prince/object.h"
49 #include "prince/pscr.h"
50 #include "prince/detection.h"
51 
52 namespace Prince {
53 
54 struct SavegameHeader;
55 
56 class PrinceEngine;
57 class GraphicsMan;
58 class Script;
59 class Interpreter;
60 class InterpreterFlags;
61 class Debugger;
62 class MusicPlayer;
63 class VariaTxt;
64 class Cursor;
65 class MhwanhDecoder;
66 class Font;
67 class Hero;
68 class Animation;
69 class Room;
70 class Pscr;
71 
73  uint8 version;
74  Common::String saveName;
75  Graphics::Surface *thumbnail;
76  int16 saveYear, saveMonth, saveDay;
77  int16 saveHour, saveMinutes;
78  uint32 playTime;
79 };
80 
81 #define kSavegameStrSize 14
82 #define kSavegameStr "SCUMMVM_PRINCE"
83 
84 struct Text {
85  const char *_str;
86  uint16 _x, _y;
87  uint16 _time;
88  uint32 _color;
89 
90  Text() {
91  clear();
92  }
93 
94  void clear() {
95  _str = nullptr;
96  _x = 0;
97  _y = 0;
98  _time = 0;
99  _color = 255;
100  }
101 };
102 
103 struct AnimListItem {
104  uint16 _type; // type of animation - for background anims RND of frame
105  uint16 _fileNumber;
106  uint16 _startPhase; // first phase number
107  uint16 _endPhase;
108  uint16 _loopPhase;
109  int16 _x;
110  int16 _y;
111  uint16 _loopType;
112  uint16 _nextAnim; // number of animation to do for loop = 3
113  uint16 _flags; // byte 0 - draw masks, byte 1 - draw in front of mask, byte 2 - load but turn off drawing
114  bool loadFromStream(Common::SeekableReadStream &stream);
115 };
116 
117 struct BAS {
118  int32 _type; // type of sequence
119  int32 _data; // additional data
120  int32 _anims; // number of animations
121  int32 _current; // actual number of animation
122  int32 _counter; // time counter for animation
123  int32 _currRelative; //actual relative number for animation
124  int32 _data2; // additional data for measurements
125 };
126 
127 const int kStructSizeBAS = 28;
128 
129 struct BASA {
130  int16 _num; // animation number
131  int16 _start; // initial frame
132  int16 _end; // final frame
133  //int16 _pad; // fulfilment to 8 bytes
134 };
135 
136 const int kStructSizeBASA = 8;
137 
138 // background and normal animation
139 struct Anim {
140  BASA _basaData;
141  int32 _addr; // animation address
142  int16 _usage;
143  int16 _state; // state of animation: 0 - turning on, 1 - turning off
144  int16 _flags;
145  int16 _frame; // number of phase to show
146  int16 _lastFrame; // last phase
147  int16 _loopFrame; // first frame of loop
148  int16 _showFrame; // actual visible frame of animation
149  int16 _loopType; // type of loop (0 - last frame; 1 - normal loop (begin from _loopFrame); 2 - no loop; 3 - load new animation)
150  int16 _nextAnim; // number of next animation to load after actual
151  int16 _x;
152  int16 _y;
153  int32 _currFrame;
154  int16 _currX;
155  int16 _currY;
156  int16 _currW;
157  int16 _currH;
158  int16 _packFlag;
159  int32 _currShadowFrame;
160  int16 _packShadowFlag;
161  int32 _shadowBack;
162  int16 _relX;
163  int16 _relY;
164  Animation *_animData;
165  Animation *_shadowData;
166 
167  enum AnimOffsets {
168  kAnimState = 10,
169  kAnimFrame = 14,
170  kAnimLastFrame = 16,
171  kAnimX = 26
172  };
173 
174  int16 getAnimData(Anim::AnimOffsets offset) {
175  switch (offset) {
176  case kAnimState:
177  return _state;
178  case kAnimFrame:
179  return _frame + 1; // fix for location 30 - man with a dog animation
180  case kAnimX:
181  return _x;
182  default:
183  error("getAnimData() - Wrong offset type: %d", (int)offset);
184  }
185  }
186 
187  void setAnimData(Anim::AnimOffsets offset, int16 value) {
188  if (offset == kAnimX) {
189  _x = value;
190  } else {
191  error("setAnimData() - Wrong offset: %d, value: %d", (int)offset, value);
192  }
193  }
194 };
195 
197  BAS _seq;
198  Common::Array<Anim> backAnims;
199 };
200 
201 enum AnimType {
202  kBackgroundAnimation,
203  kNormalAnimation
204 };
205 
206 // Nak (PL - Nakladka)
207 struct Mask {
208  uint16 _state; // visible / invisible
209  int16 _flags; // turning on / turning off of a mask
210  int16 _x1;
211  int16 _y1;
212  int16 _x2;
213  int16 _y2;
214  int16 _z;
215  int16 _number; // number of mask for background recreating
216  int16 _width;
217  int16 _height;
218  byte *_data;
219 
220  int16 getX() const {
221  return READ_LE_UINT16(_data);
222  }
223 
224  int16 getY() const {
225  return READ_LE_UINT16(_data + 2);
226  }
227 
228  int16 getWidth() const {
229  return READ_LE_UINT16(_data + 4);
230  }
231 
232  int16 getHeight() const {
233  return READ_LE_UINT16(_data + 6);
234  }
235 
236  byte *getMask() const {
237  return (byte *)(_data + 8);
238  }
239 };
240 
241 struct InvItem {
242  int _x;
243  int _y;
244  Graphics::Surface *_surface;
245  Graphics::Surface *getSurface() const { return _surface; }
246 };
247 
248 struct DrawNode {
249  int posX;
250  int posY;
251  int posZ;
252  int32 width;
253  int32 height;
254  int32 scaleValue;
256  Graphics::Surface *originalRoomSurface;
257  void *data;
258  void (*drawFunction)(Graphics::Surface *, DrawNode *);
259 };
260 
261 struct DebugChannel {
262 
263 enum Type {
264  kScript,
265  kEngine
266 };
267 
268 };
269 
270 class PrinceEngine : public Engine {
271 protected:
272  Common::Error run() override;
273 
274 public:
275  PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc);
276  ~PrinceEngine() override;
277 
278  bool scummVMSaveLoadDialog(bool isSave);
279 
280  bool hasFeature(EngineFeature f) const override;
281  void pauseEngineIntern(bool pause) override;
282  bool canSaveGameStateCurrently(Common::U32String *msg = nullptr) override;
283  bool canLoadGameStateCurrently(Common::U32String *msg = nullptr) override;
284  Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
285  Common::Error loadGameState(int slot) override;
286 
287  void playVideo(const Common::Path &videoFilename);
288 
289  WARN_UNUSED_RESULT static bool readSavegameHeader(Common::InSaveFile *in, SavegameHeader &header, bool skipThumbnail = true);
290  void writeSavegameHeader(Common::OutSaveFile *out, SavegameHeader &header);
291  void syncGame(Common::SeekableReadStream *readStream, Common::WriteStream *writeStream);
292  bool loadGame(int slotNumber);
293  void resetGame();
294 
295  int32 _creditsDataSize;
296  byte *_creditsData;
297  void scrollCredits();
298 
299  int getGameType() const;
300  const char *getGameId() const;
301  uint32 getFeatures() const;
302  Common::Language getLanguage() const;
303 
304  const PrinceGameDescription *_gameDescription;
305  Video::FlicDecoder _flicPlayer;
306  const Graphics::Surface *_flcFrameSurface;
307  VariaTxt *_variaTxt;
308 
309  uint32 _talkTxtSize;
310  byte *_talkTxt;
311 
312  uint32 _mobTranslationSize;
313  byte *_mobTranslationData;
314 
315  bool _missingVoice;
316 
317  bool loadLocation(uint16 locationNr);
318  bool loadAnim(uint16 animNr, bool loop);
319  bool loadVoice(uint32 textSlot, uint32 sampleSlot, const Common::String &name);
320  bool loadSample(uint32 sampleSlot, const Common::String &name);
321  bool loadZoom(byte *zoomBitmap, uint32 dataSize, const char *resourceName);
322  bool loadShadow(byte *shadowBitmap, uint32 dataSize, const char *resourceName1, const char *resourceName2);
323  bool loadTrans(byte *transTable, const char *resourceName);
324  bool loadMobPriority(const char *resourceName);
325 
326  void loadMobTranslationTexts();
327  void setMobTranslationTexts();
328 
329  bool loadMusic(int musNumber);
330  void stopMusic();
331 
332  void playSample(uint16 sampleId, uint16 loopType);
333  void stopSample(uint16 sampleId);
334  void stopAllSamples();
335  void freeSample(uint16 sampleId);
336  void freeAllSamples();
337 
338  void setVoice(uint16 slot, uint32 sampleSlot, uint16 flag);
339 
340  void changeCursor(uint16 curId);
341  void printAt(uint32 slot, uint8 color, char *s, uint16 x, uint16 y);
342  int calcTextLines(const char *s);
343  int calcTextTime(int numberOfLines);
344  void correctStringDEU(char *s);
345 
346  static const uint8 kMaxTexts = 32;
347  Text _textSlots[kMaxTexts];
348 
349  Hero *_mainHero;
350  Hero *_secondHero;
351 
352  enum HeroId {
353  kMainHero,
354  kSecondHero
355  };
356 
357  int _mouseFlag;
358  uint32 _currentTime;
359  uint16 _locationNr;
360  uint16 _sceneWidth;
361  int32 _picWindowX;
362  int32 _picWindowY;
363 
364  Image::BitmapDecoder *_roomBmp;
365  MhwanhDecoder *_suitcaseBmp;
366  Room *_room;
367  Script *_script;
368  InterpreterFlags *_flags;
369  Interpreter *_interpreter;
370  GraphicsMan *_graph;
371  uint8 _currentMidi;
372  byte *_zoomBitmap;
373  byte *_shadowBitmap;
374  byte *_transTable;
375 
376  int16 _scaleValue; // scale for hero or special shadow animation
377  int16 _lightX; // for hero shadow
378  int16 _lightY;
379  int32 _shadScaleValue;
380  int32 _shadLineLen;
381  byte *_shadowLine;
382  void setShadowScale(int32 shadowScale);
383  static void plotShadowLinePoint(int x, int y, int color, void *data);
384 
385  static const int16 kFPS = 15;
386  static const int32 kIntMax = 2147483647;
387 
388  static const int16 kMaxPicWidth = 1280;
389  static const int16 kMaxPicHeight = 480;
390  static const int16 kZoomStep = 4;
391  static const int32 kZoomBitmapLen = kMaxPicHeight / kZoomStep * kMaxPicWidth / kZoomStep;
392  static const int32 kShadowBitmapSize = kMaxPicWidth * kMaxPicHeight / 8;
393  static const int16 kShadowLineArraySize = 2 * 1280 * 4;
394  static const int16 kZoomBitmapWidth = kMaxPicWidth / kZoomStep;
395  static const int16 kZoomBitmapHeight = kMaxPicHeight / kZoomStep;
396  static const int16 kNormalWidth = 640;
397  static const int16 kNormalHeight = 480;
398  static const uint32 kTransTableSize = 256 * 256;
399 
400  static const int kMaxNormAnims = 64;
401  static const int kMaxBackAnims = 64;
402  static const int kMaxObjects = 64;
403  static const int kMaxMobs = 64;
404 
405  Common::Array<DrawNode> _drawNodeList;
406  Common::Array<AnimListItem> _animList;
407  Common::Array<BackgroundAnim> _backAnimList;
408  Common::Array<Anim> _normAnimList;
409  Common::Array<Mob> _mobList;
410  Common::Array<uint32> _mobPriorityList;
411  Common::Array<Mask> _maskList;
412  Common::Array<Object *> _objList;
413  uint16 *_objSlot;
414 
415  void freeNormAnim(int slot);
416  void freeAllNormAnims();
417  void removeSingleBackAnim(int slot);
418 
419  Common::RandomSource _randomSource;
420 
421  void checkMasks(int x1, int y1, int sprWidth, int sprHeight, int z);
422  void insertMasks(Graphics::Surface *originalRoomSurface);
423  void showMask(int maskNr, Graphics::Surface *originalRoomSurface);
424  void clsMasks();
425 
426  void grabMap();
427 
428  int _selectedMob; // number of selected Mob / inventory item
429  int _selectedItem; // number of item on mouse cursor
430  int _selectedMode;
431  int _currentPointerNumber;
432 
433  static const int16 kMaxInv = 90; // max amount of inventory items in whole game
434  static const uint16 kMaxItems = 30; // size of inventory
435 
436  uint32 _invTxtSize;
437  byte *_invTxt;
438 
439  Graphics::Surface *_optionsPic;
440  Graphics::Surface *_optionsPicInInventory;
441 
442  bool _optionsFlag;
443  int _optionEnabled;
444  int _optionsMob;
445  int _optionsX;
446  int _optionsY;
447  int _optionsWidth;
448  int _optionsHeight;
449  int _invOptionsWidth;
450  int _invOptionsHeight;
451  int _optionsStep;
452  int _invOptionsStep;
453  int _optionsNumber;
454  int _invOptionsNumber;
455  int _optionsColor1; // color for non-selected options
456  int _optionsColor2; // color for selected option
457 
458  bool _showInventoryFlag;
459  int _invExamY;
460  bool _inventoryBackgroundRemember;
461  int _invLineX;
462  int _invLineY;
463  int _invLine; // number of items in one line
464  int _invLines; // number of lines with inventory items
465  int _invLineW;
466  int _invLineH;
467  int _maxInvW;
468  int _maxInvH;
469  int _invLineSkipX;
470  int _invLineSkipY;
471  int _invX1;
472  int _invY1;
473  int _invWidth;
474  int _invHeight;
475  bool _invCurInside;
476  int _mst_shadow;
477  int _mst_shadow2; // blinking after adding new item
478  int _candleCounter; // special counter for candle inventory item
479  int _invMaxCount; // time to turn inventory on
480  int _invCounter; // turning on counter
481 
482  void inventoryFlagChange(bool inventoryState);
483  bool loadAllInv();
484  void rememberScreenInv();
485  void prepareInventoryToView();
486  void drawInvItems();
487  void displayInventory();
488  void addInv(int heroId, int item, bool addItemQuiet);
489  void remInv(int heroId, int item);
490  void clearInv(int heroId);
491  void swapInv(int heroId);
492  void addInvObj();
493  void makeInvCursor(int itemNr);
494  void enableOptions(bool checkType);
495  void checkOptions();
496  void checkInvOptions();
497  void openInventoryCheck();
498 
499  void leftMouseButton();
500  void rightMouseButton();
501  void inventoryLeftMouseButton();
502  void inventoryRightMouseButton();
503  void dialogLeftMouseButton(byte *string, int dialogSelected);
504 
505  uint32 _dialogDatSize;
506  byte *_dialogDat;
507  byte *_dialogData; // on, off flags for lines of dialog text
508 
509  byte *_dialogBoxAddr[32]; // adresses of dialog windows
510  byte *_dialogOptAddr[32]; // adresses of dialog options
511  int _dialogOptLines[4 * 32]; // numbers of initial dialog lines
512 
513  byte *_dialogText;
514  int _dialogLines;
515  bool _dialogFlag;
516  int _dialogWidth;
517  int _dialogHeight;
518  int _dialogLineSpace;
519  int _dialogColor1; // color for non-selected options
520  int _dialogColor2; // color for selected option
521  Graphics::Surface *_dialogImage;
522 
523  void createDialogBox(int dialogBoxNr);
524  void dialogRun();
525  void talkHero(int slot);
526  void doTalkAnim(int animNumber, int slot, AnimType animType);
527 
528  static const uint8 zoomInStep = 8;
529  void initZoomIn(int slot);
530  void initZoomOut(int slot);
531  void doZoomIn(int slot);
532  void doZoomOut(int slot);
533  void freeZoomObject(int slot);
534 
535  static const uint8 kFadeStep = 4;
536  void blackPalette();
537  void setPalette(const byte *palette);
538 
539  int getMob(Common::Array<Mob> &mobList, bool usePriorityList, int posX, int posY);
540 
541  // 'Throw a rock' mini-game:
542  static const int16 kCurveLen = 17;
543  static const int kCelStep = 4;
544  int16 *_curveData;
545  int _curvPos;
546  void makeCurve();
547  void getCurve();
548  void mouseWeirdo();
549 
550  static const uint16 kPowerBarPosX = 288;
551  static const uint16 kPowerBarPosY = 430;
552  static const uint8 kPowerBarWidth = 64;
553  static const uint8 kPowerBarHeight = 16;
554  static const uint8 kPowerBarBackgroundColor = 0;
555  static const uint16 kPowerBarGreenPosY = 434;
556  static const uint8 kPowerBarGreenColor1 = 202;
557  static const uint8 kPowerBarGreenColor2 = 235;
558  static const uint8 kPowerBarGreenHeight = 8;
559  void showPower();
560 
561  // Pathfinding
562  static const int16 kPathGridStep = 2;
563  static const uint32 kPathBitmapLen = (kMaxPicHeight / kPathGridStep * kMaxPicWidth / kPathGridStep) / 8;
564  static const int32 kTracePts = 8000;
565  static const int32 kPBW = kMaxPicWidth / 16; // PathBitmapWidth
566  static const int kMinDistance = 2500;
567 
568  byte *_roomPathBitmap; // PL - Sala
569  byte *_roomPathBitmapTemp; // PL - SSala
570  byte *_coordsBufEnd;
571  byte *_coordsBuf; // optimal path
572  byte *_coords; // last path point address from coordsBuf
573  byte *_coordsBuf2;
574  byte *_coords2;
575  byte *_coordsBuf3;
576  byte *_coords3;
577  int _traceLineLen;
578  bool _traceLineFirstPointFlag; // if plotTraceLine after first point
579  bool _tracePointFirstPointFlag; // if plotTracePoint after first point
580  byte *_directionTable;
581  int _shanLen;
582 
583  byte *_checkBitmapTemp;
584  byte *_checkBitmap;
585  int _checkMask;
586  int _checkX;
587  int _checkY;
588 
589  byte *_rembBitmapTemp;
590  byte *_rembBitmap;
591  int _rembMask;
592  int _rembX;
593  int _rembY;
594 
595  int _fpX;
596  int _fpY;
597 
598  int drawLine(int x0, int y0, int x1, int y1, int (*plotProc)(int, int, void *), void *data);
599  bool loadPath(const char *resourceName);
600  byte *makePath(int heroId, int currX, int currY, int destX, int destY);
601  void findPoint(int x, int y);
602  int getPixelAddr(byte *pathBitmap, int x, int y);
603  static int plotTraceLine(int x, int y, void *data);
604  void specialPlotInside(int x, int y);
605  bool tracePath(int x1, int y1, int x2, int y2);
606  Direction makeDirection(int x1, int y1, int x2, int y2);
607  void specialPlot(int x, int y);
608  void specialPlot2(int x, int y);
609  void allocCoords2();
610  void freeCoords2();
611  void freeCoords3();
612  static int plotTracePoint(int x, int y, void *data);
613  void specialPlotInside2(int x, int y);
614  void approxPath();
615  void freeDirectionTable();
616  void scanDirections();
617  int scanDirectionsFindNext(byte *coords, int xDiff, int yDiff);
618  void moveShandria();
619  void walkTo();
620  void moveRunHero(int heroId, int x, int y, int dir, bool runHeroFlag);
621 
622  int leftDownDir();
623  int leftDir();
624  int leftUpDir();
625  int rightDownDir();
626  int rightDir();
627  int rightUpDir();
628  int upLeftDir();
629  int upDir();
630  int upRightDir();
631  int downLeftDir();
632  int downDir();
633  int downRightDir();
634 
635  int cpe();
636  int checkLeftDownDir();
637  int checkLeftDir();
638  int checkDownDir();
639  int checkUpDir();
640  int checkRightDir();
641  int checkLeftUpDir();
642  int checkRightDownDir();
643  int checkRightUpDir();
644 
645 private:
646  bool playNextFLCFrame();
647  void keyHandler(Common::Event event);
648  int checkMob(Graphics::Surface *screen, Common::Array<Mob> &mobList, bool usePriorityList);
649  void drawScreen();
650  void showTexts(Graphics::Surface *screen);
651  void init();
652  void showLogo();
653  void showAnim(Anim &anim);
654  void showNormAnims();
655  void setBackAnim(Anim &backAnim);
656  void showBackAnims();
657  void clearBackAnimList();
658  bool spriteCheck(int sprWidth, int sprHeight, int destX, int destY);
659  void showSprite(Graphics::Surface *spriteSurface, int destX, int destY, int destZ);
660  void showSpriteShadow(Graphics::Surface *shadowSurface, int destX, int destY, int destZ);
661  void showObjects();
662  void showParallax();
663  static bool compareDrawNodes(DrawNode d1, DrawNode d2);
664  void runDrawNodes();
665  void makeShadowTable(int brightness);
666  void pausePrinceEngine(int fps = kFPS);
667 
668  uint32 getTextWidth(const char *s);
669  void debugEngine(const char *s, ...);
670 
671  uint8 _cursorNr;
672 
673  Common::RandomSource *_rnd;
674  Cursor *_cursor1;
675  Graphics::Surface *_cursor2;
676  Cursor *_cursor3;
677  Debugger *_debugger;
678  Font *_font;
679  MusicPlayer *_midiPlayer;
680 
681  static const int kMaxSamples = 60;
682  Audio::RewindableAudioStream *_audioStream[kMaxSamples];
683  Audio::SoundHandle _soundHandle[kMaxSamples];
684 
685  Common::Array<PScr *> _pscrList;
686  Common::Array<InvItem> _allInvList;
687  Common::Array<Mob> _invMobList;
688 
689  bool _flicLooped;
690 
691  void mainLoop();
692 
693 };
694 
695 } // End of namespace Prince
696 
697 #endif
Definition: prince.h:72
Definition: prince.h:248
Definition: prince.h:241
Definition: str.h:59
Definition: cursor.h:31
Definition: surface.h:67
EngineFeature
Definition: engine.h:253
Definition: prince.h:196
Definition: music.h:32
Definition: prince.h:270
Definition: stream.h:77
Definition: savefile.h:54
Definition: error.h:84
Definition: hero.h:40
Definition: mhwanh.h:34
Definition: array.h:52
Definition: prince.h:117
Definition: random.h:44
Definition: detection.h:42
Definition: path.h:52
Definition: font.h:32
Definition: stream.h:745
Definition: mixer.h:49
Definition: flic_decoder.h:49
Definition: prince.h:261
Definition: animation.h:32
Definition: animation.h:30
Definition: script.h:86
Definition: ustr.h:57
Definition: atari-cursor.h:38
Definition: prince.h:84
Definition: prince.h:129
Definition: events.h:199
bool skipThumbnail(Common::SeekableReadStream &in)
Definition: script.h:41
Definition: variatxt.h:26
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
Definition: audiostream.h:109
Definition: script.h:175
Definition: script.h:160
Definition: graphics.h:33
Definition: system.h:161
Definition: prince.h:207
Definition: bmp.h:68
Definition: engine.h:144
Definition: prince.h:139
Definition: debugger.h:33
Definition: prince.h:103
Language
Definition: language.h:45