Ticket #4354: polar_sea.js

File polar_sea.js, 8.8 KB (added by FeXoR, 7 years ago)

Fixed version of polar_sea.js

Line 
1RMS.LoadLibrary("rmgen");
2RMS.LoadLibrary("rmgen2");
3
4{
5 setFogThickness(0.76);
6 setFogFactor(0.7);
7
8 setPPEffect("hdr");
9 setPPSaturation(0.48);
10 setPPContrast(0.53);
11 setPPBloom(0.12);
12
13 var tPrimary = ["polar_snow_a"];
14 var tCliff = ["polar_cliff_a", "polar_cliff_b", "polar_cliff_snow"];
15 var tSecondary = "polar_snow_glacial";
16 var tHalfSnow = ["ice_01", "ice_dirt"];
17 var tSnowLimited = ["polar_snow_b", "polar_ice"];
18 var tDirt = "ice_dirt";
19 var tRoad = "polar_ice_b";
20 var tRoadWild = "polar_ice_cracked";
21 var tShore = "polar_ice_snow";
22 var tWater = "polar_ice_c";
23
24 // gaia entities
25 var oBush = "gaia/flora_bush_badlands";
26 var oBerryBush = "gaia/flora_bush_berry";
27 var oChicken = "gaia/fauna_chicken";
28 var oWolf = "gaia/fauna_wolf_snow";
29 var oWalrus = "gaia/fauna_walrus";
30 var oWhaleFin = "gaia/fauna_whale_fin";
31 var oWhaleHumpback = "gaia/fauna_whale_humpback";
32 var oFish = "gaia/fauna_fish";
33 var oStoneLarge = "gaia/geology_stonemine_alpine_quarry";
34 var oStoneSmall = "gaia/geology_stone_alpine_a";
35 var oMetalLarge = "gaia/geology_metal_alpine_slabs";
36
37 // decorative props
38 var aRockLarge = "actor|geology/stone_granite_med.xml";
39 var aRockMedium = "actor|geology/stone_granite_med.xml";
40 var aIceberg = "actor|props/special/eyecandy/iceberg.xml";
41}
42
43// initialize map
44log("Initializing map...");
45
46InitMap();
47
48const numPlayers = getNumPlayers();
49const mapSize = getMapSize();
50const mapArea = mapSize*mapSize;
51
52// create tile classes
53var clPlayer = createTileClass();
54var clWater = createTileClass();
55var clDirt = createTileClass();
56var clRock = createTileClass();
57var clMetal = createTileClass();
58var clFood = createTileClass();
59var clBaseResource = createTileClass();
60var clSettlement = createTileClass();
61var clForest = createTileClass();
62
63//cover the ground with the primary terrain chosen in the beginning
64for (var ix = 0; ix < mapSize; ix++)
65{
66 for (var iz = 0; iz < mapSize; iz++)
67 {
68 var x = ix / (mapSize + 1.0);
69 var z = iz / (mapSize + 1.0);
70 placeTerrain(ix, iz, tPrimary);
71 }
72}
73
74// randomize player order
75var playerIDs = [];
76for (var i = 0; i < numPlayers; i++)
77{
78 playerIDs.push(i+1);
79}
80playerIDs = sortPlayers(playerIDs);
81
82// place players
83var playerX = new Array(numPlayers);
84var playerZ = new Array(numPlayers);
85var playerAngle = new Array(numPlayers);
86
87var startAngle = randFloat(0, TWO_PI);
88for (var i = 0; i < numPlayers; i++)
89{
90 playerAngle[i] = startAngle + i*TWO_PI/numPlayers;
91 playerX[i] = 0.5 + 0.35*cos(playerAngle[i]);
92 playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]);
93}
94
95RMS.SetProgress(20);
96
97for (var i = 0; i < numPlayers; i++)
98{
99 var id = playerIDs[i];
100 log("Creating base for player " + id + "...");
101
102 // some constants
103 var radius = scaleByMapSize(15,25);
104 var cliffRadius = 2;
105 var elevation = 20;
106
107 // get the x and z in tiles
108 var fx = fractionToTiles(playerX[i]);
109 var fz = fractionToTiles(playerZ[i]);
110 var ix = round(fx);
111 var iz = round(fz);
112 addToClass(ix, iz, clPlayer);
113 addToClass(ix+5, iz, clPlayer);
114 addToClass(ix, iz+5, clPlayer);
115 addToClass(ix-5, iz, clPlayer);
116 addToClass(ix, iz-5, clPlayer);
117
118 // create the city patch
119 var cityRadius = radius/3;
120 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
121 var painter = new LayeredPainter([tRoadWild, tRoad], [1]);
122 createArea(placer, painter, null);
123
124 // create starting units
125 placeCivDefaultEntities(fx, fz, id);
126
127 // create animals
128 for (var j = 0; j < 2; ++j)
129 {
130 var aAngle = randFloat(0, TWO_PI);
131 var aDist = 7;
132 var aX = round(fx + aDist * cos(aAngle));
133 var aZ = round(fz + aDist * sin(aAngle));
134 var group = new SimpleGroup(
135 [new SimpleObject(oChicken, 5,5, 0,2)],
136 true, clBaseResource, aX, aZ
137 );
138 createObjectGroup(group, 0);
139 }
140
141 // create berry bushes
142 var bbAngle = randFloat(0, TWO_PI);
143 var bbDist = 12;
144 var bbX = round(fx + bbDist * cos(bbAngle));
145 var bbZ = round(fz + bbDist * sin(bbAngle));
146 group = new SimpleGroup(
147 [new SimpleObject(oBerryBush, 5,5, 0,3)],
148 true, clBaseResource, bbX, bbZ
149 );
150 createObjectGroup(group, 0);
151
152 // create metal mine
153 var mAngle = bbAngle;
154 while(abs(mAngle - bbAngle) < PI/3)
155 {
156 mAngle = randFloat(0, TWO_PI);
157 }
158 var mDist = 12;
159 var mX = round(fx + mDist * cos(mAngle));
160 var mZ = round(fz + mDist * sin(mAngle));
161 group = new SimpleGroup(
162 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
163 true, clBaseResource, mX, mZ
164 );
165 createObjectGroup(group, 0);
166
167 // create stone mines
168 mAngle += randFloat(PI/8, PI/4);
169 mX = round(fx + mDist * cos(mAngle));
170 mZ = round(fz + mDist * sin(mAngle));
171 group = new SimpleGroup(
172 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
173 true, clBaseResource, mX, mZ
174 );
175 createObjectGroup(group, 0);
176
177 // create wood
178 var bbAngle = randFloat(0, TWO_PI);
179 var bbDist = 13;
180 var bbX = round(fx + bbDist * cos(bbAngle));
181 var bbZ = round(fz + bbDist * sin(bbAngle));
182 group = new SimpleGroup(
183 [new SimpleObject("gaia/special_treasure_wood", 14,14, 0,3)],
184 true, clBaseResource, bbX, bbZ
185 );
186 createObjectGroup(group, 0);
187};
188
189RMS.SetProgress(30);
190
191var lakeAreas = [];
192var playerConstraint = new AvoidTileClassConstraint(clPlayer, 20);
193var waterConstraint = new AvoidTileClassConstraint(clWater, 8);
194
195for (var x = 0; x < mapSize; ++x)
196 for (var z = 0; z < mapSize; ++z)
197 if (playerConstraint.allows(x, z) && waterConstraint.allows(x, z))
198 lakeAreas.push([x, z]);
199
200var chosenPoint;
201var lakeAreaLen;
202
203//create the lake
204var fx = fractionToTiles(0.5);
205var fz = fractionToTiles(0.5);
206ix = round(fx);
207iz = round(fz);
208
209const lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6))));
210
211var placer = new ChainPlacer(2, floor(scaleByMapSize(5, 16)), floor(scaleByMapSize(35, 200)), 1, ix, iz, 0, [floor(mapSize * 0.17 * lSize)]);
212var terrainPainter = new LayeredPainter(
213 [tShore, tWater, tWater, tWater], // terrains
214 [1, 4, 2] // widths
215);
216var elevationPainter = new SmoothElevationPainter(
217 ELEVATION_SET, // type
218 -4, // elevation
219 4 // blend radius
220);
221createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 20));
222
223paintTerrainBasedOnHeight(3, floor(scaleByMapSize(20, 40)), 0, tCliff);
224paintTerrainBasedOnHeight(floor(scaleByMapSize(20, 40)), 100, 3, tSnowLimited);
225
226// create bumps
227createBumps(avoidClasses(clWater, 2, clPlayer, 20));
228
229RMS.SetProgress(60);
230
231// create dirt patches
232log("Creating dirt patches...");
233createLayeredPatches(
234 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
235 [[tDirt,tHalfSnow], [tHalfSnow,tSnowLimited]],
236 [2],
237 avoidClasses(clWater, 3, clDirt, 5, clPlayer, 12)
238);
239
240// create shrubs
241log("Creating shrubs...");
242createPatches(
243 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
244 tSecondary,
245 avoidClasses(clWater, 3, clDirt, 5, clPlayer, 12)
246);
247
248RMS.SetProgress(65);
249
250log("Creating stone mines...");
251// create stone quarries
252createMines(
253 [
254 [new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)],
255 [new SimpleObject(oStoneSmall, 2,5, 1,3)]
256 ],
257 avoidClasses(clWater, 3, clPlayer, 20, clRock, 18)
258)
259
260log("Creating metal mines...");
261// create large metal quarries
262createMines(
263 [
264 [new SimpleObject(oMetalLarge, 1,1, 0,4)]
265 ],
266 avoidClasses(clWater, 3, clPlayer, 20, clMetal, 18, clRock, 5),
267 clMetal
268)
269
270RMS.SetProgress(70);
271
272// create land decoration
273createDecoration
274(
275 [[new SimpleObject(aRockMedium, 1,3, 0,1)],
276 [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)]
277 ],
278 [
279 scaleByMapSize(16, 262),
280 scaleByMapSize(8, 131),
281 ],
282 avoidClasses(clWater, 0, clPlayer, 0)
283);
284
285// create water decoration
286createDecoration
287(
288 [[new SimpleObject(aIceberg, 3,5, 0,3)]
289 ],
290 [
291 scaleByMapSize(8, 131)
292 ],
293 stayClasses(clWater, 6)
294);
295
296
297RMS.SetProgress(75);
298
299// create land animals
300createFood
301(
302 [
303 [new SimpleObject(oWolf, 4,6, 0,4)],
304 [new SimpleObject(oWalrus, 2,3, 0,2)]
305 ],
306 [
307 3 * numPlayers,
308 3 * numPlayers
309 ],
310 avoidClasses(clFood, 16)
311);
312
313// create water animals
314createFood
315(
316 [
317 [new SimpleObject(oWhaleFin, 1,2, 0,2)],
318 [new SimpleObject(oWhaleHumpback, 1,2, 0,2)]
319 ],
320 [
321 3 * numPlayers,
322 3 * numPlayers
323 ],
324 [avoidClasses(clFood, 20), stayClasses(clWater, 6)]
325);
326
327// create fish
328createFood
329(
330 [
331 [new SimpleObject(oFish, 2,3, 0,2)]
332 ],
333 [
334 15 * numPlayers
335 ],
336 [avoidClasses(clFood, 12), stayClasses(clWater, 6)]
337);
338
339RMS.SetProgress(85);
340
341// create straggler trees
342var types = [oBush];
343createStragglerTrees(types, avoidClasses(clWater, 5, clPlayer, 12, clMetal, 1, clRock, 1));
344
345var random_var = randInt(1,5)
346
347if (random_var==1)
348 setSkySet("cirrus");
349else if (random_var ==2)
350 setSkySet("cumulus");
351else if (random_var ==3)
352 setSkySet("sunny");
353else if (random_var ==4)
354 setSkySet("overcast");
355else if (random_var ==3)
356 setSkySet("rain");
357
358
359setSunRotation(randFloat(0, TWO_PI));
360setSunElevation(randFloat(PI/ 4, PI / 2));
361setWaterColor(0.0, 0.047, 0.286); // dark majestic blue
362setWaterTint(0.462, 0.756, 0.866); // light blue
363setWaterMurkiness(0.92);
364setWaterWaviness(1.0);
365setWaterType("clap");
366
367// Export map data
368ExportMap();