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:
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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
|
||||
|
||||
14
src/zap.c
14
src/zap.c
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user