1 RMS.LoadLibrary("rmgen");
3 const tGrass = ["temp_grass_clovers"];
4 const tGrassPForest = "temp_plants_bog";
5 const tGrassDForest = "alpine_dirt_grass_50";
6 const tCliff = ["temp_cliff_a", "temp_cliff_b"];
7 const tGrassA = "temp_grass_d";
8 const tGrassB = "temp_grass_c";
9 const tGrassC = "temp_grass_clovers_2";
10 const tHill = ["temp_highlands", "temp_grass_long_b"];
11 const tDirt = ["temp_dirt_gravel", "temp_dirt_gravel_b"];
12 const tRoad = "temp_road";
13 const tRoadWild = "temp_road_overgrown";
14 const tGrassPatch = "temp_grass_plants";
15 const tShoreBlend = "temp_mud_plants";
16 const tShore = "medit_sand_wet";
17 const tWater = "medit_sand_wet";
19 const oPoplar = "gaia/flora_tree_poplar";
20 const oPalm = "gaia/flora_tree_cretan_date_palm_short";
21 const oApple = "gaia/flora_tree_apple";
22 const oOak = "gaia/flora_tree_oak";
23 const oBerryBush = "gaia/flora_bush_berry";
24 const oDeer = "gaia/fauna_deer";
25 const oFish = "gaia/fauna_fish";
26 const oGoat = "gaia/fauna_goat";
27 const oBoar = "gaia/fauna_boar";
28 const oStoneLarge = "gaia/geology_stonemine_temperate_quarry";
29 const oStoneSmall = "gaia/geology_stone_temperate";
30 const oMetalLarge = "gaia/geology_metal_temperate_slabs";
32 const aGrass = "actor|props/flora/grass_soft_large_tall.xml";
33 const aGrassShort = "actor|props/flora/grass_soft_large.xml";
34 const aRockLarge = "actor|geology/stone_granite_large.xml";
35 const aRockMedium = "actor|geology/stone_granite_med.xml";
36 const aBushMedium = "actor|props/flora/bush_medit_me_lush.xml";
37 const aBushSmall = "actor|props/flora/bush_medit_sm_lush.xml";
39 // terrain + entity (for painting)
40 const pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oPoplar, tGrassDForest];
41 const pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oOak, tGrassPForest];
45 const numPlayers = getNumPlayers();
46 const mapSize = getMapSize();
47 const mapArea = mapSize*mapSize;
49 var clPlayer = createTileClass();
50 var clHill = createTileClass();
51 var clForest = createTileClass();
52 var clWater = createTileClass();
53 var clDirt = createTileClass();
54 var clRock = createTileClass();
55 var clMetal = createTileClass();
56 var clFood = createTileClass();
57 var clBaseResource = createTileClass();
58 var clSettlement = createTileClass();
59 var clSea = createTileClass();
60 var clHighlands = createTileClass();
61 var clFlatlands = createTileClass();
63 var playerIDs = sortAllPlayers();
65 for (var i = 0; i < numPlayers; i++)
67 var id = playerIDs[i];
68 log("Creating base for player " + id + "...");
70 var radius = scaleByMapSize(15,25);
74 // get the x and z in tiles
75 var fx = fractionToTiles((i + 1) / (numPlayers + 1));
76 var fz = fractionToTiles(0.4 + 0.2 * (i % 2));
80 addCivicCenterAreaToClass(ix, iz, clPlayer);
82 // create the city patch
83 var cityRadius = radius/3;
84 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
85 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
86 createArea(placer, painter, null);
88 placeCivDefaultEntities(fx, fz, id);
90 placeDefaultChicken(fx, fz, clBaseResource);
92 // create berry bushes
93 var bbAngle = randFloat(0, TWO_PI);
95 var bbX = round(fx + bbDist * cos(bbAngle));
96 var bbZ = round(fz + bbDist * sin(bbAngle));
97 var group = new SimpleGroup(
98 [new SimpleObject(oBerryBush, 5,5, 0,3)],
99 true, clBaseResource, bbX, bbZ
101 createObjectGroup(group, 0);
104 var mAngle = bbAngle;
105 while(abs(mAngle - bbAngle) < PI/3)
106 mAngle = randFloat(0, TWO_PI);
109 var mX = round(fx + mDist * cos(mAngle));
110 var mZ = round(fz + mDist * sin(mAngle));
111 group = new SimpleGroup(
112 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
113 true, clBaseResource, mX, mZ
115 createObjectGroup(group, 0);
117 // create stone mines
118 mAngle += randFloat(PI/8, PI/4);
119 mX = round(fx + mDist * cos(mAngle));
120 mZ = round(fz + mDist * sin(mAngle));
121 group = new SimpleGroup(
122 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
123 true, clBaseResource, mX, mZ
125 createObjectGroup(group, 0);
127 // create starting trees
129 var tAngle = randFloat(-PI/3, 4*PI/3);
130 var tDist = randFloat(11, 13);
131 var tX = round(fx + tDist * cos(tAngle));
132 var tZ = round(fz + tDist * sin(tAngle));
133 group = new SimpleGroup(
134 [new SimpleObject(oOak, num, num, 0,5)],
135 false, clBaseResource, tX, tZ
137 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
139 placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius);
154 "waterFunc": (ix, iz, height) => {
157 addToClass(ix, iz, clWater);
160 placeTerrain(ix, iz, tWater);
162 placeTerrain(ix, iz, tShore);
164 "landFunc": (ix, iz, shoreDist1, shoreDist2) => {
165 addToClass(ix, iz, clHighlands);
171 log("Creating fish...");
173 num = scaleByMapSize(10, 20);
174 for (var i=0; i < num; i++){
175 group = new SimpleGroup(
176 [new SimpleObject(oFish, 2,3, 0,2)],
179 createObjectGroupsDeprecated(group, 0,
180 [stayClasses(clWater, 2), avoidClasses(clFood, 3)],
187 log("Creating bumps...");
188 placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
189 painter = new SmoothElevationPainter(ELEVATION_MODIFY, 4, 3);
193 stayClasses(clHighlands, 1),
194 scaleByMapSize(300, 600)
199 log("Creating hills...");
200 placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
201 var terrainPainter = new LayeredPainter(
202 [tCliff, tHill], // terrains
205 var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 15, 2);
208 [terrainPainter, elevationPainter, paintClass(clHill)],
209 avoidClasses(clSea, 5, clPlayer, 20, clWater, 5, clHill, 15, clHighlands, 5),
210 scaleByMapSize(1, 4) * numPlayers
215 // calculate desired number of trees for map (based on size)
216 const MIN_TREES = 500;
217 const MAX_TREES = 2500;
218 const P_FOREST = 0.7;
220 var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
221 var numForest = totalTrees * P_FOREST;
222 var numStragglers = totalTrees * (1.0 - P_FOREST);
224 log("Creating mainland forests...");
226 [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]]
228 var size = numForest*1.3 / (scaleByMapSize(2,8) * numPlayers);
229 var num = floor(0.7*size / types.length);
230 for (var i = 0; i < types.length; ++i)
232 placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1);
233 painter = new LayeredPainter(
234 types[i], // terrains
239 [painter, paintClass(clForest)],
240 avoidClasses(clPlayer, 20, clWater, 3, clForest, 10, clHill, 0, clSea, 6, clBaseResource, 3),
246 log("Creating highland forests...");
248 [[tGrassDForest, tGrass, pForestP], [tGrassDForest, pForestP]]
250 var size = numForest / (scaleByMapSize(2,8) * numPlayers);
251 var num = floor(size / types.length);
252 for (var i = 0; i < types.length; ++i)
254 placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1);
255 painter = new LayeredPainter(
256 types[i], // terrains
261 [painter, paintClass(clForest)],
262 avoidClasses(clPlayer, 20, clWater, 3, clForest, 2, clHill, 0, clSea, 6, clFlatlands, 3),
268 log("Creating dirt patches...");
269 var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
270 for (var i = 0; i < sizes.length; i++)
272 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
273 painter = new LayeredPainter(
274 [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains
279 [painter, paintClass(clDirt)],
280 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 4, clSea, 0),
281 scaleByMapSize(15, 45)
286 log("Creating grass patches...");
287 var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)];
288 for (var i = 0; i < sizes.length; i++)
290 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
291 painter = new LayeredPainter([tGrassC, tGrassPatch], [2]);
295 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 4, clSea, 0),
296 scaleByMapSize(15, 45)
302 log("Creating stone mines...");
303 group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
304 createObjectGroupsDeprecated(group, 0,
305 [avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clRock, 10, clSea, 2, clHill, 2)],
306 scaleByMapSize(4,16), 100
309 log("Creating small stone quarries...");
310 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
311 createObjectGroupsDeprecated(group, 0,
312 [avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clRock, 10, clSea, 2, clHill, 2)],
313 scaleByMapSize(4,16), 100
316 log("Creating metal mines...");
317 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
318 createObjectGroupsDeprecated(group, 0,
319 [avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clSea, 0, clHill, 2)],
320 scaleByMapSize(4,16), 100
325 log("Creating small decorative rocks...");
326 group = new SimpleGroup(
327 [new SimpleObject(aRockMedium, 1,3, 0,1)],
330 createObjectGroupsDeprecated(
332 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clSea, 0),
333 scaleByMapSize(16, 262), 50
337 log("Creating large decorative rocks...");
338 group = new SimpleGroup(
339 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
342 createObjectGroupsDeprecated(
344 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clSea, 0),
345 scaleByMapSize(8, 131), 50
348 log("Creating deer...");
349 group = new SimpleGroup(
350 [new SimpleObject(oDeer, 5,7, 0,4)],
353 createObjectGroupsDeprecated(group, 0,
354 avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 0, clFood, 5, clSea, 0, clFlatlands, 0),
358 log("Creating sheep...");
359 group = new SimpleGroup(
360 [new SimpleObject(oGoat, 2,3, 0,2)],
363 createObjectGroupsDeprecated(group, 0,
364 avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 0, clFood, 20, clSea, 0),
368 log("Creating berry bush...");
369 group = new SimpleGroup(
370 [new SimpleObject(oBerryBush, 5,7, 0,4)],
373 createObjectGroupsDeprecated(group, 0,
374 avoidClasses(clWater, 6, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10),
375 randIntInclusive(1, 4) * numPlayers + 2, 50
378 log("Creating boar...");
379 group = new SimpleGroup(
380 [new SimpleObject(oBoar, 2,3, 0,2)],
383 createObjectGroupsDeprecated(group, 0,
384 avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 0, clFood, 20, clSea, 0, clFlatlands, 0),
388 log("Creating straggler trees...");
389 var types = [oPoplar, oPalm, oApple]; // some variation
390 var num = floor(numStragglers / types.length);
391 for (var i = 0; i < types.length; ++i)
393 group = new SimpleGroup(
394 [new SimpleObject(types[i], 1,1, 0,3)],
397 createObjectGroupsDeprecated(group, 0,
398 avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 10, clMetal, 6, clRock, 6, clSea, 1, clHighlands, 25),
403 log("Creating small grass tufts...");
404 group = new SimpleGroup(
405 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)]
407 createObjectGroupsDeprecated(group, 0,
408 avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0, clSea, 1),
409 scaleByMapSize(13, 200)
412 log("Creating large grass tufts...");
413 group = new SimpleGroup(
414 [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)]
416 createObjectGroupsDeprecated(group, 0,
417 avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0, clSea, 1),
418 scaleByMapSize(13, 200)
422 log("Creating bushes...");
423 group = new SimpleGroup(
424 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
426 createObjectGroupsDeprecated(group, 0,
427 avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1, clSea, 1),
428 scaleByMapSize(13, 200), 50
432 setWaterColor(0.114, 0.192, 0.463);
433 setWaterTint(0.255, 0.361, 0.651);
434 setWaterWaviness(2.0);
435 setWaterType("ocean");
436 setWaterMurkiness(0.83);