Ticket #1513: deep_forest.js

File deep_forest.js, 10.4 KB (added by FeXoR, 12 years ago)

New version of deep_forest.js 2.7.2012

Line 
1RMS.LoadLibrary("rmgen");
2
3// initialize map
4log("Initializing map...");
5InitMap();
6
7
8// Setup tile classes
9var clPlayer = createTileClass();
10var clPath = createTileClass();
11var clHill = createTileClass();
12var clForest = createTileClass();
13// var clWater = createTileClass();
14// var clRock = createTileClass();
15// var clFood = createTileClass();
16var clBaseResource = createTileClass();
17
18// Setup Templates
19var templateStone = "gaia/geology_stone_temperate"
20var templateStoneMine = "gaia/geology_stonemine_temperate_quarry";
21var templateMetal = "gaia/geology_metal_temperate";
22var templateMetalMine = "gaia/geology_metal_temperate_slabs";
23var startingResourcees = ["gaia/flora_tree_oak_large", "gaia/flora_bush_temperate", templateStoneMine,
24 "gaia/flora_bush_grapes", "gaia/flora_tree_apple", "gaia/flora_bush_berry", templateMetalMine, "gaia/flora_bush_badlands"];
25
26// Setup terrain
27var terrainWood = ['temp_grass_mossy|gaia/flora_tree_oak', 'temp_forestfloor_pine|gaia/flora_tree_pine', 'temp_mud_plants|gaia/flora_tree_dead',
28 'temp_plants_bog|gaia/flora_tree_oak_large', 'temp_plants_bog|gaia/flora_tree_pine_animated',
29 "temp_dirt_gravel_plants|gaia/flora_tree_aleppo_pine", 'temp_forestfloor_autumn|gaia/flora_tree_carob']; //'temp_forestfloor_autumn|gaia/flora_tree_fig'
30var terrainWoodBorder = ['temp_grass_plants|gaia/flora_tree_euro_beech', 'temp_grass_mossy|gaia/flora_tree_poplar', 'temp_grass_mossy|gaia/flora_tree_poplar_lombardy',
31 'temp_grass_long|gaia/flora_bush_temperate', 'temp_mud_plants|gaia/flora_bush_temperate', 'temp_mud_plants|gaia/flora_bush_badlands',
32 'temp_grass_long|gaia/flora_tree_apple', 'temp_grass_clovers|gaia/flora_bush_berry', 'temp_grass_clovers_2|gaia/flora_bush_grapes',
33 'temp_grass_plants|gaia/fauna_deer', "temp_grass_long_b|gaia/fauna_rabbit", "temp_grass_plants"];
34var terrainBase = ['temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b',
35 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b',
36 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b',
37 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b',
38 'temp_grass_b|gaia/fauna_pig', 'temp_dirt_gravel|gaia/fauna_chicken'];
39var terrainBaseBorder = ["temp_grass_b", "temp_grass_b", "temp_grass", "temp_grass_c", "temp_grass_mossy"];
40var terrainBaseCenter = ['temp_dirt_gravel', 'temp_dirt_gravel', 'temp_grass_b'];
41var terrainPath = ['temp_road', "temp_road_overgrown", 'temp_grass_b'];
42var terrainHill = ["temp_highlands", "temp_highlands", "temp_highlands", "temp_dirt_gravel_b", "temp_cliff_a"];
43var terrainHillBorder = ["temp_highlands", "temp_highlands", "temp_highlands", "temp_dirt_gravel_b", "temp_dirt_gravel_plants",
44 "temp_highlands", "temp_highlands", "temp_highlands", "temp_dirt_gravel_b", "temp_dirt_gravel_plants",
45 "temp_highlands", "temp_highlands", "temp_highlands", "temp_cliff_b", "temp_dirt_gravel_plants",
46 "temp_highlands", "temp_highlands", "temp_highlands", "temp_cliff_b", "temp_dirt_gravel_plants",
47 "temp_highlands|gaia/fauna_goat"];
48
49
50// Setup map
51var mapSize = getMapSize();
52var mapRadius = mapSize/2;
53var playableMapRadius = mapRadius - 5;
54var mapCenterX = mapRadius;
55var mapCenterZ = mapRadius;
56
57// Setup players and bases
58var numPlayers = getNumPlayers();
59var baseRadius = 20;
60var minPlayerRadius = min(mapRadius-1.5*baseRadius, 5*mapRadius/8);
61var maxPlayerRadius = min(mapRadius-baseRadius, 3*mapRadius/4);
62const BUILDING_ANGlE = -PI/4;
63var playerStartLocX = new Array(numPlayers);
64var playerStartLocZ = new Array(numPlayers);
65var playerAngle = new Array(numPlayers);
66var playerAngleStart = randFloat(0, 2*PI);
67var playerAngleAddAvrg = 2*PI / numPlayers;
68var playerAngleMaxOff = playerAngleAddAvrg/4;
69
70// Setup eyecandy
71var templateEC = "other/unfinished_greek_temple";
72var radiusEC = max(mapRadius/8, baseRadius/2);
73
74// Setup paths
75var pathSucsessRadius = baseRadius/2;
76var pathAngleOff = PI/2;
77var pathWidth = 5; // This is not really the path's sickness in tiles but the number of tiles in the clumbs of the path
78
79// Setup additional resources
80var resourceRadius = 2*mapRadius/3; // 3*mapRadius/8;
81var resourcePerPlayer = [templateStone, templateMetalMine];
82
83// Setup woods
84var maxTreeDensity = min(256*256/mapSize/mapSize, 1); // Has to be tweeked but works ok
85var bushChance = 1/3; // 1 means 50% chance in deepest wood, 0.5 means 25% chance in deepest wood
86
87RMS.SetProgress(2);
88
89// Place bases
90for (var i=0; i < numPlayers; i++)
91{
92 playerAngle[i] = (playerAngleStart + i*playerAngleAddAvrg + randFloat(0, playerAngleMaxOff))%(2*PI);
93 var x = round(mapCenterX + randFloat(minPlayerRadius, maxPlayerRadius)*cos(playerAngle[i]));
94 var z = round(mapCenterZ + randFloat(minPlayerRadius, maxPlayerRadius)*sin(playerAngle[i]));
95 playerStartLocX[i] = x;
96 playerStartLocZ[i] = z;
97 // Place starting entities
98 placeCivDefaultEntities(x, z, i+1, BUILDING_ANGlE);
99 // Place base texture
100 var placer = new ClumpPlacer(2*baseRadius*baseRadius, 2/3, 1/8, 10, x, z);
101 var painter = [new LayeredPainter([terrainBaseBorder, terrainBase, terrainBaseCenter], [baseRadius/4, baseRadius/4]), paintClass(clPlayer)];
102 createArea(placer, painter);
103 // Place starting resources
104 var distToSL = 10;
105 var resStartAngle = playerAngle[i] + PI;
106 var resAddAngle = 2*PI / startingResourcees.length;
107 for (var rIndex = 0; rIndex < startingResourcees.length; rIndex++)
108 {
109 var angleOff = randFloat(-resAddAngle/2, resAddAngle/2);
110 var placeX = x + distToSL*cos(resStartAngle + rIndex*resAddAngle + angleOff);
111 var placeZ = z + distToSL*sin(resStartAngle + rIndex*resAddAngle + angleOff);
112 placeObject(placeX, placeZ, startingResourcees[rIndex], 0, randFloat(0, 2*PI));
113 addToClass(round(placeX), round(placeZ), clBaseResource);
114 }
115}
116
117RMS.SetProgress(10);
118
119// Place paths
120var doublePaths = true;
121if (numPlayers > 4)
122 doublePaths = false;
123var doublePathMayPlayers = 4;
124if (doublePaths == true)
125 var maxI = numPlayers+1
126else
127 var maxI = numPlayers;
128for (var i = 0; i < maxI; i++)
129{
130 if (doublePaths == true)
131 var minJ = 0
132 else
133 var minJ = i+1;
134 for (var j = minJ; j < numPlayers+1; j++)
135 {
136 // Setup start and target coordinates
137 if (i < numPlayers)
138 {
139 var x = playerStartLocX[i];
140 var z = playerStartLocZ[i];
141 }
142 else
143 {
144 var x = mapCenterX;
145 var z = mapCenterZ;
146 };
147 if (j < numPlayers)
148 {
149 var targetX = playerStartLocX[j];
150 var targetZ = playerStartLocZ[j];
151 }
152 else
153 {
154 var targetX = mapCenterX;
155 var targetZ = mapCenterZ;
156 };
157 // Prepare path placement
158 var angle = getAngle(x, z, targetX, targetZ);
159 x += round(pathSucsessRadius*cos(angle));
160 z += round(pathSucsessRadius*sin(angle));
161 var targetReached = false;
162 var tries = 0;
163 // Placing paths
164 while (targetReached == false && tries < 2*mapSize)
165 {
166 var placer = new ClumpPlacer(pathWidth, 1, 1, 1, x, z);
167 var painter = [new TerrainPainter(terrainPath), new ElevationPainter(-randFloat()), paintClass(clPath)];
168 createArea(placer, painter, avoidClasses(clHill, 0, clBaseResource, 4));
169 // addToClass(x, z, clPath); // Not needed...
170 // Set vars for next loop
171 angle = getAngle(x, z, targetX, targetZ);
172 if (doublePaths == true) // Bended paths
173 {
174 x += round(cos(angle + randFloat(-pathAngleOff/2, 3*pathAngleOff/2)));
175 z += round(sin(angle + randFloat(-pathAngleOff/2, 3*pathAngleOff/2)));
176 }
177 else // Straight paths
178 {
179 x += round(cos(angle + randFloat(-pathAngleOff, pathAngleOff)));
180 z += round(sin(angle + randFloat(-pathAngleOff, pathAngleOff)));
181 }
182 if (getDistance(x, z, targetX, targetZ) < pathSucsessRadius)
183 targetReached = true;
184 tries++;
185
186 }
187 }
188}
189
190RMS.SetProgress(50);
191
192// Place expansion resources
193for (var i=0; i < numPlayers; i++)
194{
195 for (var rIndex = 0; rIndex < resourcePerPlayer.length; rIndex++)
196 {
197 if (numPlayers > 1)
198 var angleDist = (playerAngle[(i+1)%numPlayers] - playerAngle[i] + 2*PI)%(2*PI);
199 else
200 var angleDist = 2*PI;
201 var placeX = round(mapCenterX + resourceRadius*cos(playerAngle[i] + (rIndex+1)*angleDist/(resourcePerPlayer.length+1)));
202 var placeZ = round(mapCenterX + resourceRadius*sin(playerAngle[i] + (rIndex+1)*angleDist/(resourcePerPlayer.length+1)));
203 placeObject(placeX, placeZ, resourcePerPlayer[rIndex], 0, randFloat(0, 2*PI));
204 var placer = new ClumpPlacer(40, 1/2, 1/8, 1, placeX, placeZ);
205 var painter = [new LayeredPainter([terrainHillBorder, terrainHill], [1]), new ElevationPainter(1+randFloat()), paintClass(clHill)];
206 createArea(placer, painter);
207 }
208}
209
210RMS.SetProgress(60);
211
212// Place eyecandy
213placeObject(mapCenterX, mapCenterZ, templateEC, 0, randFloat(0, 2*PI));
214var placer = new ClumpPlacer(radiusEC*radiusEC, 1/2, 1/8, 1, mapCenterX, mapCenterZ);
215var painter = [new LayeredPainter([terrainHillBorder, terrainHill], [radiusEC/4]), new ElevationPainter(1+randFloat()), paintClass(clHill)];
216createArea(placer, painter);
217
218// Woods and general hight map
219for (var x = 0; x < mapSize; x++)
220{
221 for (var z = 0;z < mapSize;z++)
222 {
223 // Some variables
224 var radius = Math.pow(Math.pow(mapCenterX - x, 2) + Math.pow(mapCenterZ - z, 2), 1/2);
225 var minDistToSL = mapSize;
226 for (var i=0; i < numPlayers; i++)
227 minDistToSL = min(minDistToSL, getDistance(playerStartLocX[i], playerStartLocZ[i], x, z))
228 // Woods tile based
229 var tDensFactSL = max(min((minDistToSL - baseRadius) / baseRadius, 1), 0);
230 var tDensFactRad = abs((resourceRadius - radius) / resourceRadius);
231 var tDensFactEC = max(min((radius - radiusEC) / radiusEC, 1), 0);
232 var tDensActual = maxTreeDensity * tDensFactSL * tDensFactRad * tDensFactEC;
233 if (randFloat() < tDensActual && radius < playableMapRadius)
234 {
235 if (tDensActual < bushChance*randFloat()*maxTreeDensity)
236 {
237 var placer = new ClumpPlacer(1, 1.0, 1.0, 1, x, z);
238 var painter = [new TerrainPainter(terrainWoodBorder), new ElevationPainter(randFloat()), paintClass(clForest)];
239 createArea(placer, painter, avoidClasses(clPath, 1, clHill, 0));
240 }
241 else
242 {
243 var placer = new ClumpPlacer(1, 1.0, 1.0, 1, x, z);
244 var painter = [new TerrainPainter(terrainWood), new ElevationPainter(randFloat()), paintClass(clForest)];
245 createArea(placer, painter, avoidClasses(clPath, 2, clHill, 1));
246 }
247 }
248 // General hight map
249 var hVarMiddleHill = mapSize/64 * (1+cos(3*PI/2 * radius/mapRadius));
250 var hVarHills = 5*(1+sin(x/10)*sin(z/10));
251 setHeight(x, z, getHeight(x, z) + hVarMiddleHill + hVarHills + 1);
252 }
253}
254
255RMS.SetProgress(95);
256
257
258// Export map data
259ExportMap();