Ticket #4354: african_plains.js

File african_plains.js, 9.9 KB (added by elexis, 7 years ago)
Line 
1RMS.LoadLibrary("rmgen");
2RMS.LoadLibrary("rmgen2");
3
4setFogThickness(0.36);
5setFogFactor(0.4);
6
7setPPEffect("hdr");
8setPPSaturation(0.48);
9setPPContrast(0.53);
10setPPBloom(0.12);
11
12var tPrimary = ["savanna_grass_a"];
13var tForestFloor = "savanna_forestfloor_a";
14var tCliff = ["savanna_cliff_a", "savanna_cliff_a_red", "savanna_cliff_b", "savanna_cliff_b_red"];
15var tSecondary = "savanna_grass_b";
16var tGrassShrubs = ["savanna_shrubs_a"];
17var tGrass = ["savanna_grass_a_wetseason", "savanna_grass_b_wetseason"];
18var tDirt = "savanna_dirt_a";
19var tDirt2 = "savanna_dirt_a_red";
20var tDirt3 = "savanna_dirt_b";
21var tDirt4 = "savanna_dirt_rocks_a";
22var tCitytiles = "savanna_tile_a";
23var tShore = "savanna_riparian_bank";
24var tWater = "savanna_riparian_wet";
25
26// gaia entities
27var oBaobab = "gaia/flora_tree_baobab";
28var oPalm = "gaia/flora_tree_senegal_date_palm";
29var oBerryBush = "gaia/flora_bush_berry";
30var oWildebeest = "gaia/fauna_wildebeest";
31var oZebra = "gaia/fauna_zebra";
32var oRhino = "gaia/fauna_rhino";
33var oLion = "gaia/fauna_lion";
34var oLioness = "gaia/fauna_lioness";
35var oHawk = "gaia/fauna_hawk";
36var oGiraffe = "gaia/fauna_giraffe";
37var oGiraffe2 = "gaia/fauna_giraffe_infant";
38var oGazelle = "gaia/fauna_gazelle";
39var oElephant = "gaia/fauna_elephant_african_bush";
40var oElephant2 = "gaia/fauna_elephant_african_infant";
41var oCrocodile = "gaia/fauna_crocodile";
42var oFish = "gaia/fauna_fish";
43var oStoneSmall = "gaia/geology_stone_savanna_small";
44var oMetalLarge = "gaia/geology_metal_savanna_slabs";
45
46// decorative props
47var aBush = "actor|props/flora/bush_medit_sm_dry.xml";
48var aRock = "actor|geology/stone_savanna_med.xml";
49
50//other constants
51const pForest = [tForestFloor + TERRAIN_SEPARATOR + oPalm, tForestFloor];
52const PI12 = PI / 6;
53
54function 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
72log("Initializing map...");
73InitMap();
74
75const numPlayers = getNumPlayers();
76const mapSize = getMapSize();
77RMS.SetProgress(20);
78
79var clPlayer = createTileClass();
80var clHill = createTileClass();
81var clForest = createTileClass();
82var clWater = createTileClass();
83var clDirt = createTileClass();
84var clRock = createTileClass();
85var clMetal = createTileClass();
86var clFood = createTileClass();
87var clBaseResource = createTileClass();
88
89// Cover the ground with the primary terrain chosen in the beginning
90for (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
99var playerIDs = [];
100for (var i = 0; i < numPlayers; i++)
101 playerIDs.push(i+1);
102playerIDs = sortPlayers(playerIDs);
103
104// Place players
105var playerX = [];
106var playerZ = [];
107var playerAngle = [];
108
109var startAngle = randFloat(0, TWO_PI);
110for (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
117for (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}
188RMS.SetProgress(20);
189
190createHills([tDirt2, tCliff, tGrassShrubs], avoidClasses(clPlayer, 35, clForest, 20, clHill, 20, clWater, 2), clHill, scaleByMapSize(5, 8));
191RMS.SetProgress(30);
192
193var lakeAreas = [];
194var playerConstraint = new AvoidTileClassConstraint(clPlayer, 20);
195var waterConstraint = new AvoidTileClassConstraint(clWater, 8);
196
197for (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
202log("Creating water holes...");
203placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), floor(scaleByMapSize(60, 100)), 5);
204var terrainPainter = new LayeredPainter(
205 [tShore, tWater], // terrains
206 [1] // widths
207);
208var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 7);
209createAreas(
210 placer,
211 [terrainPainter, elevationPainter, paintClass(clWater)],
212 avoidClasses(clPlayer, 22, clWater, 8),
213 scaleByMapSize(2, 5)
214);
215RMS.SetProgress(45);
216
217paintTerrainBasedOnHeight(3, floor(scaleByMapSize(20, 40)), 0, tCliff);
218paintTerrainBasedOnHeight(floor(scaleByMapSize(20, 40)), 100, 3, tGrass);
219
220createBumps(avoidClasses(clWater, 2, clPlayer, 20));
221
222createForests(
223 [tPrimary, tForestFloor, tForestFloor, pForest, pForest],
224 avoidClasses(clPlayer, 20, clForest, 17, clHill, 0, clWater, 2),
225 clForest,
226 1.0
227);
228
229log("Creating dirt patches...");
230createLayeredPatches(
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
237log("Creating shrubs...");
238createPatches(
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
244log("Creating grass patches...");
245createPatches(
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);
250RMS.SetProgress(60);
251
252log("Creating stone mines...");
253createMines(
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
261log("Creating metal mines...");
262createMines(
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);
269RMS.SetProgress(70);
270
271createDecoration(
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);
282RMS.SetProgress(75);
283
284log("Creating giraffes...");
285group = new SimpleGroup(
286 [new SimpleObject(oGiraffe, 2,4, 0,4), new SimpleObject(oGiraffe2, 0,2, 0,4)],
287 true, clFood
288);
289createObjectGroups(group, 0,
290 avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
291 scaleByMapSize(4,12), 50
292);
293
294log("Creating elephants...");
295group = new SimpleGroup(
296 [new SimpleObject(oElephant, 2,4, 0,4), new SimpleObject(oElephant2, 0,2, 0,4)],
297 true, clFood
298);
299createObjectGroups(group, 0,
300 avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
301 scaleByMapSize(4,12), 50
302);
303
304log("Creating lions...");
305group = new SimpleGroup(
306 [new SimpleObject(oLion, 0,1, 0,4), new SimpleObject(oLioness, 2,3, 0,4)],
307 true, clFood
308);
309createObjectGroups(group, 0,
310 avoidClasses(clWater, 1, clPlayer, 20, clFood, 11),
311 scaleByMapSize(4,12), 50
312);
313
314createFood(
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
332createFood(
333 [
334 [new SimpleObject(oCrocodile, 2,3, 0,3)]
335 ],
336 [
337 3 * numPlayers,
338 ],
339 stayClasses(clWater, 6)
340);
341
342createFood(
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
352createFood(
353 [
354 [new SimpleObject(oFish, 2,3, 0,2)]
355 ],
356 [
357 15 * numPlayers
358 ],
359 [avoidClasses(clFood, 20), stayClasses(clWater, 6)]
360);
361RMS.SetProgress(85);
362
363createStragglerTrees(
364 [oBaobab],
365 avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1)
366);
367
368setSkySet("sunny");
369setSunRotation(randFloat(0, TWO_PI));
370setSunElevation(randFloat(PI/ 4, PI / 2));
371setWaterColor(0.223, 0.247, 0.2); // dark majestic blue
372setWaterTint(0.462, 0.756, 0.566); // light blue
373setWaterMurkiness(5.92);
374setWaterWaviness(0);
375setWaterType("clap");
376
377ExportMap();