Ticket #1311: fortress.js

File fortress.js, 12.9 KB (added by FeXoR, 12 years ago)
Line 
1RMS.LoadLibrary("rmgen");
2
3var tGrass = ["temp_grass", "temp_grass", "temp_grass_d"];
4var tGrassPForest = "temp_plants_bog";
5var tGrassDForest = "temp_plants_bog";
6var tGrassA = "temp_grass_plants";
7var tGrassB = "temp_plants_bog";
8var tGrassC = ["temp_grass_b", "temp_grass_c"];
9var tDirt = ["temp_plants_bog", "temp_mud_a"];
10var tHill = ["temp_highlands", "temp_grass_long_b"];
11var tCliff = ["temp_cliff_a", "temp_cliff_b"];
12var tRoad = "temp_road";
13var tRoadWild = "temp_road_overgrown";
14var tGrassPatch = "temp_grass_plants";
15var tShoreBlend = "temp_grass_plants";
16var tShore = "temp_plants_bog";
17var tWater = "temp_mud_a";
18
19// gaia entities
20var oBeech = "gaia/flora_tree_euro_beech";
21var oOak = "gaia/flora_tree_oak";
22var oBerryBush = "gaia/flora_bush_berry";
23var oChicken = "gaia/fauna_chicken";
24var oDeer = "gaia/fauna_deer";
25var oFish = "gaia/fauna_fish";
26var oSheep = "gaia/fauna_rabbit";
27var oStoneLarge = "gaia/geology_stonemine_temperate_quarry";
28var oStoneSmall = "gaia/geology_stone_temperate";
29var oMetalLarge = "gaia/geology_metal_temperate_slabs";
30var oWood = "gaia/special_treasure_wood";
31var oFood = "gaia/special_treasure_food_bin";
32var oMetal = "gaia/special_treasure_metal";
33var oStone = "gaia/special_treasure_stone";
34
35// decorative props
36var aGrass = "actor|props/flora/grass_soft_small_tall.xml";
37var aGrassShort = "actor|props/flora/grass_soft_large.xml";
38var aRockLarge = "actor|geology/stone_granite_med.xml";
39var aRockMedium = "actor|geology/stone_granite_med.xml";
40var aReeds = "actor|props/flora/reeds_pond_lush_a.xml";
41var aLillies = "actor|props/flora/water_lillies.xml";
42var aBushMedium = "actor|props/flora/bush_medit_me.xml";
43var aBushSmall = "actor|props/flora/bush_medit_sm.xml";
44
45var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oBeech, tGrassDForest];
46var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oOak, tGrassPForest];
47const BUILDING_ANGlE = -PI/4;
48
49// initialize map
50
51log("Initializing map...");
52
53InitMap();
54
55var numPlayers = getNumPlayers();
56var mapSize = getMapSize();
57var mapArea = mapSize*mapSize;
58
59// create tile classes
60
61var clPlayer = createTileClass();
62var clHill = createTileClass();
63var clForest = createTileClass();
64var clWater = createTileClass();
65var clDirt = createTileClass();
66var clRock = createTileClass();
67var clMetal = createTileClass();
68var clFood = createTileClass();
69var clBaseResource = createTileClass();
70var clSettlement = createTileClass();
71
72
73// randomize player order
74var playerIDs = [];
75for (var i = 0; i < numPlayers; i++)
76{
77 playerIDs.push(i+1);
78}
79playerIDs = sortPlayers(playerIDs);
80
81// place players
82
83var playerX = new Array(numPlayers);
84var playerZ = new Array(numPlayers);
85var playerAngle = new Array(numPlayers);
86var baseRadius = 30;
87
88var startAngle = randFloat(0, TWO_PI);
89for (var i = 0; i < numPlayers; i++)
90{
91 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
92 playerX[i] = mapSize*(0.5 + 0.35*cos(playerAngle[i]));
93 playerZ[i] = mapSize*(0.5 + 0.35*sin(playerAngle[i]));
94}
95
96for (var i=0; i < numPlayers; i++)
97{
98 var civ = g_MapSettings.PlayerData[i].Civ;
99 var startEntities = getStartingEntities(i);
100 // Place starting entities
101 createStartingPlayerEntities(playerX[i], playerZ[i], i+1, startEntities, BUILDING_ANGlE)
102 var uDist = 8;
103 var uSpace = 2;
104 for (var j = 1; j < startEntities.length - 1; ++j)
105 {
106 var uAngle = BUILDING_ANGlE - PI * (2-j) / 2;
107 var count = (startEntities[j].Count !== undefined ? startEntities[j].Count : 1);
108 for (var numberofentities = 0; numberofentities < count; numberofentities++)
109 {
110 var ux = playerX[i] + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2));
111 var uz = playerZ[i] + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2));
112 placeObject(ux, uz, startEntities[j].Template, i+1, uAngle);
113 }
114 }
115 // create resources
116 var bbAngle = BUILDING_ANGlE;
117 var bbDist = 10;
118 var bbX = round(playerX[i] + bbDist * cos(bbAngle));
119 var bbZ = round(playerZ[i] + bbDist * sin(bbAngle));
120 var group = new SimpleGroup(
121 [new SimpleObject(oFood, 5,5, 0,2)],
122 true, clBaseResource, bbX, bbZ
123 );
124 createObjectGroup(group, 0);
125
126 bbAngle += PI/2;
127 var bbX = round(playerX[i] + bbDist * cos(bbAngle));
128 var bbZ = round(playerZ[i] + bbDist * sin(bbAngle));
129 group = new SimpleGroup(
130 [new SimpleObject(oWood, 5,5, 0,2)],
131 true, clBaseResource, bbX, bbZ
132 );
133 createObjectGroup(group, 0);
134
135 bbAngle += PI/2;
136 var bbX = round(playerX[i] + bbDist * cos(bbAngle));
137 var bbZ = round(playerZ[i] + bbDist * sin(bbAngle));
138 group = new SimpleGroup(
139 [new SimpleObject(oMetal, 3,3, 0,2)],
140 true, clBaseResource, bbX, bbZ
141 );
142 createObjectGroup(group, 0);
143
144 bbAngle += PI/2;
145 var bbX = round(playerX[i] + bbDist * cos(bbAngle));
146 var bbZ = round(playerZ[i] + bbDist * sin(bbAngle));
147 group = new SimpleGroup(
148 [new SimpleObject(oStone, 2,2, 0,2)],
149 true, clBaseResource, bbX, bbZ
150 );
151 createObjectGroup(group, 0);
152
153 // Base texture
154 var placer = new ClumpPlacer(PI*baseRadius*baseRadius/4, 1/2, 1/8, 10, playerX[i], playerZ[i]);
155 createArea(placer,[new TerrainPainter(tRoad), paintClass(clPlayer)]);
156
157 // Place custom fortress
158 if (civ == "celt" || civ == "iber")
159 {
160 var wall = ['entryTower', 'wall', 'wall',
161 'cornerIn', 'wall', 'barracks', 'wall', 'gate', 'wall', 'house', 'wall',
162 'cornerIn', 'wall', 'house', 'wall', 'entryTower', 'wall', 'house', 'wall',
163 'cornerIn', 'wall', 'house', 'wall', 'gate', 'wall', 'house', 'wall',
164 'cornerIn', 'wall', 'house', 'wall'];
165 }
166 else
167 {
168 var wall = ['entryTower', 'wall', 'wall',
169 'cornerIn', 'wall', 'barracks', 'wall', 'gate', 'wall', 'wall',
170 'cornerIn', 'wall', 'house', 'wall', 'entryTower', 'wall', 'wall',
171 'cornerIn', 'wall', 'house', 'wall', 'gate', 'wall', 'wall',
172 'cornerIn', 'wall', 'house', 'wall'];
173 };
174 placeCustomFortress(playerX[i], playerZ[i], new Fortress("Spahbod", wall), civ, i+1, BUILDING_ANGlE);
175};
176
177// create lakes
178log("Creating lakes...");
179var numLakes = round(scaleByMapSize(1,4) * numPlayers);
180var placer = new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, 10);
181var terrainPainter = new LayeredPainter(
182 [tShore, tWater, tWater], // terrains
183 [1,1] // widths
184);
185var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 3);
186var waterAreas = createAreas(
187 placer,
188 [terrainPainter, elevationPainter, paintClass(clWater)],
189 avoidClasses(clPlayer, 7, clWater, 20),
190 numLakes
191);
192
193RMS.SetProgress(15);
194
195// create reeds
196log("Creating reeds...");
197group = new SimpleGroup(
198 [new SimpleObject(aReeds, 5,10, 0,4), new SimpleObject(aLillies, 0,1, 0,4)], true
199);
200createObjectGroupsByAreas(group, 0,
201 [borderClasses(clWater, 3, 0), stayClasses(clWater, 1)],
202 numLakes, 100,
203 waterAreas
204);
205
206RMS.SetProgress(20);
207
208// create fish
209log("Creating fish...");
210group = new SimpleGroup(
211 [new SimpleObject(oFish, 1,1, 0,1)],
212 true, clFood
213);
214createObjectGroupsByAreas(group, 0,
215 borderClasses(clWater, 2, 0), avoidClasses(clFood, 8),
216 numLakes, 50,
217 waterAreas
218);
219waterAreas = [];
220
221RMS.SetProgress(25);
222
223// create bumps
224log("Creating bumps...");
225placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
226var painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
227createAreas(
228 placer,
229 painter,
230 avoidClasses(clWater, 2, clPlayer, 5),
231 scaleByMapSize(100, 200)
232);
233
234RMS.SetProgress(30);
235
236// create hills
237log("Creating hills...");
238placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
239terrainPainter = new LayeredPainter(
240 [tCliff, tHill], // terrains
241 [2] // widths
242);
243elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2);
244createAreas(
245 placer,
246 [terrainPainter, elevationPainter, paintClass(clHill)],
247 avoidClasses(clPlayer, 5, clWater, 5, clHill, 15),
248 scaleByMapSize(1, 4) * numPlayers
249);
250
251RMS.SetProgress(35);
252
253// calculate desired number of trees for map (based on size)
254const MIN_TREES = 500;
255const MAX_TREES = 2500;
256const P_FOREST = 0.7;
257
258var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
259var numForest = totalTrees * P_FOREST;
260var numStragglers = totalTrees * (1.0 - P_FOREST);
261
262// create forests
263log("Creating forests...");
264var types = [
265 [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]],
266 [[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]]
267]; // some variation
268var size = numForest / (scaleByMapSize(2,8) * numPlayers);
269var num = floor(size / types.length);
270for (var i = 0; i < types.length; ++i)
271{
272 placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1);
273 painter = new LayeredPainter(
274 types[i], // terrains
275 [2] // widths
276 );
277 createAreas(
278 placer,
279 [painter, paintClass(clForest)],
280 avoidClasses(clPlayer, 5, clWater, 3, clForest, 7, clHill, 1),
281 num
282 );
283}
284
285RMS.SetProgress(40);
286
287// create dirt patches
288log("Creating dirt patches...");
289var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
290for (var i = 0; i < sizes.length; i++)
291{
292 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
293 painter = new LayeredPainter(
294 [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains
295 [1,1] // widths
296 );
297 createAreas(
298 placer,
299 [painter, paintClass(clDirt)],
300 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 1),
301 scaleByMapSize(15, 45)
302 );
303}
304
305RMS.SetProgress(45);
306
307// create grass patches
308log("Creating grass patches...");
309var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)];
310for (var i = 0; i < sizes.length; i++)
311{
312 placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
313 painter = new TerrainPainter(tGrassPatch);
314 createAreas(
315 placer,
316 painter,
317 avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 1),
318 scaleByMapSize(15, 45)
319 );
320}
321
322RMS.SetProgress(50);
323
324log("Creating stone mines...");
325// create large stone quarries
326group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
327createObjectGroups(group, 0,
328 [avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clHill, 1)],
329 scaleByMapSize(4,16), 100
330);
331
332// create small stone quarries
333group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
334createObjectGroups(group, 0,
335 [avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clHill, 1)],
336 scaleByMapSize(4,16), 100
337);
338
339log("Creating metal mines...");
340// create large metal quarries
341group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
342createObjectGroups(group, 0,
343 [avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clMetal, 10, clRock, 5, clHill, 1)],
344 scaleByMapSize(4,16), 100
345);
346
347RMS.SetProgress(60);
348
349// create small decorative rocks
350log("Creating small decorative rocks...");
351group = new SimpleGroup(
352 [new SimpleObject(aRockMedium, 1,3, 0,1)],
353 true
354);
355createObjectGroups(
356 group, 0,
357 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0),
358 scaleByMapSize(16, 262), 50
359);
360
361RMS.SetProgress(65);
362
363// create large decorative rocks
364log("Creating large decorative rocks...");
365group = new SimpleGroup(
366 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)],
367 true
368);
369createObjectGroups(
370 group, 0,
371 avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0),
372 scaleByMapSize(8, 131), 50
373);
374
375RMS.SetProgress(70);
376
377// create deer
378log("Creating deer...");
379group = new SimpleGroup(
380 [new SimpleObject(oDeer, 5,7, 0,4)],
381 true, clFood
382);
383createObjectGroups(group, 0,
384 avoidClasses(clWater, 0, clForest, 0, clPlayer, 6, clHill, 1, clFood, 20),
385 3 * numPlayers, 50
386);
387
388RMS.SetProgress(75);
389
390// create sheep
391log("Creating sheep...");
392group = new SimpleGroup(
393 [new SimpleObject(oSheep, 2,3, 0,2)],
394 true, clFood
395);
396createObjectGroups(group, 0,
397 avoidClasses(clWater, 0, clForest, 0, clPlayer, 6, clHill, 1, clFood, 20),
398 3 * numPlayers, 50
399);
400
401RMS.SetProgress(80);
402
403// create straggler trees
404log("Creating straggler trees...");
405var types = [oOak, oBeech]; // some variation
406var num = floor(numStragglers / types.length);
407for (var i = 0; i < types.length; ++i)
408{
409 group = new SimpleGroup(
410 [new SimpleObject(types[i], 1,1, 0,3)],
411 true, clForest
412 );
413 createObjectGroups(group, 0,
414 avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 4, clMetal, 1, clRock, 1),
415 num
416 );
417};
418
419RMS.SetProgress(85);
420
421//create small grass tufts
422log("Creating small grass tufts...");
423group = new SimpleGroup(
424 [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)]
425);
426createObjectGroups(group, 0,
427 avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0),
428 scaleByMapSize(13, 200)
429);
430
431RMS.SetProgress(90);
432
433// create large grass tufts
434log("Creating large grass tufts...");
435group = new SimpleGroup(
436 [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)]
437);
438createObjectGroups(group, 0,
439 avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0),
440 scaleByMapSize(13, 200)
441);
442
443RMS.SetProgress(95);
444
445// create bushes
446log("Creating bushes...");
447group = new SimpleGroup(
448 [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)]
449);
450createObjectGroups(group, 0,
451 avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1),
452 scaleByMapSize(13, 200), 50
453);
454
455// Export map data
456ExportMap();