]> granicus.if.org Git - nethack/commitdiff
sanity check for embedded dragon scales
authorPatR <rankin@nethack.org>
Tue, 6 Oct 2015 01:18:03 +0000 (18:18 -0700)
committerPatR <rankin@nethack.org>
Tue, 6 Oct 2015 01:18:03 +0000 (18:18 -0700)
The problem discovered with sanity checking of embedded dragon scales
was with the checking, not with the object flagged "embedded in skin".
I thought W_ARM got cleared when switching 'uarm' object to 'uskin',
but it isn't.

src/mkobj.c

index 23502de6e34e1e18deaa069e30e69d17434a8101..a65d51f612c90d19cef5c8a98de59c0bee2d9ed8 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 mkobj.c $NHDT-Date: 1437877180 2015/07/26 02:19:40 $  $NHDT-Branch: master $:$NHDT-Revision: 1.104 $ */
+/* NetHack 3.6 mkobj.c $NHDT-Date: 1444094263 2015/10/06 01:17:43 $  $NHDT-Branch: master $:$NHDT-Revision: 1.105 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -2279,6 +2279,7 @@ struct obj *obj;
     char maskbuf[60];
     const char *what;
     unsigned long owornmask, allmask = 0L;
+    boolean embedded = FALSE;
     int i, n = 0;
 
     /* use owornmask for testing and bit twiddling, but use original
@@ -2290,6 +2291,15 @@ struct obj *obj;
             ++n;
         allmask |= wearbits[i];
     }
+    if (obj == uskin) {
+        /* embedded dragon scales have an extra bit set;
+           make sure it's set, then suppress it */
+        embedded = TRUE;
+        if ((owornmask & (W_ARM | I_SPECIAL)) == (W_ARM | I_SPECIAL))
+            owornmask &= ~I_SPECIAL;
+        else
+            n = 0,  owornmask = ~0; /* force insane_object("bogus") below */
+    }
     if (n == 2 && carried(obj)
         && obj == uball && (owornmask & W_BALL) != 0L
         && (owornmask & W_WEAPON) != 0L) {
@@ -2317,8 +2327,8 @@ struct obj *obj;
            with owornmask of W_foo is the object pointed to by ufoo */
         switch (owornmask) {
         case W_ARM:
-            if (obj != uarm)
-                what = "suit";
+            if (obj != (embedded ? uskin : uarm))
+                what = embedded ? "skin" : "suit";
             break;
         case W_ARMC:
             if (obj != uarmc)
@@ -2397,6 +2407,10 @@ struct obj *obj;
         if (owornmask & W_ARMOR) {
             if (obj->oclass != ARMOR_CLASS)
                 what = "armor";
+            /* 3.6: dragon scale mail reverts to dragon scales when
+               becoming embedded in poly'd hero's skin */
+            if (embedded && !Is_dragon_scales(obj))
+                what = "skin";
         } else if (owornmask & W_WEAPON) {
             /* monsters don't maintain alternate weapon or quiver */
             if (mcarried(obj) && (owornmask & (W_SWAPWEP | W_QUIVER)) != 0L)