summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/itemprop.cc
diff options
context:
space:
mode:
authorNicholas Feinberg <pleasingfung@gmail.com>2014-07-12 15:26:53 -0700
committerNicholas Feinberg <pleasingfung@gmail.com>2014-07-13 00:33:57 -0700
commitfed8404d299063c153073816a5ed77a85c9c008c (patch)
tree71cb50c8ef1fea2881be777ffb2c44d95c5cb6a8 /crawl-ref/source/itemprop.cc
parent533b47cd6b7ff87f5d17d41a5d414cb9f8f3a6f2 (diff)
downloadcrawl-ref-fed8404d299063c153073816a5ed77a85c9c008c.tar.gz
crawl-ref-fed8404d299063c153073816a5ed77a85c9c008c.zip
Refactor item handedness code
Instead of specifying HANDS_ONE or HANDS_TWO in Weapon_prop[] (which were... misleading at best), there's now a min_2h_size and min_1h_size field. The former controls the minimum size a player or monster must be to wield the weapon at all; the latter is the minimum size required to wield it with one hand. This means that giants can now wield daggers (unlike before); if necessary, a max_size field can be added, but this seems a low priority to preserve. This breaks formatting of Weapon_prop[] a bit; apologies.
Diffstat (limited to 'crawl-ref/source/itemprop.cc')
-rw-r--r--crawl-ref/source/itemprop.cc181
1 files changed, 74 insertions, 107 deletions
diff --git a/crawl-ref/source/itemprop.cc b/crawl-ref/source/itemprop.cc
index b1d79e61fd..1411fefc0d 100644
--- a/crawl-ref/source/itemprop.cc
+++ b/crawl-ref/source/itemprop.cc
@@ -165,8 +165,8 @@ struct weapon_def
int str_weight;
skill_type skill;
- hands_reqd_type hands;
- size_type fit_size;
+ size_type min_2h_size; // min size to wield the weapon 2h
+ size_type min_1h_size; // min size to wield the weapon 1h
missile_type ammo; // MI_NONE for non-launchers
int dam_type;
@@ -178,159 +178,159 @@ static const weapon_def Weapon_prop[] =
{
// Maces & Flails
{ WPN_CLUB, "club", 5, 3, 13, 50, 7,
- SK_MACES_FLAILS, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_CRUSHING, 0 },
{ WPN_ROD, "rod", 5, 3, 13, 50, 7,
- SK_MACES_FLAILS, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_CRUSHING, 0 },
{ WPN_WHIP, "whip", 6, 2, 11, 30, 2,
- SK_MACES_FLAILS, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_SLASHING, 0 },
{ WPN_HAMMER, "hammer", 7, 3, 13, 90, 7,
- SK_MACES_FLAILS, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_CRUSHING, 0 },
{ WPN_MACE, "mace", 8, 3, 14, 120, 8,
- SK_MACES_FLAILS, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_CRUSHING, 10 },
{ WPN_FLAIL, "flail", 10, 0, 14, 130, 8,
- SK_MACES_FLAILS, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_CRUSHING, 10 },
{ WPN_MORNINGSTAR, "morningstar", 13, -2, 15, 140, 8,
- SK_MACES_FLAILS, HANDS_ONE, SIZE_SMALL, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LITTLE, SIZE_SMALL, MI_NONE,
DAMV_CRUSHING | DAM_PIERCE, 10 },
{ WPN_DEMON_WHIP, "demon whip", 11, 1, 11, 30, 2,
- SK_MACES_FLAILS, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_SLASHING, 2 },
{ WPN_SACRED_SCOURGE, "sacred scourge", 12, 0, 11, 30, 2,
- SK_MACES_FLAILS, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_SLASHING, 0 },
{ WPN_DIRE_FLAIL, "dire flail", 13, -3, 13, 240, 9,
- SK_MACES_FLAILS, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_MACES_FLAILS, SIZE_MEDIUM, SIZE_BIG, MI_NONE,
DAMV_CRUSHING | DAM_PIERCE, 10 },
{ WPN_EVENINGSTAR, "eveningstar", 15, -1, 15, 180, 8,
- SK_MACES_FLAILS, HANDS_ONE, SIZE_SMALL, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LITTLE, SIZE_SMALL, MI_NONE,
DAMV_CRUSHING | DAM_PIERCE, 2 },
{ WPN_GREAT_MACE, "great mace", 17, -4, 17, 270, 9,
- SK_MACES_FLAILS, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_MACES_FLAILS, SIZE_MEDIUM, SIZE_BIG, MI_NONE,
DAMV_CRUSHING, 10 },
{ WPN_GIANT_CLUB, "giant club", 20, -6, 17, 330, 10,
- SK_MACES_FLAILS, HANDS_TWO, SIZE_BIG, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LARGE, NUM_SIZE_LEVELS, MI_NONE,
DAMV_CRUSHING, 10 },
{ WPN_GIANT_SPIKED_CLUB, "giant spiked club", 22, -7, 18, 350, 10,
- SK_MACES_FLAILS, HANDS_TWO, SIZE_BIG, MI_NONE,
+ SK_MACES_FLAILS, SIZE_LARGE, NUM_SIZE_LEVELS, MI_NONE,
DAMV_CRUSHING | DAM_PIERCE, 10 },
// Short Blades
{ WPN_DAGGER, "dagger", 4, 6, 10, 20, 1,
- SK_SHORT_BLADES, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_SHORT_BLADES, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_STABBING | DAM_SLICE, 10 },
{ WPN_QUICK_BLADE, "quick blade", 5, 6, 7, 50, 0,
- SK_SHORT_BLADES, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_SHORT_BLADES, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_STABBING | DAM_SLICE, 2 },
{ WPN_SHORT_SWORD, "short sword", 6, 4, 11, 80, 2,
- SK_SHORT_BLADES, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_SHORT_BLADES, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_SLICING | DAM_PIERCE, 10 },
{ WPN_CUTLASS, "cutlass", 7, 4, 12, 90, 2,
- SK_SHORT_BLADES, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_SHORT_BLADES, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_SLICING | DAM_PIERCE, 10 },
// Long Blades
{ WPN_FALCHION, "falchion", 8, 2, 13, 170, 3,
- SK_LONG_BLADES, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_LONG_BLADES, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_SLICING, 10 }, // or perhaps DAMV_CHOPPING is more apt?
{ WPN_BLESSED_FALCHION, "blessed falchion", 9, 2, 12, 170, 3,
- SK_LONG_BLADES, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_LONG_BLADES, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_SLICING, 0 }, // or perhaps DAMV_CHOPPING is more apt?
{ WPN_LONG_SWORD, "long sword", 10, 1, 14, 160, 3,
- SK_LONG_BLADES, HANDS_ONE, SIZE_SMALL, MI_NONE,
+ SK_LONG_BLADES, SIZE_LITTLE, SIZE_SMALL, MI_NONE,
DAMV_SLICING, 10 },
{ WPN_BLESSED_LONG_SWORD, "blessed long sword", 11, 0, 13, 160, 3,
- SK_LONG_BLADES, HANDS_ONE, SIZE_SMALL, MI_NONE,
+ SK_LONG_BLADES, SIZE_LITTLE, SIZE_SMALL, MI_NONE,
DAMV_SLICING, 0 },
{ WPN_SCIMITAR, "scimitar", 12, -2, 14, 170, 3,
- SK_LONG_BLADES, HANDS_ONE, SIZE_SMALL, MI_NONE,
+ SK_LONG_BLADES, SIZE_LITTLE, SIZE_SMALL, MI_NONE,
DAMV_SLICING, 10 },
{ WPN_BLESSED_SCIMITAR, "blessed scimitar", 13, -3, 13, 170, 3,
- SK_LONG_BLADES, HANDS_ONE, SIZE_SMALL, MI_NONE,
+ SK_LONG_BLADES, SIZE_LITTLE, SIZE_SMALL, MI_NONE,
DAMV_SLICING, 0 },
{ WPN_DEMON_BLADE, "demon blade", 13, -1, 13, 200, 3,
- SK_LONG_BLADES, HANDS_ONE, SIZE_SMALL, MI_NONE,
+ SK_LONG_BLADES, SIZE_LITTLE, SIZE_SMALL, MI_NONE,
DAMV_SLICING, 2 },
{ WPN_EUDEMON_BLADE, "eudemon blade", 14, -2, 12, 200, 3,
- SK_LONG_BLADES, HANDS_ONE, SIZE_SMALL, MI_NONE,
+ SK_LONG_BLADES, SIZE_LITTLE, SIZE_SMALL, MI_NONE,
DAMV_SLICING, 0 },
{ WPN_BASTARD_SWORD, "bastard sword", 15, -1, 15, 220, 3,
- SK_LONG_BLADES, HANDS_ONE, SIZE_MEDIUM, MI_NONE,
+ SK_LONG_BLADES, SIZE_LITTLE, SIZE_MEDIUM, MI_NONE,
DAMV_SLICING, 2 },
{ WPN_BLESSED_BASTARD_SWORD, "blessed bastard sword", 16, -2, 14, 220, 3,
- SK_LONG_BLADES, HANDS_ONE, SIZE_MEDIUM, MI_NONE,
+ SK_LONG_BLADES, SIZE_LITTLE, SIZE_MEDIUM, MI_NONE,
DAMV_SLICING, 0 },
{ WPN_GREAT_SWORD, "great sword", 16, -3, 16, 250, 5,
- SK_LONG_BLADES, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_LONG_BLADES, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_SLICING, 10 },
{ WPN_BLESSED_GREAT_SWORD, "blessed great sword", 17, -4, 15, 250, 5,
- SK_LONG_BLADES, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_LONG_BLADES, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_SLICING, 0 },
{ WPN_CLAYMORE, "claymore", 19, -4, 19, 260, 5,
- SK_LONG_BLADES, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_LONG_BLADES, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_SLICING, 2 },
{ WPN_BLESSED_CLAYMORE, "blessed claymore", 20, -5, 18, 260, 5,
- SK_LONG_BLADES, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_LONG_BLADES, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_SLICING, 0 },
// Axes
{ WPN_HAND_AXE, "hand axe", 7, 3, 13, 80, 6,
- SK_AXES, HANDS_ONE, SIZE_LITTLE, MI_NONE,
+ SK_AXES, SIZE_LITTLE, SIZE_LITTLE, MI_NONE,
DAMV_CHOPPING, 10 },
{ WPN_WAR_AXE, "war axe", 11, 0, 15, 180, 7,
- SK_AXES, HANDS_ONE, SIZE_SMALL, MI_NONE,
+ SK_AXES, SIZE_LITTLE, SIZE_SMALL, MI_NONE,
DAMV_CHOPPING, 10 },
{ WPN_BROAD_AXE, "broad axe", 13, -2, 16, 230, 8,
- SK_AXES, HANDS_ONE, SIZE_MEDIUM, MI_NONE,
+ SK_AXES, SIZE_LITTLE, SIZE_MEDIUM, MI_NONE,
DAMV_CHOPPING, 10 },
{ WPN_BATTLEAXE, "battleaxe", 15, -4, 17, 250, 8,
- SK_AXES, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_AXES, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_CHOPPING, 10 },
{ WPN_EXECUTIONERS_AXE, "executioner's axe", 18, -6, 20, 280, 9,
- SK_AXES, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_AXES, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_CHOPPING, 2 },
// Polearms
{ WPN_SPEAR, "spear", 6, 4, 11, 50, 3,
- SK_POLEARMS, HANDS_ONE, SIZE_SMALL, MI_NONE,
+ SK_POLEARMS, SIZE_LITTLE, SIZE_SMALL, MI_NONE,
DAMV_PIERCING, 10 },
{ WPN_TRIDENT, "trident", 9, 1, 13, 160, 4,
- SK_POLEARMS, HANDS_ONE, SIZE_MEDIUM, MI_NONE,
+ SK_POLEARMS, SIZE_LITTLE, SIZE_MEDIUM, MI_NONE,
DAMV_PIERCING, 10 },
{ WPN_HALBERD, "halberd", 13, -3, 15, 200, 5,
- SK_POLEARMS, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_POLEARMS, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_CHOPPING | DAM_PIERCE, 10 },
{ WPN_SCYTHE, "scythe", 14, -4, 20, 220, 7,
- SK_POLEARMS, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_POLEARMS, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_SLICING, 0 },
{ WPN_DEMON_TRIDENT, "demon trident", 12, 1, 13, 160, 4,
- SK_POLEARMS, HANDS_ONE, SIZE_MEDIUM, MI_NONE,
+ SK_POLEARMS, SIZE_LITTLE, SIZE_MEDIUM, MI_NONE,
DAMV_PIERCING, 2 },
{ WPN_TRISHULA, "trishula", 13, 0, 13, 160, 4,
- SK_POLEARMS, HANDS_ONE, SIZE_MEDIUM, MI_NONE,
+ SK_POLEARMS, SIZE_LITTLE, SIZE_MEDIUM, MI_NONE,
DAMV_PIERCING, 0 },
{ WPN_GLAIVE, "glaive", 15, -3, 17, 200, 6,
- SK_POLEARMS, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_POLEARMS, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_CHOPPING, 10 },
{ WPN_BARDICHE, "bardiche", 18, -6, 20, 200, 8,
- SK_POLEARMS, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_POLEARMS, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_CHOPPING, 2 },
// Staves
// WPN_STAFF is for weapon stats for magical staves only.
{ WPN_STAFF, "staff", 5, 5, 12, 150, 3,
- SK_STAVES, HANDS_ONE, SIZE_MEDIUM, MI_NONE,
+ SK_STAVES, SIZE_LITTLE, SIZE_MEDIUM, MI_NONE,
DAMV_CRUSHING, 0 },
{ WPN_QUARTERSTAFF, "quarterstaff", 10, 3, 13, 180, 3,
- SK_STAVES, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_STAVES, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_CRUSHING, 10 },
{ WPN_LAJATANG, "lajatang", 16,-3, 14, 200, 3,
- SK_STAVES, HANDS_TWO, SIZE_LARGE, MI_NONE,
+ SK_STAVES, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_NONE,
DAMV_SLICING, 2 },
// Range weapons
@@ -339,26 +339,26 @@ static const weapon_def Weapon_prop[] =
// - slings get a bonus from dex, not str (as tension is meaningless)
// - str weight is used for speed and applying dex to skill
{ WPN_BLOWGUN, "blowgun", 0, 2, 10, 20, 0,
- SK_THROWING, HANDS_ONE, SIZE_LITTLE, MI_NEEDLE,
+ SK_THROWING, SIZE_LITTLE, SIZE_LITTLE, MI_NEEDLE,
DAMV_NON_MELEE, 0 },
{ WPN_HUNTING_SLING, "hunting sling", 5, 2, 12, 20, 1,
- SK_SLINGS, HANDS_ONE, SIZE_LITTLE, MI_STONE,
+ SK_SLINGS, SIZE_LITTLE, SIZE_LITTLE, MI_STONE,
DAMV_NON_MELEE, 10 },
{ WPN_GREATSLING, "greatsling", 8, -1, 14, 20, 1,
- SK_SLINGS, HANDS_ONE, SIZE_LITTLE, MI_STONE,
+ SK_SLINGS, SIZE_LITTLE, SIZE_LITTLE, MI_STONE,
DAMV_NON_MELEE, 2 },
{ WPN_CROSSBOW, "crossbow", 5, 4, 15, 150, 8,
- SK_CROSSBOWS, HANDS_TWO, SIZE_MEDIUM, MI_BOLT,
+ SK_CROSSBOWS, SIZE_LITTLE, NUM_SIZE_LEVELS, MI_BOLT,
DAMV_NON_MELEE, 10 },
{ WPN_SHORTBOW, "shortbow", 8, 1, 13, 90, 2,
- SK_BOWS, HANDS_TWO, SIZE_MEDIUM, MI_ARROW,
+ SK_BOWS, SIZE_LITTLE, NUM_SIZE_LEVELS, MI_ARROW,
DAMV_NON_MELEE, 10 },
{ WPN_LONGBOW, "longbow", 15, 0, 18, 120, 3,
- SK_BOWS, HANDS_TWO, SIZE_LARGE, MI_ARROW,
+ SK_BOWS, SIZE_MEDIUM, NUM_SIZE_LEVELS, MI_ARROW,
DAMV_NON_MELEE, 10 },
};
@@ -1363,43 +1363,21 @@ int single_damage_type(const item_def &item)
return ret;
}
-size_type weapon_size(const item_def &item)
-{
- return Weapon_prop[Weapon_index[item.sub_type]].fit_size;
-}
-
// Give hands required to wield weapon for a torso of "size".
// Not adjusted by species or anything, which is why it's "basic".
hands_reqd_type basic_hands_reqd(const item_def &item, size_type size)
{
- hands_reqd_type ret = HANDS_ONE;
-
- switch (item.base_type)
- {
- case OBJ_STAVES:
- if (size < SIZE_MEDIUM)
- ret = HANDS_TWO;
- else
- ret = HANDS_ONE;
- break;
-
- case OBJ_WEAPONS:
- ret = Weapon_prop[ Weapon_index[item.sub_type] ].hands;
+ ASSERT(is_weapon(item));
- // Adjust handedness only for small races using melee weapons
- // that are larger than they are.
- if (!is_range_weapon(item)
- && size < SIZE_MEDIUM
- && weapon_size(item) > size)
- {
- ret = HANDS_TWO;
- }
- break;
+ const int wpn_type = OBJ_WEAPONS == item.base_type ? item.sub_type :
+ OBJ_RODS == item.base_type ? WPN_ROD :
+ OBJ_STAVES == item.base_type ? WPN_STAFF :
+ WPN_UNKNOWN;
- default:
- break;
- }
- return ret;
+ if (wpn_type == WPN_UNKNOWN)
+ return HANDS_ONE; // ???
+ return size >= Weapon_prop[Weapon_index[wpn_type]].min_1h_size ? HANDS_ONE
+ : HANDS_TWO;
}
hands_reqd_type hands_reqd(const actor* ac, object_class_type base_type, int sub_type)
@@ -1713,17 +1691,14 @@ bool item_skills(const item_def &item, set<skill_type> &skills)
return !skills.empty();
}
-// Returns number of sizes away from being a usable weapon.
-static int _fit_weapon_wieldable_size(const item_def &item, size_type size)
-{
- const int fit = Weapon_prop[Weapon_index[item.sub_type]].fit_size - size;
-
- return (fit < -2) ? fit + 2 :
- (fit > 1) ? fit - 1 : 0;
-}
-
-// Returns true if weapon is usable as a weapon.
-bool check_weapon_wieldable_size(const item_def &item, size_type size)
+/**
+ * Checks if the provided weapon is wieldable by a creature of the given size.
+ *
+ * @param item The weapon in question.
+ * @param size The size of the creature trying to wield the weapon.
+ * @return Whether a creature of the given size can wield the weapon.
+ */
+bool is_weapon_wieldable(const item_def &item, size_type size)
{
ASSERT(is_weapon(item));
@@ -1734,15 +1709,7 @@ bool check_weapon_wieldable_size(const item_def &item, size_type size)
return true;
}
- int fit = _fit_weapon_wieldable_size(item, size);
-
- // Adjust fit for size.
- if (size < SIZE_SMALL && fit > 0)
- fit--;
- else if (size > SIZE_LARGE && fit < 0)
- fit++;
-
- return fit == 0;
+ return Weapon_prop[Weapon_index[item.sub_type]].min_2h_size <= size;
}
//