]> granicus.if.org Git - nethack/commitdiff
silver vs poly'd hero (trunk only)
authornethack.rankin <nethack.rankin>
Thu, 6 Apr 2006 05:57:50 +0000 (05:57 +0000)
committernethack.rankin <nethack.rankin>
Thu, 6 Apr 2006 05:57:50 +0000 (05:57 +0000)
     <Someone> reported that thitu() was adding d20 damage for silver object
hitting silver-hating hero even though all the callers were using dmgval()
which also does that, resulting in doubled silver bonus/penalty.  This
fixes that (including for boomerangs thrown by player, which weren't using
dmgval(), to handle a hyptothetical silver boomerang).  While testing it,
I noticed that there was no "the silver sears your flesh" message when a
monster hit you with a wielded silver weapon, so this fixes that too.
(How did we miss that?  And how did <Someone>? :-)

doc/fixes35.0
include/extern.h
src/dothrow.c
src/mhitu.c
src/mthrowu.c
src/zap.c

index 2845eb56a410850c739c66e86adb93bcd5cd8e4e..91f5fbd35f1ea9040b7bdbca212064cacd770a3e 100644 (file)
@@ -134,6 +134,8 @@ eating gold in front of the vault guard will make the guard angry
 calculate engulf time differently for non-digestion attacks than for digestion
 preform autopickup and/or report on objects at the spot when a failed #untrap
        attempt causes the hero to move onto a trap's location
+thrown silver weapon hitting silver-hating poly'd hero got double silver damage
+wielded silver weapon hitting silver-hating poly'd hero lacked silver message
 
 
 Platform- and/or Interface-Specific Fixes
index 59a0b79fbec5991b12574090cef37cd2116026c7..47f8962d70999dce06b37a5316545b98e9e5168d 100644 (file)
@@ -2507,7 +2507,7 @@ E void FDECL(hit, (const char *,struct monst *,const char *));
 E void FDECL(miss, (const char *,struct monst *));
 E struct monst *FDECL(bhit, (int,int,int,int,int (*)(MONST_P,OBJ_P),
                             int (*)(OBJ_P,OBJ_P),struct obj **));
-E struct monst *FDECL(boomhit, (int,int));
+E struct monst *FDECL(boomhit, (struct obj *,int,int));
 E int FDECL(burn_floor_paper, (int,int,BOOLEAN_P,BOOLEAN_P));
 E void FDECL(buzz, (int,int,XCHAR_P,XCHAR_P,int,int));
 E void FDECL(melt_ice, (XCHAR_P,XCHAR_P,const char *));
index be3f7f9e37f3bd2e2fc486009163fd653e6da8d4..0cc70d910b4019b915da91c6231fbcdb3d26ca3c 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)dothrow.c  3.5     2005/12/02      */
+/*     SCCS Id: @(#)dothrow.c  3.5     2006/04/05      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -949,7 +949,7 @@ boolean twoweap; /* used to restore twoweapon mode if wielded weapon returns */
        } else if(obj->otyp == BOOMERANG && !Underwater) {
                if(Is_airlevel(&u.uz) || Levitation)
                    hurtle(-u.dx, -u.dy, 1, TRUE);
-               mon = boomhit(u.dx, u.dy);
+               mon = boomhit(obj, u.dx, u.dy);
                if(mon == &youmonst) {          /* the thing was caught */
                        exercise(A_DEX, TRUE);
                        obj = addinv(obj);
index ddd5c1f1045ca67ac663fcdbd5f603a37425ae19..7e62f4c2797c7066550c24532e50c1c87cdd4ca7 100644 (file)
@@ -940,6 +940,9 @@ hitmu(mtmp, mattk)
                                artifact_hit(mtmp, &youmonst, otmp, &dmg,dieroll)))
                             hitmsg(mtmp, mattk);
                        if (!dmg) break;
+                       if (objects[otmp->otyp].oc_material == SILVER &&
+                               hates_silver(youmonst.data))
+                           pline_The("silver sears your flesh!");
                        if (u.mh > 1 && u.mh > ((u.uac>0) ? dmg : dmg+u.uac) &&
                                   objects[otmp->otyp].oc_material == IRON &&
                                        (u.umonnum==PM_BLACK_PUDDING
index 63b387a77b2afb7c77c8a49b225e5b153c28dc6b..2e3f645cc8081e563c620e1298ced94e463c4cf2 100644 (file)
@@ -65,7 +65,7 @@ const char *name;     /* if null, then format `obj' */
 
                if (obj && objects[obj->otyp].oc_material == SILVER
                                && hates_silver(youmonst.data)) {
-                       dam += rnd(20);
+                       /* extra damage already applied by dmgval() */
                        pline_The("silver sears your flesh!");
                        exercise(A_CON, FALSE);
                }
index 63ff37de216555a953d67663ef4d3552d2c818e3..f8f2a986035d326643e84d0a61791c5db37aea87 100644 (file)
--- a/src/zap.c
+++ b/src/zap.c
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)zap.c      3.5     2006/01/30      */
+/*     SCCS Id: @(#)zap.c      3.5     2006/04/05      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -3010,7 +3010,8 @@ struct obj **pobj;                        /* object tossed/used, set to NULL
 }
 
 struct monst *
-boomhit(dx, dy)
+boomhit(obj, dx, dy)
+struct obj *obj;
 int dx, dy;
 {
        register int i, ct;
@@ -3045,8 +3046,9 @@ int dx, dy;
                if(bhitpos.x == u.ux && bhitpos.y == u.uy) { /* ct == 9 */
                        if(Fumbling || rn2(20) >= ACURR(A_DEX)) {
                                /* we hit ourselves */
-                               (void) thitu(10, rnd(10), (struct obj *)0,
-                                       "boomerang");
+                               (void) thitu(10 + obj->spe,
+                                            dmgval(obj, &youmonst),
+                                            obj, "boomerang");
                                break;
                        } else {        /* we catch it */
                                tmp_at(DISP_END, 0);