aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2015-02-02 21:29:58 -0500
committerPaul Gilbert2015-02-02 21:29:58 -0500
commit3767f316195940bbe02a3f10e7139f0267197ce8 (patch)
tree111e1fc77ca320a4d7feeee12166855563ac4dfc /engines
parent2b8303c0d8b54ee5251296c86a320735422b62e2 (diff)
downloadscummvm-rg350-3767f316195940bbe02a3f10e7139f0267197ce8.tar.gz
scummvm-rg350-3767f316195940bbe02a3f10e7139f0267197ce8.tar.bz2
scummvm-rg350-3767f316195940bbe02a3f10e7139f0267197ce8.zip
XEEN: Implemented calcItemCost
Diffstat (limited to 'engines')
-rw-r--r--engines/xeen/dialogs_items.cpp125
-rw-r--r--engines/xeen/dialogs_items.h6
-rw-r--r--engines/xeen/resources.cpp39
-rw-r--r--engines/xeen/resources.h14
4 files changed, 174 insertions, 10 deletions
diff --git a/engines/xeen/dialogs_items.cpp b/engines/xeen/dialogs_items.cpp
index fea043213f..67778777eb 100644
--- a/engines/xeen/dialogs_items.cpp
+++ b/engines/xeen/dialogs_items.cpp
@@ -94,8 +94,9 @@ Character *ItemsDialog::execute(Character *c, ItemsMode mode) {
drawButtons(&screen);
}
+ Common::StringArray lines;
int arr[40];
- Common::fill(&arr[0], &arr[40], false);
+ Common::fill(&arr[0], &arr[40], 0);
int var2 = -1;
if (mode == ITEMMODE_CHAR_INFO || typeNum != 3) {
@@ -132,8 +133,20 @@ Character *ItemsDialog::execute(Character *c, ItemsMode mode) {
if (c->_weapons[idx]._id) {
if (mode == ITEMMODE_CHAR_INFO || mode == ITEMMODE_8
|| mode == ITEMMODE_6 || mode == ITEMMODE_4) {
- // TODO
+ lines.push_back(Common::String::format(ITEMS_DIALOG_LINE1,
+ arr[idx], idx + 1,
+ c->assembleItemName(idx, arr[idx], typeNum)));
+ } else {
+ lines.push_back(Common::String::format(ITEMS_DIALOG_LINE2,
+ arr[idx], idx + 1,
+ c->assembleItemName(idx, arr[idx], typeNum),
+ calcItemCost(c, idx, mode,
+ mode == ITEMMODE_TO_GOLD ? 1 : c->_skills[MERCHANT],
+ typeNum)
+ ));
}
+
+ // TODO
} else if (_itemsDrawList[idx]._sprites == nullptr) {
// TODO
}
@@ -289,4 +302,112 @@ void ItemsDialog::setEquipmentIcons() {
}
}
+/**
+ * Calculate the cost of an item
+ */
+int ItemsDialog::calcItemCost(Character *c, int itemIndex, int mode,
+ int skillLevel, int typeNum) {
+ int amount1 = 0, amount2 = 0, amount3 = 0, amount4 = 0;
+ int result = 0;
+ int level = skillLevel & 0x7f;
+
+ switch (mode) {
+ case ITEMMODE_BLACKSMITH:
+ level = 0;
+ break;
+ case ITEMMODE_2:
+ case ITEMMODE_TO_GOLD:
+ level = level == 0 ? 1 : 0;
+ break;
+ case ITEMMODE_10:
+ level = 2;
+ break;
+ case ITEMMODE_9:
+ level = 3;
+ break;
+ default:
+ break;
+ }
+
+ switch (typeNum) {
+ case 0:
+ case 1:
+ case 2: {
+ // 0=Weapons, 1=Armor, 2=Accessories
+ XeenItem &i = (mode == 0) ? c->_weapons[itemIndex] :
+ (mode == 1 ? c->_armor[itemIndex] : c->_accessories[itemIndex]);
+ amount1 = (mode == 0) ? WEAPON_BASE_COSTS[i._id] :
+ (mode == 1 ? ARMOR_BASE_COSTS[i._id] : ACCESSORY_BASE_COSTS[i._id]);
+
+ if (i._material > 36 && i._material < 59) {
+ switch (i._material) {
+ case 37:
+ amount1 /= 10;
+ break;
+ case 38:
+ amount1 /= 4;
+ break;
+ case 39:
+ amount1 /= 2;
+ break;
+ case 40:
+ amount1 /= 4;
+ break;
+ default:
+ amount1 *= METAL_BASE_MULTIPLIERS[i._material - 37];
+ break;
+ }
+ }
+
+ if (i._material < 37)
+ amount2 = ELEMENTAL_DAMAGE[i._material] * 100;
+ else if (i._material > 58)
+ amount3 = METAL_BASE_MULTIPLIERS[i._material] * 100;
+
+ switch (mode) {
+ case ITEMMODE_BLACKSMITH:
+ case ITEMMODE_2:
+ case ITEMMODE_9:
+ case ITEMMODE_10:
+ case ITEMMODE_TO_GOLD:
+ result = (amount1 + amount2 + amount3 + amount4) / ITEM_SKILL_DIVISORS[level];
+ if (!result)
+ result = 1;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+
+ case 3: {
+ // Misc
+ XeenItem &i = c->_misc[itemIndex];
+ amount1 = MISC_MATERIAL_COSTS[i._material];
+ amount4 = MISC_BASE_COSTS[i._id];
+
+ switch (mode) {
+ case ITEMMODE_BLACKSMITH:
+ case ITEMMODE_2:
+ case ITEMMODE_9:
+ case ITEMMODE_10:
+ case ITEMMODE_TO_GOLD:
+ result = (amount1 + amount2 + amount3 + amount4) / ITEM_SKILL_DIVISORS[level];
+ if (!result)
+ result = 1;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return (mode == ITEMMODE_CHAR_INFO) ? 0 : result;
+}
+
+
} // End of namespace Xeen
diff --git a/engines/xeen/dialogs_items.h b/engines/xeen/dialogs_items.h
index 100ac5c8b7..1259b2524f 100644
--- a/engines/xeen/dialogs_items.h
+++ b/engines/xeen/dialogs_items.h
@@ -30,8 +30,8 @@
namespace Xeen {
enum ItemsMode {
- ITEMMODE_CHAR_INFO = 0, ITEMMODE_BLACKSMITH = 1, ITEMMODE_4 = 4,
- ITEMMODE_6 = 6, ITEMMODE_COMBAT = 7, ITEMMODE_8 = 8,
+ ITEMMODE_CHAR_INFO = 0, ITEMMODE_BLACKSMITH = 1, ITEMMODE_2 = 2,
+ ITEMMODE_4 = 4, ITEMMODE_6 = 6, ITEMMODE_COMBAT = 7, ITEMMODE_8 = 8,
ITEMMODE_9 = 9, ITEMMODE_10 = 10, ITEMMODE_TO_GOLD = 11
};
@@ -54,6 +54,8 @@ private:
void blackData2CharData();
void setEquipmentIcons();
+
+ int calcItemCost(Character *c, int itemIndex, int mode, int skillLevel, int typeNum);
public:
static Character *show(XeenEngine *vm, Character *c, ItemsMode mode);
};
diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp
index 89f6c8a5e5..b856baab47 100644
--- a/engines/xeen/resources.cpp
+++ b/engines/xeen/resources.cpp
@@ -986,14 +986,15 @@ const char *const QUICK_REFERENCE =
const uint BLACKSMITH_MAP_IDS[2][4] = { { 28, 30, 73, 49 }, { 29, 31, 37, 43 } };
-char *const ITEMS_DIALOG_TEXT1 =
+const char *const ITEMS_DIALOG_TEXT1 =
"\r\x2\x3""c\v021\t017\f37W\fdeap\t051\f37A\fdrmor\t085A"
"\f37c\fdces\t119\f37M\fdisc\t153%s\t187%s\t221%s"
"\t255%s\t289Exit";
-
-char *const ITEMS_DIALOG_TEXT2 =
+const char *const ITEMS_DIALOG_TEXT2 =
"\r\x2\x3""c\v021\t017\f37W\fdeap\t051\f37A\fdrmor\t085A"
"\f37c\fdces\t119\f37M\fdisc\t153\f37%s\t289Exit";
+const char *const ITEMS_DIALOG_LINE1 = "\x3r\f%02u\f023%2d)\x3l\t028%s\n";
+const char *const ITEMS_DIALOG_LINE2 = "\x3r\f%02u\t023%2d)\x3l\t028%s\x3r\t000%lu\n";
const char *const BTN_BUY = "\f37B\fduy";
const char *const BTN_SELL = "\f37S\fdell";
@@ -1037,8 +1038,38 @@ const char *const ACCESSORY_NAMES[11] = {
const char *const MISC_NAMES[22] = {
nullptr, "rod ", "jewel ", "gem ", "box ", "orb ", "horn ", "coin ",
"wand ", "whistle ", "potion ", "scroll ", "RogueVM",
- "bogus", "bogus", "bogus", "bogus", "bogus",
+ "bogusg", "bogus", "bogus", "bogus", "bogus",
"bogus", "bogus", "bogus", "bogus"
};
+const int WEAPON_BASE_COSTS[35] = {
+ 0, 50, 15, 100, 80, 40, 60, 1, 10, 150, 30, 60, 8, 50,
+ 100, 15, 30, 15, 200, 80, 250, 150, 400, 100, 40, 120,
+ 300, 100, 200, 300, 25, 100, 50, 15, 0
+};
+const int ARMOR_BASE_COSTS[25] = {
+ 0, 20, 100, 200, 400, 600, 1000, 2000, 100, 60, 40, 250, 200, 100
+};
+const int ACCESSORY_BASE_COSTS[11] = {
+ 0, 100, 100, 250, 100, 50, 300, 200, 500, 1000, 2000
+};
+const int MISC_MATERIAL_COSTS[22] = {
+ 0, 50, 1000, 500, 10, 100, 20, 10, 50, 10, 10, 100,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+const int MISC_BASE_COSTS[76] = {
+ 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+ 100, 100, 100, 100, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 300, 300, 300, 300, 300,
+ 300, 300, 300, 300, 300, 400, 400, 400, 400, 400, 400, 400,
+ 400, 400, 400, 500, 500, 500, 500, 500, 500, 500, 500, 500,
+ 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
+ 600, 600, 600, 600
+};
+const int METAL_BASE_MULTIPLIERS[22] = {
+ 10, 25, 5, 75, 2, 5, 10, 20, 50, 2, 3, 5, 10, 20, 30, 40,
+ 50, 60, 70, 80, 90, 100
+};
+const int ITEM_SKILL_DIVISORS[4] = { 1, 2, 100, 10 };
+
} // End of namespace Xeen
diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h
index 4b08615520..4dae93e355 100644
--- a/engines/xeen/resources.h
+++ b/engines/xeen/resources.h
@@ -329,8 +329,10 @@ extern const char *const QUICK_REFERENCE;
extern const uint BLACKSMITH_MAP_IDS[2][4];
-extern char *const ITEMS_DIALOG_TEXT1;
-extern char *const ITEMS_DIALOG_TEXT2;
+extern const char *const ITEMS_DIALOG_TEXT1;
+extern const char *const ITEMS_DIALOG_TEXT2;
+extern const char *const ITEMS_DIALOG_LINE1;
+extern const char *const ITEMS_DIALOG_LINE2;
extern const char *const BTN_BUY;
extern const char *const BTN_SELL;
@@ -354,6 +356,14 @@ extern const char *const ARMOR_NAMES[14];
extern const char *const ACCESSORY_NAMES[11];
extern const char *const MISC_NAMES[22];
+extern const int WEAPON_BASE_COSTS[35];
+extern const int ARMOR_BASE_COSTS[25];
+extern const int ACCESSORY_BASE_COSTS[11];
+extern const int MISC_MATERIAL_COSTS[22];
+extern const int MISC_BASE_COSTS[76];
+extern const int METAL_BASE_MULTIPLIERS[22];
+extern const int ITEM_SKILL_DIVISORS[4];
+
} // End of namespace Xeen
#endif /* XEEN_RESOURCES_H */