From: PatR Date: Tue, 6 Oct 2015 01:18:03 +0000 (-0700) Subject: sanity check for embedded dragon scales X-Git-Tag: NetHack-3.6.0_RC01~184 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=96562252479e5cadd5d0f1d4ecd45554a7afd759;p=nethack sanity check for embedded dragon scales 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. --- diff --git a/src/mkobj.c b/src/mkobj.c index 23502de6e..a65d51f61 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -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)