]> granicus.if.org Git - nethack/commitdiff
fix github issue #745 - two-weapon paralysis
authorPatR <rankin@nethack.org>
Tue, 26 Apr 2022 09:02:31 +0000 (02:02 -0700)
committerPatR <rankin@nethack.org>
Tue, 26 Apr 2022 09:02:31 +0000 (02:02 -0700)
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

doc/fixes3-7-0.txt
src/uhitm.c

index f5de4645a3cdf433ea0ab050c22165f1293fe216..86bff13b41e4cc0ca283aa83e0e18ba559f58d14 100644 (file)
@@ -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
index 09e2369e9b8e75077b8c0f8f4d080685bc17b59c..4fa32dd0ec9c0627487733afcd739311eeffa1ae 100644 (file)
@@ -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);