using #monster to breath at self (trunk only)

When testing the monster-breath-at-self patch I noticed that trying
to cure green slime by having hero breathe at self didn't work.  The code
was calling buzz() with arguments that produced an attack directed against
the hero's location, but there was a chance for it to miss outright and
when it didn't, reflection would block it.  This makes breathing at
yourself with `#monster' comparable to zapping a wand or casting a spell
at yourself:  it always hits.
This commit is contained in:
nethack.rankin
2007-05-05 04:32:19 +00:00
parent 696eaefbb5
commit 6d33acd2af
4 changed files with 21 additions and 6 deletions

View File

@@ -226,6 +226,7 @@ touching a pile of objects while blind affects hero even when the pile is
explosion while engulfed only affects engulfer and hero, not adjacent monsters
eliminate case-sensitivity when converting words from singular to plural and
vice versa, so some failing wishes like "Gauntlets of Power" now work
breath attack directed at self by poly'd hero always hits
Platform- and/or Interface-Specific Fixes

View File

@@ -2624,6 +2624,7 @@ E int FDECL(zappable, (struct obj *));
E void FDECL(zapnodir, (struct obj *));
E int NDECL(dozap);
E int FDECL(zapyourself, (struct obj *,BOOLEAN_P));
E void FDECL(ubreatheu, (struct attack *));
E boolean FDECL(cancel_monst, (struct monst *,struct obj *,
BOOLEAN_P,BOOLEAN_P,BOOLEAN_P));
E void FDECL(weffects, (struct obj *));

View File

@@ -848,6 +848,8 @@ dobreathe()
mattk = attacktype_fordmg(youmonst.data, AT_BREA, AD_ANY);
if (!mattk)
impossible("bad breath attack?"); /* mouthwash needed... */
else if (!u.dx && !u.dy && !u.dz)
ubreatheu(mattk);
else
buzz((int) (20 + mattk->adtyp-1), (int)mattk->damn,
u.ux, u.uy, u.dx, u.dy);

View File

@@ -2343,6 +2343,17 @@ boolean ordinary;
return(damage);
}
/* called when poly'd hero uses breath attack against self */
void
ubreatheu(mattk)
struct attack *mattk;
{
int dtyp = 20 + mattk->adtyp - 1; /* breath by hero */
const char *fltxt = flash_types[dtyp]; /* blast of <something> */
zhitu(dtyp, mattk->damn, fltxt, u.ux, u.uy);
}
boolean
flashburn(duration)
long duration;
@@ -3379,9 +3390,9 @@ int type, nd;
const char *fltxt;
xchar sx, sy;
{
int dam = 0;
int dam = 0, abstyp = abs(type);
switch (abs(type) % 10) {
switch (abstyp % 10) {
case ZT_MAGIC_MISSILE:
if (Antimagic) {
shieldeff(sx, sy);
@@ -3425,7 +3436,7 @@ xchar sx, sy;
}
break;
case ZT_DEATH:
if (abs(type) == ZT_BREATH(ZT_DEATH)) {
if (abstyp == ZT_BREATH(ZT_DEATH)) {
if (Disint_resistance) {
You("are not disintegrated.");
break;
@@ -3477,6 +3488,7 @@ xchar sx, sy;
break;
case ZT_ACID:
if (Acid_resistance) {
pline_The("acid doesn't hurt.");
dam = 0;
} else {
pline_The("acid burns!");
@@ -3492,9 +3504,8 @@ xchar sx, sy;
break;
}
if (Half_spell_damage && dam &&
type < 0 && (type > -20 || type < -29)) /* !Breath */
dam = (dam + 1) / 2;
if (dam && Half_spell_damage && abstyp >= 20 && abstyp <= 29)
dam = (dam + 1) / 2; /* half-damage for breath attack */
losehp(dam, fltxt, KILLED_BY_AN);
return;
}