diff options
-rw-r--r-- | devtools/create_kyradat/create_kyradat.cpp | 76 | ||||
-rw-r--r-- | devtools/create_kyradat/create_kyradat.h | 29 | ||||
-rw-r--r-- | devtools/create_kyradat/games.cpp | 51 | ||||
-rw-r--r-- | devtools/create_kyradat/tables.cpp | 180 | ||||
-rw-r--r-- | dists/engine-data/kyra.dat | bin | 385091 -> 458387 bytes | |||
-rw-r--r-- | engines/kyra/eob1.cpp | 14 | ||||
-rw-r--r-- | engines/kyra/eob1.h | 1 | ||||
-rw-r--r-- | engines/kyra/eob2.cpp | 9 | ||||
-rw-r--r-- | engines/kyra/eob2.h | 6 | ||||
-rw-r--r-- | engines/kyra/eobcommon.cpp | 52 | ||||
-rw-r--r-- | engines/kyra/eobcommon.h | 37 | ||||
-rw-r--r-- | engines/kyra/gui_eob.cpp | 29 | ||||
-rw-r--r-- | engines/kyra/items_eob.cpp | 61 | ||||
-rw-r--r-- | engines/kyra/magic_eob.cpp | 35 | ||||
-rw-r--r-- | engines/kyra/resource.h | 28 | ||||
-rw-r--r-- | engines/kyra/staticres.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/staticres_eob.cpp | 40 |
17 files changed, 554 insertions, 96 deletions
diff --git a/devtools/create_kyradat/create_kyradat.cpp b/devtools/create_kyradat/create_kyradat.cpp index ac9416634b..9f749f0dfd 100644 --- a/devtools/create_kyradat/create_kyradat.cpp +++ b/devtools/create_kyradat/create_kyradat.cpp @@ -45,7 +45,7 @@ #include <map> enum { - kKyraDatVersion = 78 + kKyraDatVersion = 79 }; const ExtractFilename extractFilenames[] = { @@ -238,8 +238,26 @@ const ExtractFilename extractFilenames[] = { { kEobBasePryDoorStrings, kTypeStringList, true }, { kEobBaseWarningStrings, kTypeStringList, true }, - { kEobBaseItemSuffixStrings, kTypeStringList, true }, - { kEobBaseItemExtraStrings, kTypeStringList, true }, + + { kEobBaseItemSuffixStringsRings, kTypeStringList, true }, + { kEobBaseItemSuffixStringsPotions, kTypeStringList, true }, + { kEobBaseItemSuffixStringsWands, kTypeStringList, true }, + + { kEobBaseRipItemStrings, kTypeStringList, true }, + { kEobBaseCursedString, kTypeStringList, true }, + { kEobBaseEnchantedString, kTypeStringList, false }, + { kEobBaseMagicObjectStrings, kTypeStringList, true }, + { kEobBaseMagicObject5String, kTypeStringList, true }, + { kEobBasePatternSuffix, kTypeStringList, true }, + { kEobBasePatternGrFix1, kTypeStringList, true }, + { kEobBasePatternGrFix2, kTypeStringList, true }, + { kEobBaseValidateArmorString, kTypeStringList, true }, + { kEobBaseValidateCursedString, kTypeStringList, true }, + { kEobBaseValidateNoDropString, kTypeStringList, true }, + { kEobBasePotionStrings, kTypeStringList, true }, + { kEobBaseWandString, kTypeStringList, true }, + { kEobBaseItemMisuseStrings, kTypeStringList, true }, + { kEobBaseTakenStrings, kTypeStringList, true }, { kEobBasePotionEffectStrings, kTypeStringList, true }, @@ -334,6 +352,10 @@ const ExtractFilename extractFilenames[] = { { kEobBaseInvSlotX, kLolTypeRaw16, false }, { kEobBaseInvSlotY, kTypeRawData, false }, { kEobBaseSlotValidationFlags, kLolTypeRaw16, false }, + + { kEobBaseProjectileWeaponTypes, kTypeRawData, false }, + { kEobBaseWandTypes, kTypeRawData, false }, + { kEobBaseDrawObjPosIndex, kTypeRawData, false }, { kEobBaseFlightObjFlipIndex, kTypeRawData, false }, { kEobBaseFlightObjShpMap, kTypeRawData, false }, @@ -493,6 +515,8 @@ const ExtractFilename extractFilenames[] = { { kEob2Npc2Strings, kTypeStringList, true }, { kEob2MonsterDustStrings, kTypeStringList, true }, { kEob2DranFoolsStrings, kTypeStringList, true }, + { kEob2HornStrings, kTypeStringList, true }, + { kEob2HornSounds, kTypeRawData, false }, // LANDS OF LORE @@ -1301,10 +1325,40 @@ const char *getIdString(const int id) { return "kEobBasePryDoorStrings"; case kEobBaseWarningStrings: return "kEobBaseWarningStrings"; - case kEobBaseItemSuffixStrings: - return "kEobBaseItemSuffixStrings"; - case kEobBaseItemExtraStrings: - return "kEobBaseItemExtraStrings"; + case kEobBaseItemSuffixStringsRings: + return "kEobBaseItemSuffixStringsRings"; + case kEobBaseItemSuffixStringsPotions: + return "kEobBaseItemSuffixStringsPotions"; + case kEobBaseItemSuffixStringsWands: + return "kEobBaseItemSuffixStringsWands"; + case kEobBaseRipItemStrings: + return "kEobBaseRipItemStrings"; + case kEobBaseCursedString: + return "kEobBaseCursedString"; + case kEobBaseEnchantedString: + return "kEobBaseEnchantedString"; + case kEobBaseMagicObjectStrings: + return "kEobBaseMagicObjectStrings"; + case kEobBaseMagicObject5String: + return "kEobBaseMagicObject5String"; + case kEobBasePatternSuffix: + return "kEobBasePatternSuffix"; + case kEobBasePatternGrFix1: + return "kEobBasePatternGrFix1"; + case kEobBasePatternGrFix2: + return "kEobBasePatternGrFix2"; + case kEobBaseValidateArmorString: + return "kEobBaseValidateArmorString"; + case kEobBaseValidateCursedString: + return "kEobBaseValidateCursedString"; + case kEobBaseValidateNoDropString: + return "kEobBaseValidateNoDropString"; + case kEobBasePotionStrings: + return "kEobBasePotionStrings"; + case kEobBaseWandString: + return "kEobBaseWandString"; + case kEobBaseItemMisuseStrings: + return "kEobBaseItemMisuseStrings"; case kEobBaseTakenStrings: return "kEobBaseTakenStrings"; case kEobBasePotionEffectStrings: @@ -1471,6 +1525,10 @@ const char *getIdString(const int id) { return "kEobBaseInvSlotY"; case kEobBaseSlotValidationFlags: return "kEobBaseSlotValidationFlags"; + case kEobBaseProjectileWeaponTypes: + return "kEobBaseProjectileWeaponTypes"; + case kEobBaseWandTypes: + return "kEobBaseWandTypes"; case kEobBaseDrawObjPosIndex: return "kEobBaseDrawObjPosIndex"; case kEobBaseFlightObjFlipIndex: @@ -1770,6 +1828,10 @@ const char *getIdString(const int id) { return "kEob2MonsterDustStrings"; case kEob2DranFoolsStrings: return "kEob2DranFoolsStrings"; + case kEob2HornStrings: + return "kEob2HornStrings"; + case kEob2HornSounds: + return "kEob2HornSounds"; case kLolIngamePakFiles: return "kLolIngamePakFiles"; case kLolCharacterDefs: diff --git a/devtools/create_kyradat/create_kyradat.h b/devtools/create_kyradat/create_kyradat.h index 238a68a084..598050d80c 100644 --- a/devtools/create_kyradat/create_kyradat.h +++ b/devtools/create_kyradat/create_kyradat.h @@ -214,8 +214,26 @@ enum kExtractID { kEobBasePryDoorStrings, kEobBaseWarningStrings, - kEobBaseItemSuffixStrings, - kEobBaseItemExtraStrings, + + kEobBaseItemSuffixStringsRings, + kEobBaseItemSuffixStringsPotions, + kEobBaseItemSuffixStringsWands, + + kEobBaseRipItemStrings, + kEobBaseCursedString, + kEobBaseEnchantedString, + kEobBaseMagicObjectStrings, + kEobBaseMagicObject5String, + kEobBasePatternSuffix, + kEobBasePatternGrFix1, + kEobBasePatternGrFix2, + kEobBaseValidateArmorString, + kEobBaseValidateCursedString, + kEobBaseValidateNoDropString, + kEobBasePotionStrings, + kEobBaseWandString, + kEobBaseItemMisuseStrings, + kEobBaseTakenStrings, kEobBasePotionEffectStrings, @@ -333,6 +351,10 @@ enum kExtractID { kEobBaseInvSlotX, kEobBaseInvSlotY, kEobBaseSlotValidationFlags, + + kEobBaseProjectileWeaponTypes, + kEobBaseWandTypes, + kEobBaseDrawObjPosIndex, kEobBaseFlightObjFlipIndex, kEobBaseFlightObjShpMap, @@ -386,7 +408,6 @@ enum kExtractID { kEob1MonsterDistAttType17, kEob1MonsterDistAttSfx17, - kEob2MainMenuStrings, kEob2IntroStrings, kEob2IntroCPSFiles, @@ -475,6 +496,8 @@ enum kExtractID { kEob2MonsterDustStrings, kEob2DranFoolsStrings, + kEob2HornStrings, + kEob2HornSounds, kLolIngamePakFiles, kLolCharacterDefs, diff --git a/devtools/create_kyradat/games.cpp b/devtools/create_kyradat/games.cpp index ed99d26764..0496acc4b1 100644 --- a/devtools/create_kyradat/games.cpp +++ b/devtools/create_kyradat/games.cpp @@ -1066,8 +1066,23 @@ const int eob1FloppyNeed[] = { kEobBasePryDoorStrings, kEobBaseWarningStrings, - kEobBaseItemSuffixStrings, - kEobBaseItemExtraStrings, + + kEobBaseItemSuffixStringsRings, + kEobBaseItemSuffixStringsPotions, + kEobBaseItemSuffixStringsWands, + + kEobBaseRipItemStrings, + kEobBaseCursedString, + kEobBaseEnchantedString, + kEobBaseMagicObjectStrings, + kEobBaseMagicObject5String, + kEobBasePatternSuffix, + kEobBaseValidateArmorString, + kEobBaseValidateNoDropString, + kEobBasePotionStrings, + kEobBaseWandString, + kEobBaseItemMisuseStrings, + kEobBaseTakenStrings, kEobBasePotionEffectStrings, @@ -1186,6 +1201,10 @@ const int eob1FloppyNeed[] = { kEobBaseInvSlotX, kEobBaseInvSlotY, kEobBaseSlotValidationFlags, + + kEobBaseProjectileWeaponTypes, + kEobBaseWandTypes, + kEobBaseDrawObjPosIndex, kEobBaseFlightObjFlipIndex, kEobBaseFlightObjShpMap, @@ -1249,8 +1268,26 @@ const int eob2FloppyNeed[] = { kEobBasePryDoorStrings, kEobBaseWarningStrings, - kEobBaseItemSuffixStrings, - kEobBaseItemExtraStrings, + + kEobBaseItemSuffixStringsRings, + kEobBaseItemSuffixStringsPotions, + kEobBaseItemSuffixStringsWands, + + kEobBaseRipItemStrings, + kEobBaseCursedString, + kEobBaseEnchantedString, + kEobBaseMagicObjectStrings, + kEobBaseMagicObject5String, + kEobBasePatternSuffix, + kEobBasePatternGrFix1, + kEobBasePatternGrFix2, + kEobBaseValidateArmorString, + kEobBaseValidateCursedString, + kEobBaseValidateNoDropString, + kEobBasePotionStrings, + kEobBaseWandString, + kEobBaseItemMisuseStrings, + kEobBaseTakenStrings, kEobBasePotionEffectStrings, @@ -1371,6 +1408,10 @@ const int eob2FloppyNeed[] = { kEobBaseInvSlotX, kEobBaseInvSlotY, kEobBaseSlotValidationFlags, + + kEobBaseProjectileWeaponTypes, + kEobBaseWandTypes, + kEobBaseDrawObjPosIndex, kEobBaseFlightObjFlipIndex, kEobBaseFlightObjShpMap, @@ -1485,6 +1526,8 @@ const int eob2FloppyNeed[] = { kEob2Npc2Strings, kEob2MonsterDustStrings, kEob2DranFoolsStrings, + kEob2HornStrings, + kEob2HornSounds, kLolEobCommonDscShapeIndex, kLolEobCommonDscX, diff --git a/devtools/create_kyradat/tables.cpp b/devtools/create_kyradat/tables.cpp index 7457f4fd45..c45b3d4c26 100644 --- a/devtools/create_kyradat/tables.cpp +++ b/devtools/create_kyradat/tables.cpp @@ -137,7 +137,7 @@ const ExtractEntrySearchData k1OutroReunionSeqProvider[] = { { UNK_LANG, kPlatformPC, { 0x00000547, 0x0000781C, { { 0xCF, 0xD6, 0x1D, 0x3D, 0x14, 0x40, 0x88, 0x35, 0x36, 0x4F, 0x0B, 0x1F, 0x9A, 0x1C, 0x3D, 0xAC } } } }, // floppy { UNK_LANG, kPlatformPC, { 0x00000547, 0x000077E0, { { 0x80, 0xC4, 0xFC, 0xD5, 0xEB, 0xAA, 0xA5, 0x87, 0x58, 0x5E, 0xAA, 0xE7, 0x01, 0x8F, 0x59, 0x3F } } } }, // floppy { UNK_LANG, kPlatformPC, { 0x000005E5, 0x00008918, { { 0x6A, 0x33, 0x8C, 0xB0, 0x16, 0x57, 0x2D, 0xEB, 0xB2, 0xE1, 0x64, 0x80, 0x98, 0x99, 0x98, 0x19 } } } }, // CD - + { UNK_LANG, kPlatformAmiga, { 0x0000054A, 0x0000785F, { { 0x55, 0xEA, 0xB8, 0x7F, 0x3A, 0x86, 0xCD, 0xA6, 0xBC, 0xA7, 0x9A, 0x39, 0xED, 0xF5, 0x30, 0x0A } } } }, { UNK_LANG, kPlatformUnknown, { 0x00000547, 0x00007876, { { 0x7A, 0xC7, 0x80, 0x34, 0x7A, 0x1B, 0xAB, 0xF8, 0xA7, 0x2F, 0x63, 0x3C, 0xDA, 0x89, 0x3F, 0x82 } } } }, // some floppy DOS + FM-TOWNS @@ -1452,19 +1452,124 @@ const ExtractEntrySearchData kEobBaseWarningStringsProvider[] = { EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEobBaseItemSuffixStringsProvider[] = { - { EN_ANY, kPlatformUnknown, { 0x000000BF, 0x00004241, { { 0x5B, 0x5E, 0xD4, 0x55, 0x86, 0x18, 0x9B, 0x99, 0x5D, 0x39, 0x5A, 0x3F, 0xF7, 0xF0, 0x3B, 0x42 } } } }, // EOB 1 - { EN_ANY, kPlatformUnknown, { 0x000000CC, 0x00004708, { { 0xF9, 0x04, 0x46, 0x9D, 0xD3, 0xF4, 0xFA, 0xE2, 0x12, 0x79, 0xBB, 0x00, 0x20, 0xE7, 0xB7, 0x35 } } } }, // EOB 2 - { DE_DEU, kPlatformUnknown, { 0x000000CA, 0x000047A4, { { 0x89, 0x01, 0x88, 0x85, 0x19, 0x6A, 0xEE, 0xC9, 0x62, 0x65, 0x7E, 0xB7, 0xE6, 0x27, 0xB0, 0x53 } } } }, // EOB 1 - { DE_DEU, kPlatformUnknown, { 0x00000109, 0x00005CAF, { { 0xB0, 0x39, 0xF9, 0xAE, 0x04, 0x3A, 0x96, 0xED, 0x55, 0x0E, 0xB4, 0x0F, 0x53, 0x62, 0x6D, 0xD6 } } } }, // EOB 2 +const ExtractEntrySearchData kEobBaseItemSuffixStringsRingsProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x0000002B, 0x00000F7B, { { 0x8A, 0x27, 0x87, 0x81, 0x5F, 0x74, 0x27, 0xA9, 0x5E, 0x1B, 0xEE, 0xC0, 0xF7, 0x22, 0x8F, 0x57 } } } }, + { DE_DEU, kPlatformUnknown, { 0x00000022, 0x00000C02, { { 0x7D, 0x5F, 0x40, 0xEA, 0xAD, 0xDD, 0x1B, 0xA0, 0xA6, 0xE0, 0x57, 0x7D, 0x0D, 0x60, 0xF4, 0x2C } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x0000002E, 0x00000FF2, { { 0xE1, 0x50, 0xB7, 0xE2, 0xEF, 0xAD, 0x5B, 0x6D, 0x27, 0x35, 0x9C, 0xE7, 0x2D, 0xB2, 0x2E, 0xD0 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseItemSuffixStringsPotionsProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x00000054, 0x00001DDB, { { 0xB6, 0x78, 0xD9, 0x09, 0x1D, 0x09, 0x63, 0xF8, 0x96, 0x74, 0xF0, 0x75, 0x23, 0xF5, 0xD4, 0xC4 } } } }, + { DE_DEU, kPlatformUnknown, { 0x00000064, 0x000024ED, { { 0x10, 0x5A, 0xB8, 0xCA, 0x0F, 0x0D, 0x44, 0x19, 0x9D, 0x3D, 0x76, 0x54, 0xA1, 0x69, 0x97, 0x8B } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x0000006F, 0x00002792, { { 0x1A, 0x71, 0x2B, 0xCC, 0xCA, 0xDA, 0xF6, 0xED, 0x5E, 0xF0, 0x24, 0x20, 0xD7, 0x2D, 0x18, 0x49 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseItemSuffixStringsWandsProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x0000003C, 0x000014EB, { { 0xB5, 0x38, 0x35, 0x57, 0xF2, 0xF8, 0x0E, 0xBA, 0x75, 0x03, 0x1C, 0xCD, 0x46, 0x7D, 0x03, 0x83 } } } }, // EOB 1 + { EN_ANY, kPlatformUnknown, { 0x0000004A, 0x000019B2, { { 0x44, 0x10, 0xE4, 0xAF, 0xAB, 0x19, 0x25, 0x87, 0x2B, 0x15, 0x1C, 0x4C, 0x03, 0x50, 0x41, 0xC4 } } } }, // EOB 2 + { DE_DEU, kPlatformUnknown, { 0x00000040, 0x000016B5, { { 0xEC, 0xF4, 0x71, 0xC1, 0x69, 0x5C, 0xF9, 0xC1, 0xED, 0xC1, 0xED, 0x0C, 0x25, 0x3E, 0x13, 0xB1 } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x00000069, 0x0000252B, { { 0x12, 0x06, 0xEA, 0x2F, 0xAF, 0x47, 0x55, 0x52, 0xB6, 0xD9, 0x11, 0xA4, 0x4F, 0x30, 0xCE, 0x9D } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseRipItemStringsProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x00000025, 0x00000AEA, { { 0x7A, 0x2D, 0x03, 0xA5, 0x94, 0xD1, 0xA2, 0x2C, 0x41, 0x1F, 0xEB, 0x5C, 0xFB, 0xB2, 0xC6, 0x9E } } } }, + { DE_DEU, kPlatformUnknown, { 0x00000024, 0x00000B1B, { { 0xD0, 0x26, 0x19, 0x0B, 0xA5, 0x8A, 0x38, 0x73, 0x14, 0x25, 0x40, 0x5D, 0x24, 0xB8, 0x4E, 0xC5 } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x0000002E, 0x00000D38, { { 0xCE, 0xC5, 0x00, 0x63, 0xBB, 0xF0, 0xC4, 0x0D, 0x50, 0x2B, 0x82, 0x1C, 0xC0, 0xCD, 0xF1, 0xAF } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseCursedStringProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x0000000D, 0x000003C7, { { 0x7F, 0x6B, 0x6A, 0xFE, 0x63, 0xF4, 0x17, 0xAF, 0xFD, 0x00, 0x31, 0x4A, 0x20, 0x9E, 0x8C, 0xEB } } } }, // EOB 1 + { EN_ANY, kPlatformUnknown, { 0x0000000D, 0x000003C7, { { 0x59, 0xD8, 0x84, 0x25, 0xE0, 0x06, 0x51, 0xA4, 0x70, 0xC5, 0x78, 0x22, 0xF0, 0x2D, 0xA0, 0x43 } } } }, // EOB 2 + { DE_DEU, kPlatformUnknown, { 0x00000010, 0x00000514, { { 0x97, 0x41, 0xA6, 0xAE, 0xF8, 0xA8, 0x3E, 0x85, 0xA8, 0x16, 0x01, 0x15, 0x0E, 0x46, 0x13, 0x45 } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x00000013, 0x000005A5, { { 0xEC, 0xD3, 0xA5, 0xD2, 0xAD, 0x7C, 0x5E, 0x0F, 0x42, 0xBC, 0x6E, 0xDE, 0x7E, 0x36, 0x0B, 0x43 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseEnchantedStringProvider[] = { + { UNK_LANG, kPlatformUnknown, { 0x00000007, 0x0000016C, { { 0x98, 0x62, 0xD3, 0xA3, 0x11, 0xAE, 0x0A, 0xBA, 0x8F, 0xE8, 0x30, 0x0B, 0xDC, 0x12, 0x90, 0x3B } } } }, // EOB 1 + { UNK_LANG, kPlatformUnknown, { 0x00000007, 0x0000016C, { { 0x01, 0x91, 0xBD, 0x89, 0xAE, 0x0E, 0x71, 0xEE, 0xBE, 0x31, 0xD9, 0x55, 0x21, 0x61, 0x19, 0xAE } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseMagicObjectStringsProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x0000002B, 0x00000E7D, { { 0x7E, 0x8F, 0x17, 0xEB, 0xE5, 0x5D, 0xEB, 0x9A, 0x84, 0xFF, 0x86, 0x6A, 0x01, 0x3E, 0x04, 0x84 } } } }, + { DE_DEU, kPlatformUnknown, { 0x0000003A, 0x000014E4, { { 0x3D, 0x34, 0x3C, 0xCA, 0xDC, 0xD1, 0xCF, 0x15, 0x69, 0x57, 0xC3, 0xB1, 0x58, 0xDF, 0xE9, 0x9D } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x0000002A, 0x00000EE4, { { 0x9C, 0x38, 0x4B, 0x9B, 0x67, 0x30, 0x4E, 0x88, 0xA9, 0xA2, 0xF8, 0x78, 0x8E, 0xC7, 0xC3, 0x86 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseMagicObject5StringProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x00000006, 0x000001FE, { { 0x74, 0x8D, 0xB9, 0x76, 0xD2, 0x2F, 0x60, 0xD2, 0x36, 0x45, 0x98, 0x4C, 0x0A, 0xE5, 0xE5, 0x0D } } } }, + { DE_DEU, kPlatformUnknown, { 0x00000006, 0x00000204, { { 0xE4, 0xC1, 0xAD, 0x71, 0x87, 0x80, 0x9D, 0x97, 0x91, 0x80, 0x3F, 0x71, 0xD3, 0x62, 0x06, 0xD5 } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x00000007, 0x0000027A, { { 0x44, 0x47, 0x79, 0x46, 0x9B, 0xE5, 0xBD, 0x3C, 0xE8, 0x8D, 0xC6, 0xC5, 0x4E, 0x88, 0x13, 0xC0 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBasePatternSuffixProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x00000009, 0x00000245, { { 0x67, 0x3F, 0x33, 0xA5, 0x3B, 0x5D, 0x2C, 0x9E, 0x15, 0x82, 0x04, 0xE2, 0xD7, 0x34, 0x42, 0x24 } } } }, + { DE_DEU, kPlatformUnknown, { 0x00000006, 0x0000015D, { { 0x33, 0xD6, 0x91, 0x2D, 0xED, 0xE1, 0x43, 0x42, 0x23, 0xB9, 0xE9, 0x3D, 0x48, 0x82, 0x92, 0x1E } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x00000008, 0x00000219, { { 0xCD, 0xDC, 0x7F, 0x8B, 0xBE, 0xD6, 0x05, 0x37, 0xDA, 0xDC, 0x11, 0xC3, 0x1E, 0x7A, 0xE7, 0x13 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBasePatternGrFix1Provider[] = { + { EN_ANY, kPlatformUnknown, { 0x00000009, 0x00000245, { { 0x67, 0x3F, 0x33, 0xA5, 0x3B, 0x5D, 0x2C, 0x9E, 0x15, 0x82, 0x04, 0xE2, 0xD7, 0x34, 0x42, 0x24 } } } }, + { DE_DEU, kPlatformUnknown, { 0x00000006, 0x0000015D, { { 0x33, 0xD6, 0x91, 0x2D, 0xED, 0xE1, 0x43, 0x42, 0x23, 0xB9, 0xE9, 0x3D, 0x48, 0x82, 0x92, 0x1E } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x00000007, 0x0000018A, { { 0x02, 0x5C, 0x86, 0xD9, 0x62, 0x0C, 0x71, 0xB3, 0x77, 0x9C, 0x7B, 0xBC, 0x4D, 0x5B, 0xDB, 0xE7 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBasePatternGrFix2Provider[] = { + { EN_ANY, kPlatformUnknown, { 0x00000009, 0x00000245, { { 0x67, 0x3F, 0x33, 0xA5, 0x3B, 0x5D, 0x2C, 0x9E, 0x15, 0x82, 0x04, 0xE2, 0xD7, 0x34, 0x42, 0x24 } } } }, + { DE_DEU, kPlatformUnknown, { 0x00000006, 0x0000015D, { { 0x33, 0xD6, 0x91, 0x2D, 0xED, 0xE1, 0x43, 0x42, 0x23, 0xB9, 0xE9, 0x3D, 0x48, 0x82, 0x92, 0x1E } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x00000006, 0x00000150, { { 0x48, 0xBE, 0xED, 0xD3, 0xA5, 0x2E, 0xCD, 0xE0, 0x34, 0xBA, 0xA6, 0x8D, 0x7D, 0x00, 0xA2, 0xFF } } } }, // EOB 2 EXTRACT_END_ENTRY }; -const ExtractEntrySearchData kEobBaseItemExtraStringsProvider[] = { - { EN_ANY, kPlatformUnknown, { 0x00000161, 0x000072D6, { { 0x15, 0xD3, 0x0A, 0x45, 0xCD, 0xD7, 0xC5, 0x93, 0x17, 0x3E, 0x1A, 0x0D, 0xAD, 0x50, 0xC2, 0x5E } } } }, // EOB 1 - { EN_ANY, kPlatformUnknown, { 0x00000221, 0x0000B466, { { 0x6E, 0x24, 0x2C, 0xCE, 0x32, 0xC4, 0xF4, 0x4F, 0xC1, 0x79, 0x9A, 0x1C, 0x61, 0xB2, 0x08, 0x4F } } } }, // EOB 2 - { DE_DEU, kPlatformUnknown, { 0x00000191, 0x000087C3, { { 0x3B, 0x27, 0x8D, 0xFF, 0x88, 0x2D, 0x0D, 0x92, 0x47, 0xC5, 0x50, 0xB5, 0x36, 0x01, 0xCC, 0x58 } } } }, // EOB 1 - { DE_DEU, kPlatformUnknown, { 0x00000281, 0x0000D8BF, { { 0x7D, 0xB7, 0x06, 0x9D, 0x1E, 0x1D, 0x87, 0xAF, 0xD4, 0x40, 0xAF, 0xF9, 0xCD, 0xE3, 0x1E, 0x02 } } } }, // EOB 2 +const ExtractEntrySearchData kEobBaseValidateArmorStringProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x00000023, 0x00000B78, { { 0xC2, 0x33, 0x6B, 0xB9, 0xE1, 0x5E, 0x88, 0x5E, 0x22, 0xF2, 0x97, 0x83, 0xF8, 0xC8, 0x8C, 0xAB } } } }, + { DE_DEU, kPlatformUnknown, { 0x00000026, 0x00000D19, { { 0xAD, 0x19, 0xE2, 0xDE, 0x04, 0xF9, 0x8F, 0x92, 0xAC, 0x1A, 0x05, 0xEA, 0x7B, 0xB5, 0x9F, 0x09 } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x00000029, 0x00000E7A, { { 0xEC, 0xA8, 0x2E, 0x8D, 0xB1, 0xC8, 0x0F, 0xCD, 0x24, 0xBD, 0x4B, 0x39, 0x16, 0xC9, 0x53, 0x08 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseValidateCursedStringProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x0000002E, 0x00000F35, { { 0xE7, 0x0E, 0xA1, 0xCE, 0xCC, 0x13, 0xBC, 0x4B, 0x2B, 0x19, 0xEB, 0xA4, 0x05, 0xCF, 0xCF, 0x65 } } } }, + { DE_DEU, kPlatformUnknown, { 0x00000037, 0x000012D8, { { 0x3C, 0x7F, 0x16, 0xCE, 0x40, 0x58, 0xF1, 0x3A, 0xAB, 0x4C, 0x37, 0x82, 0x32, 0x88, 0xA4, 0x2D } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseValidateNoDropStringProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x0000001F, 0x00000A8F, { { 0x61, 0x99, 0x3E, 0x36, 0x49, 0x19, 0xB4, 0xE4, 0xBC, 0xFA, 0xB5, 0x71, 0x0E, 0xD6, 0x15, 0x3C } } } }, // EOB 1 + { EN_ANY, kPlatformUnknown, { 0x00000020, 0x00000AB6, { { 0xAA, 0x0E, 0x64, 0xD1, 0xA2, 0xA6, 0x62, 0x76, 0x51, 0xDF, 0x9E, 0x76, 0x85, 0x42, 0xE1, 0x4A } } } }, // EOB 2 + { DE_DEU, kPlatformUnknown, { 0x00000024, 0x00000C31, { { 0x10, 0xD9, 0x55, 0x69, 0xFE, 0x0A, 0x8C, 0xE5, 0xF7, 0x05, 0x5F, 0x09, 0x3B, 0xC9, 0x93, 0x38 } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x00000027, 0x00000D9F, { { 0xA5, 0xF0, 0x8E, 0x78, 0x0A, 0x37, 0x31, 0xDC, 0xE0, 0xDF, 0xE5, 0xCB, 0x86, 0xDC, 0x21, 0x73 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBasePotionStringsProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x00000017, 0x0000070E, { { 0xD9, 0xCB, 0x26, 0xB6, 0x6F, 0x17, 0x12, 0xB7, 0xB0, 0x95, 0x1B, 0x2A, 0xD8, 0x83, 0x0D, 0x2B } } } }, + { DE_DEU, kPlatformUnknown, { 0x0000001E, 0x000009BD, { { 0xCA, 0xD0, 0x29, 0xB0, 0x7A, 0x2B, 0x0B, 0x69, 0xCA, 0xA4, 0xCA, 0x97, 0xCF, 0x8B, 0x03, 0xAD } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x0000001D, 0x00000964, { { 0x5D, 0xE2, 0xA5, 0x0D, 0x72, 0xE9, 0x8F, 0xC9, 0xFA, 0xF3, 0x41, 0x5A, 0x3F, 0x33, 0xAA, 0x15 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseWandStringProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x00000035, 0x000011EC, { { 0x7C, 0x3D, 0xF1, 0x28, 0x0C, 0x23, 0xD3, 0x18, 0xEE, 0xAD, 0xA7, 0xF4, 0x58, 0xD7, 0x1C, 0x8E } } } }, // EOB 1 + { EN_ANY, kPlatformUnknown, { 0x00000029, 0x00000E47, { { 0xED, 0x2E, 0xD4, 0x4D, 0xDB, 0x90, 0x3F, 0xD0, 0xFB, 0x95, 0xB8, 0xF2, 0xCF, 0x06, 0x08, 0xAF } } } }, // EOB 2 + { DE_DEU, kPlatformUnknown, { 0x00000046, 0x0000186E, { { 0x54, 0x8F, 0x53, 0x34, 0xE8, 0x81, 0x76, 0x71, 0x53, 0x3F, 0x99, 0xE7, 0xCF, 0xB7, 0xC9, 0xD9 } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x0000002F, 0x00001070, { { 0x86, 0x18, 0x00, 0x54, 0x05, 0x3D, 0xC2, 0x26, 0xA7, 0xD9, 0x68, 0xE6, 0xC2, 0x0D, 0x26, 0x99 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseItemMisuseStringsProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x00000066, 0x000022F6, { { 0xE8, 0xB9, 0x07, 0x61, 0x29, 0x90, 0xB0, 0x22, 0x30, 0xC5, 0x0F, 0xAD, 0xCA, 0x6C, 0x83, 0xC6 } } } }, + { DE_DEU, kPlatformUnknown, { 0x00000068, 0x00002472, { { 0xCA, 0xD7, 0xFD, 0x5B, 0x65, 0x72, 0xC7, 0x15, 0xB3, 0xFE, 0xFC, 0xEF, 0x53, 0xFB, 0x57, 0x6C } } } }, // EOB 1 + { DE_DEU, kPlatformUnknown, { 0x0000007E, 0x00002C87, { { 0x5E, 0x11, 0xC9, 0x93, 0xF4, 0xAB, 0x1A, 0x9D, 0xA7, 0x62, 0x71, 0x94, 0x37, 0xCA, 0xE2, 0x25 } } } }, // EOB 2 EXTRACT_END_ENTRY }; @@ -1983,6 +2088,19 @@ const ExtractEntrySearchData kEobBaseSlotValidationFlagsProvider[] = { EXTRACT_END_ENTRY }; +const ExtractEntrySearchData kEobBaseProjectileWeaponTypesProvider[] = { + { UNK_LANG, kPlatformPC, { 0x0000000D, 0x0000063E, { { 0xA6, 0x75, 0x6C, 0x39, 0x96, 0xCB, 0xA7, 0xC2, 0x31, 0xE0, 0x2A, 0x75, 0x30, 0x96, 0x58, 0x05 } } } }, // EOB 1 + { UNK_LANG, kPlatformPC, { 0x0000000C, 0x0000063E, { { 0x3E, 0x99, 0x6D, 0xE4, 0x6B, 0xC8, 0x49, 0x1B, 0x17, 0xD2, 0xBE, 0x9B, 0xE0, 0xCD, 0xA1, 0xC2 } } } }, // EOB 1 + { UNK_LANG, kPlatformPC, { 0x0000000F, 0x00000829, { { 0x9F, 0x6A, 0x13, 0x8A, 0xA7, 0x40, 0xE8, 0x40, 0x2E, 0x87, 0x49, 0x6B, 0x67, 0xED, 0xE8, 0xCE } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEobBaseWandTypesProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000007, 0x00000162, { { 0xDB, 0x5D, 0x34, 0x70, 0x41, 0xAB, 0x8F, 0x75, 0xC8, 0x61, 0x8E, 0x44, 0x82, 0xCF, 0x28, 0x03 } } } }, // EOB 1 + { UNK_LANG, kPlatformPC, { 0x00000008, 0x00000175, { { 0x01, 0xC2, 0xF0, 0xC6, 0x1C, 0xD0, 0x14, 0xD9, 0xB8, 0xF5, 0x9C, 0xFC, 0x22, 0xE4, 0xA0, 0xA7 } } } }, // EOB 2 + EXTRACT_END_ENTRY +}; + const ExtractEntrySearchData kEobBaseDrawObjPosIndexProvider[] = { { UNK_LANG, kPlatformPC, { 0x00000014, 0x00000028, { { 0x44, 0x46, 0x8C, 0x94, 0x76, 0x24, 0x08, 0xC7, 0x1F, 0x1B, 0x10, 0xD7, 0xDF, 0x18, 0x6C, 0x0D } } } }, EXTRACT_END_ENTRY @@ -2778,6 +2896,18 @@ const ExtractEntrySearchData kEob2DranFoolsStringsProvider[] = { EXTRACT_END_ENTRY }; +const ExtractEntrySearchData kEob2HornStringsProvider[] = { + { EN_ANY, kPlatformUnknown, { 0x0000009A, 0x00003541, { { 0xA5, 0x4D, 0x88, 0xAC, 0x1C, 0xCD, 0x57, 0xD4, 0x1E, 0x9F, 0xAE, 0x13, 0x46, 0xAD, 0xA0, 0x22 } } } }, + { DE_DEU, kPlatformUnknown, { 0x000000AB, 0x00003B6C, { { 0x36, 0x34, 0xB3, 0xB1, 0x55, 0x66, 0x7A, 0x90, 0x97, 0x01, 0xDC, 0x4A, 0xAF, 0x17, 0x6B, 0x5A } } } }, + EXTRACT_END_ENTRY +}; + +const ExtractEntrySearchData kEob2HornSoundsProvider[] = { + { UNK_LANG, kPlatformPC, { 0x00000004, 0x00000106, { { 0x3E, 0x7B, 0x96, 0xFD, 0xCA, 0x4E, 0xA7, 0xA6, 0xB8, 0x82, 0x67, 0xCF, 0x93, 0x86, 0xE4, 0x45 } } } }, + + EXTRACT_END_ENTRY +}; + const ExtractEntrySearchData kLolIngamePakFilesProvider[] = { { UNK_LANG, kPlatformPC, { 0x00000088, 0x0000224F, { { 0xDA, 0x24, 0x18, 0xA3, 0xEF, 0x16, 0x70, 0x8F, 0xA8, 0xC2, 0x2E, 0xC2, 0xED, 0x39, 0x03, 0xD1 } } } }, { UNK_LANG, kPlatformPC98, { 0x00000084, 0x00002125, { { 0x7A, 0x89, 0xE2, 0x36, 0xEC, 0x6F, 0x52, 0x2B, 0xEF, 0xBA, 0x3D, 0x28, 0x54, 0xDA, 0xFB, 0x72 } } } }, @@ -3412,8 +3542,26 @@ const ExtractEntry extractProviders[] = { { kEobBasePryDoorStrings, kEobBasePryDoorStringsProvider }, { kEobBaseWarningStrings, kEobBaseWarningStringsProvider }, - { kEobBaseItemSuffixStrings, kEobBaseItemSuffixStringsProvider }, - { kEobBaseItemExtraStrings, kEobBaseItemExtraStringsProvider }, + + { kEobBaseItemSuffixStringsRings, kEobBaseItemSuffixStringsRingsProvider }, + { kEobBaseItemSuffixStringsPotions, kEobBaseItemSuffixStringsPotionsProvider }, + { kEobBaseItemSuffixStringsWands, kEobBaseItemSuffixStringsWandsProvider }, + + { kEobBaseRipItemStrings, kEobBaseRipItemStringsProvider }, + { kEobBaseCursedString, kEobBaseCursedStringProvider }, + { kEobBaseEnchantedString, kEobBaseEnchantedStringProvider }, + { kEobBaseMagicObjectStrings, kEobBaseMagicObjectStringsProvider }, + { kEobBaseMagicObject5String, kEobBaseMagicObject5StringProvider }, + { kEobBasePatternSuffix, kEobBasePatternSuffixProvider }, + { kEobBasePatternGrFix1, kEobBasePatternGrFix1Provider }, + { kEobBasePatternGrFix2, kEobBasePatternGrFix2Provider }, + { kEobBaseValidateArmorString, kEobBaseValidateArmorStringProvider }, + { kEobBaseValidateCursedString, kEobBaseValidateCursedStringProvider }, + { kEobBaseValidateNoDropString, kEobBaseValidateNoDropStringProvider }, + { kEobBasePotionStrings, kEobBasePotionStringsProvider }, + { kEobBaseWandString, kEobBaseWandStringProvider }, + { kEobBaseItemMisuseStrings, kEobBaseItemMisuseStringsProvider }, + { kEobBaseTakenStrings, kEobBaseTakenStringsProvider }, { kEobBasePotionEffectStrings, kEobBasePotionEffectStringsProvider }, @@ -3507,6 +3655,10 @@ const ExtractEntry extractProviders[] = { { kEobBaseInvSlotX, kEobBaseInvSlotXProvider }, { kEobBaseInvSlotY, kEobBaseInvSlotYProvider }, { kEobBaseSlotValidationFlags, kEobBaseSlotValidationFlagsProvider }, + + { kEobBaseProjectileWeaponTypes, kEobBaseProjectileWeaponTypesProvider }, + { kEobBaseWandTypes, kEobBaseWandTypesProvider }, + { kEobBaseDrawObjPosIndex, kEobBaseDrawObjPosIndexProvider }, { kEobBaseFlightObjFlipIndex, kEobBaseFlightObjFlipIndexProvider }, { kEobBaseFlightObjShpMap, kEobBaseFlightObjShpMapProvider }, @@ -3667,6 +3819,8 @@ const ExtractEntry extractProviders[] = { { kEob2Npc2Strings, kEob2Npc2StringsProvider }, { kEob2MonsterDustStrings, kEob2MonsterDustStringsProvider }, { kEob2DranFoolsStrings, kEob2DranFoolsStringsProvider }, + { kEob2HornStrings, kEob2HornStringsProvider }, + { kEob2HornSounds, kEob2HornSoundsProvider }, { kLolIngamePakFiles, kLolIngamePakFilesProvider }, { kLolCharacterDefs, kLolCharacterDefsProvider }, diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat Binary files differindex 902d55c457..cd51c0b54c 100644 --- a/dists/engine-data/kyra.dat +++ b/dists/engine-data/kyra.dat diff --git a/engines/kyra/eob1.cpp b/engines/kyra/eob1.cpp index 70031bfd27..a9051de833 100644 --- a/engines/kyra/eob1.cpp +++ b/engines/kyra/eob1.cpp @@ -210,6 +210,20 @@ void EobEngine::drawDoorIntern(int type, int index, int x, int y, int w, int wal } } +bool EobEngine::checkPartyStatusExtra() { + _screen->copyPage(0, 10); + gui_drawBox(0, 121, 319, 200, _color2_1, _color1_1, _bkgColor_1); + _screen->setScreenDim(9); + _txt->printMessage(_menuStringsDefeat[0]); + while (!shouldQuit()) { + removeInputTop(); + if (checkInput(0, false, 0) & 0xff) + break; + } + _screen->copyPage(10, 0); + return true; +} + uint32 EobEngine::convertSpellFlagToEob2Format(uint32 flag, int ignoreInvisibility) { uint32 res = 0; if (flag & 0x01) diff --git a/engines/kyra/eob1.h b/engines/kyra/eob1.h index 8a959e9fa4..3460ac7591 100644 --- a/engines/kyra/eob1.h +++ b/engines/kyra/eob1.h @@ -85,6 +85,7 @@ private: const uint8 *_doorSwitchCoords; // Misc + bool checkPartyStatusExtra(); uint32 convertSpellFlagToEob2Format(uint32 flag, int ignoreInvisibility); uint32 convertCharacterEffectFlagToEob2Format(uint32 flag); }; diff --git a/engines/kyra/eob2.cpp b/engines/kyra/eob2.cpp index 1931572cd2..c3169b10bf 100644 --- a/engines/kyra/eob2.cpp +++ b/engines/kyra/eob2.cpp @@ -350,9 +350,16 @@ bool DarkMoonEngine::restParty_extraAbortCondition() { return true; } -void DarkMoonEngine::checkPartyStatusExtra() { +void DarkMoonEngine::useHorn(int charIndex, int weaponSlot) { + int v = _items[_characters[charIndex].inventory[weaponSlot]].value - 1; + _txt->printMessage(_hornStrings[v]); + snd_playSoundEffect(_hornSounds[v]); +} + +bool DarkMoonEngine::checkPartyStatusExtra() { if (checkScriptFlag(0x10)) seq_dranFools(); + return _gui->confirmDialogue2(14, 67, 1); } void DarkMoonEngine::drawLightningColumn() { diff --git a/engines/kyra/eob2.h b/engines/kyra/eob2.h index 93a3518f35..e1c574a243 100644 --- a/engines/kyra/eob2.h +++ b/engines/kyra/eob2.h @@ -120,11 +120,15 @@ private: bool restParty_extraAbortCondition(); // misc - void checkPartyStatusExtra(); + void useHorn(int charIndex, int weaponSlot); + bool checkPartyStatusExtra(); void drawLightningColumn(); int resurrectionSelectDialogue(); int charSelectDialogue(); void characterLevelGain(int charIndex); + + const char *const *_hornStrings; + const uint8 *_hornSounds; }; } // End of namespace Kyra diff --git a/engines/kyra/eobcommon.cpp b/engines/kyra/eobcommon.cpp index bb3848e429..07c1f0760a 100644 --- a/engines/kyra/eobcommon.cpp +++ b/engines/kyra/eobcommon.cpp @@ -469,9 +469,8 @@ bool EobCoreEngine::checkPartyStatus(bool handleDeath) { return true; gui_drawAllCharPortraitsWithStats(); - checkPartyStatusExtra(); - if (_gui->confirmDialogue2(14, 67, 1)) { + if (checkPartyStatusExtra()) { _screen->setFont(Screen::FID_8_FNT); gui_updateControls(); if (_gui->runLoadMenu(0, 0)) { @@ -1436,7 +1435,7 @@ void EobCoreEngine::displayParchment(int id) { restoreAfterDialogueSequence(); } -void EobCoreEngine::useSlotWeapon(int charIndex, int slotIndex, int item) { +void EobCoreEngine::useSlotWeapon(int charIndex, int slotIndex, Item item) { EobCharacter *c = &_characters[charIndex]; int tp = item ? _items[item].type : 0; @@ -1454,7 +1453,7 @@ void EobCoreEngine::useSlotWeapon(int charIndex, int slotIndex, int item) { } else if (ep == 2) { inflict = thrownAttack(charIndex, slotIndex, item); } else if (ep == 3) { - inflict = bowAttack(charIndex, item); + inflict = projectileWeaponAttack(charIndex, item); gui_drawCharPortraitWithStats(charIndex); } @@ -1477,7 +1476,7 @@ void EobCoreEngine::useSlotWeapon(int charIndex, int slotIndex, int item) { setCharEventTimer(charIndex, 18, inflict >= -2 ? slotIndex + 2 : slotIndex, 1); } -int EobCoreEngine::closeDistanceAttack(int charIndex, int item) { +int EobCoreEngine::closeDistanceAttack(int charIndex, Item item) { if (charIndex > 1) return -3; @@ -1527,7 +1526,7 @@ int EobCoreEngine::closeDistanceAttack(int charIndex, int item) { return 0; } -int EobCoreEngine::thrownAttack(int charIndex, int slotIndex, int item) { +int EobCoreEngine::thrownAttack(int charIndex, int slotIndex, Item item) { int d = charIndex > 3 ? charIndex - 2 : charIndex; if (!launchObject(charIndex, item, _currentBlock, _dropItemDirIndex[(_currentDirection << 2) + d], _currentDirection, _items[item].type)) return 0; @@ -1539,7 +1538,42 @@ int EobCoreEngine::thrownAttack(int charIndex, int slotIndex, int item) { return 0; } -int EobCoreEngine::bowAttack(int charIndex, int item) { +int EobCoreEngine::projectileWeaponAttack(int charIndex, Item item) { + int tp = _items[item].type; + int t = _projectileWeaponAmmoTypes[_flags.gameID == GI_EOB1 ? tp - 2 : tp]; + Item ammoItem = 0; + + if (t == 16) { + if (_characters[charIndex].inventory[0] && _items[_characters[charIndex].inventory[0]].type == 16) + SWAP(ammoItem, _characters[charIndex].inventory[0]); + else if (_characters[charIndex].inventory[1] && _items[_characters[charIndex].inventory[1]].type == 16) + SWAP(ammoItem, _characters[charIndex].inventory[1]); + else if (_characters[charIndex].inventory[16]) + ammoItem = getQueuedItem(&_characters[charIndex].inventory[16], 0, -1); + + } else { + for (int i = 0; i < 27; i++) { + if (_items[_characters[charIndex].inventory[i]].type == t) { + SWAP(ammoItem, _characters[charIndex].inventory[i] ); + if (i < 2) + gui_drawCharPortraitWithStats(charIndex); + break; + } + } + } + + if (!ammoItem) + return -4; + + int c = charIndex; + if (c > 3) + c -= 2; + + if (launchObject(charIndex, ammoItem, _currentBlock, _dropItemDirIndex[(_currentDirection << 2) + c], _currentDirection, tp)) { + snd_playSoundEffect(tp == 7 ? 26 : 11); + _sceneUpdateRequired = true; + } + return 0; } @@ -1773,9 +1807,9 @@ void EobCoreEngine::monsterCloseAttack(EobMonsterInPlay *m) { } _characters[c].inventory[slot] = 0; - _txt->printMessage(_itemExtraStrings[(_characters[c].raceSex & 1) ^ 1], -1, _characters[c].name); + _txt->printMessage(_ripItemStrings[(_characters[c].raceSex & 1) ^ 1], -1, _characters[c].name); printFullItemName(itm); - _txt->printMessage(_itemExtraStrings[2]); + _txt->printMessage(_ripItemStrings[2]); } gui_drawCharPortraitWithStats(c); } diff --git a/engines/kyra/eobcommon.h b/engines/kyra/eobcommon.h index db56951b9a..39919ca086 100644 --- a/engines/kyra/eobcommon.h +++ b/engines/kyra/eobcommon.h @@ -446,6 +446,8 @@ protected: Item _lastUsedItem; const uint16 *_slotValidationFlags; + const int8 *_projectileWeaponAmmoTypes; + const uint8 *_wandTypes; EobFlyingObject *_flyingObjects; const uint8 *_drawObjPosIndex; @@ -758,8 +760,26 @@ protected: const char *const *_pryDoorStrings; const char *const *_warningStrings; - const char *const *_itemExtraStrings; - const char *const *_itemSuffixStrings; + + const char *const *_ripItemStrings; + const char *const *_cursedString; + const char *const *_enchantedString; + const char *const *_magicObjectStrings; + const char *const *_magicObjectString5; + const char *const *_patternSuffix; + const char *const *_patternGrFix1; + const char *const *_patternGrFix2; + const char *const *_validateArmorString; + const char *const *_validateCursedString; + const char *const *_validateNoDropString; + const char *const *_potionStrings; + const char *const *_wandStrings; + const char *const *_itemMisuseStrings; + + const char *const *_suffixStringsRings; + const char *const *_suffixStringsPotions; + const char *const *_suffixStringsWands; + const char *const *_takenStrings; const char *const *_potionEffectStrings; @@ -782,7 +802,8 @@ protected: // misc void delay(uint32 millis, bool doUpdate = false, bool isMainLoop = false); void displayParchment(int id); - virtual void checkPartyStatusExtra() {} + virtual void useHorn(int charIndex, int weaponSlot) {} + virtual bool checkPartyStatusExtra() = 0; virtual void drawLightningColumn() {} virtual int resurrectionSelectDialogue() { return -1; } @@ -802,10 +823,10 @@ protected: GUI_Eob *_gui; // fight - void useSlotWeapon(int charIndex, int slotIndex, int item); - int closeDistanceAttack(int charIndex, int item); - int thrownAttack(int charIndex, int slotIndex, int item); - int bowAttack(int charIndex, int item); + void useSlotWeapon(int charIndex, int slotIndex, Item item); + int closeDistanceAttack(int charIndex, Item item); + int thrownAttack(int charIndex, int slotIndex, Item item); + int projectileWeaponAttack(int charIndex, Item item); void inflictMonsterDamage(EobMonsterInPlay *m, int damage, bool giveExperience); void calcAndInflictMonsterDamage(EobMonsterInPlay *m, int times, int pips, int offs, int flags, int b, int damageType); @@ -844,6 +865,7 @@ protected: void useMagicBookOrSymbol(int charIndex, int type); void useMagicScroll(int charIndex, int type, int weaponSlot); void usePotion(int charIndex, int weaponSlot); + void useWand(int charIndex, int weaponSlot); void castSpell(int spell, int weaponSlot); void removeCharacterEffect(int spell, int charIndex, int showWarning); @@ -1015,6 +1037,7 @@ protected: const char *const *_menuStringsRest4; const char *const *_menuStringsDefeat; const char *_errorSlotEmptyString; + const char *_errorSlotNoNameString; const char *const *_menuStringsTransfer; const char *const *_menuStringsSpec; diff --git a/engines/kyra/gui_eob.cpp b/engines/kyra/gui_eob.cpp index c13b4da7e9..c7972299d1 100644 --- a/engines/kyra/gui_eob.cpp +++ b/engines/kyra/gui_eob.cpp @@ -924,7 +924,10 @@ int EobCoreEngine::clickedWeaponSlot(Button *button) { if (!testCharacter(button->arg, 1)) return 1; - static const uint8 sY[] = { 24, 24, 80, 80, 136, 136 }; + // Fix this using the coordinates from gui_drawWeaponSlot(). + // The coordinates used in the original are slightly wrong + // (most noticeable for characters 5 and 6). + static const uint8 sY[] = { 27, 27, 79, 79, 131, 131 }; int slot = sY[button->arg] > _mouseY ? 0 : 1; if ((_gui->_flagsMouseLeft & 0x7f) == 1) @@ -1298,19 +1301,17 @@ void EobCoreEngine::gui_processWeaponSlotClickLeft(int charIndex, int slotIndex) } void EobCoreEngine::gui_processWeaponSlotClickRight(int charIndex, int slotIndex) { - const char * const *strs = &_itemExtraStrings[_flags.gameID == GI_EOB1 ? 17 : (_flags.lang == Common::DE_DEU ? 26 : 22)]; - if (!testCharacter(charIndex, 0x0d)) return; - uint16 itm = _characters[charIndex].inventory[slotIndex]; + Item itm = _characters[charIndex].inventory[slotIndex]; int wslot = slotIndex < 2 ? slotIndex : -1; if (slotIndex < 2 && (!validateWeaponSlotItem(charIndex, slotIndex) || (!_currentControlMode && (_characters[charIndex].disabledSlots & (1 << slotIndex))))) return; if (!itemUsableByCharacter(charIndex, itm)) - _txt->printMessage(strs[0], -1, _characters[charIndex].name); + _txt->printMessage(_itemMisuseStrings[0], -1, _characters[charIndex].name); if (!itm && slotIndex > 1) return; @@ -1323,7 +1324,7 @@ void EobCoreEngine::gui_processWeaponSlotClickRight(int charIndex, int slotIndex case 0: case 16: // Item automatically used when worn - _txt->printMessage(strs[1]); + _txt->printMessage(_itemMisuseStrings[1]); break; case 1: @@ -1340,7 +1341,7 @@ void EobCoreEngine::gui_processWeaponSlotClickRight(int charIndex, int slotIndex case 13: case 15: // Item not used that way - _txt->printMessage(strs[2]); + _txt->printMessage(_itemMisuseStrings[2]); break; case 5: @@ -1377,12 +1378,12 @@ void EobCoreEngine::gui_processWeaponSlotClickRight(int charIndex, int slotIndex break; case 18: - ep = ep; + useWand(charIndex, wslot); break; case 19: // eob2 horn - ep = ep; + useHorn(charIndex, wslot); break; case 20: @@ -1397,7 +1398,7 @@ void EobCoreEngine::gui_processWeaponSlotClickRight(int charIndex, int slotIndex break; } - if (ep == 1 && charIndex >= 2) + if (_flags.gameID == GI_EOB1 || (ep == 1 && charIndex >= 2)) return; _lastUsedItem = itm; @@ -3837,8 +3838,12 @@ const char *GUI_Eob::getMenuString(int id) { return _vm->_menuStringsPoison[0]; else if (id >= 56) return _vm->_menuStringsHead[id - 56]; - else if (id >= 53) - return _vm->_menuStringsDrop2[id - 53]; + else if (id == 55) + return _vm->_menuStringsDrop2[_vm->game() == GI_EOB1 ? 1 : 2]; + else if (id == 54) + return _vm->_errorSlotNoNameString; + else if (id == 53) + return _vm->_menuStringsDrop2[0]; else if (id >= 48) return _vm->_menuStringsScribe[id - 48]; else if (id == 47) diff --git a/engines/kyra/items_eob.cpp b/engines/kyra/items_eob.cpp index 6c331e80be..de5fe6b32a 100644 --- a/engines/kyra/items_eob.cpp +++ b/engines/kyra/items_eob.cpp @@ -192,10 +192,8 @@ int EobCoreEngine::validateInventorySlotForItem(Item item, int charIndex, int sl if (item < 0) return 0; - int offset = (_flags.gameID == GI_EOB1) ? 11 : (_flags.lang == Common::DE_DEU ? 16 : 12); - if (slot == 17 && item && !itemUsableByCharacter(charIndex, item)) { - _txt->printMessage(_itemExtraStrings[offset], -1, _characters[charIndex].name); + _txt->printMessage(_validateArmorString[0], -1, _characters[charIndex].name); return 0; } @@ -203,7 +201,8 @@ int EobCoreEngine::validateInventorySlotForItem(Item item, int charIndex, int sl int ex = _itemTypes[_items[itm].type].extraProperties & 0x7f; if (slot < 2 && _items[itm].flags & 0x20 && ex > 0 && ex < 4) { - _txt->printMessage(_itemExtraStrings[offset + 1], -1, _characters[charIndex].name); + if (_flags.gameID == GI_EOB2) + _txt->printMessage(_validateCursedString[0], -1, _characters[charIndex].name); return 0; } @@ -211,7 +210,7 @@ int EobCoreEngine::validateInventorySlotForItem(Item item, int charIndex, int sl if (v & _slotValidationFlags[slot]) return 1; - _txt->printMessage(_itemExtraStrings[offset + (_flags.gameID == GI_EOB1 ? 1 : 2)]); + _txt->printMessage(_validateNoDropString[0]); return 0; } @@ -317,7 +316,8 @@ void EobCoreEngine::printFullItemName(Item item) { const char *tstr2 = 0; const char *tstr3 = 0; - int e = 0; + + bool correctSuffixCase = false; Common::String tmpString; @@ -330,43 +330,46 @@ void EobCoreEngine::printFullItemName(Item item) { if (v == 0) tmpString = nameUnid; else if (v < 0) - tmpString = Common::String::format(_itemExtraStrings[3], v, nameUnid); + tmpString = Common::String::format(_cursedString[0], v, nameUnid); else - tmpString = Common::String::format(_itemExtraStrings[4], v, nameUnid); + tmpString = Common::String::format(_enchantedString[0], v, nameUnid); break; case 9: - tstr2 = _itemExtraStrings[5]; + tstr2 = _magicObjectStrings[0]; tstr3 = _spells[v].name; - e = 1; + correctSuffixCase = true; break; case 10: - tstr2 = _itemExtraStrings[6]; + tstr2 = _magicObjectStrings[1]; tstr3 = _spells[_flags.gameID == GI_EOB1 ? (_clericSpellOffset + v) : v].name; - e = 1; + correctSuffixCase = true; break; case 14: - tstr2 = _itemExtraStrings[8]; - tstr3 = _itemSuffixStrings[8]; + tstr2 = _magicObjectStrings[3]; + if (_flags.gameID == GI_EOB1) + v--; + tstr3 = _suffixStringsPotions[v]; break; case 16: - tstr2 = _itemExtraStrings[7]; - tstr3 = _itemSuffixStrings[v + 6]; - e = 0; + tstr2 = _magicObjectStrings[2]; + tstr3 = _suffixStringsRings[v]; break; case 18: - if (v == 5) { - tstr2 = _itemExtraStrings[_flags.lang == Common::EN_ANY ? 9 : 10]; - e = 1; + if (_flags.gameID == GI_EOB2 && v == 5) { + if (_flags.lang == Common::DE_DEU) + tstr2 = _magicObjectString5[0]; + else + tstr3 = _magicObjectString5[0]; + correctSuffixCase = true; } else { - tstr2 = _itemExtraStrings[9]; - e = 0; + tstr2 = _magicObjectStrings[4]; } - tstr3 = _itemSuffixStrings[v + (_flags.lang == Common::EN_ANY ? 11 : 15)]; + tstr3 = _suffixStringsWands[v]; break; default: @@ -377,15 +380,15 @@ void EobCoreEngine::printFullItemName(Item item) { if (tstr3) { if (!tstr2) { - tmpString = Common::String::format(_itemExtraStrings[_flags.lang == Common::EN_ANY ? 10 : 11], tstr3); + tmpString = tstr3; } else { - if (e == 1) { - if (tstr2 == _itemExtraStrings[12]) - tmpString = Common::String::format(_itemExtraStrings[_flags.lang == Common::EN_ANY ? 11 : 14], tstr2, tstr3); + if (correctSuffixCase) { + if (tstr2 == _magicObjectString5[0]) + tmpString = Common::String::format(_patternGrFix2[0], tstr2, tstr3); else - tmpString = Common::String::format(_itemExtraStrings[_flags.gameID == GI_EOB1 ? 10 : (_flags.lang == Common::EN_ANY ? 11 : 13)], tstr2, tstr3); + tmpString = Common::String::format(_patternGrFix1[0], tstr2, tstr3); } else { - tmpString = Common::String::format(_itemExtraStrings[_flags.gameID == GI_EOB1 ? 10 : (_flags.lang == Common::EN_ANY ? 11 : 15)], tstr2, tstr3); + tmpString = Common::String::format(_patternSuffix[0], tstr2, tstr3); } } } diff --git a/engines/kyra/magic_eob.cpp b/engines/kyra/magic_eob.cpp index 2275bd53a4..593ef63544 100644 --- a/engines/kyra/magic_eob.cpp +++ b/engines/kyra/magic_eob.cpp @@ -76,7 +76,6 @@ void EobCoreEngine::useMagicScroll(int charIndex, int type, int weaponSlot) { void EobCoreEngine::usePotion(int charIndex, int weaponSlot) { EobCharacter *c = &_characters[_openBookChar]; - int offset = (_flags.gameID == GI_EOB1) ? 13 : (_flags.lang == Common::DE_DEU ? 19 : 15); int val = deleteInventoryItem(charIndex, weaponSlot); snd_playSoundEffect(10); @@ -100,7 +99,7 @@ void EobCoreEngine::usePotion(int charIndex, int weaponSlot) { break; case 3: - statusAttack(charIndex, 2, _itemExtraStrings[offset], 0, 1, 8, 1); + statusAttack(charIndex, 2, _potionStrings[0], 0, 1, 8, 1); c->effectFlags &= ~0x2000; if (c->flags & 2) return; @@ -136,7 +135,37 @@ void EobCoreEngine::usePotion(int charIndex, int weaponSlot) { break; } - _txt->printMessage(_itemExtraStrings[offset + 1], -1, c->name, _potionEffectStrings[val]); + _txt->printMessage(_potionStrings[1], -1, c->name, _potionEffectStrings[val]); +} + +void EobCoreEngine::useWand(int charIndex, int weaponSlot) { + int v = _items[_characters[charIndex].inventory[weaponSlot]].value - 1; + if (!v) { + _txt->printMessage(_wandStrings[0]); + return; + } + + if (v != 5) + useMagicScroll(charIndex, _wandTypes[v], weaponSlot); + else if (_flags.gameID == GI_EOB2) + useMagicScroll(charIndex, 64, weaponSlot); + else { + uint16 bl1 = calcNewBlockPosition(_currentBlock, _currentDirection); + uint16 bl2 = calcNewBlockPosition(bl1, _currentDirection); + snd_playSoundEffect(98); + sparkEffectOffensive(); + + if ((_wllWallFlags[_levelBlockProperties[bl2].walls[_currentDirection ^ 2]] & 4) && !(_levelBlockProperties[bl2].flags & 7) && (_levelBlockProperties[bl1].flags & 7)) { + for (int i = 0; i < 30; i++) { + if (_monsters[i].block != bl1) + continue; + placeMonster(&_monsters[i], bl2, -1); + _sceneUpdateRequired = true; + } + } else { + _txt->printMessage(_wandStrings[1]); + } + } } void EobCoreEngine::castSpell(int spell, int weaponSlot) { diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h index 889865b8ea..02ee384f5c 100644 --- a/engines/kyra/resource.h +++ b/engines/kyra/resource.h @@ -287,8 +287,26 @@ enum KyraResources { kEobBasePryDoorStrings, kEobBaseWarningStrings, - kEobBaseItemSuffixStrings, - kEobBaseItemExtraStrings, + + kEobBaseItemSuffixStringsRings, + kEobBaseItemSuffixStringsPotions, + kEobBaseItemSuffixStringsWands, + + kEobBaseRipItemStrings, + kEobBaseCursedString, + kEobBaseEnchantedString, + kEobBaseMagicObjectStrings, + kEobBaseMagicObjectString5, + kEobBasePatternSuffix, + kEobBasePatternGrFix1, + kEobBasePatternGrFix2, + kEobBaseValidateArmorString, + kEobBaseValidateCursedString, + kEobBaseValidateNoDropString, + kEobBasePotionStrings, + kEobBaseWandStrings, + kEobBaseItemMisuseStrings, + kEobBaseTakenStrings, kEobBasePotionEffectStrings, @@ -406,6 +424,10 @@ enum KyraResources { kEobBaseInvSlotX, kEobBaseInvSlotY, kEobBaseSlotValidationFlags, + + kEobBaseProjectileWeaponTypes, + kEobBaseWandTypes, + kEobBaseDrawObjPosIndex, kEobBaseFlightObjFlipIndex, kEobBaseFlightObjShpMap, @@ -547,6 +569,8 @@ enum KyraResources { kEob2MonsterDustStrings, kEob2DranFoolsStrings, + kEob2HornStrings, + kEob2HornSounds, kLolIngamePakFiles, kLolCharacterDefs, diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index acc61353f4..c169a397bb 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -38,7 +38,7 @@ namespace Kyra { -#define RESFILE_VERSION 78 +#define RESFILE_VERSION 79 namespace { bool checkKyraDat(Common::SeekableReadStream *file) { diff --git a/engines/kyra/staticres_eob.cpp b/engines/kyra/staticres_eob.cpp index f422d6993e..19e2512da5 100644 --- a/engines/kyra/staticres_eob.cpp +++ b/engines/kyra/staticres_eob.cpp @@ -354,8 +354,26 @@ void EobCoreEngine::initStaticResource() { _pryDoorStrings = _staticres->loadStrings(kEobBasePryDoorStrings, temp); _warningStrings = _staticres->loadStrings(kEobBaseWarningStrings, temp); - _itemSuffixStrings = _staticres->loadStrings(kEobBaseItemSuffixStrings, temp); - _itemExtraStrings = _staticres->loadStrings(kEobBaseItemExtraStrings, temp); + + _suffixStringsRings = _staticres->loadStrings(kEobBaseItemSuffixStringsRings, temp); + _suffixStringsPotions = _staticres->loadStrings(kEobBaseItemSuffixStringsPotions, temp); + _suffixStringsWands = _staticres->loadStrings(kEobBaseItemSuffixStringsWands, temp); + + _ripItemStrings = _staticres->loadStrings(kEobBaseRipItemStrings, temp); + _cursedString = _staticres->loadStrings(kEobBaseCursedString, temp); + _enchantedString = _staticres->loadStrings(kEobBaseEnchantedString, temp); + _magicObjectStrings = _staticres->loadStrings(kEobBaseMagicObjectStrings, temp); + _magicObjectString5 = _staticres->loadStrings(kEobBaseMagicObjectString5, temp); + _patternSuffix = _staticres->loadStrings(kEobBasePatternSuffix, temp); + _patternGrFix1 = _staticres->loadStrings(kEobBasePatternGrFix1, temp); + _patternGrFix2 = _staticres->loadStrings(kEobBasePatternGrFix2, temp); + _validateArmorString = _staticres->loadStrings(kEobBaseValidateArmorString, temp); + _validateCursedString = _staticres->loadStrings(kEobBaseValidateCursedString, temp); + _validateNoDropString = _staticres->loadStrings(kEobBaseValidateNoDropString, temp); + _potionStrings = _staticres->loadStrings(kEobBasePotionStrings, temp); + _wandStrings = _staticres->loadStrings(kEobBaseWandStrings, temp); + _itemMisuseStrings = _staticres->loadStrings(kEobBaseItemMisuseStrings, temp); + _takenStrings = _staticres->loadStrings(kEobBaseTakenStrings, temp); _potionEffectStrings = _staticres->loadStrings(kEobBasePotionEffectStrings, temp); @@ -455,6 +473,9 @@ void EobCoreEngine::initStaticResource() { _inventorySlotsY = _staticres->loadRawData(kEobBaseInvSlotY, temp); _slotValidationFlags = _staticres->loadRawDataBe16(kEobBaseSlotValidationFlags, temp); + _projectileWeaponAmmoTypes = (const int8*)_staticres->loadRawData(kEobBaseProjectileWeaponTypes, temp); + _wandTypes = _staticres->loadRawData(kEobBaseWandTypes, temp); + _drawObjPosIndex = _staticres->loadRawData(kEobBaseDrawObjPosIndex, temp); _flightObjFlipIndex = _staticres->loadRawData(kEobBaseFlightObjFlipIndex, temp); _flightObjShpMap = (const int8*)_staticres->loadRawData(kEobBaseFlightObjShpMap, temp); @@ -508,8 +529,10 @@ void EobCoreEngine::initStaticResource() { _sparkEffectOfY = _staticres->loadRawData(kEobBaseSparkOfY, temp); _magicFlightObjectProperties = _staticres->loadRawData(kEobBaseMagicFlightProps, temp); - // Hard code these strings, since EOB 1 doesn't have them in the original - // (because there is only one single save slot) + // Hard code the following strings, since EOB I doesn't have them in the original. + // EOB I doesn't have load and save menus, because there is only one single + // save slot. Instead of emulating this we provide a menu similiar to EOB II. + static const char *saveLoadStrings[3][4] = { { "Cancel", "Empty Slot", "Save Game", "Load Game" }, { "Abbr.", "Leerer Slot", "Speichern", " Laden" }, @@ -521,9 +544,16 @@ void EobCoreEngine::initStaticResource() { "Hier ist noch kein\rSpiel gespeichert!", 0 }; + + static const char *errorSlotNoNameString[3] = { + " You must specify\r a name for your\r save game!", + " Spielstände müssen\r einen Namen haben!", + 0 + }; _saveLoadStrings = saveLoadStrings[(_flags.lang == Common::EN_ANY) ? 0 : ((_flags.lang == Common::DE_DEU) ? 1 : 2)]; _errorSlotEmptyString = errorSlotEmptyString[(_flags.lang == Common::EN_ANY) ? 0 : ((_flags.lang == Common::DE_DEU) ? 1 : 2)]; + _errorSlotNoNameString = errorSlotNoNameString[(_flags.lang == Common::EN_ANY) ? 0 : ((_flags.lang == Common::DE_DEU) ? 1 : 2)]; } void EobCoreEngine::initButtonData() { @@ -1192,6 +1222,8 @@ void DarkMoonEngine::initStaticResource() { _npc2Strings = _staticres->loadStrings(kEob2Npc2Strings, temp); _monsterDustStrings = _staticres->loadStrings(kEob2MonsterDustStrings, temp); _dranFoolsStrings = _staticres->loadStrings(kEob2DranFoolsStrings, temp); + _hornStrings = _staticres->loadStrings(kEob2HornStrings, temp); + _hornSounds = _staticres->loadRawData(kEob2HornSounds, temp); } void DarkMoonEngine::initSpells() { |