1 RMS.LoadLibrary("rmgen");
3 const tCity = "desert_city_tile";
4 const tCityPlaza = "desert_city_tile_plaza";
5 const tFineSand = "desert_sand_smooth";
6 const tDirt1 = "desert_dirt_rough_2";
7 const tSandDunes = "desert_sand_dunes_50";
8 const tDirt2 = "desert_dirt_rough";
9 const tDirtCracks = "desert_dirt_cracks";
10 const tShore = "desert_shore_stones";
11 const tWaterDeep = "desert_shore_stones_wet";
12 const tLush = "desert_grass_a";
13 const tSLush = "desert_grass_a_sand";
15 const oGrapeBush = "gaia/flora_bush_grapes";
16 const oCamel = "gaia/fauna_camel";
17 const oGazelle = "gaia/fauna_gazelle";
18 const oGoat = "gaia/fauna_goat";
19 const oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry";
20 const oStoneSmall = "gaia/geology_stone_desert_small";
21 const oMetalLarge = "gaia/geology_metal_desert_slabs";
22 const oDatePalm = "gaia/flora_tree_date_palm";
23 const oSDatePalm = "gaia/flora_tree_cretan_date_palm_short";
24 const oWood = "gaia/special_treasure_wood";
25 const oFood = "gaia/special_treasure_food_bin";
27 const aBush1 = "actor|props/flora/bush_desert_a.xml";
28 const aBush2 = "actor|props/flora/bush_desert_dry_a.xml";
29 const aBush3 = "actor|props/flora/bush_medit_sm_dry.xml";
30 const aBush4 = "actor|props/flora/plant_desert_a.xml";
31 const aDecorativeRock = "actor|geology/stone_desert_med.xml";
33 // terrain + entity (for painting)
34 const pForest = [tLush + TERRAIN_SEPARATOR + oDatePalm, tLush + TERRAIN_SEPARATOR + oSDatePalm, tLush];
38 const numPlayers = getNumPlayers();
39 const mapSize = getMapSize();
41 var clPlayer = createTileClass();
42 var clForest = createTileClass();
43 var clWater = createTileClass();
44 var clDirt = createTileClass();
45 var clRock = createTileClass();
46 var clMetal = createTileClass();
47 var clFood = createTileClass();
48 var clBaseResource = createTileClass();
49 var clGrass = createTileClass();
50 var clPond = createTileClass();
51 var clTreasure = createTileClass();
53 var [playerIDs, playerX, playerZ, playerAngle] = radialPlayerPlacement();
55 for (var i = 0; i < numPlayers; i++)
57 var id = playerIDs[i];
58 log("Creating base for player " + id + "...");
60 var radius = scaleByMapSize(15,25);
64 // get the x and z in tiles
65 var fx = fractionToTiles(playerX[i]);
66 var fz = fractionToTiles(playerZ[i]);
69 addToClass(ix, iz, clPlayer);
71 // create the city patch
72 var cityRadius = radius/3;
73 var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
74 var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
75 createArea(placer, painter, null);
77 placeCivDefaultEntities(fx, fz, id);
79 placeDefaultChicken(fx, fz, clBaseResource);
81 // create berry bushes
82 var bbAngle = randFloat(0, TWO_PI);
84 var bbX = round(fx + bbDist * cos(bbAngle));
85 var bbZ = round(fz + bbDist * sin(bbAngle));
86 var group = new SimpleGroup(
87 [new SimpleObject(oGrapeBush, 5,5, 0,3)],
88 true, clBaseResource, bbX, bbZ
90 createObjectGroup(group, 0);
94 while(abs(mAngle - bbAngle) < PI/3)
96 mAngle = randFloat(0, TWO_PI);
98 var mDist = radius - 5;
99 var mX = round(fx + mDist * cos(mAngle));
100 var mZ = round(fz + mDist * sin(mAngle));
101 group = new SimpleGroup(
102 [new SimpleObject(oMetalLarge, 1,1, 0,0)],
103 true, clBaseResource, mX, mZ
105 createObjectGroup(group, 0);
107 // create stone mines
108 mAngle += randFloat(PI/8, PI/4);
109 mX = round(fx + mDist * cos(mAngle));
110 mZ = round(fz + mDist * sin(mAngle));
111 group = new SimpleGroup(
112 [new SimpleObject(oStoneLarge, 1,1, 0,2)],
113 true, clBaseResource, mX, mZ
115 createObjectGroup(group, 0);
116 var hillSize = PI * radius * radius;
117 // create starting trees
118 var num = floor(hillSize / 100);
119 var tAngle = randFloat(-PI/3, 4*PI/3);
121 var tX = round(fx + tDist * cos(tAngle));
122 var tZ = round(fz + tDist * sin(tAngle));
123 group = new SimpleGroup(
124 [new SimpleObject(oSDatePalm, num, num, 0,5)],
125 false, clBaseResource, tX, tZ
127 createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
129 placeDefaultDecoratives(fx, fz, aBush1, clBaseResource, radius);
134 log("Creating oases...");
135 for (let i = 0; i < numPlayers; ++i)
137 new ClumpPlacer(diskArea(scaleByMapSize(16, 60)) * 0.185,
141 mapSize * (0.5 + 0.18 * Math.cos(playerAngle[i]) + scaleByMapSize(1, 4) * Math.cos(playerAngle[i]) / 100),
142 mapSize * (0.5 + 0.18 * Math.sin(playerAngle[i]) + scaleByMapSize(1, 4) * Math.sin(playerAngle[i]) / 100)),
145 [tSLush ,[tLush, pForest], [tLush, pForest], tShore, tShore, tWaterDeep],
147 new SmoothElevationPainter(ELEVATION_MODIFY, -3, 10),
153 log("Creating grass patches...");
154 for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)])
156 new ClumpPlacer(size, 0.3, 0.06, 0.5),
159 [[tDirt1, tSandDunes], [tSandDunes, tDirt2], [tDirt2, tDirt1]],
164 avoidClasses(clForest, 0, clGrass, 5, clPlayer, 0, clWater, 1, clDirt, 5),
165 scaleByMapSize(15, 45));
168 log("Creating dirt patches...");
169 for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)])
171 new ClumpPlacer(size, 0.3, 0.06, 0.5),
174 [[tDirt2, tDirtCracks], [tDirt2, tFineSand], [tDirtCracks, tFineSand]],
179 avoidClasses(clForest, 0, clDirt, 5, clPlayer, 0, clWater, 1, clGrass, 5),
180 scaleByMapSize(15, 45));
183 log("Creating stone mines...");
184 var group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
185 createObjectGroupsDeprecated(group, 0,
186 avoidClasses(clForest, 1, clPlayer, 26, clRock, 10, clWater, 1),
187 2*scaleByMapSize(4,16), 100
190 log("Creating small stone quarries...");
191 group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
192 createObjectGroupsDeprecated(group, 0,
193 avoidClasses(clForest, 1, clPlayer, 26, clRock, 10, clWater, 1),
194 2*scaleByMapSize(4,16), 100
197 log("Creating metal mines...");
198 group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
199 createObjectGroupsDeprecated(group, 0,
200 avoidClasses(clForest, 1, clPlayer, 26, clMetal, 10, clRock, 5, clWater, 1),
201 2*scaleByMapSize(4,16), 100
204 log("Creating small decorative rocks...");
205 group = new SimpleGroup(
206 [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
209 createObjectGroupsDeprecated(
211 avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clPond, 1),
212 scaleByMapSize(16, 262), 50
215 log("Creating shrubs...");
216 group = new SimpleGroup(
217 [new SimpleObject(aBush2, 1,2, 0,1), new SimpleObject(aBush1, 1,3, 0,2), new SimpleObject(aBush4, 1,2, 0,1), new SimpleObject(aBush3, 1,3, 0,2)],
220 createObjectGroupsDeprecated(
222 avoidClasses(clWater, 1, clPlayer, 0, clPond, 1),
223 scaleByMapSize(10, 100), 50
226 log("Creating small decorative rocks on mines...");
227 group = new SimpleGroup(
228 [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
231 createObjectGroupsDeprecated(
233 stayClasses(clRock, 0),
234 5*scaleByMapSize(16, 262), 50
237 group = new SimpleGroup(
238 [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
241 createObjectGroupsDeprecated(
243 stayClasses(clMetal, 0),
244 5*scaleByMapSize(16, 262), 50
247 log("Creating gazelles...");
248 group = new SimpleGroup([new SimpleObject(oGazelle, 5,7, 0,4)], true, clFood);
249 createObjectGroupsDeprecated(group, 0,
250 borderClasses(clWater, 8, 5),
251 6*scaleByMapSize(5,20), 50
254 log("Creating goats...");
255 group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood);
256 createObjectGroupsDeprecated(group, 0,
257 borderClasses(clWater, 8, 5),
258 5*scaleByMapSize(5,20), 50
261 log("Creating treasures...");
262 group = new SimpleGroup([new SimpleObject(oFood, 1,1, 0,2)], true, clTreasure);
263 createObjectGroupsDeprecated(group, 0,
264 borderClasses(clWater, 8, 5),
265 3*scaleByMapSize(5,20), 50
268 group = new SimpleGroup([new SimpleObject(oWood, 1,1, 0,2)], true, clTreasure);
269 createObjectGroupsDeprecated(group, 0,
270 borderClasses(clWater, 8, 5),
271 3*scaleByMapSize(5,20), 50
274 log("Creating camels...");
275 group = new SimpleGroup([new SimpleObject(oCamel, 2,4, 0,2)], true, clFood);
276 createObjectGroupsDeprecated(group, 0,
277 borderClasses(clWater, 14, 5),
278 5*scaleByMapSize(5,20), 50
282 setSunColor(0.746, 0.718, 0.539);
283 setWaterColor(0, 0.227, 0.843);
284 setWaterTint(0, 0.545, 0.859);
285 setWaterWaviness(1.0);
286 setWaterType("clap");
287 setWaterMurkiness(0.5);