22 #ifndef KYRA_EOBCOMMON_H 23 #define KYRA_EOBCOMMON_H 25 #if defined(ENABLE_EOB) || defined(ENABLE_LOL) 26 #include "kyra/engine/kyra_rpg.h" 27 #endif // (ENABLE_EOB || ENABLE_LOL) 37 #define releaseShpArr(shapes, num) \ 39 for (int iii = 0; iii < num; iii++) { \ 41 delete[] shapes[iii]; \ 47 struct DarkMoonShapeDef {
52 struct CreatePartyModButton {
71 struct EoBChargenButtonDef {
79 struct EoBGuiButtonDef {
104 int8 constitutionCur;
105 int8 constitutionMax;
118 uint32 experience[3];
119 int16 hitPointsDividend;
120 const uint8 *faceShape;
121 const uint8 *nameShape;
124 int8 clericSpells[80];
125 uint32 mageSpellsAvailableFlags;
130 uint8 effectsRemainder[4];
135 int8 gfxUpdateCountdown;
139 EoBItem() : nameUnid(0), nameId(0), flags(0), icon(0), type(0), pos(0), block(-1), next(0), prev(0), level(0), value(0) {}
166 uint16 extraProperties;
169 struct SpriteDecoration {
175 struct EoBMonsterProperty {
182 uint8 attacksPerRound;
188 uint16 immunityFlags;
196 uint8 numRemoteAttacks;
197 uint8 remoteWeaponChangeMode;
198 uint8 numRemoteWeapons;
200 int8 remoteWeapons[5];
203 uint8 dmgModifierEvade;
205 uint8 decorations[3];
208 struct EoBMonsterInPlay {
221 int8 spellStatusLeft;
229 uint8 curRemoteWeapon;
230 uint8 numRemoteAttacks;
232 uint8 directionChanged;
233 uint8 stepsTillRemoteAttack;
246 uint8 firstButtonStrId;
251 struct EoBMenuButtonDef {
261 class EoBInfProcessor;
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;
272 EoBCoreEngine(
OSystem *system,
const GameFlags &flags);
273 ~EoBCoreEngine()
override;
277 Screen *screen()
override {
return _screen; }
278 GUI *gui()
const override {
return _gui; }
287 virtual int mainMenu() = 0;
288 virtual void seq_xdeath() {}
289 virtual void seq_playFinale() = 0;
293 virtual void loadItemsAndDecorationsShapes();
294 void releaseItemsAndDecorationsShapes();
296 void initButtonData();
298 void initStaticResource();
299 virtual void initSpells();
301 void registerDefaultSettings()
override;
302 void readSettings()
override;
303 void writeSettings()
override;
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;
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;
332 uint8 *_redSplatBG[6];
333 uint8 *_itemsOverlay;
334 static const uint8 _itemsOverlayCGA[];
336 static const uint8 _teleporterShapeDefs[];
337 static const uint8 _wallOfForceShapeDefs[];
339 const char *
const *_mainMenuStrings;
342 virtual void startupNew();
343 virtual void startupLoad() = 0;
344 virtual void startupReset() {}
346 void update()
override { screen()->updateScreen(); }
347 bool checkPartyStatus(
bool handleDeath);
348 void updateAnimations();
353 bool startCharacterGeneration(
bool defaultParty);
354 bool startPartyTransfer();
356 const uint8 **_faceShapes;
357 const uint8 *_wndBackgrnd;
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[];
365 const uint8 *_classModifierFlags;
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);
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);
384 uint8 getClock2Timer(
int index)
override {
return index < _numClock2Timers ? _clock2Timers[index] : 0; }
385 uint8 getNumClock2Timers()
override {
return _numClock2Timers; }
387 static const uint8 _clock2Timers[];
388 static const uint8 _numClock2Timers;
390 uint32 _disableElapsedTime;
391 uint32 _restPartyElapsedTime;
393 uint32 _lastVIntTick;
394 uint32 _totalEnemiesKilled;
398 void setHandItem(Item itemIndex)
override;
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);
414 void recalcArmorClass(
int index);
415 int validateWeaponSlotItem(
int index,
int slot);
417 int getClericPaladinLevel(
int index);
418 int getMageLevel(
int index);
419 int getCharacterLevelIndex(
int type,
int cClass);
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);
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);
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);
441 void setWeaponSlotStatus(
int charIndex,
int mode,
int slot);
443 EoBCharacter *_characters;
446 int _exchangeCharacterId;
448 const char *
const *_levelGainStrings;
449 const uint32 *_expRequirementTables[6];
451 const uint8 *_saveThrowTables[6];
452 const uint8 *_saveThrowLevelIndex;
453 const uint8 *_saveThrowModDiv;
454 const uint8 *_saveThrowModExt;
456 const EoBCharacter *_npcPreset;
457 const char *
const *_npcPresetNames;
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);
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();
493 void reloadWeaponSlot(
int charIndex,
int slotIndex,
int itemType,
int arrowOrDagger);
497 EoBItemType *_itemTypes;
499 uint16 _numItemNames;
500 int _numItemNamesStatic;
501 const char *
const *_itemNamesStatic;
502 uint32 _partyEffectFlags;
505 const uint16 *_slotValidationFlags;
506 const int8 *_projectileWeaponAmmoTypes;
507 const uint8 *_wandTypes;
509 EoBFlyingObject *_flyingObjects;
510 const uint8 *_drawObjPosIndex;
511 const uint8 *_flightObjFlipIndex;
512 const int8 *_flightObjShpMap;
513 const int8 *_flightObjSclIndex;
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;
525 const char *
const *_ascii2SjisTables;
526 const char *
const *_ascii2SjisTables2;
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) {}
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();
543 const int8 *getMonstersOnBlockPositions(uint16 block);
544 int getClosestMonster(
int charIndex,
int block);
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);
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);
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);
580 uint8 *_monsterFlashOverlay;
581 uint8 *_monsterStoneOverlay;
582 int16 _shapeShakeOffsetX;
583 int16 _shapeShakeOffsetY;
585 SpriteDecoration *_monsterDecorations;
586 EoBMonsterProperty *_monsterProps;
588 EoBMonsterInPlay *_monsters;
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;
602 const uint8 *_monsterProximityTable;
603 const uint8 *_findBlockMonstersTable;
604 const char *
const *_monsterDustStrings;
606 const uint8 *_enemyMageSpellList;
607 const uint8 *_enemyMageSfx;
608 const uint8 *_beholderSpellList;
609 const uint8 *_beholderSfx;
610 const char *
const *_monsterSpecAttStrings;
612 const int8 *_monsterFrmOffsTable1;
613 const int8 *_monsterFrmOffsTable2;
615 const uint16 *_encodeMonsterShpTable;
616 const uint8 _teleporterWallId;
618 const int16 *_wallOfForceDsX;
619 const uint8 *_wallOfForceDsY;
620 const uint8 *_wallOfForceDsNumW;
621 const uint8 *_wallOfForceDsNumH;
622 const uint8 *_wallOfForceShpId;
624 const int8 *_monsterDirChangeTable;
627 void loadLevel(
int level,
int sub);
628 virtual void readLevelFileData(
int level);
630 void addLevelItems()
override;
631 virtual void loadVcnData(
const char *file,
const uint8 *cgaMapping);
633 void loadBlockProperties(
const char *mazFile)
override;
634 const uint8 *getBlockFileData(
int levelIndex)
override;
635 const uint8 *getBlockFileData(
const char *mazFile);
637 void loadDecorations(
const char *cpsFile,
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) {}
649 void drawScene(
int refresh);
650 void drawSceneShapes(
int start = 0,
int end = 18,
int drawFlags = 0xFF);
651 void drawDecorations(
int index);
653 int calcNewBlockPositionAndTestPassability(uint16 curBlock, uint16 direction);
654 void notifyBlockNotPassable();
655 void increaseStepsCounter();
656 void moveParty(uint16 block);
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;
663 int specialWallAction(
int block,
int direction);
665 void openDoor(
int block);
666 void closeDoor(
int block);
668 void addLevelMap(
int level);
669 bool hasLevelMap(
int level)
const;
670 uint32 countMaps()
const;
671 uint32 countArrows()
const;
674 int16 _noDoorSwitch[2];
676 EoBRect8 *_levelDecorationRects;
677 SpriteDecoration *_doorSwitches;
678 const uint8 *_dcrShpDataPos;
686 uint32 _drawSceneTimer;
687 uint32 _flashShapeTimer;
688 uint32 _flashShapeTimerIntv0;
689 uint32 _flashShapeTimerIntv1;
690 uint32 _flashShapeTimerIntv2;
691 uint32 _envAudioTimer;
692 uint16 _teleporterPulse;
695 const int16 *_dscShapeCoords;
697 const uint8 *_dscItemPosIndex;
698 const int16 *_dscItemShpX;
699 const uint8 *_dscItemScaleIndex;
700 const uint8 *_dscItemTileIndex;
701 const uint8 *_dscItemShapeMap;
703 const uint8 *_dscDoorScaleMult1;
704 const uint8 *_dscDoorScaleMult2;
705 const uint8 *_dscDoorScaleMult3;
706 const uint8 *_dscDoorY1;
707 const uint8 *_dscDoorXE;
709 uint8 *_greenFadingTable;
710 uint8 *_blueFadingTable;
711 uint8 *_lightBlueFadingTable;
712 uint8 *_blackFadingTable;
713 uint8 *_greyFadingTable;
715 const uint8 *_wllFlagPreset;
716 int _wllFlagPresetSize;
717 const uint8 *_teleporterShapeCoords;
718 const int8 *_portalSeq;
723 void runLevelScript(
int block,
int flags)
override;
724 void setScriptFlags(uint32 flags);
725 void clearScriptFlags(uint32 flags);
726 bool checkScriptFlags(uint32 flags);
728 const uint8 *initScriptTimers(
const uint8 *pos);
729 void updateScriptTimers();
730 virtual void updateScriptTimersExtra() {}
732 EoBInfProcessor *_inf;
734 int _stepsUntilScriptCall;
735 ScriptTimer _scriptTimers[5];
736 int _scriptTimersCount;
737 uint8 _scriptTimersMode;
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;
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);
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);
805 virtual void gui_updateAnimations() {}
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;
824 EoBGuiButtonDef *_buttonDefs;
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;
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;
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;
853 bool _configHpBarGraphs;
854 bool _configMouseBtSwap;
855 bool _configADDRuleEnhancements;
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, ...);
869 const char *
const *_chargenStatStrings;
870 const char *
const *_chargenRaceSexStrings;
871 const char *
const *_chargenClassStrings;
872 const char *
const *_chargenAlignmentStrings;
874 const char *
const *_pryDoorStrings;
875 const char *
const *_warningStrings;
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;
892 const char *
const *_suffixStringsRings;
893 const char *
const *_suffixStringsPotions;
894 const char *
const *_suffixStringsWands;
896 const char *
const *_takenStrings;
897 const char *
const *_potionEffectStrings;
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;
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();
916 void delay(uint32 millis,
bool doUpdate =
false,
bool isMainLoop =
false)
override;
917 void pauseEngineIntern(
bool pause)
override;
919 virtual void displayParchment(
int id);
920 int countResurrectionCandidates();
923 virtual const uint8 **makePortalShapes();
925 virtual void seq_segaPausePlayer(
bool pause) {}
926 bool checkPassword();
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) {}
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;
949 const uint8 *_palette16c[10];
951 bool _enableHiResDithering;
955 virtual void makeNameShapes(
int charId = -1) {}
956 virtual void makeFaceShapes(
int charId = -1);
960 bool saveAsOriginalSaveFile(
int slot = -1);
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;
969 const char *
const *_saveLoadStrings;
972 const char *
const *_mnWord;
973 const char *
const *_mnPrompt;
977 const char *_rrNames[10];
983 bool _closeSpellbookAfterUse;
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) {}
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);
1002 bool isElf(
int charIndex);
1003 bool isBow(Item projectileWeapon);
1004 bool isSword(Item item);
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);
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);
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);
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;
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);
1043 virtual void turnUndeadAuto() {}
1044 virtual void turnUndeadAutoHit() = 0;
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);
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);
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);
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);
1067 void updateWallOfForceTimers();
1068 void destroyWallOfForce(
int index);
1070 int findSingleSpellTarget(
int dist);
1072 int findFirstCharacterSpellTarget();
1073 int findNextCharacterSpellTarget(
int curCharIndex);
1074 int charDeathSavingThrow(
int charIndex,
int div);
1076 void printWarning(
const char *str);
1077 void printNoEffectWarning();
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);
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;
1161 int _characterSpellTarget;
1162 bool _returnAfterSpellCallback;
1164 typedef void (EoBCoreEngine::*SpellStartCallback)();
1165 typedef bool (EoBCoreEngine::*SpellEndCallback)(
void *obj);
1169 SpellStartCallback startCallback;
1171 const uint16 *timingPara;
1172 SpellEndCallback endCallback;
1181 struct WallOfForce {
1186 WallOfForce *_wallsOfForce;
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;
1205 uint8 *_spellAnimBuffer;
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;
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;
1230 EoBMenuDef *_menuDefs;
1231 const EoBMenuButtonDef *_menuButtonDefs;
1233 int _prefMenuPlatformOffset;
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;
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;
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;
1290 const char **_amigaSoundMap;
1291 const char *
const *_amigaLevelSoundList1;
1292 const char *
const *_amigaLevelSoundList2;
1294 int _amigaCurSoundFile;
1297 static const char *
const kKeymapName;
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);
1306 #endif // ENABLE_EOB
Definition: atari-screen.h:60
Definition: algorithm.h:29
Definition: detection.h:27