--- deliantra/server/random_maps/expand2x.C 2008/04/11 21:09:53 1.6 +++ deliantra/server/random_maps/expand2x.C 2008/04/14 22:41:17 1.7 @@ -3,7 +3,7 @@ * Expands a layout by 2x in each dimension. * H. S. Teoh * -------------------------------------------------------------------------- - * $Id: expand2x.C,v 1.6 2008/04/11 21:09:53 root Exp $ + * $Id: expand2x.C,v 1.7 2008/04/14 22:41:17 root Exp $ * * ALGORITHM * @@ -14,47 +14,13 @@ #include "random_map.h" #include "rproto.h" -/* PROTOTYPES */ -static void expand_misc (char **newlayout, int i, int j, char **layout, int xsize, int ysize); -static void expand_wall (char **newlayout, int i, int j, char **layout, int xsize, int ysize); -static void expand_door (char **newlayout, int i, int j, char **layout, int xsize, int ysize); - -/* FUNCTIONS */ -Maze -expand2x (Maze layout, int xsize, int ysize) -{ - int i, j; - int nxsize = xsize * 2 - 1; - int nysize = ysize * 2 - 1; - - Maze newlayout (nxsize, nysize); - - for (i = 0; i < xsize; i++) - for (j = 0; j < ysize; j++) - switch (layout[i][j]) - { - case '#': - expand_wall (newlayout, i, j, layout, xsize, ysize); - break; - case 'D': - expand_door (newlayout, i, j, layout, xsize, ysize); - break; - default: - expand_misc (newlayout, i, j, layout, xsize, ysize); - } - - layout.free (); - - return newlayout; -} - /* Copy the old tile X into the new one at location (i*2, j*2) and * fill up the rest of the 2x2 result with \0: * X ---> X \0 * \0 \0 */ static void -expand_misc (char **newlayout, int i, int j, char **layout, int xsize, int ysize) +expand_misc (Maze newlayout, int i, int j, Maze layout) { newlayout[i * 2][j * 2] = layout[i][j]; /* (Note: no need to reset rest of 2x2 area to \0 because calloc does that @@ -69,18 +35,18 @@ * and the possible combinations thereof. */ static int -calc_pattern (char ch, char **layout, int i, int j, int xsize, int ysize) +calc_pattern (char ch, Maze layout, int i, int j) { int pattern = 0; - if (i + 1 < xsize && layout[i + 1][j] == ch) + if (i + 1 < layout->w && layout[i + 1][j] == ch) pattern |= 1; - if (j + 1 < ysize) + if (j + 1 < layout->h) { if (layout[i][j + 1] == ch) pattern |= 2; - if (i + 1 < xsize && layout[i + 1][j + 1] == ch) + if (i + 1 < layout->w && layout[i + 1][j + 1] == ch) pattern |= 4; } @@ -92,28 +58,27 @@ * walls. */ static void -expand_wall (char **newlayout, int i, int j, char **layout, int xsize, int ysize) +expand_wall (Maze newlayout, int i, int j, Maze layout) { - int wall_pattern = calc_pattern ('#', layout, i, j, xsize, ysize); - int door_pattern = calc_pattern ('D', layout, i, j, xsize, ysize); + int wall_pattern = calc_pattern ('#', layout, i, j); + int door_pattern = calc_pattern ('D', layout, i, j); int both_pattern = wall_pattern | door_pattern; newlayout[i * 2][j * 2] = '#'; - if (i + 1 < xsize) + + if (i + 1 < layout->w) { if (both_pattern & 1) { /* join walls/doors to the right */ - /* newlayout[i*2+1][j*2] = '#'; */ newlayout[i * 2 + 1][j * 2] = layout[i + 1][j]; } } - if (j + 1 < ysize) + if (j + 1 < layout->h) { if (both_pattern & 2) { /* join walls/doors to the bottom */ - /* newlayout[i*2][j*2+1] = '#'; */ newlayout[i * 2][j * 2 + 1] = layout[i][j + 1]; } @@ -131,10 +96,10 @@ * that it doesn't know how to correctly expand. */ static void -expand_door (char **newlayout, int i, int j, char **layout, int xsize, int ysize) +expand_door (Maze newlayout, int i, int j, Maze layout) { - int wall_pattern = calc_pattern ('#', layout, i, j, xsize, ysize); - int door_pattern = calc_pattern ('D', layout, i, j, xsize, ysize); + int wall_pattern = calc_pattern ('#', layout, i, j); + int door_pattern = calc_pattern ('D', layout, i, j); int join_pattern; /* Doors "like" to connect to walls more than other doors. If there is @@ -147,13 +112,32 @@ newlayout[i * 2][j * 2] = 'D'; - if (i + 1 < xsize) + if (i + 1 < layout->w) if (join_pattern & 1) /* there is a door/wall to the right */ newlayout[i * 2 + 1][j * 2] = 'D'; - if (j + 1 < ysize) + if (j + 1 < layout->h) if (join_pattern & 2) /* there is a door/wall below */ newlayout[i * 2][j * 2 + 1] = 'D'; } + +void +expand2x (Maze layout) +{ + Maze newlayout (layout->w * 2 - 1, layout->h * 2 - 1); + newlayout->clear (); + + for (int i = 0; i < layout->w; i++) + for (int j = 0; j < layout->h; j++) + switch (layout[i][j]) + { + case '#': expand_wall (newlayout, i, j, layout); break; + case 'D': expand_door (newlayout, i, j, layout); break; + default: expand_misc (newlayout, i, j, layout); break; + } + + layout.swap (newlayout); +} +