1 RMS.LoadLibrary("rmgen");
2 RMS.LoadLibrary("rmbiome");
6 const tMainTerrain = g_Terrains.mainTerrain;
7 const tForestFloor1 = g_Terrains.forestFloor1;
8 const tForestFloor2 = g_Terrains.forestFloor2;
9 const tCliff = g_Terrains.cliff;
10 const tHill = g_Terrains.hill;
11 const tTier1Terrain = g_Terrains.tier1Terrain;
12 const tTier2Terrain = g_Terrains.tier2Terrain;
13 const tTier3Terrain = g_Terrains.tier3Terrain;
14 const tTier4Terrain = g_Terrains.tier4Terrain;
16 const oTree1 = g_Gaia.tree1;
17 const oTree2 = g_Gaia.tree2;
18 const oTree3 = g_Gaia.tree3;
19 const oTree4 = g_Gaia.tree4;
20 const oTree5 = g_Gaia.tree5;
22 const aGrass = g_Decoratives.grass;
23 const aGrassShort = g_Decoratives.grassShort;
24 const aRockLarge = g_Decoratives.rockLarge;
25 const aRockMedium = g_Decoratives.rockMedium;
26 const aBushMedium = g_Decoratives.bushMedium;
27 const aBushSmall = g_Decoratives.bushSmall;
28 const aWaypointFlag = "actor|props/special/common/waypoint_flag.xml";
30 const pForest1 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2];
31 const pForest2 = [tForestFloor1 + TERRAIN_SEPARATOR + oTree4, tForestFloor1 + TERRAIN_SEPARATOR + oTree5, tForestFloor1];
33 const oTreasureSeeker = "skirmish/units/default_support_female_citizen";
35 const triggerPointAttacker = "trigger/trigger_point_A";
36 const triggerPointTreasures = [
37 "trigger/trigger_point_B",
38 "trigger/trigger_point_C",
39 "trigger/trigger_point_D"
44 var numPlayers = getNumPlayers();
45 var mapSize = getMapSize();
46 var mapArea = getMapArea();
47 var mapCenter = getMapCenter();
49 var clPlayer = createTileClass();
50 var clHill = createTileClass();
51 var clForest = createTileClass();
52 var clDirt = createTileClass();
53 var clBaseResource = createTileClass();
54 var clLand = createTileClass();
55 var clWomen = createTileClass();
57 initTerrain(tMainTerrain);
59 // Create the main treasure area in the middle of the map
61 new ClumpPlacer(mapArea * scaleByMapSize(0.065, 0.09), 0.7, 0.1, 10, mapCenter.x, mapCenter.y),
63 new LayeredPainter([tMainTerrain, tMainTerrain], [3]),
64 new SmoothElevationPainter(ELEVATION_SET, 3, 3),
69 var [playerIDs, playerX, playerZ, playerAngle, startAngle] = radialPlayerPlacement(0.3);
70 var [halfwayX, halfwayZ] = distributePointsOnCircle(numPlayers, startAngle, fractionToTiles(0.375), mapCenter.x, mapCenter.y);
71 var [attackerX, attackerZ] = distributePointsOnCircle(numPlayers, startAngle, fractionToTiles(0.45), mapCenter.x, mapCenter.y);
72 var [passageX, passageZ] = distributePointsOnCircle(numPlayers, startAngle + Math.PI / numPlayers, fractionToTiles(0.5), mapCenter.x, mapCenter.y);
74 log("Creating player bases and attacker points...");
75 for (let i = 0; i < numPlayers; ++i)
77 let fx = fractionToTiles(playerX[i]);
78 let fz = fractionToTiles(playerZ[i]);
80 placeStartingEntities(fx, fz, playerIDs[i], getStartingEntities(playerIDs[i] - 1).filter(ent =>
81 ent.Template.indexOf("civil_centre") != -1 || ent.Template.indexOf("infantry") != -1));
83 placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, scaleByMapSize(15, 25));
85 log("Creating passage separating players...");
87 new PathPlacer(mapCenter.x, mapCenter.y, passageX[i], passageZ[i], scaleByMapSize(14, 24), 0.4, scaleByMapSize(3, 9), 0.2, 0.05),
89 new LayeredPainter([tMainTerrain, tMainTerrain], [1]),
90 new SmoothElevationPainter(ELEVATION_SET, 3, 4)
93 log("Placing treasure seeker woman...");
94 let femaleLocation = getTIPIADBON([fx, fz], [mapCenter.x, mapCenter.y], [-3 , 3.5], 1, 3);
95 placeObject(femaleLocation[0], femaleLocation[1], oTreasureSeeker, playerIDs[i], playerAngle[i] + Math.PI);
96 addToClass(Math.floor(femaleLocation[0]), Math.floor(femaleLocation[1]), clWomen);
98 log("Placing attacker spawn point....");
99 placeObject(attackerX[i], attackerZ[i], aWaypointFlag, 0, Math.PI / 2);
100 placeObject(attackerX[i], attackerZ[i], triggerPointAttacker, playerIDs[i], Math.PI / 2);
102 log("Preventing mountains in the area between player and attackers...");
103 addCivicCenterAreaToClass(Math.round(fx), Math.round(fz), clPlayer);
104 addToClass(Math.round(attackerX[i]), Math.round(attackerZ[i]), clPlayer);
105 addToClass(Math.round(halfwayX[i]), Math.round(halfwayZ[i]), clPlayer);
109 paintTerrainBasedOnHeight(3.12, 29, 1, tCliff);
110 paintTileClassBasedOnHeight(3.12, 29, 1, clHill);
112 for (let triggerPointTreasure of triggerPointTreasures)
113 createObjectGroupsDeprecated(
114 new SimpleGroup([new SimpleObject(triggerPointTreasure, 1, 1, 0, 0)], true, clWomen),
116 [avoidClasses(clForest, 5, clPlayer, 5, clHill, 5), stayClasses(clLand, 5)],
117 scaleByMapSize(40, 140), 100
121 createBumps(stayClasses(clLand, 5));
123 var [forestTrees, stragglerTrees] = getTreeCounts(...rBiomeTreeCount(1));
125 [tMainTerrain, tForestFloor1, tForestFloor2, pForest1, pForest2],
126 [avoidClasses(clPlayer, 20, clForest, 5, clHill, 0, clBaseResource,2, clWomen, 5), stayClasses(clLand, 4)],
133 [tMainTerrain, tCliff, tHill],
134 [avoidClasses(clPlayer, 20, clHill, 5, clBaseResource, 3, clWomen, 5), stayClasses(clLand, 5)],
136 scaleByMapSize(10, 60) * numPlayers);
140 [avoidClasses(clPlayer, 20, clHill, 5, clBaseResource, 3, clWomen, 5), stayClasses(clLand, 5)],
142 scaleByMapSize(10, 60) * numPlayers);
146 [tCliff, tCliff, tHill],
147 avoidClasses(clPlayer, 20, clHill, 5, clBaseResource, 3, clWomen, 5, clLand, 5),
149 scaleByMapSize(15, 90) * numPlayers,
158 log("Creating dirt patches...");
159 createLayeredPatches(
160 [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)],
161 [[tMainTerrain, tTier1Terrain], [tTier1Terrain, tTier2Terrain], [tTier2Terrain, tTier3Terrain]],
163 [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12, clWomen, 5), stayClasses(clLand, 5)],
164 scaleByMapSize(15, 45),
167 log("Creating grass patches...");
169 [scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)],
171 [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12, clWomen, 5), stayClasses(clLand, 5)],
172 scaleByMapSize(15, 45),
176 if (currentBiome() == "tropic")
181 [new SimpleObject(aRockMedium, 1, 3, 0, 1)],
182 [new SimpleObject(aRockLarge, 1, 2, 0, 1), new SimpleObject(aRockMedium, 1, 3, 0, 2)],
183 [new SimpleObject(aGrassShort, 1, 2, 0, 1, -PI/8, PI/8)],
184 [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)],
185 [new SimpleObject(aBushMedium, 1, 2, 0, 2), new SimpleObject(aBushSmall, 2, 4, 0, 2)]
188 scaleByMapSize(16, 262),
189 scaleByMapSize(8, 131),
190 planetm * scaleByMapSize(13, 200),
191 planetm * scaleByMapSize(13, 200),
192 planetm * scaleByMapSize(13, 200)
194 [avoidClasses(clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 5)]
197 createStragglerTrees(
198 [oTree1, oTree2, oTree4, oTree3],
199 [avoidClasses(clForest, 7, clHill, 1, clPlayer, 9), stayClasses(clLand, 7)],