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

@@ -126,6 +126,7 @@ avoid giving misleading or redundant feedback when reading scrolls
custom arrival message for special levels could be delivered too soon
prevent scroll of charging that has already disappeared from showing in the
picklist of things to charge
doors break instead of absorbing the blast of a broken wand of striking
Platform- and/or Interface-Specific Fixes

View File

@@ -2509,7 +2509,7 @@ E void FDECL(buzz, (int,int,XCHAR_P,XCHAR_P,int,int));
E void FDECL(melt_ice, (XCHAR_P,XCHAR_P,const char *));
E void FDECL(start_melt_ice_timeout, (XCHAR_P,XCHAR_P));
E void FDECL(melt_ice_away, (genericptr_t, long));
E int FDECL(zap_over_floor, (XCHAR_P,XCHAR_P,int,boolean *));
E int FDECL(zap_over_floor, (XCHAR_P,XCHAR_P,int,boolean *,SHORT_P));
E void FDECL(fracture_rock, (struct obj *));
E boolean FDECL(break_statue, (struct obj *));
E void FDECL(destroy_item, (int,int));

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",