From a7c73768954e448cb5864e6995e044b8cc62def4 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Tue, 3 Apr 2007 03:20:27 +0000 Subject: [PATCH] fix #H165 - sokoban "flaw" (trunk only) Back in 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.) --- doc/fixes35.0 | 1 + src/makemon.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 815628b62..1c136f1f6 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -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 diff --git a/src/makemon.c b/src/makemon.c index f8d416451..6499298eb 100644 --- a/src/makemon.c +++ b/src/makemon.c @@ -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);