aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--devtools/create_kyradat/create_kyradat.cpp76
-rw-r--r--devtools/create_kyradat/create_kyradat.h29
-rw-r--r--devtools/create_kyradat/games.cpp51
-rw-r--r--devtools/create_kyradat/tables.cpp180
-rw-r--r--dists/engine-data/kyra.datbin385091 -> 458387 bytes
-rw-r--r--engines/kyra/eob1.cpp14
-rw-r--r--engines/kyra/eob1.h1
-rw-r--r--engines/kyra/eob2.cpp9
-rw-r--r--engines/kyra/eob2.h6
-rw-r--r--engines/kyra/eobcommon.cpp52
-rw-r--r--engines/kyra/eobcommon.h37
-rw-r--r--engines/kyra/gui_eob.cpp29
-rw-r--r--engines/kyra/items_eob.cpp61
-rw-r--r--engines/kyra/magic_eob.cpp35
-rw-r--r--engines/kyra/resource.h28
-rw-r--r--engines/kyra/staticres.cpp2
-rw-r--r--engines/kyra/staticres_eob.cpp40
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
index 902d55c457..cd51c0b54c 100644
--- a/dists/engine-data/kyra.dat
+++ b/dists/engine-data/kyra.dat
Binary files differ
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() {