From 3ad4bf5b3afd303044e6e4c61462f47f22af843b Mon Sep 17 00:00:00 2001 From: "nethack.allison" Date: Sun, 9 May 2004 16:53:16 +0000 Subject: [PATCH] U1039 passive() stoning check tweak >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 | 2 +- src/dokick.c | 14 +++++++------- src/uhitm.c | 16 +++++++++------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/include/extern.h b/include/extern.h index 8b77c0bec..0f4746482 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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 *)); diff --git a/src/dokick.c b/src/dokick.c index 4b6459a7d..15265e13b 100644 --- a/src/dokick.c +++ b/src/dokick.c @@ -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; } } diff --git a/src/uhitm.c b/src/uhitm.c index ac19a1fd3..8db83f292 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -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))) {