fix #H1554, #H1736, github issue #240 - silver )
Fixes #240 Monster versus monster (melee and throwing) didn't handle shades (need silver or blessed weapon to take damage) or silver feedback (extra info when silver-haters are hit). I did a lot of test, revise, re-test but didn't always re-test everything that had previously been tested, so bugs that I thought were quashed might have crept in. Now if a missile weapon "passes harmlessly through the shade" it will continue on and maybe hit something else. (Regular misses still stop at the missed target.) A couple of minor ball&chain changes accidentally got included.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 mthrowu.c $NHDT-Date: 1564767726 2019/08/02 17:42:06 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.85 $ */
|
||||
/* NetHack 3.6 mthrowu.c $NHDT-Date: 1573688695 2019/11/13 23:44:55 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.86 $ */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/*-Copyright (c) Pasi Kallinen, 2016. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
@@ -354,6 +354,10 @@ boolean verbose; /* give message(s) even when you can't see what happened */
|
||||
damage = dmgval(otmp, mtmp);
|
||||
if (otmp->otyp == ACID_VENOM && resists_acid(mtmp))
|
||||
damage = 0;
|
||||
#if 0 /* can't use this because we don't have the attacker */
|
||||
if (is_orc(mtmp->data) && is_elf(?magr?))
|
||||
damage++;
|
||||
#endif
|
||||
if (ismimic)
|
||||
seemimic(mtmp);
|
||||
mtmp->msleeping = 0;
|
||||
@@ -384,10 +388,19 @@ boolean verbose; /* give message(s) even when you can't see what happened */
|
||||
}
|
||||
if (objects[otmp->otyp].oc_material == SILVER
|
||||
&& mon_hates_silver(mtmp)) {
|
||||
if (vis)
|
||||
pline_The("silver sears %s flesh!", s_suffix(mon_nam(mtmp)));
|
||||
else if (verbose && !target)
|
||||
pline("Its flesh is seared!");
|
||||
boolean flesh = (!noncorporeal(mtmp->data)
|
||||
&& !amorphous(mtmp->data));
|
||||
|
||||
/* note: extra silver damage is handled by dmgval() */
|
||||
if (vis) {
|
||||
char *m_name = mon_nam(mtmp);
|
||||
|
||||
if (flesh) /* s_suffix returns a modifiable buffer */
|
||||
m_name = strcat(s_suffix(m_name), " flesh");
|
||||
pline_The("silver sears %s!", m_name);
|
||||
} else if (verbose && !target) {
|
||||
pline("%s is seared!", flesh ? "Its flesh" : "It");
|
||||
}
|
||||
}
|
||||
if (otmp->otyp == ACID_VENOM && cansee(mtmp->mx, mtmp->my)) {
|
||||
if (resists_acid(mtmp)) {
|
||||
@@ -539,7 +552,12 @@ struct obj *obj; /* missile (or stack providing it) */
|
||||
while (range-- > 0) { /* Actually the loop is always exited by break */
|
||||
bhitpos.x += dx;
|
||||
bhitpos.y += dy;
|
||||
if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != 0) {
|
||||
mtmp = m_at(bhitpos.x, bhitpos.y);
|
||||
if (mtmp && shade_miss(mon, mtmp, singleobj, TRUE, TRUE)) {
|
||||
/* if mtmp is a shade and missile passes harmlessly through it,
|
||||
give message and skip it in order to keep going */
|
||||
mtmp = (struct monst *) 0;
|
||||
} else if (mtmp) {
|
||||
if (ohitmon(mtmp, singleobj, range, TRUE))
|
||||
break;
|
||||
} else if (bhitpos.x == u.ux && bhitpos.y == u.uy) {
|
||||
@@ -754,7 +772,7 @@ struct attack *mattk;
|
||||
break;
|
||||
default:
|
||||
impossible("bad attack type in spitmu");
|
||||
/* fall through */
|
||||
/*FALLTHRU*/
|
||||
case AD_ACID:
|
||||
otmp = mksobj(ACID_VENOM, TRUE, FALSE);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user