ScummVM API documentation
eobcommon.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 KYRA_EOBCOMMON_H
23 #define KYRA_EOBCOMMON_H
24 
25 #if defined(ENABLE_EOB) || defined(ENABLE_LOL)
26 #include "kyra/engine/kyra_rpg.h"
27 #endif // (ENABLE_EOB || ENABLE_LOL)
28 
29 #ifdef ENABLE_EOB
30 
31 namespace Common {
32 class Keymap;
33 }
34 
35 namespace Kyra {
36 
37 #define releaseShpArr(shapes, num) \
38 if (shapes) { \
39  for (int iii = 0; iii < num; iii++) { \
40  if (shapes[iii]) \
41  delete[] shapes[iii]; \
42  } \
43  delete[] shapes; \
44 } \
45 shapes = 0
46 
47 struct DarkMoonShapeDef {
48  int16 index;
49  uint8 x, y, w, h;
50 };
51 
52 struct CreatePartyModButton {
53  uint8 encodeLabelX;
54  uint8 encodeLabelY;
55  uint8 labelW;
56  uint8 labelH;
57  uint8 labelX;
58  uint8 labelY;
59  uint8 bodyIndex;
60  uint8 destX;
61  uint8 destY;
62 };
63 
64 struct EoBRect8 {
65  uint8 x;
66  uint8 y;
67  uint8 w;
68  uint8 h;
69 };
70 
71 struct EoBChargenButtonDef {
72  uint16 x;
73  uint8 y;
74  uint8 w;
75  uint8 h;
76  uint8 keyCode;
77 };
78 
79 struct EoBGuiButtonDef {
80  uint16 keyCode;
81  uint16 keyCode2;
82  uint16 flags;
83  uint16 x;
84  uint8 y;
85  uint16 w;
86  uint8 h;
87  uint16 arg;
88 };
89 
90 struct EoBCharacter {
91  uint8 id;
92  uint8 flags;
93  char name[21];
94  int8 strengthCur;
95  int8 strengthMax;
96  int8 strengthExtCur;
97  int8 strengthExtMax;
98  int8 intelligenceCur;
99  int8 intelligenceMax;
100  int8 wisdomCur;
101  int8 wisdomMax;
102  int8 dexterityCur;
103  int8 dexterityMax;
104  int8 constitutionCur;
105  int8 constitutionMax;
106  int8 charismaCur;
107  int8 charismaMax;
108  int16 hitPointsCur;
109  int16 hitPointsMax;
110  int8 armorClass;
111  uint8 disabledSlots;
112  uint8 raceSex;
113  uint8 cClass;
114  uint8 alignment;
115  int8 portrait;
116  uint8 food;
117  uint8 level[3];
118  uint32 experience[3];
119  const uint8 *faceShape;
120  const uint8 *nameShape;
121 
122  int8 mageSpells[80];
123  int8 clericSpells[80];
124  uint32 mageSpellsAvailableFlags;
125 
126  Item inventory[27];
127  uint32 timers[10];
128  int8 events[10];
129  uint8 effectsRemainder[4];
130  uint32 effectFlags;
131  uint8 damageTaken;
132  int8 slotStatus[5];
133 
134  int8 gfxUpdateCountdown;
135 };
136 
137 struct EoBItem {
138  uint8 nameUnid;
139  uint8 nameId;
140  uint8 flags;
141  int8 icon;
142  int8 type;
143  int8 pos;
144  int16 block;
145  Item next;
146  Item prev;
147  uint8 level;
148  int8 value;
149 };
150 
151 struct EoBItemType {
152  uint16 invFlags;
153  uint16 handFlags;
154  int8 armorClass;
155  int8 allowedClasses;
156  int8 requiredHands;
157  int8 dmgNumDiceS;
158  int8 dmgNumPipsS;
159  int8 dmgIncS;
160  int8 dmgNumDiceL;
161  int8 dmgNumPipsL;
162  int8 dmgIncL;
163  uint8 unk1;
164  uint16 extraProperties;
165 };
166 
167 struct SpriteDecoration {
168  uint8 *shp;
169  int16 x;
170  int16 y;
171 };
172 
173 struct EoBMonsterProperty {
174  int8 armorClass;
175  int8 hitChance;
176  int8 level;
177  uint8 hpDcTimes;
178  uint8 hpDcPips;
179  uint8 hpDcBase;
180  uint8 attacksPerRound;
181  struct DmgDc {
182  uint8 times;
183  uint8 pips;
184  int8 base;
185  } dmgDc[3];
186  uint16 immunityFlags;
187  uint32 capsFlags;
188  uint32 typeFlags;
189  int32 experience;
190 
191  uint8 u30;
192  int8 sound1;
193  int8 sound2;
194  uint8 numRemoteAttacks;
195  uint8 remoteWeaponChangeMode;
196  uint8 numRemoteWeapons;
197 
198  int8 remoteWeapons[5];
199 
200  int8 tuResist;
201  uint8 dmgModifierEvade;
202 
203  uint8 decorations[3];
204 };
205 
206 struct EoBMonsterInPlay {
207  uint8 type;
208  uint8 unit;
209  uint16 block;
210  uint8 pos;
211  int8 dir;
212  uint8 animStep;
213  uint8 shpIndex;
214  int8 mode;
215  int8 stray;
216  int8 curAttackFrame;
217  uint8 animProgress;
218  uint8 animType;
219  int8 spellStatusLeft;
220  int16 hitPointsMax;
221  int16 hitPointsCur;
222  uint16 dest;
223  uint16 randItem;
224  uint16 fixedItem;
225  uint8 flags;
226  uint8 idleAnimState;
227  uint8 curRemoteWeapon;
228  uint8 numRemoteAttacks;
229  int8 palette;
230  uint8 directionChanged;
231  uint8 stepsTillRemoteAttack;
232  uint8 sub;
233 };
234 
235 struct ScriptTimer {
236  uint16 func;
237  uint16 ticks;
238  uint32 next;
239 };
240 
241 struct EoBMenuDef {
242  int8 titleStrId;
243  uint8 dim;
244  uint8 firstButtonStrId;
245  int8 numButtons;
246  int8 titleCol;
247 };
248 
249 struct EoBMenuButtonDef {
250  int8 labelId;
251  int16 x;
252  int16 y;
253  uint8 width;
254  uint8 height;
255  int16 keyCode;
256  int16 flags;
257 };
258 
259 class EoBInfProcessor;
260 
261 class EoBCoreEngine : public KyraRpgEngine {
262 friend class TextDisplayer_rpg;
263 friend class GUI_EoB;
264 friend class Debugger_EoB;
265 friend class EoBInfProcessor;
266 friend class DarkmoonSequenceHelper;
267 friend class CharacterGenerator;
268 friend class TransferPartyWiz;
269 public:
270  EoBCoreEngine(OSystem *system, const GameFlags &flags);
271  ~EoBCoreEngine() override;
272 
273  static Common::Array<Common::Keymap *> initKeymaps(const Common::String &ameId);
274 
275  Screen *screen() override { return _screen; }
276  GUI *gui() const override { return _gui; }
277 
278 protected:
279  // Startup
280  Common::Error init() override;
281  void loadFonts();
282  Common::Error go() override;
283 
284  // Main Menu, Intro, Finale
285  virtual int mainMenu() = 0;
286  virtual void seq_xdeath() {}
287  virtual void seq_playFinale() = 0;
288  bool _playFinale;
289 
290  //Init, config
291  virtual void loadItemsAndDecorationsShapes();
292  void releaseItemsAndDecorationsShapes();
293 
294  void initButtonData();
295  void initMenus();
296  void initStaticResource();
297  virtual void initSpells();
298 
299  void registerDefaultSettings() override;
300  void readSettings() override;
301  void writeSettings() override;
302 
303  const uint8 **_largeItemShapes;
304  const uint8 **_smallItemShapes;
305  const uint8 **_thrownItemShapes;
306  const uint8 **_largeItemShapesScl[3];
307  const uint8 **_smallItemShapesScl[3];
308  const uint8 **_thrownItemShapesScl[3];
309  const uint8 **_blueItemIconShapes;
310  const uint8 **_xtraItemIconShapes;
311  const int _numLargeItemShapes;
312  const int _numSmallItemShapes;
313  const int _numThrownItemShapes;
314  const int _numItemIconShapes;
315 
316  const uint8 **_spellShapes;
317  const uint8 **_firebeamShapes;
318  const uint8 *_redSplatShape;
319  const uint8 *_greenSplatShape;
320  const uint8 **_wallOfForceShapes;
321  const uint8 **_teleporterShapes;
322  const uint8 **_sparkShapes;
323  const uint8 *_deadCharShape;
324  const uint8 *_disabledCharGrid;
325  const uint8 *_blackBoxSmallGrid;
326  const uint8 *_weaponSlotGrid;
327  const uint8 *_blackBoxWideGrid;
328  const uint8 *_lightningColumnShape;
329 
330  uint8 *_redSplatBG[6];
331  uint8 *_itemsOverlay;
332  static const uint8 _itemsOverlayCGA[];
333 
334  static const uint8 _teleporterShapeDefs[];
335  static const uint8 _wallOfForceShapeDefs[];
336 
337  const char *const *_mainMenuStrings;
338 
339  // Main loop
340  virtual void startupNew();
341  virtual void startupLoad() = 0;
342  virtual void startupReset() {}
343  void runLoop();
344  void update() override { screen()->updateScreen(); }
345  bool checkPartyStatus(bool handleDeath);
346  void updateAnimations();
347 
348  bool _runFlag;
349 
350  // Character generation / party transfer
351  bool startCharacterGeneration(bool defaultParty);
352  bool startPartyTransfer();
353 
354  const uint8 **_faceShapes;
355  const uint8 *_wndBackgrnd;
356 
357  static const int8 _characterClassType[];
358  static const uint8 _hpIncrPerLevel[];
359  static const uint8 _numLevelsPerClass[];
360  static const int16 _hpConstModifiers[];
361  static const uint8 _charClassModifier[];
362 
363  const uint8 *_classModifierFlags;
364 
365  // timers
366  void setupTimers() override;
367  void enableSysTimer(int sysTimer) override;
368  void disableSysTimer(int sysTimer) override;
369  void setCharEventTimer(int charIndex, uint32 countdown, int evnt, int updateExistingTimer);
370  void deleteCharEventTimer(int charIndex, int evnt);
371  void setupCharacterTimers();
372  void advanceTimers(uint32 millis);
373 
374  void timerProcessMonsters(int timerNum);
375  void timerSpecialCharacterUpdate(int timerNum);
376  void timerProcessFlyingObjects(int timerNum);
377  void timerProcessCharacterExchange(int timerNum);
378  void timerUpdateTeleporters(int timerNum);
379  void timerUpdateFoodStatus(int timerNum);
380  void timerUpdateMonsterIdleAnim(int timerNum);
381 
382  uint8 getClock2Timer(int index) override { return index < _numClock2Timers ? _clock2Timers[index] : 0; }
383  uint8 getNumClock2Timers() override { return _numClock2Timers; }
384 
385  static const uint8 _clock2Timers[];
386  static const uint8 _numClock2Timers;
387 
388  uint32 _disableElapsedTime;
389  uint32 _restPartyElapsedTime;
390 
391  uint32 _lastVIntTick;
392  uint32 _totalEnemiesKilled;
393  uint32 _totalSteps;
394 
395  // Mouse
396  void setHandItem(Item itemIndex) override;
397 
398  // Characters
399  int getDexterityArmorClassModifier(int dexterity);
400  int generateCharacterHitpointsByLevel(int charIndex, int levelIndex);
401  int getClassAndConstHitpointsModifier(int cclass, int constitution);
402  int getCharacterClassType(int cclass, int levelIndex);
403  int getModifiedHpLimits(int hpModifier, int constModifier, int level, bool mode);
404  Common::String getCharStrength(int str, int strExt, bool twoDigitsPadding = false);
405  int testCharacter(int16 index, int flags);
406  int getNextValidCharIndex(int curCharIndex, int searchStep);
407 
408  void recalcArmorClass(int index);
409  int validateWeaponSlotItem(int index, int slot);
410 
411  int getClericPaladinLevel(int index);
412  int getMageLevel(int index);
413  int getCharacterLevelIndex(int type, int cClass);
414 
415  int countCharactersWithSpecificItems(int16 itemType, int16 itemValue);
416  int checkInventoryForItem(int character, int16 itemType, int16 itemValue);
417  void modifyCharacterHitpoints(int character, int16 points);
418  void neutralizePoison(int character);
419 
420  void npcSequence(int npcIndex);
421  virtual void drawNpcScene(int npcIndex) = 0;
422  virtual void runNpcDialogue(int npcIndex) = 0;
423  void initNpc(int npcIndex);
424  int npcJoinDialogue(int npcIndex, int queryJoinTextId, int confirmJoinTextId, int noJoinTextId);
425  int prepareForNewPartyMember(int16 itemType, int16 itemValue);
426  void dropCharacter(int charIndex);
427  void removeCharacterFromParty(int charIndex);
428  void exchangeCharacters(int charIndex1, int charIndex2);
429 
430  void increasePartyExperience(int16 points);
431  void increaseCharacterExperience(int charIndex, int32 points);
432  uint32 getRequiredExperience(int cClass, int levelIndex, int level);
433  void increaseCharacterLevel(int charIndex, int levelIndex);
434 
435  void setWeaponSlotStatus(int charIndex, int mode, int slot);
436 
437  EoBCharacter *_characters;
438  Common::String _strenghtStr;
439  int _castScrollSlot;
440  int _exchangeCharacterId;
441 
442  const char *const *_levelGainStrings;
443  const uint32 *_expRequirementTables[6];
444 
445  const uint8 *_saveThrowTables[6];
446  const uint8 *_saveThrowLevelIndex;
447  const uint8 *_saveThrowModDiv;
448  const uint8 *_saveThrowModExt;
449 
450  const EoBCharacter *_npcPreset;
451  const char *const *_npcPresetNames;
452  int _npcSequenceSub;
453  bool _partyResting;
454  bool _loading;
455 
456  // Items
457  virtual Common::SeekableReadStreamEndian *getItemDefinitionFile(int index);
458  void loadItemDefs();
459  Item duplicateItem(Item itemIndex);
460  void setItemPosition(Item *itemQueue, int block, Item item, int pos);
461  Item createItemOnCurrentBlock(Item itemIndex);
462  void createInventoryItem(EoBCharacter *c, Item itemIndex, int16 itemValue, int preferedInventorySlot);
463  int deleteInventoryItem(int charIndex, int slot);
464  void deleteBlockItem(uint16 block, int type);
465  int validateInventorySlotForItem(Item item, int charIndex, int slot);
466  int stripPartyItems(int16 itemType, int16 itemValue, int handleValueMode, int numItems);
467  bool deletePartyItems(int16 itemType, int16 itemValue);
468  virtual void updateUsedCharacterHandItem(int charIndex, int slot) = 0;
469  int itemUsableByCharacter(int charIndex, Item item) const;
470  int countQueuedItems(Item itemQueue, int16 id, int16 type, int count, int includeFlyingItems) const;
471  int getQueuedItem(Item *items, int pos, int id);
472  void printFullItemName(Item item);
473  void identifyQueuedItems(Item itemQueue);
474  void drawItemIconShape(int pageNum, Item itemId, int x, int y);
475  bool isMagicEffectItem(Item itemIndex);
476  bool checkInventoryForRings(int charIndex, int itemValue);
477  void eatItemInHand(int charIndex);
478 
479  bool launchObject(int charIndex, Item item, uint16 startBlock, int startPos, int dir, int type);
480  void launchMagicObject(int charIndex, int type, uint16 startBlock, int startPos, int dir);
481  bool updateObjectFlight(EoBFlyingObject *fo, int block, int pos);
482  bool updateFlyingObjectHitTest(EoBFlyingObject *fo, int block, int pos);
483  void explodeObject(EoBFlyingObject *fo, int block, Item item);
484  void endObjectFlight(EoBFlyingObject *fo);
485  void checkFlyingObjects();
486 
487  void reloadWeaponSlot(int charIndex, int slotIndex, int itemType, int arrowOrDagger);
488 
489  EoBItem *_items;
490  uint16 _numItems;
491  EoBItemType *_itemTypes;
492  char **_itemNames;
493  uint16 _numItemNames;
494  int _numItemNamesStatic;
495  const char * const *_itemNamesStatic;
496  uint32 _partyEffectFlags;
497  Item _lastUsedItem;
498 
499  const uint16 *_slotValidationFlags;
500  const int8 *_projectileWeaponAmmoTypes;
501  const uint8 *_wandTypes;
502 
503  EoBFlyingObject *_flyingObjects;
504  const uint8 *_drawObjPosIndex;
505  const uint8 *_flightObjFlipIndex;
506  const int8 *_flightObjShpMap;
507  const int8 *_flightObjSclIndex;
508 
509  const uint8 *_expObjectTlMode;
510  const uint8 *_expObjectTblIndex;
511  const uint8 *_expObjectShpStart;
512  const uint8 *_expObjectAnimTbl1;
513  int _expObjectAnimTbl1Size;
514  const uint8 *_expObjectAnimTbl2;
515  int _expObjectAnimTbl2Size;
516  const uint8 *_expObjectAnimTbl3;
517  int _expObjectAnimTbl3Size;
518 
519  const char *const *_ascii2SjisTables;
520  const char *const *_ascii2SjisTables2;
521 
522  // Monsters
523  virtual void loadMonsterShapes(const char *filename, int monsterIndex, bool hasDecorations, int encodeTableIndex);
524  void releaseMonsterShapes(int first, int num);
525  virtual void generateMonsterPalettes(const char *file, int16 monsterIndex) {}
526  virtual void loadMonsterDecoration(Common::SeekableReadStream *stream, int16 monsterIndex) {}
527  virtual const uint8 *loadMonsterProperties(const uint8 *data) { return 0; }
528  const uint8 *loadActiveMonsterData(const uint8 *data, int level);
529  void initMonster(int index, int unit, uint16 block, int pos, int dir, int type, int shpIndex, int mode, int i, int randItem, int fixedItem);
530  void placeMonster(EoBMonsterInPlay *m, uint16 block, int dir);
531  virtual void replaceMonster(int b, uint16 block, int pos, int dir, int type, int shpIndex, int mode, int h2, int randItem, int fixedItem) = 0;
532  void killMonster(EoBMonsterInPlay *m, bool giveExperience);
533  virtual bool killMonsterExtra(EoBMonsterInPlay *m) = 0;
534  int countSpecificMonsters(int type);
535  void updateAttackingMonsterFlags();
536 
537  const int8 *getMonstersOnBlockPositions(uint16 block);
538  int getClosestMonster(int charIndex, int block);
539 
540  bool blockHasMonsters(uint16 block);
541  bool isMonsterOnPos(EoBMonsterInPlay *m, uint16 block, int pos, int checkPos4);
542  const int16 *findBlockMonsters(uint16 block, int pos, int dir, int blockDamage, int singleTargetCheckAdjacent);
543 
544  void drawBlockObject(int flipped, int page, const uint8 *shape, int x, int y, int sd, uint8 *ovl = 0);
545  void drawMonsterShape(const uint8 *shape, int x, int y, int flipped, int flags, int palIndex);
546  void flashMonsterShape(EoBMonsterInPlay *m);
547  void updateAllMonsterShapes();
548  void drawBlockItems(int index);
549  void drawDoor(int index);
550  virtual void drawDoorIntern(int type, int index, int x, int y, int w, int wall, int mDim, int16 y1, int16 y2) = 0;
551  void drawMonsters(int index);
552  void drawWallOfForce(int index);
553  void drawFlyingObjects(int index);
554  void drawTeleporter(int index);
555 
556  void updateMonsters(int unit);
557  void updateMonsterDest(EoBMonsterInPlay *m);
558  void updateMonsterAttackMode(EoBMonsterInPlay *m);
559  void updateAllMonsterDests();
560  void turnFriendlyMonstersHostile();
561  int getNextMonsterDirection(int curBlock, int destBlock);
562  int getNextMonsterPos(EoBMonsterInPlay *m, int block);
563  int findFreeMonsterPos(int block, int size);
564  void updateMoveMonster(EoBMonsterInPlay *m);
565  bool updateMonsterTryDistanceAttack(EoBMonsterInPlay *m);
566  bool updateMonsterTryCloseAttack(EoBMonsterInPlay *m, int block);
567  void walkMonster(EoBMonsterInPlay *m, int destBlock);
568  bool walkMonsterNextStep(EoBMonsterInPlay *m, int destBlock, int direction);
569  void updateMonsterFollowPath(EoBMonsterInPlay *m, int turnSteps);
570  void updateMonstersStraying(EoBMonsterInPlay *m, int a);
571  void updateMonstersSpellStatus(EoBMonsterInPlay *m);
572  void setBlockMonsterDirection(int block, int dir);
573 
574  uint8 *_monsterFlashOverlay;
575  uint8 *_monsterStoneOverlay;
576  int16 _shapeShakeOffsetX;
577  int16 _shapeShakeOffsetY;
578 
579  SpriteDecoration *_monsterDecorations;
580  EoBMonsterProperty *_monsterProps;
581 
582  EoBMonsterInPlay *_monsters;
583 
584  const int8 *_monsterStepTable0;
585  const int8 *_monsterStepTable1;
586  const int8 *_monsterStepTable2;
587  const int8 *_monsterStepTable3;
588  const uint8 *_monsterCloseAttPosTable1;
589  const uint8 *_monsterCloseAttPosTable2;
590  const int8 *_monsterCloseAttUnkTable;
591  const uint8 *_monsterCloseAttChkTable1;
592  const uint8 *_monsterCloseAttChkTable2;
593  const uint8 *_monsterCloseAttDstTable1;
594  const uint8 *_monsterCloseAttDstTable2;
595 
596  const uint8 *_monsterProximityTable;
597  const uint8 *_findBlockMonstersTable;
598  const char *const *_monsterDustStrings;
599 
600  const uint8 *_enemyMageSpellList;
601  const uint8 *_enemyMageSfx;
602  const uint8 *_beholderSpellList;
603  const uint8 *_beholderSfx;
604  const char *const *_monsterSpecAttStrings;
605 
606  const int8 *_monsterFrmOffsTable1;
607  const int8 *_monsterFrmOffsTable2;
608 
609  const uint16 *_encodeMonsterShpTable;
610  const uint8 _teleporterWallId;
611 
612  const int16 *_wallOfForceDsX;
613  const uint8 *_wallOfForceDsY;
614  const uint8 *_wallOfForceDsNumW;
615  const uint8 *_wallOfForceDsNumH;
616  const uint8 *_wallOfForceShpId;
617 
618  const int8 *_monsterDirChangeTable;
619 
620  // Level
621  void loadLevel(int level, int sub);
622  virtual void readLevelFileData(int level);
623  Common::String initLevelData(int sub);
624  void addLevelItems() override;
625  virtual void loadVcnData(const char *file, const uint8 *cgaMapping);
626  virtual Common::SeekableReadStreamEndian *getVmpData(const char *file);
627  void loadBlockProperties(const char *mazFile) override;
628  const uint8 *getBlockFileData(int levelIndex) override;
629  const uint8 *getBlockFileData(const char *mazFile);
630  Common::String getBlockFileName(int levelIndex, int sub);
631  void loadDecorations(const char *cpsFile, const char *decFile);
632  virtual Common::SeekableReadStreamEndian *getDecDefinitions(const char *decFile);
633  virtual void loadDecShapesToPage3(const char *shpFile);
634  void assignWallsAndDecorations(int wallIndex, int vmpIndex, int decDataIndex, int specialType, int flags);
635  void releaseDecorations();
636  void releaseDoorShapes();
637  void resetWallData();
638  void toggleWallState(int wall, int flags);
639  virtual void loadDoorShapes(int doorType1, int shapeId1, int doorType2, int shapeId2) = 0;
640  virtual const uint8 *loadDoorShapes(const char *filename, int doorIndex, const uint8 *shapeDefs) = 0;
641  virtual void setLevelPalettes(int level) {}
642 
643  void drawScene(int refresh);
644  void drawSceneShapes(int start = 0, int end = 18, int drawFlags = 0xFF);
645  void drawDecorations(int index);
646 
647  int calcNewBlockPositionAndTestPassability(uint16 curBlock, uint16 direction);
648  void notifyBlockNotPassable();
649  void increaseStepsCounter();
650  void moveParty(uint16 block);
651 
652  int clickedDoorSwitch(uint16 block, uint16 direction) override;
653  int clickedDoorPry(uint16 block, uint16 direction);
654  int clickedDoorNoPry(uint16 block, uint16 direction);
655  int clickedNiche(uint16 block, uint16 direction) override;
656 
657  int specialWallAction(int block, int direction);
658 
659  void openDoor(int block);
660  void closeDoor(int block);
661 
662  void addLevelMap(int level);
663  bool hasLevelMap(int level) const;
664  uint32 countMaps() const;
665  uint32 countArrows() const;
666 
667  int16 _doorType[2];
668  int16 _noDoorSwitch[2];
669 
670  EoBRect8 *_levelDecorationRects;
671  SpriteDecoration *_doorSwitches;
672  const uint8 *_dcrShpDataPos;
673 
674  int8 _currentSub;
675  Common::String _curGfxFile;
676  Common::String _curBlockFile;
677  Common::String _vcnFilePattern;
678  Common::String _vmpFilePattern;
679 
680  uint32 _drawSceneTimer;
681  uint32 _flashShapeTimer;
682  uint32 _flashShapeTimerIntv0;
683  uint32 _flashShapeTimerIntv1;
684  uint32 _flashShapeTimerIntv2;
685  uint32 _envAudioTimer;
686  uint16 _teleporterPulse;
687 
688  Common::Array<const int16 *> _dscWallMapping;
689  const int16 *_dscShapeCoords;
690 
691  const uint8 *_dscItemPosIndex;
692  const int16 *_dscItemShpX;
693  const uint8 *_dscItemScaleIndex;
694  const uint8 *_dscItemTileIndex;
695  const uint8 *_dscItemShapeMap;
696 
697  const uint8 *_dscDoorScaleMult1;
698  const uint8 *_dscDoorScaleMult2;
699  const uint8 *_dscDoorScaleMult3;
700  const uint8 *_dscDoorY1;
701  const uint8 *_dscDoorXE;
702 
703  uint8 *_greenFadingTable;
704  uint8 *_blueFadingTable;
705  uint8 *_lightBlueFadingTable;
706  uint8 *_blackFadingTable;
707  uint8 *_greyFadingTable;
708 
709  const uint8 *_wllFlagPreset;
710  int _wllFlagPresetSize;
711  const uint8 *_teleporterShapeCoords;
712  const int8 *_portalSeq;
713 
714  uint32 _levelMaps;
715 
716  // Script
717  void runLevelScript(int block, int flags) override;
718  void setScriptFlags(uint32 flags);
719  void clearScriptFlags(uint32 flags);
720  bool checkScriptFlags(uint32 flags);
721 
722  const uint8 *initScriptTimers(const uint8 *pos);
723  void updateScriptTimers();
724  virtual void updateScriptTimersExtra() {}
725 
726  EoBInfProcessor *_inf;
727  int _stepCounter;
728  int _stepsUntilScriptCall;
729  ScriptTimer _scriptTimers[5];
730  int _scriptTimersCount;
731  uint8 _scriptTimersMode;
732 
733  // Gui
734  virtual void gui_drawPlayField(bool refresh);
735  virtual void gui_setupPlayFieldHelperPages(bool keepText = false);
736  void gui_restorePlayField();
737  void gui_drawAllCharPortraitsWithStats();
738  void gui_drawCharPortraitWithStats(int index, bool screenUpdt = true);
739  void gui_drawFaceShape(int index);
740  void gui_drawWeaponSlot(int charIndex, int slot);
741  virtual void gui_drawWeaponSlotStatus(int x, int y, int status);
742  virtual void gui_printInventoryDigits(int x, int y, int val) {}
743  virtual void gui_playStrikeAnimation(uint8 pos, Item itm) {}
744  void gui_drawHitpoints(int index);
745  void gui_drawFoodStatusGraph(int index);
746  void gui_drawHorizontalBarGraph(int x, int y, int w, int h, int32 curVal, int32 maxVal, int col1, int col2) override;
747  void gui_drawCharPortraitStatusFrame(int index);
748  void gui_drawInventoryItem(int slot, int redraw, int pageNum);
749  virtual void gui_drawCharacterStatsPage();
750  virtual void gui_displayMap() {}
751  void gui_drawCompass(bool force);
752  void gui_drawDialogueBox();
753  virtual void gui_drawSpellbook();
754  void gui_drawSpellbookScrollArrow(int x, int y, int direction);
755  void gui_updateSlotAfterScrollUse();
756  void gui_updateControls();
757  void gui_toggleButtons();
758  void gui_setPlayFieldButtons();
759  void gui_setInventoryButtons();
760  void gui_setStatsListButtons();
761  void gui_setSwapCharacterButtons();
762  void gui_setCastOnWhomButtons();
763  void gui_initButton(int index, int x = -1, int y = -1, int val = -1) override;
764  Button *gui_getButton(Button *buttonList, int index);
765 
766  int clickedInventoryNextPage(Button *button);
767  int clickedPortraitRestore(Button *button);
768  int clickedCharPortraitDefault(Button *button);
769  virtual int clickedCamp(Button *button);
770  int clickedSceneDropPickupItem(Button *button);
771  int clickedCharPortrait2(Button *button);
772  int clickedWeaponSlot(Button *button);
773  int clickedCharNameLabelRight(Button *button);
774  int clickedInventorySlot(Button *button);
775  int clickedEatItem(Button *button);
776  int clickedInventoryPrevChar(Button *button);
777  int clickedInventoryNextChar(Button *button);
778  int clickedSpellbookTab(Button *button);
779  int clickedSpellbookList(Button *button);
780  int clickedCastSpellOnCharacter(Button *button);
781  int clickedUpArrow(Button *button);
782  int clickedDownArrow(Button *button);
783  int clickedLeftArrow(Button *button);
784  int clickedRightArrow(Button *button);
785  int clickedTurnLeftArrow(Button *button);
786  int clickedTurnRightArrow(Button *button);
787  int clickedAbortCharSwitch(Button *button);
788  int clickedSceneThrowItem(Button *button);
789  int clickedSceneSpecial(Button *button);
790  int clickedSpellbookAbort(Button *button);
791  int clickedSpellbookScroll(Button *button);
792  int clickedButtonReturnIndex(Button *button);
793 
794  void gui_processCharPortraitClick(int index);
795  void gui_processWeaponSlotClickLeft(int charIndex, int slotIndex);
796  void gui_processWeaponSlotClickRight(int charIndex, int slotIndex);
797  void gui_processInventorySlotClick(int slot);
798 
799  virtual void gui_updateAnimations() {}
800 
801  static const uint8 _buttonList1[];
802  int _buttonList1Size;
803  static const uint8 _buttonList2[];
804  int _buttonList2Size;
805  static const uint8 _buttonList3[];
806  int _buttonList3Size;
807  static const uint8 _buttonList4[];
808  int _buttonList4Size;
809  static const uint8 _buttonList5[];
810  int _buttonList5Size;
811  static const uint8 _buttonList6[];
812  int _buttonList6Size;
813  static const uint8 _buttonList7[];
814  int _buttonList7Size;
815  static const uint8 _buttonList8[];
816  int _buttonList8Size;
817 
818  EoBGuiButtonDef *_buttonDefs;
819 
820  const char *const *_characterGuiStringsHp;
821  const char *const *_characterGuiStringsWp;
822  const char *const *_characterGuiStringsWr;
823  const char *const *_characterGuiStringsSt;
824  const char *const *_characterGuiStringsIn;
825 
826  const char *const *_characterStatusStrings7;
827  const char *const *_characterStatusStrings8;
828  const char *const *_characterStatusStrings9;
829  const char *const *_characterStatusStrings12;
830  const char *const *_characterStatusStrings13;
831 
832  const uint16 *_inventorySlotsX;
833  const uint8 *_inventorySlotsY;
834  Screen::FontId _invFont1;
835  Screen::FontId _invFont2;
836  Screen::FontId _invFont3;
837  Screen::FontId _invFont4;
838  Screen::FontId _invFont5;
839  Screen::FontId _invFont6;
840  Screen::FontId _conFont;
841  Screen::FontId _titleFont;
842  Screen::FontId _bookFont;
843  Screen::FontId _hpStatFont;
844  const uint8 **_compassShapes;
845  uint8 _charExchangeSwap;
846  uint8 *_swapShape;
847  bool _configHpBarGraphs;
848  bool _configMouseBtSwap;
849 
850  Graphics::Surface _thumbNail;
851 
852  // text
853  void setupDialogueButtons(int presetfirst, int numStr, va_list &args);
854  void initDialogueSequence();
855  void restoreAfterDialogueSequence();
856  void drawSequenceBitmap(const char *file, int destRect, int x1, int y1, int flags);
857  int runDialogue(int dialogueTextId, int numStr, int loopButtonId, ...);
858 
859  Common::String _dialogueLastBitmap;
860  int _moveCounter;
861 
862  const char *const *_chargenStatStrings;
863  const char *const *_chargenRaceSexStrings;
864  const char *const *_chargenClassStrings;
865  const char *const *_chargenAlignmentStrings;
866 
867  const char *const *_pryDoorStrings;
868  const char *const *_warningStrings;
869 
870  const char *const *_ripItemStrings;
871  const char *const *_cursedString;
872  const char *const *_enchantedString;
873  const char *const *_magicObjectStrings;
874  const char *const *_magicObjectString5;
875  const char *const *_patternSuffix;
876  const char *const *_patternGrFix1;
877  const char *const *_patternGrFix2;
878  const char *const *_validateArmorString;
879  const char *const *_validateCursedString;
880  const char *const *_validateNoDropString;
881  const char *const *_potionStrings;
882  const char *const *_wandStrings;
883  const char *const *_itemMisuseStrings;
884 
885  const char *const *_suffixStringsRings;
886  const char *const *_suffixStringsPotions;
887  const char *const *_suffixStringsWands;
888 
889  const char *const *_takenStrings;
890  const char *const *_potionEffectStrings;
891 
892  const char *const *_yesNoStrings;
893  const char *const *_npcMaxStrings;
894  const char *const *_okStrings;
895  const char *const *_npcJoinStrings;
896  const char *const *_cancelStrings;
897  const char *const *_abortStrings;
898 
899  // Rest party
900  void restParty_displayWarning(const char *str);
901  bool restParty_updateMonsters();
902  int restParty_getCharacterWithLowestHp();
903  bool restParty_checkHealSpells(int charIndex);
904  bool restParty_checkSpellsToLearn();
905  virtual void restParty_npc() {}
906  virtual bool restParty_extraAbortCondition();
907 
908  // misc
909  void delay(uint32 millis, bool doUpdate = false, bool isMainLoop = false) override;
910  void pauseEngineIntern(bool pause) override;
911 
912  virtual void displayParchment(int id);
913  int countResurrectionCandidates();
914 
915  void seq_portal();
916  virtual const uint8 **makePortalShapes();
917  //bool seq_playSegaSequence(int id) { return true; }
918  virtual void seq_segaPausePlayer(bool pause) {}
919  bool checkPassword();
920 
921  Common::String makeTwoByteString(const Common::String &str);
922 
923  virtual int resurrectionSelectDialogue() = 0;
924  virtual void useHorn(int charIndex, int weaponSlot) {}
925  virtual bool checkPartyStatusExtra() = 0;
926  virtual void drawLightningColumn() {}
927  virtual int charSelectDialogue() { return -1; }
928  virtual void characterLevelGain(int charIndex) {}
929 
930  const uint8 *_cgaMappingDefault;
931  const uint8 *_cgaMappingAlt;
932  const uint8 *_cgaMappingInv;
933  const uint8 *_cgaMappingItemsL;
934  const uint8 *_cgaMappingItemsS;
935  const uint8 *_cgaMappingThrown;
936  const uint8 *_cgaMappingIcons;
937  const uint8 *_cgaMappingDeco;
938  const uint8 *_cgaMappingLevel[5];
939  const uint8 *_cgaLevelMappingIndex;
940 
941  // hard coded 16 color palettes for PC98 version of EOB1
942  const uint8 *_palette16c[10];
943 
944  bool _enableHiResDithering;
945 
946  Common::Error loadGameState(int slot) override;
947  Common::Error saveGameStateIntern(int slot, const char *saveName, const Graphics::Surface *thumbnail) override;
948  virtual void makeNameShapes(int charId = -1) {}
949  virtual void makeFaceShapes(int charId = -1);
950  // Default parameters will import all present original save files and push them to the top of the save dialog.
951  bool importOriginalSaveFile(int destSlot, const Common::Path &sourceFile = Common::Path());
952  Common::String readOriginalSaveFile(const Common::Path &file);
953  bool saveAsOriginalSaveFile(int slot = -1);
954 
955  void *generateMonsterTempData(LevelTempData *tmp) override;
956  void restoreMonsterTempData(LevelTempData *tmp) override;
957  void releaseMonsterTempData(LevelTempData *tmp) override;
958  void *generateWallOfForceTempData(LevelTempData *tmp) override;
959  void restoreWallOfForceTempData(LevelTempData *tmp) override;
960  void releaseWallOfForceTempData(LevelTempData *tmp) override;
961 
962  const char *const *_saveLoadStrings;
963 
964  const uint8 *_mnDef;
965  const char *const *_mnWord;
966  const char *const *_mnPrompt;
967  int _mnNumWord;
968 
969  int _rrCount;
970  const char *_rrNames[10];
971  int8 _rrId[10];
972 
973  bool _allowSkip;
974  bool _allowImport;
975 
976  bool _closeSpellbookAfterUse;
977 
978  Screen_EoB *_screen;
979  GUI_EoB *_gui;
980 
981  // fight
982  void useSlotWeapon(int charIndex, int slotIndex, Item item);
983  int closeDistanceAttack(int charIndex, Item item);
984  int thrownAttack(int charIndex, int slotIndex, Item item);
985  int projectileWeaponAttack(int charIndex, Item item);
986  virtual void playStrikeAnimation(uint8 pos, Item itm) {}
987 
988  void inflictMonsterDamage(EoBMonsterInPlay *m, int damage, bool giveExperience);
989  void calcAndInflictMonsterDamage(EoBMonsterInPlay *m, int times, int pips, int offs, int flags, int savingThrowType, int savingThrowEffect);
990  void calcAndInflictCharacterDamage(int charIndex, int times, int itemOrPips, int useStrModifierOrBase, int flags, int savingThrowType, int savingThrowEffect);
991  int calcCharacterDamage(int charIndex, int times, int itemOrPips, int useStrModifierOrBase, int flags, int savingThrowType, int damageType);
992  void inflictCharacterDamage(int charIndex, int damage);
993 
994  bool characterAttackHitTest(int charIndex, int monsterIndex, int item, int attackType);
995  bool monsterAttackHitTest(EoBMonsterInPlay *m, int charIndex);
996  bool flyingObjectMonsterHit(EoBFlyingObject *fo, int monsterIndex);
997  bool flyingObjectPartyHit(EoBFlyingObject *fo);
998 
999  void monsterCloseAttack(EoBMonsterInPlay *m);
1000  void monsterSpellCast(EoBMonsterInPlay *m, int type);
1001  void statusAttack(int charIndex, int attackStatusFlags, const char *attackStatusString, int savingThrowType, uint32 effectDuration, int restoreEvent, int noRefresh);
1002 
1003  int calcMonsterDamage(EoBMonsterInPlay *m, int times, int pips, int offs, int flags, int savingThrowType, int savingThrowEffect);
1004  int calcDamageModifers(int charIndex, EoBMonsterInPlay *m, int item, int itemType, int useStrModifier);
1005  bool trySavingThrow(void *target, int hpModifier, int level, int type, int race);
1006  bool specialAttackSavingThrow(int charIndex, int type);
1007  int getSaveThrowModifier(int hpModifier, int level, int type);
1008  bool calcDamageCheckItemType(int itemType);
1009  int savingThrowReduceDamage(int savingThrowEffect, int damage);
1010  bool tryMonsterAttackEvasion(EoBMonsterInPlay *m);
1011  int getStrHitChanceModifier(int charIndex);
1012  int getStrDamageModifier(int charIndex);
1013  int getDexHitChanceModifier(int charIndex);
1014  int getMonsterAcHitChanceModifier(int charIndex, int monsterAc);
1015  void explodeMonster(EoBMonsterInPlay *m);
1016 
1017  int _dstMonsterIndex;
1018  bool _preventMonsterFlash;
1019  int8 _sceneShakeCountdown;
1020  int16 _foundMonstersArray[5];
1021  int8 _monsterBlockPosArray[6];
1022  const uint8 *_monsterAcHitChanceTable1;
1023  const uint8 *_monsterAcHitChanceTable2;
1024 
1025  // magic
1026  void useMagicBookOrSymbol(int charIndex, int type);
1027  void useMagicScroll(int charIndex, int type, int weaponSlot);
1028  void usePotion(int charIndex, int weaponSlot);
1029  void useWand(int charIndex, int weaponSlot);
1030 
1031  virtual void turnUndeadAuto() {}
1032  virtual void turnUndeadAutoHit() = 0;
1033 
1034  void castSpell(int spell, int weaponSlot);
1035  void removeCharacterEffect(int spell, int charIndex, int showWarning);
1036  void removeAllCharacterEffects(int charIndex);
1037  void castOnWhomDialogue();
1038  void startSpell(int spell);
1039 
1040  void sparkEffectDefensive(int charIndex);
1041  void sparkEffectOffensive();
1042  void setSpellEventTimer(int spell, int timerBaseFactor, int timerLength, int timerLevelFactor, int updateExistingTimer);
1043  void sortCharacterSpellList(int charIndex);
1044 
1045  bool magicObjectDamageHit(EoBFlyingObject *fo, int dcTimes, int dcPips, int dcOffs, int level);
1046  bool magicObjectStatusHit(EoBMonsterInPlay *m, int type, bool tryEvade, int mod);
1047  bool turnUndeadHit(EoBMonsterInPlay *m, int hitChance, int casterLevel);
1048  void causeWounds(int dcTimes, int dcPips, int dcOffs);
1049 
1050  int getMagicWeaponSlot(int charIndex);
1051  int createMagicWeaponType(int invFlags, int handFlags, int armorClass, int allowedClasses, int dmgNum, int dmgPips, int dmgInc, int extraProps);
1052  Item createMagicWeaponItem(int flags, int icon, int value, int type);
1053  void removeMagicWeaponItem(Item item);
1054 
1055  void updateWallOfForceTimers();
1056  void destroyWallOfForce(int index);
1057 
1058  int findSingleSpellTarget(int dist);
1059 
1060  int findFirstCharacterSpellTarget();
1061  int findNextCharacterSpellTarget(int curCharIndex);
1062  int charDeathSavingThrow(int charIndex, int div);
1063 
1064  void printWarning(const char *str);
1065  void printNoEffectWarning();
1066 
1067  void spellCallback_start_empty() {}
1068  bool spellCallback_end_empty(void *) { return true; }
1069  void spellCallback_start_armor();
1070  void spellCallback_start_burningHands();
1071  void spellCallback_start_detectMagic();
1072  bool spellCallback_end_detectMagic(void *);
1073  void spellCallback_start_magicMissile();
1074  bool spellCallback_end_magicMissile(void *obj);
1075  void spellCallback_start_shockingGrasp();
1076  bool spellCallback_end_shockingGraspFlameBlade(void *obj);
1077  void spellCallback_start_improvedIdentify();
1078  void spellCallback_start_melfsAcidArrow();
1079  bool spellCallback_end_melfsAcidArrow(void *obj);
1080  void spellCallback_start_dispelMagic();
1081  void spellCallback_start_fireball();
1082  bool spellCallback_end_fireball(void *obj);
1083  void spellCallback_start_flameArrow();
1084  bool spellCallback_end_flameArrow(void *obj);
1085  void spellCallback_start_holdPerson();
1086  bool spellCallback_end_holdPerson(void *obj);
1087  void spellCallback_start_lightningBolt();
1088  bool spellCallback_end_lightningBolt(void *obj);
1089  void spellCallback_start_vampiricTouch();
1090  bool spellCallback_end_vampiricTouch(void *obj);
1091  void spellCallback_start_fear();
1092  void spellCallback_start_iceStorm();
1093  bool spellCallback_end_iceStorm(void *obj);
1094  void spellCallback_start_stoneSkin();
1095  void spellCallback_start_removeCurse();
1096  void spellCallback_start_coneOfCold();
1097  void spellCallback_start_holdMonster();
1098  bool spellCallback_end_holdMonster(void *obj);
1099  void spellCallback_start_wallOfForce();
1100  void spellCallback_start_disintegrate();
1101  void spellCallback_start_fleshToStone();
1102  void spellCallback_start_stoneToFlesh();
1103  void spellCallback_start_trueSeeing();
1104  bool spellCallback_end_trueSeeing(void *);
1105  void spellCallback_start_slayLiving();
1106  void spellCallback_start_powerWordStun();
1107  void spellCallback_start_causeLightWounds();
1108  void spellCallback_start_cureLightWounds();
1109  void spellCallback_start_aid();
1110  bool spellCallback_end_aid(void *obj);
1111  void spellCallback_start_flameBlade();
1112  void spellCallback_start_slowPoison();
1113  bool spellCallback_end_slowPoison(void *obj);
1114  void spellCallback_start_createFood();
1115  void spellCallback_start_removeParalysis();
1116  void spellCallback_start_causeSeriousWounds();
1117  void spellCallback_start_cureSeriousWounds();
1118  void spellCallback_start_neutralizePoison();
1119  void spellCallback_start_causeCriticalWounds();
1120  void spellCallback_start_cureCriticalWounds();
1121  void spellCallback_start_flameStrike();
1122  bool spellCallback_end_flameStrike(void *obj);
1123  void spellCallback_start_raiseDead();
1124  void spellCallback_start_harm();
1125  void spellCallback_start_heal();
1126  void spellCallback_start_layOnHands();
1127  void spellCallback_start_turnUndead();
1128  bool spellCallback_end_monster_lightningBolt(void *obj);
1129  bool spellCallback_end_monster_fireball1(void *obj);
1130  bool spellCallback_end_monster_fireball2(void *obj);
1131  bool spellCallback_end_monster_deathSpell(void *obj);
1132  bool spellCallback_end_monster_disintegrate(void *obj);
1133  bool spellCallback_end_monster_causeCriticalWounds(void *obj);
1134  bool spellCallback_end_monster_fleshToStone(void *obj);
1135 
1136  int8 _openBookSpellLevel;
1137  int8 _openBookSpellSelectedItem;
1138  int8 _openBookSpellListOffset;
1139  uint8 _openBookChar;
1140  uint8 _openBookType;
1141  uint8 _openBookCharBackup;
1142  uint8 _openBookTypeBackup;
1143  uint8 _openBookCasterLevel;
1144  const char *const *_openBookSpellList;
1145  int8 *_openBookAvailableSpells;
1146  uint8 _activeSpellCharId;
1147  uint8 _activeSpellCharacterPos;
1148  int _activeSpell;
1149  int _characterSpellTarget;
1150  bool _returnAfterSpellCallback;
1151 
1152  typedef void (EoBCoreEngine::*SpellStartCallback)();
1153  typedef bool (EoBCoreEngine::*SpellEndCallback)(void *obj);
1154 
1155  struct EoBSpell {
1156  const char *name;
1157  SpellStartCallback startCallback;
1158  uint16 flags;
1159  const uint16 *timingPara;
1160  SpellEndCallback endCallback;
1161  uint8 sound;
1162  uint32 effectFlags;
1163  uint16 damageFlags;
1164  };
1165 
1166  EoBSpell *_spells;
1167  int _numSpells;
1168 
1169  struct WallOfForce {
1170  uint16 block;
1171  uint32 duration;
1172  };
1173 
1174  WallOfForce *_wallsOfForce;
1175 
1176  const char *const *_bookNumbers;
1177  const char *const *_mageSpellList;
1178  int _mageSpellListSize;
1179  int _clericSpellOffset;
1180  const char *const *_clericSpellList;
1181  const char *const *_spellNames;
1182  const char *const *_mageSpellList2;
1183  const char *const *_clericSpellList2;
1184  const char *const *_magicStrings1;
1185  const char *const *_magicStrings2;
1186  const char *const *_magicStrings3;
1187  const char *const *_magicStrings4;
1188  const char *const *_magicStrings6;
1189  const char *const *_magicStrings7;
1190  const char *const *_magicStrings8;
1191  const char *const *_magicStrings9;
1192 
1193  uint8 *_spellAnimBuffer;
1194 
1195  const uint8 *_sparkEffectDefSteps;
1196  const uint8 *_sparkEffectDefSubSteps;
1197  const uint8 *_sparkEffectDefShift;
1198  const uint8 *_sparkEffectDefAdd;
1199  const uint8 *_sparkEffectDefX;
1200  const uint8 *_sparkEffectDefY;
1201  const uint32 *_sparkEffectOfFlags1;
1202  const uint32 *_sparkEffectOfFlags2;
1203  const uint8 *_sparkEffectOfShift;
1204  const uint8 *_sparkEffectOfX;
1205  const uint8 *_sparkEffectOfY;
1206 
1207  const uint8 *_magicFlightObjectProperties;
1208  const uint8 *_turnUndeadEffect;
1209  const uint8 *_burningHandsDest;
1210  const int8 *_coneOfColdDest1;
1211  const int8 *_coneOfColdDest2;
1212  const int8 *_coneOfColdDest3;
1213  const int8 *_coneOfColdDest4;
1214  const uint8 *_coneOfColdGfxTbl;
1215  int _coneOfColdGfxTblSize;
1216 
1217  // Menu
1218  EoBMenuDef *_menuDefs;
1219  const EoBMenuButtonDef *_menuButtonDefs;
1220 
1221  int _prefMenuPlatformOffset;
1222  bool _configMouse;
1223  bool _config2431;
1224  int _mouseSpeed;
1225  int _padSpeed;
1226  int _inputMode;
1227 
1228  const char *const *_menuStringsMain;
1229  const char *const *_menuStringsSaveLoad;
1230  const char *const *_menuStringsOnOff;
1231  const char *const *_menuStringsSpells;
1232  const char *const *_menuStringsRest;
1233  const char *const *_menuStringsDrop;
1234  const char *const *_menuStringsExit;
1235  const char *const *_menuStringsStarve;
1236  const char *const *_menuStringsScribe;
1237  const char *const *_menuStringsDrop2;
1238  const char *const *_menuStringsHead;
1239  const char *const *_menuStringsPoison;
1240  const char *const *_menuStringsMgc;
1241  const char *const *_menuStringsPrefs;
1242  const char *const *_menuStringsRest2;
1243  const char *const *_menuStringsRest3;
1244  const char *const *_menuStringsRest4;
1245  const char *const *_menuStringsDefeat;
1246  const char *_errorSlotEmptyString;
1247  const char *_errorSlotNoNameString;
1248  const char *_menuOkString;
1249  const char *const *_2431Strings;
1250  const char *const *_textInputCharacterLines;
1251  int _textInputCharacterLinesSize;
1252  const char *const *_textInputSelectStrings;
1253  const char *const *_menuStringsTransfer;
1254  const char *const *_transferStringsScummVM;
1255  const char *const *_menuStringsSpec;
1256  const char *const *_menuStringsSpellNo;
1257  const char *const *_menuYesNoStrings;
1258  const char *const *_saveNamePatterns;
1259 
1260  const uint8 *_spellLevelsMage;
1261  int _spellLevelsMageSize;
1262  const uint8 *_spellLevelsCleric;
1263  int _spellLevelsClericSize;
1264  const uint8 *_numSpellsCleric;
1265  const uint8 *_numSpellsWisAdj;
1266  const uint8 *_numSpellsPal;
1267  const uint8 *_numSpellsMage;
1268 
1269  // sound
1270  void snd_playSong(int id, bool loop = true);
1271  virtual void snd_playLevelScore() = 0;
1272  void snd_playSoundEffect(int id, int volume = 0xFF) override;
1273  void snd_stopSound();
1274  void snd_fadeOut(int del = 160);
1275  virtual void snd_loadAmigaSounds(int level, int sub) = 0;
1276  virtual void snd_updateLevelScore() = 0;
1277 
1278  const char **_amigaSoundMap;
1279  const char *const *_amigaLevelSoundList1;
1280  const char *const *_amigaLevelSoundList2;
1281 
1282  int _amigaCurSoundFile;
1283 
1284  // keymap
1285  static const char *const kKeymapName;
1286 
1287 private:
1288  void printStringIntern_statsPage(const char *str, int x, int y, int col);
1289  void printStringIntern_spellBook(const char *str, int x, int y, int col1, int col2);
1290 };
1291 
1292 } // End of namespace Kyra
1293 
1294 #endif // ENABLE_EOB
1295 
1296 #endif
Definition: str.h:59
Definition: surface.h:66
Definition: error.h:84
Definition: array.h:52
Definition: default_display_client.h:78
Definition: path.h:52
Definition: stream.h:745
Definition: system.h:45
Definition: algorithm.h:29
Definition: detection.h:27
Definition: stream.h:944
Definition: system.h:167
Definition: input.h:69