From: nethack.rankin Date: Thu, 24 Aug 2006 04:50:45 +0000 (+0000) Subject: fix #H184 - rndmonnum plan B X-Git-Tag: MOVE2GIT~925 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=422bfa686e5d217e8fb4e08df0c45e9154dbebd3;p=nethack fix #H184 - rndmonnum plan B From a bug report, the fallback selection criteria (used when everything is extinct?) in rndmonnum() was excluding hell-only monsters when outside of Gehennom, but failed to exclude never-in-hell ones when inside. [Some of the never-in-hell monsters are Angels, but the rest are all cold based creatures. That must date to when fire resistance was required for the hero, which is no longer the case. Should those cold monsters retain their never-in-hell setting?] This also fixes a latent copy/paste bug in the unused mons[] definition of Cerberus (it was the only unique monster which failed to specify G_NOGEN). --- diff --git a/doc/fixes34.4 b/doc/fixes34.4 index 7ab93d466..ec6e902f5 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -249,6 +249,8 @@ fix phrasing in monster against monster attack feedback when attacker is don't place hero on top of monster when arriving on level which is so full that the monster can't be moved out of the way have to see a divine gift in order to have it become a discovery +honor the never-in-hell flag when selecting random monster type for corpses, + eggs, figurines, and statues created in Gehennom Platform- and/or Interface-Specific Fixes diff --git a/src/mkobj.c b/src/mkobj.c index d7f487a2e..0786fee26 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)mkobj.c 3.5 2006/07/08 */ +/* SCCS Id: @(#)mkobj.c 3.5 2006/08/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -308,16 +308,18 @@ rndmonnum() /* select a random, common monster type */ { register struct permonst *ptr; register int i; + unsigned short excludeflags; /* Plan A: get a level-appropriate common monster */ ptr = rndmonst(); if (ptr) return(monsndx(ptr)); /* Plan B: get any common monster */ + excludeflags = G_UNIQ | G_NOGEN | (Inhell ? G_NOHELL : G_HELL); do { i = rn1(SPECIAL_PM - LOW_PM, LOW_PM); ptr = &mons[i]; - } while((ptr->geno & G_NOGEN) || (!Inhell && (ptr->geno & G_HELL))); + } while ((ptr->geno & excludeflags) != 0); return(i); } diff --git a/src/monst.c b/src/monst.c index 95953e99a..af7305661 100644 --- a/src/monst.c +++ b/src/monst.c @@ -297,7 +297,7 @@ NEARDATA struct permonst mons[] = { M3_INFRAVISIBLE, CLR_RED), #ifdef CHARON MON("Cerberus", S_DOG, - LVL(12, 10, 2, 20, -7), (G_HELL|G_UNIQ|1), + LVL(12, 10, 2, 20, -7), (G_NOGEN|G_UNIQ|G_HELL), A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 350, MS_BARK, MZ_LARGE), MR_FIRE, MR_FIRE,