]> granicus.if.org Git - nethack/commitdiff
fix #H184 - rndmonnum plan B
authornethack.rankin <nethack.rankin>
Thu, 24 Aug 2006 04:50:45 +0000 (04:50 +0000)
committernethack.rankin <nethack.rankin>
Thu, 24 Aug 2006 04:50:45 +0000 (04:50 +0000)
     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).

doc/fixes34.4
src/mkobj.c
src/monst.c

index 7ab93d466857174fbae414bd0ca6c66a70a2310f..ec6e902f5ae2bbcb774c671add1aebc3df2331f8 100644 (file)
@@ -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
index d7f487a2eabc1abe676334d0adb5f9ff4b134d6b..0786fee26450b7dc506e53c69ba22b95c2d13dc8 100644 (file)
@@ -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);
 }
index 95953e99a540ee0647b8a73ea7aa8b70e9905094..af7305661b0caa099d39f5a5522aafb501c5c075 100644 (file)
@@ -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,