aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-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
12 files changed, 245 insertions, 69 deletions
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() {