]> granicus.if.org Git - nethack/commitdiff
fix #H172 - inconsistent damage calculation for negative AC
authornethack.rankin <nethack.rankin>
Tue, 27 Mar 2007 04:30:01 +0000 (04:30 +0000)
committernethack.rankin <nethack.rankin>
Tue, 27 Mar 2007 04:30:01 +0000 (04:30 +0000)
     Reported last August by <email deleted>:  the code
that decided whether hero poly'd into a pudding would be split when being
hit by an iron weapon always reduced damage by u.uac if armor class is
negative, whereas the normal amount is -rnd(-u.uac).  So player pudding
with good armor always got maximum reduction.  Probably had little actual
effect on game play; puddings can't wear armor so would need to be using
rings and/or spell of protection and/or have eaten rings of protection
while in some previous metallivoric form in order to get good enough AC
for this to matter.

doc/fixes35.0
src/mhitu.c

index 5b34b62eb2285467997c82d2ceda8efb3548ab65..f3ee3c98ae3738c642ea0e7e86efbbcf4c46a123 100644 (file)
@@ -204,6 +204,8 @@ wielded bow shouldn't affect outcome of kicked arrows
 ranged polearm hit can divide puddings and can use confuse monster effect
 charge for kicked shop-owned food if it gets used up taming a monster
 give better feedback when thrown shop-owned food gets used up taming a monster
+effect of negative AC on damage received was calculated differently than
+       normal when deciding whether hero poly'd into pudding would split
 
 
 Platform- and/or Interface-Specific Fixes
index 420f9dff42e2c7fb7a776ffd7bb0cffe2210535a..b181dbe6b478927dec0bbf5412100459a7ce4505 100644 (file)
@@ -930,6 +930,8 @@ hitmu(mtmp, mattk)
                    }
                } else {                          /* hand to hand weapon */
                    if(mattk->aatyp == AT_WEAP && otmp) {
+                       int tmp;
+
                        if (otmp->otyp == CORPSE
                                && touch_petrifies(&mons[otmp->corpsenm])) {
                            dmg = 1;
@@ -949,21 +951,23 @@ hitmu(mtmp, mattk)
                            pline_The("silver sears your flesh!");
                            exercise(A_CON, FALSE);
                        }
-                       if (u.mh > 1 && u.mh > ((u.uac>0) ? dmg : dmg+u.uac) &&
-                                  objects[otmp->otyp].oc_material == IRON &&
-                                       (u.umonnum==PM_BLACK_PUDDING
-                                       || u.umonnum==PM_BROWN_PUDDING)) {
-                           /* This redundancy necessary because you have to
-                            * take the damage _before_ being cloned.
-                            */
-                           if (u.uac < 0) dmg += u.uac;
-                           if (dmg < 1) dmg = 1;
-                           if (dmg > 1) exercise(A_STR, FALSE);
-                           u.mh -= dmg;
+                       /* this redundancy necessary because you have
+                          to take the damage _before_ being cloned;
+                          need to have at least 2 hp left to split */
+                       tmp = dmg;
+                       if (u.uac < 0) tmp -= rnd(-u.uac);
+                       if (tmp < 1) tmp = 1;
+                       if (u.mh - tmp > 1 &&
+                               objects[otmp->otyp].oc_material == IRON &&
+                               (u.umonnum == PM_BLACK_PUDDING ||
+                                u.umonnum == PM_BROWN_PUDDING)) {
+                           if (tmp > 1) exercise(A_STR, FALSE);
+                           /* inflict damage now; we know it can't be fatal */
+                           u.mh -= tmp;
                            context.botl = 1;
-                           dmg = 0;
-                           if(cloneu())
-                           You("divide as %s hits you!",mon_nam(mtmp));
+                           dmg = 0;    /* don't inflict more damage below */
+                           if (cloneu())
+                               You("divide as %s hits you!", mon_nam(mtmp));
                        }
                        urustm(mtmp, otmp);
                    } else if (mattk->aatyp != AT_TUCH || dmg != 0 ||