fix #H165 - sokoban "flaw" (trunk only)

Back in <email deleted> complained
that randomly generated giants in Sokoban would drop boulders when killed,
interfering with the puzzle solution.  He suggested that giants either
be disallowed or be generated without inventory in that dungeon branch.
This doesn't go that far; it just rejects giants on the first pass during
random monster selection, making them much less likely to appear there
but still allowing them if giant is chosen two times in a row.  (Existing
boulders aren't an issue here; giants can't pick them up in Sokoban.)
This commit is contained in:
nethack.rankin
2007-04-03 03:20:27 +00:00
parent 1b82f097d1
commit a7c7376895
2 changed files with 7 additions and 1 deletions

View File

@@ -209,6 +209,7 @@ effect of negative AC on damage received was calculated differently than
unicorn horn produced by revived monster will polymorph as if non-magic
stone-to-flesh on any golem statue or golem figurine creates flesh golem
stone-to-flesh which activates shop-owned figurine entails shop charges
make giants be less likely to be randomly generated in Sokoban
Platform- and/or Interface-Specific Fixes

View File

@@ -938,6 +938,7 @@ register int mmflags;
*/
int tryct = 0; /* maybe there are no good choices */
struct monst fakemon;
do {
if(!(ptr = rndmonst())) {
#ifdef DEBUG
@@ -946,7 +947,11 @@ register int mmflags;
return((struct monst *) 0); /* no more monsters! */
}
fakemon.data = ptr; /* set up for goodpos */
} while(!goodpos(x, y, &fakemon, gpflags) && tryct++ < 50);
} while (++tryct <= 50 &&
/* in Sokoban, don't accept a giant on first try;
after that, boulder carriers are fair game */
((tryct == 1 && throws_rocks(ptr) && In_sokoban(&u.uz)) ||
!goodpos(x, y, &fakemon, gpflags)));
mndx = monsndx(ptr);
}
(void) propagate(mndx, countbirth, FALSE);