Skip to content

Commit

Permalink
XEEN: Moved passRestrictions to the InventoryItems class
Browse files Browse the repository at this point in the history
  • Loading branch information
dreammaster committed Feb 5, 2015
1 parent 8eb9ad5 commit 7ea32f3
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 60 deletions.
53 changes: 51 additions & 2 deletions engines/xeen/character.cpp
Expand Up @@ -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();
Expand Down Expand Up @@ -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;
Expand Down
9 changes: 8 additions & 1 deletion engines/xeen/character.h
Expand Up @@ -74,6 +74,7 @@ enum Condition {
};

class XeenEngine;
class Character;

class XeenItem {
public:
Expand All @@ -94,8 +95,14 @@ class XeenItem {
};

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);

Expand Down
55 changes: 1 addition & 54 deletions engines/xeen/dialogs_items.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 0 additions & 3 deletions engines/xeen/dialogs_items.h
Expand Up @@ -58,9 +58,6 @@ class ItemsDialog : public ButtonContainer {
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:
Expand Down
2 changes: 2 additions & 0 deletions engines/xeen/party.h
Expand Up @@ -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"
Expand Down Expand Up @@ -54,6 +55,7 @@ class Roster: public Common::Array<Character> {

class Party {
friend class Character;
friend class InventoryItems;
private:
static XeenEngine *_vm;
public:
Expand Down

0 comments on commit 7ea32f3

Please sign in to comment.