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