1
0
forked from 0ad/0ad

This was SVN commit r2687.

This commit is contained in:
Matei 2005-09-08 01:18:55 +00:00
parent 4cc30aeb56
commit c428f510f6
2 changed files with 123 additions and 122 deletions

View File

@ -1,48 +1,12 @@
// constants
const SIZE = 208; const SIZE = 208;
const NUM_PLAYERS = 4; const NUM_PLAYERS = 4;
// some utility stuff
const PI = Math.PI;
function fractionToTiles(f) {
return SIZE * f;
}
function tilesToFraction(t) {
return t / SIZE;
}
function fractionToSize(f) {
return SIZE * SIZE * f;
}
function sizeToFraction(s) {
return s / SIZE / SIZE;
}
function cos(x) {
return Math.cos(x);
}
function sin(x) {
return Math.sin(x);
}
function round(x) {
return Math.round(x);
}
// environment constants
const oTree = "flora/wrld_flora_deci_1.xml";
const oGrass = "foliage/grass_tufts_a.xml";
const oBush = "foliage/bush_highlands.xml";
const tGrass = ["grass1_a", "grass2"]; const tGrass = ["grass1_a", "grass2"];
const tCliff = ["cliff2", "cliff2_moss"]; const tCliff = ["cliff2", "cliff2_moss"];
const tForestFloor = "grass_forest_floor_oak"; const tForest = "grass_forest_floor_oak|flora/wrld_flora_oak.xml";
const tForest = tForestFloor + "|" + oTree;
const tGrassDirt75 = "grass dirt 75"; const tGrassDirt75 = "grass dirt 75";
const tGrassDirt50 = "grass dirt 50"; const tGrassDirt50 = "grass dirt 50";
const tGrassDirt25 = "grass dirt 25"; const tGrassDirt25 = "grass dirt 25";
@ -51,12 +15,29 @@ const tShore = "dirt_brown_rocks";
const tWater = "water_2"; const tWater = "water_2";
const tWaterDeep = "water_3"; const tWaterDeep = "water_3";
const oGrass = "foliage/grass_tufts_a.xml";
const oTree = "flora/wrld_flora_oak.xml";
// some utility functions to save typing
function paintClass(cl) {
return new TileClassPainter(cl);
}
function avoidClasses(/*class1, dist1, class2, dist2, etc*/) {
var ar = new Array(arguments.length/2);
for(var i=0; i<arguments.length/2; i++) {
ar[i] = new AvoidTileClassConstraint(arguments[2*i], arguments[2*i+1]);
}
return ar;
}
// initialize map // initialize map
println("Initializing map..."); println("Initializing map...");
init(SIZE, tGrass, 0); init(SIZE, tGrass, 10);
// tile classes // create tile classes
clPlayer = createTileClass(); clPlayer = createTileClass();
clHill = createTileClass(); clHill = createTileClass();
@ -64,7 +45,7 @@ clForest = createTileClass();
clWater = createTileClass(); clWater = createTileClass();
clDirt = createTileClass(); clDirt = createTileClass();
// player placement // place players
playerX = new Array(NUM_PLAYERS); playerX = new Array(NUM_PLAYERS);
playerY = new Array(NUM_PLAYERS); playerY = new Array(NUM_PLAYERS);
@ -75,18 +56,15 @@ for(i=0; i<NUM_PLAYERS; i++) {
playerAngle[i] = startAngle + i*2*PI/NUM_PLAYERS; playerAngle[i] = startAngle + i*2*PI/NUM_PLAYERS;
playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
playerY[i] = 0.5 + 0.35*sin(playerAngle[i]); playerY[i] = 0.5 + 0.35*sin(playerAngle[i]);
println("Player " + i + " is at (" + playerX[i] + ", " + playerY[i] + ")");
} }
// player areas
for(i=0; i<NUM_PLAYERS; i++) { for(i=0; i<NUM_PLAYERS; i++) {
println("Creating base for player " + i + "..."); println("Creating base for player " + i + "...");
// some constants // some constants
radius = 18; radius = 18;
cliffRadius = 3; cliffRadius = 3;
elevation = 14; elevation = 32;
// get the x and y in tiles // get the x and y in tiles
fx = fractionToTiles(playerX[i]); fx = fractionToTiles(playerX[i]);
@ -108,7 +86,7 @@ for(i=0; i<NUM_PLAYERS; i++) {
elevation, // elevation elevation, // elevation
cliffRadius // blend radius cliffRadius // blend radius
); );
createArea(placer, [terrainPainter, elevationPainter, new TileClassPainter(clPlayer)], null); createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null);
// create the ramp // create the ramp
rampAngle = playerAngle[i] + PI + (2*randFloat()-1)*PI/8; rampAngle = playerAngle[i] + PI + (2*randFloat()-1)*PI/8;
@ -116,7 +94,7 @@ for(i=0; i<NUM_PLAYERS; i++) {
rampX = round(fx + rampDist * cos(rampAngle)); rampX = round(fx + rampDist * cos(rampAngle));
rampY = round(fy + rampDist * sin(rampAngle)); rampY = round(fy + rampDist * sin(rampAngle));
placer = new ClumpPlacer(80, 0.9, 0.5, 0, rampX, rampY); placer = new ClumpPlacer(80, 0.9, 0.5, 0, rampX, rampY);
painter = [new TerrainPainter(tGrass), new SmoothElevationPainter(ELEVATION_SET, elevation/3, 5)]; painter = [new TerrainPainter(tGrass), new SmoothElevationPainter(ELEVATION_SET, (elevation-10)/3+10, 5)];
createArea(placer, painter, null); createArea(placer, painter, null);
// create the central dirt patch // create the central dirt patch
@ -131,71 +109,58 @@ for(i=0; i<NUM_PLAYERS; i++) {
group = new SimpleGroup( group = new SimpleGroup(
[ // elements (type, count, distance) [ // elements (type, count, distance)
new SimpleObject("hele_cc", 1, 0), new SimpleObject("hele_cc", 1, 0),
new SimpleObject("hele_iar_b", 3, 5) new SimpleObject("hele_isp_b", 3, 5)
], ],
true, // avoid self
null, // tile class null, // tile class
ix, iy // position ix, iy // position
); );
createObjectGroup(group, null); createObjectGroup(group, i);
// maybe do other stuff, like sheep and villies? // maybe do other stuff, like sheep and villies?
} }
// create lakes // create lakes
println("Creating lakes..."); println("Creating lakes...");
placer = new ClumpPlacer(170, 0.5, 0.1, 0); placer = new ClumpPlacer(170, 0.6, 0.1, 0);
painter = new LayeredPainter( terrainPainter = new LayeredPainter(
[1,1,3], // widths [1,1], // widths
[tGrassDirt50, tShore, tWater, tWaterDeep] // terrains [tGrassDirt50, tShore, tWaterDeep] // terrains
); );
createAreas(placer, [painter, new TileClassPainter(clWater)], elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 5, 2);
[ createAreas(placer, [terrainPainter, elevationPainter, paintClass(clWater)],
new AvoidTileClassConstraint(clPlayer, 2), avoidClasses(clPlayer, 2, clWater, 13),
new AvoidTileClassConstraint(clWater, 13)
],
round(1.5 * NUM_PLAYERS) round(1.5 * NUM_PLAYERS)
); );
// create bumps // create bumps
println("Creating bumps..."); println("Creating bumps...");
placer = new ClumpPlacer(10, 0.3, 0.06, 0); placer = new ClumpPlacer(10, 0.3, 0.06, 0);
painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2.5, 2); painter = new SmoothElevationPainter(ELEVATION_MODIFY, 3, 2);
createAreas(placer, painter, createAreas(placer, painter,
new AvoidTileClassConstraint(clWater, 2), avoidClasses(clWater, 2),
SIZE*SIZE/300 SIZE*SIZE/200
); );
// create forests // create forests
println("Creating forests..."); println("Creating forests...");
placer = new ClumpPlacer(30, 0.2, 0.06, 0); placer = new ClumpPlacer(30, 0.2, 0.06, 0);
painter = new LayeredPainter([2], [[tGrass, tForest], tForest]); painter = new LayeredPainter([2], [[tGrass, tForest], tForest]);
createAreas(placer, [painter, new TileClassPainter(clForest)], createAreas(placer, [painter, paintClass(clForest)],
[ avoidClasses(clPlayer, 2, clWater, 5, clForest, 5),
new AvoidTileClassConstraint(clPlayer, 2),
new AvoidTileClassConstraint(clWater, 5),
new AvoidTileClassConstraint(clForest, 5),
],
8 * NUM_PLAYERS 8 * NUM_PLAYERS
); );
// create forests // create forests
println("Creating hills..."); println("Creating hills...");
placer = new ClumpPlacer(60, 0.4, 0.1, 0); placer = new ClumpPlacer(60, 0.2, 0.1, 0);
terrainPainter = new LayeredPainter( terrainPainter = new LayeredPainter(
[3], // widths [3], // widths
[tCliff, tGrass] // terrains [tCliff, tGrass] // terrains
); );
elevationPainter = new SmoothElevationPainter( elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 32, 2);
ELEVATION_SET, // type createAreas(placer, [terrainPainter, elevationPainter, paintClass(clHill)],
9, // elevation avoidClasses(clPlayer, 2, clWater, 5, clForest, 5),
2 // blend radius
);
createAreas(placer, [terrainPainter, elevationPainter, new TileClassPainter(clHill)],
[
new AvoidTileClassConstraint(clPlayer, 2),
new AvoidTileClassConstraint(clWater, 5),
new AvoidTileClassConstraint(clForest, 5),
],
3 * NUM_PLAYERS 3 * NUM_PLAYERS
); );
@ -205,47 +170,28 @@ var sizes = [25,45,70];
for(i=0; i<sizes.length; i++) { for(i=0; i<sizes.length; i++) {
placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0); placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0);
painter = new LayeredPainter([1,1], [tGrassDirt75,tGrassDirt50,tGrassDirt25]); painter = new LayeredPainter([1,1], [tGrassDirt75,tGrassDirt50,tGrassDirt25]);
createAreas(placer, [painter, new TileClassPainter(clDirt)], createAreas(placer, [painter, paintClass(clDirt)],
[ avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0),
new AvoidTileClassConstraint(clWater, 1),
new AvoidTileClassConstraint(clForest, 0),
new AvoidTileClassConstraint(clHill, 0),
new AvoidTileClassConstraint(clDirt, 5),
new AvoidTileClassConstraint(clPlayer, 0)
],
SIZE*SIZE/6000 SIZE*SIZE/6000
); );
} }
// create straggler trees // create straggler trees
println("Creating straggler trees..."); println("Creating straggler trees...");
group = new SimpleGroup([new SimpleObject(oTree, 1, 0)], null); group = new SimpleGroup([new SimpleObject(oTree, 1, 0)]);
createObjectGroups(group, createObjectGroups(group, 0,
[ avoidClasses(clWater, 1, clForest, 0, clHill, 0, clPlayer, 0),
new AvoidTileClassConstraint(clForest, 1),
new AvoidTileClassConstraint(clWater, 1),
new AvoidTileClassConstraint(clHill, 0),
new AvoidTileClassConstraint(clPlayer, 1)
],
SIZE*SIZE/7000 SIZE*SIZE/7000
); );
// create grass tufts // create grass tufts
println("Creating grass tufts..."); println("Creating grass tufts...");
group = new SimpleGroup( group = new SimpleGroup([
[ new SimpleObject(oGrass, 2, 0.4),
new SimpleObject(oGrass, 2, 0.4), new SimpleObject(oGrass, 2, 1.1),
new SimpleObject(oGrass, 2, 1.1), new SimpleObject(oGrass, 3, 2.0)
new SimpleObject(oGrass, 3, 2.0), ]);
], createObjectGroups(group, 0,
null avoidClasses(clWater, 1, clForest, 0, clHill, 0, clPlayer, 0),
);
createObjectGroups(group,
[
new AvoidTileClassConstraint(clForest, 1),
new AvoidTileClassConstraint(clWater, 1),
new AvoidTileClassConstraint(clHill, 0),
new AvoidTileClassConstraint(clPlayer, 1)
],
SIZE*SIZE/2500 SIZE*SIZE/2500
); );

