32 #define MAP_CRAWL_NONE 0
33 #define MAP_CRAWL_WEST 1
34 #define MAP_CRAWL_EAST 2
35 #define MAP_CRAWL_NORTH 4
36 #define MAP_CRAWL_SOUTH 8
38 #define MAP_CRAWL_ALL 15
59 static void print_debug_paths(uint8_t *
paths,
int x_eff,
int y_eff) {
60 for (
int y = 0; y < y_eff; ++y) {
61 for (
int x = 0; x < x_eff; ++x) {
62 switch (
paths[x * y_eff + y]) {
146 char **crawl = (
char **)malloc(xsize *
sizeof(
char *));
147 for (
int i = 0; i < xsize; ++i) {
148 crawl[i] = (
char *)calloc(ysize,
sizeof(
char));
153 hallway = (
RANDOM() % 3) + 1;
160 int x_eff = (xsize - 1) / (hallway + 1),
161 y_eff = (ysize - 1) / (hallway + 1);
164 if (!x_eff || !y_eff) {
171 uint8_t *
paths = (uint8_t *)calloc(xsize * ysize,
sizeof(uint8_t));
177 startx =
RANDOM() % x_eff;
180 startx = (
RANDOM() % (x_eff - 2)) + 1;
183 starty =
RANDOM() % y_eff;
186 starty = (
RANDOM() % (y_eff - 2)) + 1;
193 std::queue<int> queue;
194 queue.push(startx * y_eff + starty);
200 while (!queue.empty()) {
203 int loc = queue.front();
206 int at_x = loc / y_eff;
207 int at_y = loc % y_eff;
238 if (at_x == x_eff - 1) {
264 if (at_y == y_eff - 1) {
282 path = (
RANDOM() & avail_paths) | req_paths;
283 }
while (first && !path);
286 paths[at_x * y_eff + at_y] = path;
296 queue.push((at_x - 1) * y_eff + at_y);
299 queue.push((at_x + 1) * y_eff + at_y);
302 queue.push(at_x * y_eff + at_y - 1);
305 queue.push(at_x * y_eff + at_y + 1);
311 if (iter == 0 && sections < x_eff * y_eff / 5) {
313 for (
int i = 0; i < xsize; ++i) {
323 print_debug_paths(
paths, x_eff, y_eff);
330 int offset_x = (xsize - (hallway + 1) * x_eff - 1) / 2,
331 offset_y = (ysize - (hallway + 1) * y_eff - 1) / 2;
335 for (
int i = 0; i < offset_x; ++i) {
336 for (
int j = 0; j < ysize; ++j) {
341 for (
int j = 0; j < offset_y; ++j) {
342 for (
int i = 0; i < xsize; ++i) {
347 for (
int i = offset_x + (hallway + 1) * x_eff + 1; i < xsize; ++i) {
348 for (
int j = 0; j < ysize; ++j) {
353 for (
int j = offset_y + (hallway + 1) * y_eff + 1; j < ysize; ++j) {
354 for (
int i = 0; i < xsize; ++i) {
360 for (
int x = 0; x < x_eff; ++x) {
361 for (
int y = 0; y < y_eff; ++y) {
367 uint8_t cur_path =
paths[x * y_eff + y];
371 for (
int tmpx = 0; tmpx < hallway + 2; ++tmpx) {
372 for (
int tmpy = 0; tmpy < hallway + 2; ++tmpy) {
373 crawl[x * (hallway + 1) + offset_x + tmpx][y * (hallway + 1) + offset_y + tmpy] =
'#';
381 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
382 crawl[x * (hallway + 1) + offset_x + tmp][y * (hallway + 1) + offset_y] =
'#';
387 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
388 crawl[x * (hallway + 1) + offset_x + tmp][(y + 1) * (hallway + 1) + offset_y] =
'#';
392 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
393 crawl[x * (hallway + 1) + offset_x][y * (hallway + 1) + offset_y + tmp] =
'#';
397 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
398 crawl[(x + 1) * (hallway + 1) + offset_x][y * (hallway + 1) + offset_y + tmp] =
'#';