aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/xeen/character.cpp313
-rw-r--r--engines/xeen/character.h15
-rw-r--r--engines/xeen/dialogs_items.cpp144
-rw-r--r--engines/xeen/dialogs_items.h4
-rw-r--r--engines/xeen/resources.cpp49
-rw-r--r--engines/xeen/resources.h24
-rw-r--r--engines/xeen/scripts.h2
7 files changed, 526 insertions, 25 deletions
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<MirrorEntry> _mirror;
public:
Scripts(XeenEngine *vm);