]> granicus.if.org Git - nethack/commitdiff
U1039 passive() stoning check tweak
authornethack.allison <nethack.allison>
Sun, 9 May 2004 16:53:16 +0000 (16:53 +0000)
committernethack.allison <nethack.allison>
Sun, 9 May 2004 16:53:16 +0000 (16:53 +0000)
>If you hit a cockatrice with a weapon that immediately breaks
>(like a potion, mirror, or cockatrice egg) you get stoned,

Add a parameter to passive() to make it possible to pass
additional information that indicates that the weapon was
there at the start of the turn, but destroyed during the turn.

include/extern.h
src/dokick.c
src/uhitm.c

index 8b77c0becd9d09b4b8cbbd4dbf54552c2656f93a..0f4746482d53aaa678c7eb2f82008f8e8720fbbd 100644 (file)
@@ -2108,7 +2108,7 @@ E boolean FDECL(attack, (struct monst *));
 E boolean FDECL(hmon, (struct monst *,struct obj *,int));
 E int FDECL(damageum, (struct monst *,struct attack *));
 E void FDECL(missum, (struct monst *,struct attack *,BOOLEAN_P));
-E int FDECL(passive, (struct monst *,BOOLEAN_P,int,UCHAR_P));
+E int FDECL(passive, (struct monst *,BOOLEAN_P,int,UCHAR_P,BOOLEAN_P));
 E void FDECL(passive_obj, (struct monst *,struct obj *,struct attack *));
 E void FDECL(stumble_onto_mimic, (struct monst *));
 E int FDECL(flash_hits_mon, (struct monst *,struct obj *));
index 4b6459a7d263b4daf7152ab7b1ab48378ac3e7bd..15265e13bd5f124802a84e4f820ee16e59e579ea 100644 (file)
@@ -106,7 +106,7 @@ register boolean clumsy;
                }
        }
 
-       (void) passive(mon, TRUE, mon->mhp > 0, AT_KICK);
+       (void) passive(mon, TRUE, mon->mhp > 0, AT_KICK, FALSE);
        if (mon->mhp <= 0 && !trapkilled) killed(mon);
 
        /* may bring up a dialog, so put this after all messages */
@@ -157,12 +157,12 @@ register xchar x, y;
                } else if (tmp > (kickdieroll = rnd(20))) {
                    You("kick %s.", mon_nam(mon));
                    sum = damageum(mon, uattk);
-                   (void)passive(mon, (boolean)(sum > 0), (sum != 2), AT_KICK);
+                   (void)passive(mon, (boolean)(sum > 0), (sum != 2), AT_KICK, FALSE);
                    if (sum == 2)
                        break;          /* Defender died */
                } else {
                    missum(mon, uattk, (tmp + armorpenalty > kickdieroll));
-                   (void)passive(mon, 0, 1, AT_KICK);
+                   (void)passive(mon, 0, 1, AT_KICK,FALSE);
                }
            }
            return;
@@ -172,7 +172,7 @@ register xchar x, y;
           !is_flyer(mon->data)) {
                pline("Floating in the air, you miss wildly!");
                exercise(A_DEX, FALSE);
-               (void) passive(mon, FALSE, 1, AT_KICK);
+               (void) passive(mon, FALSE, 1, AT_KICK, FALSE);
                return;
        }
 
@@ -183,7 +183,7 @@ register xchar x, y;
                if(!rn2((i < j/10) ? 2 : (i < j/5) ? 3 : 4)) {
                        if(martial() && !rn2(2)) goto doit;
                        Your("clumsy kick does no damage.");
-                       (void) passive(mon, FALSE, 1, AT_KICK);
+                       (void) passive(mon, FALSE, 1, AT_KICK, FALSE);
                        return;
                }
                if(i < j/10) clumsy = TRUE;
@@ -204,7 +204,7 @@ doit:
                if(!nohands(mon->data) && !rn2(martial() ? 5 : 3)) {
                    pline("%s blocks your %skick.", Monnam(mon),
                                clumsy ? "clumsy " : "");
-                   (void) passive(mon, FALSE, 1, AT_KICK);
+                   (void) passive(mon, FALSE, 1, AT_KICK, FALSE);
                    return;
                } else {
                    mnexto(mon);
@@ -221,7 +221,7 @@ doit:
                                        "slides" : "jumps"),
                                clumsy ? "easily" : "nimbly",
                                clumsy ? "clumsy " : "");
-                       (void) passive(mon, FALSE, 1, AT_KICK);
+                       (void) passive(mon, FALSE, 1, AT_KICK, FALSE);
                        return;
                    }
                }
index ac19a1fd33fa8e52e08158aa9a365bb86de999a4..8db83f292e888c38e2c0e130a15c79cb4418328e 100644 (file)
@@ -482,7 +482,8 @@ hitum(mon, uattk)
 struct monst *mon;
 struct attack *uattk;
 {
-       boolean malive;
+       boolean malive, wep_was_destroyed = FALSE;
+       struct obj *wepbefore = uwep;
        int armorpenalty, attknum = 0,
            x = u.ux + u.dx, y = u.uy + u.dy,
            tmp = find_roll_to_hit(mon, uattk->aatyp, uwep,
@@ -502,8 +503,8 @@ struct attack *uattk;
            malive = known_hitum(mon, uswapwep, &mhit,
                           tmp, armorpenalty, uattk);
        }
-
-       (void) passive(mon, mhit, malive, AT_WEAP);
+       if (wepbefore && !uwep) wep_was_destroyed = TRUE;
+       (void) passive(mon, mhit, malive, AT_WEAP, wep_was_destroyed);
        return(malive);
 }
 
@@ -2153,10 +2154,10 @@ use_weapon:
                rehumanize();
            }
            if (sum[i] == 2)
-               return((boolean)passive(mon, 1, 0, mattk->aatyp));
+               return((boolean)passive(mon, 1, 0, mattk->aatyp, FALSE));
                                                        /* defender dead */
            else {
-               (void) passive(mon, sum[i], 1, mattk->aatyp);
+               (void) passive(mon, sum[i], 1, mattk->aatyp, FALSE);
                nsum |= sum[i];
            }
            if (!Upolyd)
@@ -2170,11 +2171,12 @@ use_weapon:
 /*     Special (passive) attacks on you by monsters done here.         */
 
 int
-passive(mon, mhit, malive, aatyp)
+passive(mon, mhit, malive, aatyp, wep_was_destroyed)
 register struct monst *mon;
 register boolean mhit;
 register int malive;
 uchar aatyp;
+boolean wep_was_destroyed;
 {
        register struct permonst *ptr = mon->data;
        register int i, tmp;
@@ -2224,7 +2226,7 @@ uchar aatyp;
                if (aatyp == AT_MAGC) protector = W_ARMG;
 
                if (protector == 0L ||          /* no protection */
-                       (protector == W_ARMG && !uarmg && !uwep) ||
+                       (protector == W_ARMG && !uarmg && !uwep && !wep_was_destroyed) ||
                        (protector == W_ARMF && !uarmf) ||
                        (protector == W_ARMH && !uarmh) ||
                        (protector == (W_ARMC|W_ARMG) && (!uarmc || !uarmg))) {