From 0e4c184e285c9b20b90536eb485a7f8a50833da3 Mon Sep 17 00:00:00 2001 From: athrxx Date: Thu, 28 Jul 2011 17:56:59 +0200 Subject: KYRA: (EOB) - implement some gui functionality, some bug fixes, etc. --- engines/kyra/eob1.cpp | 14 ++++++++++ engines/kyra/eob1.h | 1 + engines/kyra/eob2.cpp | 9 ++++++- engines/kyra/eob2.h | 6 ++++- engines/kyra/eobcommon.cpp | 52 ++++++++++++++++++++++++++++------- engines/kyra/eobcommon.h | 37 ++++++++++++++++++++----- engines/kyra/gui_eob.cpp | 29 +++++++++++--------- engines/kyra/items_eob.cpp | 61 ++++++++++++++++++++++-------------------- engines/kyra/magic_eob.cpp | 35 +++++++++++++++++++++--- engines/kyra/resource.h | 28 +++++++++++++++++-- engines/kyra/staticres.cpp | 2 +- engines/kyra/staticres_eob.cpp | 40 ++++++++++++++++++++++++--- 12 files changed, 245 insertions(+), 69 deletions(-) (limited to 'engines') 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() { -- cgit v1.2.3