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
56 for (
int y = 0; y < y_eff; ++y) {
57 for (
int x = 0; x < x_eff; ++x) {
58 switch (
paths[x * y_eff + y]) {
141 char **crawl = (
char **)malloc(xsize *
sizeof(
char *));
142 for (
int i = 0; i < xsize; ++i) {
143 crawl[i] = (
char *)calloc(ysize,
sizeof(
char));
148 hallway = (
RANDOM() % 3) + 1;
155 int x_eff = (xsize - 1) / (hallway + 1),
156 y_eff = (ysize - 1) / (hallway + 1);
159 if (!x_eff || !y_eff) {
166 uint8_t *
paths = (uint8_t *)calloc(xsize * ysize,
sizeof(uint8_t));
172 startx =
RANDOM() % x_eff;
175 startx = (
RANDOM() % (x_eff - 2)) + 1;
178 starty =
RANDOM() % y_eff;
181 starty = (
RANDOM() % (y_eff - 2)) + 1;
188 std::queue<int> queue;
189 queue.push(startx * y_eff + starty);
195 while (!queue.empty()) {
198 int loc = queue.front();
201 int at_x = loc / y_eff;
202 int at_y = loc % y_eff;
233 if (at_x == x_eff - 1) {
259 if (at_y == y_eff - 1) {
277 path = (
RANDOM() & avail_paths) | req_paths;
278 }
while (first && !path);
281 paths[at_x * y_eff + at_y] = path;
291 queue.push((at_x - 1) * y_eff + at_y);
294 queue.push((at_x + 1) * y_eff + at_y);
297 queue.push(at_x * y_eff + at_y - 1);
300 queue.push(at_x * y_eff + at_y + 1);
306 if (iter == 0 && sections < x_eff * y_eff / 5) {
308 for (
int i = 0; i < xsize; ++i) {
324 int offset_x = (xsize - (hallway + 1) * x_eff - 1) / 2,
325 offset_y = (ysize - (hallway + 1) * y_eff - 1) / 2;
329 for (
int i = 0; i < offset_x; ++i) {
330 for (
int j = 0; j < ysize; ++j) {
335 for (
int j = 0; j < offset_y; ++j) {
336 for (
int i = 0; i < xsize; ++i) {
341 for (
int i = offset_x + (hallway + 1) * x_eff + 1; i < xsize; ++i) {
342 for (
int j = 0; j < ysize; ++j) {
347 for (
int j = offset_y + (hallway + 1) * y_eff + 1; j < ysize; ++j) {
348 for (
int i = 0; i < xsize; ++i) {
354 for (
int x = 0; x < x_eff; ++x) {
355 for (
int y = 0; y < y_eff; ++y) {
361 uint8_t cur_path =
paths[x * y_eff + y];
365 for (
int tmpx = 0; tmpx < hallway + 2; ++tmpx) {
366 for (
int tmpy = 0; tmpy < hallway + 2; ++tmpy) {
367 crawl[x * (hallway + 1) + offset_x + tmpx][y * (hallway + 1) + offset_y + tmpy] =
'#';
375 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
376 crawl[x * (hallway + 1) + offset_x + tmp][y * (hallway + 1) + offset_y] =
'#';
381 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
382 crawl[x * (hallway + 1) + offset_x + tmp][(y + 1) * (hallway + 1) + offset_y] =
'#';
386 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
387 crawl[x * (hallway + 1) + offset_x][y * (hallway + 1) + offset_y + tmp] =
'#';
391 for (
int tmp = 0; tmp < hallway + 2; ++tmp) {
392 crawl[(x + 1) * (hallway + 1) + offset_x][y * (hallway + 1) + offset_y + tmp] =
'#';