33 #define MAP_CRAWL_NONE 0
34 #define MAP_CRAWL_WEST 1
35 #define MAP_CRAWL_EAST 2
36 #define MAP_CRAWL_NORTH 4
37 #define MAP_CRAWL_SOUTH 8
39 #define MAP_CRAWL_ALL 15
60 static void print_debug_paths(uint8_t *
paths,
int x_eff,
int y_eff) {
61 for (
int y = 0; y < y_eff; ++y) {
62 for (
int x = 0; x < x_eff; ++x) {
63 switch (
paths[x * y_eff + y]) {
147 char **crawl = (
char **)malloc(xsize *
sizeof(
char *));
148 for (
int i = 0; i < xsize; ++i) {
149 crawl[i] = (
char *)calloc(ysize,
sizeof(
char));
154 hallway = (
RANDOM() % 3) + 1;
161 int x_eff = (xsize - 1) / (hallway + 1),
162 y_eff = (ysize - 1) / (hallway + 1);
165 if (!x_eff || !y_eff) {
172 uint8_t *
paths = (uint8_t *)calloc(xsize * ysize,
sizeof(uint8_t));
178 startx =
RANDOM() % x_eff;
181 startx = (
RANDOM() % (x_eff - 2)) + 1;
184 starty =
RANDOM() % y_eff;
187 starty = (
RANDOM() % (y_eff - 2)) + 1;
194 std::queue<int> queue;
195 queue.push(startx * y_eff + starty);
201 while (!queue.empty()) {
204 int loc = queue.front();
207 int at_x = loc / y_eff;
208 int at_y = loc % y_eff;
239 if (at_x == x_eff - 1) {
265 if (at_y == y_eff - 1) {
283 path = (
RANDOM() & avail_paths) | req_paths;
284 }
while (first && !path);
287 paths[at_x * y_eff + at_y] = path;
297 queue.push((at_x - 1) * y_eff + at_y);
300 queue.push((at_x + 1) * y_eff + at_y);
303 queue.push(at_x * y_eff + at_y - 1);
306 queue.push(at_x * y_eff + at_y + 1);
312 if (iter == 0 && sections < x_eff * y_eff / 5) {
314 for (
int i = 0; i < xsize; ++i) {
324 print_debug_paths(
paths, x_eff, y_eff);
331 int offset_x = (xsize - (hallway + 1) * x_eff - 1) / 2,
332 offset_y = (ysize - (hallway + 1) * y_eff - 1) / 2;
336 for (
int i = 0; i < offset_x; ++i) {
337 for (
int j = 0; j < ysize; ++j) {
342 for (
int j = 0; j < offset_y; ++j) {
343 for (
int i = 0; i < xsize; ++i) {
348 for (
int i = offset_x + (hallway + 1) * x_eff + 1; i < xsize; ++i) {
349 for (
int j = 0; j < ysize; ++j) {
354 for (
int j = offset_y + (hallway + 1) * y_eff + 1; j < ysize; ++j) {
355 for (
int i = 0; i < xsize; ++i) {
361 for (
int x = 0; x < x_eff; ++x) {
362 for (
int y = 0; y < y_eff; ++y) {
368 uint8_t cur_path =
paths[x * y_eff + y];
372 for (
int tmpx = 0; tmpx < hallway + 2; ++tmpx) {
373 for (
int tmpy = 0; tmpy < hallway + 2; ++tmpy) {
374 crawl[x * (hallway + 1) + offset_x + tmpx][y * (hallway + 1) + offset_y + tmpy] =
'#';
382 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
383 crawl[x * (hallway + 1) + offset_x + tmp][y * (hallway + 1) + offset_y] =
'#';
388 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
389 crawl[x * (hallway + 1) + offset_x + tmp][(y + 1) * (hallway + 1) + offset_y] =
'#';
393 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
394 crawl[x * (hallway + 1) + offset_x][y * (hallway + 1) + offset_y + tmp] =
'#';
398 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
399 crawl[(x + 1) * (hallway + 1) + offset_x][y * (hallway + 1) + offset_y + tmp] =
'#';