]> granicus.if.org Git - nethack/commitdiff
'A' again - avoid stale takeoff.mask
authorPatR <rankin@nethack.org>
Sun, 4 Jun 2017 22:22:00 +0000 (15:22 -0700)
committerPatR <rankin@nethack.org>
Sun, 4 Jun 2017 22:22:00 +0000 (15:22 -0700)
The do_wear.c part just eliminates some redundant code but shouldn't
produce any change in behavior.

The steal.c part should fix problems with 'A' when outer items are
taken off during theft in order to steal an inner item, where the
outer item is next to be removed (call to cancel_don() wasn't being
made).  The wield.c part matches the X_off() behavior and is needed
to handle a weapon item that's slated for removal but isn't next (so
wouldn't pass the donning()/doffing() test to trigger cancel_don()).

If this seems a lot like trial and error, it is....

src/do_wear.c
src/steal.c
src/wield.c

index 197e69e80955c9cf52ce0f7f5333587df92e4f98..2d16d34d1da01b43b78fdffdf228fcc762d2caee 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 do_wear.c       $NHDT-Date: 1496547229 2017/06/04 03:33:49 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.96 $ */
+/* NetHack 3.6 do_wear.c       $NHDT-Date: 1496614914 2017/06/04 22:21:54 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.97 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -1200,53 +1200,30 @@ struct obj *obj; /* if null, do all worn items; otherwise just obj itself */
 }
 
 /* check whether the target object is currently being put on (or taken off--
-   also checks for doffing) */
+   also checks for doffing--[why?]) */
 boolean
 donning(otmp)
 struct obj *otmp;
 {
-    /* long what = (occupation == take_off) ? context.takeoff.what : 0L; */
-    long what = context.takeoff.what; /* if nonzero, occupation is implied */
     boolean result = FALSE;
 
     /* 'W' and 'T' set afternmv, 'A' sets context.takeoff.what */
-    if (otmp == uarm)
-        result = (afternmv == Armor_on || afternmv == Armor_off
-                  || what == WORN_ARMOR);
+    if (doffing(otmp))
+        result = TRUE;
+    else if (otmp == uarm)
+        result = (afternmv == Armor_on);
     else if (otmp == uarmu)
-        result = (afternmv == Shirt_on || afternmv == Shirt_off
-                  || what == WORN_SHIRT);
+        result = (afternmv == Shirt_on);
     else if (otmp == uarmc)
-        result = (afternmv == Cloak_on || afternmv == Cloak_off
-                  || what == WORN_CLOAK);
+        result = (afternmv == Cloak_on);
     else if (otmp == uarmf)
-        result = (afternmv == Boots_on || afternmv == Boots_off
-                  || what == WORN_BOOTS);
+        result = (afternmv == Boots_on);
     else if (otmp == uarmh)
-        result = (afternmv == Helmet_on || afternmv == Helmet_off
-                  || what == WORN_HELMET);
+        result = (afternmv == Helmet_on);
     else if (otmp == uarmg)
-        result = (afternmv == Gloves_on || afternmv == Gloves_off
-                  || what == WORN_GLOVES);
+        result = (afternmv == Gloves_on);
     else if (otmp == uarms)
-        result = (afternmv == Shield_on || afternmv == Shield_off
-                  || what == WORN_SHIELD);
-    /* these 1-turn items don't need 'afternmv' checks
-       [and may not actually need 'what' checks] */
-    else if (otmp == uamul)
-        result = (what == WORN_AMUL);
-    else if (otmp == uleft)
-        result = (what == LEFT_RING);
-    else if (otmp == uright)
-        result = (what == RIGHT_RING);
-    else if (otmp == ublindf)
-        result = (what == WORN_BLINDF);
-    else if (otmp == uwep)
-        result = (what == W_WEP);
-    else if (otmp == uswapwep)
-        result = (what == W_SWAPWEP);
-    else if (otmp == uquiver)
-        result = (what == W_QUIVER);
+        result = (afternmv == Shield_on);
 
     return result;
 }
index a973bf7a291890269428fe57a64375bcce9919bc..203bf331a52a6c93b93106e356929d8c36162735 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 steal.c $NHDT-Date: 1456618998 2016/02/28 00:23:18 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.67 $ */
+/* NetHack 3.6 steal.c $NHDT-Date: 1496614914 2017/06/04 22:21:54 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.69 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -560,18 +560,19 @@ struct monst *mtmp;
         /* take off outer gear if we're targetting [hypothetical]
            quest artifact suit, shirt, gloves, or rings */
         if ((otmp == uarm || otmp == uarmu) && uarmc)
-            (void) Cloak_off();
+            remove_worn_item(uarmc, FALSE);
         if (otmp == uarmu && uarm)
-            (void) Armor_off();
+            remove_worn_item(uarm, FALSE);
         if ((otmp == uarmg || ((otmp == uright || otmp == uleft) && uarmg))
             && uwep) {
             /* gloves are about to be unworn; unwield weapon(s) first */
-            if (u.twoweap)
-                uswapwepgone(); /* will clear u.twoweap */
-            uwepgone();
+            if (u.twoweap)    /* remove_worn_item(uswapwep) indirectly */
+                remove_worn_item(uswapwep, FALSE); /* clears u.twoweap */
+            remove_worn_item(uwep, FALSE);
         }
         if ((otmp == uright || otmp == uleft) && uarmg)
-            (void) Gloves_off(); /* handles wielded cockatrice corpse */
+            /* calls Gloves_off() to handle wielded cockatrice corpse */
+            remove_worn_item(uarmg, FALSE);
 
         /* finally, steal the target item */
         if (otmp->owornmask)
index 585e971c918a4aafa77eefef61d76ac98fa79dcd..d2f51a2ee3e71ff449fbbf95e4e223346d8fa5ad 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 wield.c $NHDT-Date: 1461967849 2016/04/29 22:10:49 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.49 $ */
+/* NetHack 3.6 wield.c $NHDT-Date: 1496614915 2017/06/04 22:21:55 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.53 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -676,6 +676,10 @@ uwepgone()
                 pline("%s shining.", Tobjnam(uwep, "stop"));
         }
         setworn((struct obj *) 0, W_WEP);
+        /* update takeoff mask in case uwep has just gone away while
+           its removal via 'A' was pending, similar to what the various
+           Xyzzy_off(do_wear.c) routines do for armor and accessories */
+        context.takeoff.mask &= ~W_WEP;
         unweapon = TRUE;
         update_inventory();
     }
@@ -686,6 +690,7 @@ uswapwepgone()
 {
     if (uswapwep) {
         setworn((struct obj *) 0, W_SWAPWEP);
+        context.takeoff.mask &= ~W_SWAPWEP;
         update_inventory();
     }
 }
@@ -695,6 +700,7 @@ uqwepgone()
 {
     if (uquiver) {
         setworn((struct obj *) 0, W_QUIVER);
+        context.takeoff.mask &= ~W_QUIVER;
         update_inventory();
     }
 }