From: PatR Date: Tue, 26 Apr 2022 09:02:31 +0000 (-0700) Subject: fix github issue #745 - two-weapon paralysis X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=36af5a9a63f51722efaa43024db5f0a771a0e40e;p=nethack fix github issue #745 - two-weapon paralysis Issue #745 by k2: when using two-weapon combat, the second attack would still take place even if the first attack caused the hero to become paralyzed (hitting a floating eye or g.cube). Cleaver's up-to-three attacks had the same problem but did stop if the hero underwent life-saving after some fatally damaging counter- attack. Two-weapons didn't. Make them both stop early if either paralysis or life-save occurs. Multiple attacking monster against monster and against poly'd hero already deal with paralysis; life-saving doesn't apply. Fixes #745 --- diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index f5de4645a..86bff13b4 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1,4 +1,4 @@ -HDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.891 $ $NHDT-Date: 1650838834 2022/04/24 22:20:34 $ +HDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.892 $ $NHDT-Date: 1650963745 2022/04/26 09:02:25 $ General Fixes and Modified Features ----------------------------------- @@ -892,6 +892,8 @@ inventory #adjust for !fixinv, after picking 'from' slot the prompt for 'to' slot was supposed to include the next letter beyond those in use as a candidate for destination but an off by 1 error only showed a-x where x is last letter used (despite that, y could still be picked) +with two-weapon combat or Cleaver attacking multiple targets, hero kept going + with next attack after being paralyzed by passive counter-attack Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/src/uhitm.c b/src/uhitm.c index 09e2369e9..4fa32dd0e 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 uhitm.c $NHDT-Date: 1646652773 2022/03/07 11:32:53 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.344 $ */ +/* NetHack 3.7 uhitm.c $NHDT-Date: 1650963745 2022/04/26 09:02:25 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.348 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -656,9 +656,9 @@ hitum_cleave( uattk, dieroll); (void) passive(mtmp, uwep, mhit, !DEADMONSTER(mtmp), AT_WEAP, !uwep); - /* stop attacking if weapon is gone or hero got killed and - life-saved after passive counter-attack */ - if (!uwep || u.umortality > umort) + /* stop attacking if weapon is gone or hero got paralyzed or + killed (and then life-saved) by passive counter-attack */ + if (!uwep || g.multi < 0 || u.umortality > umort) break; } /* set up for next time */ @@ -679,10 +679,11 @@ hitum(struct monst *mon, struct attack *uattk) struct obj *wepbefore = uwep; int armorpenalty, attknum = 0, x = u.ux + u.dx, y = u.uy + u.dy, + oldumort = u.umortality, tmp = find_roll_to_hit(mon, uattk->aatyp, uwep, - &attknum, &armorpenalty); - int dieroll = rnd(20); - int mhit = (tmp > dieroll || u.uswallow); + &attknum, &armorpenalty), + dieroll = rnd(20), + mhit = (tmp > dieroll || u.uswallow); mon_maybe_wakeup_on_hit(mon); @@ -702,9 +703,13 @@ hitum(struct monst *mon, struct attack *uattk) (void) passive(mon, uwep, mhit, malive, AT_WEAP, wep_was_destroyed); /* second attack for two-weapon combat; won't occur if Stormbringer - overrode confirmation (assumes Stormbringer is primary weapon) - or if the monster was killed or knocked to different location */ - if (u.twoweap && !g.override_confirmation && malive && m_at(x, y) == mon) { + overrode confirmation (assumes Stormbringer is primary weapon), + or if hero became paralyzed by passive counter-attack, or if hero + was killed by passive counter-attack and got life-saved, or if + monster was killed or knocked to different location */ + if (u.twoweap && !(g.override_confirmation + || g.multi < 0 || u.umortality > oldumort + || !malive || m_at(x, y) != mon)) { tmp = find_roll_to_hit(mon, uattk->aatyp, uswapwep, &attknum, &armorpenalty); mon_maybe_wakeup_on_hit(mon);