2005-06-06 09:46:28 +02:00
|
|
|
// Object type constants
|
|
|
|
|
2005-06-07 09:21:55 +02:00
|
|
|
const
|
2005-06-06 09:46:28 +02:00
|
|
|
TYPE_RECTPLACER = 1,
|
|
|
|
TYPE_TERRAINPAINTER = 2,
|
|
|
|
TYPE_NULLCONSTRAINT = 3,
|
2005-06-20 05:18:51 +02:00
|
|
|
TYPE_LAYEREDPAINTER = 4,
|
|
|
|
TYPE_AVOIDAREACONSTRAINT = 5,
|
|
|
|
TYPE_CLUMPPLACER = 6,
|
|
|
|
TYPE_AVOIDTEXTURECONSTRAINT = 7,
|
|
|
|
TYPE_ELEVATIONPAINTER = 8;
|
2005-06-06 09:46:28 +02:00
|
|
|
|
|
|
|
// Utility functions
|
|
|
|
|
|
|
|
function println(x) {
|
|
|
|
print(x);
|
|
|
|
print("\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
function argsToArray(x) {
|
|
|
|
if(x.length!=1) {
|
|
|
|
var ret = new Array();
|
|
|
|
for(var i=0; i<x.length; i++) {
|
|
|
|
ret[i] = x[i];
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return x[0];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function chooseRand() {
|
|
|
|
if(arguments.length==0) {
|
|
|
|
error("chooseRand: requires at least 1 argument");
|
|
|
|
}
|
|
|
|
var ar = argsToArray(arguments);
|
|
|
|
return ar[randInt(ar.length)];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Area placers
|
|
|
|
|
|
|
|
function RectPlacer(x1, y1, x2, y2) {
|
2005-06-20 00:43:07 +02:00
|
|
|
this.TYPE = TYPE_RECTPLACER;
|
2005-06-06 09:46:28 +02:00
|
|
|
this.x1 = x1;
|
|
|
|
this.y1 = y1;
|
|
|
|
this.x2 = x2;
|
|
|
|
this.y2 = y2;
|
|
|
|
}
|
|
|
|
|
|
|
|
function TerrainPainter(terrain) {
|
2005-06-20 00:43:07 +02:00
|
|
|
this.TYPE = TYPE_TERRAINPAINTER;
|
2005-06-06 09:46:28 +02:00
|
|
|
this.terrain = terrain;
|
|
|
|
}
|
|
|
|
|
|
|
|
function NullConstraint() {
|
2005-06-20 00:43:07 +02:00
|
|
|
this.TYPE = TYPE_NULLCONSTRAINT;
|
2005-06-06 09:46:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function LayeredPainter(widths, terrains) {
|
2005-06-20 00:43:07 +02:00
|
|
|
this.TYPE = TYPE_LAYEREDPAINTER;
|
2005-06-06 09:46:28 +02:00
|
|
|
this.widths = widths;
|
|
|
|
this.terrains = terrains;
|
|
|
|
}
|
|
|
|
|
|
|
|
function AvoidAreaConstraint(area) {
|
2005-06-20 00:43:07 +02:00
|
|
|
this.TYPE = TYPE_AVOIDAREACONSTRAINT;
|
2005-06-06 09:46:28 +02:00
|
|
|
this.area = area;
|
|
|
|
}
|
|
|
|
|
2005-06-07 09:21:55 +02:00
|
|
|
function ClumpPlacer(size, coherence, smoothness, x, y) {
|
2005-06-20 00:43:07 +02:00
|
|
|
this.TYPE = TYPE_CLUMPPLACER;
|
2005-06-06 09:46:28 +02:00
|
|
|
this.size = size;
|
|
|
|
this.coherence = coherence;
|
|
|
|
this.smoothness = smoothness;
|
2005-06-07 09:21:55 +02:00
|
|
|
this.x = x ? x : -1;
|
|
|
|
this.y = y ? y : -1;
|
2005-06-06 09:46:28 +02:00
|
|
|
}
|
|
|
|
|
2005-06-20 00:43:07 +02:00
|
|
|
function AvoidTextureConstraint(texture) {
|
|
|
|
this.TYPE = TYPE_AVOIDTEXTURECONSTRAINT;
|
2005-06-06 09:46:28 +02:00
|
|
|
this.texture = texture;
|
|
|
|
}
|
|
|
|
|
2005-06-20 05:18:51 +02:00
|
|
|
function ElevationPainter(elevation) {
|
|
|
|
this.TYPE = TYPE_ELEVATIONPAINTER;
|
|
|
|
this.elevation = elevation;
|
2005-06-06 09:46:28 +02:00
|
|
|
}
|
|
|
|
|
2005-06-20 05:55:11 +02:00
|
|
|
function createAreas(centeredPlacer, painter, constraint, num, maxFail) {
|
2005-06-07 09:21:55 +02:00
|
|
|
var good = 0;
|
|
|
|
var bad = 0;
|
|
|
|
var ret = new Array();
|
|
|
|
while(good < num && bad <= maxFail) {
|
|
|
|
centeredPlacer.x = randInt(SIZE);
|
|
|
|
centeredPlacer.y = randInt(SIZE);
|
|
|
|
var r = createArea(centeredPlacer, painter, constraint);
|
|
|
|
if(r) {
|
|
|
|
good++;
|
|
|
|
ret[ret.length] = r;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
bad++;
|
|
|
|
}
|
2005-06-06 09:46:28 +02:00
|
|
|
}
|
2005-06-20 00:43:07 +02:00
|
|
|
return ret;
|
2005-06-07 09:21:55 +02:00
|
|
|
}
|