From: PatR Date: Thu, 1 Apr 2021 19:12:05 +0000 (-0700) Subject: fix pull request #479 - statues of stoning-immunes X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c22520b1a73ed6d0830a4e6d2c5a088a9166bf0;p=nethack fix pull request #479 - statues of stoning-immunes Statues on Medusa's level are supposed to be from petrified creatures rather than somebody's artwork, so creatures that can't be turned to stone aren't eligible. However, creatures who change form when hit with stoning damage (foo golems to stone golem) were being allowed. Also, statues in cockatrice nest rooms are supposed to be from former characters and take their names from the high scores file. But when 'record' is empty, the statue would be of a random creature instead of being changed into a player character, so both not the latter and possibly something that can't be petrified. I've taken the Medusa part as-is but did the cockatrice nest part differently. It rejected statues of non-stonable creatures in case the named character attempt failed. I've changed things so that when a named player character can't be created, it will use an unnamed one instead of random creature. The issue of maybe ending up with a non- stonable form goes away because all player characters are vulnerable. Fixes #479 --- diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 8c1dd9813..221502d7f 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -428,6 +428,11 @@ poly'd hero who exploded when attacking a monster didn't wake up other woke other monsters within different radius than same monster's would troll corpse revival was inhibited by hero wielding Trollsbane; do that if anyone on level is wielding it +statues representing petrified creatures on Medusa's level might be from + monsters who change form (golems) when hit with stoning damage +attempt to make corpse or statue of a named player character would yield that + of a random monster instead when 'record' was empty; could result in + statues of non-stonable creatures in cockatrice nests Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/src/mkobj.c b/src/mkobj.c index 9cae22145..50aa4c3ea 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -1627,10 +1627,15 @@ mk_tt_object( /* player statues never contain books */ initialize_it = (objtype != STATUE); otmp = mksobj_at(objtype, x, y, initialize_it, FALSE); - /* tt_oname() will return null if the scoreboard is empty; - assigning an object name used to allocate a new obj but - doesn't any more so we can safely ignore the return value */ - (void) tt_oname(otmp); + + /* tt_oname() will return null if the scoreboard is empty, which in + turn leaves the random corpsenm value; force it to match a player */ + if (!tt_oname(otmp)) { + int pm = rn1(PM_WIZARD - PM_ARCHEOLOGIST + 1, PM_ARCHEOLOGIST); + + /* update weight for either, force timer sanity for corpses */ + set_corpsenm(otmp, pm); + } return otmp; } diff --git a/src/mplayer.c b/src/mplayer.c index d50f8daa2..b5e50c005 100644 --- a/src/mplayer.c +++ b/src/mplayer.c @@ -114,9 +114,9 @@ mk_mplayer_armor(struct monst* mon, short typ) } struct monst * -mk_mplayer(register struct permonst* ptr, xchar x, xchar y, register boolean special) +mk_mplayer(struct permonst *ptr, xchar x, xchar y, boolean special) { - register struct monst *mtmp; + struct monst *mtmp; char nam[PL_NSIZ]; if (!is_mplayer(ptr)) diff --git a/src/sp_lev.c b/src/sp_lev.c index efbc5d339..4335c5364 100755 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -2206,7 +2206,7 @@ create_object(object* o, struct mkroom* croom) /* makemon without rndmonst() might create a group */ was = makemon(&mons[wastyp], 0, 0, MM_NOCOUNTBIRTH); if (was) { - if (!resists_ston(was)) { + if (!resists_ston(was) && !poly_when_stoned(&mons[wastyp])) { (void) propagate(wastyp, TRUE, FALSE); break; }