--- deliantra/server/random_maps/layout.C 2010/07/03 13:39:04 1.18 +++ deliantra/server/random_maps/layout.C 2010/07/04 20:23:41 1.22 @@ -240,7 +240,7 @@ if (!ncnt) return; - point &p = neigh [perturb ? rmg_rndm (ncnt) : 0]; + point p = neigh [perturb ? rmg_rndm (ncnt) : 0]; seeds.push (p); @@ -275,8 +275,7 @@ // 1 == visited rooms // 2+ shortest distance to random near room - max_it (perturb, 0); - min_it (perturb, 2); + clamp_it (perturb, 0, 2); // phase 1, find seed int cnt = 0; @@ -360,10 +359,8 @@ layout::doorify () { int ndoors = w * h / 60; /* reasonable number of doors. */ - int doorlocs = 0; /* # of available doorlocations */ - uint16 *doorlist_x = salloc (w * h); - uint16 *doorlist_y = salloc (w * h); + fixed_stack doorloc (w * h); /* make a list of possible door locations */ for (int i = 1; i < w - 1; i++) @@ -372,34 +369,21 @@ int sindex = surround_flag (*this, i, j); if (sindex == 3 || sindex == 12) /* these are possible door sindex */ - { - doorlist_x [doorlocs] = i; - doorlist_y [doorlocs] = j; - doorlocs++; - } + doorloc.push (point (i, j)); } - while (ndoors > 0 && doorlocs > 0) + while (ndoors && doorloc.size) { - int di = rmg_rndm (doorlocs); - int i = doorlist_x [di]; - int j = doorlist_y [di]; - int sindex = surround_flag (*this, i, j); + point p = doorloc.remove (rmg_rndm (doorloc.size)); + + int sindex = surround_flag (*this, p.x, p.y); if (sindex == 3 || sindex == 12) /* these are possible door sindex */ { - data [i][j] = 'D'; - ndoors--; + data [p.x][p.y] = 'D'; + --ndoors; } - - /* reduce the size of the list */ - doorlocs--; - doorlist_x[di] = doorlist_x [doorlocs]; - doorlist_y[di] = doorlist_y [doorlocs]; } - - sfree (doorlist_x, w * h); - sfree (doorlist_y, w * h); } /* takes a map and makes it symmetric: adjusts Xsize and @@ -801,23 +785,23 @@ erode_1_2 (5, 2, 1); break; - // somewhat open, roundish + // somewhat open, some room-like structures case 2: fill_rand (45); - erode_1_2 (5, 0, 5); - erode_1_2 (5, 1, 1); + erode_1_2 (5, 2, 4); + erode_1_2 (5, -1, 3); break; - // wide open, some room-like structures + // wide open, roundish case 3: fill_rand (45); - erode_1_2 (5, 2, 4); - erode_1_2 (5, -1, 3); + erode_1_2 (5, 0, 5); + erode_1_2 (5, 1, 1); break; } border (); - isolation_remover (); + isolation_remover (1); } void @@ -830,6 +814,9 @@ int rw = rmg_rndm (6, 10); int rh = rmg_rndm (6, 10); + if (rw > w || rh > h) + continue; + int rx = rmg_rndm (0, w - rw); int ry = rmg_rndm (0, h - rh); @@ -842,24 +829,21 @@ } static void -gen_mixed_ (layout &maze, random_map_params *RP, int dir) +gen_mixed_ (layout &maze, random_map_params *RP) { - if (maze.w < 20 && maze.h < 20 && !rmg_rndm (3)) - dir = 2; // stop recursion randomly - - if (dir == 0 && maze.w > 16) + if (maze.w > maze.h && maze.w > 16) { int m = rmg_rndm (8, maze.w - 8); - layout m1 (maze, 0, 0, m , maze.h); gen_mixed_ (m1, RP, !dir); - layout m2 (maze, m, 0, maze.w, maze.h); gen_mixed_ (m2, RP, !dir); + layout m1 (maze, 0, 0, m , maze.h); gen_mixed_ (m1, RP); + layout m2 (maze, m, 0, maze.w, maze.h); gen_mixed_ (m2, RP); } - else if (dir == 1 && maze.h > 16) + else if (maze.h > 16) { int m = rmg_rndm (8, maze.h - 8); - layout m1 (maze, 0, 0, maze.w, m ); gen_mixed_ (m1, RP, !dir); - layout m2 (maze, 0, m, maze.w, maze.h); gen_mixed_ (m2, RP, !dir); + layout m1 (maze, 0, 0, maze.w, m ); gen_mixed_ (m1, RP); + layout m2 (maze, 0, m, maze.w, maze.h); gen_mixed_ (m2, RP); } else { @@ -877,11 +861,11 @@ gen_mixed (layout &maze, random_map_params *RP) { random_map_params &rp = *new random_map_params (RP); - gen_mixed_ (maze, &rp, rmg_rndm (2)); + gen_mixed_ (maze, &rp); delete &rp; maze.border (); - maze.isolation_remover (); + maze.isolation_remover (0); } //+GPL @@ -974,6 +958,27 @@ //-GPL #if 0 +static void +gen_village (layout &maze) +{ + maze.clear (); + maze.border (); + + for (int n = maze.w * maze.h / 200 + 1; n--; ) + { + int rw = rmg_rndm (6, 10); + int rh = rmg_rndm (6, 10); + + int rx = rmg_rndm (2, maze.w - rw - 2); + int ry = rmg_rndm (2, maze.h - rh - 2); + + maze.rect (rx, ry, rx + rw, ry + rh, '#'); + } + + maze.border (); + maze.isolation_remover (2); +} + static struct demo { demo () @@ -982,8 +987,8 @@ for(int i=1;i<100;i++) { - layout maze (40, 25); - maze.gen_castle (); + layout maze (40, 30); + gen_village (maze); maze.doorify (); maze.print (); exit(0);