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

@@ -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;
}