View File

@ -12,13 +12,19 @@ const
TYPE_SMOOTH_ELEVATION_PAINTER = 9, TYPE_SMOOTH_ELEVATION_PAINTER = 9,
TYPE_SIMPLE_GROUP = 10, TYPE_SIMPLE_GROUP = 10,
TYPE_AVOID_TILE_CLASS_CONSTRAINT = 11, TYPE_AVOID_TILE_CLASS_CONSTRAINT = 11,
TYPE_TILE_CLASS_PAINTER = 12; TYPE_TILE_CLASS_PAINTER = 12,
TYPE_STAY_IN_TILE_CLASS_CONSTRAINT = 13,
TYPE_BORDER_TILE_CLASS_CONSTRAINT = 14;
// SmoothElevationPainter constants // SmoothElevationPainter constants
const ELEVATION_SET = 0; const ELEVATION_SET = 0;
const ELEVATION_MODIFY = 1; const ELEVATION_MODIFY = 1;
// PI
const PI = Math.PI;
// initFromScenario constants // initFromScenario constants
const LOAD_NOTHING = 0; const LOAD_NOTHING = 0;
@ -29,6 +35,38 @@ const LOAD_ALL = LOAD_TERRAIN | LOAD_INTERACTIVES | LOAD_NON_INTERACTIVES;
// Utility functions // Utility functions
function fractionToTiles(f) {
return getMapSize() * f;
}
function tilesToFraction(t) {
return t / getMapSize();
}
function fractionToSize(f) {
return getMapSize() * getMapSize() * f;
}
function sizeToFraction(s) {
return s / getMapSize() / getMapSize();
}
function cos(x) {
return Math.cos(x);
}
function sin(x) {
return Math.sin(x);
}
function tan(x) {
return Math.sin(x);
}
function round(x) {
return Math.round(x);
}
function println(x) { function println(x) {
print(x); print(x);
print("\n"); print("\n");
@ -55,11 +93,12 @@ function chooseRand() {
return ar[randInt(ar.length)]; return ar[randInt(ar.length)];
} }
function createAreas(centeredPlacer, painter, constraint, num, maxFail) { function createAreas(centeredPlacer, painter, constraint, num, retryFactor) {
if(maxFail == undefined) { if(retryFactor == undefined) {
maxFail = 10 * num; retryFactor = 10;
} }
var maxFail = num * retryFactor;
var good = 0; var good = 0;
var bad = 0; var bad = 0;
var ret = new Array(); var ret = new Array();
@ -75,20 +114,22 @@ function createAreas(centeredPlacer, painter, constraint, num, maxFail) {
bad++; bad++;
} }
} }
return ret; return ret;
} }
function createObjectGroups(placer, constraint, num, maxFail) { function createObjectGroups(placer, player, constraint, num, retryFactor) {
if(maxFail == undefined) { if(retryFactor == undefined) {
maxFail = 10 * num; retryFactor = 10;
} }
var maxFail = num * retryFactor;
var good = 0; var good = 0;
var bad = 0; var bad = 0;
while(good < num && bad <= maxFail) { while(good < num && bad <= maxFail) {
placer.x = randInt(SIZE); placer.x = randInt(SIZE);
placer.y = randInt(SIZE); placer.y = randInt(SIZE);
var r = createObjectGroup(placer, constraint); var r = createObjectGroup(placer, player, constraint);
if(r) { if(r) {
good++; good++;
} }
@ -171,6 +212,19 @@ function AvoidTileClassConstraint(tileClass, distance) {
this.distance = distance; this.distance = distance;
} }
function StayInTileClassConstraint(tileClass, distance) {
this.TYPE = TYPE_STAY_IN_TILE_CLASS_CONSTRAINT;
this.tileClass = tileClass;
this.distance = distance;
}
function BorderTileClassConstraint(tileClass, distanceInside, distanceOutside) {
this.TYPE = TYPE_BORDER_TILE_CLASS_CONSTRAINT;
this.tileClass = tileClass;
this.distanceInside = distanceInside;
this.distanceOutside = distanceOutside;
}
// Object groups // Object groups
function SimpleObject(type, count, distance) { function SimpleObject(type, count, distance) {
@ -179,9 +233,10 @@ function SimpleObject(type, count, distance) {
this.distance = distance; this.distance = distance;
} }
function SimpleGroup(elements, tileClass, x, y) { function SimpleGroup(elements, avoidSelf, tileClass, x, y) {
this.TYPE = TYPE_SIMPLE_GROUP; this.TYPE = TYPE_SIMPLE_GROUP;
this.elements = elements; this.elements = elements;
this.avoidSelf = avoidSelf!=undefined ? avoidSelf : false;
this.tileClass = tileClass!=undefined ? tileClass : null; this.tileClass = tileClass!=undefined ? tileClass : null;
this.x = x!=undefined ? x : -1; this.x = x!=undefined ? x : -1;
this.y = x!=undefined ? y : -1; this.y = x!=undefined ? y : -1;