From: Pasi Kallinen Date: Tue, 11 Oct 2016 09:45:24 +0000 (+0300) Subject: Sometimes create mazes with wide corridors X-Git-Tag: NetHack-3.6.1_RC01~573 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=63487e8dbd1ee6598909e4f5003dbeae063ecd19;p=nethack Sometimes create mazes with wide corridors ...and/or thick walls. --- diff --git a/src/mkmaze.c b/src/mkmaze.c index 9d4124d2c..bdfb2ca37 100644 --- a/src/mkmaze.c +++ b/src/mkmaze.c @@ -618,6 +618,96 @@ fixup_special() num_lregions = 0; } +/* Create a maze with specified corridor width and wall thickness + * TODO: rewrite walkfrom so it works on temp space, not levl + */ +void +create_maze(corrwid, wallthick) +int corrwid; +int wallthick; +{ + int x,y; + coord mm; + int tmp_xmax = x_maze_max; + int tmp_ymax = y_maze_max; + int rdx = 0; + int rdy = 0; + int scale; + + if (wallthick < 1) + wallthick = 1; + else if (wallthick > 5) + wallthick = 5; + + if (corrwid < 1) + corrwid = 1; + else if (corrwid > 5) + corrwid = 5; + + scale = corrwid + wallthick; + rdx = (x_maze_max / scale); + rdy = (y_maze_max / scale); + + if (level.flags.corrmaze) + for (x = 2; x < (rdx*2); x++) + for (y = 2; y < (rdy*2); y++) + levl[x][y].typ = STONE; + else + for (x = 2; x <= (rdx*2); x++) + for (y = 2; y <= (rdy*2); y++) + levl[x][y].typ = ((x % 2) && (y % 2)) ? STONE : HWALL; + + /* set upper bounds for maze0xy and walkfrom */ + x_maze_max = (rdx*2); + y_maze_max = (rdy*2); + + /* create maze */ + maze0xy(&mm); + walkfrom((int) mm.x, (int) mm.y, 0); + + /* restore bounds */ + x_maze_max = tmp_xmax; + y_maze_max = tmp_ymax; + + /* scale maze up if needed */ + if (scale > 2) { + char tmpmap[COLNO][ROWNO]; + int rx = 1,ry = 1; + + /* back up the existing smaller maze */ + for (x = 1; x < x_maze_max; x++) + for (y = 1; y < y_maze_max; y++) { + tmpmap[x][y] = levl[x][y].typ; + } + + /* do the scaling */ + rx = x = 2; + while (rx < x_maze_max) { + int mx = (x % 2) ? corrwid + : ((x == 2 || x == ((rdx*2))) ? 1 : wallthick); + ry = y = 2; + while (ry < y_maze_max) { + int dx = 0, dy = 0; + int my = (y % 2) ? corrwid + : ((y == 2 || y == ((rdy*2))) ? 1 : wallthick); + for (dx = 0; dx < mx; dx++) + for (dy = 0; dy < my; dy++) { + if (rx+dx >= x_maze_max + || ry+dy >= y_maze_max) + break; + levl[rx + dx][ry + dy].typ = tmpmap[x][y]; + } + ry += my; + y++; + } + rx += mx; + x++; + } + + } +} + + void makemaz(s) const char *s; @@ -686,19 +776,12 @@ const char *s; level.flags.is_maze_lev = TRUE; level.flags.corrmaze = !rn2(3); - if (level.flags.corrmaze) - for (x = 2; x < x_maze_max; x++) - for (y = 2; y < y_maze_max; y++) - levl[x][y].typ = STONE; - else - for (x = 2; x <= x_maze_max; x++) - for (y = 2; y <= y_maze_max; y++) - levl[x][y].typ = ((x % 2) && (y % 2)) ? STONE : HWALL; - - maze0xy(&mm); - walkfrom((int) mm.x, (int) mm.y, 0); - /* put a boulder at the maze center */ - (void) mksobj_at(BOULDER, (int) mm.x, (int) mm.y, TRUE, FALSE); + if (!Invocation_lev(&u.uz) && rn2(2)) { + int corrscale = rnd(4); + create_maze(corrscale,rnd(4)-corrscale); + } else { + create_maze(1,1); + } if (!level.flags.corrmaze) wallification(2, 2, x_maze_max, y_maze_max); @@ -880,8 +963,8 @@ coord *cc; int cpt = 0; do { - cc->x = 3 + 2 * rn2((x_maze_max >> 1) - 1); - cc->y = 3 + 2 * rn2((y_maze_max >> 1) - 1); + cc->x = 1 + rn2(x_maze_max); + cc->y = 1 + rn2(y_maze_max); cpt++; } while (cpt < 100 && levl[cc->x][cc->y].typ @@ -890,10 +973,10 @@ coord *cc; int x, y; /* last try */ - for (x = 0; x < (x_maze_max >> 1) - 1; x++) - for (y = 0; y < (y_maze_max >> 1) - 1; y++) { - cc->x = 3 + 2 * x; - cc->y = 3 + 2 * y; + for (x = 1; x < x_maze_max; x++) + for (y = 1; y < y_maze_max; y++) { + cc->x = x; + cc->y = y; if (levl[cc->x][cc->y].typ == (level.flags.corrmaze ? CORR : ROOM)) return;