1
0
forked from mirrors/0ad

Polishing the Random Maps: Aegean Sea and Alpine Valley

This was SVN commit r13611.
This commit is contained in:
Spahbod
2013-07-29 12:52:31 +00:00
parent 629492625f
commit 992a8ee0b8
3 changed files with 267 additions and 143 deletions
@@ -366,7 +366,7 @@ RMS.SetProgress(60);
//create the undersea bumps
log("Creating undersea bumps...");
placer = new ClumpPlacer(scaleByMapSize(40, 100), 0.3, 0.06, 1);
painter = new SmoothElevationPainter(ELEVATION_SET, -1.1, 3);
painter = new SmoothElevationPainter(ELEVATION_SET, -1.6, 3);
createAreas(
placer,
[painter, paintClass(clCorals)],
@@ -392,7 +392,7 @@ createAreas(
//paint the seabed
paintTerrainBasedOnHeight(-20, -3, 3, tSeaDepths);
paintTerrainBasedOnHeight(-3, -2, 2, tCorals2);
paintTerrainBasedOnHeight(-2, -1, 2, tCorals1);
paintTerrainBasedOnHeight(-2, -1.5, 2, tCorals1);
log("Creating island stone mines...");
// create island large stone quarries
@@ -1,17 +1,22 @@
//we still have got some problems in 4269
RMS.LoadLibrary("rmgen");
TILE_CENTERED_HEIGHT_MAP = true;
var rt = randInt(1,2);
if (rt == 1)
//set up the random terrain
var random_terrain = randInt(1,2);
//late spring
if (random_terrain == 1)
{
var tGrass = ["alpine_dirt_grass_50"];
var tGrassPForest = "alpine_forrestfloor";
var tGrassDForest = "alpine_forrestfloor";
var tPrimary = ["alpine_dirt_grass_50"];
var tForestFloor = "alpine_forrestfloor";
var tCliff = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"];
var tGrassA = "alpine_grass_rocky";
var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"];
var tGrassC = ["alpine_snow_a", "alpine_snow_b"];
var tDirt = ["alpine_dirt", "alpine_grass_d"];
var tSecondary = "alpine_grass_rocky";
var tHalfSnow = ["alpine_grass_snow_50", "alpine_dirt_snow"];
var tSnowLimited = ["alpine_snow_rocky"];
var tDirt = "alpine_dirt";
var tRoad = "new_alpine_citytile";
var tRoadWild = "new_alpine_citytile";
var tShore = "alpine_shore_rocks_grass_50";
@@ -22,23 +27,29 @@ if (rt == 1)
var oBerryBush = "gaia/flora_bush_berry";
var oChicken = "gaia/fauna_chicken";
var oDeer = "gaia/fauna_deer";
var oGoat = "gaia/fauna_goat";
var oFish = "gaia/fauna_fish";
var oRabbit = "gaia/fauna_rabbit";
var oStoneLarge = "gaia/geology_stonemine_alpine_quarry";
var oStoneSmall = "gaia/geology_stone_alpine_a";
var oMetalLarge = "gaia/geology_metal_alpine_slabs";
// decorative props
var aGrass = "actor|props/flora/grass_soft_small_tall.xml";
var aGrassShort = "actor|props/flora/grass_soft_large.xml";
var aRockLarge = "actor|geology/stone_granite_med.xml";
var aRockMedium = "actor|geology/stone_granite_med.xml";
var aBushMedium = "actor|props/flora/bush_medit_me.xml";
var aBushSmall = "actor|props/flora/bush_medit_sm.xml";
}
else
//winter
{
var tGrass = ["alpine_snow_a", "alpine_snow_b"];
var tGrassPForest = "alpine_forrestfloor_snow";
var tGrassDForest = "alpine_forrestfloor_snow";
var tCliff = ["alpine_cliff_a", "alpine_cliff_b"];
var tGrassA = "alpine_grass_snow_50";
var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"];
var tGrassC = ["alpine_snow_rocky"];
var tDirt = ["alpine_dirt_snow", "alpine_snow_a"];
var tPrimary = ["alpine_snow_a", "alpine_snow_b"];
var tForestFloor = "alpine_forrestfloor_snow";
var tCliff = ["alpine_cliff_snow"];
var tSecondary = "alpine_grass_snow_50";
var tHalfSnow = ["alpine_grass_snow_50", "alpine_dirt_snow"];
var tSnowLimited = ["alpine_snow_a", "alpine_snow_b"];
var tDirt = "alpine_dirt";
var tRoad = "new_alpine_citytile";
var tRoadWild = "new_alpine_citytile";
var tShore = "alpine_shore_rocks_icy";
@@ -49,39 +60,34 @@ else
var oBerryBush = "gaia/flora_bush_berry";
var oChicken = "gaia/fauna_chicken";
var oDeer = "gaia/fauna_deer";
var oGoat = "gaia/fauna_goat";
var oFish = "gaia/fauna_fish";
var oRabbit = "gaia/fauna_rabbit";
var oStoneLarge = "gaia/geology_stonemine_alpine_quarry";
var oStoneSmall = "gaia/geology_stone_alpine_a";
var oMetalLarge = "gaia/geology_metal_alpine_slabs";
// decorative props
var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml";
var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml";
var aRockLarge = "actor|geology/stone_granite_med.xml";
var aRockMedium = "actor|geology/stone_granite_med.xml";
var aBushMedium = "actor|props/flora/bush_medit_me_dry.xml";
var aBushSmall = "actor|props/flora/bush_medit_sm_dry.xml";
}
// decorative props
var aGrass = "actor|props/flora/grass_soft_small_tall.xml";
var aGrassShort = "actor|props/flora/grass_soft_large.xml";
var aRockLarge = "actor|geology/stone_granite_med.xml";
var aRockMedium = "actor|geology/stone_granite_med.xml";
var aReeds = "actor|props/flora/reeds_pond_lush_a.xml";
var aLillies = "actor|props/flora/water_lillies.xml";
var aBushMedium = "actor|props/flora/bush_medit_me.xml";
var aBushSmall = "actor|props/flora/bush_medit_sm.xml";
var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oPine, tGrassDForest];
var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest];
//other constants
const pForest = [tForestFloor + TERRAIN_SEPARATOR + oPine, tForestFloor];
const BUILDING_ANGlE = -PI/4;
// initialize map
log("Initializing map...");
InitMap();
var numPlayers = getNumPlayers();
var mapSize = getMapSize();
var mapArea = mapSize*mapSize;
const numPlayers = getNumPlayers();
const mapSize = getMapSize();
const mapArea = mapSize*mapSize;
// create tile classes
var clPlayer = createTileClass();
var clHill = createTileClass();
var clForest = createTileClass();
@@ -92,15 +98,15 @@ var clMetal = createTileClass();
var clFood = createTileClass();
var clBaseResource = createTileClass();
var clSettlement = createTileClass();
var clPass = createTileClass();
//cover the ground with the primary terrain chosen in the beginning
for (var ix = 0; ix < mapSize; ix++)
{
for (var iz = 0; iz < mapSize; iz++)
{
var x = ix / (mapSize + 1.0);
var z = iz / (mapSize + 1.0);
placeTerrain(ix, iz, tGrass);
placeTerrain(ix, iz, tPrimary);
}
}
@@ -113,7 +119,6 @@ for (var i = 0; i < numPlayers; i++)
playerIDs = sortPlayers(playerIDs);
// place players
var playerX = new Array(numPlayers);
var playerZ = new Array(numPlayers);
var playerAngle = new Array(numPlayers);
@@ -236,17 +241,140 @@ for (var i = 0; i < numPlayers; i++)
RMS.SetProgress(20);
//create hills
log ("Creating hills...");
for (var i = 0; i < scaleByMapSize(15,40); i++)
//place the mountains
var points = [];
var edgesConncetedToPoints = [];
//we want the points near the start locations be the first ones. hence we use two "for" blocks
for (var i = 0; i < numPlayers; ++i)
{
var ix = randInt(1, mapSize - 1);
var iz = randInt(1, mapSize - 1);
var ix2 = randInt(1, mapSize - 1);
var iz2 = randInt(1, mapSize - 1);
var placer = new PathPlacer(ix, iz, ix2, iz2, scaleByMapSize(7,13), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.1);
playerAngle[i] = startAngle + (i+0.5)*TWO_PI/numPlayers;
points.push([round(fractionToTiles(0.5 + 0.49 * cos(playerAngle[i]))), round(fractionToTiles(0.5 + 0.49 * sin(playerAngle[i])))]);
}
//the order of the other points doesn't matter
for (var i = 0; i < numPlayers; ++i)
{
playerAngle[i] = startAngle + (i+0.7)*TWO_PI/numPlayers;
points.push([round(fractionToTiles(0.5 + 0.34 * cos(playerAngle[i]))), round(fractionToTiles(0.5 + 0.34 * sin(playerAngle[i])))]);
playerAngle[i] = startAngle + (i+0.3)*TWO_PI/numPlayers;
points.push([round(fractionToTiles(0.5 + 0.34 * cos(playerAngle[i]))), round(fractionToTiles(0.5 + 0.34 * sin(playerAngle[i])))]);
playerAngle[i] = startAngle + (i+0.5)*TWO_PI/numPlayers;
points.push([round(fractionToTiles(0.5 + 0.18 * cos(playerAngle[i]))), round(fractionToTiles(0.5 + 0.18 * sin(playerAngle[i])))]);
}
//add the center of the map
points.push([round(fractionToTiles(0.5)), round(fractionToTiles(0.5))]);
var numPoints = numPlayers * 4 + 1;
for (var i = 0; i < numPoints; ++i)
{
edgesConncetedToPoints.push(0);
}
//we are making a planar graph where every edge is a straight line.
var possibleEdges = [];
//add all of the possible combinations
for (var i = 0; i < numPoints; ++i)
{
for (var j = numPlayers; j < numPoints; ++j)
{
if (j > i)
possibleEdges.push([i,j]);
}
}
//we need a matrix so that we can prevent the mountain ranges from bocking a player
var matrix = []
for (var i = 0; i < numPoints; ++i)
{
matrix.push([]);
for (var j = 0; j < numPoints; ++j)
{
if (i < numPlayers && j < numPlayers && i != j && (i == j - 1 || i == j + 1) )
matrix[i].push(true);
else
matrix[i].push(false);
}
}
//find and place the edges
while (possibleEdges.length > 0)
{
var index = randInt(0, possibleEdges.length - 1);
//ensure that a point is connected to a maximum of 3 others
if (edgesConncetedToPoints[possibleEdges[index][0]] > 2 || edgesConncetedToPoints[possibleEdges[index][1]] > 2)
{
possibleEdges.splice(index,1);
continue;
}
//dfs
var q = [possibleEdges[index][0]];
matrix[possibleEdges[index][0]][possibleEdges[index][1]] = true;
matrix[possibleEdges[index][1]][possibleEdges[index][0]] = true;
var selected, accept = true, tree = [], backtree = [];
while (q.length > 0)
{
selected = q.shift();
//log ("Selected " + selected + " from the queue");
if (tree.indexOf(selected) == -1)
{
//log ("First time of then new tree.")
tree.push(selected);
backtree.push(-1);
}
for (var i = 0; i < numPoints; ++i)
{
if (matrix[selected][i])
{
//log ("Current tree is:" + "[" + tree.toString() + "]");
//log ("Checking " + i + ", comparing with " + selected);
if (i == backtree[tree.indexOf(selected)])
{
//log (i + " is a child of " + selected);
continue;
}
else if (tree.indexOf(i) == -1)
{
tree.push(i);
backtree.push(selected);
q.unshift(i);
//log ("Added " + i + " to the queue");
//log ("Current tree is:" + "[" + tree.toString() + "]");
}
else
{
//log (i + " already exists in the tree. Not Accepting.");
accept = false;
matrix[possibleEdges[index][0]][possibleEdges[index][1]] = false;
matrix[possibleEdges[index][1]][possibleEdges[index][0]] = false;
break;
}
}
}
}
if (!accept)
{
possibleEdges.splice(index,1);
continue;
}
var ix = points[possibleEdges[index][0]][0];
var iz = points[possibleEdges[index][0]][1];
var ix2 = points[possibleEdges[index][1]][0];
var iz2 = points[possibleEdges[index][1]][1];
var placer = new PathPlacer(ix, iz, ix2, iz2, scaleByMapSize(9,15), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.1, 0.1);
var terrainPainter = new LayeredPainter(
[tCliff, tGrass], // terrains
[tCliff, tPrimary], // terrains
[3] // widths
);
var elevationPainter = new SmoothElevationPainter(
@@ -254,67 +382,70 @@ for (var i = 0; i < scaleByMapSize(15,40); i++)
30, // elevation
2 // blend radius
);
createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 15));
}
//create passages
log ("Creating passages...");
for (var i = 0; i < numPlayers; i++)
{
if (i+1 == numPlayers)
accept = createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 20));
if (accept == null)
{
var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[0]), fractionToTiles(playerZ[0]), scaleByMapSize(12,25), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0);
matrix[possibleEdges[index][0]][possibleEdges[index][1]] = false;
matrix[possibleEdges[index][1]][possibleEdges[index][0]] = false;
possibleEdges.splice(index,1);
continue;
}
else
{
var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[i+1]), fractionToTiles(playerZ[i+1]), scaleByMapSize(12,25), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0);
placer = new ClumpPlacer(floor(PI*scaleByMapSize(9,15)*scaleByMapSize(9,15)/4), 0.95, 0.6, 10, ix, iz);
var terrainPainter = new LayeredPainter(
[tCliff, tPrimary], // terrains
[3] // widths
);
var elevationPainter = new SmoothElevationPainter(
ELEVATION_SET, // type
30, // elevation
2 // blend radius
);
createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 5));
placer = new ClumpPlacer(floor(PI*scaleByMapSize(9,15)*scaleByMapSize(9,15)/4), 0.95, 0.6, 10, ix2, iz2);
var terrainPainter = new LayeredPainter(
[tCliff, tPrimary], // terrains
[3] // widths
);
var elevationPainter = new SmoothElevationPainter(
ELEVATION_SET, // type
30, // elevation
2 // blend radius
);
createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 5));
}
var terrainPainter = new LayeredPainter(
[tGrass, tGrass], // terrains
[1] // widths
);
var elevationPainter = new SmoothElevationPainter(
ELEVATION_SET, // type
3, // elevation
2 // blend radius
);
createArea(placer, [terrainPainter, elevationPainter, paintClass(clPass)], null);
log (possibleEdges[index][0] + ", " + possibleEdges[index][1]);
for (var i = 0; i < possibleEdges.length; ++i)
{
if (possibleEdges[index][0] != possibleEdges[i][0] && possibleEdges[index][1] != possibleEdges[i][0] &&
possibleEdges[index][0] != possibleEdges[i][1] && possibleEdges[index][1] != possibleEdges[i][1])
{
if (checkIfIntersect (points[possibleEdges[index][0]][0], points[possibleEdges[index][0]][1],
points[possibleEdges[index][1]][0], points[possibleEdges[index][1]][1], points[possibleEdges[i][0]][0],
points[possibleEdges[i][0]][1], points[possibleEdges[i][1]][0], points[possibleEdges[i][1]][1], scaleByMapSize(9,15) + scaleByMapSize(10,15)))
{
possibleEdges.splice(i,1);
--i;
if (index > i)
--index;
}
}
}
edgesConncetedToPoints[possibleEdges[index][0]] += 1;
edgesConncetedToPoints[possibleEdges[index][1]] += 1;
possibleEdges.splice(index,1);
}
//create rivers
log ("Creating rivers...");
for (var m = 0; m < scaleByMapSize(1,3)*randInt(3,4); m++)
{
var tang = randFloat(0, TWO_PI);
var placer = new PathPlacer(fractionToTiles(0.5), fractionToTiles(0.5), fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)), scaleByMapSize(10,20), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.05);
var terrainPainter = new LayeredPainter(
[tShore, tWater, tWater], // terrains
[1, 3] // widths
);
var elevationPainter = new SmoothElevationPainter(
ELEVATION_SET, // type
-4, // elevation
4 // blend radius
);
createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 15));
placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)));
var painter = new LayeredPainter([tWater, tWater], [1]);
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 4);
createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 15));
}
paintTerrainBasedOnHeight(3.1, 40, 0, tCliff);
for (var i = 0; i < numPlayers; i++)
{
if (i+1 == numPlayers)
{
passageMaker(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[0]), fractionToTiles(playerZ[0]), 6, -2, -2, 2, undefined ,undefined , -4)
}
else
{
passageMaker(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[i+1]), fractionToTiles(playerZ[i+1]), 6, -2, -2, 2,undefined ,undefined , -4)
}
}
paintTerrainBasedOnHeight(3.1, 29, 0, tCliff);
paintTerrainBasedOnHeight(29, 30, 3, tSnowLimited);
// create bumps
log("Creating bumps...");
@@ -329,22 +460,20 @@ createAreas(
// create hills
log("Creating hills...");
placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
terrainPainter = new LayeredPainter(
[tGrass, tCliff, tGrass], // terrains
[1, 2] // widths
placer = new ClumpPlacer(scaleByMapSize(40, 150), 0.2, 0.1, 1);
var terrainPainter = new LayeredPainter(
[tCliff, tSnowLimited], // terrains
[2] // widths
);
elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 27, 2);
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 30, 2);
createAreas(
placer,
[terrainPainter, elevationPainter, paintClass(clHill)],
avoidClasses(clPlayer, 12, clHill, 15, clWater, 2, clPass, 1),
scaleByMapSize(1, 4) * numPlayers
avoidClasses(clPlayer, 20, clHill, 14),
scaleByMapSize(10, 80) * numPlayers
);
// calculate desired number of trees for map (based on size)
var MIN_TREES = 500;
var MAX_TREES = 3000;
var P_FOREST = 0.7;
@@ -356,12 +485,9 @@ var numStragglers = totalTrees * (1.0 - P_FOREST);
// create forests
log("Creating forests...");
var types = [
[[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]],
[[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]]
[[tForestFloor, tPrimary, pForest], [tForestFloor, pForest]]
]; // some variation
var size = numForest / (scaleByMapSize(2,8) * numPlayers);
var num = floor(size / types.length);
@@ -375,7 +501,7 @@ for (var i = 0; i < types.length; ++i)
createAreas(
placer,
[painter, paintClass(clForest)],
avoidClasses(clPlayer, 12, clForest, 10, clHill, 0, clWater, 2, clPass, 1),
avoidClasses(clPlayer, 12, clForest, 10, clHill, 0, clWater, 2),
num
);
}
@@ -389,8 +515,8 @@ for (var i = 0; i < sizes.length; i++)
{
placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
painter = new LayeredPainter(
[[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains
[1,1] // widths
[[tDirt,tHalfSnow], [tHalfSnow,tSnowLimited]], // terrains
[2] // widths
);
createAreas(
placer,
@@ -406,7 +532,7 @@ var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)
for (var i = 0; i < sizes.length; i++)
{
placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
painter = new TerrainPainter(tGrassB);
painter = new TerrainPainter(tSecondary);
createAreas(
placer,
painter,
@@ -480,6 +606,17 @@ createObjectGroups(group, 0,
3 * numPlayers, 50
);
// create berry bush
log("Creating berry bush...");
group = new SimpleGroup(
[new SimpleObject(oBerryBush, 5,7, 0,4)],
true, clFood
);
createObjectGroups(group, 0,
avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10),
randInt(1, 4) * numPlayers + 2, 50
);
// create rabbit
log("Creating rabbit...");
group = new SimpleGroup(
@@ -491,17 +628,6 @@ createObjectGroups(group, 0,
3 * numPlayers, 50
);
// create fish
log("Creating fish...");
group = new SimpleGroup(
[new SimpleObject(oFish, 2,3, 0,2)],
true, clFood
);
createObjectGroups(group, 0,
[avoidClasses(clFood, 20), stayClasses(clWater, 6)],
11 * numPlayers, 60
);
RMS.SetProgress(85);
@@ -558,17 +684,15 @@ createObjectGroups(group, 0,
planetm * scaleByMapSize(13, 200), 50
);
var rt = randInt(1,3)
if (rt==1){
setSkySet("cirrus");
random_terrain = randInt(1,3)
if (random_terrain==1){
setSkySet("cirrus");
}
else if (rt ==2){
setSkySet("cumulus");
else if (random_terrain ==2){
setSkySet("cumulus");
}
else if (rt ==3){
setSkySet("sunny");
else if (random_terrain ==3){
setSkySet("sunny");
}
setSunRotation(randFloat(0, TWO_PI));
setSunElevation(randFloat(PI/ 5, PI / 3));
File diff suppressed because one or more lines are too long