From d40c62532abfeb0d7fdbc005a16698ce19afe43b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 6 Feb 2015 20:57:01 -0500 Subject: XEEN: Implemented makeItem --- engines/xeen/character.cpp | 313 +++++++++++++++++++++++++++++++++++++++++ engines/xeen/character.h | 15 +- engines/xeen/dialogs_items.cpp | 144 ++++++++++++++++--- engines/xeen/dialogs_items.h | 4 +- engines/xeen/resources.cpp | 49 +++++++ engines/xeen/resources.h | 24 ++++ engines/xeen/scripts.h | 2 +- 7 files changed, 526 insertions(+), 25 deletions(-) (limited to 'engines') diff --git a/engines/xeen/character.cpp b/engines/xeen/character.cpp index 8fd7a35c5f..3489783983 100644 --- a/engines/xeen/character.cpp +++ b/engines/xeen/character.cpp @@ -73,6 +73,11 @@ InventoryItems::InventoryItems(Character *character, ItemCategory category): _names = NAMES[category]; } +void InventoryItems::clear() { + for (uint idx = 0; idx < size(); ++idx) + operator[](idx).clear(); +} + /** * Return whether a given item passes class-based usage restrictions */ @@ -199,6 +204,12 @@ void InventoryItems::equipError(int itemIndex1, ItemCategory category1, int item } } +void InventoryItems::enchantItem(int itemIndex, int amount) { + XeenEngine *vm = Party::_vm; + vm->_sound->playFX(21); + ErrorScroll::show(vm, Common::String::format(NOT_ENCHANTABLE, SPELL_FAILED)); +} + /*------------------------------------------------------------------------*/ /** @@ -273,6 +284,23 @@ Common::String WeaponItems::getFullDescription(int itemIndex, int displayNum) { ); } +void WeaponItems::enchantItem(int itemIndex, int amount) { + SoundManager &sound = *vm()->_sound; + XeenItem &item = operator[](itemIndex); + Character tempCharacter; + + if (item._material == 0 && item._bonusFlags == 0 && item._id != 34) { + tempCharacter.makeItem(amount, 0, 1); + XeenItem &tempItem = tempCharacter._weapons[0]; + + item._material = tempItem._material; + item._bonusFlags = tempItem._bonusFlags; + sound.playFX(19); + } else { + InventoryItems::enchantItem(itemIndex, amount); + } +} + /*------------------------------------------------------------------------*/ /** @@ -374,6 +402,23 @@ Common::String ArmorItems::getFullDescription(int itemIndex, int displayNum) { ); } +void ArmorItems::enchantItem(int itemIndex, int amount) { + SoundManager &sound = *vm()->_sound; + XeenItem &item = operator[](itemIndex); + Character tempCharacter; + + if (item._material == 0 && item._bonusFlags == 0) { + tempCharacter.makeItem(amount, 0, 2); + XeenItem &tempItem = tempCharacter._armor[0]; + + item._material = tempItem._material; + item._bonusFlags = tempItem._bonusFlags; + sound.playFX(19); + } else { + InventoryItems::enchantItem(itemIndex, amount); + } +} + /*------------------------------------------------------------------------*/ /** @@ -498,6 +543,10 @@ AttributePair::AttributePair() { Character::Character(): _weapons(this), _armor(this), _accessories(this), _misc(this), _items(_weapons, _armor, _accessories, _misc) { + clear(); +} + +void Character::clear() { _sex = MALE; _race = HUMAN; _xeenSide = 0; @@ -522,6 +571,24 @@ Character::Character(): _experience = 0; _currentAdventuringSpell = 0; _currentCombatSpell = 0; + + _might._permanent = _might._temporary = 0; + _intellect._permanent = _intellect._temporary = 0; + _personality._permanent = _personality._temporary = 0; + _endurance._permanent = _endurance._temporary = 0; + _speed._permanent = _speed._temporary = 0; + _accuracy._permanent = _accuracy._temporary = 0; + _luck._permanent = _luck._temporary = 0; + _fireResistence._permanent = _fireResistence._temporary = 0; + _coldResistence._permanent = _coldResistence._temporary = 0; + _electricityResistence._permanent = _electricityResistence._temporary = 0; + _poisonResistence._permanent = _poisonResistence._temporary = 0; + _energyResistence._permanent = _energyResistence._temporary = 0; + _magicResistence._permanent = _magicResistence._temporary = 0; + _weapons.clear(); + _armor.clear(); + _accessories.clear(); + _misc.clear(); } void Character::synchronize(Common::Serializer &s) { @@ -1309,4 +1376,250 @@ int Character::getNumAwards() const { return total; } +int Character::makeItem(int p1, int itemIndex, int p3) { + XeenEngine *vm = Party::_vm; + Scripts &scripts = *vm->_scripts; + + if (!p1) + return 0; + + int itemId = 0; + int v4 = vm->getRandomNumber(100); + int v6 = vm->getRandomNumber(p1 < 6 ? 100 : 80); + ItemCategory category; + int v16 = 0, v14 = 0, miscBonus = 0, miscId = 0, v8 = 0, v12 = 0; + + // Randomly pick a category and item Id + if (p3 == 12) { + if (scripts._itemType < 35) { + category = CATEGORY_WEAPON; + itemId = scripts._itemType; + } else if (scripts._itemType < 49) { + category = CATEGORY_ARMOR; + itemId = scripts._itemType - 35; + } else if (scripts._itemType < 60) { + category = CATEGORY_ACCESSORY; + itemId = scripts._itemType - 49; + } else { + category = CATEGORY_MISC; + itemId = scripts._itemType - 60; + } + } else { + switch (p3) { + case 1: + v4 = 35; + break; + case 2: + v4 = 60; + break; + case 3: + v4 = 100; + break; + default: + break; + } + + if (p1 == 1) { + if (v4 <= 40) { + category = CATEGORY_WEAPON; + if (v6 <= 30) { + itemId = vm->getRandomNumber(1, 6); + } else if (v6 <= 60) { + itemId = vm->getRandomNumber(7, 17); + } else if (v6 <= 85) { + itemId = vm->getRandomNumber(18, 29); + } else { + itemId = vm->getRandomNumber(30, 33); + } + } else if (v4 <= 85) { + category = CATEGORY_ARMOR; + itemId = vm->getRandomNumber(1, 7); + } else { + category = CATEGORY_MISC; + itemId = vm->getRandomNumber(1, 9); + } + } else if (v4 <= 35) { + category = CATEGORY_WEAPON; + if (v6 <= 30) { + itemId = vm->getRandomNumber(1, 6); + } else if (v6 <= 60) { + itemId = vm->getRandomNumber(7, 17); + } else if (v6 <= 85) { + itemId = vm->getRandomNumber(18, 29); + } else { + itemId = vm->getRandomNumber(30, 33); + } + } else if (v4 <= 60) { + category = CATEGORY_ARMOR; + itemId = (v6 > 70) ? 8 : vm->getRandomNumber(1, 7); + } else if (v6 <= 10) { + category = CATEGORY_ARMOR; + itemId = 9; + } else if (v6 <= 20) { + category = CATEGORY_ARMOR; + itemId = 13; + } else if (v6 <= 35) { + category = CATEGORY_ACCESSORY; + itemId = 1; + } else if (v6 <= 45) { + category = CATEGORY_ARMOR; + itemId = 10; + } else if (v6 <= 55) { + category = CATEGORY_ARMOR; + itemId = vm->getRandomNumber(11, 12); + } else if (v6 <= 65) { + category = CATEGORY_ACCESSORY; + itemId = 2; + } else if (v6 <= 75) { + category = CATEGORY_ACCESSORY; + itemId = vm->getRandomNumber(3, 7); + } else if (v6 <= 80) { + category = CATEGORY_ACCESSORY; + itemId = vm->getRandomNumber(8, 10); + } else { + category = CATEGORY_MISC; + itemId = vm->getRandomNumber(1, 9); + } + } + + XeenItem &newItem = _items[category][itemIndex]; + newItem.clear(); + newItem._id = itemId; + + v4 = vm->getRandomNumber(1, 100); + switch (category) { + case CATEGORY_WEAPON: + case CATEGORY_ARMOR: + if (p1 != 1) { + if (v4 <= 70) { + v8 = 3; + } else if (v4 <= 98) { + v8 = 1; + } else { + v8 = 2; + } + } + break; + + case CATEGORY_ACCESSORY: + if (v4 <= 20) { + v8 = 3; + } else if (v4 <= 60) { + v8 = 1; + } else { + v8 = 2; + } + break; + + case CATEGORY_MISC: + v8 = 4; + break; + } + + if (p1 != 1 || category == CATEGORY_MISC) { + int rval, mult; + switch (v8) { + case 1: + rval = vm->getRandomNumber(1, 100); + if (rval <= 25) { + mult = 0; + } + else if (rval <= 45) { + mult = 1; + } + else if (rval <= 60) { + mult = 2; + } + else if (rval <= 75) { + mult = 3; + } + else if (rval <= 95) { + mult = 4; + } + else { + mult = 5; + } + + v12 = MAKE_ITEM_ARR1[vm->getRandomNumber(MAKE_ITEM_ARR2[mult][p1][0], + MAKE_ITEM_ARR2[mult][p1][1])]; + break; + + case 2: + rval = vm->getRandomNumber(1, 100); + if (rval <= 15) { + mult = 0; + } + else if (rval <= 25) { + mult = 1; + } + else if (rval <= 35) { + mult = 2; + } + else if (mult <= 50) { + mult = 3; + } + else if (mult <= 65) { + mult = 4; + } + else if (mult <= 80) { + mult = 5; + } + else if (mult <= 85) { + mult = 6; + } + else if (mult <= 90) { + mult = 7; + } + else if (mult <= 95) { + mult = 8; + } + else { + mult = 9; + } + + v12 = MAKE_ITEM_ARR1[vm->getRandomNumber(MAKE_ITEM_ARR3[mult][p1][0], + MAKE_ITEM_ARR3[mult][p1][1])]; + break; + + case 3: + rval = p1 == 7 || vm->getRandomNumber(1, 100) > 70; + v16 = vm->getRandomNumber(MAKE_ITEM_ARR4[mult][p1][0], + MAKE_ITEM_ARR4[mult][p1][1]); + break; + + case 4: + miscBonus = vm->getRandomNumber(MAKE_ITEM_ARR5[p1][0], MAKE_ITEM_ARR5[p1][1]); + break; + + default: + break; + } + } + + switch (category) { + case CATEGORY_WEAPON: + if (p1 != 1) { + newItem._material = (v14 ? v14 + 58 : 0) + (v16 ? v16 + 36 : 0) + v12; + if (vm->getRandomNumber(20) == 10) + newItem._bonusFlags = vm->getRandomNumber(1, 6); + } + break; + + case CATEGORY_ARMOR: + case CATEGORY_ACCESSORY: + if (p1 != 1) { + newItem._material = (v14 ? v14 + 58 : 0) + (v16 ? v16 + 36 : 0) + v12; + } + break; + + case CATEGORY_MISC: + newItem._id = miscId; + newItem._bonusFlags = miscBonus; + break; + } + + return category; +} + + } // End of namespace Xeen diff --git a/engines/xeen/character.h b/engines/xeen/character.h index 6514caeaa1..af9f7c69e9 100644 --- a/engines/xeen/character.h +++ b/engines/xeen/character.h @@ -106,11 +106,13 @@ protected: public: InventoryItems(Character *character, ItemCategory category); + void clear(); + bool passRestrictions(int itemId, bool showError) const; Common::String getName(int itemIndex); - virtual Common::String getFullDescription(int itemIndex, int displayNum) = 0; + virtual Common::String getFullDescription(int itemIndex, int displayNum = 15) = 0; bool discardItem(int itemIndex); @@ -119,6 +121,8 @@ public: void removeItem(int itemIndex); void sort(); + + virtual void enchantItem(int itemIndex, int amount); }; class WeaponItems: public InventoryItems { @@ -128,6 +132,8 @@ public: virtual void equipItem(int itemIndex); virtual Common::String getFullDescription(int itemIndex, int displayNum); + + virtual void enchantItem(int itemIndex, int amount); }; class ArmorItems : public InventoryItems { @@ -137,6 +143,8 @@ public: virtual void equipItem(int itemIndex); virtual Common::String getFullDescription(int itemIndex, int displayNum); + + virtual void enchantItem(int itemIndex, int amount); }; class AccessoryItems : public InventoryItems { @@ -226,6 +234,9 @@ public: int _currentCombatSpell; public: Character(); + + void clear(); + void synchronize(Common::Serializer &s); Condition worstCondition() const; @@ -271,6 +282,8 @@ public: int getNumSkills() const; int getNumAwards() const; + + int makeItem(int p1, int itemIndex, int p3); }; } // End of namespace Xeen diff --git a/engines/xeen/dialogs_items.cpp b/engines/xeen/dialogs_items.cpp index beaf5652d7..46f07d4812 100644 --- a/engines/xeen/dialogs_items.cpp +++ b/engines/xeen/dialogs_items.cpp @@ -21,6 +21,7 @@ */ #include "xeen/dialogs_items.h" +#include "xeen/dialogs_query.h" #include "xeen/resources.h" #include "xeen/xeen.h" @@ -41,7 +42,7 @@ Character *ItemsDialog::execute(Character *c, ItemsMode mode) { Screen &screen = *_vm->_screen; Character *startingChar = c; - ItemCategory category = mode == ITEMMODE_4 || mode == ITEMMODE_COMBAT ? + ItemCategory category = mode == ITEMMODE_RECHARGE || mode == ITEMMODE_COMBAT ? CATEGORY_MISC : CATEGORY_WEAPON; int varA = mode == ITEMMODE_COMBAT ? 1 : 0; if (varA != 0) @@ -57,13 +58,13 @@ Character *ItemsDialog::execute(Character *c, ItemsMode mode) { bool redrawFlag = true; while (!_vm->shouldQuit()) { if (redrawFlag) { - if ((mode != ITEMMODE_CHAR_INFO || category != CATEGORY_MISC) && mode != ITEMMODE_6 - && mode != ITEMMODE_4 && mode != ITEMMODE_TO_GOLD) { + if ((mode != ITEMMODE_CHAR_INFO || category != CATEGORY_MISC) && mode != ITEMMODE_ENCHANT + && mode != ITEMMODE_RECHARGE && mode != ITEMMODE_TO_GOLD) { _buttons[8]._bounds.moveTo(148, _buttons[8]._bounds.top); _buttons[9]._draw = false; - } else if (mode == ITEMMODE_4) { + } else if (mode == ITEMMODE_RECHARGE) { _buttons[4]._value = Common::KEYCODE_r; - } else if (mode == ITEMMODE_6) { + } else if (mode == ITEMMODE_ENCHANT) { _buttons[4]._value = Common::KEYCODE_e; } else if (mode == ITEMMODE_TO_GOLD) { _buttons[4]._value = Common::KEYCODE_g; @@ -75,17 +76,17 @@ Character *ItemsDialog::execute(Character *c, ItemsMode mode) { // Write text for the dialog Common::String msg; - if (mode != ITEMMODE_CHAR_INFO && mode != ITEMMODE_8 && mode != ITEMMODE_6 - && mode != ITEMMODE_4 && mode != ITEMMODE_TO_GOLD) { + if (mode != ITEMMODE_CHAR_INFO && mode != ITEMMODE_8 && mode != ITEMMODE_ENCHANT + && mode != ITEMMODE_RECHARGE && mode != ITEMMODE_TO_GOLD) { msg = Common::String::format(ITEMS_DIALOG_TEXT1, BTN_SELL, BTN_IDENTIFY, BTN_FIX); - } else if (mode != ITEMMODE_6 && mode != ITEMMODE_4 && mode != ITEMMODE_TO_GOLD) { + } else if (mode != ITEMMODE_ENCHANT && mode != ITEMMODE_RECHARGE && mode != ITEMMODE_TO_GOLD) { msg = Common::String::format(ITEMS_DIALOG_TEXT1, category == 3 ? BTN_USE : BTN_EQUIP, BTN_REMOVE, BTN_DISCARD, BTN_QUEST); - } else if (mode == ITEMMODE_6) { + } else if (mode == ITEMMODE_ENCHANT) { msg = Common::String::format(ITEMS_DIALOG_TEXT2, BTN_ENCHANT); - } else if (mode == ITEMMODE_4) { + } else if (mode == ITEMMODE_RECHARGE) { msg = Common::String::format(ITEMS_DIALOG_TEXT2, BTN_RECHARGE); } else { msg = Common::String::format(ITEMS_DIALOG_TEXT2, BTN_GOLD); @@ -103,7 +104,7 @@ Character *ItemsDialog::execute(Character *c, ItemsMode mode) { if (mode == ITEMMODE_CHAR_INFO || category != 3) { _iconSprites.draw(screen, 8, Common::Point(148, 109)); } - if (mode != ITEMMODE_6 && mode != ITEMMODE_4 && mode != ITEMMODE_TO_GOLD) { + if (mode != ITEMMODE_ENCHANT && mode != ITEMMODE_RECHARGE && mode != ITEMMODE_TO_GOLD) { _iconSprites.draw(screen, 10, Common::Point(182, 109)); _iconSprites.draw(screen, 12, Common::Point(216, 109)); _iconSprites.draw(screen, 14, Common::Point(250, 109)); @@ -138,7 +139,7 @@ Character *ItemsDialog::execute(Character *c, ItemsMode mode) { if (i._id) { if (mode == ITEMMODE_CHAR_INFO || mode == ITEMMODE_8 - || mode == ITEMMODE_6 || mode == ITEMMODE_4) { + || mode == ITEMMODE_ENCHANT || mode == ITEMMODE_RECHARGE) { lines.push_back(Common::String::format(ITEMS_DIALOG_LINE1, arr[idx], idx + 1, c->_items[category].getFullDescription(idx, arr[idx]))); @@ -178,8 +179,8 @@ Character *ItemsDialog::execute(Character *c, ItemsMode mode) { int skill = startingChar->_skills[MERCHANT]; if (mode == ITEMMODE_CHAR_INFO || mode == ITEMMODE_8 - || mode == ITEMMODE_6 || mode == ITEMMODE_4) { - tempMode = ITEMMODE_6; + || mode == ITEMMODE_ENCHANT || mode == ITEMMODE_RECHARGE) { + tempMode = ITEMMODE_ENCHANT; } else if (mode == ITEMMODE_TO_GOLD) { skill = 1; } @@ -227,14 +228,14 @@ Character *ItemsDialog::execute(Character *c, ItemsMode mode) { } case ITEMMODE_2: - case ITEMMODE_4: - case ITEMMODE_6: + case ITEMMODE_RECHARGE: + case ITEMMODE_ENCHANT: case ITEMMODE_9: case ITEMMODE_10: case ITEMMODE_TO_GOLD: screen._windows[30].writeString(Common::String::format(X_FOR_Y, CATEGORY_NAMES[category], startingChar->_name.c_str(), - (mode == ITEMMODE_4 || mode == ITEMMODE_6) ? CHARGES : COST, + (mode == ITEMMODE_RECHARGE || mode == ITEMMODE_ENCHANT) ? CHARGES : COST, lines[0].c_str(), lines[1].c_str(), lines[2].c_str(), lines[3].c_str(), lines[4].c_str(), lines[5].c_str(), lines[6].c_str(), lines[7].c_str(), lines[8].c_str() @@ -297,7 +298,7 @@ void ItemsDialog::loadButtons(ItemsMode mode, Character *&c) { (mode == ITEMMODE_CHAR_INFO) ? "items" : "buy")); _equipSprites.load("equip.icn"); - if (mode == ITEMMODE_6 || mode == ITEMMODE_4 || mode == ITEMMODE_TO_GOLD) { + if (mode == ITEMMODE_ENCHANT || mode == ITEMMODE_RECHARGE || mode == ITEMMODE_TO_GOLD) { // Enchant button list addButton(Common::Rect(12, 109, 36, 129), Common::KEYCODE_w, &_iconSprites); addButton(Common::Rect(46, 109, 70, 129), Common::KEYCODE_a, &_iconSprites); @@ -537,14 +538,16 @@ int ItemsDialog::calcItemCost(Character *c, int itemIndex, ItemsMode mode, return (mode == ITEMMODE_CHAR_INFO) ? 0 : result; } -bool ItemsDialog::doItemOptions(Character &c, int actionIndex, int itemIndex, ItemCategory category, +int ItemsDialog::doItemOptions(Character &c, int actionIndex, int itemIndex, ItemCategory category, ItemsMode mode) { Combat &combat = *_vm->_combat; EventsManager &events = *_vm->_events; Interface &intf = *_vm->_interface; Party &party = *_vm->_party; Screen &screen = *_vm->_screen; + SoundManager &sound = *_vm->_sound; Spells &spells = *_vm->_spells; + bool isDarkCc = _vm->_files->_isDarkCc; XeenItem *itemCategories[4] = { &c._weapons[0], &c._armor[0], &c._accessories[0], &c._misc[0] }; XeenItem *items = itemCategories[category]; @@ -647,17 +650,116 @@ bool ItemsDialog::doItemOptions(Character &c, int actionIndex, int itemIndex, It } } else { ErrorScroll::show(_vm, Common::String::format(NO_SPECIAL_ABILITIES, - c._items[category].getFullDescription(itemIndex, 15).c_str() + c._items[category].getFullDescription(itemIndex).c_str() )); } } } break; case 3: - // TODO: Remaining switches + c._items[category].discardItem(itemIndex); + break; default: break; } + break; + + case ITEMMODE_BLACKSMITH: { + InventoryItems &items = _oldCharacter->_items[category]; + if (items[INV_ITEMS_TOTAL - 1]._id) { + // If the last slot is in use, it means the list is full + ErrorScroll::show(_vm, Common::String::format(BACKPACK_IS_FULL, + _oldCharacter->_name.c_str())); + } else { + int cost = calcItemCost(_oldCharacter, itemIndex, mode, 0, category); + Common::String desc = c._items[category].getFullDescription(itemIndex); + if (Confirm::show(_vm, Common::String::format(BUY_X_FOR_Y_GOLD, + desc.c_str(), cost))) { + if (party.subtract(0, cost, 0, WT_FREEZE_WAIT)) { + if (isDarkCc) { + sound.playSample(0, 0); + File f("choice2.voc"); + sound.playSample(&f, 0); + } + + // Add entry to the end of the list + _oldCharacter->_items[category][8] = c._items[category][itemIndex]; + _oldCharacter->_items[category][8]._frame = 0; + c._items[category].clear(); + c._items[category].sort(); + _oldCharacter->_items[category].sort(); + } + } + } + return 0; + } + + case ITEMMODE_2: { + XeenItem &item = c._items[category][itemIndex]; + bool noNeed; + switch (category) { + case CATEGORY_WEAPON: + noNeed = (item._bonusFlags & ITEMFLAG_CURSED) || item._id == 34; + break; + default: + noNeed = item._bonusFlags & ITEMFLAG_CURSED; + break; + } + + if (noNeed) { + ErrorScroll::show(_vm, Common::String::format(NO_NEED_OF_THIS, + c._items[category].getFullDescription(itemIndex).c_str())); + } else { + int cost = calcItemCost(&c, itemIndex, mode, c._skills[MERCHANT], category); + Common::String desc = c._items[category].getFullDescription(itemIndex); + Common::String msg = Common::String::format(SELL_X_FOR_Y_GOLD, + desc.c_str(), cost); + + if (Confirm::show(_vm, msg)) { + // Remove the sold item and add gold to the party's total + item.clear(); + c._items[category].sort(); + + party._gold += cost; + } + } + return 0; + } + + case ITEMMODE_RECHARGE: + if (category != CATEGORY_MISC || c._misc[itemIndex]._material > 9 + || c._misc[itemIndex]._id == 53 || c._misc[itemIndex]._id == 0) { + sound.playFX(21); + ErrorScroll::show(_vm, Common::String::format(NOT_RECHARGABLE, SPELL_FAILED)); + } else { + int charges = MIN(63, _vm->getRandomNumber(1, 6) + + (c._misc[itemIndex]._bonusFlags & ITEMFLAG_BONUS_MASK)); + sound.playFX(20); + + c._misc[itemIndex]._bonusFlags = (c._misc[itemIndex]._bonusFlags + & ~ITEMFLAG_BONUS_MASK) | charges; + } + return 2; + + case ITEMMODE_ENCHANT: { + Character *ps = &_itemsCharacter; + ps->clear(); + int charges = _vm->getRandomNumber(1, _oldCharacter->getCurrentLevel() / 5 + 1); + charges = MIN(charges, 5); + + switch (category) { + case CATEGORY_WEAPON: + + default: + break; + } + + // TODO + return 2; + } + + default: + break; } } diff --git a/engines/xeen/dialogs_items.h b/engines/xeen/dialogs_items.h index aff43f6429..dab26e6f82 100644 --- a/engines/xeen/dialogs_items.h +++ b/engines/xeen/dialogs_items.h @@ -31,7 +31,7 @@ namespace Xeen { enum ItemsMode { ITEMMODE_CHAR_INFO = 0, ITEMMODE_BLACKSMITH = 1, ITEMMODE_2 = 2, ITEMMODE_3 = 3, - ITEMMODE_4 = 4, ITEMMODE_5 = 5, ITEMMODE_6 = 6, ITEMMODE_COMBAT = 7, ITEMMODE_8 = 8, + ITEMMODE_RECHARGE = 4, ITEMMODE_5 = 5, ITEMMODE_ENCHANT = 6, ITEMMODE_COMBAT = 7, ITEMMODE_8 = 8, ITEMMODE_9 = 9, ITEMMODE_10 = 10, ITEMMODE_TO_GOLD = 11 }; @@ -58,7 +58,7 @@ private: int calcItemCost(Character *c, int itemIndex, ItemsMode mode, int skillLevel, ItemCategory category); - bool doItemOptions(Character &c, int actionIndex, int itemIndex, + int doItemOptions(Character &c, int actionIndex, int itemIndex, ItemCategory category, ItemsMode mode); public: static Character *show(XeenEngine *vm, Character *c, ItemsMode mode); diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp index 0f6588af9a..23eac4f1a2 100644 --- a/engines/xeen/resources.cpp +++ b/engines/xeen/resources.cpp @@ -596,6 +596,41 @@ const int METAL_LAC[9] = { -3, 0, -2, -1, 1, 2, 4, 6, 8 }; const int ARMOR_STRENGTHS[14] = { 0, 2, 4, 5, 6, 7, 8, 10, 4, 2, 1, 1, 1, 1 }; +const int MAKE_ITEM_ARR1[6] = { 0, 8, 15, 20, 25, 33 }; + +const int MAKE_ITEM_ARR2[6][7][2] = { + { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 5, 8 }, { 8, 8 } }, + { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 6, 7 }, { 7, 7 } }, + { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 5 }, { 4, 5 }, { 5, 5 } }, + { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 4 }, { 4, 5 }, { 5, 5 } }, + { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 5, 8 }, { 8, 8 } }, + { { 0, 0 }, { 1, 1 }, { 1, 1 }, { 1, 2 }, { 2, 2 }, { 2, 3 }, { 3, 3 } } +}; + +const int MAKE_ITEM_ARR3[10][7][2] = { + { { 0, 0 }, { 1, 4 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 6, 10 }, { 10, 10 } }, + { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 5, 8 }, { 8, 8 } }, + { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 5, 8 }, { 8, 8 } }, + { { 0, 0 }, { 1, 3 }, { 2, 5 }, { 3, 6 }, { 4, 7 }, { 5, 8 }, { 8, 8 } }, + { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 5 }, { 4, 6 }, { 6, 6 } }, + { { 0, 0 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, { 4, 5 }, { 5, 6 }, { 6, 6 } }, + { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 4 }, { 4, 5 }, { 5, 5 } }, + { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 5 }, { 4, 6 }, { 6, 6 } }, + { { 0, 0 }, { 1, 2 }, { 1, 3 }, { 2, 4 }, { 3, 4 }, { 4, 5 }, { 5, 5 } }, + { { 0, 0 }, { 1, 2 }, { 1, 4 }, { 3, 6 }, { 5, 8 }, { 7, 10 }, { 10, 10 } } +}; + +const int MAKE_ITEM_ARR4[2][7][2] = { + { { 0, 0 }, { 1, 4 }, { 3, 7 }, { 4, 8 }, { 5, 9 }, { 8, 9 }, { 9, 9 } }, + { { 0, 0 }, { 1, 4 }, { 2, 6 }, { 4, 7 }, { 6, 10 }, { 9, 13 }, { 13, 13 } } +}; + + +const int MAKE_ITEM_ARR5[8][2] = { + { 0, 0 }, { 1, 15 }, { 16, 30 }, { 31, 40 }, { 41, 50 }, + { 51, 60 }, { 61, 73 }, { 61, 73 } +}; + const int OUTDOOR_DRAWSTRCT_INDEXES[44] = { 37, 38, 39, 40, 41, 44, 42, 43, 47, 45, 46, 48, 49, 52, 50, 51, 66, 67, 68, 69, 70, 71, @@ -1146,4 +1181,18 @@ const char *const CANNOT_DISCARD_CURSED_ITEM = "\3x""cYou cannot discard a curse const char *const PERMANENTLY_DISCARD = "\v000\t000\x03lPermanently discard %s\fd?"; +const char *const BACKPACK_IS_FULL = "\v005\x03c\fd%s's backpack is full."; + +const char *const BUY_X_FOR_Y_GOLD = "\x3l\v000\t000\fdBuy %s\fd for %lu gold?"; + +const char *const SELL_X_FOR_Y_GOLD = "\x3l\v000\t000\fdSell %s\fd for %lu gold?"; + +const char *const NO_NEED_OF_THIS = "\v005\x03c\fdWe have no need of this %s\f!"; + +const char *const NOT_RECHARGABLE = "\v012\x03c\fdNot Rechargeable. %s"; + +const char *const NOT_ENCHANTABLE = "\v012\t000\x03cNot Enchantable. %s"; + +const char *const SPELL_FAILED = "Spell Failed!"; + } // End of namespace Xeen diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h index 87b9468064..6e757bc00c 100644 --- a/engines/xeen/resources.h +++ b/engines/xeen/resources.h @@ -176,6 +176,16 @@ extern const int METAL_LAC[9]; extern const int ARMOR_STRENGTHS[14]; +extern const int MAKE_ITEM_ARR1[6]; + +extern const int MAKE_ITEM_ARR2[6][7][2]; + +extern const int MAKE_ITEM_ARR3[10][7][2]; + +extern const int MAKE_ITEM_ARR4[2][7][2]; + +extern const int MAKE_ITEM_ARR5[8][2]; + extern const int OUTDOOR_DRAWSTRCT_INDEXES[44]; extern const int TOWN_MAXES[2][11]; @@ -420,6 +430,20 @@ extern const char *const CANNOT_DISCARD_CURSED_ITEM; extern const char *const PERMANENTLY_DISCARD; +extern const char *const BACKPACK_IS_FULL; + +extern const char *const BUY_X_FOR_Y_GOLD; + +extern const char *const SELL_X_FOR_Y_GOLD; + +extern const char *const NO_NEED_OF_THIS; + +extern const char *const NOT_RECHARGABLE; + +extern const char *const SPELL_FAILED; + +extern const char *const NOT_ENCHANTABLE; + } // End of namespace Xeen #endif /* XEEN_RESOURCES_H */ diff --git a/engines/xeen/scripts.h b/engines/xeen/scripts.h index 59f202e461..d51cd0c26b 100644 --- a/engines/xeen/scripts.h +++ b/engines/xeen/scripts.h @@ -140,7 +140,6 @@ class Scripts { private: XeenEngine *_vm; int _charFX[6]; - int _itemType; int _treasureItems; int _treasureGold; int _treasureGems; @@ -229,6 +228,7 @@ public: bool _eventSkipped; int _whoWill; int _nEdamageType; + int _itemType; Common::Array _mirror; public: Scripts(XeenEngine *vm); -- cgit v1.2.3