Here is a new patch that attempts to find a keymaster: it tries harder to find a keymaster. After that it tries to find a free spot. If this too fails, it drops the key in a random place (i.e. wall). I did some more checks with the random_map program. It found a keymaster in over 95% of all tries. In the remaining cases it found a free spot. The fall back case to drop the key in a wall (freeindex == -1 after the second loop) did never occur. Concerning the other change in patch-4.diff to drop a chest if no free spot could be found, I think this behavior is acceptable: all callers of place_chest() check for (or ignore) a NULL result. So it is better to drop the chest than to place it in a arbitrary/invalid (i.e. "x+freearr_x[-1]") location. -------------- next part -------------- Index: random_maps/treasure.c =================================================================== RCS file: /cvsroot/crossfire/crossfire/random_maps/treasure.c,v retrieving revision 1.19 diff -u -w -r1.19 treasure.c --- random_maps/treasure.c 8 Jan 2003 08:39:18 -0000 1.19 +++ random_maps/treasure.c 13 Apr 2004 17:24:05 -0000 @@ -296,7 +297,7 @@ if(door_flag==PASS_DOORS) { int tries=0; the_keymaster=NULL; - while(tries<5&&the_keymaster==NULL) { + while(tries<15&&the_keymaster==NULL) { i = (RANDOM()%(RP->Xsize-2))+1; j = (RANDOM()%(RP->Ysize-2))+1; tries++; @@ -304,9 +305,18 @@ } /* if we don't find a good keymaster, drop the key on the ground. */ if(the_keymaster==NULL) { - int freeindex = find_first_free_spot(the_key->arch,map,i,j); - kx = i + freearr_x[freeindex]; - ky = j + freearr_y[freeindex]; + int freeindex; + + freeindex = -1; + for(tries = 0; tries < 15 && freeindex == -1; tries++) { + kx = (RANDOM()%(RP->Xsize-2))+1; + ky = (RANDOM()%(RP->Ysize-2))+1; + freeindex = find_first_free_spot(the_key->arch,map,kx,ky); + } + if(freeindex != -1) { + kx += freearr_x[freeindex]; + ky += freearr_y[freeindex]; + } } } else { /* NO_PASS_DOORS --we have to work harder.*/ -------------- next part -------------- _______________________________________________ crossfire-devel mailing list crossfire-devel at lists.real-time.com https://mailman.real-time.com/mailman/listinfo/crossfire-devel