item action 'W' for armor

In the context-sensitive menu when picking an item of armor from an
inventory listing, distinguish between wear-this-armor from could-
wear-this-armor-if-something-else-wasn't-already-worn-in-its-slot.
This commit is contained in:
PatR
2025-10-13 23:13:15 -07:00
parent 34d0e956ed
commit 6f8c1127ed
3 changed files with 82 additions and 2 deletions

View File

@@ -3866,6 +3866,8 @@ extern void setworn(struct obj *, long) NO_NNARGS; /* has tests for obj */
extern void setnotworn(struct obj *) NO_NNARGS; /* has tests for obj */
extern void allunworn(void);
extern struct obj *wearmask_to_obj(long);
extern int wornmask_to_armcat(long);
extern long armcat_to_wornmask(int);
extern long wearslot(struct obj *) NONNULLARG1;
extern void check_wornmask_slots(void);
extern void mon_set_minvis(struct monst *) NONNULLARG1;

View File

@@ -3444,8 +3444,22 @@ itemactions(struct obj *otmp)
/* W: wear armor */
if (!already_worn) {
if (otmp->oclass == ARMOR_CLASS)
ia_addmenu(win, IA_WEAR_OBJ, 'W', "Wear this armor");
if (otmp->oclass == ARMOR_CLASS) {
/* if 'otmp' is worn we skip 'W' (and show 'T' above instead);
if it isn't, we either show "W - wear this" if otmp's slot
isn't populated, or "W - [already wearing <simple-armor>]";
for the latter, picking 'W' will fail but we don't want to
omit 'W' in this situation */
long Wmask = armcat_to_wornmask(objects[otmp->otyp].oc_armcat);
struct obj *o = wearmask_to_obj(Wmask);
if (!o)
Strcpy(buf, "Wear this armor");
else
Sprintf(buf, "[already wearing %s]", an(armor_simple_name(o)));
ia_addmenu(win, IA_WEAR_OBJ, 'W', buf);
}
}
/* x: Swap main and readied weapon */

View File

@@ -205,6 +205,70 @@ wearmask_to_obj(long wornmask)
return (struct obj *) 0;
}
/* convert an armor wornmask to corresponding category */
int
wornmask_to_armcat(long mask)
{
int cat = 0;
switch (mask & W_ARMOR) {
case W_ARM:
cat = ARM_SUIT;
break;
case W_ARMC:
cat = ARM_CLOAK;
break;
case W_ARMH:
cat = ARM_HELM;
break;
case W_ARMS:
cat = ARM_SHIELD;
break;
case W_ARMG:
cat = ARM_GLOVES;
break;
case W_ARMF:
cat = ARM_BOOTS;
break;
case W_ARMU:
cat = ARM_SHIRT;
break;
}
return cat;
}
/* convert an armor category to corresponding wornmask */
long
armcat_to_wornmask(int cat)
{
long mask = 0L;
switch (cat) {
case ARM_SUIT:
mask = W_ARM;
break;
case ARM_CLOAK:
mask = W_ARMC;
break;
case ARM_HELM:
mask = W_ARMH;
break;
case ARM_SHIELD:
mask = W_ARMS;
break;
case ARM_GLOVES:
mask = W_ARMG;
break;
case ARM_BOOTS:
mask = W_ARMF;
break;
case ARM_SHIRT:
mask = W_ARMU;
break;
}
return mask;
}
/* return a bitmask of the equipment slot(s) a given item might be worn in */
long
wearslot(struct obj *obj)