Vertis Town generator

Town generator based on a Voronoi Diagram, drawing streets, building biomes.

by Markus Dehning

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/seedrandom/2.4.0/seedrandom.min.js"></script>
<script src="https://d3js.org/d3.v4.min.js"></script>

JavaScript

Math.seedrandom('Ascalon');
var maxPoints = 500;
var width 		= 600;
var height 		= 600;
var t = 20, focus = 6, foci = 1, area = 1;
var wildernessDegration = 0.15, wildernessExpansionRate = 0.8;
var	urbanDegration = 0.05;
var allowCivReversion = false;
var farmSpread = 0.3, pastureSpread = 0.3;

//	Color definitions
var verti_lightgreen		= "#aacc33";
var verti_green 				= "#55cc55";
var verti_darkgreen 		= "#33aa33";
var verti_darkestgreen 	= "#009900";
var verti_yellow				=	"#cccc00";
var verti_grey					= "#99aa99";
var verti_darkgrey 			= "#595959";
var verti_contour				=	"#050505";
var verti_street				=	"#777777";
function random(min, max){
	return (max-min)*Math.random() + min;
}
function randomInt(min, max){
	return Math.floor(random(min, max));
}
function randomGauss(min, max, lvl){
	if(arguments.length <= 2) lvl = 1;
	var res = 0;
	for(var l = 0; l < lvl; l++){1
		res += random(min, max);
	}
	return res / (Math.max(1, lvl));
}
function randomGaussOffcenter(offset, min, max, lvl){
	var rand = randomGauss(min, max, lvl) + offset;
	if(rand < min || rand > max) rand = randomGaussOffcenter(offset, min, max, lvl);
	return rand;
}
function random2DGaussSum(offsets, minX, maxX, minY, maxY, lvl){
	//offsets are array of points choose a point at random
	var randX = 0, randY = 0;
	var i = Math.floor(random(0, offsets.length));
	randX += randomGaussOffcenter(offsets[i][0], minX, maxX, lvl);
	randY += randomGaussOffcenter(offsets[i][1], minY, maxY, lvl);
	return [randX, randY];
}
function randomSign(){
	var r = random(0,1);
	if(r < 0.4) return -1;
	if(r < 0.8) return 1;
	return r*random(0,1);
}

var centers = [];
for(var j = 0; j < foci; j++){
	centers.push([randomGaussOffcenter(randomSign()*t, -width/2, +width/2, focus),
			randomGaussOffcenter(randomSign()*t, -height/2, +height/2, focus)]);
	if(random(0,1)<0.1) centers.push([random(-width/3, width/3), random(-height/3, height/3)]);		
}
var data = [];
for(var i = 0; i < maxPoints; i++){
	//var p =...