fix #H172 - inconsistent damage calculation for negative AC

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.
This commit is contained in:
nethack.rankin
2007-03-27 04:30:01 +00:00
parent 4409f48369
commit 8748bf5334
2 changed files with 20 additions and 14 deletions

View 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

View 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 ||