#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.
This commit is contained in:
nethack.allison
2006-05-09 01:31:55 +00:00
parent 1a01343c63
commit c0731a8809
2 changed files with 16 additions and 0 deletions
+2
View File
@@ -215,6 +215,8 @@ properly handle destruction of equipment carried by monsters hit by
disintegration breath; life-saving retained conferred properties of disintegration breath; life-saving retained conferred properties of
formerly worn items (loss of steed's saddle caused much confusion) formerly worn items (loss of steed's saddle caused much confusion)
don't exercize or abuse wisdom when rumors get used for random graffiti 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 Platform- and/or Interface-Specific Fixes
+14
View File
@@ -981,8 +981,22 @@ struct mkroom *croom;
/* corpsenm is "empty" if -1, random if -2, otherwise specific */ /* corpsenm is "empty" if -1, random if -2, otherwise specific */
if (o->corpsenm != NON_PM) { 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(); if (o->corpsenm == NON_PM - 1) otmp->corpsenm = rndmonnum();
else otmp->corpsenm = o->corpsenm; else otmp->corpsenm = o->corpsenm;
if (otmp->otyp == CORPSE) start_corpse_timeout(otmp);
otmp->owt = weight(otmp); otmp->owt = weight(otmp);
} }