From 5a9b766e74c702eb398008d32ced85d55ba55321 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Fri, 1 Dec 2006 07:38:18 +0000 Subject: [PATCH] lava, slime, bones From a bug report: entering lava cures sliming, but if you got [re-]afflicted by green slime after becoming stuck in lava, #sit failed to cure it. Fix that, and have sinking farther into lava cure it too (although not necessarily right away). Also, suppress leaving the corpse in a bones file for death caused by being dissolved in lava. Lastly, suppress the "you rise from the dead as a " message during bones creation when the game ends due to being turned into green slime since you transformed rather than died (and sliming timeout gives "you have become green slime" just prior to that). --- doc/fixes34.4 | 3 +++ src/bones.c | 7 +++++-- src/end.c | 7 +++---- src/sit.c | 1 + src/trap.c | 12 +++++++++++- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/doc/fixes34.4 b/doc/fixes34.4 index 7274e4aad..caf907b69 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -280,6 +280,9 @@ wielding a potion of blindness or carrying one in alternate weapon or quiver zapping closing or breaking magic up or down from beneath an open drawbridge's portcullis failed if bridge orientation was north-to-south (Valk quest) sinking into lava didn't track passage of time properly +sinking into lava eventually burns away slime; sitting in it always does +suppress corpse from bones data if death is due to being dissolved in lava +suppress "you rise from the dead" if game ends due to be turned into slime Platform- and/or Interface-Specific Fixes diff --git a/src/bones.c b/src/bones.c index 69ebf1da9..7573a7aab 100644 --- a/src/bones.c +++ b/src/bones.c @@ -326,8 +326,11 @@ struct obj *corpse; } mtmp = christen_monst(mtmp, plname); newsym(u.ux, u.uy); - Your("body rises from the dead as %s...", - an(mons[u.ugrave_arise].mname)); + /* turning into slime isn't rising from the dead + and has already given its own message */ + if (u.ugrave_arise != PM_GREEN_SLIME) + Your("body rises from the dead as %s...", + an(mons[u.ugrave_arise].mname)); display_nhwindow(WIN_MESSAGE, FALSE); drop_upon_death(mtmp, (struct obj *)0); m_dowear(mtmp, TRUE); diff --git a/src/end.c b/src/end.c index 842f80880..1c44e25ae 100644 --- a/src/end.c +++ b/src/end.c @@ -668,17 +668,16 @@ die: bones_ok = (how < GENOCIDED) && can_make_bones(); - if (how == TURNED_SLIME) - u.ugrave_arise = PM_GREEN_SLIME; - if (bones_ok && launch_in_progress()) force_launch_placement(); if (bones_ok && u.ugrave_arise < LOW_PM) { /* corpse gets burnt up too */ - if (how == BURNING) + if (how == BURNING || how == DISSOLVED) u.ugrave_arise = (NON_PM - 2); /* leave no corpse */ else if (how == STONING) u.ugrave_arise = (NON_PM - 1); /* statue instead of corpse */ + else if (how == TURNED_SLIME) + u.ugrave_arise = PM_GREEN_SLIME; else if (u.ugrave_arise == NON_PM && !(mvitals[u.umonnum].mvflags & G_NOCORPSE)) { int mnum = u.umonnum; diff --git a/src/sit.c b/src/sit.c index 572b0c4dd..26f8a2cab 100644 --- a/src/sit.c +++ b/src/sit.c @@ -95,6 +95,7 @@ dosit() } else if (u.utraptype == TT_LAVA) { /* Must have fire resistance or they'd be dead already */ You("sit in the lava!"); + if (Slimed) burn_away_slime(); u.utrap += rnd(4); losehp(d(2,10), "sitting in lava", KILLED_BY); /* lava damage */ } else if (u.utraptype == TT_INFLOOR || diff --git a/src/trap.c b/src/trap.c index 2956da31b..ef727e061 100644 --- a/src/trap.c +++ b/src/trap.c @@ -4660,6 +4660,8 @@ burn_stuff: void sink_into_lava() { + static const char sink_deeper[] = "You sink deeper into the lava."; + if (!u.utrap || u.utraptype != TT_LAVA) { ; /* do nothing; this shouldn't happen */ } else if (!is_lava(u.ux, u.uy)) { @@ -4670,9 +4672,17 @@ sink_into_lava() killer.format = KILLED_BY; Strcpy(killer.name, "molten lava"); You("sink below the surface and die."); + burn_away_slime(); /* add insult to injury? */ done(DISSOLVED); } else if (!u.umoved) { - Norep("You sink deeper into the lava."); + /* can't fully turn into slime while in lava, but might not + have it be burned away until you've come awfully close */ + if (Slimed && rnd(10 - 1) >= (int)(Slimed & TIMEOUT)) { + pline(sink_deeper); + burn_away_slime(); + } else { + Norep(sink_deeper); + } u.utrap += rnd(4); } }