From 7ea32f3333cb2123675f6dbdfae3ed232347d1a5 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 4 Feb 2015 20:41:17 -0500 Subject: XEEN: Moved passRestrictions to the InventoryItems class --- engines/xeen/character.cpp | 53 ++++++++++++++++++++++++++++++++++++++-- engines/xeen/character.h | 9 ++++++- engines/xeen/dialogs_items.cpp | 55 +----------------------------------------- engines/xeen/dialogs_items.h | 3 --- engines/xeen/party.h | 2 ++ 5 files changed, 62 insertions(+), 60 deletions(-) (limited to 'engines/xeen') diff --git a/engines/xeen/character.cpp b/engines/xeen/character.cpp index f712e78e8c..02c578a313 100644 --- a/engines/xeen/character.cpp +++ b/engines/xeen/character.cpp @@ -61,10 +61,56 @@ int XeenItem::getAttributeCategory() const { /*------------------------------------------------------------------------*/ -InventoryItems::InventoryItems() { +InventoryItems::InventoryItems(Character *character, ItemCategory category): + _character(character), _category(category) { resize(INV_ITEMS_TOTAL); + + static const char *const *NAMES[4] = { + WEAPON_NAMES, ARMOR_NAMES, ACCESSORY_NAMES, MISC_NAMES + }; + _names = NAMES[category]; } +/** +* Return whether a given item passes class-based usage restrictions +*/ +bool InventoryItems::passRestrictions(int itemId, bool showError) const { + CharacterClass charClass = _character->_class; + + switch (charClass) { + case CLASS_KNIGHT: + case CLASS_PALADIN: + return true; + + case CLASS_ARCHER: + case CLASS_CLERIC: + case CLASS_SORCERER: + case CLASS_ROBBER: + case CLASS_NINJA: + case CLASS_BARBARIAN: + case CLASS_DRUID: + case CLASS_RANGER: { + if (!(ITEM_RESTRICTIONS[itemId + RESTRICTION_OFFSETS[_category]] & + (1 << (charClass - CLASS_ARCHER)))) + return true; + break; + } + + default: + break; + } + + Common::String name = _names[itemId]; + if (showError) { + Common::String msg = Common::String::format(NOT_PROFICIENT, + CLASS_NAMES[charClass], name.c_str()); + ErrorScroll::show(Party::_vm, msg, WT_FREEZE_WAIT); + } + + return false; +} + + void InventoryItems::discardItem(int itemIndex) { operator[](itemIndex).clear(); sort(); @@ -127,7 +173,10 @@ AttributePair::AttributePair() { /*------------------------------------------------------------------------*/ -Character::Character(): _items(_weapons, _armor, _accessories, _misc) { +Character::Character(): + _weapons(this, CATEGORY_WEAPON), _armor(this, CATEGORY_ARMOR), + _accessories(this, CATEGORY_ACCESSORY), _misc(this, CATEGORY_MISC), + _items(_weapons, _armor, _accessories, _misc) { _sex = MALE; _race = HUMAN; _xeenSide = 0; diff --git a/engines/xeen/character.h b/engines/xeen/character.h index 54da44a011..b3c9965e9d 100644 --- a/engines/xeen/character.h +++ b/engines/xeen/character.h @@ -74,6 +74,7 @@ enum Condition { }; class XeenEngine; +class Character; class XeenItem { public: @@ -94,8 +95,14 @@ public: }; class InventoryItems : public Common::Array { +private: + Character *_character; + ItemCategory _category; + const char *const *_names; public: - InventoryItems(); + InventoryItems(Character *character, ItemCategory category); + + bool passRestrictions(int itemId, bool showError) const; void discardItem(int itemIndex); diff --git a/engines/xeen/dialogs_items.cpp b/engines/xeen/dialogs_items.cpp index 634fb2de39..c28085c15e 100644 --- a/engines/xeen/dialogs_items.cpp +++ b/engines/xeen/dialogs_items.cpp @@ -154,7 +154,7 @@ Character *ItemsDialog::execute(Character *c, ItemsMode mode) { DrawStruct &ds = _itemsDrawList[idx]; ds._sprites = &_equipSprites; - if (passRestrictions(c->_class, i._id, true, CATEGORY_WEAPON)) + if (c->_weapons.passRestrictions(i._id, true)) ds._frame = i._frame; else ds._frame = 14; @@ -537,59 +537,6 @@ int ItemsDialog::calcItemCost(Character *c, int itemIndex, ItemsMode mode, return (mode == ITEMMODE_CHAR_INFO) ? 0 : result; } -/** - * Return whether a given item passes class-based usage restrictions - */ -bool ItemsDialog::passRestrictions(CharacterClass charClass, int itemId, - bool showError, ItemCategory category) const { - switch (charClass) { - case CLASS_KNIGHT: - case CLASS_PALADIN: - return true; - - case CLASS_ARCHER: - case CLASS_CLERIC: - case CLASS_SORCERER: - case CLASS_ROBBER: - case CLASS_NINJA: - case CLASS_BARBARIAN: - case CLASS_DRUID: - case CLASS_RANGER: { - if (!(ITEM_RESTRICTIONS[itemId + RESTRICTION_OFFSETS[category]] & - (1 << (charClass - CLASS_ARCHER)))) - return true; - break; - } - - default: - break; - } - - Common::String name; - switch (category) { - case CATEGORY_WEAPON: - name = WEAPON_NAMES[itemId]; - break; - case CATEGORY_ARMOR: - name = ARMOR_NAMES[itemId]; - break; - case CATEGORY_ACCESSORY: - name = ACCESSORY_NAMES[itemId]; - break; - case CATEGORY_MISC: - name = MISC_NAMES[itemId]; - break; - } - - if (showError) { - Common::String msg = Common::String::format(NOT_PROFICIENT, - CLASS_NAMES[charClass], name.c_str()); - ErrorScroll::show(_vm, msg, WT_FREEZE_WAIT); - } - - return false; -} - bool ItemsDialog::doItemOptions(Character &c, int actionIndex, int itemIndex, ItemCategory category, ItemsMode mode) { Combat &combat = *_vm->_combat; diff --git a/engines/xeen/dialogs_items.h b/engines/xeen/dialogs_items.h index c30eaa9a4a..aff43f6429 100644 --- a/engines/xeen/dialogs_items.h +++ b/engines/xeen/dialogs_items.h @@ -58,9 +58,6 @@ private: int calcItemCost(Character *c, int itemIndex, ItemsMode mode, int skillLevel, ItemCategory category); - bool passRestrictions(CharacterClass charClass, int itemId, - bool showError, ItemCategory category) const; - bool doItemOptions(Character &c, int actionIndex, int itemIndex, ItemCategory category, ItemsMode mode); public: diff --git a/engines/xeen/party.h b/engines/xeen/party.h index 138ecba2d4..8da1163a5f 100644 --- a/engines/xeen/party.h +++ b/engines/xeen/party.h @@ -27,6 +27,7 @@ #include "common/array.h" #include "common/rect.h" #include "common/serializer.h" +#include "xeen/character.h" #include "xeen/combat.h" #include "xeen/dialogs_error.h" #include "xeen/items.h" @@ -54,6 +55,7 @@ public: class Party { friend class Character; + friend class InventoryItems; private: static XeenEngine *_vm; public: -- cgit v1.2.3