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); }