aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/xeen/character.cpp53
-rw-r--r--engines/xeen/character.h9
-rw-r--r--engines/xeen/dialogs_items.cpp55
-rw-r--r--engines/xeen/dialogs_items.h3
-rw-r--r--engines/xeen/party.h2
5 files changed, 62 insertions, 60 deletions
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<XeenItem> {
+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: