25 #include "audio/softsynth/pcspk.h" 26 #include "audio/mixer.h" 27 #include "common/file.h" 28 #include "common/rect.h" 29 #include "common/events.h" 30 #include "common/serializer.h" 31 #include "common/text-to-speech.h" 33 #include "engines/advancedDetector.h" 34 #include "engines/engine.h" 35 #include "graphics/surface.h" 37 #include "efh/constants.h" 59 static const uint8 kSavegameVersion = 1;
60 #define EFH_SAVE_HEADER MKTAG('E', 'F', 'H', 'S') 62 enum EfhDebugChannels {
75 int8 **_vgaLineBuffer;
100 uint16 _field5_textId;
101 uint16 _field7_textId;
125 int8 _agilityModifier;
128 uint8 _specialEffect;
130 uint8 _exclusiveType;
131 uint8 _field19_mapPosX_or_maxDeltaPoints;
146 uint16 field12_textId;
147 uint16 field14_textId;
149 uint8 _activeScore[15];
150 uint8 _passiveScore[11];
151 uint8 _infoScore[11];
155 uint8 _possessivePronounSHL6;
160 uint8 _defaultDefenseItemId;
187 const uint8 *_widthArray;
188 const uint8 *_extraLines;
189 const Font *_fontData;
191 uint8 _extraVerticalSpace;
192 uint8 _extraHorizontalSpace;
201 uint16 _lineDataSize;
202 uint8 _paletteTransformation;
212 uint8 _possessivePronounSHL6;
218 uint8 _maxDamageAbsorption;
220 uint8 _additionalInfo;
248 int16 _lastInventoryUsed;
261 enum TTSMenuRestriction {
273 kActionSkipSongAndIntro,
283 kActionMoveDownRight,
284 kActionCharacter1Status,
285 kActionCharacter2Status,
286 kActionCharacter3Status,
292 kActionCancelCharacterSelection,
308 kActionCancelEnemySelection,
310 kActionExitStatusMenu,
352 { kActionEnemy1, 0 },
353 { kActionEnemy2, 1 },
354 { kActionEnemy3, 2 },
355 { kActionEnemy4, 3 },
356 { kActionEnemy5, 4 },
360 { kActionCharacter1, 0 },
361 { kActionCharacter2, 1 },
362 { kActionCharacter3, 2 },
366 { kActionOption1, 0 },
367 { kActionOption2, 1 },
368 { kActionOption3, 2 },
369 { kActionOption4, 3 },
370 { kActionOption5, 4 },
371 { kActionOption6, 5 },
372 { kActionOption7, 6 },
373 { kActionOption8, 7 },
374 { kActionOption9, 8 },
375 { kActionOption10, 9 },
376 { kActionOption11, 10 },
377 { kActionOption12, 11 },
378 { kActionOption13, 12 },
379 { kActionOption14, 13 },
388 kKeymapStatusMenuNavigation,
389 kKeymapStatusMenuSubMenu,
392 kKeymapCharacterSelection,
393 kKeymapEnemySelection,
398 EfhKeymapCode _keymap;
403 { kKeymapDefault,
"efh-default" },
404 { kKeymapMenu,
"menu" },
405 { kKeymapSkipVideo,
"skip-video" },
406 { kKeymapSkipSong,
"skip-song" },
407 { kKeymapStatusMenu,
"status-menu" },
408 { kKeymapStatusMenuNavigation,
"status-menu-navigation" },
409 { kKeymapStatusMenuSubMenu,
"status-menu-submenu" },
410 { kKeymapInteraction,
"interaction" },
411 { kKeymapFight,
"fight" },
412 { kKeymapCharacterSelection,
"character-selection" },
413 { kKeymapEnemySelection,
"enemy-selection" },
414 { kKeymapDeathMenu,
"death-menu" },
429 uint32 getFeatures()
const;
430 const char *getGameId()
const;
433 const char *getCopyrightString()
const;
450 bool _saveAuthorized;
455 void initMapMonsters();
456 void saveAnimImageSetId();
457 int16 getEquipmentDefense(int16 charId);
458 uint16 getEquippedExclusiveType(int16 charId, int16 exclusiveType,
bool flag);
459 void displayLowStatusScreen(
bool flag);
460 void loadImageSetToTileBank(int16 bankId, int16 setId);
461 void restoreAnimImageSetId();
462 void checkProtection();
464 void copyCurrentPlaceToBuffer(int16
id);
465 uint8 getMapTileInfo(int16 mapPosX, int16 mapPosY);
467 void setTextPos(int16 textPosX, int16 textPosY);
468 void drawGameScreenAndTempText(
bool flag);
469 void drawMap(
bool largeMapFl, int16 mapPosX, int16 mapPosY, int16 mapSize,
bool drawHeroFl,
bool drawMonstersFl);
470 void displaySmallMap(int16 posX, int16 posY);
471 void displayLargeMap(int16 posX, int16 posY);
473 void removeObject(int16 charId, int16 objectId);
474 void totalPartyKill();
475 void removeCharacterFromTeam(int16 teamMemberId);
476 void refreshTeamSize();
477 bool isNpcATeamMember(int16
id);
478 void handleWinSequence();
479 bool giveItemTo(int16 charId, int16 objectId, int16 fromCharId);
480 int16 chooseCharacterToReplace();
481 int16 handleCharacterJoining();
482 void drawText(uint8 *srcPtr, int16 posX, int16 posY, int16 maxX, int16 maxY,
bool flag);
483 void displayMiddleLeftTempText(uint8 *impArray,
bool flag);
484 void transitionMap(int16 centerX, int16 centerY);
485 void setSpecialTechZone(int16 unkId, int16 centerX, int16 centerY);
486 int16 findMapSpecialTileIndex(int16 posX, int16 posY);
487 bool isPosOutOfMap(int16 mapPosX, int16 mapPosY);
496 void showCharacterStatus(uint8 character);
497 void handleNewRoundEffects();
499 void computeMapAnimation();
500 void handleAnimations();
502 int8 checkMonsterMoveCollisionAndTileTexture(int16 monsterId);
503 bool moveMonsterAwayFromTeam(int16 monsterId);
504 bool moveMonsterTowardsTeam(int16 monsterId);
505 bool moveMonsterGroupOther(int16 monsterId, int16 direction);
506 bool moveMonsterGroupRandom(int16 monsterId);
507 int16 computeMonsterGroupDistance(int16 monsterId);
508 bool checkWeaponRange(int16 monsterId, int16 weaponId);
509 bool checkMonsterMovementType(int16
id,
bool teamFlag);
510 bool checkTeamWeaponRange(int16 monsterId);
511 bool checkIfMonsterOnSameLargeMapPlace(int16 monsterId);
512 bool checkMonsterWeaponRange(int16 monsterId);
513 void handleMapMonsterMoves();
514 bool checkMapMonsterAvailability(int16 monsterId);
515 void displayMonsterAnim(int16 monsterId);
516 int16 countAliveMonsters(int16
id);
517 bool checkMonsterGroupDistance1OrLess(int16 monsterId);
518 bool handleTalk(int16 monsterId, int16 arg2, int16 itemId);
519 void startTalkMenu(int16 monsterId);
520 void displayImp1Text(int16 textId);
521 bool handleInteractionText(int16 mapPosX, int16 mapPosY, int16 charId, int16 itemId, int16 arg8, int16 imageSetId);
522 int8 checkTileStatus(int16 mapPosX, int16 mapPosY,
bool teamFl);
523 void computeInitiatives();
524 void redrawScreenForced();
525 int16 countMonsterGroupMembers(int16 monsterGroup);
526 uint16 getXPLevel(uint32 xp);
527 bool isItemCursed(int16 itemId);
528 bool hasObjectEquipped(int16 charId, int16 objectId);
529 void setMapMonsterAggressivenessAndMovementType(int16
id, uint8 mask);
530 bool isMonsterActive(int16 groupId, int16
id);
531 int16 getTileFactId(int16 mapPosX, int16 mapPosY);
532 void setCharacterObjectToBroken(int16 charId, int16 objectId);
533 int16 selectOtherCharFromTeam();
534 bool checkMonsterCollision();
537 bool handleFight(int16 monsterId);
538 void handleFight_checkEndEffect(int16 charId);
539 void handleFight_lastAction_A(int16 teamCharId);
540 void handleFight_lastAction_D(int16 teamCharId);
541 void handleFight_lastAction_H(int16 teamCharId);
542 bool handleFight_lastAction_U(int16 teamCharId);
543 void handleFight_MobstersAttack(
int groupId);
545 bool isMonsterAlreadyFighting(int16 monsterId, int16 teamMonsterId);
546 void createOpponentList(int16 monsterTeamId);
547 void resetTeamMonsterEffects();
548 void initFight(int16 monsterId);
549 void resetTeamMonsterIdArray();
550 bool isTeamMemberStatusNormal(int16
id);
551 void getDeathTypeDescription(int16 victimId, int16 attackerId);
552 int16 determineTeamTarget(int16 charId, int16 unkFied18Val,
bool checkDistanceFl);
553 bool getTeamAttackRoundPlans();
554 void drawCombatScreen(int16 charId,
bool whiteFl,
bool drawFl);
556 bool characterSearchesMonsterCorpse(int16 charId, int16 monsterId);
557 void addReactionText(int16
id);
558 void displayEncounterInfo(
bool WhiteFl);
559 int16 getWeakestMobster(int16 groupNumber);
560 int16 getCharacterScore(int16 charId, int16 itemId);
561 bool checkSpecialItemsOnCurrentPlace(int16 itemId);
562 bool hasAdequateDefense(int16 monsterId, uint8 attackType);
563 bool hasAdequateDefenseNPC(int16 charId, uint8 attackType);
564 void addNewOpponents(int16 monsterId);
565 int16 getTeamMonsterAnimId();
566 int16 selectMonsterGroup();
567 void redrawCombatScreenWithTempText(int16 charId);
568 void handleDamageOnArmor(int16 charId, int16 damage);
571 int32 readFileToBuffer(
const Common::Path &filename, uint8 *destBuffer);
573 void findMapFile(int16 mapId);
574 void rImageFile(
const Common::Path &filename, uint8 *targetBuffer, uint8 **subFilesArray, uint8 *packedBuffer);
576 void readImpFile(int16
id,
bool techMapFl);
577 void loadNewPortrait();
578 void loadAnimImageSet();
580 void loadTechMapImp(int16 fileId);
581 void loadPlacesFile(uint16 fullPlaceId,
bool forceReloadFl);
588 void drawLeftCenterBox();
589 void displayNextAnimFrame();
590 void displayAnimFrame();
591 void displayAnimFrames(int16 animId,
bool displayMenuBoxFl);
592 void displayFctFullScreen();
593 void copyDirtyRect(int16 minX, int16 minY, int16 maxX, int16 maxY);
595 void displayBufferBmAtPos(
BufferBM *bufferBM, int16 posX, int16 posY);
596 void drawRect(int16 minX, int16 minY, int16 maxX, int16 maxY);
597 void drawColoredRect(int16 minX, int16 minY, int16 maxX, int16 maxY, int16 color);
598 void clearScreen(int16 color);
599 void displayRawDataAtPos(uint8 *imagePtr, int16 posX, int16 posY);
600 void drawString(
const Common::String &str, int16 startX, int16 startY, uint16 textColor);
601 void displayCenteredString(
const Common::String &str, int16 minX, int16 maxX, int16 posY);
602 void displayMenuAnswerString(
const Common::String &str, int16 minX, int16 maxX, int16 posY);
603 void drawMapWindow();
604 void displayGameScreen();
605 void drawUpperLeftBorders();
606 void drawUpperRightBorders();
607 void drawBottomBorders();
608 void drawChar(uint8 curChar, int16 posX, int16 posY);
609 void setTextColorWhite();
610 void setTextColorRed();
611 void setTextColorGrey();
613 void clearBottomTextZone(int16 color);
614 void clearBottomTextZone_2(int16 color);
615 void setNextCharacterPos();
616 void displayCharAtTextPos(
char character);
617 void displayWindow(uint8 *buffer, int16 posX, int16 posY, uint8 *dest);
618 void displayColoredMenuBox(int16 minX, int16 minY, int16 maxX, int16 maxY, int16 color);
621 int16 displayBoxWithText(
const Common::String &str, int16 menuType, int16 displayOption,
bool displayTeamWindowFl,
bool voiceText =
true);
622 bool handleDeathMenu();
623 void displayCombatMenu(int16 charId);
624 void displayMenuItemString(int16 menuBoxId, int16 thisBoxId, int16 minX, int16 maxX, int16 minY,
const char *str);
625 void displayStatusMenu(int16 windowId);
626 void prepareStatusRightWindowIndexes(int16 menuId, int16 charId);
627 void displayCharacterSummary(int16 curMenuLine, int16 npcId);
628 void displayCharacterInformationOrSkills(int16 curMenuLine, int16 npcId);
629 void displayStatusMenuActions(int16 menuId, int16 curMenuLine, int16 npcId);
630 void prepareStatusMenu(int16 windowId, int16 menuId, int16 curMenuLine, int16 charId,
bool refreshFl);
631 void displayWindowAndStatusMenu(int16 charId, int16 windowId, int16 menuId, int16 curMenuLine);
632 int16 displayStringInSmallWindowWithBorder(
const Common::String &str,
bool delayFl, int16 charId, int16 windowId, int16 menuId, int16 curMenuLine);
633 int16 handleStatusMenu(int16 gameMode, int16 charId);
634 void unequipItem(int16 charId, int16 objectId, int16 windowId, int16 menuId, int16 curMenuLine);
635 void tryToggleEquipped(int16 charId, int16 objectId, int16 windowId, int16 menuId, int16 curMenuLine);
636 int16 useObject(int16 charId, int16 objectId, int16 teamMonsterId, int16 menuId, int16 curMenuLine, int16 gameMode);
642 const uint8 *script_readNumberArray(
const uint8 *buffer, int16 destArraySize, int16 *destArray);
643 const uint8 *script_getNumber(
const uint8 *srcBuffer, int16 *retBuf);
644 int16 script_parse(
Common::String str, int16 posX, int16 posY, int16 maxX, int16 maxY,
bool scriptExecuteFlag);
647 void songDelay(
int delay);
648 void playNote(
int frequencyIndex,
int totalDelay);
650 void generateSound1(
int lowFreq,
int highFreq,
int duration);
651 void generateSound2(
int startFreq,
int endFreq,
int speed);
652 void generateSound3();
653 void generateSound4(
int repeat);
654 void generateSound5(
int repeat);
655 void generateSound(int16 soundType);
656 void genericGenerateSound(int16 soundType, int16 repeatCount);
657 void sayText(
const Common::String &text, TTSMenuRestriction menuRestriction, Common::TextToSpeechManager::Action action = Common::TextToSpeechManager::QUEUE)
const;
658 void stopTextToSpeech()
const;
661 void decryptImpFile(
bool techMapFl);
662 void loadImageSet(int16 imageSetId, uint8 *buffer, uint8 **subFilesArray, uint8 *destBuffer);
663 uint32 uncompressBuffer(uint8 *compressedBuf, uint8 *destBuf);
664 int16 getRandom(int16 maxVal);
669 bool getValidationFromUser();
670 uint32 ROR(uint32 val, uint8 shiftVal);
672 void setKeymap(EfhKeymapCode keymapCode);
675 void handleActionSave();
676 void handleActionLoad();
679 uint8 _bufferCharBM[128];
680 int8 *_vgaLineBuffer[200];
684 uint8 _tileBank[3][12000];
685 uint8 _circleImageBuf[40100];
686 uint8 _portraitBuf[25000];
687 uint8 _decompBuf[40100];
688 uint8 _menuBuf[12500];
689 uint8 _windowWithBorderBuf[1500];
690 uint8 _mapArr[19][7000];
691 uint8 _places[12000];
692 uint8 _curPlace[24][24];
696 uint8 _titleSong[1024];
701 uint8 _techDataArr[19][4100];
715 BitmapRef _mapBitmapRefArr[19];
719 uint8 _mapGameMaps[19][64][64];
721 uint8 _defaultBoxColor;
727 int16 _oldAnimImageSetId;
728 int16 _animImageSetId;
729 uint8 _paletteTransformationConstant;
730 uint8 *_circleImageSubFileArray[12];
731 uint8 *_tileBankSubFilesArray[216];
733 int16 _currentTileBankImageSetId[3];
734 int16 _unkRelatedToAnimImageSetId;
736 int16 _currentAnimImageSetId;
737 uint8 *_portraitSubFilesArray[20];
738 int16 _unkAnimRelatedIndex;
739 uint8 *_imp1PtrArray[100];
740 uint8 *_imp2PtrArray[432];
742 int16 _guessAnimationAmount;
743 uint16 _largeMapFlag;
748 bool _engineInitPending;
749 bool _protectionPassed;
754 bool _checkTileDisabledByScriptFl;
755 bool _redrawNeededFl;
756 bool _drawHeroOnMapFl;
757 bool _drawMonstersOnMapFl;
758 bool _textBoxDisabledByScriptFl;
760 int16 _imageSetSubFilesIdx;
761 int16 _oldImageSetSubFilesIdx;
763 int16 _mapPosX, _mapPosY;
764 int16 _oldMapPosX, _oldMapPosY;
765 int16 _techDataId_MapPosX, _techDataId_MapPosY;
766 uint16 _lastMainPlaceId;
768 uint16 _tempTextDelay;
771 bool _ongoingFightFl;
772 bool _statusMenuActive;
773 int16 _menuStatItemArr[15];
775 int16 _menuItemCounter;
776 int16 _selectedMenuBox;
778 bool _sayLowStatusScreen;
779 bool _initiatedTalkByMenu;
EngineFeature
Definition: engine.h:258
Definition: advancedDetector.h:164
Definition: constants.h:27
uint32 CustomEventType
Definition: events.h:204
Definition: serializer.h:79
Out copy(In first, In last, Out dst)
Definition: algorithm.h:52
Definition: constants.h:57
Definition: algorithm.h:29