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
This commit is contained in:
PatR
2021-04-01 12:12:05 -07:00
parent 0479625c94
commit 6c22520b1a
4 changed files with 17 additions and 7 deletions

View File

@@ -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

View File

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

View File

@@ -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))

View File

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