From: Pasi Kallinen Date: Sat, 4 Mar 2023 16:01:15 +0000 (+0200) Subject: Better algo for picking a room to put stairs in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c6a2803f49a08f6b20e691908dbf308640244f6f;p=nethack Better algo for picking a room to put stairs in --- diff --git a/src/mklev.c b/src/mklev.c index 503cdb43c..5efa37dbb 100644 --- a/src/mklev.c +++ b/src/mklev.c @@ -1734,27 +1734,27 @@ static struct mkroom * generate_stairs_find_room(void) { struct mkroom *croom; - int i, phase, tryct = 0; + int i, phase, ai; + int *rmarr; if (!gn.nroom) return (struct mkroom *) 0; - for (phase = 2; phase > -1; phase--) { - do { - croom = &gr.rooms[rn2(gn.nroom)]; - if (generate_stairs_room_good(croom, phase)) - return croom; - } while (tryct++ < 50); - } + rmarr = (int *) alloc(sizeof(int) * gn.nroom); - for (phase = 2; phase > -2; phase--) { - for (i = 0; i < gn.nroom; i++) { - croom = &gr.rooms[i]; - if (generate_stairs_room_good(croom, phase)) - return croom; + for (phase = 2; phase > -1; phase--) { + ai = 0; + for (i = 0; i < gn.nroom; i++) + if (generate_stairs_room_good(&gr.rooms[i], phase)) + rmarr[ai++] = i; + if (ai > 0) { + i = rmarr[rn2(ai)]; + free(rmarr); + return &gr.rooms[i]; } } + free(rmarr); croom = &gr.rooms[rn2(gn.nroom)]; return croom; }