1 Engine.LoadLibrary("rmgen");
3 const tGrass = ["tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_plants", "tropic_plants", "tropic_plants_b"];
4 const tGrassA = "tropic_plants_c";
5 const tGrassB = "tropic_plants_c";
6 const tGrassC = "tropic_grass_c";
7 const tForestFloor = "tropic_grass_plants";
8 const tCliff = ["tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a_plants"];
9 const tPlants = "tropic_plants";
10 const tRoad = "tropic_citytile_a";
11 const tRoadWild = "tropic_citytile_plants";
12 const tShoreBlend = "tropic_beach_dry_plants";
13 const tShore = "tropic_beach_dry";
14 const tWater = "tropic_beach_wet";
16 const oTree = "gaia/flora_tree_toona";
17 const oPalm = "gaia/flora_tree_palm_tropic";
18 const oStoneLarge = "gaia/geology_stonemine_tropic_quarry";
19 const oStoneSmall = "gaia/geology_stone_tropic_a";
20 const oMetalLarge = "gaia/geology_metal_tropic_slabs";
21 const oFish = "gaia/fauna_fish";
22 const oDeer = "gaia/fauna_deer";
23 const oSheep = "gaia/fauna_tiger";
24 const oBush = "gaia/flora_bush_berry";
26 const aRockLarge = "actor|geology/stone_granite_large.xml";
27 const aRockMedium = "actor|geology/stone_granite_med.xml";
28 const aBush1 = "actor|props/flora/plant_tropic_a.xml";
29 const aBush2 = "actor|props/flora/plant_lg.xml";
30 const aBush3 = "actor|props/flora/plant_tropic_large.xml";
32 const pForestD = [tForestFloor + TERRAIN_SEPARATOR + oTree, tForestFloor];
33 const pForestP = [tForestFloor + TERRAIN_SEPARATOR + oPalm, tForestFloor];
35 const heightSeaGround = -5;
37 const heightHill = 25;
39 var g_Map = new RandomMap(heightLand, tGrass);
41 const numPlayers = getNumPlayers();
42 const mapCenter = g_Map.getCenter();
43 const mapBounds = g_Map.getBounds();
45 var clPlayer = createTileClass();
46 var clHill = createTileClass();
47 var clForest = createTileClass();
48 var clWater = createTileClass();
49 var clDirt = createTileClass();
50 var clRock = createTileClass();
51 var clMetal = createTileClass();
52 var clFood = createTileClass();
53 var clBaseResource = createTileClass();
54 var clMountains = createTileClass();
56 var waterPosition = fractionToTiles(0.31);
57 var playerPosition = fractionToTiles(0.55);
58 var mountainPosition = fractionToTiles(0.69);
60 var startAngle = randomAngle();
65 playerPlacementLine(0, new Vector2D(mapCenter.x, playerPosition), fractionToTiles(0.2)).map(pos => pos.rotateAround(startAngle, mapCenter))
67 "PlayerTileClass": clPlayer,
68 "BaseResourceClass": clBaseResource,
70 "outerTerrain": tRoadWild,
80 { "template": oMetalLarge },
81 { "template": oStoneLarge }
86 "count": scaleByMapSize(12, 30),
94 Engine.SetProgress(15);
98 "start": new Vector2D(mapBounds.left, mapBounds.top).rotateAround(startAngle - Math.PI / 2, mapCenter),
99 "end": new Vector2D(mapBounds.left, mapBounds.bottom).rotateAround(startAngle - Math.PI / 2, mapCenter),
100 "width": 2 * waterPosition,
103 "heightRiverbed": heightSeaGround,
104 "heightLand": heightLand,
107 "landFunc": (position, shoreDist1, shoreDist2) => {
108 if (waterPosition + shoreDist1 > mountainPosition)
109 addToClass(position.x, position.y, clMountains);
111 "waterFunc": (position, height, riverFraction) => {
112 addToClass(position.x, position.y, clWater);
116 log("Creating shores...");
117 for (let i = 0; i < scaleByMapSize(20, 120); ++i)
119 let position = new Vector2D(fractionToTiles(randFloat(0.28, 0.34)), fractionToTiles(randFloat(0.1, 0.9))).rotateAround(startAngle - Math.PI / 2, mapCenter).round();
121 new ChainPlacer(1, Math.floor(scaleByMapSize(4, 6)), Math.floor(scaleByMapSize(16, 30)), 1, position),
123 new LayeredPainter([tGrass, tGrass], [2]),
124 new SmoothElevationPainter(ELEVATION_SET, heightLand, 3),
125 unPaintClass(clWater)
129 paintTerrainBasedOnHeight(-6, 1, 1, tWater);
130 paintTerrainBasedOnHeight(1, 2.8, 1, tShoreBlend);
131 paintTerrainBasedOnHeight(0, 1, 1, tShore);
132 paintTileClassBasedOnHeight(-6, 0.5, 1, clWater);
134 Engine.SetProgress(45);
136 log("Creating hills...");
138 new ChainPlacer(1, Math.floor(scaleByMapSize(4, 6)), Math.floor(scaleByMapSize(16, 40)), 0.1),
140 new LayeredPainter([tCliff, tGrass], [3]),
141 new SmoothElevationPainter(ELEVATION_SET, heightHill, 3),
144 [avoidClasses(clPlayer, 20, clHill, 5, clWater, 2, clBaseResource, 2), stayClasses(clMountains, 0)],
145 scaleByMapSize(5, 40) * numPlayers);
147 log("Creating forests...");
148 var [forestTrees, stragglerTrees] = getTreeCounts(1000, 6000, 0.7);
150 [[tGrass, tGrass, tGrass, tGrass, pForestD], [tGrass, tGrass, tGrass, pForestD]],
151 [[tGrass, tGrass, tGrass, tGrass, pForestP], [tGrass, tGrass, tGrass, pForestP]]
153 var size = forestTrees / (scaleByMapSize(3,6) * numPlayers);
154 var num = Math.floor(size / types.length);
155 for (let type of types)
159 Math.floor(scaleByMapSize(3, 5)),
160 forestTrees / (num * Math.floor(scaleByMapSize(2, 4))),
163 new LayeredPainter(type, [2]),
166 avoidClasses(clPlayer, 20, clForest, 10, clHill, 0, clWater, 8),
169 Engine.SetProgress(70);
171 log("Creating grass patches...");
172 for (let size of [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)])
174 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
176 new LayeredPainter([tGrassC, tGrassA, tGrassB], [2, 1]),
179 avoidClasses(clWater, 8, clForest, 0, clHill, 0, clPlayer, 12, clDirt, 16),
180 scaleByMapSize(20, 80));
182 for (let size of [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)])
184 new ChainPlacer(1, Math.floor(scaleByMapSize(3, 5)), size, 0.5),
186 new LayeredPainter([tPlants, tPlants], [1]),
189 avoidClasses(clWater, 8, clForest, 0, clHill, 0, clPlayer, 12, clDirt, 16),
190 scaleByMapSize(20, 80));
192 log("Creating stone mines...");
193 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
194 createObjectGroupsDeprecated(group, 0,
195 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
196 scaleByMapSize(4,16), 100
199 log("Creating small stone quarries...");
200 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
201 createObjectGroupsDeprecated(group, 0,
202 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1),
203 scaleByMapSize(4,16), 100
206 log("Creating metal mines...");
207 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
208 createObjectGroupsDeprecated(group, 0,
209 avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1),
210 scaleByMapSize(4,16), 100
213 log("Creating small decorative rocks...");
214 group = new SimpleGroup(
215 [new SimpleObject(aRockMedium, 1,3, 0,1)],
218 createObjectGroupsDeprecated(
220 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0),
221 3*scaleByMapSize(16, 262), 50
224 log("Creating large decorative rocks...");
225 group = new SimpleGroup(
226 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
229 createObjectGroupsDeprecated(
231 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0),
232 3*scaleByMapSize(8, 131), 50
235 log("Creating small grass tufts...");
236 group = new SimpleGroup(
237 [new SimpleObject(aBush1, 1,2, 0,1, -Math.PI / 8, Math.PI / 8)]
239 createObjectGroupsDeprecated(group, 0,
240 avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0),
241 8 * scaleByMapSize(13, 200)
244 Engine.SetProgress(90);
246 log("Creating large grass tufts...");
247 group = new SimpleGroup(
248 [new SimpleObject(aBush2, 2,4, 0,1.8, -Math.PI / 8, Math.PI / 8), new SimpleObject(aBush1, 3,6, 1.2,2.5, -Math.PI / 8, Math.PI / 8)]
250 createObjectGroupsDeprecated(group, 0,
251 avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0),
252 8 * scaleByMapSize(13, 200)
255 Engine.SetProgress(95);
257 log("Creating bushes...");
258 group = new SimpleGroup(
259 [new SimpleObject(aBush3, 1,2, 0,2), new SimpleObject(aBush2, 2,4, 0,2)]
261 createObjectGroupsDeprecated(group, 0,
262 avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1),
263 8 * scaleByMapSize(13, 200), 50
266 Engine.SetProgress(95);
268 createStragglerTrees(
270 avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 6, clRock, 6),
274 log("Creating deer...");
275 group = new SimpleGroup(
276 [new SimpleObject(oDeer, 5,7, 0,4)],
279 createObjectGroupsDeprecated(group, 0,
280 avoidClasses(clWater, 3, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20),
284 Engine.SetProgress(75);
286 log("Creating berry bush...");
287 group = new SimpleGroup(
288 [new SimpleObject(oBush, 5,7, 0,4)],
291 createObjectGroupsDeprecated(group, 0,
292 avoidClasses(clWater, 6, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10),
293 randIntInclusive(1, 4) * numPlayers + 2, 50
296 log("Creating sheep...");
297 group = new SimpleGroup(
298 [new SimpleObject(oSheep, 2,3, 0,2)],
301 createObjectGroupsDeprecated(group, 0,
302 avoidClasses(clWater, 3, clForest, 0, clPlayer, 22, clHill, 1, clFood, 20),
306 log("Creating fish...");
307 group = new SimpleGroup(
308 [new SimpleObject(oFish, 2,3, 0,2)],
311 createObjectGroupsDeprecated(group, 0,
312 [avoidClasses(clFood, 20), stayClasses(clWater, 6)],
316 placePlayersNomad(clPlayer, avoidClasses(clWater, 4, clHill, 2, clForest, 1, clMetal, 4, clRock, 4, clFood, 2));
318 setSunColor(0.6, 0.6, 0.6);
319 setSunElevation(Math.PI / 3);
321 setWaterColor(0.524,0.734,0.839);
322 setWaterTint(0.369,0.765,0.745);
323 setWaterWaviness(1.0);
324 setWaterType("ocean");
325 setWaterMurkiness(0.35);
328 setFogThickness(0.2);
332 setPPSaturation(0.65);