diff options
author | Paul Gilbert | 2018-03-30 23:03:15 -0400 |
---|---|---|
committer | Paul Gilbert | 2018-03-30 23:03:15 -0400 |
commit | 494fd3bb52e054969eb94ed72dc2d12a6e412fd1 (patch) | |
tree | 58781d5b9b2ae8232ba0329f2fb3fec626f32406 | |
parent | c33fce7ac7445dc9d5a9cf767673ab3abb52bdf6 (diff) | |
download | scummvm-rg350-494fd3bb52e054969eb94ed72dc2d12a6e412fd1.tar.gz scummvm-rg350-494fd3bb52e054969eb94ed72dc2d12a6e412fd1.tar.bz2 scummvm-rg350-494fd3bb52e054969eb94ed72dc2d12a6e412fd1.zip |
XEEN: Fixes for giving items via scripts
-rw-r--r-- | engines/xeen/item.cpp | 40 | ||||
-rw-r--r-- | engines/xeen/item.h | 8 | ||||
-rw-r--r-- | engines/xeen/party.cpp | 3 | ||||
-rw-r--r-- | engines/xeen/scripts.cpp | 88 |
4 files changed, 69 insertions, 70 deletions
diff --git a/engines/xeen/item.cpp b/engines/xeen/item.cpp index 871f60b82b..cb18bd4b02 100644 --- a/engines/xeen/item.cpp +++ b/engines/xeen/item.cpp @@ -66,22 +66,30 @@ AttributeCategory XeenItem::getAttributeCategory() const { } const char *XeenItem::getItemName(ItemCategory category, uint id) { - if (id < 82) - return Res.ITEM_NAMES[category][id]; - - const char **questItems = (g_vm->getGameID() == GType_Swords) ? Res.QUEST_ITEM_NAMES_SWORDS : Res.QUEST_ITEM_NAMES; - switch (category) { - case CATEGORY_WEAPON: - return questItems[id - 82]; - - case CATEGORY_ARMOR: - return questItems[id - 82 + 35]; - - case CATEGORY_ACCESSORY: - return questItems[id - 82 + 35 + 14]; - - default: - return questItems[id - 82 + 35 + 14 + 11]; + if (id < 82) { + switch (category) { + case CATEGORY_WEAPON: + return Res.WEAPON_NAMES[id]; + case CATEGORY_ARMOR: + return Res.ARMOR_NAMES[id - 35]; + case CATEGORY_ACCESSORY: + return Res.ACCESSORY_NAMES[id - 49]; + default: + return Res.MISC_NAMES[id]; + } + } else { + const char **questItems = (g_vm->getGameID() == GType_Swords) ? Res.QUEST_ITEM_NAMES_SWORDS : Res.QUEST_ITEM_NAMES; + + switch (category) { + case CATEGORY_WEAPON: + return questItems[id - 82]; + case CATEGORY_ARMOR: + return questItems[id - 82 + 35]; + case CATEGORY_ACCESSORY: + return questItems[id - 82 + 35 + 14]; + default: + return questItems[id - 82 + 35 + 14 + 11]; + } } } diff --git a/engines/xeen/item.h b/engines/xeen/item.h index 0fcfa92f44..105df0e661 100644 --- a/engines/xeen/item.h +++ b/engines/xeen/item.h @@ -64,9 +64,17 @@ public: */ static const char *getItemName(ItemCategory category, uint id); public: + /** + * Constructor + */ XeenItem(); /** + * Constructor + */ + XeenItem(uint id, int material, int bonusFlags) : _id(id), _material(material), _bonusFlags(bonusFlags) {} + + /** * Clear the data for the item */ void clear(); diff --git a/engines/xeen/party.cpp b/engines/xeen/party.cpp index 42b45a8079..d6ef37791e 100644 --- a/engines/xeen/party.cpp +++ b/engines/xeen/party.cpp @@ -827,7 +827,8 @@ void Party::giveTreasureToCharacter(Character &c, ItemCategory category, int ite w.update(); events.ipause(5); - const char *itemName = XeenItem::getItemName(category, treasureItem._id); + const char *itemName = XeenItem::getItemName(category, (category == CATEGORY_MISC) ? + treasureItem._material : treasureItem._id); w.writeString(Common::String::format(Res.X_FOUND_Y, c._name.c_str(), itemName)); w.update(); c._items[category].sort(); diff --git a/engines/xeen/scripts.cpp b/engines/xeen/scripts.cpp index d135a4ae11..970004765c 100644 --- a/engines/xeen/scripts.cpp +++ b/engines/xeen/scripts.cpp @@ -1225,64 +1225,46 @@ bool Scripts::cmdSelectRandomChar(ParamsIterator ¶ms) { bool Scripts::cmdGiveEnchanted(ParamsIterator ¶ms) { Party &party = *_vm->_party; - + XeenItem *item; + int invIndex; int id = params.readByte(); - int material = params.readByte(); - int flags = params.readByte(); - - if (id >= 35) { - if (id < 49) { - for (int idx = 0; idx < MAX_TREASURE_ITEMS; ++idx) { - XeenItem &item = party._treasure._armor[idx]; - if (!item.empty()) { - item._id = id - 35; - item._material = material; - item._bonusFlags = flags; - party._treasure._hasItems = true; - break; - } - } - return true; - } else if (id < 60) { - for (int idx = 0; idx < MAX_TREASURE_ITEMS; ++idx) { - XeenItem &item = party._treasure._accessories[idx]; - if (!item.empty()) { - item._id = id - 49; - item._material = material; - item._bonusFlags = flags; - party._treasure._hasItems = true; - break; - } - } + // Get category of item to add + ItemCategory cat = CATEGORY_WEAPON; + if (id < 35) { + } else if (id < 49) { + cat = CATEGORY_ARMOR; + id -= 35; + } else if (id < 60) { + cat = CATEGORY_ACCESSORY; + id -= 49; + } else if (id < 82) { + cat = CATEGORY_MISC; + id -= 60; + } else { + party._questItems[id - 82]++; + } - return true; - } else if (id < 82) { - for (int idx = 0; idx < MAX_TREASURE_ITEMS; ++idx) { - XeenItem &item = party._treasure._misc[idx]; - if (!item.empty()) { - item._id = id; - item._material = material; - item._bonusFlags = flags; - party._treasure._hasItems = true; - break; - } - } + // Check for an empty slot + for (invIndex = 0, item = party._treasure[cat]; invIndex < MAX_TREASURE_ITEMS && !item->empty(); ++invIndex, ++item) + ; - return true; - } else { - party._questItems[id - 82]++; - } - } + if (invIndex == MAX_TREASURE_ITEMS) { + // Treasure category entirely full. Should never happen + warning("Treasure category was completely filled up"); + } else { + party._treasure._hasItems = true; - for (int idx = 0; idx < MAX_TREASURE_ITEMS; ++idx) { - XeenItem &item = party._treasure._weapons[idx]; - if (!item.empty()) { - item._id = id; - item._material = material; - item._bonusFlags = flags; - party._treasure._hasItems = true; - break; + if (cat == CATEGORY_MISC) { + // Handling of misc items. Note that for them, id actually specifies the material field + item->_material = id; + item->_id = params.readByte(); + item->_bonusFlags = (item->_material == 10 || item->_material == 11) ? 1 : _vm->getRandomNumber(3, 10); + } else { + // Weapons, armor, and accessories + item->_id = id; + item->_material = params.readByte(); + item->_bonusFlags = params.readByte(); } } |