diff --git a/binaries/data/mods/public/maps/random/aegean_sea.js b/binaries/data/mods/public/maps/random/aegean_sea.js index b7012c792c..4249bf81d1 100644 --- a/binaries/data/mods/public/maps/random/aegean_sea.js +++ b/binaries/data/mods/public/maps/random/aegean_sea.js @@ -176,11 +176,12 @@ paintTerrainBasedOnHeight(1, 2, 0, tShore); RMS.SetProgress(40); createBumps(avoidClasses(clWater, 2, clPlayer, 20)); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tForestFloor, tForestFloor, tForestFloor, pForest, pForest], avoidClasses(clPlayer, 20, clForest, 17, clWater, 2, clBaseResource, 3), - clForest -); + clForest, + forestTrees); RMS.SetProgress(50); @@ -332,11 +333,15 @@ RMS.SetProgress(90); var types = [oDatePalm, oSDatePalm, oCarob, oFanPalm, oPoplar, oCypress]; createStragglerTrees( types, - avoidClasses(clForest, 1, clWater, 2, clPlayer, 12, clMetal, 6, clHill, 1)); + avoidClasses(clForest, 1, clWater, 2, clPlayer, 12, clMetal, 6, clHill, 1), + clForest, + stragglerTrees); -log("Creating straggler island trees..."); -g_numStragglerTrees *= 10; -createStragglerTrees(types, stayClasses(clIsland, 4)); +createStragglerTrees( + types, + stayClasses(clIsland, 4), + clForest, + stragglerTrees * 10); setSkySet("cumulus"); setSunColor(0.866667, 0.776471, 0.486275); diff --git a/binaries/data/mods/public/maps/random/african_plains.js b/binaries/data/mods/public/maps/random/african_plains.js index 6facbbdba7..6396c4b432 100644 --- a/binaries/data/mods/public/maps/random/african_plains.js +++ b/binaries/data/mods/public/maps/random/african_plains.js @@ -154,12 +154,12 @@ paintTerrainBasedOnHeight(floor(scaleByMapSize(20, 40)), 100, 3, tGrass); createBumps(avoidClasses(clWater, 2, clPlayer, 20)); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tPrimary, tForestFloor, tForestFloor, pForest, pForest], avoidClasses(clPlayer, 20, clForest, 20, clHill, 0, clWater, 2), clForest, - 1.0 -); + forestTrees); log("Creating dirt patches..."); createLayeredPatches( @@ -294,14 +294,15 @@ createFood( [ 15 * numPlayers ], - [avoidClasses(clFood, 20), stayClasses(clWater, 6)] -); + [avoidClasses(clFood, 20), stayClasses(clWater, 6)], + clFood); RMS.SetProgress(85); createStragglerTrees( [oBaobab], - avoidClasses(clWater, 5, clForest, 2, clHill, 3, clPlayer, 12, clMetal, 4, clRock, 4) -); + avoidClasses(clWater, 5, clForest, 2, clHill, 3, clPlayer, 12, clMetal, 4, clRock, 4), + clForest, + stragglerTrees); setPPEffect("hdr"); setPPSaturation(0.48); diff --git a/binaries/data/mods/public/maps/random/alpine_lakes.js b/binaries/data/mods/public/maps/random/alpine_lakes.js index 44d65ba6a2..1a04be595d 100644 --- a/binaries/data/mods/public/maps/random/alpine_lakes.js +++ b/binaries/data/mods/public/maps/random/alpine_lakes.js @@ -236,12 +236,12 @@ paintTerrainBasedOnHeight(floor(scaleByMapSize(20, 40)), 100, 3, tSnowLimited); createBumps(avoidClasses(clWater, 2, clPlayer, 20)); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tPrimary, tForestFloor, tForestFloor, pForest, pForest], avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2), clForest, - 1.0 -); + forestTrees); RMS.SetProgress(60); @@ -340,8 +340,11 @@ createFood RMS.SetProgress(85); -var types = [oPine]; -createStragglerTrees(types, avoidClasses(clWater, 5, clForest, 3, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6)); +createStragglerTrees( + [oPine], + avoidClasses(clWater, 5, clForest, 3, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); setSkySet(pickRandom(["cirrus", "cumulus", "sunny"])); setSunRotation(randFloat(0, TWO_PI)); diff --git a/binaries/data/mods/public/maps/random/alpine_valley.js b/binaries/data/mods/public/maps/random/alpine_valley.js index 5384e30111..0e103e9bb2 100644 --- a/binaries/data/mods/public/maps/random/alpine_valley.js +++ b/binaries/data/mods/public/maps/random/alpine_valley.js @@ -378,26 +378,18 @@ createAreas( ); RMS.SetProgress(50); -// calculate desired number of trees for map (based on size) -var MIN_TREES = 500; -var MAX_TREES = 3000; -var P_FOREST = 0.7; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); var types = [ [[tForestFloor, tPrimary, pForest], [tForestFloor, pForest]] ]; -var size = numForest / (scaleByMapSize(2,8) * numPlayers); +var size = forestTrees / (scaleByMapSize(2,8) * numPlayers); var num = Math.floor(size / types.length); for (let type of types) createAreas( - new ClumpPlacer(numForest / num, 0.1, 0.1, 1), + new ClumpPlacer(forestTrees / num, 0.1, 0.1, 1), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -503,15 +495,11 @@ createObjectGroupsDeprecated(group, 0, ); RMS.SetProgress(85); -log("Creating straggler trees..."); -var types = [oPine, oPine]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1,1, 0,3)], true, clForest), - 0, - avoidClasses(clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), - num); +createStragglerTrees( + [oPine], + avoidClasses(clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); log("Creating small grass tufts..."); var planetm = 1; diff --git a/binaries/data/mods/public/maps/random/anatolian_plateau.js b/binaries/data/mods/public/maps/random/anatolian_plateau.js index 0eae1382fc..664ecc43d1 100644 --- a/binaries/data/mods/public/maps/random/anatolian_plateau.js +++ b/binaries/data/mods/public/maps/random/anatolian_plateau.js @@ -129,18 +129,10 @@ createAreas( avoidClasses(clPlayer, 13), scaleByMapSize(300, 800)); -// calculate desired number of trees for map (based on size) -var MIN_TREES = 220; -var MAX_TREES = 1000; -var P_FOREST = 0.65; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(220, 1000, 0.65); var types = [[[tForestFloor, tGrass, pForest], [tForestFloor, pForest]]]; -var size = numForest / (scaleByMapSize(2,8) * numPlayers); +var size = forestTrees / (scaleByMapSize(2,8) * numPlayers); var num = 4 * floor(size / types.length); for (let type of types) createAreas( @@ -265,15 +257,11 @@ createObjectGroupsDeprecated(group, 0, RMS.SetProgress(85); -log("Creating straggler trees..."); -var types = [oBush, oPoplar]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - avoidClasses(clForest, 1, clHill, 1, clPlayer, 13, clMetal, 6, clRock, 6), - num); +createStragglerTrees( + [oBush, oPoplar], + avoidClasses(clForest, 1, clHill, 1, clPlayer, 13, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); log("Creating large grass tufts..."); group = new SimpleGroup( diff --git a/binaries/data/mods/public/maps/random/archipelago.js b/binaries/data/mods/public/maps/random/archipelago.js index 5293fa9a74..34f20db881 100644 --- a/binaries/data/mods/public/maps/random/archipelago.js +++ b/binaries/data/mods/public/maps/random/archipelago.js @@ -195,12 +195,12 @@ if (randBool()) else createMountains(tCliff, [avoidClasses(clPlayer, 2, clHill, 15), stayClasses(clLand, 0)], clHill, scaleByMapSize(1, 4) * numPlayers); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], [avoidClasses(clPlayer, 20, clForest, 17, clHill, 0), stayClasses(clLand, 4)], clForest, - 1, - ...rBiomeTreeCount(1)); + forestTrees); RMS.SetProgress(50); log("Creating dirt patches..."); @@ -300,10 +300,11 @@ createFood RMS.SetProgress(85); -log("Creating straggler trees..."); createStragglerTrees( [oTree1, oTree2, oTree4, oTree3], - [avoidClasses(clForest, 7, clHill, 1, clPlayer, 3, clMetal, 6, clRock, 6), stayClasses(clLand, 7)]); + [avoidClasses(clForest, 7, clHill, 1, clPlayer, 3, clMetal, 6, clRock, 6), stayClasses(clLand, 7)], + clForest, + stragglerTrees); setWaterWaviness(4.0); setWaterType("ocean"); diff --git a/binaries/data/mods/public/maps/random/arctic_summer.js b/binaries/data/mods/public/maps/random/arctic_summer.js index 3d447cd53a..7695200bad 100644 --- a/binaries/data/mods/public/maps/random/arctic_summer.js +++ b/binaries/data/mods/public/maps/random/arctic_summer.js @@ -183,6 +183,7 @@ createBumps(avoidClasses(clPlayer, 6, clWater, 2), scaleByMapSize(30, 300), 1, 8 paintTerrainBasedOnHeight(4, 15, 0, tCliff); paintTerrainBasedOnHeight(15, 100, 3, tSnowLimited); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tSecondary, tForestFloor, tForestFloor, pForest, pForest], avoidClasses( @@ -191,7 +192,7 @@ createForests( clHill, 20, clWater, 2), clForest, - 1); + forestTrees); RMS.SetProgress(60); log("Creating dirt patches..."); @@ -357,7 +358,9 @@ createStragglerTrees( clHill, 1, clPlayer, 12, clMetal, 4, - clRock, 4)); + clRock, 4), + clForest, + stragglerTrees); setSkySet("sunset 1"); setSunRotation(randFloat(0, 2 * PI)); diff --git a/binaries/data/mods/public/maps/random/ardennes_forest.js b/binaries/data/mods/public/maps/random/ardennes_forest.js index e808ae6d79..4f7f683ad0 100644 --- a/binaries/data/mods/public/maps/random/ardennes_forest.js +++ b/binaries/data/mods/public/maps/random/ardennes_forest.js @@ -328,36 +328,31 @@ for (var ix = 0; ix < mapSize; ix++) RMS.SetProgress(60); -// Calculate desired number of trees for map (based on size) -const MIN_TREES = 400; -const MAX_TREES = 6000; -const P_FOREST = 0.8; -const P_FOREST_JOIN = 0.25; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST * (1.0 - P_FOREST_JOIN); -var numForestJoin = totalTrees * P_FOREST * P_FOREST_JOIN; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); -var num = numForest / (scaleByMapSize(6,16) * numPlayers); -placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); -painter = new TerrainPainter(pForest); +var [forestTrees, stragglerTrees] = getTreeCounts(400, 6000, 0.8); +var [forestTreesJoin, forestTrees] = getTreeCounts(forestTrees, forestTrees, 0.25); + +var num = forestTrees / (scaleByMapSize(6, 16) * numPlayers); createAreasInAreas( - placer, - [painter, paintClass(clForest)], + new ClumpPlacer(forestTrees / num, 0.1, 0.1, 1), + [ + new TerrainPainter(pForest), + paintClass(clForest) + ], avoidClasses(clPlayer, 5, clBaseResource, 4, clForest, 6, clHill, 4), num, 100, [explorableArea] ); -var num = numForestJoin / (scaleByMapSize(4,6) * numPlayers); -placer = new ClumpPlacer(numForestJoin / num, 0.1, 0.1, 1); -painter = new TerrainPainter(pForest); +var num = forestTreesJoin / (scaleByMapSize(4,6) * numPlayers); createAreasInAreas( - placer, - [painter, paintClass(clForest), paintClass(clForestJoin)], + new ClumpPlacer(forestTreesJoin / num, 0.1, 0.1, 1), + [ + new TerrainPainter(pForest), + paintClass(clForest), + paintClass(clForestJoin) + ], [avoidClasses(clPlayer, 5, clBaseResource, 4, clForestJoin, 5, clHill, 4), borderClasses(clForest, 1, 4)], num, 100, @@ -475,7 +470,7 @@ RMS.SetProgress(90); log("Creating straggler trees..."); var types = [oOak, oOakLarge, oPine, oAleppoPine]; -var num = floor(numStragglers / types.length); +var num = Math.floor(stragglerTrees / types.length); for (let type of types) createObjectGroupsByAreasDeprecated( new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), diff --git a/binaries/data/mods/public/maps/random/atlas_mountains.js b/binaries/data/mods/public/maps/random/atlas_mountains.js index c99fcaf7cd..8e5820c753 100644 --- a/binaries/data/mods/public/maps/random/atlas_mountains.js +++ b/binaries/data/mods/public/maps/random/atlas_mountains.js @@ -135,11 +135,12 @@ createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 8), clHill, scaleByMa RMS.SetProgress(25); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tGrass, tForestFloor, tForestFloor, pForest1, pForest2], avoidClasses(clPlayer, 20, clForest, 14, clHill, 1), clForest, - 0.6); + forestTrees); RMS.SetProgress(40); @@ -250,17 +251,15 @@ RMS.SetProgress(80); createStragglerTrees( [oCarob, oAleppoPine], - avoidClasses(clForest, 1, clHill, 1, clPlayer, 10, clMetal, 6, clRock, 6, clTreasure, 4)); + avoidClasses(clForest, 1, clHill, 1, clPlayer, 10, clMetal, 6, clRock, 6, clTreasure, 4), + clForest, + stragglerTrees); -log("Creating hill trees..."); -var types = [aCarob, aAleppoPine]; -var num = floor(0.2 * g_numStragglerTrees / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - stayClasses(clHill, 2), - num); +createStragglerTrees( + [aCarob, aAleppoPine], + stayClasses(clHill, 2), + clForest, + stragglerTrees / 5); setFogFactor(0.2); setFogThickness(0.14); diff --git a/binaries/data/mods/public/maps/random/botswanan_haven.js b/binaries/data/mods/public/maps/random/botswanan_haven.js index a6dbe9fc78..f4f84eafbd 100644 --- a/binaries/data/mods/public/maps/random/botswanan_haven.js +++ b/binaries/data/mods/public/maps/random/botswanan_haven.js @@ -375,17 +375,11 @@ createObjectGroupsDeprecated( 50); RMS.SetProgress(80); -log("Creating straggler trees..."); -let treeTypes = [oToona, oBaobab, oBush, oBush]; -for (let treeType of treeTypes) - createObjectGroupsDeprecated( - new SimpleGroup( - [new SimpleObject(treeType, 1, 3, 0, 3)], - true, - clForest), - 0, - avoidClasses(clForest, 1, clWater, 1, clHill, 1, clPlayer, 13, clMetal, 1, clRock, 1), - Math.floor(scaleByMapSize(60, 500) / treeTypes.length)); +createStragglerTrees( + [oToona, oBaobab, oBush, oBush], + avoidClasses(clForest, 1, clWater, 1, clHill, 1, clPlayer, 13, clMetal, 1, clRock, 1), + clForest, + scaleByMapSize(60, 500)); RMS.SetProgress(85); log("Creating small grass tufts..."); diff --git a/binaries/data/mods/public/maps/random/cantabrian_highlands.js b/binaries/data/mods/public/maps/random/cantabrian_highlands.js index 8bf3907af2..0d67497730 100644 --- a/binaries/data/mods/public/maps/random/cantabrian_highlands.js +++ b/binaries/data/mods/public/maps/random/cantabrian_highlands.js @@ -209,11 +209,12 @@ log("Creating hills..."); createHills([tCliff, tCliff, tHill], avoidClasses(clPlayer, 2, clWater, 5, clHill, 15), clHill, scaleByMapSize(1, 4) * numPlayers); RMS.SetProgress(35); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tGrass, tGrassDForest, tGrassPForest, pForestP, pForestD], avoidClasses(clPlayer, 1, clWater, 3, clForest, 17, clHill, 1), - clForest -); + clForest, + forestTrees); RMS.SetProgress(40); log("Creating dirt patches..."); @@ -303,7 +304,9 @@ RMS.SetProgress(85); createStragglerTrees( [oOak, oOakLarge, oPine, oApple], - avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6)); + avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); RMS.SetProgress(90); setSkySet("cirrus"); diff --git a/binaries/data/mods/public/maps/random/canyon.js b/binaries/data/mods/public/maps/random/canyon.js index 11af9e035a..b802c3d5f0 100644 --- a/binaries/data/mods/public/maps/random/canyon.js +++ b/binaries/data/mods/public/maps/random/canyon.js @@ -300,13 +300,12 @@ createHills([tCliff, tCliff, tHill], [avoidClasses(clPlayer, 2, clHill, 8, clHil // create hills outside the canyon createHills([tCliff, tCliff, tMainTerrain], avoidClasses(clLand, 1, clHill, 1), clHill, scaleByMapSize(20, 150), undefined, undefined, undefined, undefined, 40); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], [avoidClasses(clPlayer, 1, clForest, 15, clHill, 1, clHill2, 0), stayClasses(clLand, 4)], clForest, - 1, - ...rBiomeTreeCount(1) -); + forestTrees); RMS.SetProgress(50); @@ -409,10 +408,11 @@ createFood RMS.SetProgress(85); -log("Creating straggler trees..."); createStragglerTrees( [oTree1, oTree2, oTree4, oTree3], - [avoidClasses(clForest, 1, clHill, 1, clPlayer, 9, clMetal, 6, clRock, 6, clHill2, 1), stayClasses(clLand, 3)]); + [avoidClasses(clForest, 1, clHill, 1, clPlayer, 9, clMetal, 6, clRock, 6, clHill2, 1), stayClasses(clLand, 3)], + clForest, + stragglerTrees); log("Creating treasures..."); for (let i = 0; i < randIntInclusive(3, 8); ++i) diff --git a/binaries/data/mods/public/maps/random/continent.js b/binaries/data/mods/public/maps/random/continent.js index 42d3a1b417..085f8b8b42 100644 --- a/binaries/data/mods/public/maps/random/continent.js +++ b/binaries/data/mods/public/maps/random/continent.js @@ -180,12 +180,12 @@ if (randBool()) else createMountains(tCliff, [avoidClasses(clPlayer, 20, clHill, 15, clBaseResource, 3), stayClasses(clLand, 5)], clHill, scaleByMapSize(1, 4) * numPlayers); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], [avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clBaseResource,2), stayClasses(clLand, 4)], clForest, - 1.0, - ...rBiomeTreeCount(1)); + forestTrees); RMS.SetProgress(50); @@ -290,10 +290,11 @@ createFood RMS.SetProgress(85); -log("Creating straggler trees..."); createStragglerTrees( [oTree1, oTree2, oTree4, oTree3], - [avoidClasses(clForest, 7, clHill, 1, clPlayer, 9, clMetal, 6, clRock, 6), stayClasses(clLand, 7)]); + [avoidClasses(clForest, 7, clHill, 1, clPlayer, 9, clMetal, 6, clRock, 6), stayClasses(clLand, 7)], + clForest, + stragglerTrees); setWaterWaviness(1.0); setWaterType("ocean"); diff --git a/binaries/data/mods/public/maps/random/corinthian_isthmus.js b/binaries/data/mods/public/maps/random/corinthian_isthmus.js index 2e60cc31e9..485d80a134 100644 --- a/binaries/data/mods/public/maps/random/corinthian_isthmus.js +++ b/binaries/data/mods/public/maps/random/corinthian_isthmus.js @@ -193,11 +193,12 @@ RMS.SetProgress(40); createBumps(avoidClasses(clWater, 2, clPlayer, 20)); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tForestFloor, tForestFloor, tForestFloor, pForest, pForest], avoidClasses(clPlayer, 20, clForest, 17, clWater, 2, clBaseResource, 3), - clForest -); + clForest, + forestTrees); RMS.SetProgress(50); @@ -301,10 +302,11 @@ createFood RMS.SetProgress(90); -log("Creating straggler trees..."); createStragglerTrees( [oDatePalm, oSDatePalm, oCarob, oFanPalm, oPoplar, oCypress], - avoidClasses(clForest, 1, clWater, 2, clPlayer, 8, clBaseResource, 6, clMetal, 6, clRock, 6, clHill, 1)); + avoidClasses(clForest, 1, clWater, 2, clPlayer, 8, clBaseResource, 6, clMetal, 6, clRock, 6, clHill, 1), + clForest, + stragglerTrees); setSkySet("sunny"); setSunColor(0.917, 0.828, 0.734); diff --git a/binaries/data/mods/public/maps/random/danubius.js b/binaries/data/mods/public/maps/random/danubius.js index 36aff9ba90..310df5c042 100644 --- a/binaries/data/mods/public/maps/random/danubius.js +++ b/binaries/data/mods/public/maps/random/danubius.js @@ -462,12 +462,12 @@ else RMS.SetProgress(45); -log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tForestFloor, tForestFloor, tForestFloor, pForest1, pForest2], avoidClasses(clPlayer, 16, clForest, 17, clWater, 5, clHill, 2, clGauls, 5, clPath, 1), - clForest -); + clForest, + forestTrees); RMS.SetProgress(50); log("Creating grass patches..."); @@ -657,14 +657,17 @@ createFood( ); RMS.SetProgress(90); -log("Creating straggler trees..."); createStragglerTrees( treeTypes, - avoidClasses(clForest, 2, clWater, 8, clPlayer, 16, clMetal, 4, clRock, 4, clFood, 1, clHill, 2, clGauls, 5, clPath, 5), clForest); + avoidClasses(clForest, 2, clWater, 8, clPlayer, 16, clMetal, 4, clRock, 4, clFood, 1, clHill, 2, clGauls, 5, clPath, 5), + clForest, + stragglerTrees); -log("Creating island straggler trees..."); -g_numStragglerTrees *= 7; -createStragglerTrees(treeTypes, [stayClasses(clIsland, 4), avoidClasses(clMetal, 4, clRock, 4, clTower, 4, clOutpost, 4)], clForest); +createStragglerTrees( + treeTypes, + [stayClasses(clIsland, 4), avoidClasses(clMetal, 4, clRock, 4, clTower, 4, clOutpost, 4)], + clForest, + stragglerTrees * 7); RMS.SetProgress(95); log("Creating animals on islands..."); diff --git a/binaries/data/mods/public/maps/random/english_channel.js b/binaries/data/mods/public/maps/random/english_channel.js index 00eb850386..f711128803 100644 --- a/binaries/data/mods/public/maps/random/english_channel.js +++ b/binaries/data/mods/public/maps/random/english_channel.js @@ -242,12 +242,12 @@ RMS.SetProgress(30); createHills([tCliff, tCliff, tHill], avoidClasses(clPlayer, 20, clHill, 15, clWater, 5), clHill, scaleByMapSize(1, 4) * numPlayers); RMS.SetProgress(50); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tGrass, tGrassDForest, tGrassDForest, pForestD, pForestD], avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 6), clForest, - 1.0 -); + forestTrees); RMS.SetProgress(70); log("Creating dirt patches..."); @@ -354,10 +354,11 @@ createFood [avoidClasses(clFood, 6), stayClasses(clWater, 4)] ); -log("Creating straggler trees..."); createStragglerTrees( [oBeech, oPoplar, oApple], - avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 8, clMetal, 6, clRock, 6)); + avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 8, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); setSkySet("cirrus"); setWaterColor(0.114, 0.192, 0.463); diff --git a/binaries/data/mods/public/maps/random/extinct_volcano.js b/binaries/data/mods/public/maps/random/extinct_volcano.js index 9f34e45b7a..d6b40e6cd2 100644 --- a/binaries/data/mods/public/maps/random/extinct_volcano.js +++ b/binaries/data/mods/public/maps/random/extinct_volcano.js @@ -54,11 +54,6 @@ const pForestP = [ InitMap(); -var P_FOREST = 0.7; -var totalTrees = scaleByMapSize(1200, 3000); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - var numPlayers = getNumPlayers(); var clPlayer = createTileClass(); @@ -215,15 +210,16 @@ createAreas( RMS.SetProgress(35); log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(1200, 3000, 0.7); var types = [ [[tGrassB, tGrassA, pForestD], [tGrassB, pForestD]], [[tGrassB, tGrassA, pForestP], [tGrassB, pForestP]] ]; -var size = numForest / (scaleByMapSize(4, 12) * numPlayers); +var size = forestTrees / (scaleByMapSize(4, 12) * numPlayers); var num = Math.floor(size / types.length); for (let type of types) createAreas( - new ClumpPlacer(numForest / num, 0.1, 0.1, 1), + new ClumpPlacer(forestTrees / num, 0.1, 0.1, 1), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -446,27 +442,21 @@ createFood( clFood); RMS.SetProgress(85); -log("Creating straggler trees and bushes..."); -var types = [oTree, oTree2, oTree3, oTree4, oBush]; -var num = Math.floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup( - [new SimpleObject(type, 1, 1, 0, 3)], - true, - clForest), - 0, - [ - stayClasses(clGrass, 1), - avoidClasses( - clWater, 5, - clForest, 1, - clHill, 1, - clPlayer, 0, - clMetal, 1, - clRock, 1) - ], - num); +createStragglerTrees( + [oTree, oTree2, oTree3, oTree4, oBush], + [ + stayClasses(clGrass, 1), + avoidClasses( + clWater, 5, + clForest, 1, + clHill, 1, + clPlayer, 0, + clMetal, 1, + clRock, 1) + ], + clForest, + stragglerTrees); + RMS.SetProgress(90); log("Creating straggler bushes..."); @@ -486,7 +476,7 @@ createObjectGroupsDeprecated( clMetal, 1, clRock, 1) ], - numStragglers); + stragglerTrees); RMS.SetProgress(95); log("Creating rain drops..."); diff --git a/binaries/data/mods/public/maps/random/flood.js b/binaries/data/mods/public/maps/random/flood.js index a4cf036db7..8c0136a775 100644 --- a/binaries/data/mods/public/maps/random/flood.js +++ b/binaries/data/mods/public/maps/random/flood.js @@ -279,17 +279,19 @@ createObjectGroupsDeprecated( 10 * numPlayers, 60); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(0.7)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], [avoidClasses(clPlayer, 25, clForest, 10, clBaseResource, 3, clMetal, 6, clRock, 3, clMountain, 2), stayClasses(clHill, 6)], clForest, - 0.7, - ...rBiomeTreeCount(0.7)); + forestTrees); -log("Creating straggeler trees..."); let types = [oTree1, oTree2, oTree4, oTree3]; -createStragglerTrees(types, [avoidClasses(clBaseResource, 2, clMetal, 6, clRock, 3, clMountain, 2, clPlayer, 25), stayClasses(clHill, 6)]); - +createStragglerTrees( + types, + [avoidClasses(clBaseResource, 2, clMetal, 6, clRock, 3, clMountain, 2, clPlayer, 25), stayClasses(clHill, 6)], + clForest, + stragglerTrees); RMS.SetProgress(65); log("Creating dirt patches..."); @@ -338,8 +340,11 @@ createFood( RMS.SetProgress(85); -log("Creating more straggeler trees..."); -createStragglerTrees(types, avoidClasses(clWater, 5, clForest, 7, clMountain, 1, clPlayer, 30, clMetal, 6, clRock, 3)); +createStragglerTrees( + types, + avoidClasses(clWater, 5, clForest, 7, clMountain, 1, clPlayer, 30, clMetal, 6, clRock, 3), + clForest, + stragglerTrees); log("Creating decoration..."); var planetm = currentBiome() == "tropic" ? 8 : 1; @@ -361,12 +366,12 @@ createDecoration( avoidClasses(clForest, 2, clPlayer, 20, clMountain, 5, clFood, 1, clBaseResource, 2)); log("Creating water forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(0.1)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], avoidClasses(clPlayer, 30, clHill, 10, clFood, 5), clForest, - 0.1, - ...rBiomeTreeCount(0.1)); + forestTrees); log("Creating small grass tufts..."); createObjectGroupsDeprecated( diff --git a/binaries/data/mods/public/maps/random/fortress.js b/binaries/data/mods/public/maps/random/fortress.js index 67a0f5b838..2030be04f5 100644 --- a/binaries/data/mods/public/maps/random/fortress.js +++ b/binaries/data/mods/public/maps/random/fortress.js @@ -201,26 +201,18 @@ log("Creating hills..."); createHills([tCliff, tCliff, tHill], avoidClasses(clPlayer, 5, clWater, 5, clHill, 15), clHill, scaleByMapSize(1, 4) * numPlayers); RMS.SetProgress(40); -// calculate desired number of trees for map (based on size) -const MIN_TREES = 500; -const MAX_TREES = 2500; -const P_FOREST = 0.7; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -g_numStragglerTrees = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.7); var types = [ [[tForestFloor, tGrass, pForestD], [tForestFloor, pForestD]], [[tForestFloor, tGrass, pForestO], [tForestFloor, pForestO]], [[tForestFloor, tGrass, pForestP], [tForestFloor, pForestP]] ]; -var size = numForest / (scaleByMapSize(3,6) * numPlayers); +var size = forestTrees / (scaleByMapSize(3,6) * numPlayers); var num = floor(size / types.length); for (let type of types) createAreas( - new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), numForest / num, 0.5), + new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), forestTrees / num, 0.5), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -314,10 +306,11 @@ createFood RMS.SetProgress(90); -log("Creating straggler trees..."); createStragglerTrees( [oOak, oBeech, oPine], - avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6)); + avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); RMS.SetProgress(95); setSkySet("sunny"); diff --git a/binaries/data/mods/public/maps/random/gear.js b/binaries/data/mods/public/maps/random/gear.js index 317832c2b4..32ab2a28dc 100644 --- a/binaries/data/mods/public/maps/random/gear.js +++ b/binaries/data/mods/public/maps/random/gear.js @@ -271,12 +271,12 @@ if (randBool()) else createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2), clForest, - 1, - ...rBiomeTreeCount(1)); + forestTrees); RMS.SetProgress(50); @@ -377,6 +377,8 @@ createFood createStragglerTrees( [oTree1, oTree2, oTree4, oTree3], - avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6)); + avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); ExportMap(); diff --git a/binaries/data/mods/public/maps/random/guadalquivir_river.js b/binaries/data/mods/public/maps/random/guadalquivir_river.js index 4ab02e3195..12d1f34ddd 100644 --- a/binaries/data/mods/public/maps/random/guadalquivir_river.js +++ b/binaries/data/mods/public/maps/random/guadalquivir_river.js @@ -199,11 +199,12 @@ paintTerrainBasedOnHeight(-8, 1, 2, tWater); createBumps([avoidClasses(clPlayer, 20, clRiver, 1), stayClasses(clLand, 3)]); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tGrass, tForestFloorP, tForestFloorC, pForestC, pForestP], [avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clRiver, 1), stayClasses(clLand, 7)], clForest, - 1.0); + forestTrees); RMS.SetProgress(50); @@ -314,10 +315,11 @@ createFood RMS.SetProgress(85); -log("Creating straggler trees..."); createStragglerTrees( [oPoplar, oCarob, oApple], - [avoidClasses(clForest, 1, clHill, 1, clPlayer, 9, clMetal, 6, clRock, 6, clRiver, 1), stayClasses(clLand, 7)]); + [avoidClasses(clForest, 1, clHill, 1, clPlayer, 9, clMetal, 6, clRock, 6, clRiver, 1), stayClasses(clLand, 7)], + clForest, + stragglerTrees); setSkySet("cumulus"); setWaterColor(0.2,0.312,0.522); diff --git a/binaries/data/mods/public/maps/random/gulf_of_bothnia.js b/binaries/data/mods/public/maps/random/gulf_of_bothnia.js index 8b887bdb43..8484089a3a 100644 --- a/binaries/data/mods/public/maps/random/gulf_of_bothnia.js +++ b/binaries/data/mods/public/maps/random/gulf_of_bothnia.js @@ -266,11 +266,12 @@ if (randBool()) else createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 0), clHill, scaleByMapSize(1, 4) * numPlayers); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 3000, 0.7); createForests( [tPrimary, tForestFloor, tForestFloor, pForest, pForest], avoidClasses(clPlayer, 20, clForest, 16, clHill, 0, clWater, 2), clForest, - 1); + forestTrees); RMS.SetProgress(60); @@ -358,9 +359,11 @@ if (random_terrain != 3) RMS.SetProgress(85); -log("Creating straggler trees..."); -var types = [oPine]; -createStragglerTrees(types, avoidClasses(clWater, 3, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6)); +createStragglerTrees( + [oPine], + avoidClasses(clWater, 3, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); setSkySet("stormy"); setSunRotation(randFloat(0, TWO_PI)); diff --git a/binaries/data/mods/public/maps/random/hyrcanian_shores.js b/binaries/data/mods/public/maps/random/hyrcanian_shores.js index 6915c4100f..d718f03644 100644 --- a/binaries/data/mods/public/maps/random/hyrcanian_shores.js +++ b/binaries/data/mods/public/maps/random/hyrcanian_shores.js @@ -194,24 +194,16 @@ createAreas( RMS.SetProgress(35); -// calculate desired number of trees for map (based on size) -const MIN_TREES = 500; -const MAX_TREES = 2500; -const P_FOREST = 0.7; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating mainland forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.7); var types = [ [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]] ]; -var size = numForest * 1.3 / (scaleByMapSize(2,8) * numPlayers); +var size = forestTrees * 1.3 / (scaleByMapSize(2,8) * numPlayers); var num = Math.floor(0.7 * size / types.length); for (let type of types) createAreas( - new ClumpPlacer(numForest / num, 0.1, 0.1, 1), + new ClumpPlacer(forestTrees / num, 0.1, 0.1, 1), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -224,11 +216,11 @@ log("Creating highland forests..."); var types = [ [[tGrassDForest, tGrass, pForestP], [tGrassDForest, pForestP]] ]; -var size = numForest / (scaleByMapSize(2,8) * numPlayers); +var size = forestTrees / (scaleByMapSize(2,8) * numPlayers); var num = floor(size / types.length); for (let type of types) createAreas( - new ClumpPlacer(numForest / num, 0.1, 0.1, 1), + new ClumpPlacer(forestTrees / num, 0.1, 0.1, 1), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -345,15 +337,11 @@ createObjectGroupsDeprecated(group, 0, 2 * numPlayers, 50 ); -log("Creating straggler trees..."); -var types = [oPoplar, oPalm, oApple]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 10, clMetal, 6, clRock, 6, clSea, 1, clHighlands, 25), - num); +createStragglerTrees( + [oPoplar, oPalm, oApple], + avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 10, clMetal, 6, clRock, 6, clSea, 1, clHighlands, 25), + clForest, + stragglerTrees); log("Creating small grass tufts..."); group = new SimpleGroup( diff --git a/binaries/data/mods/public/maps/random/island_stronghold.js b/binaries/data/mods/public/maps/random/island_stronghold.js index df6494c06c..defeae45a6 100644 --- a/binaries/data/mods/public/maps/random/island_stronghold.js +++ b/binaries/data/mods/public/maps/random/island_stronghold.js @@ -336,12 +336,12 @@ createMines( clRock ); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], [avoidClasses(clPlayer, 10, clForest, 20, clHill, 10, clBaseResource, 5, clRock, 6, clMetal, 6), stayClasses(clLand, 3)], clForest, - 1, - ...rBiomeTreeCount(1)); + forestTrees); log("Creating hills..."); createAreas( @@ -359,10 +359,13 @@ for (let i = 0; i < 3; ++i) globalSmoothHeightmap(); createStragglerTrees( - [oTree1, oTree2, oTree4, oTree3], - [avoidClasses(clForest, 10, clPlayer, 20, clMetal, 6, clRock, 6, clHill, 1), - stayClasses(clLand, 4)] -); + [oTree1, oTree2, oTree4, oTree3], + [ + avoidClasses(clForest, 10, clPlayer, 20, clMetal, 6, clRock, 6, clHill, 1), + stayClasses(clLand, 4) + ], + clForest, + stragglerTrees); createFood( [ diff --git a/binaries/data/mods/public/maps/random/islands.js b/binaries/data/mods/public/maps/random/islands.js index 22652f1c6a..0fe1b8038b 100644 --- a/binaries/data/mods/public/maps/random/islands.js +++ b/binaries/data/mods/public/maps/random/islands.js @@ -287,30 +287,8 @@ createAreas( [avoidClasses(clPlayer, 2, clHill, 15), stayClasses(clLand, 0)], scaleByMapSize(4, 13)); -// calculate desired number of trees for map (based on size) -if (currentBiome() == "savanna") -{ - var MIN_TREES = 200; - var MAX_TREES = 1250; - var P_FOREST = 0; -} -else if (currentBiome() == "tropic") -{ - var MIN_TREES = 1000; - var MAX_TREES = 6000; - var P_FOREST = 0.52; -} -else -{ - var MIN_TREES = 500; - var MAX_TREES = 3000; - var P_FOREST = 0.7; -} -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); var types = [ [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]], [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]] @@ -318,11 +296,11 @@ var types = [ if (currentBiome() != "savanna") { - var size = numForest / (scaleByMapSize(3,6) * numPlayers); + var size = forestTrees / (scaleByMapSize(3,6) * numPlayers); var num = floor(size / types.length); for (let type of types) createAreas( - new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), numForest / (num * Math.floor(scaleByMapSize(2, 5))), 0.5), + new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), forestTrees / (num * Math.floor(scaleByMapSize(2, 5))), 0.5), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -445,15 +423,11 @@ createObjectGroupsDeprecated(group, 0, RMS.SetProgress(85); -log("Creating straggler trees..."); -var types = [oTree1, oTree2, oTree4, oTree3]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - [avoidClasses(clForest, 1, clHill, 1, clPlayer, 0, clMetal, 6, clRock, 6), stayClasses(clLand, 6)], - num); +createStragglerTrees( + [oTree1, oTree2, oTree4, oTree3], + [avoidClasses(clForest, 1, clHill, 1, clPlayer, 0, clMetal, 6, clRock, 6), stayClasses(clLand, 6)], + clForest, + stragglerTrees); var planetm = 1; if (currentBiome() == "tropic") diff --git a/binaries/data/mods/public/maps/random/kerala.js b/binaries/data/mods/public/maps/random/kerala.js index 5b183f251d..4e8c866bc4 100644 --- a/binaries/data/mods/public/maps/random/kerala.js +++ b/binaries/data/mods/public/maps/random/kerala.js @@ -190,28 +190,20 @@ createAreas( [avoidClasses(clPlayer, 20, clHill, 5, clWater, 2, clBaseResource, 2), stayClasses(clMountains, 0)], scaleByMapSize(5, 40) * numPlayers); -// calculate desired number of trees for map (based on size) -var MIN_TREES = 1000; -var MAX_TREES = 6000; -var P_FOREST = 0.7; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(1000, 6000, 0.7); var types = [ [[tGrass, tGrass, tGrass, tGrass, pForestD], [tGrass, tGrass, tGrass, pForestD]], [[tGrass, tGrass, tGrass, tGrass, pForestP], [tGrass, tGrass, tGrass, pForestP]] ]; -var size = numForest / (scaleByMapSize(3,6) * numPlayers); +var size = forestTrees / (scaleByMapSize(3,6) * numPlayers); var num = floor(size / types.length); for (let type of types) createAreas( new ChainPlacer( 1, Math.floor(scaleByMapSize(3, 5)), - numForest / (num * Math.floor(scaleByMapSize(2, 4))), + forestTrees / (num * Math.floor(scaleByMapSize(2, 4))), 0.5), [ new LayeredPainter(type, [2]), @@ -319,15 +311,11 @@ createObjectGroupsDeprecated(group, 0, RMS.SetProgress(95); -log("Creating straggler trees..."); -var types = [oTree, oPalm]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), - num); +createStragglerTrees( + [oTree, oPalm], + avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); log("Creating deer..."); group = new SimpleGroup( diff --git a/binaries/data/mods/public/maps/random/lake.js b/binaries/data/mods/public/maps/random/lake.js index 52dd4ffc57..015eb42214 100644 --- a/binaries/data/mods/public/maps/random/lake.js +++ b/binaries/data/mods/public/maps/random/lake.js @@ -185,12 +185,12 @@ if (randBool()) else createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(1, 4) * numPlayers); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2), clForest, - 1, - ...rBiomeTreeCount(1)); + forestTrees); RMS.SetProgress(50); @@ -296,7 +296,9 @@ RMS.SetProgress(85); createStragglerTrees( [oTree1, oTree2, oTree4, oTree3], - avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6)); + avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); setWaterWaviness(4.0); setWaterType("lake"); diff --git a/binaries/data/mods/public/maps/random/latium.js b/binaries/data/mods/public/maps/random/latium.js index d7567b4b02..3a97dccf99 100644 --- a/binaries/data/mods/public/maps/random/latium.js +++ b/binaries/data/mods/public/maps/random/latium.js @@ -440,15 +440,12 @@ createObjectGroups(group, 0, ); RMS.SetProgress(60); -log("Creating straggler trees..."); -for (let tree of [oCarob, oBeech, oLombardyPoplar, oLombardyPoplar, oPine]) -{ - group = new SimpleGroup([new SimpleObject(tree, 1,1, 0,1)], true, clForest); - createObjectGroupsDeprecated(group, 0, - avoidClasses(clWater, 5, clCliff, 4, clForest, 2, clPlayer, 15, clMetal, 6, clRock, 6), - scaleByMapSize(2, 38), 50 - ); -} +createStragglerTrees( + [oCarob, oBeech, oLombardyPoplar, oLombardyPoplar, oPine], + avoidClasses(clWater, 5, clCliff, 4, clForest, 2, clPlayer, 15, clMetal, 6, clRock, 6), + clForest, + scaleByMapSize(10, 190)); + RMS.SetProgress(70); log("Creating straggler cypresses..."); diff --git a/binaries/data/mods/public/maps/random/lorraine_plain.js b/binaries/data/mods/public/maps/random/lorraine_plain.js index db31cb1a72..167b7360e1 100644 --- a/binaries/data/mods/public/maps/random/lorraine_plain.js +++ b/binaries/data/mods/public/maps/random/lorraine_plain.js @@ -258,35 +258,12 @@ createAreas( ); RMS.SetProgress(55); -// calculate desired number of trees for map (based on size) -const MIN_TREES = 500; -const MAX_TREES = 2500; -const P_FOREST = 0.7; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - -log("Creating forests..."); -var types = [ - [[tGrassDForest, tGrass, pForestB], [tGrassDForest, pForestB]], - [[tGrassPForest, tGrass, pForestO], [tGrassPForest, pForestO]] -]; -var size = numForest / (scaleByMapSize(3, 6) * numPlayers); -var num = Math.floor(size / types.length); -for (let type of types) - createAreas( - new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), numForest / num, 0.5), - [ - new LayeredPainter(type, [2]), - paintClass(clForest) - ], - avoidClasses( - clPlayer, 15, - clWater, 3, - clForest, 16, - clHill, 1), - num); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.7); +createForests( + [tGrass, tGrassDForest, tGrassPForest, pForestB, pForestO], + avoidClasses(clPlayer, 15, clWater, 3, clForest, 16, clHill, 1), + clForest, + forestTrees); RMS.SetProgress(70); log("Creating dirt patches..."); @@ -386,15 +363,11 @@ createObjectGroupsDeprecated(group, 0, randIntInclusive(1, 4) * numPlayers + 2, 50 ); -log("Creating straggler trees..."); -var types = [oOak, oBeech]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - avoidClasses(clWater, 1, clForest, 7, clHill, 1, clPlayer, 5, clMetal, 6, clRock, 6), - num); +createStragglerTrees( + [oOak, oBeech], + avoidClasses(clWater, 1, clForest, 7, clHill, 1, clPlayer, 5, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); log("Creating small grass tufts..."); group = new SimpleGroup( diff --git a/binaries/data/mods/public/maps/random/mainland.js b/binaries/data/mods/public/maps/random/mainland.js index 99e50abe2d..b5af65b2bc 100644 --- a/binaries/data/mods/public/maps/random/mainland.js +++ b/binaries/data/mods/public/maps/random/mainland.js @@ -139,12 +139,12 @@ if (randBool()) else createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15), clHill, scaleByMapSize(3, 15)); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], avoidClasses(clPlayer, 20, clForest, 18, clHill, 0), clForest, - 1, - ...rBiomeTreeCount(1)); + forestTrees); RMS.SetProgress(50); @@ -237,6 +237,10 @@ createFood RMS.SetProgress(85); -createStragglerTrees([oTree1, oTree2, oTree4, oTree3]); +createStragglerTrees( + [oTree1, oTree2, oTree4, oTree3], + avoidClasses(clForest, 8, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); ExportMap(); diff --git a/binaries/data/mods/public/maps/random/migration.js b/binaries/data/mods/public/maps/random/migration.js index 6ef828284d..20a711016a 100644 --- a/binaries/data/mods/public/maps/random/migration.js +++ b/binaries/data/mods/public/maps/random/migration.js @@ -240,43 +240,20 @@ createAreas( ); RMS.SetProgress(34); -// calculate desired number of trees for map (based on size) -if (currentBiome() == "savanna") -{ - var MIN_TREES = 200; - var MAX_TREES = 1250; - var P_FOREST = 0.02; -} -else if (currentBiome() == "tropic") -{ - var MIN_TREES = 1000; - var MAX_TREES = 6000; - var P_FOREST = 0.6; -} -else -{ - var MIN_TREES = 500; - var MAX_TREES = 3000; - var P_FOREST = 0.7; -} - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); var types = [ [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]], [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]] ]; -var size = numForest / (scaleByMapSize(2,8) * numPlayers) * +var size = forestTrees / (scaleByMapSize(2,8) * numPlayers) * (currentBiome() == "savanna" ? 2 : 1); var num = floor(size / types.length); for (let type of types) createAreas( - new ClumpPlacer(numForest / num, 0.1, 0.1, 1), + new ClumpPlacer(forestTrees / num, 0.1, 0.1, 1), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -406,15 +383,12 @@ createObjectGroupsDeprecated( ); RMS.SetProgress(82); -log("Creating straggler trees..."); -var types = [oTree1, oTree2, oTree4, oTree3]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - [avoidClasses(clForest, 1, clHill, 1, clPlayer, 9, clMetal, 6, clRock, 6), stayClasses(clLand, 9)], - num); +createStragglerTrees( + [oTree1, oTree2, oTree4, oTree3], + [avoidClasses(clForest, 1, clHill, 1, clPlayer, 9, clMetal, 6, clRock, 6), stayClasses(clLand, 9)], + clForest, + stragglerTrees); + RMS.SetProgress(86); var planetm = currentBiome() == "tropic" ? 8 : 1; diff --git a/binaries/data/mods/public/maps/random/neareastern_badlands.js b/binaries/data/mods/public/maps/random/neareastern_badlands.js index c949720ea8..5f9693023f 100644 --- a/binaries/data/mods/public/maps/random/neareastern_badlands.js +++ b/binaries/data/mods/public/maps/random/neareastern_badlands.js @@ -300,18 +300,10 @@ createAreas( RMS.SetProgress(65); -// calculate desired number of trees for map (based on size) -const MIN_TREES = 500; -const MAX_TREES = 2500; -const P_FOREST = 0.5; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.5); var num = scaleByMapSize(10,30); -placer = new ClumpPlacer(numForest / num, 0.15, 0.1, 0.5); +placer = new ClumpPlacer(forestTrees / num, 0.15, 0.1, 0.5); painter = new TerrainPainter([tSand, pForest]); createAreas(placer, [painter, paintClass(clForest)], avoidClasses(clPlayer, 1, clForest, 10, clHill1, 1), @@ -364,15 +356,11 @@ createObjectGroupsDeprecated(group, 0, ); RMS.SetProgress(85); -log("Creating straggler trees..."); -var types = [oDatePalm, oSDatePalm]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 0)], true), - 0, - avoidClasses(clForest, 0, clHill1, 1, clPlayer, 4, clMetal, 6, clRock, 6), - num); +createStragglerTrees( + [oDatePalm, oSDatePalm], + avoidClasses(clForest, 0, clHill1, 1, clPlayer, 4, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); RMS.SetProgress(90); log("Creating bushes..."); diff --git a/binaries/data/mods/public/maps/random/northern_lights.js b/binaries/data/mods/public/maps/random/northern_lights.js index 084c85a7cd..884f354c23 100644 --- a/binaries/data/mods/public/maps/random/northern_lights.js +++ b/binaries/data/mods/public/maps/random/northern_lights.js @@ -190,27 +190,19 @@ createAreas( scaleByMapSize(1, 4) * numPlayers ); -// calculate desired number of trees for map (based on size) -var MIN_TREES = 100; -var MAX_TREES = 625; -var P_FOREST = 0.7; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(100, 625, 0.7); var types = [ [[tSnowA, tSnowA, tSnowA, tSnowA, pForestD], [tSnowA, tSnowA, tSnowA, pForestD]], [[tSnowA, tSnowA, tSnowA, tSnowA, pForestS], [tSnowA, tSnowA, tSnowA, pForestS]] ]; -var size = numForest / (scaleByMapSize(3,6) * numPlayers); +var size = forestTrees / (scaleByMapSize(3,6) * numPlayers); var num = floor(size / types.length); for (let type of types) createAreas( - new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), numForest / (num * Math.floor(scaleByMapSize(2, 4))), 1), + new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), forestTrees / (num * Math.floor(scaleByMapSize(2, 4))), 1), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -280,15 +272,11 @@ createObjectGroupsDeprecated(group, 0, ); RMS.SetProgress(95); -log("Creating straggler trees..."); -var types = [oPine]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), - num); +createStragglerTrees( + [oPine], + avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); log("Creating deer..."); group = new SimpleGroup( diff --git a/binaries/data/mods/public/maps/random/persian_highlands.js b/binaries/data/mods/public/maps/random/persian_highlands.js index 1c3457b79a..2e7ad48376 100644 --- a/binaries/data/mods/public/maps/random/persian_highlands.js +++ b/binaries/data/mods/public/maps/random/persian_highlands.js @@ -218,21 +218,13 @@ for (let i = 0; i < scaleByMapSize(20, 80); ++i) 14); RMS.SetProgress(35); -// calculate desired number of trees for map (based on size) -const MIN_TREES = 500; -const MAX_TREES = 2500; -const P_FOREST = 0.7; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.7); var types = [ [[tDirtMain, tForestFloor, pForestO], [tForestFloor, pForestO]], [[tDirtMain, tForestFloor, pForestO], [tForestFloor, pForestO]] ]; -var size = numForest / (scaleByMapSize(3,6) * numPlayers); +var size = forestTrees / (scaleByMapSize(3,6) * numPlayers); var num = floor(size / types.length); for (let type of types) createAreas( @@ -365,25 +357,11 @@ createObjectGroupsDeprecated(group, 0, RMS.SetProgress(90); -log("Creating straggler trees..."); -var types = [oOak]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup( - [new SimpleObject(type, 1, 1, 0, 3)], - true, - clForest), - 0, - avoidClasses( - clForest, 1, - clHill, 1, - clPlayer, 1, - clBaseResource, 6, - clMetal, 6, - clRock, 6, - clCP, 2), - num); +createStragglerTrees( + [oOak], + avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clBaseResource, 6, clMetal, 6, clRock, 6, clCP, 2), + clForest, + stragglerTrees); setSunColor(1.0, 0.796, 0.374); setSunElevation(PI / 6); diff --git a/binaries/data/mods/public/maps/random/phoenician_levant.js b/binaries/data/mods/public/maps/random/phoenician_levant.js index ef7b415d92..aaf85afde3 100644 --- a/binaries/data/mods/public/maps/random/phoenician_levant.js +++ b/binaries/data/mods/public/maps/random/phoenician_levant.js @@ -180,19 +180,11 @@ createAreas( avoidClasses(clPlayer, 20, clForest, 1, clHill, 15, clWater, 0), scaleByMapSize(1, 4) * numPlayers * 3); -// calculate desired number of trees for map (based on size) -const MIN_TREES = 500; -const MAX_TREES = 2500; -const P_FOREST = 0.5; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.5); var num = scaleByMapSize(10,42); createAreas( - new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), numForest / (num * Math.floor(scaleByMapSize(2, 5))), 0.5), + new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), forestTrees / (num * Math.floor(scaleByMapSize(2, 5))), 0.5), [ new TerrainPainter([tForestFloor, pForest]), paintClass(clForest) @@ -347,18 +339,16 @@ createObjectGroupsDeprecated(group, 0, ); RMS.SetProgress(90); -log("Creating straggler trees..."); -var types = [oDatePalm, oSDatePalm, oCarob, oFanPalm, oPoplar, oCypress]; var stragglerTrees = [ [1, avoidClasses(clForest, 0, clWater, 1, clPlayer, 8, clMetal, 6, clHill, 1)], [3, stayClasses(clIsland, 9)] ]; for (let [amount, constraint] of stragglerTrees) -{ - let num = amount * Math.floor(numStragglers / types.length); - for (let type of types) - createObjectGroupsDeprecated(new SimpleGroup([new SimpleObject(type, 1, 1, 0, 0)], true), 0, constraint, num); -} + createStragglerTrees( + [oDatePalm, oSDatePalm, oCarob, oFanPalm, oPoplar, oCypress], + constraint, + clForest, + amount * stragglerTrees); setSkySet("sunny"); setSunColor(0.917, 0.828, 0.734); diff --git a/binaries/data/mods/public/maps/random/rhine_marshlands.js b/binaries/data/mods/public/maps/random/rhine_marshlands.js index 4a8fab8df0..417ae29562 100644 --- a/binaries/data/mods/public/maps/random/rhine_marshlands.js +++ b/binaries/data/mods/public/maps/random/rhine_marshlands.js @@ -163,25 +163,17 @@ createAreas( stayClasses(clWater, 2), scaleByMapSize(50, 100)); -// calculate desired number of trees for map (based on size) -const MIN_TREES = 500; -const MAX_TREES = 2500; -const P_FOREST = 0.7; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(500, 2500, 0.7); var types = [ [[tForestFloor, tGrass, pForestD], [tForestFloor, pForestD]], [[tForestFloor, tGrass, pForestP], [tForestFloor, pForestP]] ]; -var size = numForest / (scaleByMapSize(3,6) * numPlayers); +var size = forestTrees / (scaleByMapSize(3,6) * numPlayers); var num = floor(size / types.length); for (let type of types) createAreas( - new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), numForest / (num * Math.floor(scaleByMapSize(2, 4))), 1), + new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), forestTrees / (num * Math.floor(scaleByMapSize(2, 4))), 1), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -304,18 +296,11 @@ createObjectGroupsDeprecated(group, 0, RMS.SetProgress(80); -log("Creating straggler trees..."); -var types = [oOak, oBeech]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup( - [new SimpleObject(type, 1, 1, 0, 3)], - true, - clForest), - 0, - avoidClasses(clForest, 1, clHill, 1, clPlayer, 13, clMetal, 6, clRock, 6, clWater, 0), - num); +createStragglerTrees( + [oOak, oBeech], + avoidClasses(clForest, 1, clHill, 1, clPlayer, 13, clMetal, 6, clRock, 6, clWater, 0), + clForest, + stragglerTrees); RMS.SetProgress(85); diff --git a/binaries/data/mods/public/maps/random/river_archipelago.js b/binaries/data/mods/public/maps/random/river_archipelago.js index 10b0934ab1..212483afa0 100644 --- a/binaries/data/mods/public/maps/random/river_archipelago.js +++ b/binaries/data/mods/public/maps/random/river_archipelago.js @@ -252,24 +252,20 @@ createBumps(avoidClasses(clPlayer, 8, clWater, 2), scaleByMapSize(20, 150), 2, 8 RMS.SetProgress(50); log("Creating forests..."); -var P_FOREST = 0.7; -var totalTrees = scaleByMapSize(1000, 4000); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - +var [forestTrees, stragglerTrees] = getTreeCounts(1000, 4000, 0.7); var types = [ [[tGrass, tGrass, tGrass, tGrass, pForestD], [tGrass, tGrass, tGrass, pForestD]], [[tGrass, tGrass, tGrass, tGrass, pForestP1], [tGrass, tGrass, tGrass, pForestP1]], [[tGrass, tGrass, tGrass, tGrass, pForestP2], [tGrass, tGrass, tGrass, pForestP2]] ]; -var size = numForest / (scaleByMapSize(3, 6) * numPlayers); +var size = forestTrees / (scaleByMapSize(3, 6) * numPlayers); var num = Math.floor(size / types.length); for (let type of types) createAreas( new ChainPlacer( 1, Math.floor(scaleByMapSize(3, 5)), - numForest / (num * Math.floor(scaleByMapSize(2, 4))), + forestTrees / (num * Math.floor(scaleByMapSize(2, 4))), 0.5), [ new LayeredPainter(type, [2]), @@ -283,23 +279,20 @@ for (let type of types) clWater, 2), num); -log("Creating straggler trees..."); -var types = [oTree, oPalm1, oPalm2]; -var num = Math.floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - avoidClasses( - clWater, 5, - clForest, 1, - clHill, 1, - clPlayer, 8, - clBaseResource, 4, - clGaia, 1, - clMetal, 4, - clRock, 4), - num); +createStragglerTrees( + [oTree, oPalm1, oPalm2], + avoidClasses( + clWater, 5, + clForest, 1, + clHill, 1, + clPlayer, 8, + clBaseResource, 4, + clGaia, 1, + clMetal, 4, + clRock, 4), + clForest, + stragglerTrees); + RMS.SetProgress(60); log("Creating grass patches..."); diff --git a/binaries/data/mods/public/maps/random/rivers.js b/binaries/data/mods/public/maps/random/rivers.js index 40e8884260..357ad72d25 100644 --- a/binaries/data/mods/public/maps/random/rivers.js +++ b/binaries/data/mods/public/maps/random/rivers.js @@ -302,12 +302,12 @@ if (randBool()) else createMountains(tCliff, avoidClasses(clPlayer, 20, clHill, 15, clWater, 2), clHill, scaleByMapSize(3, 15)); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2), clForest, - 1, - ...rBiomeTreeCount(1)); + forestTrees); RMS.SetProgress(50); @@ -426,7 +426,9 @@ RMS.SetProgress(85); createStragglerTrees( [oTree1, oTree2, oTree4, oTree3], - avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6)); + avoidClasses(clWater, 5, clForest, 7, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); setWaterWaviness(3.0); setWaterType("lake"); diff --git a/binaries/data/mods/public/maps/random/rmgen/gaia_entities.js b/binaries/data/mods/public/maps/random/rmgen/gaia_entities.js index 810257aff5..c3c86cc017 100644 --- a/binaries/data/mods/public/maps/random/rmgen/gaia_entities.js +++ b/binaries/data/mods/public/maps/random/rmgen/gaia_entities.js @@ -2,6 +2,66 @@ * @file These functions are often used to place gaia entities, like forests, mines, animals or decorative bushes. */ +/** + * Returns the number of trees in forests and straggler trees. + */ +function getTreeCounts(minTrees, maxTrees, forestRatio) +{ + return [forestRatio, 1 - forestRatio].map(p => p * scaleByMapSize(minTrees, maxTrees)); +} + +/** + * Places uniformly sized forests at random locations. + * Generates two variants of forests from the given terrain textures and tree templates. + * The forest border has less trees than the inside. + */ +function createForests(terrainSet, constraint, tileClass, treeCount) +{ + if (!treeCount) + return; + + // Construct different forest types from the terrain textures and template names. + let [mainTerrain, terrainForestFloor1, terrainForestFloor2, terrainForestTree1, terrainForestTree2] = terrainSet; + + // The painter will pick a random Terrain for each part of the forest. + let forestVariants = [ + { + "borderTerrains": [terrainForestFloor2, mainTerrain, terrainForestTree1], + "interiorTerrains": [terrainForestFloor2, terrainForestTree1] + }, + { + "borderTerrains": [terrainForestFloor1, mainTerrain, terrainForestTree2], + "interiorTerrains": [terrainForestFloor1, terrainForestTree2] + } + ]; + + log("Creating forests..."); + let numberOfForests = Math.floor(treeCount / (scaleByMapSize(3, 6) * getNumPlayers() * forestVariants.length)); + for (let forestVariant of forestVariants) + createAreas( + new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), treeCount / numberOfForests, 0.5), + [ + new LayeredPainter([forestVariant.borderTerrains, forestVariant.interiorTerrains], [2]), + paintClass(tileClass) + ], + constraint, + numberOfForests); +} + +/** + * Places the given amount of Entities at random places meeting the given Constraint, chosing a different template for each. + */ +function createStragglerTrees(templateNames, constraint, tileClass, treeCount) +{ + log("Creating straggler trees..."); + for (let templateName of templateNames) + createObjectGroupsDeprecated( + new SimpleGroup([new SimpleObject(templateName, 1, 1, 0, 3)], true, tileClass), + 0, + constraint, + Math.floor(treeCount / templateNames.length)); +} + /** * Places a SimpleGroup consisting of the given number of the given Objects * at random locations that meet the given Constraint. diff --git a/binaries/data/mods/public/maps/random/rmgen/utilityfunctions.js b/binaries/data/mods/public/maps/random/rmgen/utilityfunctions.js deleted file mode 100644 index e305659a9b..0000000000 --- a/binaries/data/mods/public/maps/random/rmgen/utilityfunctions.js +++ /dev/null @@ -1,60 +0,0 @@ -var g_numStragglerTrees = 0; - -function createForests(terrainset, constraint, tileclass, numMultiplier = 1, minTrees = 500, maxTrees = 3000, forestProbability = 0.7) -{ - log("Creating forests..."); - - tileclass = tileclass || clForest; - constraint = constraint || avoidClasses(clPlayer, 20, clForest, 17, clHill, 0); - - var [tM, tFF1, tFF2, tF1, tF2] = terrainset; - var totalTrees = scaleByMapSize(minTrees, maxTrees); - var numForest = totalTrees * forestProbability; - g_numStragglerTrees = totalTrees * (1.0 - forestProbability); - - if (!forestProbability) - return; - - log("Creating forests..."); - - let types = [ - [[tFF2, tM, tF1], [tFF2, tF1]], - [[tFF1, tM, tF2], [tFF1, tF2]] - ]; - - let num = Math.floor(numForest / (scaleByMapSize(3,6) * numPlayers) / types.length); - for (let type of types) - createAreas( - new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), numForest / num, 0.5), - [ - new LayeredPainter(type, [2]), - paintClass(tileclass) - ], - constraint, - num - ); -} - -function createStragglerTrees(types, constraint, tileclass) -{ - log("Creating straggler trees..."); - - constraint = constraint !== undefined ? - constraint : - avoidClasses(clForest, 8, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6); - - tileclass = tileclass !== undefined ? tileclass : clForest; - - var num = floor(g_numStragglerTrees / types.length); - for (var i = 0; i < types.length; ++i) - { - let group = new SimpleGroup( - [new SimpleObject(types[i], 1,1, 0,3)], - true, tileclass - ); - createObjectGroupsDeprecated(group, 0, - constraint, - num - ); - } -} diff --git a/binaries/data/mods/public/maps/random/sahel.js b/binaries/data/mods/public/maps/random/sahel.js index 03dfe2e6b9..b89f3b7381 100644 --- a/binaries/data/mods/public/maps/random/sahel.js +++ b/binaries/data/mods/public/maps/random/sahel.js @@ -246,16 +246,11 @@ createObjectGroupsDeprecated(group, 0, RMS.SetProgress(85); -log("Creating straggler trees..."); -var num = scaleByMapSize(70, 500); -group = new SimpleGroup( - [new SimpleObject(oBaobab, 1,1, 0,3)], - true, clForest -); -createObjectGroupsDeprecated(group, 0, +createStragglerTrees( + [oBaobab], avoidClasses(clForest, 1, clPlayer, 20, clMetal, 6, clRock, 7, clWater, 1), - num -); + clForest, + scaleByMapSize(70, 500)); log("Creating large grass tufts..."); group = new SimpleGroup( diff --git a/binaries/data/mods/public/maps/random/sahel_watering_holes.js b/binaries/data/mods/public/maps/random/sahel_watering_holes.js index 3b224cfd8e..2e274ba500 100644 --- a/binaries/data/mods/public/maps/random/sahel_watering_holes.js +++ b/binaries/data/mods/public/maps/random/sahel_watering_holes.js @@ -251,25 +251,17 @@ createAreas( avoidClasses(clPlayer, 20, clHill, 15, clWater, 3), scaleByMapSize(1, 4) * numPlayers); -// calculate desired number of trees for map (based on size) -var MIN_TREES = 160; -var MAX_TREES = 900; -var P_FOREST = 0.02; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(160, 900, 0.02); var types = [ [[tForestFloor, tGrass, pForest], [tForestFloor, pForest]] ]; -var size = numForest / (0.5 * scaleByMapSize(2,8) * numPlayers); +var size = forestTrees / (0.5 * scaleByMapSize(2,8) * numPlayers); var num = floor(size / types.length); for (let type of types) createAreas( - new ClumpPlacer(numForest / num, 0.1, 0.1, 1), + new ClumpPlacer(forestTrees / num, 0.1, 0.1, 1), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -422,15 +414,11 @@ createObjectGroupsDeprecated(group, 0, RMS.SetProgress(85); -log("Creating straggler trees..."); -var types = [oBaobab, oBaobab, oBaobab, oFig]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1,1, 0,3)], true, clForest), - 0, - avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), - num); +createStragglerTrees( + [oBaobab, oBaobab, oBaobab, oFig], + avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); var planetm = 4; log("Creating small grass tufts..."); diff --git a/binaries/data/mods/public/maps/random/snowflake_searocks.js b/binaries/data/mods/public/maps/random/snowflake_searocks.js index 2421c2b947..cac6e1419a 100644 --- a/binaries/data/mods/public/maps/random/snowflake_searocks.js +++ b/binaries/data/mods/public/maps/random/snowflake_searocks.js @@ -339,40 +339,18 @@ for (let ix = 0; ix < mapSize; ++ix) } } -if (currentBiome() == "savanna") -{ - var MIN_TREES = 200; - var MAX_TREES = 1250; - var P_FOREST = 0.02; -} -else if (currentBiome() == "tropic") -{ - var MIN_TREES = 1000; - var MAX_TREES = 6000; - var P_FOREST = 0.6; -} -else -{ - var MIN_TREES = 500; - var MAX_TREES = 3000; - var P_FOREST = 0.7; -} - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); var types = [ [[tForestFloor2, tMainTerrain, pForest1], [tForestFloor2, pForest1]], [[tForestFloor1, tMainTerrain, pForest2], [tForestFloor1, pForest2]] ]; -var size = numForest / (scaleByMapSize(2, 8) * numPlayers) * (currentBiome() == "savanna" ? 2 : 1); +var size = forestTrees / (scaleByMapSize(2, 8) * numPlayers) * (currentBiome() == "savanna" ? 2 : 1); var num = floor(size / types.length); for (let type of types) createAreas( - new ClumpPlacer(numForest / num, 0.1, 0.1, 1), + new ClumpPlacer(forestTrees / num, 0.1, 0.1, 1), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -479,15 +457,11 @@ createObjectGroupsDeprecated(group, 0, ); RMS.SetProgress(85); -log("Creating straggler trees..."); -var types = [oTree1, oTree2, oTree4, oTree3]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - [avoidClasses(clForest, 1, clHill, 1, clPlayer, 9, clMetal, 6, clRock, 6), stayClasses(clLand, 4)], - num); +createStragglerTrees( + [oTree1, oTree2, oTree4, oTree3], + [avoidClasses(clForest, 1, clHill, 1, clPlayer, 9, clMetal, 6, clRock, 6), stayClasses(clLand, 4)], + clForest, + stragglerTrees); var planetm = 1; if (currentBiome() == "tropic") diff --git a/binaries/data/mods/public/maps/random/survivalofthefittest.js b/binaries/data/mods/public/maps/random/survivalofthefittest.js index 9939108ac0..0dc83d4f34 100644 --- a/binaries/data/mods/public/maps/random/survivalofthefittest.js +++ b/binaries/data/mods/public/maps/random/survivalofthefittest.js @@ -163,12 +163,12 @@ RMS.SetProgress(25); createBumps(stayClasses(clLand, 5)); +var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1)); createForests( [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2], [avoidClasses(clPlayer, 20, clForest, 5, clHill, 0, clBaseResource,2, clWomen, 5), stayClasses(clLand, 4)], clForest, - 1, - ...rBiomeTreeCount(1)); + forestTrees); RMS.SetProgress(30); if (randBool()) @@ -237,9 +237,10 @@ createDecoration( [avoidClasses(clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 5)] ); -log("Creating straggler trees..."); createStragglerTrees( [oTree1, oTree2, oTree4, oTree3], - [avoidClasses(clForest, 7, clHill, 1, clPlayer, 9), stayClasses(clLand, 7)]); + [avoidClasses(clForest, 7, clHill, 1, clPlayer, 9), stayClasses(clLand, 7)], + clForest, + stragglerTrees); ExportMap(); diff --git a/binaries/data/mods/public/maps/random/syria.js b/binaries/data/mods/public/maps/random/syria.js index 8eee2afa58..e3cdf32882 100644 --- a/binaries/data/mods/public/maps/random/syria.js +++ b/binaries/data/mods/public/maps/random/syria.js @@ -155,28 +155,20 @@ createAreas( RMS.SetProgress(25); -// calculate desired number of trees for map (based on size) -const MIN_TREES = 400; -const MAX_TREES = 2000; -const P_FOREST = 0.7; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(400, 2000, 0.7); var types = [ [[tMainDirt, tForestFloor2, pForestP], [tForestFloor2, pForestP]], [[tMainDirt, tForestFloor1, pForestT], [tForestFloor1, pForestT]] ]; -var size = numForest / (scaleByMapSize(3,6) * numPlayers); +var size = forestTrees / (scaleByMapSize(3,6) * numPlayers); var num = floor(size / types.length); for (let type of types) createAreas( new ChainPlacer( 1, Math.floor(scaleByMapSize(3, 5)), - numForest / (num * Math.floor(scaleByMapSize(2, 4))), + forestTrees / (num * Math.floor(scaleByMapSize(2, 4))), 0.5), [ new LayeredPainter(type, [2]), @@ -280,25 +272,17 @@ createObjectGroupsDeprecated(group, 0, ); RMS.SetProgress(85); -log("Creating straggler trees..."); -var types = [oPalm, oTamarix, oPine]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6), - num); +createStragglerTrees( + [oPalm, oTamarix, oPine], + avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6), + clForest, + stragglerTrees); -log("Creating straggler trees..."); -var types = [oPalm, oTamarix, oPine]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1,1, 0,3)], true, clForest), - 0, - [avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6), stayClasses(clGrass, 3)], - num); +createStragglerTrees( + [oPalm, oTamarix, oPine], + [avoidClasses(clForest, 1, clHill, 1, clPlayer, 1, clMetal, 6, clRock, 6), stayClasses(clGrass, 3)], + clForest, + stragglerTrees); setSkySet("sunny"); setSunElevation(PI / 8); diff --git a/binaries/data/mods/public/maps/random/the_nile.js b/binaries/data/mods/public/maps/random/the_nile.js index 218f7945b9..3145b9311e 100644 --- a/binaries/data/mods/public/maps/random/the_nile.js +++ b/binaries/data/mods/public/maps/random/the_nile.js @@ -256,19 +256,11 @@ createObjectGroupsByAreasDeprecated( waterAreas = []; -// calculate desired number of trees for map (based on size) -const MIN_TREES = 700; -const MAX_TREES = 3500; -const P_FOREST = 0.5; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(700, 3500, 0.5); var num = scaleByMapSize(10,30); createAreas( - new ClumpPlacer(numForest / num, 0.15, 0.1, 0.5), + new ClumpPlacer(forestTrees / num, 0.15, 0.1, 0.5), [ new TerrainPainter([pForest, tForestFloor]), paintClass(clForest) @@ -411,34 +403,23 @@ createObjectGroupsDeprecated(group, 0, RMS.SetProgress(90); -log("Creating straggler trees..."); -var types = [oDatePalm, oSDatePalm]; -var num = floor(0.5 * numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 0)], true), - 0, - avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clDesert, 1, clTreasure, 2, clPond, 1), - num); +createStragglerTrees( + [oDatePalm, oSDatePalm], + avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clDesert, 1, clTreasure, 2, clPond, 1), + clForest, + stragglerTrees / 2); -var types = [oDatePalm, oSDatePalm]; -var num = floor(0.1 * numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1,1, 0,0)], true), - 0, - avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clTreasure, 2), - num); +createStragglerTrees( + [oDatePalm, oSDatePalm], + avoidClasses(clForest, 0, clWater, 1, clPlayer, 20, clMetal, 6, clTreasure, 2), + clForest, + stragglerTrees / 10); -log("Creating straggler trees..."); -var types = [oDatePalm, oSDatePalm]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 0)], true), - 0, - borderClasses(clPond, 1, 4), - num); +createStragglerTrees( + [oDatePalm, oSDatePalm], + borderClasses(clPond, 1, 4), + clForest, + stragglerTrees); log("Creating obelisks"); group = new SimpleGroup( diff --git a/binaries/data/mods/public/maps/random/volcanic_lands.js b/binaries/data/mods/public/maps/random/volcanic_lands.js index d28148e09f..62a678861e 100644 --- a/binaries/data/mods/public/maps/random/volcanic_lands.js +++ b/binaries/data/mods/public/maps/random/volcanic_lands.js @@ -119,25 +119,17 @@ createAreas( scaleByMapSize(2, 8) * numPlayers ); -// calculate desired number of trees for map (based on size) -var MIN_TREES = 200; -var MAX_TREES = 1250; -var P_FOREST = 0.7; - -var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); -var numForest = totalTrees * P_FOREST; -var numStragglers = totalTrees * (1.0 - P_FOREST); - log("Creating forests..."); +var [forestTrees, stragglerTrees] = getTreeCounts(200, 1250, 0.7); var types = [ [[tGrassB, tGrassA, pForestD], [tGrassB, pForestD]], [[tGrassB, tGrassA, pForestP], [tGrassB, pForestP]] ]; -var size = numForest / (scaleByMapSize(2,8) * numPlayers); +var size = forestTrees / (scaleByMapSize(2,8) * numPlayers); var num = floor(size / types.length); for (let type of types) createAreas( - new ClumpPlacer(numForest / num, 0.1, 0.1, 1), + new ClumpPlacer(forestTrees / num, 0.1, 0.1, 1), [ new LayeredPainter(type, [2]), paintClass(clForest) @@ -226,14 +218,10 @@ createObjectGroupsDeprecated( RMS.SetProgress(95); -log("Creating straggler trees..."); -var types = [oTree]; -var num = floor(numStragglers / types.length); -for (let type of types) - createObjectGroupsDeprecated( - new SimpleGroup([new SimpleObject(type, 1, 1, 0, 3)], true, clForest), - 0, - avoidClasses(clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6, clBaseResource, 6), - num); +createStragglerTrees( + [oTree], + avoidClasses(clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6, clBaseResource, 6), + clForest, + stragglerTrees); ExportMap();