1 | RMS.LoadLibrary("rmgen");
|
---|
2 | RMS.LoadLibrary("rmgen2");
|
---|
3 |
|
---|
4 | setFogThickness(0.36);
|
---|
5 | setFogFactor(0.4);
|
---|
6 |
|
---|
7 | setPPEffect("hdr");
|
---|
8 | setPPSaturation(0.48);
|
---|
9 | setPPContrast(0.53);
|
---|
10 | setPPBloom(0.12);
|
---|
11 |
|
---|
12 | var tPrimary = ["savanna_grass_a"];
|
---|
13 | var tForestFloor = "savanna_forestfloor_a";
|
---|
14 | var tCliff = ["savanna_cliff_a", "savanna_cliff_a_red", "savanna_cliff_b", "savanna_cliff_b_red"];
|
---|
15 | var tSecondary = "savanna_grass_b";
|
---|
16 | var tGrassShrubs = ["savanna_shrubs_a"];
|
---|
17 | var tGrass = ["savanna_grass_a_wetseason", "savanna_grass_b_wetseason"];
|
---|
18 | var tDirt = "savanna_dirt_a";
|
---|
19 | var tDirt2 = "savanna_dirt_a_red";
|
---|
20 | var tDirt3 = "savanna_dirt_b";
|
---|
21 | var tDirt4 = "savanna_dirt_rocks_a";
|
---|
22 | var tCitytiles = "savanna_tile_a";
|
---|
23 | var tShore = "savanna_riparian_bank";
|
---|
24 | var tWater = "savanna_riparian_wet";
|
---|
25 |
|
---|
26 | // gaia entities
|
---|
27 | var oBaobab = "gaia/flora_tree_baobab";
|
---|
28 | var oPalm = "gaia/flora_tree_senegal_date_palm";
|
---|
29 | var oBerryBush = "gaia/flora_bush_berry";
|
---|
30 | var oWildebeest = "gaia/fauna_wildebeest";
|
---|
31 | var oZebra = "gaia/fauna_zebra";
|
---|
32 | var oRhino = "gaia/fauna_rhino";
|
---|
33 | var oLion = "gaia/fauna_lion";
|
---|
34 | var oLioness = "gaia/fauna_lioness";
|
---|
35 | var oHawk = "gaia/fauna_hawk";
|
---|
36 | var oGiraffe = "gaia/fauna_giraffe";
|
---|
37 | var oGiraffe2 = "gaia/fauna_giraffe_infant";
|
---|
38 | var oGazelle = "gaia/fauna_gazelle";
|
---|
39 | var oElephant = "gaia/fauna_elephant_african_bush";
|
---|
40 | var oElephant2 = "gaia/fauna_elephant_african_infant";
|
---|
41 | var oCrocodile = "gaia/fauna_crocodile";
|
---|
42 | var oFish = "gaia/fauna_fish";
|
---|
43 | var oStoneSmall = "gaia/geology_stone_savanna_small";
|
---|
44 | var oMetalLarge = "gaia/geology_metal_savanna_slabs";
|
---|
45 |
|
---|
46 | // decorative props
|
---|
47 | var aBush = "actor|props/flora/bush_medit_sm_dry.xml";
|
---|
48 | var aRock = "actor|geology/stone_savanna_med.xml";
|
---|
49 |
|
---|
50 | //other constants
|
---|
51 | const pForest = [tForestFloor + TERRAIN_SEPARATOR + oPalm, tForestFloor];
|
---|
52 | const PI12 = PI / 6;
|
---|
53 |
|
---|
54 | function placeStoneMineFormation(x, z)
|
---|
55 | {
|
---|
56 | var placer = new ChainPlacer(1, 2, 2, 1, x, z, undefined, [5]);
|
---|
57 | var painter = new TerrainPainter(tDirt4);
|
---|
58 | createArea(placer, painter, null);
|
---|
59 |
|
---|
60 | var bbAngle = randFloat(0, TWO_PI);
|
---|
61 | const bbDist = 2.5;
|
---|
62 |
|
---|
63 | for (var i = 0; i < 8; ++i)
|
---|
64 | {
|
---|
65 | var bbX = round(x + (bbDist + randFloat(0,1)) * cos(bbAngle));
|
---|
66 | var bbZ = round(z + (bbDist + randFloat(0,1)) * sin(bbAngle));
|
---|
67 | placeObject(bbX, bbZ, oStoneSmall, 0, randFloat(0, TWO_PI));
|
---|
68 | bbAngle += PI12;
|
---|
69 | }
|
---|
70 | }
|
---|
71 |
|
---|
72 | log("Initializing map...");
|
---|
73 | InitMap();
|
---|
74 |
|
---|
75 | const numPlayers = getNumPlayers();
|
---|
76 | const mapSize = getMapSize();
|
---|
77 | RMS.SetProgress(20);
|
---|
78 |
|
---|
79 | var clPlayer = createTileClass();
|
---|
80 | var clHill = createTileClass();
|
---|
81 | var clForest = createTileClass();
|
---|
82 | var clWater = createTileClass();
|
---|
83 | var clDirt = createTileClass();
|
---|
84 | var clRock = createTileClass();
|
---|
85 | var clMetal = createTileClass();
|
---|
86 | var clFood = createTileClass();
|
---|
87 | var clBaseResource = createTileClass();
|
---|
88 |
|
---|
89 | // Cover the ground with the primary terrain chosen in the beginning
|
---|
90 | for (var ix = 0; ix < mapSize; ix++)
|
---|
91 | for (var iz = 0; iz < mapSize; iz++)
|
---|
92 | {
|
---|
93 | var x = ix / (mapSize + 1.0);
|
---|
94 | var z = iz / (mapSize + 1.0);
|
---|
95 | placeTerrain(ix, iz, tPrimary);
|
---|
96 | }
|
---|
97 |
|
---|
98 | // Randomize player order
|
---|
99 | var playerIDs = [];
|
---|
100 | for (var i = 0; i < numPlayers; i++)
|
---|
101 | playerIDs.push(i+1);
|
---|
102 | playerIDs = sortPlayers(playerIDs);
|
---|
103 |
|
---|
104 | // Place players
|
---|
105 | var playerX = [];
|
---|
106 | var playerZ = [];
|
---|
107 | var playerAngle = [];
|
---|
108 |
|
---|
109 | var startAngle = randFloat(0, TWO_PI);
|
---|
110 | for (var i = 0; i < numPlayers; i++)
|
---|
111 | {
|
---|
112 | playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
|
---|
113 | playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
|
---|
114 | playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
|
---|
115 | }
|
---|
116 |
|
---|
117 | for (var i = 0; i < numPlayers; i++)
|
---|
118 | {
|
---|
119 | var id = playerIDs[i];
|
---|
120 | log("Creating base for player " + id + "...");
|
---|
121 |
|
---|
122 | // some constants
|
---|
123 | var radius = scaleByMapSize(15,25);
|
---|
124 |
|
---|
125 | // get the x and z in tiles
|
---|
126 | var fx = fractionToTiles(playerX[i]);
|
---|
127 | var fz = fractionToTiles(playerZ[i]);
|
---|
128 | var ix = round(fx);
|
---|
129 | var iz = round(fz);
|
---|
130 | addToClass(ix, iz, clPlayer);
|
---|
131 | addToClass(ix+5, iz, clPlayer);
|
---|
132 | addToClass(ix, iz+5, clPlayer);
|
---|
133 | addToClass(ix-5, iz, clPlayer);
|
---|
134 | addToClass(ix, iz-5, clPlayer);
|
---|
135 |
|
---|
136 | // create the city patch
|
---|
137 | var cityRadius = radius/3;
|
---|
138 | var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
|
---|
139 | var painter = new LayeredPainter([tPrimary,tCitytiles], [1]);
|
---|
140 | createArea(placer, painter, null);
|
---|
141 |
|
---|
142 | placeCivDefaultEntities(fx, fz, id);
|
---|
143 | placeDefaultChicken(fx, fz, clBaseResource);
|
---|
144 |
|
---|
145 | // create berry bushes
|
---|
146 | var bbAngle = randFloat(0, TWO_PI);
|
---|
147 | var bbDist = 12;
|
---|
148 | var bbX = round(fx + bbDist * cos(bbAngle));
|
---|
149 | var bbZ = round(fz + bbDist * sin(bbAngle));
|
---|
150 | var group = new SimpleGroup(
|
---|
151 | [new SimpleObject(oBerryBush, 5,5, 0,3)],
|
---|
152 | true, clBaseResource, bbX, bbZ
|
---|
153 | );
|
---|
154 | createObjectGroup(group, 0);
|
---|
155 |
|
---|
156 | // create metal mine
|
---|
157 | var mAngle = bbAngle;
|
---|
158 | while(abs(mAngle - bbAngle) < PI/3)
|
---|
159 | mAngle = randFloat(0, TWO_PI);
|
---|
160 |
|
---|
161 | var mDist = 12;
|
---|
162 | var mX = round(fx + mDist * cos(mAngle));
|
---|
163 | var mZ = round(fz + mDist * sin(mAngle));
|
---|
164 | group = new SimpleGroup(
|
---|
165 | [new SimpleObject(oMetalLarge, 1,1, 0,0)],
|
---|
166 | true, clBaseResource, mX, mZ
|
---|
167 | );
|
---|
168 | createObjectGroup(group, 0);
|
---|
169 |
|
---|
170 | // create stone mines
|
---|
171 | mAngle += randFloat(PI/8, PI/4);
|
---|
172 | mX = round(fx + mDist * cos(mAngle));
|
---|
173 | mZ = round(fz + mDist * sin(mAngle));
|
---|
174 | placeStoneMineFormation(mX, mZ);
|
---|
175 | addToClass(mX, mZ, clPlayer);
|
---|
176 |
|
---|
177 | // 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(oBaobab, 2,7)],
|
---|
184 | false, clBaseResource, tX, tZ
|
---|
185 | );
|
---|
186 | createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
|
---|
187 | }
|
---|
188 | RMS.SetProgress(20);
|
---|
189 |
|
---|
190 | createHills([tDirt2, tCliff, tGrassShrubs], avoidClasses(clPlayer, 35, clForest, 20, clHill, 20, clWater, 2), clHill, scaleByMapSize(5, 8));
|
---|
191 | RMS.SetProgress(30);
|
---|
192 |
|
---|
193 | var lakeAreas = [];
|
---|
194 | var playerConstraint = new AvoidTileClassConstraint(clPlayer, 20);
|
---|
195 | var waterConstraint = new AvoidTileClassConstraint(clWater, 8);
|
---|
196 |
|
---|
197 | for (var x = 0; x < mapSize; ++x)
|
---|
198 | for (var z = 0; z < mapSize; ++z)
|
---|
199 | if (playerConstraint.allows(x, z) && waterConstraint.allows(x, z))
|
---|
200 | lakeAreas.push([x, z]);
|
---|
201 |
|
---|
202 | log("Creating water holes...");
|
---|
203 | placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), floor(scaleByMapSize(60, 100)), 5);
|
---|
204 | var terrainPainter = new LayeredPainter(
|
---|
205 | [tShore, tWater], // terrains
|
---|
206 | [1] // widths
|
---|
207 | );
|
---|
208 | var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 7);
|
---|
209 | createAreas(
|
---|
210 | placer,
|
---|
211 | [terrainPainter, elevationPainter, paintClass(clWater)],
|
---|
212 | avoidClasses(clPlayer, 22, clWater, 8),
|
---|
213 | scaleByMapSize(2, 5)
|
---|
214 | );
|
---|
215 | RMS.SetProgress(45);
|
---|
216 |
|
---|
217 | paintTerrainBasedOnHeight(3, floor(scaleByMapSize(20, 40)), 0, tCliff);
|
---|
218 | paintTerrainBasedOnHeight(floor(scaleByMapSize(20, 40)), 100, 3, tGrass);
|
---|
219 |
|
---|
220 | createBumps(avoidClasses(clWater, 2, clPlayer, 20));
|
---|
221 |
|
---|
222 | createForests(
|
---|
223 | [tPrimary, tForestFloor, tForestFloor, pForest, pForest],
|
---|
224 | avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
|
---|
225 | clForest,
|
---|
226 | 1.0
|
---|
227 | );
|
---|
228 |
|
---|
229 | log("Creating dirt patches...");
|
---|
230 | createLayeredPatches(
|
---|
231 | [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
|
---|
232 | [[tDirt,tDirt3], [tDirt2,tDirt4]],
|
---|
233 | [2],
|
---|
234 | avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
|
---|
235 | );
|
---|
236 |
|
---|
237 | log("Creating shrubs...");
|
---|
238 | createPatches(
|
---|
239 | [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
|
---|
240 | tGrassShrubs,
|
---|
241 | avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
|
---|
242 | );
|
---|
243 |
|
---|
244 | log("Creating grass patches...");
|
---|
245 | createPatches(
|
---|
246 | [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
|
---|
247 | tSecondary,
|
---|
248 | avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12)
|
---|
249 | );
|
---|
250 | RMS.SetProgress(60);
|
---|
251 |
|
---|
252 | log("Creating stone mines...");
|
---|
253 | createMines(
|
---|
254 | [
|
---|
255 | [new SimpleObject(oStoneSmall, 0,2, 0,4)],
|
---|
256 | [new SimpleObject(oStoneSmall, 2,5, 1,3)]
|
---|
257 | ],
|
---|
258 | avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clRock, 10, clHill, 1)
|
---|
259 | );
|
---|
260 |
|
---|
261 | log("Creating metal mines...");
|
---|
262 | createMines(
|
---|
263 | [
|
---|
264 | [new SimpleObject(oMetalLarge, 1,1, 0,4)]
|
---|
265 | ],
|
---|
266 | avoidClasses(clWater, 3, clForest, 1, clPlayer, 20, clMetal, 18, clRock, 5, clHill, 1),
|
---|
267 | clMetal
|
---|
268 | );
|
---|
269 | RMS.SetProgress(70);
|
---|
270 |
|
---|
271 | createDecoration(
|
---|
272 | [
|
---|
273 | [new SimpleObject(aBush, 1,3, 0,1)],
|
---|
274 | [new SimpleObject(aRock, 1,2, 0,1)]
|
---|
275 | ],
|
---|
276 | [
|
---|
277 | scaleByMapSize(8, 131),
|
---|
278 | scaleByMapSize(8, 131),
|
---|
279 | ],
|
---|
280 | avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
|
---|
281 | );
|
---|
282 | RMS.SetProgress(75);
|
---|
283 |
|
---|
284 | log("Creating giraffes...");
|
---|
285 | group = new SimpleGroup(
|
---|
286 | [new SimpleObject(oGiraffe, 2,4, 0,4), new SimpleObject(oGiraffe2, 0,2, 0,4)],
|
---|
287 | true, clFood
|
---|
288 | );
|
---|
289 | createObjectGroups(group, 0,
|
---|
290 | avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
|
---|
291 | scaleByMapSize(4,12), 50
|
---|
292 | );
|
---|
293 |
|
---|
294 | log("Creating elephants...");
|
---|
295 | group = new SimpleGroup(
|
---|
296 | [new SimpleObject(oElephant, 2,4, 0,4), new SimpleObject(oElephant2, 0,2, 0,4)],
|
---|
297 | true, clFood
|
---|
298 | );
|
---|
299 | createObjectGroups(group, 0,
|
---|
300 | avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
|
---|
301 | scaleByMapSize(4,12), 50
|
---|
302 | );
|
---|
303 |
|
---|
304 | log("Creating lions...");
|
---|
305 | group = new SimpleGroup(
|
---|
306 | [new SimpleObject(oLion, 0,1, 0,4), new SimpleObject(oLioness, 2,3, 0,4)],
|
---|
307 | true, clFood
|
---|
308 | );
|
---|
309 | createObjectGroups(group, 0,
|
---|
310 | avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
|
---|
311 | scaleByMapSize(4,12), 50
|
---|
312 | );
|
---|
313 |
|
---|
314 | createFood(
|
---|
315 | [
|
---|
316 | [new SimpleObject(oHawk, 1,1, 0,3)],
|
---|
317 | [new SimpleObject(oGazelle, 3,5, 0,3)],
|
---|
318 | [new SimpleObject(oZebra, 3,5, 0,3)],
|
---|
319 | [new SimpleObject(oWildebeest, 4,6, 0,3)],
|
---|
320 | [new SimpleObject(oRhino, 1,1, 0,3)]
|
---|
321 | ],
|
---|
322 | [
|
---|
323 | 3 * numPlayers,
|
---|
324 | 3 * numPlayers,
|
---|
325 | 3 * numPlayers,
|
---|
326 | 3 * numPlayers,
|
---|
327 | 3 * numPlayers,
|
---|
328 | ],
|
---|
329 | avoidClasses(clFood, 20, clWater, 5, clHill, 2, clPlayer, 16)
|
---|
330 | );
|
---|
331 |
|
---|
332 | createFood(
|
---|
333 | [
|
---|
334 | [new SimpleObject(oCrocodile, 2,3, 0,3)]
|
---|
335 | ],
|
---|
336 | [
|
---|
337 | 3 * numPlayers,
|
---|
338 | ],
|
---|
339 | stayClasses(clWater, 6)
|
---|
340 | );
|
---|
341 |
|
---|
342 | createFood(
|
---|
343 | [
|
---|
344 | [new SimpleObject(oBerryBush, 5,7, 0,4)]
|
---|
345 | ],
|
---|
346 | [
|
---|
347 | randInt(1, 4) * numPlayers + 2
|
---|
348 | ],
|
---|
349 | avoidClasses(clWater, 3, clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
|
---|
350 | );
|
---|
351 |
|
---|
352 | createFood(
|
---|
353 | [
|
---|
354 | [new SimpleObject(oFish, 2,3, 0,2)]
|
---|
355 | ],
|
---|
356 | [
|
---|
357 | 15 * numPlayers
|
---|
358 | ],
|
---|
359 | [avoidClasses(clFood, 20), stayClasses(clWater, 6)]
|
---|
360 | );
|
---|
361 | RMS.SetProgress(85);
|
---|
362 |
|
---|
363 | createStragglerTrees(
|
---|
364 | [oBaobab],
|
---|
365 | avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1)
|
---|
366 | );
|
---|
367 |
|
---|
368 | setSkySet("sunny");
|
---|
369 | setSunRotation(randFloat(0, TWO_PI));
|
---|
370 | setSunElevation(randFloat(PI/ 4, PI / 2));
|
---|
371 | setWaterColor(0.223, 0.247, 0.2); // dark majestic blue
|
---|
372 | setWaterTint(0.462, 0.756, 0.566); // light blue
|
---|
373 | setWaterMurkiness(5.92);
|
---|
374 | setWaterWaviness(0);
|
---|
375 | setWaterType("clap");
|
---|
376 |
|
---|
377 | ExportMap();
|
---|