From c7ccd4ca5dfaa47f4eb9cd07667f68bc5b3dbc18 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 11 Apr 2026 17:35:35 -0700 Subject: [PATCH] add pet->droptime check to monster sanity check I don't see where loading or saving bones makes any attempt to fix up pet->droptime at all. --- src/mon.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/mon.c b/src/mon.c index c0d92e6c3..a245757be 100644 --- a/src/mon.c +++ b/src/mon.c @@ -6,6 +6,7 @@ #include "hack.h" #include "mfndpos.h" +staticfn void pet_sanity_check(struct monst *, const char *); staticfn void sanity_check_single_mon(struct monst *, boolean, const char *); staticfn struct obj *make_corpse(struct monst *, unsigned); staticfn int minliquid_core(struct monst *); @@ -45,14 +46,28 @@ extern const struct shclass shtypes[]; /* defined in shknam.c */ || !svl.level.flags.deathdrops \ || (svl.level.flags.graveyard && is_undead(mdat) && rn2(3))) - -#if 0 +#if 0 /* potentially of historical interest */ /* part of the original warning code which was replaced in 3.3.1 */ const char *warnings[] = { "white", "pink", "red", "ruby", "purple", "black" }; #endif /* 0 */ +staticfn void +pet_sanity_check( + struct monst *mtmp, + const char *msgarg) +{ + if (has_edog(mtmp)) { + struct edog *edog = EDOG(mtmp); + + if (edog->droptime > svm.moves) + impossible("insane pet #%u has droptime (%ld)" + " in the future (%ld) (%s)", + mtmp->m_id, edog->droptime, svm.moves, msgarg); + /* TODO: verify some of the other edog fields */ + } +} staticfn void sanity_check_single_mon( @@ -116,8 +131,12 @@ sanity_check_single_mon( if (mtmp->isminion && !has_emin(mtmp)) impossible("minion without emin (%s)", msg); /* guardian angel on astral level is tame but has emin rather than edog */ - if (mtmp->mtame && !has_edog(mtmp) && !mtmp->isminion) - impossible("pet without edog (%s)", msg); + if (mtmp->mtame) { + if (!has_edog(mtmp) && !mtmp->isminion) + impossible("pet without edog (%s)", msg); + else + pet_sanity_check(mtmp, msg); + } /* steed should be tame and saddled */ if (mtmp == u.usteed) { const char *ns, *nt = !mtmp->mtame ? "not tame" : 0; @@ -133,7 +152,7 @@ sanity_check_single_mon( if (mtmp->mtrapped) { if (mtmp->wormno) { - /* TODO: how to check worm in trap? */ + ; /* TODO: how to check worm in trap? */ } else if (!t_at(mx, my)) impossible("trapped without a trap (%s)", msg); } @@ -6056,4 +6075,12 @@ flash_mon(struct monst *mtmp) gv.viz_array[my][mx] = saveviz; newsym(mx, my); } + +/* cleanup for 'onefile' processing */ +#undef LEVEL_SPECIFIC_NOCORPSE +#undef KEEPTRAITS +#undef mstoning +#undef livelog_mon_nam +#undef BREEDER_EGG + /*mon.c*/