1 RMS.LoadLibrary("rmgen");
4 const tGrass = ["temp_grass", "temp_grass", "temp_grass_d"];
5 const tGrassPForest = "temp_plants_bog";
6 const tGrassDForest = "temp_plants_bog";
7 const tGrassA = "temp_grass_plants";
8 const tGrassB = "temp_plants_bog";
9 const tGrassC = "temp_mud_a";
10 const tDirt = ["temp_plants_bog", "temp_mud_a"];
11 const tHill = ["temp_highlands", "temp_grass_long_b"];
12 const tCliff = ["temp_cliff_a", "temp_cliff_b"];
13 const tRoad = "temp_road";
14 const tRoadWild = "temp_road_overgrown";
15 const tGrassPatchBlend = "temp_grass_long_b";
16 const tGrassPatch = ["temp_grass_d", "temp_grass_clovers"];
17 const tShoreBlend = "temp_grass_plants";
18 const tShore = "temp_plants_bog";
19 const tWater = "temp_mud_a";
22 const oOak = "gaia/flora_tree_oak";
23 const oOakLarge = "gaia/flora_tree_oak_large";
24 const oApple = "gaia/flora_tree_apple";
25 const oPine = "gaia/flora_tree_pine";
26 const oAleppoPine = "gaia/flora_tree_aleppo_pine";
27 const oBerryBush = "gaia/flora_bush_berry";
28 const oDeer = "gaia/fauna_deer";
29 const oFish = "gaia/fauna_fish";
30 const oSheep = "gaia/fauna_sheep";
31 const oStoneLarge = "gaia/geology_stonemine_temperate_quarry";
32 const oStoneSmall = "gaia/geology_stone_temperate";
33 const oMetalLarge = "gaia/geology_metal_temperate_slabs";
36 const aGrass = "actor|props/flora/grass_soft_large_tall.xml";
37 const aGrassShort = "actor|props/flora/grass_soft_large.xml";
38 const aReeds = "actor|props/flora/reeds_pond_lush_a.xml";
39 const aLillies = "actor|props/flora/pond_lillies_large.xml";
40 const aRockLarge = "actor|geology/stone_granite_large.xml";
41 const aRockMedium = "actor|geology/stone_granite_med.xml";
42 const aBushMedium = "actor|props/flora/bush_medit_me.xml";
43 const aBushSmall = "actor|props/flora/bush_medit_sm.xml";
45 // terrain + entity (for painting)
46 const pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oOak, tGrassDForest + TERRAIN_SEPARATOR + oOakLarge, tGrassDForest];
47 const pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest];
49 log("Initializing map...");
52 var numPlayers = getNumPlayers();
53 var mapSize = getMapSize();
54 var mapArea = mapSize*mapSize;
56 var clPlayer = createTileClass();
57 var clHill = createTileClass();
58 var clForest = createTileClass();
59 var clWater = createTileClass();
60 var clDirt = createTileClass();
61 var clRock = createTileClass();
62 var clMetal = createTileClass();
63 var clFood = createTileClass();
64 var clBaseResource = createTileClass();
65 var clSettlement = createTileClass();
67 // randomize player order
69 for (var i = 0; i < numPlayers; i++)
71 playerIDs = sortPlayers(playerIDs);
74 var playerX = new Array(numPlayers);
75 var playerZ = new Array(numPlayers);
76 var playerAngle = new Array(numPlayers);
78 var startAngle = randFloat(0, TWO_PI);
79 for (var i = 0; i < numPlayers; i++)
81 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
82 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
83 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
86 for (var i = 0; i < numPlayers; i++)
88 var id = playerIDs[i];
89 log("Creating base for player " + id + "...");
92 var radius = scaleByMapSize(15,25);
96 // get the x and z in tiles
97 var fx = fractionToTiles(playerX[i]);
98 var fz = fractionToTiles(playerZ[i]);
102 // calculate size based on the radius
103 var hillSize = PI * radius * radius;
106 var placer = new ClumpPlacer(hillSize, 0.95, 0.6, 10, ix, iz);
107 var terrainPainter = new LayeredPainter(
108 [tCliff, tHill], // terrains
109 [cliffRadius] // widths
111 var elevationPainter = new SmoothElevationPainter(
112 ELEVATION_SET, // type
113 elevation, // elevation
114 cliffRadius // blend radius
116 createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null);
119 var rampAngle = playerAngle[i] + PI + randFloat(-PI/8, PI/8);
120 var rampDist = radius;
123 var rampX1 = round(fx + (rampDist + rampLength) * cos(rampAngle));
124 var rampZ1 = round(fz + (rampDist + rampLength) * sin(rampAngle));
125 var rampX2 = round(fx + (rampDist - 3) * cos(rampAngle));
126 var rampZ2 = round(fz + (rampDist - 3) * sin(rampAngle));
128 createRamp (rampX1, rampZ1, rampX2, rampZ2, 3, 20, rampWidth, 2, tHill, tCliff, clPlayer);
130 // create the city patch
131 var cityRadius = radius/3;
132 placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
133 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
134 createArea(placer, painter, null);
136 // create starting units
137 placeCivDefaultEntities(fx, fz, id, { 'iberWall': false });
139 placeDefaultChicken(fx, fz, clBaseResource);
141 // create berry bushes
142 var bbAngle = randFloat(0, TWO_PI);
144 var bbX = round(fx + bbDist * cos(bbAngle));
145 var bbZ = round(fz + bbDist * sin(bbAngle));
146 var group = new SimpleGroup(
147 [new SimpleObject(oBerryBush, 5,5, 0,3)],
148 true, clBaseResource, bbX, bbZ
150 createObjectGroup(group, 0);
153 var mAngle = bbAngle;
154 while(abs(mAngle - bbAngle) < PI/3)
155 mAngle = randFloat(0, TWO_PI);
158 var mX = round(fx + mDist * cos(mAngle));
159 var mZ = round(fz + mDist * sin(mAngle));
160 group = new SimpleGroup(
161 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
162 true, clBaseResource, mX, mZ
164 createObjectGroup(group, 0);
166 // create stone mines
167 mAngle += randFloat(PI/8, PI/4);
168 mX = round(fx + mDist * cos(mAngle));
169 mZ = round(fz + mDist * sin(mAngle));
170 group = new SimpleGroup(
171 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
172 true, clBaseResource, mX, mZ
174 createObjectGroup(group, 0);
176 // create starting trees
178 var tAngle = randFloat(-PI/3, 4*PI/3);
179 var tDist = randFloat(11, 13);
180 var tX = round(fx + tDist * cos(tAngle));
181 var tZ = round(fz + tDist * sin(tAngle));
182 group = new SimpleGroup(
183 [new SimpleObject(oOak, num, num, 0,5)],
184 false, clBaseResource, tX, tZ
186 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
188 // create grass tufts
189 var num = hillSize / 250;
190 for (var j = 0; j < num; j++)
192 var gAngle = randFloat(0, TWO_PI);
193 var gDist = radius - (5 + randInt(7));
194 var gX = round(fx + gDist * cos(gAngle));
195 var gZ = round(fz + gDist * sin(gAngle));
196 group = new SimpleGroup(
197 [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
198 false, clBaseResource, gX, gZ
200 createObjectGroup(group, 0);
205 log("Creating lakes...");
206 var numLakes = round(scaleByMapSize(1,4) * numPlayers);
207 placer = new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, 10);
208 terrainPainter = new LayeredPainter(
209 [tShoreBlend, tShore, tWater], // terrains
212 elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -7, 6);
213 var waterAreas = createAreas(
215 [terrainPainter, elevationPainter, paintClass(clWater)],
216 avoidClasses(clPlayer, 2, clWater, 20),
221 log("Creating reeds...");
222 group = new SimpleGroup(
223 [new SimpleObject(aReeds, 5,10, 0,4), new SimpleObject(aLillies, 0,1, 0,4)], true
225 createObjectGroupsByAreas(group, 0,
226 [borderClasses(clWater, 3, 0), stayClasses(clWater, 1)],
232 log("Creating fish...");
233 createObjectGroupsByAreas(
235 [new SimpleObject(oFish, 1,1, 0,1)],
239 [stayClasses(clWater, 4), avoidClasses(clFood, 8)],
246 createBumps(avoidClasses(clWater, 2, clPlayer, 0));
249 log("Creating hills...");
250 createHills([tCliff, tCliff, tHill], avoidClasses(clPlayer, 2, clWater, 5, clHill, 15), clHill, scaleByMapSize(1, 4) * numPlayers);
254 [tGrass, tGrassDForest, tGrassPForest, pForestP, pForestD],
255 avoidClasses(clPlayer, 1, clWater, 3, clForest, 17, clHill, 1),
260 log("Creating dirt patches...");
261 createLayeredPatches(
262 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
263 [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]],
265 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0)
269 log("Creating grass patches...");
270 createLayeredPatches(
271 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
272 [tGrassPatchBlend, tGrassPatch],
274 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0)
278 log("Creating stone mines...");
281 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
282 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
284 avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clHill, 1)
288 log("Creating metal mines...");
291 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
293 avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clMetal, 10, clRock, 5, clHill, 1),
300 [[new SimpleObject(aRockMedium, 1,3, 0,1)],
301 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
302 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
303 [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)],
304 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
307 scaleByMapSize(16, 262),
308 scaleByMapSize(8, 131),
309 scaleByMapSize(13, 200),
310 scaleByMapSize(13, 200),
311 scaleByMapSize(13, 200)
313 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
320 [new SimpleObject(oSheep, 2,3, 0,2)],
321 [new SimpleObject(oDeer, 5,7, 0,4)]
327 avoidClasses(clWater, 0, clForest, 0, clPlayer, 1, clHill, 1, clFood, 20)
334 [new SimpleObject(oBerryBush, 5,7, 0,4)]
337 randInt(1, 4) * numPlayers + 2
339 avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
343 log("Creating metal mines...");
344 var types = [oOak, oOakLarge, oPine, oApple]; // some variation
345 createStragglerTrees(types, avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 1, clRock, 1));
349 setWaterColor(0.447, 0.412, 0.322); // muddy brown
350 setWaterTint(0.447, 0.412, 0.322); // muddy brown
351 setWaterMurkiness(1.0);
352 setWaterWaviness(3.0);
353 setWaterType("lake");
355 setFogThickness(0.25);
359 setPPSaturation(0.62);