broken wand of striking vs door (trunk only)

<email deleted> wrote:
> * Doors absorb the blast of a broken wand of striking. What's more, the message
> reads "The door absorbs your bolt!" rather than "blast".

passes wand type to explode() as a negative value for the case
where the wand type isn't mapped to an AD_* explosion type.

Then explode() converts it to a positive and passes it to zap_over_floor().
This commit is contained in:
nethack.allison
2006-03-07 03:10:58 +00:00
parent 3e8725ed95
commit 71ed473cf6
5 changed files with 25 additions and 7 deletions

View File

@@ -2821,7 +2821,7 @@ do_break_wand(obj)
}
/* magical explosion and its visual effect occur before specific effects */
explode(obj->ox, obj->oy, 0, rnd(dmg), WAND_CLASS, EXPL_MAGICAL);
explode(obj->ox, obj->oy, -(obj->otyp), rnd(dmg), WAND_CLASS, EXPL_MAGICAL);
/* this makes it hit us last, so that we can see the action first */
for (i = 0; i <= 8; i++) {

View File

@@ -29,7 +29,7 @@ static int explosion[3][3] = {
void
explode(x, y, type, dam, olet, expltype)
int x, y;
int type; /* the same as in zap.c */
int type; /* the same as in zap.c; passes -(wand typ) for some WAND_CLASS */
int dam;
char olet;
int expltype;
@@ -47,8 +47,14 @@ int expltype;
boolean shopdamage = FALSE, generic = FALSE, physical_dmg = FALSE,
do_hallu = FALSE;
char hallu_buf[BUFSZ];
short exploding_wand_typ = 0;
if (olet == WAND_CLASS) /* retributive strike */
if (olet == WAND_CLASS) { /* retributive strike */
/* If 'type' < 0 it indicates (wand type * -1) */
if (type < 0) {
exploding_wand_typ = (short)(type * -1);
type = 0;
}
switch (Role_switch) {
case PM_PRIEST:
case PM_MONK:
@@ -59,6 +65,7 @@ int expltype;
break;
default: break;
}
}
if (olet == MON_EXPLODE) {
str = killer.name;
@@ -241,7 +248,7 @@ int expltype;
idamres = idamnonres = 0;
if (type >= 0)
(void)zap_over_floor((xchar)(i+x-1), (xchar)(j+y-1),
type, &shopdamage);
type, &shopdamage, exploding_wand_typ);
mtmp = m_at(i+x-1, j+y-1);
#ifdef STEED

View File

@@ -3506,7 +3506,7 @@ register int dx,dy;
bhitpos.x = sx, bhitpos.y = sy;
/* Fireballs only damage when they explode */
if (type != ZT_SPELL(ZT_FIRE))
range += zap_over_floor(sx, sy, type, &shopdamage);
range += zap_over_floor(sx, sy, type, &shopdamage, 0);
if (mon) {
if (type == ZT_SPELL(ZT_FIRE)) break;
@@ -3771,10 +3771,11 @@ long timeout; /* unused */
* amount by which range is reduced (the latter is just ignored by fireballs)
*/
int
zap_over_floor(x, y, type, shopdamage)
zap_over_floor(x, y, type, shopdamage, exploding_wand_typ)
xchar x, y;
int type;
boolean *shopdamage;
short exploding_wand_typ;
{
struct monst *mon;
int abstype = abs(type) % 10;
@@ -3917,6 +3918,15 @@ boolean *shopdamage;
break;
default:
def_case:
if (exploding_wand_typ > 0) {
/* Magical explosion from misc exploding wand */
if (exploding_wand_typ == WAN_STRIKING) {
new_doormask = D_BROKEN;
see_txt = "The door crashes open!";
sense_txt = "feel a burst of cool air.";
break;
}
}
if(cansee(x,y)) {
pline_The("door absorbs %s %s!",
(type < 0) ? "the" : "your",