Cellular Automata Terrain Generator

by Kaeden

HTML

<div><span>Size:</span>
    <input id='mapSize' value="50"></input> <span>Seed Water%:</span>
    <input id='seedWater' value="56"></input> <span>Min Land:</span>
    <input id='minLand' value="3"></input> <span>Max Land:</span>
    <input id='maxLand' value="4"></input> <span>Runs:</span>
    <input id='runs' value="2"></input> <span>Scale:</span>
    <input id='scale' value="4"></input> <span>Factor:</span>
    <input id='factor' value="4"></input>
    <button id="generate">Generate</button>
    <button id="shrink">Shrink</button>
    <button id="grow">Grow</button>
    <button id="multiply">Multiply</button>
</div>
<div id="container">
    <div id="map"></div>
</div>
<div id="log"></div>

CSS

input {
    width: 40px;
}
button {
    margin-left:5px;
}
#container {
    overflow-x:auto;
    overflow-y:auto;
    position: absolute;
    top: 50px;
    bottom: 200px;
    left: 50px;
    right: 50px;
    border: 15px solid grey;
}
#log {
    position: absolute;
    bottom: 20px;
    height: 170px;
    left: 50px;
    right: 50px;
    overflow-y: auto;
    border: 2px solid grey;
}
#map {
    display: block;
    line-height: 0;
    /*overflow:visible;*/
    white-space: nowrap;
}

.point {
    /*height:4px;
    width:4px;*/
    margin:0;
    padding:0;
    border: 1px solid black;
    display:inline-block;
}
.water {
    background-color: blue;
}
.land {
    background-color: green;
}

JavaScript

log = function (text) {
    $('#log').append('<div>' + text + '</div>');
};

var rand = function (start, end) {
    var dif = end - start;
    var result = Math.floor((Math.random() * (dif + 1)) + Math.floor(start));
    //log("random result for range (" + start + " - " + end + ") is: " + result);
    return result;
};

var Map = function (theSize) {
    var size;
    var array = [];
    var LAND = 1;
    var WATER = 0;
    var minLand, maxLand, seedWater;
    var runs, scale, factor;

    var generate = function (n, scaleN, minLandN, maxLandN, seedWaterN, runsN, factorN) {
        scale = scaleN;
        minLand = minLandN;
        maxLand = maxLandN;
        seedWater = seedWaterN;
        runs = runsN;
        factor = factorN;
        //                log("minLand=" + minLand + ",maxLand=" + maxLand + ",seedWater=" + seedWater + ",size=" + n);
        init(n);
    };

    var multiply = function () {
        multiplyHelper();
        render();
    };

    var multiplyHelper = function () {
        var newArray = [];
        for (var i = 0; i < size * factor; i++) {
            newArray[i] = [];
        }
        for (var x = 0; x < size; x++) {

            for (var y = 0; y < size; y++) {
                var tileCount = analyzeTile(x, y);
                //log('land=' + tileCount.landCount + ",water=" + tileCount.waterCount);



                for (var x2 = 0; x2 < factor; x2++) {
                    //newArray[x * factor + x2] = [];
                    for (var y2 = 0; y2 < factor; y2++) {
                        newArray[x * factor + x2][y * factor + y2] = array[x][y];
                        //log("x,y(" + x + "," + y + ")[" + array[x][y] + "] newArray node: (" + (x * factor + x2) + ", " + (y * factor + y2) + ")");
                    }
                }
                //log("block done");

                //newArray[x][y] = tileCount.waterCount ? (rand(0, 100) >= 90 ? array[x][y] : WATER) : LAND;
            }
        }
        array = newArray;
     ...