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
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));
}
/* 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++) {
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;
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:
break;
default: break;
}
+ }
if (olet == MON_EXPLODE) {
str = killer.name;
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
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;
* 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;
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",