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 {
272 kActionSkipSongAndIntro,
282 kActionMoveDownRight,
283 kActionCharacter1Status,
284 kActionCharacter2Status,
285 kActionCharacter3Status,
291 kActionCancelCharacterSelection,
307 kActionCancelEnemySelection,
309 kActionExitStatusMenu,
351 { kActionEnemy1, 0 },
352 { kActionEnemy2, 1 },
353 { kActionEnemy3, 2 },
354 { kActionEnemy4, 3 },
355 { kActionEnemy5, 4 },
359 { kActionCharacter1, 0 },
360 { kActionCharacter2, 1 },
361 { kActionCharacter3, 2 },
365 { kActionOption1, 0 },
366 { kActionOption2, 1 },
367 { kActionOption3, 2 },
368 { kActionOption4, 3 },
369 { kActionOption5, 4 },
370 { kActionOption6, 5 },
371 { kActionOption7, 6 },
372 { kActionOption8, 7 },
373 { kActionOption9, 8 },
374 { kActionOption10, 9 },
375 { kActionOption11, 10 },
376 { kActionOption12, 11 },
377 { kActionOption13, 12 },
378 { kActionOption14, 13 },
387 kKeymapStatusMenuNavigation,
388 kKeymapStatusMenuSubMenu,
391 kKeymapCharacterSelection,
392 kKeymapEnemySelection,
397 EfhKeymapCode _keymap;
402 { kKeymapDefault,
"efh-default" },
403 { kKeymapMenu,
"menu" },
404 { kKeymapSkipVideo,
"skip-video" },
405 { kKeymapSkipSong,
"skip-song" },
406 { kKeymapStatusMenu,
"status-menu" },
407 { kKeymapStatusMenuNavigation,
"status-menu-navigation" },
408 { kKeymapStatusMenuSubMenu,
"status-menu-submenu" },
409 { kKeymapInteraction,
"interaction" },
410 { kKeymapFight,
"fight" },
411 { kKeymapCharacterSelection,
"character-selection" },
412 { kKeymapEnemySelection,
"enemy-selection" },
413 { kKeymapDeathMenu,
"death-menu" },
428 uint32 getFeatures()
const;
429 const char *getGameId()
const;
432 const char *getCopyrightString()
const;
449 bool _saveAuthorized;
454 void initMapMonsters();
455 void saveAnimImageSetId();
456 int16 getEquipmentDefense(int16 charId);
457 uint16 getEquippedExclusiveType(int16 charId, int16 exclusiveType,
bool flag);
458 void displayLowStatusScreen(
bool flag);
459 void loadImageSetToTileBank(int16 bankId, int16 setId);
460 void restoreAnimImageSetId();
461 void checkProtection();
463 void copyCurrentPlaceToBuffer(int16
id);
464 uint8 getMapTileInfo(int16 mapPosX, int16 mapPosY);
466 void setTextPos(int16 textPosX, int16 textPosY);
467 void drawGameScreenAndTempText(
bool flag);
468 void drawMap(
bool largeMapFl, int16 mapPosX, int16 mapPosY, int16 mapSize,
bool drawHeroFl,
bool drawMonstersFl);
469 void displaySmallMap(int16 posX, int16 posY);
470 void displayLargeMap(int16 posX, int16 posY);
472 void removeObject(int16 charId, int16 objectId);
473 void totalPartyKill();
474 void removeCharacterFromTeam(int16 teamMemberId);
475 void refreshTeamSize();
476 bool isNpcATeamMember(int16
id);
477 void handleWinSequence();
478 bool giveItemTo(int16 charId, int16 objectId, int16 fromCharId);
479 int16 chooseCharacterToReplace();
480 int16 handleCharacterJoining();
481 void drawText(uint8 *srcPtr, int16 posX, int16 posY, int16 maxX, int16 maxY,
bool flag);
482 void displayMiddleLeftTempText(uint8 *impArray,
bool flag);
483 void transitionMap(int16 centerX, int16 centerY);
484 void setSpecialTechZone(int16 unkId, int16 centerX, int16 centerY);
485 int16 findMapSpecialTileIndex(int16 posX, int16 posY);
486 bool isPosOutOfMap(int16 mapPosX, int16 mapPosY);
495 void showCharacterStatus(uint8 character);
496 void handleNewRoundEffects();
498 void computeMapAnimation();
499 void handleAnimations();
501 int8 checkMonsterMoveCollisionAndTileTexture(int16 monsterId);
502 bool moveMonsterAwayFromTeam(int16 monsterId);
503 bool moveMonsterTowardsTeam(int16 monsterId);
504 bool moveMonsterGroupOther(int16 monsterId, int16 direction);
505 bool moveMonsterGroupRandom(int16 monsterId);
506 int16 computeMonsterGroupDistance(int16 monsterId);
507 bool checkWeaponRange(int16 monsterId, int16 weaponId);
508 bool checkMonsterMovementType(int16
id,
bool teamFlag);
509 bool checkTeamWeaponRange(int16 monsterId);
510 bool checkIfMonsterOnSameLargeMapPlace(int16 monsterId);
511 bool checkMonsterWeaponRange(int16 monsterId);
512 void handleMapMonsterMoves();
513 bool checkMapMonsterAvailability(int16 monsterId);
514 void displayMonsterAnim(int16 monsterId);
515 int16 countAliveMonsters(int16
id);
516 bool checkMonsterGroupDistance1OrLess(int16 monsterId);
517 bool handleTalk(int16 monsterId, int16 arg2, int16 itemId);
518 void startTalkMenu(int16 monsterId);
519 void displayImp1Text(int16 textId);
520 bool handleInteractionText(int16 mapPosX, int16 mapPosY, int16 charId, int16 itemId, int16 arg8, int16 imageSetId);
521 int8 checkTileStatus(int16 mapPosX, int16 mapPosY,
bool teamFl);
522 void computeInitiatives();
523 void redrawScreenForced();
524 int16 countMonsterGroupMembers(int16 monsterGroup);
525 uint16 getXPLevel(uint32 xp);
526 bool isItemCursed(int16 itemId);
527 bool hasObjectEquipped(int16 charId, int16 objectId);
528 void setMapMonsterAggressivenessAndMovementType(int16
id, uint8 mask);
529 bool isMonsterActive(int16 groupId, int16
id);
530 int16 getTileFactId(int16 mapPosX, int16 mapPosY);
531 void setCharacterObjectToBroken(int16 charId, int16 objectId);
532 int16 selectOtherCharFromTeam();
533 bool checkMonsterCollision();
536 bool handleFight(int16 monsterId);
537 void handleFight_checkEndEffect(int16 charId);
538 void handleFight_lastAction_A(int16 teamCharId);
539 void handleFight_lastAction_D(int16 teamCharId);
540 void handleFight_lastAction_H(int16 teamCharId);
541 bool handleFight_lastAction_U(int16 teamCharId);
542 void handleFight_MobstersAttack(
int groupId);
544 bool isMonsterAlreadyFighting(int16 monsterId, int16 teamMonsterId);
545 void createOpponentList(int16 monsterTeamId);
546 void resetTeamMonsterEffects();
547 void initFight(int16 monsterId);
548 void resetTeamMonsterIdArray();
549 bool isTeamMemberStatusNormal(int16
id);
550 void getDeathTypeDescription(int16 victimId, int16 attackerId);
551 int16 determineTeamTarget(int16 charId, int16 unkFied18Val,
bool checkDistanceFl);
552 bool getTeamAttackRoundPlans();
553 void drawCombatScreen(int16 charId,
bool whiteFl,
bool drawFl);
555 bool characterSearchesMonsterCorpse(int16 charId, int16 monsterId);
556 void addReactionText(int16
id);
557 void displayEncounterInfo(
bool WhiteFl);
558 int16 getWeakestMobster(int16 groupNumber);
559 int16 getCharacterScore(int16 charId, int16 itemId);
560 bool checkSpecialItemsOnCurrentPlace(int16 itemId);
561 bool hasAdequateDefense(int16 monsterId, uint8 attackType);
562 bool hasAdequateDefenseNPC(int16 charId, uint8 attackType);
563 void addNewOpponents(int16 monsterId);
564 int16 getTeamMonsterAnimId();
565 int16 selectMonsterGroup();
566 void redrawCombatScreenWithTempText(int16 charId);
567 void handleDamageOnArmor(int16 charId, int16 damage);
570 int32 readFileToBuffer(
const Common::Path &filename, uint8 *destBuffer);
572 void findMapFile(int16 mapId);
573 void rImageFile(
const Common::Path &filename, uint8 *targetBuffer, uint8 **subFilesArray, uint8 *packedBuffer);
575 void readImpFile(int16
id,
bool techMapFl);
576 void loadNewPortrait();
577 void loadAnimImageSet();
579 void loadTechMapImp(int16 fileId);
580 void loadPlacesFile(uint16 fullPlaceId,
bool forceReloadFl);
587 void drawLeftCenterBox();
588 void displayNextAnimFrame();
589 void displayAnimFrame();
590 void displayAnimFrames(int16 animId,
bool displayMenuBoxFl);
591 void displayFctFullScreen();
592 void copyDirtyRect(int16 minX, int16 minY, int16 maxX, int16 maxY);
594 void displayBufferBmAtPos(
BufferBM *bufferBM, int16 posX, int16 posY);
595 void drawRect(int16 minX, int16 minY, int16 maxX, int16 maxY);
596 void drawColoredRect(int16 minX, int16 minY, int16 maxX, int16 maxY, int16 color);
597 void clearScreen(int16 color);
598 void displayRawDataAtPos(uint8 *imagePtr, int16 posX, int16 posY);
599 void drawString(
const Common::String &str, int16 startX, int16 startY, uint16 textColor);
600 void displayCenteredString(
const Common::String &str, int16 minX, int16 maxX, int16 posY);
601 void displayMenuAnswerString(
const Common::String &str, int16 minX, int16 maxX, int16 posY);
602 void drawMapWindow();
603 void displayGameScreen();
604 void drawUpperLeftBorders();
605 void drawUpperRightBorders();
606 void drawBottomBorders();
607 void drawChar(uint8 curChar, int16 posX, int16 posY);
608 void setTextColorWhite();
609 void setTextColorRed();
610 void setTextColorGrey();
612 void clearBottomTextZone(int16 color);
613 void clearBottomTextZone_2(int16 color);
614 void setNextCharacterPos();
615 void displayCharAtTextPos(
char character);
616 void displayWindow(uint8 *buffer, int16 posX, int16 posY, uint8 *dest);
617 void displayColoredMenuBox(int16 minX, int16 minY, int16 maxX, int16 maxY, int16 color);
620 int16 displayBoxWithText(
const Common::String &str, int16 menuType, int16 displayOption,
bool displayTeamWindowFl,
bool voiceText =
true);
621 bool handleDeathMenu();
622 void displayCombatMenu(int16 charId);
623 void displayMenuItemString(int16 menuBoxId, int16 thisBoxId, int16 minX, int16 maxX, int16 minY,
const char *str);
624 void displayStatusMenu(int16 windowId);
625 void prepareStatusRightWindowIndexes(int16 menuId, int16 charId);
626 void displayCharacterSummary(int16 curMenuLine, int16 npcId);
627 void displayCharacterInformationOrSkills(int16 curMenuLine, int16 npcId);
628 void displayStatusMenuActions(int16 menuId, int16 curMenuLine, int16 npcId);
629 void prepareStatusMenu(int16 windowId, int16 menuId, int16 curMenuLine, int16 charId,
bool refreshFl);
630 void displayWindowAndStatusMenu(int16 charId, int16 windowId, int16 menuId, int16 curMenuLine);
631 int16 displayStringInSmallWindowWithBorder(
const Common::String &str,
bool delayFl, int16 charId, int16 windowId, int16 menuId, int16 curMenuLine);
632 int16 handleStatusMenu(int16 gameMode, int16 charId);
633 void unequipItem(int16 charId, int16 objectId, int16 windowId, int16 menuId, int16 curMenuLine);
634 void tryToggleEquipped(int16 charId, int16 objectId, int16 windowId, int16 menuId, int16 curMenuLine);
635 int16 useObject(int16 charId, int16 objectId, int16 teamMonsterId, int16 menuId, int16 curMenuLine, int16 gameMode);
641 const uint8 *script_readNumberArray(
const uint8 *buffer, int16 destArraySize, int16 *destArray);
642 const uint8 *script_getNumber(
const uint8 *srcBuffer, int16 *retBuf);
643 int16 script_parse(
Common::String str, int16 posX, int16 posY, int16 maxX, int16 maxY,
bool scriptExecuteFlag);
646 void songDelay(
int delay);
647 void playNote(
int frequencyIndex,
int totalDelay);
649 void generateSound1(
int lowFreq,
int highFreq,
int duration);
650 void generateSound2(
int startFreq,
int endFreq,
int speed);
651 void generateSound3();
652 void generateSound4(
int repeat);
653 void generateSound5(
int repeat);
654 void generateSound(int16 soundType);
655 void genericGenerateSound(int16 soundType, int16 repeatCount);
656 void sayText(
const Common::String &text, TTSMenuRestriction menuRestriction, Common::TextToSpeechManager::Action action = Common::TextToSpeechManager::QUEUE)
const;
657 void stopTextToSpeech()
const;
660 void decryptImpFile(
bool techMapFl);
661 void loadImageSet(int16 imageSetId, uint8 *buffer, uint8 **subFilesArray, uint8 *destBuffer);
662 uint32 uncompressBuffer(uint8 *compressedBuf, uint8 *destBuf);
663 int16 getRandom(int16 maxVal);
668 bool getValidationFromUser();
669 uint32 ROR(uint32 val, uint8 shiftVal);
671 void setKeymap(EfhKeymapCode keymapCode);
674 void handleActionSave();
675 void handleActionLoad();
678 uint8 _bufferCharBM[128];
679 int8 *_vgaLineBuffer[200];
683 uint8 _tileBank[3][12000];
684 uint8 _circleImageBuf[40100];
685 uint8 _portraitBuf[25000];
686 uint8 _decompBuf[40100];
687 uint8 _menuBuf[12500];
688 uint8 _windowWithBorderBuf[1500];
689 uint8 _mapArr[19][7000];
690 uint8 _places[12000];
691 uint8 _curPlace[24][24];
695 uint8 _titleSong[1024];
700 uint8 _techDataArr[19][4100];
714 BitmapRef _mapBitmapRefArr[19];
718 uint8 _mapGameMaps[19][64][64];
720 uint8 _defaultBoxColor;
726 int16 _oldAnimImageSetId;
727 int16 _animImageSetId;
728 uint8 _paletteTransformationConstant;
729 uint8 *_circleImageSubFileArray[12];
730 uint8 *_tileBankSubFilesArray[216];
732 int16 _currentTileBankImageSetId[3];
733 int16 _unkRelatedToAnimImageSetId;
735 int16 _currentAnimImageSetId;
736 uint8 *_portraitSubFilesArray[20];
737 int16 _unkAnimRelatedIndex;
738 uint8 *_imp1PtrArray[100];
739 uint8 *_imp2PtrArray[432];
741 int16 _guessAnimationAmount;
742 uint16 _largeMapFlag;
747 bool _engineInitPending;
748 bool _protectionPassed;
753 bool _checkTileDisabledByScriptFl;
754 bool _redrawNeededFl;
755 bool _drawHeroOnMapFl;
756 bool _drawMonstersOnMapFl;
757 bool _textBoxDisabledByScriptFl;
759 int16 _imageSetSubFilesIdx;
760 int16 _oldImageSetSubFilesIdx;
762 int16 _mapPosX, _mapPosY;
763 int16 _oldMapPosX, _oldMapPosY;
764 int16 _techDataId_MapPosX, _techDataId_MapPosY;
765 uint16 _lastMainPlaceId;
767 uint16 _tempTextDelay;
770 bool _ongoingFightFl;
771 bool _statusMenuActive;
772 int16 _menuStatItemArr[15];
774 int16 _menuItemCounter;
775 int16 _selectedMenuBox;
777 bool _sayLowStatusScreen;
778 bool _initiatedTalkByMenu;
EngineFeature
Definition: engine.h:260
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