summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/itemprop.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/itemprop.cc')
-rw-r--r--crawl-ref/source/itemprop.cc33
1 files changed, 30 insertions, 3 deletions
diff --git a/crawl-ref/source/itemprop.cc b/crawl-ref/source/itemprop.cc
index 9d79151650..d7d4311da8 100644
--- a/crawl-ref/source/itemprop.cc
+++ b/crawl-ref/source/itemprop.cc
@@ -1324,12 +1324,30 @@ bool check_armour_shape( const item_def &item, bool quiet )
return (true);
}
-// If known is true, only returns true for *known* weapons of electrocution.
+// If known is true, only returns true for *known* weapons of electrocution,
+// and returns false for wands/rods known to be fully charged.
bool item_is_rechargeable(const item_def &it, bool known)
{
// These are obvious...
- if (it.base_type == OBJ_WANDS || item_is_rod(it))
+ if (it.base_type == OBJ_WANDS)
+ {
+ if (known && (it.plus == ZAPCOUNT_MAX_CHARGED
+ || item_ident(it, ISFLAG_KNOW_PLUSES)
+ && it.plus < 3 * wand_charge_value(it.sub_type)))
+ {
+ return (false);
+ }
+ return (true);
+ }
+ else if (item_is_rod(it))
+ {
+ if (known && item_ident(it, ISFLAG_KNOW_PLUSES))
+ {
+ return (it.plus2 < MAX_ROD_CHARGE * ROD_CHARGE_MULT
+ || it.plus < it.plus2);
+ }
return (true);
+ }
// ...but electric weapons can also be charged.
return (it.base_type == OBJ_WEAPONS
@@ -1388,7 +1406,9 @@ bool is_enchantable_weapon(const item_def &wpn, bool uncurse)
return (true);
}
-bool is_enchantable_armour(const item_def &arm, bool uncurse)
+// Returns whether a piece of armour can be enchanted further.
+// If unknown is true, unidentified armour will return true.
+bool is_enchantable_armour(const item_def &arm, bool uncurse, bool unknown)
{
if (arm.base_type != OBJ_ARMOUR)
return (false);
@@ -1397,6 +1417,13 @@ bool is_enchantable_armour(const item_def &arm, bool uncurse)
if (!you_tran_can_wear(arm) && item_is_equipped(arm))
return (false);
+ // If we don't know the plusses, assume enchanting is possible.
+ if (unknown && !is_known_artefact(arm)
+ && !item_ident(arm, ISFLAG_KNOW_PLUSES ))
+ {
+ return (true);
+ }
+
// Artefacts or highly enchanted armour cannot be enchanted, only
// uncursed.
if (is_artefact(arm) || arm.plus >= armour_max_enchant(arm))