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...