From c0731a880916d23a9711a41ca94cfafe4c32c415 Mon Sep 17 00:00:00 2001 From: "nethack.allison" Date: Tue, 9 May 2006 01:31:55 +0000 Subject: [PATCH] #H85: create_object() bugs From a bug report.c was first creating a corpse complete with revive timer if it was a troll, or without a timer if it was a lizard or lichen corpse. Then it might change the corpse type, leaving strange corpse types that revived, or that lasted forever. --- doc/fixes34.4 | 2 ++ src/sp_lev.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/doc/fixes34.4 b/doc/fixes34.4 index e6433291e..e2c7f5d72 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -215,6 +215,8 @@ properly handle destruction of equipment carried by monsters hit by disintegration breath; life-saving retained conferred properties of formerly worn items (loss of steed's saddle caused much confusion) don't exercize or abuse wisdom when rumors get used for random graffiti +create_object() created lizard corpses without timers and troll corpses with + their revive timers, then changed the corpsenm field Platform- and/or Interface-Specific Fixes diff --git a/src/sp_lev.c b/src/sp_lev.c index b9add6cac..149c7118c 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -981,8 +981,22 @@ struct mkroom *croom; /* corpsenm is "empty" if -1, random if -2, otherwise specific */ if (o->corpsenm != NON_PM) { + + /* Corpse was already created above, so the timers are + * appropriate for otmp->corpsenm at the time of creation. + * Since the next section is about to alter the type of + * corpse directly, the timers must be removed, then re-added + * afterwards. + * + * Failure to do so leads to inappropriate corpse types + * behaving like a lizard or lichen corpse (no timer), or + * behaving like a troll (revive timer). + */ + + if (otmp->otyp == CORPSE && otmp->timed) obj_stop_timers(otmp); if (o->corpsenm == NON_PM - 1) otmp->corpsenm = rndmonnum(); else otmp->corpsenm = o->corpsenm; + if (otmp->otyp == CORPSE) start_corpse_timeout(otmp); otmp->owt = weight(otmp); } -- 2.40.0