liquid_flow when digging pit

Part of github issue #338 that isn't about shops:  objects at the
spot where a dug pit fills with lava (or water) weren't being
effected by that.

While fixing it, I noticed that hero's steed wasn't affected either.
Also, when conjoined pits are filled in, monsters other than the
steed are at risk but weren't being handled.  Presumably they fell
in on their next move.
This commit is contained in:
PatR
2020-05-01 00:42:18 -07:00
parent 49df1e184e
commit 5457cbe0e3
2 changed files with 22 additions and 4 deletions

View File

@@ -168,6 +168,9 @@ failed untrap while mounted that moved hero onto the trap would leave steed
with stale coordinates, triggering warnings if 'sanity_check' is On
when hold_another_object() fails while hero is swallowed, drop the item into
swallower's inventory instead of onto the floor
when digging a pit results in it being filled by adjacent pool or lava, any
objects at the spot weren't subjected to water or fire damage;
also, riding hero's steed wasn't subjected to immersion either
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository

View File

@@ -739,6 +739,8 @@ schar typ;
struct trap *ttmp;
const char *fillmsg;
{
struct obj *objchain;
struct monst *mon;
boolean u_spot = (x == u.ux && y == u.uy);
if (ttmp)
@@ -748,11 +750,18 @@ const char *fillmsg;
if (fillmsg)
pline(fillmsg, hliquid(typ == LAVAPOOL ? "lava" : "water"));
if (u_spot && !(Levitation || Flying)) {
/* handle object damage before hero damage; affects potential bones */
if ((objchain = g.level.objects[x][y]) != 0) {
if (typ == LAVAPOOL)
(void) lava_effects();
else if (!Wwalking)
(void) drown();
fire_damage_chain(objchain, TRUE, TRUE, x, y);
else
water_damage_chain(objchain, TRUE);
}
/* damage to the hero */
if (u_spot) {
(void) pooleffects(FALSE);
} else if ((mon = m_at(x, y)) != 0) {
(void) minliquid(mon);
}
}
@@ -1685,6 +1694,12 @@ pit_flow(trap, filltyp)
struct trap *trap;
schar filltyp;
{
/*
* FIXME?
* liquid_flow() -> pooleffects() -> {drown(),lava_effects()}
* might kill the hero; the game will end and if that leaves bones,
* remaining conjoined pits will be left unprocessed.
*/
if (trap && filltyp != ROOM && is_pit(trap->ttyp)) {
struct trap t;
int idx;