mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 05:13:58 -07:00
Implement random map script playerbase function.
Unifies 54 variants of the rmgen playerbase code, fixes #4805. Add retry loops to prevent collisions of starting resources, fixes #4600 and resources placed outside of the map area, fixes #4796. Lays the foundation to test for collisions with Iberian walls, refs #2192 and allows to rearrange the starting resources on all random maps without being confronted with code. Delete remains of misc.js, leaving the rmgen files sorted by logic, fixes #4804. Concludes what was started in5f1736cbd4,f98100bdaf, specifically the 82 rmgen commits startingf2550705d3,376d8b3d1e. Uses vector algebra, refs #4845. Removes many Math proxy calls, refs #4933. Removes 35 unused elevation and 24 unused cliffRadius variables, demonstrating the copy&paste antipattern. Reduce iberian-wall hardcoding to one line, refs #4940. This was SVN commit r20815.
This commit is contained in:
parent
8d01af48ad
commit
921850cdef
62 changed files with 1949 additions and 4160 deletions
|
|
@ -62,84 +62,33 @@ var clHill = createTileClass();
|
|||
var clIsland = createTileClass();
|
||||
var clCorals = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.6);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.floor(fx);
|
||||
var iz = Math.floor(fz);
|
||||
addToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementRiver(0, 0.6),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tCityPlaza,
|
||||
"innerTerrain": tCity
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oCarob,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aBush1
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oCarob, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius);
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(30);
|
||||
|
||||
paintRiver({
|
||||
|
|
@ -310,7 +259,7 @@ createFood(
|
|||
scaleByMapSize(5, 20),
|
||||
scaleByMapSize(5, 20)
|
||||
],
|
||||
avoidClasses(clForest, 0, clPlayer, 8, clWater, 1, clFood, 10, clHill, 1),
|
||||
avoidClasses(clForest, 0, clPlayer, 8, clBaseResource, 4, clWater, 1, clFood, 10, clHill, 1),
|
||||
clFood);
|
||||
|
||||
createFood(
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ InitMap();
|
|||
|
||||
const numPlayers = getNumPlayers();
|
||||
const mapSize = getMapSize();
|
||||
Engine.SetProgress(20);
|
||||
|
||||
var clPlayer = createTileClass();
|
||||
var clHill = createTileClass();
|
||||
|
|
@ -54,74 +53,41 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tPrimary,tCitytiles], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
createStoneMineFormation(mX, mZ, oStoneSmall, tDirt4);
|
||||
addToClass(mX, mZ, clPlayer);
|
||||
|
||||
// create starting trees
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oBaobab, 2,7)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tPrimary,
|
||||
"innerTerrain": tCitytiles
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{
|
||||
"template": oMetalLarge
|
||||
},
|
||||
{
|
||||
"type": "stone_formation",
|
||||
"template": oStoneSmall,
|
||||
"terrain": tDirt4
|
||||
}
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oBaobab,
|
||||
"count": scaleByMapSize(3, 12),
|
||||
"minDistGroup": 2,
|
||||
"maxDistGroup": 6,
|
||||
"minDist": 15,
|
||||
"maxDist": 16
|
||||
}
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
createHills([tDirt2, tCliff, tGrassShrubs], avoidClasses(clPlayer, 35, clForest, 20, clHill, 20, clWater, 2), clHill, scaleByMapSize(5, 8));
|
||||
|
|
|
|||
|
|
@ -100,84 +100,33 @@ var clBaseResource = createTileClass();
|
|||
|
||||
initTerrain(tPrimary);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 100);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oPine, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oPine,
|
||||
"count": scaleByMapSize(3, 12)
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
log("Creating hills...");
|
||||
|
|
|
|||
|
|
@ -302,83 +302,34 @@ var mountainHeight = 30;
|
|||
|
||||
initTerrain(tPrimary);
|
||||
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 100);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oPine, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oPine
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
new MountainRangeBuilder({
|
||||
|
|
|
|||
|
|
@ -41,84 +41,32 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oPoplar
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 100);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oPoplar, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
});
|
||||
|
||||
Engine.SetProgress(20);
|
||||
|
||||
|
|
@ -268,7 +216,7 @@ group = new SimpleGroup(
|
|||
[new SimpleObject(aGrass, 2,4, 0,1.8, -PI/8,PI/8), new SimpleObject(aGrassShort, 3,6, 1.2,2.5, -PI/8,PI/8)]
|
||||
);
|
||||
createObjectGroupsDeprecated(group, 0,
|
||||
avoidClasses(clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0),
|
||||
avoidClasses(clHill, 2, clPlayer, 10, clDirt, 1, clForest, 0),
|
||||
scaleByMapSize(13, 200)
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ var shoreHeight = 1;
|
|||
|
||||
var islandRadius = scaleByMapSize(22, 31);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
|
||||
log("Creating player islands...");
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
|
|
@ -99,90 +99,46 @@ paintTerrainBasedOnHeight(landHeight - 0.6, landHeight + 0.4, 3, tMainTerrain);
|
|||
paintTerrainBasedOnHeight(shoreHeight, landHeight, 0, tShore);
|
||||
paintTerrainBasedOnHeight(getMapBaseHeight(), shoreHeight, 2, tWater);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = islandRadius;
|
||||
|
||||
var hillSize = PI * radius * radius;
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create woods
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 13;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oWoodTreasure, 14,14, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 100);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, [painter, paintClass(clPlayer)]);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
// PlayerTileClass marked below
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": "towers",
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad,
|
||||
"radius": islandRadius / 3,
|
||||
"painters": [
|
||||
paintClass(clPlayer)
|
||||
]
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Treasures": {
|
||||
"types": [
|
||||
{
|
||||
"template": oWoodTreasure,
|
||||
"count": 14
|
||||
}
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1,
|
||||
"count": scaleByMapSize(15, 30)
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort,
|
||||
}
|
||||
});
|
||||
|
||||
createBumps([avoidClasses(clPlayer, 10), stayClasses(clLand, 5)]);
|
||||
|
||||
|
|
|
|||
|
|
@ -53,98 +53,41 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (let i = 0; i < numPlayers; i++)
|
||||
{
|
||||
log("Creating base for player " + playerIDs[i]);
|
||||
let radius = scaleByMapSize(15, 25);
|
||||
|
||||
// Get the x and z in tiles
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
let fz = fractionToTiles(playerZ[i]);
|
||||
let ix = Math.round(fx);
|
||||
let iz = Math.round(fz);
|
||||
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// Create the city patch
|
||||
let cityRadius = radius / 3;
|
||||
createArea(
|
||||
new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz),
|
||||
new LayeredPainter([tPrimary, tSecondary], [1]),
|
||||
null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, playerIDs[i]);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource, undefined, oRabbit);
|
||||
|
||||
// Create berry bushes
|
||||
let bbAngle = randFloat(0, 2 * PI);
|
||||
let bbDist = 12;
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5, 5, 0, 3)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + bbDist * Math.cos(bbAngle)),
|
||||
Math.round(fz + bbDist * Math.sin(bbAngle))),
|
||||
0);
|
||||
|
||||
// Create metal mine
|
||||
let mAngle = bbAngle + randFloat(PI / 3, PI);
|
||||
let mDist = 12;
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1, 1, 0, 0)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + mDist * Math.cos(mAngle)),
|
||||
Math.round(fz + mDist * Math.sin(mAngle))),
|
||||
0);
|
||||
|
||||
// Create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1, 1, 0, 2)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + mDist * Math.cos(mAngle)),
|
||||
Math.round(fz + mDist * Math.sin(mAngle))),
|
||||
0);
|
||||
|
||||
// Create wood treasure
|
||||
mAngle += randFloat(PI/4, PI/6);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oWoodTreasure, 10, 10, 0, 3)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + bbDist * Math.cos(mAngle)),
|
||||
Math.round(fz + bbDist * Math.sin(mAngle)),
|
||||
avoidClasses(clBaseResource, 4)),
|
||||
0);
|
||||
|
||||
// Create starting trees
|
||||
for (let i = 0; i < 10; ++i)
|
||||
{
|
||||
let tAngle = mAngle + randFloat(PI/3, PI/4);
|
||||
let tDist = randFloat(10, 12);
|
||||
if (createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oBush, 20, 20, 0, 3)],
|
||||
false,
|
||||
clBaseResource,
|
||||
Math.round(fx + tDist * Math.cos(tAngle)),
|
||||
Math.round(fz + tDist * Math.sin(tAngle))),
|
||||
0,
|
||||
avoidClasses(clBaseResource, 4)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tPrimary,
|
||||
"innerTerrain": tSecondary
|
||||
},
|
||||
"Chicken": {
|
||||
"template": oRabbit
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Treasures": {
|
||||
"types": [
|
||||
{
|
||||
"template": oWoodTreasure,
|
||||
"count": 10
|
||||
}
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oBush,
|
||||
"count": 20,
|
||||
"maxDistGroup": 3
|
||||
}
|
||||
}
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
log("Creating hills...");
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ for (var ix = 0; ix < mapSize; ix++)
|
|||
}
|
||||
}
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.3);
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.3);
|
||||
|
||||
function distanceToPlayers(x, z)
|
||||
{
|
||||
|
|
@ -119,78 +119,37 @@ function playerNearness(x, z)
|
|||
|
||||
Engine.SetProgress(10);
|
||||
|
||||
for (var i=0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
var citySize = 250;
|
||||
|
||||
// Create the city patch
|
||||
var placer = new ClumpPlacer(citySize * 0.4, 0.6, 0.05, 10, ix, iz);
|
||||
var painter = new TerrainPainter([tCity]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
// Create starter animals
|
||||
placeDefaultChicken(fx, fz, clBaseResource, undefined, oPig);
|
||||
|
||||
// Create starter berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 3,3, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// Create starter metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"BaseResourceClass": clBaseResource,
|
||||
// Playerclass marked below
|
||||
"CityPatch": {
|
||||
"outerTerrain": tCity,
|
||||
"innerTerrain": tCity,
|
||||
"radius": scaleByMapSize(5, 6),
|
||||
"smoothness": 0.05
|
||||
},
|
||||
"Chicken": {
|
||||
"template": oPig
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush,
|
||||
"minCount": 3,
|
||||
"maxCount": 3
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
],
|
||||
"distance": 16
|
||||
},
|
||||
"Trees": {
|
||||
"template": oOak,
|
||||
"count": 2
|
||||
}
|
||||
var mDist = bbDist + 4;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// Create starter stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oOak, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
}
|
||||
// No decoratives
|
||||
});
|
||||
|
||||
log("Marking player territory larger than the city patch...");
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
|
|
|
|||
|
|
@ -49,84 +49,33 @@ var clBaseResource = createTileClass();
|
|||
var clTreasure = createTileClass();
|
||||
var clGrass = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oCarob,
|
||||
"count": scaleByMapSize(2, 8)
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
// create starting trees
|
||||
var num = 4;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oCarob, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
|
||||
});
|
||||
Engine.SetProgress(10);
|
||||
|
||||
createBumps(avoidClasses(clPlayer, 9));
|
||||
|
|
|
|||
|
|
@ -397,7 +397,7 @@ for (var p = 0; p < numPlayers; p++)
|
|||
{
|
||||
var actualX = possibleStartPositions[bestDerivation[p]][0];
|
||||
var actualY = possibleStartPositions[bestDerivation[p]][1];
|
||||
placeCivDefaultEntities(actualX, actualY, p + 1, { "iberWall": false });
|
||||
placeCivDefaultStartingEntities(actualX, actualY, p + 1, false);
|
||||
|
||||
// Place some start resources
|
||||
var uDist = 8;
|
||||
|
|
|
|||
|
|
@ -56,102 +56,32 @@ var clForest = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
let id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
let radius = scaleByMapSize(15, 25);
|
||||
|
||||
// Get the x and z in tiles
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
let fz = fractionToTiles(playerZ[i]);
|
||||
let ix = Math.round(fx);
|
||||
let iz = Math.round(fz);
|
||||
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// Create the city patch
|
||||
let cityRadius = radius / 3;
|
||||
createArea(
|
||||
new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz),
|
||||
new LayeredPainter([tCityTile, tCityTile], [1]),
|
||||
null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// Create berry bushes
|
||||
let bbAngle = randFloat(0, 2 * PI);
|
||||
let bbDist = 12;
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5, 5, 0, 3)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + bbDist * Math.cos(bbAngle)),
|
||||
Math.round(fz + bbDist * Math.sin(bbAngle))),
|
||||
0);
|
||||
|
||||
// Create metal mine
|
||||
let mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * PI);
|
||||
|
||||
let mDist = radius - 4;
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1, 1, 0, 0)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + mDist * Math.cos(mAngle)),
|
||||
Math.round(fz + mDist * Math.sin(mAngle))),
|
||||
0);
|
||||
|
||||
// Create stone mine
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1, 1, 0, 2)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + mDist * Math.cos(mAngle)),
|
||||
Math.round(fz + mDist * Math.sin(mAngle))),
|
||||
0);
|
||||
|
||||
// Create starting trees
|
||||
let hillSize = PI * radius * radius;
|
||||
let num = Math.floor(hillSize / 100);
|
||||
let tAngle = randFloat(-PI/3, 4 * PI/3);
|
||||
let tDist = 12;
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oBaobab, num, num, 0, 5)],
|
||||
false,
|
||||
clBaseResource,
|
||||
Math.round(fx + tDist * Math.cos(tAngle)),
|
||||
Math.round(fz + tDist * Math.sin(tAngle))),
|
||||
0,
|
||||
avoidClasses(clBaseResource, 2));
|
||||
|
||||
// Create grass tufts
|
||||
num = hillSize / 250;
|
||||
for (let j = 0; j < num; ++j)
|
||||
{
|
||||
let gAngle = randFloat(0, 2 * PI);
|
||||
let gDist = radius - randIntInclusive(5, 11);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(aGrassShort, 2, 5, 0, 1, -PI/8, PI/8)],
|
||||
false,
|
||||
clBaseResource,
|
||||
Math.round(fx + gDist * Math.cos(gAngle)),
|
||||
Math.round(fz + gDist * Math.sin(gAngle))),
|
||||
0);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tCityTile,
|
||||
"innerTerrain": tCityTile
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oBaobab
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(15);
|
||||
|
||||
log("Creating bumps...");
|
||||
|
|
|
|||
|
|
@ -456,7 +456,7 @@ Engine.SetProgress(80);
|
|||
for (let p = 0; p < playerIDs.length; ++p)
|
||||
{
|
||||
let point = startLocations[p];
|
||||
placeCivDefaultEntities(point.x, point.y, playerIDs[p], { "iberWall": true });
|
||||
placeCivDefaultStartingEntities(point.x, point.y, playerIDs[p], "walls");
|
||||
placeStartLocationResources(startLocations[p]);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -57,10 +57,10 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var playerHillRadius = scaleByMapSize(15, 25);
|
||||
var playerHillRadius = defaultPlayerBaseRadius();
|
||||
var playerHillElevation = 20;
|
||||
|
||||
var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ, playerAngle] = playerPlacementCircle(0.35);
|
||||
|
||||
log("Creating player hills and ramps...");
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
|
|
@ -87,78 +87,34 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
});
|
||||
}
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = playerHillRadius;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': false });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oOak, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": false,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oOak,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(10);
|
||||
|
||||
log("Creating lakes...");
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ var playerCanyonRadius = scaleByMapSize(18, 32);
|
|||
|
||||
initTerrain(tMainTerrain);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
|
||||
log("Reserving space for the players, their initial forests and some less space therein without trees...");
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
|
|
@ -84,72 +84,6 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
],
|
||||
null);
|
||||
|
||||
var radius = playerCanyonRadius;
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
}
|
||||
var mDist = 11;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 100);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = 12;
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,4)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
|
||||
log("Creating center area...");
|
||||
var center = Math.round(fractionToTiles(0.5));
|
||||
var lSize = Math.pow(scaleByMapSize(1, 6), 1/8);
|
||||
|
|
@ -251,12 +185,6 @@ for (let g = 0; g < scaleByMapSize(5, 30); ++g)
|
|||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]));
|
||||
var painter = new LayeredPainter([tRoad, tRoad], [1]);
|
||||
createArea(placer, [painter, paintClass(clPlayer)], null);
|
||||
|
||||
log("Creating path from player to center and to neighbor...");
|
||||
let neighbor = i + 1 < numPlayers ? i + 1 : 0;
|
||||
for (let [x, z] of [[playerX[neighbor], playerZ[neighbor]], [0.5, 0.5]])
|
||||
|
|
@ -280,11 +208,40 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
null);
|
||||
}
|
||||
|
||||
log("Painting center place...");
|
||||
createArea(
|
||||
new ClumpPlacer(150, 0.6, 0.3, 10, center, center),
|
||||
new LayeredPainter([tRoad, tRoad], [1]),
|
||||
null);
|
||||
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
// PlayerTileClass already marked above
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoad,
|
||||
"innerTerrain": tRoad,
|
||||
"radius": playerCanyonRadius / 3
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
],
|
||||
"distance": 11
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
paintTerrainBasedOnHeight(3.1, 29, 0, tCliff);
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ createArea(
|
|||
],
|
||||
null);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.25);
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.25);
|
||||
|
||||
log("Ensuring initial player land...");
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
|
|
@ -91,96 +91,40 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
paintClass(clLand)
|
||||
]);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
fx = fractionToTiles(playerX[i]);
|
||||
fz = fractionToTiles(playerZ[i]);
|
||||
ix = Math.round(fx);
|
||||
iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(0, 2 * Math.PI);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,3)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
|
||||
Engine.SetProgress(20);
|
||||
|
||||
paintTerrainBasedOnHeight(3, 4, 3, tMainTerrain);
|
||||
paintTerrainBasedOnHeight(1, 3, 0, tShore);
|
||||
paintTerrainBasedOnHeight(-8, 1, 2, tWater);
|
||||
|
||||
for (var i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(30);
|
||||
|
||||
createBumps([avoidClasses(clPlayer, 10), stayClasses(clLand, 5)]);
|
||||
|
||||
|
|
|
|||
|
|
@ -102,85 +102,34 @@ paintTerrainBasedOnHeight(2, 5, 1, tGrass);
|
|||
|
||||
paintTileClassBasedOnHeight(-6, 0.5, 1, clWater);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementRiver(riverAngle, 0.6);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.floor(fx);
|
||||
var iz = Math.floor(fz);
|
||||
addToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementRiver(riverAngle, 0.6),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": "towers",
|
||||
"CityPatch": {
|
||||
"outerTerrain": tCityPlaza,
|
||||
"innerTerrain": tCity
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oCarob,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aBush1
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oCarob, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius);
|
||||
}
|
||||
|
||||
});
|
||||
Engine.SetProgress(40);
|
||||
|
||||
createBumps(avoidClasses(clWater, 2, clPlayer, 20));
|
||||
|
|
|
|||
|
|
@ -211,68 +211,38 @@ for (let island = 0; island < 2; ++island)
|
|||
{
|
||||
playerAngle[p] = Math.PI * ((i + 0.5) / (2 * playersPerIsland) + island) + swapAngle;
|
||||
let pos = Vector2D.add(islandLocations[island], new Vector2D(radiusPlayer).rotate(-playerAngle[p]));
|
||||
[playerX[p], playerZ[p]] = [pos.x, pos.y];
|
||||
[playerX[p], playerZ[p]] = [tilesToFraction(pos.x), tilesToFraction(pos.y)];
|
||||
++p;
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = 23;
|
||||
|
||||
// get the x and z in tiles
|
||||
let fx = playerX[i];
|
||||
let fz = playerZ[i];
|
||||
|
||||
// let's create a nice platform
|
||||
var placer = new ClumpPlacer(PI*radius*radius, 0.95, 0.3, 10, fx,fz);
|
||||
var PlayerArea = createArea(placer, [paintClass(clPlayer)], null);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/4;
|
||||
placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.8, 0.3, 10, fx, fz);
|
||||
var painter = new LayeredPainter([tRoadWild,tRoad],[1]);
|
||||
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, getHeight(Math.round(fx), Math.round(fz)),10);
|
||||
createArea(placer, [painter,paintClass(clSettlement),elevationPainter], null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': false });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * PI);
|
||||
var bbDist = 11;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(eBush, 5,5, 1,2)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
// this makes sure it's created on the same level as the player.
|
||||
var mAngle = randFloat(playerAngle[i] + PI/2,playerAngle[i] + PI/3);
|
||||
var mDist = 18;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(eMetalMine, 1,1, 0,0),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3), new SimpleObject(ePine, 0,1, 3,3)], true, clBaseResource, mX, mZ );
|
||||
createObjectGroup(group, 0);
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/5);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(eStoneMine, 1,1, 0,2),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3), new SimpleObject(ePine, 0,1, 3,3)], true, clBaseResource, mX, mZ );
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
group = new SimpleGroup([new SimpleObject(ePine, 1,3, 1,4),new SimpleObject(ePalmTall, 0,1, 1,4),new SimpleObject(eFanPalm, 0,1, 0,2)], true, clForest);
|
||||
createObjectGroupsDeprecated(group, 0, [avoidClasses(clBaseResource,3, clSettlement,0), stayClasses(clPlayer,1)], 150, 1000);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [sortAllPlayers(), playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": false,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad,
|
||||
"coherence": 0.8,
|
||||
"radius": 6,
|
||||
"painters": [
|
||||
paintClass(clSettlement)
|
||||
]
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": eBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": eMetalMine },
|
||||
{ "template": eStoneMine }
|
||||
]
|
||||
}
|
||||
// Sufficient starting trees around, no decoratives
|
||||
});
|
||||
Engine.SetProgress(40);
|
||||
|
||||
log("Creating bumps...");
|
||||
|
|
@ -426,7 +396,7 @@ createObjectGroupsDeprecated(
|
|||
avoidClasses(
|
||||
clWater, 1,
|
||||
clForest, 0,
|
||||
clPlayer, 6,
|
||||
clPlayer, 3,
|
||||
clBaseResource, 4,
|
||||
clPassage, 2,
|
||||
clCliffs, 2)
|
||||
|
|
|
|||
|
|
@ -61,8 +61,6 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var playerIDs = sortAllPlayers();
|
||||
|
||||
//array holding starting islands based on number of players
|
||||
var startingPlaces=[[0],[0,3],[0,2,4],[0,1,3,4],[0,1,2,3,4],[0,1,2,3,4,5]];
|
||||
|
||||
|
|
@ -138,84 +136,36 @@ for (let i = 0; i < nCenter; ++i)
|
|||
2);
|
||||
}
|
||||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
let fz = fractionToTiles(playerZ[i]);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 10;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oPalm, num, num, 0,3)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
}
|
||||
|
||||
log("Populating islands ...");
|
||||
var nPlayer = 0;
|
||||
for (let i = 0; i < numIslands; ++i)
|
||||
if (numPlayers >= 6 || i == startingPlaces[numPlayers-1][nPlayer])
|
||||
{
|
||||
var id = playerIDs[nPlayer];
|
||||
|
||||
// Get the x and z in tiles
|
||||
var fx = fractionToTiles(islandX[i]);
|
||||
var fz = fractionToTiles(islandZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
// Create city patch
|
||||
var cityRadius = 6;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tGrass, tCity], [1]);
|
||||
createArea(placer, [painter,paintClass(clCity)], null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
|
||||
|
||||
++nPlayer;
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [sortAllPlayers(), playerX, playerZ],
|
||||
// PlayerTileClass is clCity here and painted below
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": "towers",
|
||||
"CityPatch": {
|
||||
"radius": 6,
|
||||
"outerTerrain": tGrass,
|
||||
"innerTerrain": tCity,
|
||||
"painters": [
|
||||
paintClass(clCity)
|
||||
]
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oPalm,
|
||||
"count": 2
|
||||
}
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
log("Creating bumps...");
|
||||
|
|
@ -269,7 +219,7 @@ for (let type of forestTypes)
|
|||
Engine.SetProgress(42);
|
||||
|
||||
log("Creating stone mines...");
|
||||
group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
|
||||
var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
|
||||
createObjectGroupsByAreasDeprecated(group, 0,
|
||||
[avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 6)],
|
||||
scaleByMapSize(4,16), 200, areas
|
||||
|
|
|
|||
|
|
@ -314,87 +314,37 @@ if (gallicCC)
|
|||
}
|
||||
Engine.SetProgress(10);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.6);
|
||||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
let id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
let radius = scaleByMapSize(15, 25);
|
||||
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
let fz = fractionToTiles(playerZ[i]);
|
||||
let ix = Math.floor(fx);
|
||||
let iz = Math.floor(fz);
|
||||
addToClass(ix, iz, clPlayer);
|
||||
|
||||
// Create the city patch
|
||||
let cityRadius = radius / 3;
|
||||
createArea(
|
||||
new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz),
|
||||
new LayeredPainter([tShore, tRoad], [1]),
|
||||
null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': false });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// Create berry bushes
|
||||
let angle = randFloat(0, 2 * PI);
|
||||
let dist = 10;
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5, 5, 0, 3)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + dist * Math.cos(angle)),
|
||||
Math.round(fz + dist * Math.sin(angle))
|
||||
),
|
||||
0);
|
||||
|
||||
// Create metal mine
|
||||
dist = scaleByMapSize(9, 14);
|
||||
angle += randFloat(PI/4, PI/3);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1, 1, 0, 0)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + dist * Math.cos(angle)),
|
||||
Math.round(fz + dist * Math.sin(angle))
|
||||
),
|
||||
0);
|
||||
|
||||
// Create stone mines
|
||||
angle += randFloat(PI/3, PI/2);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1, 1, 0, 2)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + dist * Math.cos(angle)),
|
||||
Math.round(fz + dist * Math.sin(angle))
|
||||
),
|
||||
0);
|
||||
|
||||
// Create starting trees
|
||||
let num = 20;
|
||||
angle += randFloat(-PI/3, PI * 4/3);
|
||||
dist = randFloat(10, 14);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oOak, num, num, 0, 5)],
|
||||
false,
|
||||
clBaseResource,
|
||||
Math.round(fx + dist * Math.cos(angle)),
|
||||
Math.round(fz + dist * Math.sin(angle))
|
||||
),
|
||||
0,
|
||||
avoidClasses(clBaseResource, 4));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementRiver(0, 0.6),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": false,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tShore,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": aBush1
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
],
|
||||
"distance": scaleByMapSize(9, 14)
|
||||
},
|
||||
"Trees": {
|
||||
"template": oOak,
|
||||
"count": 20,
|
||||
"minDist": 10,
|
||||
"maxDist": 14
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aBush1
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
paintRiver({
|
||||
|
|
|
|||
|
|
@ -11,8 +11,6 @@ var clBaseResource = createTileClass();
|
|||
var templateStone = "gaia/geology_stone_temperate";
|
||||
var templateStoneMine = "gaia/geology_stonemine_temperate_quarry";
|
||||
var templateMetalMine = "gaia/geology_metal_temperate_slabs";
|
||||
var startingResourcees = ["gaia/flora_tree_oak_large", "gaia/flora_bush_temperate", templateStoneMine,
|
||||
"gaia/flora_bush_grapes", "gaia/flora_tree_apple", "gaia/flora_bush_berry", templateMetalMine, "gaia/flora_bush_badlands"];
|
||||
|
||||
var terrainWood = ['temp_grass_mossy|gaia/flora_tree_oak', 'temp_forestfloor_pine|gaia/flora_tree_pine', 'temp_mud_plants|gaia/flora_tree_dead',
|
||||
'temp_plants_bog|gaia/flora_tree_oak_large', "temp_dirt_gravel_plants|gaia/flora_tree_aleppo_pine", 'temp_forestfloor_autumn|gaia/flora_tree_carob']; //'temp_forestfloor_autumn|gaia/flora_tree_fig'
|
||||
|
|
@ -71,38 +69,49 @@ var resourcePerPlayer = [templateStone, templateMetalMine];
|
|||
var maxTreeDensity = Math.min(256 * (192 + 8 * numPlayers) / mapArea, 1); // Has to be tweeked but works ok
|
||||
var bushChance = 1/3; // 1 means 50% chance in deepest wood, 0.5 means 25% chance in deepest wood
|
||||
|
||||
Engine.SetProgress(2);
|
||||
|
||||
// Place bases
|
||||
var playerIDs = [];
|
||||
for (var i=0; i < numPlayers; i++)
|
||||
{
|
||||
playerIDs[i] = i+1;
|
||||
playerAngle[i] = (playerAngleStart + i*playerAngleAddAvrg + randFloat(0, playerAngleMaxOff))%(2*PI);
|
||||
var x = Math.round(mapCenterX + randFloat(minPlayerRadius, maxPlayerRadius)*cos(playerAngle[i]));
|
||||
var z = Math.round(mapCenterZ + randFloat(minPlayerRadius, maxPlayerRadius)*sin(playerAngle[i]));
|
||||
playerStartLocX[i] = x;
|
||||
playerStartLocZ[i] = z;
|
||||
|
||||
placeCivDefaultEntities(x, z, i+1);
|
||||
|
||||
// Place base texture
|
||||
var placer = new ClumpPlacer(2*baseRadius*baseRadius, 2/3, 1/8, 10, x, z);
|
||||
var painter = [new LayeredPainter([terrainBaseBorder, terrainBase, terrainBaseCenter], [baseRadius/4, baseRadius/4]), paintClass(clPlayer)];
|
||||
createArea(placer, painter);
|
||||
|
||||
// Place starting resources
|
||||
var distToSL = 10;
|
||||
var resStartAngle = playerAngle[i] + PI;
|
||||
var resAddAngle = 2*PI / startingResourcees.length;
|
||||
for (var rIndex = 0; rIndex < startingResourcees.length; rIndex++)
|
||||
{
|
||||
var angleOff = randFloat(-resAddAngle/2, resAddAngle/2);
|
||||
var placeX = x + distToSL*cos(resStartAngle + rIndex*resAddAngle + angleOff);
|
||||
var placeZ = z + distToSL*sin(resStartAngle + rIndex*resAddAngle + angleOff);
|
||||
placeObject(placeX, placeZ, startingResourcees[rIndex], 0, randFloat(0, 2*PI));
|
||||
addToClass(Math.round(placeX), Math.round(placeZ), clBaseResource);
|
||||
}
|
||||
playerStartLocX[i] = mapCenterX + Math.round(randFloat(minPlayerRadius, maxPlayerRadius) * Math.cos(playerAngle[i]));
|
||||
playerStartLocZ[i] = mapCenterZ + Math.round(randFloat(minPlayerRadius, maxPlayerRadius) * Math.sin(playerAngle[i]));
|
||||
}
|
||||
Engine.SetProgress(10);
|
||||
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerStartLocX.map(tilesToFraction), playerStartLocZ.map(tilesToFraction)],
|
||||
"BaseResourceClass": clBaseResource,
|
||||
// player class painted below
|
||||
"CityPatch": {
|
||||
"radius": 0.8 * baseRadius,
|
||||
"smoothness": 1/8,
|
||||
"painters": [
|
||||
new LayeredPainter([terrainBaseBorder, terrainBase, terrainBaseCenter], [baseRadius/4, baseRadius/4]),
|
||||
paintClass(clPlayer)
|
||||
]
|
||||
},
|
||||
// Chicken already placed at the base terrain
|
||||
"Berries": {
|
||||
"template": "gaia/flora_bush_grapes",
|
||||
"minCount": 2,
|
||||
"maxCount": 2,
|
||||
"minDist": 10,
|
||||
"maxDist": 10
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": templateMetalMine },
|
||||
{ "template": templateStoneMine }
|
||||
],
|
||||
"minAngle": Math.PI / 2,
|
||||
"maxAngle": Math.PI
|
||||
},
|
||||
"Trees": {
|
||||
"template": "gaia/flora_tree_oak_large",
|
||||
"count": 2
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(10);
|
||||
|
||||
// Place paths
|
||||
|
|
|
|||
|
|
@ -56,83 +56,33 @@ var clShallow = createTileClass();
|
|||
var landHeight = 3;
|
||||
var waterHeight = -4;
|
||||
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementRiver(Math.PI / 2, 0.6);
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
// Setting tile class
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, [painter, paintClass(clPlayer)], null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oOak, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementRiver(Math.PI / 2, 0.6),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oOak,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(10);
|
||||
|
||||
paintRiver({
|
||||
|
|
|
|||
|
|
@ -71,9 +71,9 @@ var clTower = createTileClass();
|
|||
var clRain = createTileClass();
|
||||
|
||||
var ccMountainHeight = 25;
|
||||
var ccMountainSize = scaleByMapSize(15, 25);
|
||||
var ccMountainSize = defaultPlayerBaseRadius();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
|
||||
log("Creating CC mountains...");
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
|
|
@ -96,7 +96,7 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
|
||||
// Flatten the initial CC area
|
||||
createArea(
|
||||
new ClumpPlacer(diskArea(scaleByMapSize(15, 25)), 0.95, 0.6, 10, ix, iz),
|
||||
new ClumpPlacer(diskArea(ccMountainSize), 0.95, 0.6, 10, ix, iz),
|
||||
[
|
||||
new LayeredPainter([tHillVeryDark, tHillMedium1], [ccMountainSize]),
|
||||
new SmoothElevationPainter(ELEVATION_SET, ccMountainHeight, ccMountainSize),
|
||||
|
|
@ -104,81 +104,33 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
],
|
||||
null);
|
||||
}
|
||||
Engine.SetProgress(8);
|
||||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
let id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
let fz = fractionToTiles(playerZ[i]);
|
||||
|
||||
// Create the city patch
|
||||
createArea(
|
||||
new ClumpPlacer(diskArea(ccMountainSize / 3), 0.6, 0.3, 10, Math.round(fx), Math.round(fz)),
|
||||
new LayeredPainter([tRoadWild, tRoad], [1]),
|
||||
null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
|
||||
|
||||
// Create metal mine
|
||||
let mAngle = randFloat(0, 2 * PI);
|
||||
let mDist = 12;
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1, 1, 0, 0)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + mDist * Math.cos(mAngle)),
|
||||
Math.round(fz + mDist * Math.sin(mAngle))),
|
||||
0);
|
||||
|
||||
// Create stone mines
|
||||
mAngle += randFloat(PI/4, PI/3);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1, 1, 0, 2)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + mDist * Math.cos(mAngle)),
|
||||
Math.round(fz + mDist * Math.sin(mAngle))),
|
||||
0);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// Create berry bushes
|
||||
mAngle += randFloat(PI/4, PI/2);
|
||||
let bbDist = 12;
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5, 5, 0, 3)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + bbDist * Math.cos(mAngle)),
|
||||
Math.round(fz + bbDist * Math.sin(mAngle))),
|
||||
0);
|
||||
|
||||
// Create starting trees
|
||||
let num = Math.floor(diskArea(ccMountainSize) / 60);
|
||||
let tries = 20;
|
||||
for (let x = 0; x < tries; ++x)
|
||||
{
|
||||
let tAngle = randFloat(0, 2 * PI);
|
||||
let tDist = randFloat(10, 12);
|
||||
if (createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oTree2, num, num, 0, 3)],
|
||||
false,
|
||||
clBaseResource,
|
||||
Math.round(fx + tDist * Math.cos(tAngle)),
|
||||
Math.round(fz + tDist * Math.sin(tAngle))),
|
||||
0,
|
||||
avoidClasses(clBaseResource, 3)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
// PlayerTileClass already marked above
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": "towers",
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree2
|
||||
}
|
||||
}
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(15);
|
||||
|
||||
createVolcano(0.5, 0.5, clHill, tHillVeryDark, undefined, false, ELEVATION_SET);
|
||||
|
|
|
|||
|
|
@ -48,7 +48,6 @@ const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TE
|
|||
|
||||
InitMap();
|
||||
|
||||
const radius = scaleByMapSize(15, 25);
|
||||
const clPlayer = createTileClass();
|
||||
const clHill = createTileClass();
|
||||
const clMountain = createTileClass();
|
||||
|
|
@ -80,25 +79,13 @@ createArea(
|
|||
],
|
||||
avoidClasses(clPlayer, 5));
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.38);
|
||||
|
||||
log("Creating player islands...")
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.38);
|
||||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
let id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// Get the x and z in tiles
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
let fz = fractionToTiles(playerZ[i]);
|
||||
let ix = Math.round(fx);
|
||||
let iz = Math.round(fz);
|
||||
|
||||
let hillSize = PI * radius * radius * 2;
|
||||
|
||||
createArea(
|
||||
new ClumpPlacer(
|
||||
hillSize,
|
||||
2 * diskArea(defaultPlayerBaseRadius()),
|
||||
0.8,
|
||||
0.1,
|
||||
10,
|
||||
|
|
@ -111,73 +98,36 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
],
|
||||
null);
|
||||
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { "iberWall": false });
|
||||
|
||||
// Create the city patch
|
||||
let cityRadius = radius/3;
|
||||
let placer = new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
let painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// Create berry bushes
|
||||
let bbAngle = randFloat(0, 2 * Math.PI);
|
||||
let bbDist = 12;
|
||||
let bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
let bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
let group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5, 5, 0, 3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// Create metal mine
|
||||
let mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
let mDist = 12;
|
||||
let mX = Math.round(fx + mDist * cos(mAngle));
|
||||
let mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1, 1, 0, 0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// Create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1, 1, 0, 2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// Create starting trees, should avoid mines and bushes
|
||||
let tries = 50;
|
||||
let tDist = 16;
|
||||
let num = 50;
|
||||
for (let x = 0; x < tries; ++x)
|
||||
{
|
||||
let tAngle = randFloat(0, 2 * Math.PI);
|
||||
let tX = Math.round(fx + tDist * cos(tAngle));
|
||||
let tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree2, num, num, 0, 7)],
|
||||
true, clBaseResource, tX, tZ
|
||||
);
|
||||
if (createObjectGroup(group, 0, avoidClasses(clBaseResource, 5)))
|
||||
break;
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": false,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree2,
|
||||
"count": 50,
|
||||
"maxDist": 16,
|
||||
"maxDistGroup": 7
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
|
||||
});
|
||||
Engine.SetProgress(40);
|
||||
|
||||
log("Creating central island...");
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
|
||||
for (var i=0; i < numPlayers; i++)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -60,86 +60,9 @@ var clBaseResource = createTileClass();
|
|||
|
||||
initTerrain(tMainTerrain);
|
||||
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(0, 2 * Math.PI);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,3)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
|
||||
Engine.SetProgress(20);
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35);
|
||||
|
||||
log("Determining number of rivers between players...");
|
||||
var split = 1;
|
||||
if (mapSize == 128 && numPlayers <= 2)
|
||||
split = 2;
|
||||
|
|
@ -252,19 +175,34 @@ paintTerrainBasedOnHeight(2, 21, 1, tMainTerrain);
|
|||
|
||||
paintTileClassBasedOnHeight(-6, 0.5, 1, clWater);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
fx = fractionToTiles(playerX[i]);
|
||||
fz = fractionToTiles(playerZ[i]);
|
||||
ix = Math.round(fx);
|
||||
iz = Math.round(fz);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": "towers",
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
|
||||
if (randBool())
|
||||
createHills([tMainTerrain, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers);
|
||||
|
|
|
|||
|
|
@ -76,89 +76,38 @@ createArea(
|
|||
],
|
||||
null);
|
||||
|
||||
var playerIDs = primeSortAllPlayers();
|
||||
var [playerX, playerZ] = playerPlacementCustomAngle(
|
||||
0.35,
|
||||
continentCenter.x,
|
||||
continentCenter.y,
|
||||
i => Math.PI * (-0.46 / numPlayers * (i + i % 2) - (i % 2) / 2));
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
let fz = fractionToTiles(playerZ[i]);
|
||||
let ix = Math.round(fx);
|
||||
let iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': false });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 8;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [primeSortAllPlayers(), ...playerPlacementCustomAngle(
|
||||
0.35,
|
||||
continentCenter.x,
|
||||
continentCenter.y,
|
||||
i => Math.PI * (-0.46 / numPlayers * (i + i % 2) - (i % 2) / 2))],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": false,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oPoplar,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
var mDist = 10;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oPoplar, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
paintRiver({
|
||||
|
|
|
|||
|
|
@ -129,90 +129,38 @@ var clBaseResource = createTileClass();
|
|||
initTerrain(tPrimary);
|
||||
|
||||
var startAngle = -Math.PI / 6;
|
||||
var playerIDs = sortAllPlayers();
|
||||
var [playerX, playerZ] = playerPlacementCustomAngle(
|
||||
0.35,
|
||||
tilesToFraction(mapCenter.x),
|
||||
tilesToFraction(mapCenter.y),
|
||||
i => startAngle + 2/3 * Math.PI * (numPlayers == 1 ? 1 : 2 * i / (numPlayers - 1)));
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [sortAllPlayers(), ...playerPlacementCustomAngle(
|
||||
0.35,
|
||||
tilesToFraction(mapCenter.x),
|
||||
tilesToFraction(mapCenter.y),
|
||||
i => startAngle + 2/3 * Math.PI * (numPlayers == 1 ? 1 : 2 * i / (numPlayers - 1)))],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oPine,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oPine, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
log("Creating the gulf...");
|
||||
|
|
|
|||
|
|
@ -54,85 +54,33 @@ var clSea = createTileClass();
|
|||
var clHighlands = createTileClass();
|
||||
var clFlatlands = createTileClass();
|
||||
|
||||
var playerIDs = sortAllPlayers();
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementLine(true, 0.5, 0.2);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oOak, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementLine(true, 0.5, 0.2),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oOak,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(10);
|
||||
|
||||
paintRiver({
|
||||
|
|
@ -255,7 +203,7 @@ for (let size of [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5
|
|||
Engine.SetProgress(80);
|
||||
|
||||
log("Creating stone mines...");
|
||||
group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
|
||||
var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
|
||||
createObjectGroupsDeprecated(group, 0,
|
||||
[avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clRock, 10, clSea, 2, clHill, 2)],
|
||||
scaleByMapSize(4,16), 100
|
||||
|
|
|
|||
|
|
@ -35,78 +35,38 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
let id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
let fz = fractionToTiles(playerZ[i]);
|
||||
let ix = Math.round(fx);
|
||||
let iz = Math.round(fz);
|
||||
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// Create the city patch
|
||||
let radius = scaleByMapSize(15, 25);
|
||||
let cityRadius = radius / 3;
|
||||
createArea(
|
||||
new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz),
|
||||
new LayeredPainter([tDirt1, tCityTiles], [1]),
|
||||
null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// Create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * Math.cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * Math.sin(bbAngle));
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
),
|
||||
0);
|
||||
|
||||
// Create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < PI/3)
|
||||
mAngle = randFloat(0, 2 * PI);
|
||||
var mDist = 13;
|
||||
var mX = Math.round(fx + mDist * Math.cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * Math.sin(mAngle));
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1, 1, 0, 0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
),
|
||||
0);
|
||||
|
||||
// Create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * Math.cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * Math.sin(mAngle));
|
||||
createStoneMineFormation(mX, mZ, oStoneSmall, tDirt4);
|
||||
addToClass(mX, mZ, clPlayer);
|
||||
|
||||
// Create starting trees
|
||||
var num = Math.floor(PI * radius * radius / 300);
|
||||
var tAngle = randFloat(-PI/3, 4 * PI/3);
|
||||
var tDist = randFloat(13, 15);
|
||||
var tX = Math.round(fx + tDist * Math.cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * Math.sin(tAngle));
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oTree, num, num, 4, 6)],
|
||||
false, clBaseResource, tX, tZ
|
||||
),
|
||||
0,
|
||||
avoidClasses(clBaseResource,2));
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
// No city patch
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{
|
||||
"template": oMetalLarge
|
||||
},
|
||||
{
|
||||
"type": "stone_formation",
|
||||
"template": oStoneSmall,
|
||||
"terrain": tDirt1
|
||||
}
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree,
|
||||
"count": scaleByMapSize(3, 7),
|
||||
"minDist": 13,
|
||||
"maxDist": 15,
|
||||
"minDistGroup": 4,
|
||||
"maxDistGroup": 6
|
||||
}
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
log("Creating bumps...");
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ for (let i = 0; i < teams.length; ++i)
|
|||
],
|
||||
null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, teams[i][p], { "iberWall": false });
|
||||
placeCivDefaultStartingEntities(fx, fz, teams[i][p], false);
|
||||
}
|
||||
|
||||
log("Create initial mines for team " + i);
|
||||
|
|
@ -146,7 +146,13 @@ for (let i = 0; i < teams.length; ++i)
|
|||
{
|
||||
let [playerAngle, fx, fz, ix, iz] = getPlayerTileCoordinates(p, i, fractionX, fractionZ);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource, [stayClasses(clLand, 5)]);
|
||||
placePlayerBaseChicken({
|
||||
"playerID": teams[i][p],
|
||||
"playerX": tilesToFraction(fx),
|
||||
"playerZ": tilesToFraction(fz),
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"baseResourceConstraint": stayClasses(clLand, 5)
|
||||
});
|
||||
|
||||
// create initial berry bushes
|
||||
let bbAngle = randFloat(PI, PI*1.5);
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ var clLand = createTileClass();
|
|||
|
||||
var playerIslandRadius = scaleByMapSize(20, 29);
|
||||
|
||||
var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ, playerAngle] = playerPlacementCircle(0.35);
|
||||
|
||||
log("Creating player islands and docks...");
|
||||
for (let i = 0; i < numPlayers; i++)
|
||||
|
|
@ -80,85 +80,6 @@ for (let i = 0; i < numPlayers; i++)
|
|||
placeObject(dockLocation.x, dockLocation.y, oDock, playerIDs[i], playerAngle[i] + Math.PI);
|
||||
}
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
let radius = playerIslandRadius;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create woods
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 13;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oWoodTreasure, 14,14, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = 5;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,3)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
|
||||
var landAreas = [];
|
||||
var playerConstraint = new AvoidTileClassConstraint(clPlayer, Math.floor(scaleByMapSize(12,16)));
|
||||
var landConstraint = new AvoidTileClassConstraint(clLand, Math.floor(scaleByMapSize(12,16)));
|
||||
|
|
@ -256,17 +177,43 @@ for (let i = 0; i < 6 * Math.square(scaleByMapSize(1, 3)); ++i)
|
|||
paintTerrainBasedOnHeight(1, 3, 0, tShore);
|
||||
paintTerrainBasedOnHeight(-8, 1, 2, tWater);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
// create the city patch
|
||||
var placer = new ClumpPlacer(diskArea(playerIslandRadius / 3), 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
// PlayerTileClass marked above
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": "towers",
|
||||
"CityPatch": {
|
||||
"radius": playerIslandRadius / 3,
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Treasures": {
|
||||
"types": [
|
||||
{
|
||||
"template": oWoodTreasure,
|
||||
"count": 14
|
||||
}
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1,
|
||||
"count": 5
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
|
||||
log("Creating bumps...");
|
||||
createAreas(
|
||||
|
|
|
|||
|
|
@ -48,93 +48,40 @@ var clFood = createTileClass();
|
|||
var clBaseResource = createTileClass();
|
||||
var clMountains = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementLine(false, 0.55, 0.2);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 60);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree, num, num, 0,3)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
}
|
||||
|
||||
Engine.SetProgress(15);
|
||||
|
||||
const waterPos = 0.31;
|
||||
const mountainPos = 0.69;
|
||||
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementLine(false, 0.55, 0.2),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree,
|
||||
"count": scaleByMapSize(12, 30),
|
||||
"minDist": 12,
|
||||
"maxDist": 14,
|
||||
"minDistGroup": 1,
|
||||
"maxDistGroup": 3
|
||||
}
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(15);
|
||||
|
||||
paintRiver({
|
||||
"parallel": true,
|
||||
"startX": 0,
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ var clBaseResource = createTileClass();
|
|||
|
||||
initTerrain(tMainTerrain);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
|
||||
log("Preventing water in player territory...");
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
|
|
@ -66,75 +66,6 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
Math.round(fractionToTiles(playerZ[i])),
|
||||
clPlayer);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 5;
|
||||
var tAngle = randFloat(0, 2 * Math.PI);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,3)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
|
||||
log("Creating the lake...")
|
||||
createArea(
|
||||
new ChainPlacer(
|
||||
|
|
@ -168,19 +99,34 @@ paintTerrainBasedOnHeight(1, 2.4, 0, tShore);
|
|||
paintTerrainBasedOnHeight(-8, 1, 2, tWater);
|
||||
paintTileClassBasedOnHeight(-6, 0, 1, clWater);
|
||||
|
||||
for (var i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
// PlayerTileClass marked above
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1,
|
||||
"count": 5
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
createBumps(avoidClasses(clWater, 2, clPlayer, 20));
|
||||
|
||||
|
|
|
|||
|
|
@ -306,80 +306,40 @@ for (var ix = 0; ix < mapSize; ix++)
|
|||
|
||||
Engine.SetProgress(30);
|
||||
|
||||
for (var i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// get fractional locations in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch, flatten area under TC
|
||||
var cityRadius = 11;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tGrass, tCity], [4]);
|
||||
var elevationPainter = new SmoothElevationPainter(
|
||||
ELEVATION_SET, // type
|
||||
5, // elevation
|
||||
2 // blend radius
|
||||
);
|
||||
createArea(placer, [painter, elevationPainter], null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create starting berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 9;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,2)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 5;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(10, 11);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oPalm, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource, 2, clCliff, 0));
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"baseResourceConstraint": avoidClasses(clCliff, 4),
|
||||
"CityPatch": {
|
||||
"radius": 11,
|
||||
"outerTerrain": tGrass,
|
||||
"innerTerrain": tCity,
|
||||
"width": 4,
|
||||
"painters": [
|
||||
new SmoothElevationPainter(ELEVATION_SET, 5, 2)
|
||||
]
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush,
|
||||
"distance": 9
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oPalm,
|
||||
"count": 5,
|
||||
"minDist": 10,
|
||||
"maxDist": 11
|
||||
}
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(40);
|
||||
|
||||
log("Creating bushes...");
|
||||
|
|
|
|||
|
|
@ -55,87 +55,37 @@ var waterHeight = -4;
|
|||
var shallowHeight = -2;
|
||||
var shallowWidth = scaleByMapSize(8, 12);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementRiver(Math.PI / 2, 0.5);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// scale radius of player area by map size
|
||||
var radius = scaleByMapSize(15,25);
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
// calculate size based on the radius
|
||||
var size = PI * radius * radius / 4;
|
||||
|
||||
// create the player area
|
||||
var placer = new ClumpPlacer(size, 0.9, 0.5, 10, ix, iz);
|
||||
createArea(placer, paintClass(clPlayer), null);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = 10;
|
||||
placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [3]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementRiver(Math.PI / 2, 0.5),
|
||||
// PlayerTileClass marked below
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": "towers",
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad,
|
||||
"painters": [
|
||||
paintClass(clPlayer)
|
||||
]
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oOak,
|
||||
"count": 3
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
var mDist = 11;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0), new SimpleObject(aGrass, 2,4, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2), new SimpleObject(aGrass, 2,4, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 3;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oOak, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
log("Creating the main river...");
|
||||
|
|
|
|||
|
|
@ -52,84 +52,33 @@ var clBaseResource = createTileClass();
|
|||
|
||||
initTerrain(tMainTerrain);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1,
|
||||
"count": 5
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 5;
|
||||
var tAngle = randFloat(0, 2 * Math.PI);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,3)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
createBumps(avoidClasses(clPlayer, 20));
|
||||
|
|
|
|||
|
|
@ -87,104 +87,39 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
}
|
||||
Engine.SetProgress(10);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var shoreRadius = 4;
|
||||
var elevation = 3;
|
||||
|
||||
var hillSize = PI * radius * radius;
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
// create the hill
|
||||
var placer = new ClumpPlacer(hillSize, 0.80, 0.1, 10, ix, iz);
|
||||
var terrainPainter = new LayeredPainter(
|
||||
[tWater , tShore, tMainTerrain], // terrains
|
||||
[1, shoreRadius] // widths
|
||||
);
|
||||
var elevationPainter = new SmoothElevationPainter(
|
||||
ELEVATION_SET, // type
|
||||
elevation, // elevation
|
||||
shoreRadius // blend radius
|
||||
);
|
||||
createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': false });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create woods
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 13;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oWoodTreasure, 14,14, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = radius - 4;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 60);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = 11;
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,4)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": false,
|
||||
// No city patch
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Treasures": {
|
||||
"types": [
|
||||
{
|
||||
"template": oWoodTreasure,
|
||||
"count": 14
|
||||
}
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1,
|
||||
"count": scaleByMapSize(12, 30)
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(15);
|
||||
|
||||
log("Create the continent body...");
|
||||
|
|
|
|||
|
|
@ -51,12 +51,12 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
createArea(
|
||||
new ClumpPlacer(
|
||||
diskArea(scaleByMapSize(15, 25)),
|
||||
diskArea(defaultPlayerBaseRadius()),
|
||||
0.9,
|
||||
0.5,
|
||||
10,
|
||||
|
|
@ -64,78 +64,32 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
Math.round(fractionToTiles(playerZ[i]))),
|
||||
paintClass(clPlayer));
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// scale radius of player area by map size
|
||||
var radius = scaleByMapSize(15,25);
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = 10;
|
||||
placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tCity, tCityPlaza], [3]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 11;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0), new RandomObject(aBushes, 2,4, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 100);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(12, 14);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oDatePalm, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tCity,
|
||||
"innerTerrain": tCityPlaza,
|
||||
"width": 3,
|
||||
"radius": 10
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oDatePalm
|
||||
}
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(10);
|
||||
|
||||
log("Creating dune patches...");
|
||||
|
|
|
|||
|
|
@ -2,31 +2,8 @@ Engine.LoadLibrary("rmgen");
|
|||
|
||||
InitMap();
|
||||
|
||||
var numPlayers = getNumPlayers();
|
||||
var mapSize = getMapSize();
|
||||
|
||||
var clPlayer = createTileClass();
|
||||
var clPath = createTileClass();
|
||||
var clHill = createTileClass();
|
||||
var clForest = createTileClass();
|
||||
var clRock = createTileClass();
|
||||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement(0.39);
|
||||
|
||||
for (var i=0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.39)
|
||||
});
|
||||
|
||||
ExportMap();
|
||||
|
|
|
|||
|
|
@ -41,75 +41,27 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementLine(true, 0.45, 0.2);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
// create metal mine
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementLine(true, 0.45, 0.2),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
// No chicken, no berries
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oPine,
|
||||
"count": scaleByMapSize(12, 30),
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 60);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oPine, num, num, 0,3)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
}
|
||||
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(15);
|
||||
|
||||
paintRiver({
|
||||
|
|
|
|||
|
|
@ -50,89 +50,10 @@ var clBaseResource = createTileClass();
|
|||
|
||||
initTerrain(tSand);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
var placer = undefined;
|
||||
var fx = 0; var fz = 0;
|
||||
var ix =0; var iz = 0;
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
fx = fractionToTiles(playerX[i]);
|
||||
fz = fractionToTiles(playerZ[i]);
|
||||
ix = Math.round(fx);
|
||||
iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(eBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
}
|
||||
var mDist = radius*1.3;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(eMetalMine, 1,1, 0,0),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3),new SimpleObject(ePalmShort, 2,2, 2,3),new SimpleObject(ePalmTall, 1,1, 2,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
mX = Math.round(fx + mDist*1.5 * cos(mAngle + PI/1.578));
|
||||
mZ = Math.round(fz + mDist*1.5 * sin(mAngle + PI/1.578));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(eMetalMine, 1,1, 0,0),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3),new SimpleObject(ePalmShort, 2,2, 2,3),new SimpleObject(ePalmTall, 1,1, 2,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(eStoneMine, 1,1, 0,2),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3),new SimpleObject(ePalmShort, 2,2, 2,3),new SimpleObject(ePalmTall, 1,1, 2,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
mX = Math.round(fx + mDist * 1.4 * cos(mAngle - PI /2.46));
|
||||
mZ = Math.round(fz + mDist * 1.4 * sin(mAngle - PI /2.46));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(eStoneMine, 1,1, 0,2),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 3,3),new SimpleObject(ePalmShort, 2,2, 3,3),new SimpleObject(ePalmTall, 1,1, 3,3)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
}
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
|
||||
log("Creating small oasis near the players...")
|
||||
var forestDist = scaleByMapSize(15, 25) * 1.2;
|
||||
var forestDist = 1.2 * defaultPlayerBaseRadius();
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
|
|
@ -191,6 +112,36 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
}
|
||||
Engine.SetProgress(20);
|
||||
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad,
|
||||
"painters": [
|
||||
paintClass(clPlayer)
|
||||
]
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": eBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": eMetalMine },
|
||||
{ "template": eStoneMine },
|
||||
],
|
||||
"distance": defaultPlayerBaseRadius(),
|
||||
"maxAngle": PI / 2,
|
||||
"groupElements": shuffleArray([aBushA, aBushB, ePalmShort, ePalmTall]).map(t => new SimpleObject(t, 1, 1, 3, 4))
|
||||
}
|
||||
// Starting trees were set above
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(35);
|
||||
|
||||
log("Creating bumps...");
|
||||
createAreas(
|
||||
new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1),
|
||||
|
|
|
|||
|
|
@ -63,88 +63,34 @@ var clCP = createTileClass();
|
|||
|
||||
initTerrain(tDirtMain);
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// scale radius of player area by map size
|
||||
var radius = scaleByMapSize(15,25);
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
// calculate size based on the radius
|
||||
var size = PI * radius * radius;
|
||||
|
||||
// create the player area
|
||||
var placer = new ClumpPlacer(size, 0.9, 0.5, 10, ix, iz);
|
||||
createArea(placer, paintClass(clPlayer), null);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = 10;
|
||||
placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tCity, tCity], [3]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oGrapesBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tCity,
|
||||
"innerTerrain": tCity,
|
||||
"painters": [
|
||||
paintClass(clPlayer)
|
||||
]
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oGrapesBush,
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
],
|
||||
"groupElements": shuffleArray(aBushes).map(t => new SimpleObject(t, 1, 1, 3, 4))
|
||||
},
|
||||
"Trees": {
|
||||
"template": oOak,
|
||||
"count": 3
|
||||
}
|
||||
var mDist = 11;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0), new RandomObject(aBushes, 2,4, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 3;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oOak, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
}
|
||||
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(10);
|
||||
|
||||
log("Creating rock patches...");
|
||||
|
|
|
|||
|
|
@ -56,85 +56,33 @@ var clGrass = createTileClass();
|
|||
var clHill = createTileClass();
|
||||
var clIsland = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementLine(false, 0.76, 0.2);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.floor(fx);
|
||||
var iz = Math.floor(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oGrapeBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementLine(false, 0.76, 0.2),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tCityPlaza,
|
||||
"innerTerrain": tCity
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oGrapeBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oCarob,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aBush1
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oCarob, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius);
|
||||
}
|
||||
|
||||
});
|
||||
Engine.SetProgress(30);
|
||||
|
||||
paintRiver({
|
||||
|
|
|
|||
|
|
@ -43,71 +43,45 @@ var clFood = createTileClass();
|
|||
var clBaseResource = createTileClass();
|
||||
var clArcticWolf = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
|
||||
log("Creating player markets...");
|
||||
var marketDist = 12;
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
let id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
let fz = fractionToTiles(playerZ[i]);
|
||||
let ix = Math.round(fx);
|
||||
let iz = Math.round(fz);
|
||||
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// Create the city patch
|
||||
let cityRadius = scaleByMapSize(15,25)/3;
|
||||
let placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
let painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource, undefined, oMuskox);
|
||||
|
||||
// Create metal mine
|
||||
let mAngle = randFloat(0, 2 * Math.PI);
|
||||
let mDist = 12;
|
||||
let mX = Math.round(fx + mDist * Math.cos(mAngle));
|
||||
let mZ = Math.round(fz + mDist * Math.sin(mAngle));
|
||||
let group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1, 1, 0, 0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// Create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * Math.cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * Math.sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1, 1, 0, 2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// Create wood treasure
|
||||
mAngle += PI/4;
|
||||
let bbX = Math.round(fx + mDist * Math.cos(mAngle));
|
||||
let bbZ = Math.round(fz + mDist * Math.sin(mAngle));
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oWoodTreasure, 14,14, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ,
|
||||
avoidClasses(clBaseResource, 4)
|
||||
), 0);
|
||||
|
||||
// Create market
|
||||
mAngle += PI/4;
|
||||
placeObject(
|
||||
Math.round(fx + mDist * Math.cos(mAngle)),
|
||||
Math.round(fz + mDist * Math.sin(mAngle)),
|
||||
oMarket,
|
||||
id,
|
||||
BUILDING_ORIENTATION);
|
||||
let marketPos = Vector2D.add(new Vector2D(playerX[i], playerZ[i]).mult(mapSize), new Vector2D(marketDist, 0).rotate(randFloat(0, 2 * Math.PI))).round();
|
||||
placeObject(marketPos.x, marketPos.y, oMarket, playerIDs[i], BUILDING_ORIENTATION);
|
||||
addCivicCenterAreaToClass(marketPos.x, marketPos.y, clBaseResource);
|
||||
}
|
||||
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": "towers",
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
"template": oMuskox
|
||||
},
|
||||
// No berries, no trees, no decoratives
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Treasures": {
|
||||
"types": [
|
||||
{
|
||||
"template": oWoodTreasure,
|
||||
"count": 14
|
||||
}
|
||||
]
|
||||
},
|
||||
});
|
||||
Engine.SetProgress(30);
|
||||
|
||||
log("Creating central lake...");
|
||||
|
|
|
|||
|
|
@ -105,89 +105,36 @@ for (var ix = 0; ix < mapSize; ix++)
|
|||
}
|
||||
}
|
||||
|
||||
var playerIDs = primeSortAllPlayers();
|
||||
var [playerX, playerZ] = playerPlacementCustomAngle(
|
||||
0.35,
|
||||
tilesToFraction(mapCenter.x),
|
||||
tilesToFraction(mapCenter.y),
|
||||
i => oceanAngle + Math.PI * (i % 2 ? 1 : -1) * ((1/2 + 1/3 * (2/numPlayers * (i + 1 - i % 2) - 1))));
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
ix = Math.round(fx);
|
||||
iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [primeSortAllPlayers(), ...playerPlacementCustomAngle(
|
||||
0.35,
|
||||
tilesToFraction(mapCenter.x),
|
||||
tilesToFraction(mapCenter.y),
|
||||
i => oceanAngle + Math.PI * (i % 2 ? 1 : -1) * ((1/2 + 1/3 * (2/numPlayers * (i + 1 - i % 2) - 1))))],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oPine
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 100);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oPine, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(30);
|
||||
|
||||
log("Creating the pyreneans...");
|
||||
|
|
|
|||
|
|
@ -48,85 +48,32 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oBeech
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
var mDist = radius - 4;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 100);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = 12;
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oBeech, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
|
||||
});
|
||||
Engine.SetProgress(15);
|
||||
|
||||
log("Creating bumps...");
|
||||
|
|
|
|||
|
|
@ -111,77 +111,34 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
paintClass(clPlayerTerritory)
|
||||
]);
|
||||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
log("Creating base for player " + playerIDs[i] + "...");
|
||||
let radius = scaleByMapSize(12, 20);
|
||||
|
||||
let fx = fractionToTiles(playerX[i]);
|
||||
let fz = fractionToTiles(playerZ[i]);
|
||||
let ix = Math.round(fx);
|
||||
let iz = Math.round(fz);
|
||||
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// Create the city patch
|
||||
let cityRadius = radius / 3;
|
||||
createArea(
|
||||
new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz),
|
||||
new LayeredPainter([tRoadWild, tRoad], [1]),
|
||||
null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, playerIDs[i], { 'iberWall': 'towers' });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource, undefined, oPeacock);
|
||||
|
||||
// Create berry bushes
|
||||
let angle = randFloat(0, 2 * PI);
|
||||
let dist = 12;
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oBush, 5, 5, 0, 3)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + dist * Math.cos(angle)),
|
||||
Math.round(fz + dist * Math.sin(angle))),
|
||||
0);
|
||||
|
||||
// Create metal mine
|
||||
angle += randFloat(PI/8, PI/4);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1, 1, 0, 0)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + dist * Math.cos(angle)),
|
||||
Math.round(fz + dist * Math.sin(angle))),
|
||||
0);
|
||||
|
||||
// Create stone mines
|
||||
angle += randFloat(PI/8, PI/4);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1, 1, 0, 2)],
|
||||
true,
|
||||
clBaseResource,
|
||||
Math.round(fx + dist * Math.cos(angle)),
|
||||
Math.round(fz + dist * Math.sin(angle))),
|
||||
0);
|
||||
|
||||
// Create starting trees
|
||||
let num = 40;
|
||||
let tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
let tDist = randFloat(12, 13);
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(oTree, num, num, 0, 3)],
|
||||
false,
|
||||
clBaseResource,
|
||||
Math.round(fx + tDist * Math.cos(tAngle)),
|
||||
Math.round(fz + tDist * Math.sin(tAngle))),
|
||||
0,
|
||||
avoidClasses(clBaseResource, 2));
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": "towers",
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad,
|
||||
"radius": playerRadius / 3
|
||||
},
|
||||
"Chicken": {
|
||||
"template": oPeacock
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree,
|
||||
"count": 40
|
||||
}
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(35);
|
||||
|
||||
log("Creating gaia...");
|
||||
|
|
|
|||
|
|
@ -69,6 +69,36 @@ var shallowHeight = -1;
|
|||
|
||||
initTerrain(tMainTerrain);
|
||||
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35);
|
||||
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
|
||||
log("Creating central lake...");
|
||||
createArea(
|
||||
new ClumpPlacer(
|
||||
|
|
@ -85,85 +115,6 @@ createArea(
|
|||
],
|
||||
null);
|
||||
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
Engine.SetProgress(20);
|
||||
|
||||
log("Creating rivers between opponents...");
|
||||
let rivers = distributePointsOnCircle(numPlayers, startAngle + Math.PI / numPlayers, fractionToTiles(0.5), mapCenter)[0];
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
|
|
|
|||
|
|
@ -1,43 +0,0 @@
|
|||
function placeDefaultChicken(playerX, playerZ, tileClass, constraint = undefined, template = "gaia/fauna_chicken")
|
||||
{
|
||||
for (let j = 0; j < 2; ++j)
|
||||
for (var tries = 0; tries < 10; ++tries)
|
||||
{
|
||||
let aAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
// Roman and ptolemian civic centers have a big footprint!
|
||||
let aDist = 9;
|
||||
|
||||
let aX = Math.round(playerX + aDist * cos(aAngle));
|
||||
let aZ = Math.round(playerZ + aDist * sin(aAngle));
|
||||
|
||||
let group = new SimpleGroup(
|
||||
[new SimpleObject(template, 5,5, 0,2)],
|
||||
true, tileClass, aX, aZ
|
||||
);
|
||||
|
||||
if (createObjectGroup(group, 0, constraint))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Typically used for placing grass tufts around the civic centers.
|
||||
*/
|
||||
function placeDefaultDecoratives(playerX, playerZ, template, tileclass, radius, constraint = undefined)
|
||||
{
|
||||
for (let i = 0; i < PI * radius * radius / 250; ++i)
|
||||
{
|
||||
let angle = randFloat(0, 2 * PI);
|
||||
let dist = radius - randIntInclusive(5, 11);
|
||||
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(template, 2, 5, 0, 1, -PI/8, PI/8)],
|
||||
false,
|
||||
tileclass,
|
||||
Math.round(playerX + dist * Math.cos(angle)),
|
||||
Math.round(playerZ + dist * Math.sin(angle))
|
||||
), 0, constraint);
|
||||
}
|
||||
}
|
||||
|
|
@ -2,6 +2,23 @@
|
|||
* @file These functions locate and place the starting entities of players.
|
||||
*/
|
||||
|
||||
/**
|
||||
* These are identifiers of functions that can generate parts of a player base.
|
||||
* There must be a function starting with placePlayerBase and ending with this name.
|
||||
* This is a global so mods can extend this from external files.
|
||||
*/
|
||||
var g_PlayerBaseFunctions = [
|
||||
// Possibly mark player class first here and use it afterwards
|
||||
"CityPatch",
|
||||
// Create the largest and most important entities first
|
||||
"Trees",
|
||||
"Mines",
|
||||
"Treasures",
|
||||
"Berries",
|
||||
"Chicken",
|
||||
"Decoratives"
|
||||
];
|
||||
|
||||
/**
|
||||
* Gets the default starting entities for the civ of the given player, as defined by the civ file.
|
||||
*/
|
||||
|
|
@ -44,22 +61,86 @@ function placeStartingEntities(fx, fz, playerID, civEntities, dist = 6, orientat
|
|||
}
|
||||
|
||||
/**
|
||||
* Places the default starting entities as defined by the civilization definition and walls for Iberians.
|
||||
* Places the default starting entities as defined by the civilization definition, optionally including city walls.
|
||||
*/
|
||||
function placeCivDefaultEntities(fx, fz, playerID, kwargs, dist = 6, orientation = BUILDING_ORIENTATION)
|
||||
function placeCivDefaultStartingEntities(x, z, playerID, wallType, dist = 6, orientation = BUILDING_ORIENTATION)
|
||||
{
|
||||
placeStartingEntities(fx, fz, playerID, getStartingEntities(playerID), dist, orientation);
|
||||
placeStartingEntities(x, z, playerID, getStartingEntities(playerID), dist, orientation);
|
||||
placeStartingWalls(x, z, playerID, wallType, orientation);
|
||||
}
|
||||
|
||||
/**
|
||||
* If the map is large enough and the civilization defines them, places the initial city walls or towers.
|
||||
* @param {string|boolean} wallType - Either "towers" to only place the wall turrets or a boolean indicating enclosing city walls.
|
||||
*/
|
||||
function placeStartingWalls(x, z, playerID, wallType, orientation = BUILDING_ORIENTATION)
|
||||
{
|
||||
let civ = getCivCode(playerID);
|
||||
if (civ == "iber" && getMapSize() > 128)
|
||||
if (civ != "iber" || getMapSize() <= 128)
|
||||
return;
|
||||
|
||||
if (wallType == "towers")
|
||||
placePolygonalWall(x, z, 15, ["entry"], "tower", civ, playerID, orientation, 7);
|
||||
else if (wallType)
|
||||
placeGenericFortress(x, z, 20, playerID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Places the civic center and starting resources for all given players.
|
||||
*/
|
||||
function placePlayerBases(playerBaseArgs)
|
||||
{
|
||||
let [playerIDs, playerX, playerZ] = playerBaseArgs.PlayerPlacement;
|
||||
|
||||
for (let i = 0; i < getNumPlayers(); ++i)
|
||||
{
|
||||
if (kwargs && kwargs.iberWall == "towers")
|
||||
placePolygonalWall(fx, fz, 15, ["entry"], "tower", civ, playerID, orientation, 7);
|
||||
else if (!kwargs || kwargs.iberWall)
|
||||
placeGenericFortress(fx, fz, 20, playerID);
|
||||
playerBaseArgs.playerID = playerIDs[i];
|
||||
playerBaseArgs.playerX = playerX[i];
|
||||
playerBaseArgs.playerZ = playerZ[i];
|
||||
placePlayerBase(playerBaseArgs);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Places the civic center and starting resources.
|
||||
*/
|
||||
function placePlayerBase(playerBaseArgs)
|
||||
{
|
||||
log("Creating base for player " + playerBaseArgs.playerID + "...");
|
||||
|
||||
let fx = fractionToTiles(playerBaseArgs.playerX);
|
||||
let fz = fractionToTiles(playerBaseArgs.playerZ);
|
||||
|
||||
placeCivDefaultStartingEntities(fx, fz, playerBaseArgs.playerID, playerBaseArgs.Walls !== undefined ? playerBaseArgs.Walls : true);
|
||||
|
||||
if (playerBaseArgs.PlayerTileClass !== undefined)
|
||||
addCivicCenterAreaToClass(Math.round(fx), Math.round(fz), playerBaseArgs.PlayerTileClass);
|
||||
|
||||
for (let functionID of g_PlayerBaseFunctions)
|
||||
{
|
||||
let funcName = "placePlayerBase" + functionID;
|
||||
let func = global[funcName];
|
||||
if (!func)
|
||||
throw new Error("Could not find " + funcName);
|
||||
|
||||
if (!playerBaseArgs[functionID])
|
||||
continue;
|
||||
|
||||
let args = playerBaseArgs[functionID];
|
||||
|
||||
// Copy some global arguments to the arguments for each function
|
||||
for (let prop of ["playerID", "playerX", "playerZ", "BaseResourceClass", "baseResourceConstraint"])
|
||||
args[prop] = playerBaseArgs[prop];
|
||||
|
||||
func(args);
|
||||
}
|
||||
}
|
||||
|
||||
function defaultPlayerBaseRadius()
|
||||
{
|
||||
return scaleByMapSize(15, 25);
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks the corner and center tiles of an area that is about the size of a Civic Center with the given TileClass.
|
||||
* Used to prevent resource collisions with the Civic Center.
|
||||
|
|
@ -75,6 +156,250 @@ function addCivicCenterAreaToClass(ix, iz, tileClass)
|
|||
addToClass(ix - 5, iz, tileClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function.
|
||||
*/
|
||||
function getPlayerBaseArgs(playerBaseArgs)
|
||||
{
|
||||
let baseResourceConstraint = playerBaseArgs.BaseResourceClass && avoidClasses(playerBaseArgs.BaseResourceClass, 4);
|
||||
|
||||
if (playerBaseArgs.baseResourceConstraint)
|
||||
baseResourceConstraint = new AndConstraint([baseResourceConstraint, playerBaseArgs.baseResourceConstraint]);
|
||||
|
||||
return [
|
||||
(property, defaultVal) => playerBaseArgs[property] === undefined ? defaultVal : playerBaseArgs[property],
|
||||
new Vector2D(playerBaseArgs.playerX, playerBaseArgs.playerZ).mult(getMapSize()),
|
||||
baseResourceConstraint
|
||||
];
|
||||
}
|
||||
|
||||
function placePlayerBaseCityPatch(args)
|
||||
{
|
||||
let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args);
|
||||
|
||||
let painters = [];
|
||||
|
||||
if (args.outerTerrain && args.innerTerrain)
|
||||
painters.push(new LayeredPainter([args.outerTerrain, args.innerTerrain], [get("width", 1)]));
|
||||
|
||||
if (args.painters)
|
||||
painters = painters.concat(args.painters);
|
||||
|
||||
createArea(
|
||||
new ClumpPlacer(
|
||||
Math.floor(diskArea(get("radius", defaultPlayerBaseRadius() / 3))),
|
||||
get("coherence", 0.6),
|
||||
get("smoothness", 0.3),
|
||||
get("failFraction", 10),
|
||||
Math.round(basePosition.x),
|
||||
Math.round(basePosition.y)),
|
||||
painters);
|
||||
}
|
||||
|
||||
function placePlayerBaseChicken(args)
|
||||
{
|
||||
let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args);
|
||||
|
||||
for (let i = 0; i < get("groupCount", 2); ++i)
|
||||
{
|
||||
let success = false;
|
||||
for (let tries = 0; tries < get("maxTries", 30); ++tries)
|
||||
{
|
||||
let loc = new Vector2D(0, get("distance", 9)).rotate(randFloat(0, 2 * Math.PI)).add(basePosition);
|
||||
if (createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(get("template", "gaia/fauna_chicken"), 5, 5, 0, get("count", 2))],
|
||||
true,
|
||||
args.BaseResourceClass,
|
||||
loc.x,
|
||||
loc.y),
|
||||
0,
|
||||
baseResourceConstraint))
|
||||
{
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!success)
|
||||
{
|
||||
error("Could not place chicken for player " + args.playerID);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function placePlayerBaseBerries(args)
|
||||
{
|
||||
let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args);
|
||||
for (let tries = 0; tries < get("maxTries", 30); ++tries)
|
||||
{
|
||||
let loc = new Vector2D(0, get("distance", 12)).rotate(randFloat(0, 2 * Math.PI)).add(basePosition);
|
||||
if (createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(args.template, get("minCount", 5), get("maxCount", 5), get("maxDist", 1), get("maxDist", 3))],
|
||||
true,
|
||||
args.BaseResourceClass,
|
||||
loc.x,
|
||||
loc.y),
|
||||
0,
|
||||
baseResourceConstraint))
|
||||
return;
|
||||
}
|
||||
|
||||
error("Could not place berries for player " + args.playerID);
|
||||
}
|
||||
|
||||
function placePlayerBaseMines(args)
|
||||
{
|
||||
let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args);
|
||||
|
||||
let angleBetweenMines = randFloat(get("minAngle", Math.PI / 6), get("maxAngle", Math.PI / 3));
|
||||
let mineCount = args.types.length;
|
||||
|
||||
let groupElements = [];
|
||||
if (args.groupElements)
|
||||
groupElements = groupElements.concat(args.groupElements);
|
||||
|
||||
for (let tries = 0; tries < get("maxTries", 75); ++tries)
|
||||
{
|
||||
// First find a place where all mines can be placed
|
||||
let pos = [];
|
||||
let startAngle = randFloat(0, 2 * Math.PI);
|
||||
for (let i = 0; i < mineCount; ++i)
|
||||
{
|
||||
let angle = startAngle + angleBetweenMines * (i + (mineCount - 1) / 2);
|
||||
pos[i] = new Vector2D(0, get("distance", 12)).rotate(angle).add(basePosition).round();
|
||||
if (!g_Map.validT(pos[i].x, pos[i].y) || !baseResourceConstraint.allows(pos[i].x, pos[i].y))
|
||||
{
|
||||
pos = undefined;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pos)
|
||||
continue;
|
||||
|
||||
// Place the mines
|
||||
for (let i = 0; i < mineCount; ++i)
|
||||
{
|
||||
if (args.types[i].type && args.types[i].type == "stone_formation")
|
||||
{
|
||||
createStoneMineFormation(pos[i].x, pos[i].y, args.types[i].template, args.types[i].terrain);
|
||||
addToClass(pos[i].x, pos[i].y, args.BaseResourceClass);
|
||||
continue;
|
||||
}
|
||||
|
||||
createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(args.types[i].template, 1, 1, 0, 0)].concat(groupElements),
|
||||
true,
|
||||
args.BaseResourceClass,
|
||||
pos[i].x,
|
||||
pos[i].y),
|
||||
0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
error("Could not place mines for player " + args.playerID);
|
||||
}
|
||||
|
||||
function placePlayerBaseTrees(args)
|
||||
{
|
||||
let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args);
|
||||
|
||||
let num = Math.floor(get("count", scaleByMapSize(7, 20)));
|
||||
|
||||
for (let x = 0; x < get("maxTries", 30); ++x)
|
||||
{
|
||||
let loc = new Vector2D(0, randFloat(get("minDist", 11), get("maxDist", 13))).rotate(randFloat(0, 2 * Math.PI)).add(basePosition).round();
|
||||
|
||||
if (createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(args.template, num, num, get("minDistGroup", 0), get("maxDistGroup", 5))],
|
||||
false,
|
||||
args.BaseResourceClass,
|
||||
loc.x,
|
||||
loc.y),
|
||||
0,
|
||||
baseResourceConstraint))
|
||||
return;
|
||||
}
|
||||
|
||||
error("Could not place starting trees for player " + args.playerID);
|
||||
}
|
||||
|
||||
function placePlayerBaseTreasures(args)
|
||||
{
|
||||
let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args);
|
||||
|
||||
for (let resourceTypeArgs of args.types)
|
||||
{
|
||||
get = (property, defaultVal) => resourceTypeArgs[property] === undefined ? defaultVal : resourceTypeArgs[property];
|
||||
|
||||
let success = false;
|
||||
|
||||
for (let tries = 0; tries < get("maxTries", 30); ++tries)
|
||||
{
|
||||
let loc = new Vector2D(0, randFloat(get("minDist", 11), get("maxDist", 13))).rotate(randFloat(0, 2 * Math.PI)).add(basePosition).round();
|
||||
|
||||
if (createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(resourceTypeArgs.template, get("count", 14), get("count", 14), get("minDistGroup", 1), get("maxDistGroup", 3))],
|
||||
false,
|
||||
args.BaseResourceClass,
|
||||
loc.x,
|
||||
loc.y),
|
||||
0,
|
||||
baseResourceConstraint))
|
||||
{
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!success)
|
||||
{
|
||||
error("Could not place treasure " + resourceTypeArgs.template + " for player " + args.playerID);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Typically used for placing grass tufts around the civic centers.
|
||||
*/
|
||||
function placePlayerBaseDecoratives(args)
|
||||
{
|
||||
let [get, basePosition, baseResourceConstraint] = getPlayerBaseArgs(args);
|
||||
|
||||
for (let i = 0; i < get("count", scaleByMapSize(2, 5)); ++i)
|
||||
{
|
||||
let success = false;
|
||||
for (let x = 0; x < get("maxTries", 30); ++x)
|
||||
{
|
||||
let loc = new Vector2D(0, randIntInclusive(get("minDist", 8), get("maxDist", 11))).rotate(randFloat(0, 2 * Math.PI)).add(basePosition).round();
|
||||
|
||||
if (createObjectGroup(
|
||||
new SimpleGroup(
|
||||
[new SimpleObject(args.template, get("minCount", 2), get("maxCount", 5), 0, 1)],
|
||||
false,
|
||||
args.BaseResourceClass,
|
||||
loc.x,
|
||||
loc.y),
|
||||
0,
|
||||
baseResourceConstraint))
|
||||
{
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!success)
|
||||
// Don't warn since the decoratives are not important
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts an array of player IDs by team index. Players without teams come first.
|
||||
* Randomize order for players of the same team.
|
||||
|
|
@ -124,7 +449,7 @@ function primeSortAllPlayers()
|
|||
/**
|
||||
* Determine player starting positions on a circular pattern.
|
||||
*/
|
||||
function radialPlayerPlacement(radius = 0.35, startingAngle = undefined, centerX = 0.5, centerZ = 0.5)
|
||||
function playerPlacementCircle(radius, startingAngle = undefined, centerX = 0.5, centerZ = 0.5)
|
||||
{
|
||||
let startAngle = startingAngle !== undefined ? startingAngle : randFloat(0, 2 * Math.PI);
|
||||
let [locations, playerAngle] = distributePointsOnCircle(getNumPlayers(), startAngle, radius, new Vector2D(centerX, centerZ));
|
||||
|
|
|
|||
|
|
@ -164,98 +164,40 @@ function addBases(type, distance, groupedDistance, startAngle)
|
|||
*/
|
||||
function createBase(player, walls = true)
|
||||
{
|
||||
var mapSize = getMapSize();
|
||||
|
||||
// Get the x and z in tiles
|
||||
var fx = fractionToTiles(player.x);
|
||||
var fz = fractionToTiles(player.z);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
addCivicCenterAreaToClass(ix, iz, g_TileClasses.player);
|
||||
|
||||
if (walls && mapSize > 192)
|
||||
placeCivDefaultEntities(fx, fz, player.id);
|
||||
else
|
||||
placeCivDefaultEntities(fx, fz, player.id, { 'iberWall': false });
|
||||
|
||||
// Create the city patch
|
||||
var radius = scaleByMapSize(15, 25);
|
||||
var cityRadius = radius / 3;
|
||||
var placer = new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([g_Terrains.roadWild, g_Terrains.road], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
// TODO: retry loops are needed as resources might conflict with neighboring ones
|
||||
|
||||
// Create initial berry bushes at random angle
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 10;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(g_Gaia.fruitBush, 5, 5, 0, 3)],
|
||||
true, g_TileClasses.baseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2));
|
||||
|
||||
// Create metal mine at a different angle
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(g_Gaia.metalLarge, 1, 1, 0, 0)],
|
||||
true, g_TileClasses.baseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2));
|
||||
|
||||
// Create stone mine beside metal
|
||||
mAngle += randFloat(PI / 8, PI / 4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(g_Gaia.stoneLarge, 1, 1, 0, 2)],
|
||||
true, g_TileClasses.baseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2));
|
||||
|
||||
placeDefaultChicken(
|
||||
fx,
|
||||
fz,
|
||||
g_TileClasses.baseResource,
|
||||
avoidClasses(g_TileClasses.baseResource, 4),
|
||||
g_Gaia.chicken
|
||||
);
|
||||
|
||||
// Create starting trees
|
||||
var num = currentBiome() == "savanna" ? 5 : 15;
|
||||
for (var tries = 0; tries < 10; ++tries)
|
||||
{
|
||||
var tAngle = randFloat(0, 2 * Math.PI);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(g_Gaia.tree1, num, num, 1, 3)],
|
||||
false, g_TileClasses.baseResource, tX, tZ
|
||||
);
|
||||
|
||||
if (createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 4)))
|
||||
break;
|
||||
}
|
||||
|
||||
placeDefaultDecoratives(
|
||||
fx,
|
||||
fz,
|
||||
g_Decoratives.grassShort,
|
||||
g_TileClasses.baseResource,
|
||||
radius,
|
||||
avoidClasses(g_TileClasses.baseResource, 4));
|
||||
placePlayerBase({
|
||||
"playerID": player.id,
|
||||
"playerX": player.x,
|
||||
"playerZ": player.z,
|
||||
"PlayerTileClass": g_TileClasses.player,
|
||||
"BaseResourceClass": g_TileClasses.baseResource,
|
||||
"Walls": getMapSize() > 192 && walls,
|
||||
"CityPatch": {
|
||||
"outerTerrain": g_Terrains.roadWild,
|
||||
"innerTerrain": g_Terrains.road,
|
||||
"painters": [
|
||||
paintClass(g_TileClasses.player)
|
||||
]
|
||||
},
|
||||
"Chicken": {
|
||||
"template": g_Gaia.chicken
|
||||
},
|
||||
"Berries": {
|
||||
"template": g_Gaia.fruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": g_Gaia.metalLarge },
|
||||
{ "template": g_Gaia.stoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": g_Gaia.tree1,
|
||||
"count": currentBiome() == "savanna" ? 5 : 15
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": g_Decoratives.grassShort
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -50,85 +50,34 @@ var clGrass = createTileClass();
|
|||
var clPond = createTileClass();
|
||||
var clTreasure = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ, playerAngle] = playerPlacementCircle(0.35);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.floor(fx);
|
||||
var iz = Math.floor(fz);
|
||||
addToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oGrapeBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tCityPlaza,
|
||||
"innerTerrain": tCity
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oGrapeBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oSDatePalm
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aBush1
|
||||
}
|
||||
var mDist = radius - 5;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 100);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = 12;
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oSDatePalm, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius);
|
||||
}
|
||||
|
||||
});
|
||||
Engine.SetProgress(30);
|
||||
|
||||
log("Creating oases...");
|
||||
|
|
|
|||
|
|
@ -39,81 +39,39 @@ var clMetal = createTileClass();
|
|||
var clFood = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tCityTiles,
|
||||
"innerTerrain": tCityTiles
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{
|
||||
"template": oMetalLarge
|
||||
},
|
||||
{
|
||||
"type": "stone_formation",
|
||||
"template": oStoneSmall,
|
||||
"terrain": tDirt4
|
||||
}
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oBaobab,
|
||||
"count": scaleByMapSize(2, 7),
|
||||
"minDistGroup": 2,
|
||||
"maxDistGroup": 7
|
||||
}
|
||||
var mDist = 13;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
createStoneMineFormation(mX, mZ, oStoneSmall, tDirt4);
|
||||
addToClass(mX, mZ, clPlayer);
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new TerrainPainter(tCityTiles);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 300);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oBaobab, num, num, 2,7)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
}
|
||||
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
log("Creating big patches...");
|
||||
|
|
|
|||
|
|
@ -52,87 +52,38 @@ var clFood = createTileClass();
|
|||
var clBaseResource = createTileClass();
|
||||
var clShallows = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement();
|
||||
|
||||
var waterHeight = -4;
|
||||
var shallowHeight = -2;
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35);
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oBaobab,
|
||||
"count": 5
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 5;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oBaobab, num, num, 0,3)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
log("Creating rivers...");
|
||||
|
|
|
|||
|
|
@ -31,8 +31,6 @@ var clOpen = createTileClass();
|
|||
|
||||
var templateStoneMine = 'gaia/geology_stonemine_alpine_quarry';
|
||||
var templateMetalMine = 'gaia/geology_metal_alpine_slabs';
|
||||
var startingResources = ['gaia/flora_tree_pine', 'gaia/flora_tree_pine','gaia/flora_tree_pine', templateStoneMine,
|
||||
'gaia/flora_bush_grapes', 'gaia/flora_tree_aleppo_pine','gaia/flora_tree_aleppo_pine','gaia/flora_tree_aleppo_pine', 'gaia/flora_bush_berry', templateMetalMine];
|
||||
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';
|
||||
|
|
@ -94,7 +92,6 @@ var maxPlayerRadius = Math.min(mapRadius - baseRadius, 3/4 * mapRadius);
|
|||
|
||||
var playerStartLocX = [];
|
||||
var playerStartLocZ = [];
|
||||
var playerAngle = [];
|
||||
var playerAngleStart = randFloat(0, 2*PI);
|
||||
var playerAngleAddAvrg = 2*PI / numPlayers;
|
||||
var playerAngleMaxOff = playerAngleAddAvrg/4;
|
||||
|
|
@ -137,8 +134,6 @@ for (var i = 0; i < 5; i++)
|
|||
globalSmoothHeightmap();
|
||||
rescaleHeightmap(heightRange.min, heightRange.max);
|
||||
|
||||
Engine.SetProgress(50);
|
||||
|
||||
//////////
|
||||
// Setup height limit
|
||||
//////////
|
||||
|
|
@ -168,37 +163,52 @@ var playerHeight = (heighLimits[4] + heighLimits[5]) / 2;
|
|||
|
||||
for (var i=0; i < numPlayers; i++)
|
||||
{
|
||||
playerAngle[i] = (playerAngleStart + i*playerAngleAddAvrg + randFloat(0, playerAngleMaxOff))%(2*PI);
|
||||
|
||||
var x = Math.round(mapCenterX + randFloat(minPlayerRadius, maxPlayerRadius)*cos(playerAngle[i]));
|
||||
var z = Math.round(mapCenterZ + randFloat(minPlayerRadius, maxPlayerRadius)*sin(playerAngle[i]));
|
||||
let playerAngle = (playerAngleStart + i * playerAngleAddAvrg + randFloat(0, playerAngleMaxOff)) % (2* Math.PI);
|
||||
let x = Math.round(mapCenterX + randFloat(minPlayerRadius, maxPlayerRadius) * Math.cos(playerAngle));
|
||||
let z = Math.round(mapCenterZ + randFloat(minPlayerRadius, maxPlayerRadius) * Math.sin(playerAngle));
|
||||
|
||||
playerStartLocX[i] = x;
|
||||
playerStartLocZ[i] = z;
|
||||
|
||||
rectangularSmoothToHeight({"x": x,"y": z} , 20, 20, playerHeight, 0.8);
|
||||
|
||||
placeCivDefaultEntities(x, z, i+1, { 'iberWall': false });
|
||||
|
||||
// Place base texture
|
||||
var placer = new ClumpPlacer(2*baseRadius*baseRadius, 2/3, 1/8, 10, x, z);
|
||||
var painter = [new TerrainPainter([baseTex], [baseRadius/4, baseRadius/4]), paintClass(clPlayer)];
|
||||
createArea(placer, painter);
|
||||
|
||||
// Place starting resources
|
||||
var distToSL = 15;
|
||||
var resStartAngle = playerAngle[i] + PI;
|
||||
var resAddAngle = 2*PI / startingResources.length;
|
||||
for (var rIndex = 0; rIndex < startingResources.length; rIndex++)
|
||||
{
|
||||
var angleOff = randFloat(-resAddAngle/2, resAddAngle/2);
|
||||
var placeX = x + distToSL*cos(resStartAngle + rIndex*resAddAngle + angleOff);
|
||||
var placeZ = z + distToSL*sin(resStartAngle + rIndex*resAddAngle + angleOff);
|
||||
placeObject(placeX, placeZ, startingResources[rIndex], 0, randFloat(0, 2*PI));
|
||||
addToClass(Math.round(placeX), Math.round(placeZ), clBaseResource);
|
||||
}
|
||||
}
|
||||
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [sortAllPlayers(), playerStartLocX.map(tilesToFraction), playerStartLocZ.map(tilesToFraction)],
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": false,
|
||||
// player class painted below
|
||||
"CityPatch": {
|
||||
"radius": 0.8 * baseRadius,
|
||||
"smoothness": 1/8,
|
||||
"painters": [
|
||||
new TerrainPainter([baseTex], [baseRadius/4, baseRadius/4]),
|
||||
paintClass(clPlayer)
|
||||
]
|
||||
},
|
||||
// No chicken
|
||||
"Berries": {
|
||||
"template": "gaia/flora_bush_berry",
|
||||
"minCount": 2,
|
||||
"maxCount": 2,
|
||||
"minDist": 10,
|
||||
"maxDist": 10
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": templateMetalMine },
|
||||
{ "template": templateStoneMine }
|
||||
],
|
||||
"distance": 15,
|
||||
"minAngle": Math.PI / 2,
|
||||
"maxAngle": Math.PI
|
||||
},
|
||||
"Trees": {
|
||||
"template": "gaia/flora_tree_oak_large",
|
||||
"count": 2
|
||||
}
|
||||
});
|
||||
|
||||
// Add further stone and metal mines
|
||||
distributeEntitiesByHeight({ 'min': heighLimits[3], 'max': ((heighLimits[4] + heighLimits[3]) / 2) }, startLocations, 40, [templateStoneMine, templateMetalMine]);
|
||||
distributeEntitiesByHeight({ 'min': ((heighLimits[5] + heighLimits[6]) / 2), 'max': heighLimits[7] }, startLocations, 40, [templateStoneMine, templateMetalMine]);
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ const islandBetweenPlayerAndCenterDist = 0.16;
|
|||
const islandBetweenPlayerAndCenterRadius = 0.81;
|
||||
const centralIslandRadius = 0.36;
|
||||
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35);
|
||||
|
||||
var numIslands = 0;
|
||||
var isConnected = [];
|
||||
|
|
@ -218,76 +218,39 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
createIsland(i, 1, clPlayer);
|
||||
}
|
||||
|
||||
for (var i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = playerIslandRadius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 10;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = playerIslandRadius - 4;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = Math.floor(scaleByMapSize(10, 50));
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = 11;
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,4)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, [avoidClasses(clBaseResource,2), stayClasses(clPlayer, 3)]);
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, playerIslandRadius);
|
||||
}
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
// PlayerTileClass already marked above
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"baseResourceConstraint": stayClasses(clPlayer, 4),
|
||||
"Walls": "towers",
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush,
|
||||
"distance": playerIslandRadius - 4
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
],
|
||||
"distance": playerIslandRadius - 4
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1,
|
||||
"count": scaleByMapSize(10, 50),
|
||||
"minDist": 11,
|
||||
"maxDist": 11
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(30);
|
||||
|
||||
log("Creating connectors...");
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ createArea(
|
|||
]);
|
||||
Engine.SetProgress(10);
|
||||
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(0.3);
|
||||
var [playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.3);
|
||||
var halfway = distributePointsOnCircle(numPlayers, startAngle, fractionToTiles(0.375), mapCenter)[0].map(v => v.round());
|
||||
var attacker = distributePointsOnCircle(numPlayers, startAngle, fractionToTiles(0.45), mapCenter)[0].map(v => v.round());
|
||||
var passage = distributePointsOnCircle(numPlayers, startAngle + Math.PI / numPlayers, fractionToTiles(0.5), mapCenter)[0];
|
||||
|
|
@ -79,7 +79,12 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
placeStartingEntities(playerPos.x, playerPos.y, playerIDs[i], getStartingEntities(playerIDs[i]).filter(ent =>
|
||||
ent.Template.indexOf("civil_centre") != -1 || ent.Template.indexOf("infantry") != -1));
|
||||
|
||||
placeDefaultDecoratives(playerPos.x, playerPos.y, aGrassShort, clBaseResource, scaleByMapSize(15, 25));
|
||||
placePlayerBaseDecoratives({
|
||||
"playerX": playerX[i],
|
||||
"playerZ": playerZ[i],
|
||||
"template": aGrassShort,
|
||||
"BaseResourceClass": clBaseResource
|
||||
});
|
||||
|
||||
log("Creating passage separating players...");
|
||||
createArea(
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ var clFood = createTileClass();
|
|||
var clBaseResource = createTileClass();
|
||||
var clGrass = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
|
|
@ -67,78 +67,34 @@ for (let i = 0; i < numPlayers; ++i)
|
|||
}
|
||||
Engine.SetProgress(10);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
// scale radius of player area by map size
|
||||
var radius = scaleByMapSize(15,25);
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
// create the city patch
|
||||
var placer = new ClumpPlacer(diskArea(10), 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [3]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
// PlayerTileClass marked above
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad,
|
||||
"radius": 10,
|
||||
"width": 3
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
],
|
||||
"groupElements": [new RandomObject(aBushes, 2, 4, 2, 3)]
|
||||
},
|
||||
"Trees": {
|
||||
"template": pickRandom([oPalm, oTamarix]),
|
||||
"count": 3
|
||||
}
|
||||
var mDist = 11;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0), new RandomObject(aBushes, 2,4, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 3;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(pickRandom([oPalm, oTamarix]), num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
}
|
||||
|
||||
// No decoratives
|
||||
});
|
||||
Engine.SetProgress(20);
|
||||
|
||||
log("Creating bumps...");
|
||||
|
|
|
|||
|
|
@ -61,83 +61,33 @@ var clPond = createTileClass();
|
|||
var clShore = createTileClass();
|
||||
var clTreasure = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = playerPlacementRiver(0, 0.4);
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
var cliffRadius = 2;
|
||||
var elevation = 20;
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.floor(fx);
|
||||
var iz = Math.floor(fz);
|
||||
addToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oBerryBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
var mDist = radius - 4;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var num = 2;
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oDatePalm, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius);
|
||||
}
|
||||
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementRiver(0, 0.4),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tCityPlaza,
|
||||
"innerTerrain": tCity
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oBerryBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oDatePalm,
|
||||
"count": 2
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aBush1
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(30);
|
||||
|
||||
const riverTextures = [
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ var playerX = [];
|
|||
var playerZ = [];
|
||||
|
||||
var g_StartingTreasures = false;
|
||||
var g_IberianWalls = "walls";
|
||||
var g_StartingWalls = true;
|
||||
|
||||
function createUnknownMap()
|
||||
{
|
||||
|
|
@ -131,10 +131,10 @@ function createUnknownMap()
|
|||
*/
|
||||
function unknownArchipelago()
|
||||
{
|
||||
g_IberianWalls = "towers";
|
||||
g_StartingWalls = "towers";
|
||||
g_StartingTreasures = true;
|
||||
|
||||
let [pIDs, islandX, islandZ] = radialPlayerPlacement();
|
||||
let [pIDs, islandX, islandZ] = playerPlacementCircle(0.35);
|
||||
if (g_PlayerBases)
|
||||
{
|
||||
[playerIDs, playerX, playerZ] = [pIDs, islandX, islandZ];
|
||||
|
|
@ -219,7 +219,7 @@ function unknownContinent()
|
|||
if (g_PlayerBases)
|
||||
{
|
||||
log("Ensuring player area...");
|
||||
[playerIDs, playerX, playerZ] = radialPlayerPlacement(0.25);
|
||||
[playerIDs, playerX, playerZ] = playerPlacementCircle(0.25);
|
||||
markPlayerArea("small");
|
||||
|
||||
for (let i = 0; i < numPlayers; ++i)
|
||||
|
|
@ -419,7 +419,7 @@ function unknownRiversAndLake()
|
|||
if (g_PlayerBases)
|
||||
{
|
||||
let playerAngle;
|
||||
[playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement();
|
||||
[playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35);
|
||||
markPlayerArea("small");
|
||||
}
|
||||
|
||||
|
|
@ -575,7 +575,7 @@ function unknownLakes()
|
|||
|
||||
if (g_PlayerBases)
|
||||
{
|
||||
[playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
[playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
markPlayerArea("large");
|
||||
}
|
||||
|
||||
|
|
@ -603,7 +603,7 @@ function unknownPasses()
|
|||
let startAngle;
|
||||
if (g_PlayerBases)
|
||||
{
|
||||
[playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement();
|
||||
[playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35);
|
||||
markPlayerArea("small");
|
||||
}
|
||||
else
|
||||
|
|
@ -682,7 +682,7 @@ function unknownLowlands()
|
|||
let startAngle;
|
||||
if (g_PlayerBases)
|
||||
{
|
||||
[playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement();
|
||||
[playerIDs, playerX, playerZ, playerAngle, startAngle] = playerPlacementCircle(0.35);
|
||||
markPlayerArea("small");
|
||||
}
|
||||
else
|
||||
|
|
@ -734,7 +734,7 @@ function unknownMainland()
|
|||
|
||||
if (g_PlayerBases)
|
||||
{
|
||||
[playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
[playerIDs, playerX, playerZ] = playerPlacementCircle(0.35);
|
||||
markPlayerArea("small");
|
||||
}
|
||||
}
|
||||
|
|
@ -1031,94 +1031,41 @@ function createUnknownObjects()
|
|||
|
||||
function createUnknownPlayerBases()
|
||||
{
|
||||
for (var i = 0; i < numPlayers; ++i)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(17,29);
|
||||
var shoreRadius = 4;
|
||||
var elevation = 3;
|
||||
|
||||
var hillSize = PI * radius * radius;
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id, { "iberWall": g_IberianWalls });
|
||||
|
||||
placeDefaultChicken(fx, fz, clBaseResource);
|
||||
|
||||
// create berry bushes
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oFruitBush, 5,5, 0,3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
if (g_StartingTreasures)
|
||||
{
|
||||
// create woods
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 13;
|
||||
var bbX = Math.round(fx + bbDist * cos(bbAngle));
|
||||
var bbZ = Math.round(fz + bbDist * sin(bbAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oWoodTreasure, 14, 14, 0, 3)],
|
||||
true, clBaseResource, bbX, bbZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": [playerIDs, playerX, playerZ],
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"Walls": g_StartingWalls,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad,
|
||||
"painters": [
|
||||
paintClass(clPlayer)
|
||||
]
|
||||
},
|
||||
"Chicken": {
|
||||
},
|
||||
"Berries": {
|
||||
"template": oFruitBush
|
||||
},
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Treasures": {
|
||||
"types": [
|
||||
{
|
||||
"template": oWoodTreasure,
|
||||
"count": g_StartingTreasures ? 14 : 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree1
|
||||
},
|
||||
"Decoratives": {
|
||||
"template": aGrassShort
|
||||
}
|
||||
|
||||
// create metal mine
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
{
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
}
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
var hillSize = PI * radius * radius;
|
||||
// create starting trees
|
||||
var num = Math.floor(hillSize / 100);
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(11, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree1, num, num, 0,5)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
||||
|
||||
placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, [painter, paintClass(clPlayer)], null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,74 +34,26 @@ var clRock = createTileClass();
|
|||
var clMetal = createTileClass();
|
||||
var clBaseResource = createTileClass();
|
||||
|
||||
var [playerIDs, playerX, playerZ] = radialPlayerPlacement();
|
||||
|
||||
for (var i = 0; i < numPlayers; i++)
|
||||
{
|
||||
var id = playerIDs[i];
|
||||
log("Creating base for player " + id + "...");
|
||||
|
||||
var radius = scaleByMapSize(15,25);
|
||||
|
||||
// get the x and z in tiles
|
||||
var fx = fractionToTiles(playerX[i]);
|
||||
var fz = fractionToTiles(playerZ[i]);
|
||||
var ix = Math.round(fx);
|
||||
var iz = Math.round(fz);
|
||||
addCivicCenterAreaToClass(ix, iz, clPlayer);
|
||||
|
||||
// create the city patch
|
||||
var cityRadius = radius/3;
|
||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
|
||||
createArea(placer, painter, null);
|
||||
|
||||
placeCivDefaultEntities(fx, fz, id);
|
||||
|
||||
// create metal mine
|
||||
var bbAngle = randFloat(0, 2 * Math.PI);
|
||||
var bbDist = 12;
|
||||
var mAngle = bbAngle;
|
||||
while (Math.abs(mAngle - bbAngle) < Math.PI / 3)
|
||||
mAngle = randFloat(0, 2 * Math.PI);
|
||||
|
||||
var mDist = 12;
|
||||
var mX = Math.round(fx + mDist * cos(mAngle));
|
||||
var mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
var group = new SimpleGroup(
|
||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create stone mines
|
||||
mAngle += randFloat(PI/8, PI/4);
|
||||
mX = Math.round(fx + mDist * cos(mAngle));
|
||||
mZ = Math.round(fz + mDist * sin(mAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)],
|
||||
true, clBaseResource, mX, mZ
|
||||
);
|
||||
createObjectGroup(group, 0);
|
||||
|
||||
// create starting trees
|
||||
var hillSize = PI * radius * radius;
|
||||
var num = Math.floor(hillSize / 60);
|
||||
var tries = 10;
|
||||
for (var x = 0; x < tries; ++x)
|
||||
{
|
||||
var tAngle = randFloat(-PI/3, 4*PI/3);
|
||||
var tDist = randFloat(12, 13);
|
||||
var tX = Math.round(fx + tDist * cos(tAngle));
|
||||
var tZ = Math.round(fz + tDist * sin(tAngle));
|
||||
group = new SimpleGroup(
|
||||
[new SimpleObject(oTree, num, num, 0, 3)],
|
||||
false, clBaseResource, tX, tZ
|
||||
);
|
||||
if (createObjectGroup(group, 0, avoidClasses(clBaseResource, 2)))
|
||||
break;
|
||||
placePlayerBases({
|
||||
"PlayerPlacement": playerPlacementCircle(0.35),
|
||||
"PlayerTileClass": clPlayer,
|
||||
"BaseResourceClass": clBaseResource,
|
||||
"CityPatch": {
|
||||
"outerTerrain": tRoadWild,
|
||||
"innerTerrain": tRoad
|
||||
},
|
||||
// No berries, no chicken, no decoratives
|
||||
"Mines": {
|
||||
"types": [
|
||||
{ "template": oMetalLarge },
|
||||
{ "template": oStoneLarge }
|
||||
]
|
||||
},
|
||||
"Trees": {
|
||||
"template": oTree,
|
||||
"count": scaleByMapSize(12, 30)
|
||||
}
|
||||
}
|
||||
});
|
||||
Engine.SetProgress(15);
|
||||
|
||||
createVolcano(0.5, 0.5, clHill, tCliff, [tLava1, tLava2, tLava3], true, ELEVATION_SET);
|
||||
|
|
|
|||
|
|
@ -610,7 +610,7 @@ Engine.SetProgress(55);
|
|||
for (let p = 0; p < playerIDs.length; ++p)
|
||||
{
|
||||
let point = startLocations[p];
|
||||
placeCivDefaultEntities(point.x, point.y, playerIDs[p], { "iberWall": g_Map.size > 192 });
|
||||
placeCivDefaultStartingEntities(point.x, point.y, playerIDs[p], g_Map.size > 192);
|
||||
placeStartLocationResources(point);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue