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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user