Ticket #4354: extinct_volcano.js

File extinct_volcano.js, 13.9 KB (added by FeXoR, 7 years ago)

Fixed version of extinct_volcano.js

Line 
1RMS.LoadLibrary("rmgen");
2
3const tGrass = ["cliff volcanic light", "ocean_rock_a", "ocean_rock_b"];
4const tGrass1 = "cliff volcanic light";
5const tGrass2 = "ocean_rock_a";
6const tGrass3 = "temp_grass_plants";
7const tCliff = ["cliff volcanic coarse", "cave_walls"];
8const tRoad = "road1";
9const tRoadWild = "road1";
10const tLava = "LavaHard";
11const tForestFloor1 = "temp_forestfloor_a";
12const tForestFloor2 = "temp_grass";
13const tGrassPatchBlend = "temp_grass_long_b";
14const tGrassPatch = ["temp_grass_d", "temp_grass_clovers"];
15
16// gaia entities
17const oChicken = "gaia/fauna_chicken";
18const oTree = "gaia/flora_tree_dead";
19const oTree2 = "gaia/flora_tree_euro_beech";
20const oTree3 = "gaia/flora_tree_oak";
21const oTree4 = "gaia/flora_tree_oak_dead";
22const oBush = "gaia/flora_bush_temperate";
23const oFruitBush = "gaia/flora_bush_berry";
24const oRabbit = "gaia/fauna_rabbit";
25const oDeer = "gaia/fauna_deer";
26const oBear = "gaia/fauna_bear";
27const oStoneLarge = "gaia/geology_stonemine_temperate_quarry";
28const oStoneSmall = "gaia/geology_stone_temperate";
29const oMetalLarge = "gaia/geology_metal_temperate_slabs";
30
31// decorative props
32const aRockLarge = "actor|geology/stone_granite_med.xml";
33const aRockMedium = "actor|geology/stone_granite_med.xml";
34const aBushMedium = "actor|props/flora/bush_tempe_me.xml";
35const aBushSmall = "actor|props/flora/bush_tempe_sm.xml";
36const aGrass = "actor|props/flora/grass_soft_large_tall.xml";
37const aGrassShort = "actor|props/flora/grass_soft_large.xml";
38
39const pForestD = [tForestFloor1 + TERRAIN_SEPARATOR + oTree, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor1];
40const pForestP = [tForestFloor1 + TERRAIN_SEPARATOR + oTree3, tForestFloor2 + TERRAIN_SEPARATOR + oTree4, tForestFloor1];
41const pForestM = [tForestFloor1 + TERRAIN_SEPARATOR + oTree, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2 + TERRAIN_SEPARATOR + oTree3, tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1];
42
43log("Initializing map...");
44InitMap();
45
46var numPlayers = getNumPlayers();
47var mapSize = getMapSize();
48var mapArea = mapSize*mapSize;
49
50// create tile classes
51var clPlayer = createTileClass();
52var clHill = createTileClass();
53var clFood = createTileClass();
54var clHill2 = createTileClass();
55var clHill3 = createTileClass();
56var clHill4 = createTileClass();
57var clForest = createTileClass();
58var clWater = createTileClass();
59var clDirt = createTileClass();
60var clRock = createTileClass();
61var clMetal = createTileClass();
62var clBaseResource = createTileClass();
63
64// randomize player order
65var playerIDs = [];
66for (var i = 0; i < numPlayers; i++)
67 playerIDs.push(i+1);
68playerIDs = sortPlayers(playerIDs);
69
70// place players
71var playerX = new Array(numPlayers);
72var playerZ = new Array(numPlayers);
73var playerAngle = new Array(numPlayers);
74
75var startAngle = randFloat(0, TWO_PI);
76for (var i = 0; i < numPlayers; i++)
77{
78 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
79 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
80 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
81}
82
83for (var i = 0; i < numPlayers; i++)
84{
85 var id = playerIDs[i];
86 log("Creating base for player " + id + "...");
87
88 var radius = scaleByMapSize(15,25);
89
90 // get the x and z in tiles
91 var fx = fractionToTiles(playerX[i]);
92 var fz = fractionToTiles(playerZ[i]);
93 var ix = round(fx);
94 var iz = round(fz);
95 addToClass(ix, iz, clPlayer);
96 addToClass(ix+5, iz, clPlayer);
97 addToClass(ix, iz+5, clPlayer);
98 addToClass(ix-5, iz, clPlayer);
99 addToClass(ix, iz-5, clPlayer);
100
101 // create the city patch
102 var cityRadius = radius/3;
103 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
104 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
105 createArea(placer, painter, null);
106
107 // create starting units
108 placeCivDefaultEntities(fx, fz, id);
109
110 // create metal mine
111 var bbAngle = randFloat(0, TWO_PI);
112 var bbDist = 12;
113 var mAngle = bbAngle;
114 while(abs(mAngle - bbAngle) < PI/3)
115 mAngle = randFloat(0, TWO_PI);
116
117 var mDist = 12;
118 var mX = round(fx + mDist * cos(mAngle));
119 var mZ = round(fz + mDist * sin(mAngle));
120 var group = new SimpleGroup(
121 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
122 true, clBaseResource, mX, mZ
123 );
124 createObjectGroup(group, 0);
125
126 // create stone mines
127 mAngle += randFloat(PI/8, PI/4);
128 mX = round(fx + mDist * cos(mAngle));
129 mZ = round(fz + mDist * sin(mAngle));
130 group = new SimpleGroup(
131 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
132 true, clBaseResource, mX, mZ
133 );
134 createObjectGroup(group, 0);
135
136 // create animals
137 for (var j = 0; j < 2; ++j)
138 {
139 var aAngle = randFloat(0, TWO_PI);
140 var aDist = 7;
141 var aX = round(fx + aDist * cos(aAngle));
142 var aZ = round(fz + aDist * sin(aAngle));
143 var group = new SimpleGroup(
144 [new SimpleObject(oChicken, 1,1, 0,2)],
145 true, clBaseResource, aX, aZ
146 );
147 createObjectGroup(group, 0);
148 }
149
150 // create berry bushes
151 var bbAngle = randFloat(0, TWO_PI);
152 var bbDist = 12;
153 var bbX = round(fx + bbDist * cos(bbAngle));
154 var bbZ = round(fz + bbDist * sin(bbAngle));
155 group = new SimpleGroup(
156 [new SimpleObject(oFruitBush, 2,2, 0,3)],
157 true, clBaseResource, bbX, bbZ
158 );
159 createObjectGroup(group, 0);
160
161 // create starting trees
162 var hillSize = PI * radius * radius;
163 var num = floor(hillSize / 60);
164 var tries = 10;
165 for (var x = 0; x < tries; ++x)
166 {
167 var tAngle = randFloat(-PI/3, 4*PI/3);
168 var tDist = randFloat(12, 13);
169 var tX = round(fx + tDist * cos(tAngle));
170 var tZ = round(fz + tDist * sin(tAngle));
171 group = new SimpleGroup(
172 [new SimpleObject(oTree2, num, num, 0, 3)],
173 false, clBaseResource, tX, tZ
174 );
175 if (createObjectGroup(group, 0, avoidClasses(clBaseResource, 2)))
176 break;
177 }
178 // create grass tufts
179 var num = hillSize / 250;
180 for (var j = 0; j < num; j++)
181 {
182 var gAngle = randFloat(0, TWO_PI);
183 var gDist = radius - (5 + randInt(7));
184 var gX = round(fx + gDist * cos(gAngle));
185 var gZ = round(fz + gDist * sin(gAngle));
186 group = new SimpleGroup(
187 [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)],
188 false, clBaseResource, gX, gZ
189 );
190 createObjectGroup(group, 0);
191 }
192}
193
194RMS.SetProgress(15);
195
196log("Creating volcano");
197var fx = fractionToTiles(0.5);
198var fz = fractionToTiles(0.5);
199var ix = round(fx);
200var iz = round(fz);
201var div = scaleByMapSize(1,8);
202var placer = new ClumpPlacer(mapArea * 0.067 / div, 0.7, 0.05, 100, ix, iz);
203var terrainPainter = new LayeredPainter(
204 [tCliff, tCliff], // terrains
205 [3] // widths
206);
207var elevationPainter = new SmoothElevationPainter(
208 ELEVATION_SET, // type
209 15, // elevation
210 3 // blend radius
211);
212createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], null);
213
214var placer = new ClumpPlacer(mapArea * 0.05 / div, 0.7, 0.05, 100, ix, iz);
215var terrainPainter = new LayeredPainter(
216 [tCliff, tCliff], // terrains
217 [3] // widths
218);
219var elevationPainter = new SmoothElevationPainter(
220 ELEVATION_SET, // type
221 25, // elevation
222 3 // blend radius
223);
224createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill2)], stayClasses(clHill, 1));
225
226var placer = new ClumpPlacer(mapArea * 0.02 / div, 0.7, 0.05, 100, ix, iz);
227var terrainPainter = new LayeredPainter(
228 [tCliff, tCliff], // terrains
229 [3] // widths
230);
231var elevationPainter = new SmoothElevationPainter(
232 ELEVATION_SET, // type
233 45, // elevation
234 3 // blend radius
235);
236createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill3)], stayClasses(clHill2, 1));
237
238var placer = new ClumpPlacer(mapArea * 0.011 / div, 0.7, 0.05, 100, ix, iz);
239var terrainPainter = new LayeredPainter(
240 [tCliff, tCliff], // terrains
241 [3] // widths
242);
243var elevationPainter = new SmoothElevationPainter(
244 ELEVATION_SET, // type
245 62, // elevation
246 3 // blend radius
247);
248createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill4)], stayClasses(clHill3, 1));
249
250var placer = new ClumpPlacer(mapArea * 0.003 / div, 0.7, 0.05, 100, ix, iz);
251var terrainPainter = new LayeredPainter(
252 [tCliff, tCliff, tCliff, tCliff], // terrains
253 [1, 1, 1] // widths
254);
255var elevationPainter = new SmoothElevationPainter(
256 ELEVATION_SET, // type
257 42, // elevation
258 1 // blend radius
259);
260createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill4)], stayClasses(clHill4, 1));
261
262var num = floor(mapArea * 0.03 / 15 / div);
263var tX = round(fx);
264var tZ = round(fz);
265
266
267RMS.SetProgress(45);
268
269log("Creating hills...");
270placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
271terrainPainter = new LayeredPainter(
272 [tCliff, tGrass], // terrains
273 [2] // widths
274);
275elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2);
276createAreas(
277 placer,
278 [terrainPainter, elevationPainter, paintClass(clHill)],
279 avoidClasses(clPlayer, 12, clHill, 15, clWater, 2, clBaseResource, 2),
280 scaleByMapSize(2, 8) * numPlayers
281);
282
283
284// calculate desired number of trees for map (based on size)
285var MIN_TREES = 300;
286var MAX_TREES = 1350;
287var P_FOREST = 0.7;
288
289var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
290var numForest = totalTrees * P_FOREST;
291var numStragglers = totalTrees * (1.0 - P_FOREST);
292
293log("Creating forests...");
294var types = [
295 [[tGrass2, tGrass1, pForestD], [tGrass2, pForestD]],
296 [[tGrass2, tGrass1, pForestM], [tGrass2, pForestM]],
297 [[tGrass2, tGrass1, pForestP], [tGrass2, pForestP]]
298]; // some variation
299
300var size = numForest / (scaleByMapSize(2,8) * numPlayers);
301
302var num = floor(size / types.length);
303for (var i = 0; i < types.length; ++i)
304{
305 placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1);
306 painter = new LayeredPainter(
307 types[i], // terrains
308 [2] // widths
309 );
310 createAreas(
311 placer,
312 [painter, paintClass(clForest)],
313 avoidClasses(clPlayer, 12, clForest, 10, clHill, 0, clWater, 2),
314 num
315 );
316}
317
318RMS.SetProgress(70);
319
320log("Creating dirt patches...");
321var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
322for (var i = 0; i < sizes.length; i++)
323{
324 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
325 painter = new LayeredPainter(
326 [tGrass1,tGrass2], // terrains
327 [1] // widths
328 );
329 createAreas(
330 placer,
331 [painter, paintClass(clDirt)],
332 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clPlayer, 12),
333 scaleByMapSize(20, 80)
334 );
335}
336var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
337for (var i = 0; i < sizes.length; i++)
338{
339 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
340 painter = new LayeredPainter(
341 [tGrass2,tGrass2], // terrains
342 [1] // widths
343 );
344 createAreas(
345 placer,
346 [painter, paintClass(clDirt)],
347 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clPlayer, 12),
348 scaleByMapSize(20, 80)
349 );
350}
351var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
352for (var i = 0; i < sizes.length; i++)
353{
354 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
355 painter = new LayeredPainter(
356 [tGrass3,tGrass3], // terrains
357 [1] // widths
358 );
359 createAreas(
360 placer,
361 [painter, paintClass(clDirt)],
362 avoidClasses(clWater, 3, clForest, 0, clHill, 0, clPlayer, 12),
363 scaleByMapSize(20, 80)
364 );
365}
366
367// create grass patches
368log("Creating grass patches...");
369createLayeredPatches(
370 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
371 [tGrassPatchBlend, tGrassPatch],
372 [1],
373 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0)
374);
375
376log("Creating stone mines...");
377group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
378createObjectGroups(group, 0,
379 avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clRock, 10, clHill, 1),
380 scaleByMapSize(4,16), 100
381);
382
383// create small stone quarries
384group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
385createObjectGroups(group, 0,
386 avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clRock, 10, clHill, 1),
387 scaleByMapSize(4,16), 100
388);
389
390log("Creating metal mines...");
391group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
392createObjectGroups(group, 0,
393 avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1),
394 scaleByMapSize(4,16), 100
395);
396
397RMS.SetProgress(90);
398
399//create decoration
400createDecoration
401(
402 [[new SimpleObject(aRockMedium, 1,3, 0,1)],
403 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
404 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)],
405 [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)],
406 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
407 ],
408 [
409 scaleByMapSize(16, 262),
410 scaleByMapSize(8, 131),
411 scaleByMapSize(13, 200),
412 scaleByMapSize(13, 200),
413 scaleByMapSize(13, 200)
414 ],
415 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0)
416);
417
418// create animals
419createFood
420(
421 [
422 [new SimpleObject(oRabbit, 5,7, 0,4)],
423 [new SimpleObject(oDeer, 2,3, 0,2)]
424 ],
425 [
426 3 * numPlayers,
427 3 * numPlayers
428 ],
429 [avoidClasses(clForest, 0, clPlayer, 20, clHill, 1, clFood, 20)]
430);
431
432// create other animals
433createFood
434(
435 [
436 [new SimpleObject(oBear, 1,1, 0,2)]
437 ],
438 [
439 3 * numPlayers
440 ],
441 [avoidClasses(clForest, 0, clPlayer, 20, clHill, 1, clFood, 20), stayClasses(clForest, 2)]
442);
443// create fruits
444createFood
445(
446 [
447 [new SimpleObject(oFruitBush, 1,2, 0,4)]
448 ],
449 [
450 3 * numPlayers
451 ],
452 avoidClasses(clForest, 0, clPlayer, 20, clHill, 1, clFood, 10)
453);
454RMS.SetProgress(95);
455
456// create straggler trees and bushes
457log("Creating straggler trees and bushes...");
458var types = [oTree, oTree2, oTree3, oTree4, oBush]; // some variation
459var num = floor(numStragglers / types.length);
460for (var i = 0; i < types.length; ++i)
461{
462 group = new SimpleGroup(
463 [new SimpleObject(types[i], 1,1, 0,3)],
464 true, clForest
465 );
466 createObjectGroups(group, 0,
467 avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1),
468 num
469 );
470}
471
472// create straggler bushes on hills
473log("Creating straggler bushes...");
474var types = [oBush]; // some variation
475var num = floor(numStragglers / types.length);
476for (var i = 0; i < types.length; ++i)
477{
478 group = new SimpleGroup(
479 [new SimpleObject(types[i], 1,3, 0,3)],
480 true, clForest
481 );
482 createObjectGroups(group, 0,
483 [avoidClasses(clForest, 1, clPlayer, 12, clMetal, 1, clRock, 1), stayClasses(clHill, 3)],
484 num
485 );
486}
487ExportMap();