drawbridge fix - double death

Make sure a dead monster that hasn't been purged from the fmon list
yet can't be hit by opening/closing/destroyed drawbridge.  I don't
think that could happen because the monster gets removed from the
map, but add some bullet-proofing.

Also, give drawbridge smash/crash sound effects even when player
can see whatever is happening instead of just when only hearing the
activity.
This commit is contained in:
PatR
2023-02-28 10:33:44 -08:00
parent 6ba11256ba
commit ffdaa5556e

View File

@@ -322,24 +322,25 @@ u_to_e(struct entity *etmp)
static void static void
set_entity(coordxy x, coordxy y, struct entity *etmp) set_entity(coordxy x, coordxy y, struct entity *etmp)
{ {
struct monst *mtmp;
if (u_at(x, y)) if (u_at(x, y))
u_to_e(etmp); u_to_e(etmp);
else if (MON_AT(x, y)) else if ((mtmp = m_at(x, y)) != 0 && !DEADMONSTER(mtmp))
m_to_e(m_at(x, y), x, y, etmp); m_to_e(mtmp, x, y, etmp);
else else
etmp->edata = (struct permonst *) 0; etmp->edata = (struct permonst *) 0;
} }
#define is_u(etmp) (etmp->emon == &gy.youmonst) #define is_u(etmp) (etmp->emon == &gy.youmonst)
#define e_canseemon(etmp) \ #define e_canseemon(etmp) (is_u(etmp) || canseemon(etmp->emon))
(is_u(etmp) ? (boolean) TRUE : canseemon(etmp->emon))
/* /*
* e_strg is a utility routine which is not actually in use anywhere, since * e_strg is a utility routine which is not actually in use anywhere, since
* the specialized routines below suffice for all current purposes. * the specialized routines below suffice for all current purposes.
*/ */
/* #define e_strg(etmp, func) (is_u(etmp)? (char *)0 : func(etmp->emon)) */ /* #define e_strg(etmp, func) (is_u(etmp) ? (char *) 0 : func(etmp->emon)) */
static const char * static const char *
e_nam(struct entity *etmp) e_nam(struct entity *etmp)
@@ -872,22 +873,20 @@ destroy_drawbridge(coordxy x, coordxy y)
struct obj *otmp2; struct obj *otmp2;
boolean lava = (lev1->drawbridgemask & DB_UNDER) == DB_LAVA; boolean lava = (lev1->drawbridgemask & DB_UNDER) == DB_LAVA;
if (!Deaf)
Soundeffect(se_loud_splash, 100);
if (lev1->typ == DRAWBRIDGE_UP) { if (lev1->typ == DRAWBRIDGE_UP) {
if (cansee(x2, y2)) { if (cansee(x2, y2) || u_at(x2, y2))
pline_The("portcullis of the drawbridge falls into the %s!", pline_The("portcullis of the drawbridge falls into the %s!",
lava ? hliquid("lava") : "moat"); lava ? hliquid("lava") : "moat");
} else if (!Deaf) { else
Soundeffect(se_loud_splash, 100); You_hear("a loud *SPLASH*!"); /* Deaf-aware */
You_hear("a loud *SPLASH*!");
}
} else { } else {
if (cansee(x, y)) { if (cansee(x, y) || u_at(x, y))
pline_The("drawbridge collapses into the %s!", pline_The("drawbridge collapses into the %s!",
lava ? hliquid("lava") : "moat"); lava ? hliquid("lava") : "moat");
} else if (!Deaf) { else
Soundeffect(se_loud_splash, 100); You_hear("a loud *SPLASH*!"); /* Deaf-aware */
You_hear("a loud *SPLASH*!");
}
} }
lev1->typ = lava ? LAVAPOOL : MOAT; lev1->typ = lava ? LAVAPOOL : MOAT;
lev1->drawbridgemask = 0; lev1->drawbridgemask = 0;
@@ -896,12 +895,13 @@ destroy_drawbridge(coordxy x, coordxy y)
(void) flooreffects(otmp2, x, y, "fall"); (void) flooreffects(otmp2, x, y, "fall");
} }
} else { } else {
if (cansee(x, y)) { /* no moat beneath */
pline_The("drawbridge disintegrates!"); if (!Deaf)
} else {
Soundeffect(se_lound_crash, 100); Soundeffect(se_lound_crash, 100);
You_hear("a loud *CRASH*!"); if (cansee(x, y) || u_at(x, y))
} pline_The("drawbridge disintegrates!");
else
You_hear("a loud *CRASH*!"); /* Deaf-aware */
lev1->typ = ((lev1->drawbridgemask & DB_ICE) ? ICE : ROOM); lev1->typ = ((lev1->drawbridgemask & DB_ICE) ? ICE : ROOM);
lev1->icedpool = ((lev1->drawbridgemask & DB_ICE) ? ICED_MOAT : 0); lev1->icedpool = ((lev1->drawbridgemask & DB_ICE) ? ICED_MOAT : 0);
} }
@@ -928,6 +928,7 @@ destroy_drawbridge(coordxy x, coordxy y)
newsym(x2, y2); newsym(x2, y2);
if (!does_block(x2, y2, lev2)) if (!does_block(x2, y2, lev2))
unblock_point(x2, y2); /* vision */ unblock_point(x2, y2); /* vision */
vision_recalc(0);
if (Is_stronghold(&u.uz)) if (Is_stronghold(&u.uz))
u.uevent.uopened_dbridge = TRUE; u.uevent.uopened_dbridge = TRUE;