Roguelike Cave Generator
Roguelike Cave Generator
by JesterBLUE
HTML
<pre id='foo'></pre>
JavaScript
/*
Ported and annotated from from:http://www.roguebasin.com/index.php?title=Simple_cave_map_generator
-JB 2014
A cave map generator by Ray Dillinger from rec.games.roguelike.development:
[https://groups.google.com/group/rec.games.roguelike.development/msg/eb05dc8b5a82d061 Message-Id: <48d8aa27$0$33580$742ec2ed@news.sonic.net>]
*/
/* a simple program for generating caves. */
var X=60;
var XCENTER=30;
var Y=30;
var YCENTER =15;
var map=[];
cavegen();
drawmap();
function dieroll ( min, max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function cavegen(){
var adjfloor;
var adjwall;
var uncommittedcount = X * Y - 1;
var wallcount = 0;
var floorcount = 1;
var x;
var y;
var xmin = XCENTER - 1;
var ymin = YCENTER - 1;
var xmax = XCENTER + 1;
var ymax = YCENTER + 1;
var iterationlimit = 0;
/* initialize to all uncommitted. */
for (x = 0; x < X; x++){
for (y = 0; y < Y; y++){
map[x+y*X]='?';
}
}
/* clear a center starting point. */
map[XCENTER+X*YCENTER] = '.';
do{
iterationlimit++;
//pick a random square
x = dieroll (xmin, xmax);
y = dieroll (ymin, ymax);
if (map[x+X*y] == '?' || dieroll(1,100) == 1){
//check if it is near the existing cave
if (x == xmin && x > 1) xmin--;
if (x == xmax && x < X-2) xmax++;
if (y == ymin && y > 1) ymin--;
if (y == ymax && y < Y-2) ymax++;
//count nearby floor spaces
adjfloor = 0;
if (map[x-1+X*y] == '.') adjfloor++;
if (map[x+1+X*y] == '.') adjfloor++;
if (map[x+X*(y-1)] == '.') adjfloor++;
if (map[x+X*(y+1)] == '.') adjfloor++;
//count nearby wall spaces
adjwall = 0;
if (map[x-1+X*y] == '#') adjwall++;
if (map[x+1+X*y] == '#') adjwall++;
if (map[x+X*y-X] == '#') adjwall++;
if (map[x+X*y+X] == '#') adjwall++;
//if touching a floor space
if (adjfloor){
//if the map...