Index: ps/trunk/binaries/data/mods/public/maps/random/the_nile.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/the_nile.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/the_nile.json (revision 11137) @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "The Nile", + "Script" : "the_nile.js", + "Description" : "A calm wide river divides the map into northern and southern parts.", + "BaseTerrain" : ["desert_sand_dunes_100"], + "BaseHeight" : 1, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/latium.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/latium.js (revision 11136) +++ ps/trunk/binaries/data/mods/public/maps/random/latium.js (revision 11137) @@ -1,659 +1,658 @@ RMS.LoadLibrary("rmgen"); const WATER_WIDTH = 0.1; // terrain textures const tOceanDepths = "medit_sea_depths"; const tOceanRockDeep = "medit_sea_coral_deep"; const tOceanRockShallow = "medit_rocks_wet"; const tOceanCoral = "medit_sea_coral_plants"; const tBeachWet = "medit_sand_wet"; const tBeachDry = "medit_sand"; const tBeachGrass = "medit_rocks_grass"; const tBeachCliff = "medit_dirt"; const tCity = "medit_city_tile"; const tGrassDry = ["medit_grass_field_brown", "medit_grass_field_dry", "medit_grass_field_b"]; const tGrass = ["medit_grass_field_dry", "medit_grass_field_brown", "medit_grass_field_b"]; const tGrassLush = ["grass_temperate_dry_tufts", "medit_grass_flowers"]; const tGrassShrubs = ["medit_grass_shrubs", "medit_grass_flowers"]; const tGrassRock = ["medit_rocks_grass"]; const tDirt = "medit_dirt"; const tDirtGrass = "medit_dirt_b"; const tDirtCliff = "medit_cliff_italia"; const tGrassCliff = "medit_cliff_italia_grass"; const tCliff = ["medit_cliff_italia", "medit_cliff_italia", "medit_cliff_italia_grass"]; const tForestFloor = "medit_grass_wild"; // gaia entities const oBeech = "gaia/flora_tree_euro_beech"; const oBerryBush = "gaia/flora_bush_berry"; const oCarob = "gaia/flora_tree_carob"; const oCypress1 = "gaia/flora_tree_cypress"; const oCypress2 = "gaia/flora_tree_cypress"; const oLombardyPoplar = "gaia/flora_tree_poplar_lombardy"; const oOak = "gaia/flora_tree_oak"; const oPalm = "gaia/flora_tree_medit_fan_palm"; const oPine = "gaia/flora_tree_aleppo_pine"; const oPoplar = "gaia/flora_tree_poplar"; const oChicken = "gaia/fauna_chicken"; const oDeer = "gaia/fauna_deer"; const oFish = "gaia/fauna_fish"; const oSheep = "gaia/fauna_sheep"; const oStoneLarge = "gaia/geology_stonemine_medit_quarry"; const oStoneSmall = "gaia/geology_stone_mediterranean"; const oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; // decorative props const aBushLargeDry = "actor|props/flora/bush_medit_la_dry.xml"; const aBushLarge = "actor|props/flora/bush_medit_la.xml"; const aBushMedDry = "actor|props/flora/bush_medit_me_dry.xml"; const aBushMed = "actor|props/flora/bush_medit_me.xml"; const aBushSmall = "actor|props/flora/bush_medit_sm.xml"; const aBushSmallDry = "actor|props/flora/bush_medit_sm_dry.xml"; const aGrass = "actor|props/flora/grass_soft_large_tall.xml"; const aGrassDry = "actor|props/flora/grass_soft_dry_large_tall.xml"; const aRockLarge = "actor|geology/stone_granite_large.xml"; const aRockMed = "actor|geology/stone_granite_med.xml"; const aRockSmall = "actor|geology/stone_granite_small.xml"; const aWaterLog = "actor|props/flora/water_log.xml"; // terrain + entity (for painting) var pPalmForest = [tForestFloor+TERRAIN_SEPARATOR+oPalm, tGrass]; var pPineForest = [tForestFloor+TERRAIN_SEPARATOR+oPine, tGrass]; var pPoplarForest = [tForestFloor+TERRAIN_SEPARATOR+oLombardyPoplar, tGrass]; var pMainForest = [tForestFloor+TERRAIN_SEPARATOR+oCarob, tForestFloor+TERRAIN_SEPARATOR+oBeech, tGrass, tGrass]; const BUILDING_ANGlE = 0.75*PI; // initialize map log("Initializing map..."); InitMap(); var numPlayers = getNumPlayers(); var mapSize = getMapSize(); var mapArea = mapSize*mapSize; // Create classes var clWater = createTileClass(); var clCliff = createTileClass(); var clForest = createTileClass(); var clMetal = createTileClass(); var clStone = createTileClass(); var clFood = createTileClass(); var clPlayer = createTileClass(); var clBaseResource = createTileClass(); var clSettlement = createTileClass(); // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = shuffleArray(playerIDs); // Place players log("Creating players..."); var playerX = new Array(numPlayers+1); var playerZ = new Array(numPlayers+1); var numLeftPlayers = ceil(numPlayers/2); for (var i = 1; i <= numLeftPlayers; i++) { playerX[i] = 0.28 + randFloat(-0.01, 0.01); playerZ[i] = (0.5+i-1)/numLeftPlayers + randFloat(-0.01, 0.01); } for (var i = numLeftPlayers+1; i <= numPlayers; i++) { playerX[i] = 0.72 + randFloat(-0.01, 0.01); playerZ[i] = (0.5+i-numLeftPlayers-1)/numLeftPlayers + randFloat(-0.01, 0.01); } function distanceToPlayers(x, z) { var r = 10000; for (var i = 1; i <= numPlayers; i++) { var dx = x - playerX[i]; var dz = z - playerZ[i]; r = min(r, dx*dx + dz*dz); } return sqrt(r); } function playerNearness(x, z) { var d = fractionToTiles(distanceToPlayers(x,z)); if (d < 13) { return 0; } else if (d < 19) { return (d-13)/(19-13); } else { return 1; } } // Paint elevation log("Painting elevation..."); var noise0 = new Noise2D(scaleByMapSize(4, 16)); var noise1 = new Noise2D(scaleByMapSize(8, 32)); var noise2 = new Noise2D(scaleByMapSize(15, 60)); var noise2a = new Noise2D(scaleByMapSize(20, 80)); var noise2b = new Noise2D(scaleByMapSize(35, 140)); var noise3 = new Noise2D(scaleByMapSize(4, 16)); var noise4 = new Noise2D(scaleByMapSize(6, 24)); var noise5 = new Noise2D(scaleByMapSize(11, 44)); for (var ix = 0; ix <= mapSize; ix++) { for (var iz = 0; iz <= mapSize; iz++) { var x = ix / (mapSize + 1.0); var z = iz / (mapSize + 1.0); var pn = playerNearness(x, z); var h = 0; var distToWater = 0; h = 32 * (x - 0.5); // add the rough shape of the water if (x < WATER_WIDTH) { h = max(-16.0, -28.0*(WATER_WIDTH-x)/WATER_WIDTH); } else if (x > 1.0-WATER_WIDTH) { h = max(-16.0, -28.0*(x-(1.0-WATER_WIDTH))/WATER_WIDTH); } else { distToWater = (0.5 - WATER_WIDTH - abs(x-0.5)); var u = 1 - abs(x-0.5) / (0.5-WATER_WIDTH); h = 12*u; } // add some base noise var baseNoise = 16*noise0.get(x,z) + 8*noise1.get(x,z) + 4*noise2.get(x,z) - (16+8+4)/2; if ( baseNoise < 0 ) { baseNoise *= pn; baseNoise *= max(0.1, distToWater / (0.5-WATER_WIDTH)); } var oldH = h; h += baseNoise; // add some higher-frequency noise on land if ( oldH > 0 ) { h += (0.4*noise2a.get(x,z) + 0.2*noise2b.get(x,z)) * min(oldH/10.0, 1.0); } // create cliff noise if ( h > -10 ) { var cliffNoise = (noise3.get(x,z) + 0.5*noise4.get(x,z)) / 1.5; if (h < 1) { var u = 1 - 0.3*((h-1)/-10); cliffNoise *= u; } cliffNoise += 0.05 * distToWater / (0.5 - WATER_WIDTH); if (cliffNoise > 0.6) { var u = 0.8 * (cliffNoise - 0.6); cliffNoise += u * noise5.get(x,z); cliffNoise /= (1 + u); } cliffNoise -= 0.59; cliffNoise *= pn; if (cliffNoise > 0) { h += 19 * min(cliffNoise, 0.045) / 0.045; } } // set the height setHeight(ix, iz, h); } } RMS.SetProgress(15); // Paint base terrain log("Painting terrain..."); var noise6 = new Noise2D(scaleByMapSize(10, 40)); var noise7 = new Noise2D(scaleByMapSize(20, 80)); var noise8 = new Noise2D(scaleByMapSize(13, 52)); var noise9 = new Noise2D(scaleByMapSize(26, 104)); var noise10 = new Noise2D(scaleByMapSize(50, 200)); for (var ix = 0; ix < mapSize; ix++) { for (var iz = 0; iz < mapSize; iz++) { var x = ix / (mapSize + 1.0); var z = iz / (mapSize + 1.0); var pn = playerNearness(x, z); // get heights of surrounding vertices var h00 = getHeight(ix, iz); var h01 = getHeight(ix, iz+1); var h10 = getHeight(ix+1, iz); var h11 = getHeight(ix+1, iz+1); // find min and max height var maxH = Math.max(h00, h01, h10, h11); var minH = Math.min(h00, h01, h10, h11); var diffH = maxH - minH; // figure out if we're at the top of a cliff using min adjacent height var minAdjHeight = minH; if (maxH > 15) { var maxNx = min(ix+2, mapSize); var maxNz = min(iz+2, mapSize); for (var nx = max(ix-1, 0); nx <= maxNx; nx++) { for (var nz = max(iz-1, 0); nz <= maxNz; nz++) { minAdjHeight = min(minAdjHeight, getHeight(nx, nz)); } } } // choose a terrain based on elevation var t = tGrass; // water if (maxH < -12) { t = tOceanDepths; } else if (maxH < -8.8) { t = tOceanRockDeep; } else if (maxH < -4.7) { t = tOceanCoral; } else if (maxH < -2.8) { t = tOceanRockShallow; } else if (maxH < 0.9 && minH < 0.35) { t = tBeachWet; } else if (maxH < 1.5 && minH < 0.9) { t = tBeachDry; } else if (maxH < 2.3 && minH < 1.3) { t = tBeachGrass; } if (minH < 0) { addToClass(ix, iz, clWater); } // cliffs if (diffH > 2.9 && minH > -7) { t = tCliff; addToClass(ix, iz, clCliff); } else if ((diffH > 2.5 && minH > -5) || ((maxH - minAdjHeight) > 2.9 && minH > 0) ) { if (minH < -1) t = tCliff; else if (minH < 0.5) t = tBeachCliff; else t = [tDirtCliff, tGrassCliff, tGrassCliff, tGrassRock, tCliff]; addToClass(ix, iz, clCliff); } if (minH >= 7) { addToClass(ix, iz, clCliff); } // forests if (getHeight(ix, iz) <11){ if (diffH < 2 && minH > 1) { var forestNoise = (noise6.get(x,z) + 0.5*noise7.get(x,z)) / 1.5 * pn - 0.59; // Thin out trees a bit if (forestNoise > 0 && randFloat() < 0.5) { if (minH < 11 && minH >= 4) { var typeNoise = noise10.get(x,z); if (typeNoise < 0.43 && forestNoise < 0.05) t = pPoplarForest; else if (typeNoise < 0.63) t = pMainForest; else t = pPineForest; addToClass(ix, iz, clForest); } else if (minH < 4) { t = pPalmForest; addToClass(ix, iz, clForest); } } } } // grass variations if (t == tGrass) { var grassNoise = (noise8.get(x,z) + 0.6*noise9.get(x,z)) / 1.6; if (grassNoise < 0.3) { t = (diffH > 1.2) ? tDirtCliff : tDirt; } else if (grassNoise < 0.34) { t = (diffH > 1.2) ? tGrassCliff : tGrassDry; if (diffH < 0.5 && randFloat() < 0.02) { placeObject(ix+randFloat(), iz+randFloat(), aGrassDry, 0, randFloat(0, TWO_PI)); } } else if (grassNoise > 0.61) { t = (diffH > 1.2 ? tGrassRock : tGrassShrubs); } else { if (diffH < 0.5 && randFloat() < 0.02) { placeObject(ix+randFloat(), iz+randFloat(), aGrass, 0, randFloat(0, TWO_PI)); } } } placeTerrain(ix, iz, t); } } RMS.SetProgress(30); for (var i = 1; i <= numPlayers; i++) { var id = playerIDs[i-1]; log("Creating base for player " + id + "..."); // get fractional locations in tiles var fx = fractionToTiles(playerX[i]); var fz = fractionToTiles(playerZ[i]); var ix = round(fx); var iz = round(fz); addToClass(ix, iz, clPlayer); // create the city patch, flatten area under TC var cityRadius = 11; var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); var painter = new LayeredPainter([tGrass, tCity], [4]); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 5, // elevation 2 // blend radius ); createArea(placer, [painter, elevationPainter], null); // get civ specific starting entities var civEntities = getStartingEntities(id-1); // create the TC var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], true, null, ix, iz ); createObjectGroup(group, id); // create starting units - var uDist = 8; - var uAngle = -BUILDING_ANGlE + randFloat(-PI/8, PI/8); + var uDist = 6; + var uSpace = 2; for (var j = 1; j < civEntities.length; ++j) { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); - var ux = round(fx + uDist * cos(uAngle)); - var uz = round(fz + uDist * sin(uAngle)); - group = new SimpleGroup( // elements (type, min/max count, min/max distance) - [new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))], - true, null, ux, uz - ); - createObjectGroup(group, id); - uAngle += PI/4; + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } } // create animals for (var j = 0; j < 2; ++j) { var aAngle = randFloat(0, TWO_PI); var aDist = 7; var aX = round(fx + aDist * cos(aAngle)); var aZ = round(fz + aDist * sin(aAngle)); group = new SimpleGroup( [new SimpleObject(oChicken, 5,5, 0,3)], true, clBaseResource, aX, aZ ); createObjectGroup(group, 0); } // create starting berry bushes var bbAngle = randFloat(0, TWO_PI); var bbDist = 9; var bbX = round(fx + bbDist * cos(bbAngle)); var bbZ = round(fz + bbDist * sin(bbAngle)); group = new SimpleGroup( [new SimpleObject(oBerryBush, 5,5, 0,2)], true, clBaseResource, bbX, bbZ ); createObjectGroup(group, 0); // create metal mine var mAngle = bbAngle; while(abs(mAngle - bbAngle) < PI/3) { mAngle = randFloat(0, TWO_PI); } var mDist = 12; var mX = round(fx + mDist * cos(mAngle)); var mZ = round(fz + mDist * sin(mAngle)); group = new SimpleGroup( [new SimpleObject(oMetalLarge, 1,1, 0,0)], true, clBaseResource, mX, mZ ); createObjectGroup(group, 0); // create stone mines mAngle += randFloat(PI/8, PI/4); mX = round(fx + mDist * cos(mAngle)); mZ = round(fz + mDist * sin(mAngle)); group = new SimpleGroup( [new SimpleObject(oStoneLarge, 1,1, 0,2)], true, clBaseResource, mX, mZ ); createObjectGroup(group, 0); // create starting straggler trees group = new SimpleGroup( [new SimpleObject(oPalm, 3,3, 7,10)], true, clBaseResource, ix, iz ); createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); } RMS.SetProgress(40); log("Creating bushes..."); // create bushes group = new SimpleGroup( [new SimpleObject(aBushSmall, 0,2, 0,2), new SimpleObject(aBushSmallDry, 0,2, 0,2), new SimpleObject(aBushMed, 0,1, 0,2), new SimpleObject(aBushMedDry, 0,1, 0,2)] ); createObjectGroups(group, 0, avoidClasses(clWater, 4, clCliff, 2), scaleByMapSize(9, 146), 50 ); RMS.SetProgress(45); log("Creating rocks..."); // create rocks group = new SimpleGroup( [new SimpleObject(aRockSmall, 0,3, 0,2), new SimpleObject(aRockMed, 0,2, 0,2), new SimpleObject(aRockLarge, 0,1, 0,2)] ); createObjectGroups(group, 0, avoidClasses(clWater, 2, clCliff, 1), scaleByMapSize(9, 146), 50 ); RMS.SetProgress(50); log("Creating stone mines..."); // create large stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clStone); createObjectGroups(group, 0, [avoidClasses(clWater, 1, clForest, 1, clPlayer, 20, clStone, 15, clCliff, 3)], scaleByMapSize(4,16), 100 ); // create small stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clStone); createObjectGroups(group, 0, [avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clStone, 15, clCliff, 3)], scaleByMapSize(4,16), 100 ); log("Creating metal mines..."); // create large metal quarries group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,2)], true, clMetal); createObjectGroups(group, 0, [avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clMetal, 15, clStone, 5, clCliff, 3), borderClasses(clCliff, 0, 5)], scaleByMapSize(4,16), 100 ); RMS.SetProgress(60); log("Creating straggler trees..."); // create straggler trees var trees = [oCarob, oBeech, oLombardyPoplar, oLombardyPoplar, oPine]; for (var t in trees) { group = new SimpleGroup([new SimpleObject(trees[t], 1,1, 0,1)], true, clForest); createObjectGroups(group, 0, avoidClasses(clWater, 5, clCliff, 4, clForest, 1, clPlayer, 15, clMetal, 1, clStone, 1), scaleByMapSize(2, 38), 50 ); } RMS.SetProgress(70); // create straggler cypresses group = new SimpleGroup( [new SimpleObject(oCypress2, 1,3, 0,3), new SimpleObject(oCypress1, 0,2, 0,2)], true ); createObjectGroups(group, 0, avoidClasses(clWater, 4, clCliff, 4, clForest, 1, clPlayer, 15, clMetal, 1, clStone, 1), scaleByMapSize(5, 75), 50 ); RMS.SetProgress(80); log("Creating sheep..."); // create sheep group = new SimpleGroup([new SimpleObject(oSheep, 2,4, 0,2)], true, clFood); createObjectGroups(group, 0, avoidClasses(clWater, 5, clForest, 1, clCliff, 1, clPlayer, 20, clMetal, 2, clStone, 2, clFood, 8), 3 * numPlayers, 50 ); RMS.SetProgress(85); log("Creating fish..."); // create fish var num = scaleByMapSize(4, 16); var offsetX = mapSize * WATER_WIDTH/2; for (var i = 0; i < num; ++i) { var cX = round(offsetX + offsetX/2 * randFloat(-1, 1)); var cY = round((i + 0.5) * mapSize/num); group = new SimpleGroup([new SimpleObject(oFish, 1,1, 0,1)], true, clFood, cX, cY); createObjectGroup(group, 0); } for (var i = 0; i < num; ++i) { var cX = round(mapSize - offsetX + offsetX/2 * randFloat(-1, 1)); var cY = round((i + 0.5) * mapSize/num); group = new SimpleGroup([new SimpleObject(oFish, 1,1, 0,1)], true, clFood, cX, cY); createObjectGroup(group, 0); } RMS.SetProgress(90); // create deer log("Creating deer..."); group = new SimpleGroup( [new SimpleObject(oDeer, 5,7, 0,4)], true, clFood ); createObjectGroups(group, 0, avoidClasses(clWater, 5, clForest, 1, clCliff, 1, clPlayer, 20, clMetal, 2, clStone, 2, clFood, 8), 3 * numPlayers, 50 ); RMS.SetProgress(95); log("Creating berry bushes..."); // create berry bushes group = new SimpleGroup([new SimpleObject(oBerryBush, 5,7, 0,3)], true, clFood); createObjectGroups(group, 0, avoidClasses(clWater, 5, clForest, 1, clCliff, 1, clPlayer, 20, clMetal, 2, clStone, 2, clFood, 8), 1.5 * numPlayers, 100 ); // Adjust environment setSkySet("sunny"); setWaterMurkiness(0.626953); setWaterShininess(0.732422); setWaterTint(0, 0.501961, 0.501961); setWaterReflectionTint(0.313726, 0.376471, 0.521569); setWaterReflectionTintStrength(0.615234); // Export map data ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/continent.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/continent.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/continent.json (revision 11137) @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Continent", + "Script" : "continent.js", + "Description" : "All players starts on a continent surrounded by water.", + "BaseTerrain" : ["medit_sea_depths"], + "BaseHeight" : -5, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} Index: ps/trunk/binaries/data/mods/public/maps/random/aegean_sea.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/aegean_sea.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/aegean_sea.json (revision 11137) @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Aegean Sea", + "Script" : "aegean_sea.js", + "Description" : "Players start in two sides of a sea with scattered islands", + "BaseTerrain" : ["medit_grass_shrubs", "medit_rocks_grass_shrubs", "medit_rocks_shrubs", "medit_rocks_grass", "medit_shrubs"], + "BaseHeight" : 1, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/rivers.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rivers.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rivers.json (revision 11137) @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Rivers", + "Script" : "rivers.js", + "Description" : "Rivers flow between players and join each other in the center of the map", + "BaseTerrain" : ["temp_grass", "temp_grass_c"], + "BaseHeight" : 1, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/aegean_sea.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/aegean_sea.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/aegean_sea.js (revision 11137) @@ -0,0 +1,586 @@ +RMS.LoadLibrary("rmgen"); + +//TILE_CENTERED_HEIGHT_MAP = true; +function rndRiver(f, seed) +{ + var rndRq = seed; + var rndRw = rndRq; + var rndRe = 0; + var rndRr = f-floor(f); + var rndRa = 0; + for (var rndRx=0; rndRx<=floor(f); rndRx++) + { + rndRw = 10*(rndRw-floor(rndRw)); + } + if (rndRx%2==0) + { + var rndRs = -1; + } + else + { + var rndRs = 1; + } + rndRe = (floor(rndRw))%5; + if (rndRe==0) + { + rndRa = (rndRs)*2.3*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.5); + } + else if (rndRe==1) + { + rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.3)*(rndRr-0.7); + } + else if (rndRe==2) + { + rndRa = (rndRs)*22*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.3)*(rndRr-0.3)*(rndRr-0.8); + } + else if (rndRe==3) + { + rndRa = (rndRs)*180*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.2)*(rndRr-0.4)*(rndRr-0.6)*(rndRr-0.6)*(rndRr-0.8); + } + else if (rndRe==4) + { + rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.7); + } + return rndRa; +} + +const tCity = "medit_city_pavement"; +const tCityPlaza = "medit_city_pavement"; +const tHill = ["medit_grass_shrubs", "medit_rocks_grass_shrubs", "medit_rocks_shrubs", "medit_rocks_grass", "medit_shrubs"]; +const tMainDirt = "medit_dirt"; +const tCliff = "medit_cliff_aegean"; +const tForestFloor = "medit_grass_shrubs"; +const tGrass = "medit_grass_field"; +const tGrassSand50 = "medit_grass_field_a"; +const tGrassSand25 = "medit_grass_field_b"; +const tDirt = "medit_dirt_b"; +const tDirtCracks = "medit_dirt_c"; +const tShore = "medit_sand"; +const tWater = "medit_sand_wet"; + +// gaia entities +const oBerryBush = "gaia/flora_bush_berry"; +const oChicken = "gaia/fauna_chicken"; +const oDeer = "gaia/fauna_deer"; +const oFish = "gaia/fauna_fish"; +const oSheep = "gaia/fauna_sheep"; +const oGoat = "gaia/fauna_goat"; +const oStoneLarge = "gaia/geology_stonemine_medit_quarry"; +const oStoneSmall = "gaia/geology_stone_mediterranean"; +const oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; +const oDatePalm = "gaia/flora_tree_cretan_date_palm_short"; +const oSDatePalm = "gaia/flora_tree_cretan_date_palm_tall"; +const oCarob = "gaia/flora_tree_carob"; +const oFanPalm = "gaia/flora_tree_medit_fan_palm"; +const oPoplar = "gaia/flora_tree_poplar_lombardy"; +const oCypress = "gaia/flora_tree_cypress"; + +// decorative props +const aBush1 = "actor|props/flora/bush_medit_sm.xml"; +const aBush2 = "actor|props/flora/bush_medit_me.xml"; +const aBush3 = "actor|props/flora/bush_medit_la.xml"; +const aBush4 = "actor|props/flora/bush_medit_me.xml"; +const aBushes = [aBush1, aBush2, aBush3, aBush4]; +const aDecorativeRock = "actor|geology/stone_granite_med.xml"; + +// terrain + entity (for painting) +var pForest = [tForestFloor + TERRAIN_SEPARATOR + oDatePalm, tForestFloor + TERRAIN_SEPARATOR + oSDatePalm, tForestFloor]; + +const BUILDING_ANGlE = 0.75*PI; + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clSettlement = createTileClass(); +var clGrass = createTileClass(); +var clHill = createTileClass(); +var clIsland = createTileClass(); + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = shuffleArray(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); +var playerPos = new Array(numPlayers); +var iop = 0; +for (var i = 0; i < numPlayers; i++) +{ + iop = i - 1; + if (!(numPlayers%2)){ + playerPos[i] = ((iop + abs(iop%2))/2 + 1) / ((numPlayers / 2) + 1); + } + else + { + if (iop%2) + { + playerPos[i] = ((iop + abs(iop%2))/2 + 1) / (((numPlayers + 1) / 2) + 1); + } + else + { + playerPos[i] = ((iop)/2 + 1) / ((((numPlayers - 1)) / 2) + 1); + } + } + playerZ[i] = playerPos[i]; + playerX[i] = 0.2 + 0.6*(i%2); +} + +for (var i = 0; i < numPlayers; i++) +{ + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + // some constants + var radius = scaleByMapSize(15,25); + var cliffRadius = 2; + var elevation = 20; + + // get the x and z in tiles + var fx = fractionToTiles(playerX[i]); + var fz = fractionToTiles(playerZ[i]); + var ix = floor(fx); + var iz = floor(fz); + addToClass(ix, iz, clPlayer); + + // create the city patch + var cityRadius = radius/3; + var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); + var painter = new LayeredPainter([tCityPlaza, tCity], [1]); + createArea(placer, painter, null); + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create the TC + var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) + [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], + true, null, ix, iz + ); + createObjectGroup(group, id); + + // create starting units + var uDist = 6; + var uSpace = 2; + for (var j = 1; j < civEntities.length; ++j) + { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; + var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } + } + + // create animals + for (var j = 0; j < 2; ++j) + { + var aAngle = randFloat(0, TWO_PI); + var aDist = 7; + var aX = round(fx + aDist * cos(aAngle)); + var aZ = round(fz + aDist * sin(aAngle)); + group = new SimpleGroup( + [new SimpleObject(oChicken, 5,5, 0,3)], + true, clBaseResource, aX, aZ + ); + createObjectGroup(group, 0); + } + + // create berry bushes + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oBerryBush, 5,5, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // create metal mine + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = radius - 4; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetalLarge, 1,1, 0,0)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create stone mines + mAngle += randFloat(PI/8, PI/4); + mX = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + var hillSize = PI * radius * radius; + // create starting straggler trees + var num = hillSize / 100; + + for (var j = 0; j < num; j++) + { + var tAngle = randFloat(0, TWO_PI); + var tDist = randFloat(6, radius - 2); + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oSDatePalm, 1,3, 0,2)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + } + + // create grass tufts + var num = hillSize / 250; + for (var j = 0; j < num; j++) + { + var gAngle = randFloat(0, TWO_PI); + var gDist = radius - (5 + randInt(7)); + var gX = round(fx + gDist * cos(gAngle)); + var gZ = round(fz + gDist * sin(gAngle)); + group = new SimpleGroup( + [new SimpleObject(aBush1, 2,5, 0,1, -PI/8,PI/8)], + false, clBaseResource, gX, gZ + ); + createObjectGroup(group, 0); + } +} + +RMS.SetProgress(30); + +const WATER_WIDTH = 0.35; +log("Creating sea"); +var theta = randFloat(0, 1); +var theta2 = randFloat(0, 1); +var seed = randFloat(2,3); +var seed2 = randFloat(2,3); +for (ix = 0; ix < mapSize; ix++) +{ + for (iz = 0; iz < mapSize; iz++) + { + var x = ix / (mapSize + 1.0); + var z = iz / (mapSize + 1.0); + + // add the rough shape of the water + var km = 20/scaleByMapSize(35, 160); + var cu = km*rndRiver(theta+z*0.5*(mapSize/64),seed); + var cu2 = km*rndRiver(theta2+z*0.5*(mapSize/64),seed2); + + var fadeDist = 0.05; + + if ((x > cu + 0.5 - WATER_WIDTH/2) && (x < cu + 0.5 + WATER_WIDTH/2)) + { + var h; + if (x < (cu + 0.5 + fadeDist - WATER_WIDTH/2)) + { + h = 1 - 4.0 * (1 - ((cu + 0.5 + fadeDist - WATER_WIDTH/2) - x)/fadeDist); + } + else if (x > (cu2 + 0.5 - fadeDist + WATER_WIDTH/2)) + { + h = 1 - 4.0 * (1 - (x - (cu2 + 0.5 - fadeDist + WATER_WIDTH/2))/fadeDist); + } + else + { + h = -3.0; + } + + if (h < -1.5) + { + placeTerrain(ix, iz, tWater); + } + else + { + placeTerrain(ix, iz, tShore); + } + + setHeight(ix, iz, h); + if (h < 0){ + addToClass(ix, iz, clWater); + } + } + } +} + +RMS.SetProgress(40); +// create bumps +log("Creating bumps..."); +placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); +painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); +createAreas( + placer, + painter, + avoidClasses(clWater, 2, clPlayer, 6), + scaleByMapSize(100, 200) +); + + + +// calculate desired number of trees for map (based on size) +const MIN_TREES = 500; +const MAX_TREES = 2500; +const P_FOREST = 0.5; + +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create forests +log("Creating forests..."); +var num = scaleByMapSize(10,30); +placer = new ClumpPlacer(numForest / num, 0.15, 0.1, 0.5); +painter = new TerrainPainter([tForestFloor, pForest]); +createAreas(placer, [painter, paintClass(clForest)], + avoidClasses(clPlayer, 8, clForest, 10, clWater, 1), + num, 50 +); + +RMS.SetProgress(50); + + +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +var terrainPainter = new LayeredPainter( + [tCliff, tHill], // terrains + [2] // widths +); +var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clPlayer, 16, clForest, 1, clHill, 15, clWater, 3), + scaleByMapSize(1, 4) * numPlayers +); + + + +// create grass patches + +log("Creating grass patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tGrass,tGrassSand50],[tGrassSand50,tGrassSand25], [tGrassSand25,tGrass]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clForest, 0, clGrass, 5, clPlayer, 10, clWater, 1, clDirt, 5, clHill, 1), + scaleByMapSize(15, 45) + ); +} + +RMS.SetProgress(55); + +// create dirt patches +log("Creating dirt patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tDirt,tDirtCracks],[tDirt,tMainDirt], [tDirtCracks,tMainDirt]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clForest, 0, clDirt, 5, clPlayer, 10, clWater, 1, clGrass, 5, clHill, 1), + scaleByMapSize(15, 45) + ); +} + + + +RMS.SetProgress(60); + +// create islands +log("Creating islands..."); +placer = new ClumpPlacer(scaleByMapSize(40, 240), 0.2, 0.1, 1); +var terrainPainter = new LayeredPainter( + [tShore, tHill], // terrains + [2] // widths +); +var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 6, 4); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clIsland)], + [avoidClasses(clPlayer, 8, clForest, 1, clIsland, 15), stayClasses (clWater, 4)], + scaleByMapSize(1, 4) * numPlayers +); + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + stayClasses(clIsland, 4), + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + stayClasses(clIsland, 4), + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + stayClasses(clIsland, 4), + scaleByMapSize(4,16), 100 +); + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + avoidClasses(clForest, 1, clPlayer, 12, clRock, 10, clWater, 1, clHill, 1), + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + avoidClasses(clForest, 1, clPlayer, 12, clRock, 10, clWater, 1, clHill, 1), + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + avoidClasses(clForest, 1, clPlayer, 12, clMetal, 10, clRock, 5, clWater, 1, clHill, 1), + scaleByMapSize(4,16), 100 +); + +RMS.SetProgress(65); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aDecorativeRock, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clHill, 1), + scaleByMapSize(16, 262), 50 +); + + +// create shrubs +log("Creating shrubs..."); +group = new SimpleGroup( + [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)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 1, clPlayer, 0, clHill, 1), + scaleByMapSize(40, 360), 50 +); + +RMS.SetProgress(70); + +// create fish +log("Creating fish..."); +group = new SimpleGroup([new SimpleObject(oFish, 1,3, 2,6)], true, clFood); +createObjectGroups(group, 0, + [avoidClasses(clIsland, 2, clFood, 10), stayClasses(clWater, 5)], + 3*scaleByMapSize(5,20), 50 +); + +// create sheeps +log("Creating sheeps..."); +group = new SimpleGroup([new SimpleObject(oSheep, 5,7, 0,4)], true, clFood); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 10, clHill, 1), + scaleByMapSize(5,20), 50 +); + +// create goats +log("Creating goats..."); +group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 10, clHill, 1), + scaleByMapSize(5,20), 50 +); + +// create deers +log("Creating deers..."); +group = new SimpleGroup([new SimpleObject(oDeer, 2,4, 0,2)], true, clFood); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 10, clHill, 1), + scaleByMapSize(5,20), 50 +); + +RMS.SetProgress(90); + +// create straggler trees +log("Creating straggler trees..."); +var types = [oDatePalm, oSDatePalm, oCarob, oFanPalm, oPoplar, oCypress]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true); + createObjectGroups(group, 0, + avoidClasses(clForest, 0, clWater, 1, clPlayer, 8, clMetal, 1, clHill, 1), + num + ); +} + +log("Creating straggler trees..."); +var types = [oDatePalm, oSDatePalm, oCarob, oFanPalm, oPoplar, oCypress]; // some variation +var num = 10*floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true); + createObjectGroups(group, 0, + stayClasses(clIsland, 4), + num + ); +} + +// Set environment +setSkySet("sunny"); +setSunColour(0.917, 0.828, 0.734); +setWaterColour(0.292, 0.347, 0.691); + +// Export map data +ExportMap(); \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/new_rms_test.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/new_rms_test.js (revision 11136) +++ ps/trunk/binaries/data/mods/public/maps/random/new_rms_test.js (revision 11137) @@ -1,86 +1,85 @@ RMS.LoadLibrary("rmgen"); const BUILDING_ANGlE = 0.75*PI; // initialize map log("Initializing map..."); InitMap(); var numPlayers = getNumPlayers(); var mapSize = getMapSize(); // create tile classes var clPlayer = createTileClass(); var clPath = createTileClass(); var clHill = createTileClass(); var clForest = createTileClass(); var clWater = createTileClass(); var clRock = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = shuffleArray(playerIDs); // place players var playerX = new Array(numPlayers); var playerZ = new Array(numPlayers); var playerAngle = new Array(numPlayers); var startAngle = randFloat() * 2 * PI; for (var i=0; i < numPlayers; i++) { playerAngle[i] = startAngle + i*2*PI/numPlayers; playerX[i] = 0.5 + 0.39*cos(playerAngle[i]); playerZ[i] = 0.5 + 0.39*sin(playerAngle[i]); } for (var i=0; i < numPlayers; i++) { var id = playerIDs[i]; log("Creating base for player " + id + "..."); // get the x and z in tiles var fx = fractionToTiles(playerX[i]); var fz = fractionToTiles(playerZ[i]); var ix = round(fx); var iz = round(fz); // get civ specific starting entities var civEntities = getStartingEntities(id-1); // create the TC var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], true, null, ix, iz ); createObjectGroup(group, id); // create starting units - var uDist = 8; - var uAngle = -BUILDING_ANGlE + randFloat(-PI/8, PI/8); + var uDist = 6; + var uSpace = 2; for (var j = 1; j < civEntities.length; ++j) { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); - var ux = round(fx + uDist * cos(uAngle)); - var uz = round(fz + uDist * sin(uAngle)); - group = new SimpleGroup( // elements (type, min/max count, min/max distance) - [new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))], - true, null, ux, uz - ); - createObjectGroup(group, id); - uAngle += PI/4; + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } } } // Export map data ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/rivers.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rivers.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/rivers.js (revision 11137) @@ -0,0 +1,1060 @@ +RMS.LoadLibrary("rmgen"); + +//very important. DO NOT CHANGE ANYTHING. this is +//rndRiver is a fuction that creates random values useful for making the river jagged. +//it works the same as sin or cos function. the only difference is that it's period is 1 instead of 2*pi +//it needs the "seed" parameter to use it to make random curves that don't get broken. +//seed must be created using randFloat(). or else it won't work +function rndRiver(f, seed) +{ + var rndRq = sqrt(seed); + var rndRw = rndRq; + var rndRe = 0; + var rndRr = f-floor(f); + var rndRa = 0; + for (var rndRx=0; rndRx<=floor(f); rndRx++) + { + rndRw = 10*(rndRw-floor(rndRw)); + } + if (rndRx%2==0) + { + var rndRs = -1; + } + else + { + var rndRs = 1; + } + rndRe = (floor(rndRw))%5; + if (rndRe==0) + { + rndRa = (rndRs)*2.3*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.5); + } + else if (rndRe==1) + { + rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.3)*(rndRr-0.7); + } + else if (rndRe==2) + { + rndRa = (rndRs)*22*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.3)*(rndRr-0.3)*(rndRr-0.8); + } + else if (rndRe==3) + { + rndRa = (rndRs)*180*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.2)*(rndRr-0.4)*(rndRr-0.6)*(rndRr-0.6)*(rndRr-0.8); + } + else if (rndRe==4) + { + rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.7); + } + return rndRa; +} + +//random terrain textures +var rt = randInt(1,7); +//temperate +if (rt == 1){ +var tGrass = ["temp_grass_long_b"]; +var tGrassPForest = "temp_forestfloor_pine"; +var tGrassDForest = "temp_plants_bog"; +var tCliff = ["temp_cliff_a", "temp_cliff_b"]; +var tGrassA = "temp_grass_d"; +var tGrassB = "temp_grass_c"; +var tGrassC = "temp_grass_clovers_2"; +var tHill = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; +var tDirt = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; +var tRoad = "temp_road"; +var tRoadWild = "temp_road_overgrown"; +var tGrassPatch = "temp_grass_plants"; +var tShoreBlend = "temp_mud_plants"; +var tShore = "sand_grass_25"; +var tWater = "medit_sand_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_oak"; +var oOakLarge = "gaia/flora_tree_oak_large"; +var oApple = "gaia/flora_tree_apple"; +var oPine = "gaia/flora_tree_pine"; +var oAleppoPine = "gaia/flora_tree_aleppo_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_deer"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_sheep"; +var oStoneLarge = "gaia/geology_stonemine_medit_quarry"; +var oStoneSmall = "gaia/geology_stone_mediterranean"; +var oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_large_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_large.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/water_lillies.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_medit_me.xml"; +var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; + +// terrain + entity (for painting) + +} +//snowy +else if (rt == 2) +{ +setSunColour(0.550, 0.601, 0.644); // a little darker + +var tGrass = ["polar_snow_b", "snow grass 75", "snow rocks", "snow forest"]; +var tGrassPForest = "polar_tundra_snow"; +var tGrassDForest = "polar_tundra_snow"; +var tCliff = ["polar_cliff_a", "polar_cliff_b"]; +var tGrassA = "snow grass 2"; +var tGrassB = "polar_snow_a"; +var tGrassC = "polar_ice_snow"; +var tHill = ["polar_snow_rocks", "polar_cliff_snow"]; +var tDirt = ["polar_ice_b", "polar_ice_c"]; +var tRoad = "new_alpine_citytile"; +var tRoadWild = "polar_ice_cracked"; +var tGrassPatch = "snow grass 2"; +var tShoreBlend = "polar_ice"; +var tShore = "alpine_shore_rocks_icy"; +var tWater = "alpine_shore_rocks"; + +// gaia entities +var oOak = "gaia/flora_tree_pine_w"; +var oOakLarge = "gaia/flora_tree_pine_w"; +var oApple = "gaia/flora_tree_pine_w"; +var oPine = "gaia/flora_tree_pine_w"; +var oAleppoPine = "gaia/flora_tree_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_muskox"; +var oFish = "gaia/fauna_fish_tuna"; +var oSheep = "gaia/fauna_walrus"; +var oStoneLarge = "gaia/geology_stone_alpine_a"; +var oStoneSmall = "gaia/geology_stone_alpine_a"; +var oMetalLarge = "gaia/geology_metal_alpine"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; +var aReeds = "actor|props/flora/reeds_pond_dry.xml"; +var aLillies = "actor|geology/stone_granite_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; + +// terrain + entity (for painting) + +} +//desert +else if (rt == 3) +{ +setSunColour(0.733, 0.746, 0.574); + +var tGrass = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; +var tGrassPForest = "forestfloor_dirty"; +var tGrassDForest = "desert_forestfloor_palms"; +var tCliff = ["desert_cliff_1", "desert_cliff_2", "desert_cliff_3", "desert_cliff_4", "desert_cliff_5"]; +var tGrassA = ["desert_dirt_persia_1", "desert_dirt_persia_2"]; +var tGrassB = "dirta"; +var tGrassC = "medit_dirt_dry"; +var tHill = ["desert_dirt_rocks_1", "desert_dirt_rocks_2", "desert_dirt_rocks_3"]; +var tDirt = ["desert_lakebed_dry", "desert_lakebed_dry_b"]; +var tRoad = "desert_city_tile"; +var tRoadWild = "desert_city_tile"; +var tGrassPatch = "desert_dirt_rough"; +var tShoreBlend = "desert_shore_stones"; +var tShore = "dirta"; +var tWater = "desert_sand_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_cretan_date_palm_short"; +var oOakLarge = "gaia/flora_tree_cretan_date_palm_tall"; +var oApple = "gaia/flora_tree_fig"; +var oPine = "gaia/flora_tree_dead"; +var oAleppoPine = "gaia/flora_tree_date_palm"; +var oBerryBush = "gaia/flora_bush_grapes"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_camel"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_gazelle"; +var oStoneLarge = "gaia/geology_stonemine_desert_quarry"; +var oStoneSmall = "gaia/geology_stone_desert_small"; +var oMetalLarge = "gaia/geology_metal_desert_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/reeds_pond_lush_b.xml"; +var aRockLarge = "actor|geology/stone_desert_med.xml"; +var aRockMedium = "actor|geology/stone_desert_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; +// terrain + entity (for painting) +} +//alpine +else if (rt == 4) +{ +var tGrass = ["alpine_dirt_grass_50"]; +var tGrassPForest = "alpine_forrestfloor"; +var tGrassDForest = "alpine_forrestfloor"; +var tCliff = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"]; +var tGrassA = "alpine_grass_rocky"; +var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; +var tGrassC = ["alpine_snow_a", "alpine_snow_b"]; +var tHill = "alpine_cliff_snow"; +var tDirt = ["alpine_dirt", "alpine_grass_d"]; +var tRoad = "new_alpine_citytile"; +var tRoadWild = "new_alpine_citytile"; +var tGrassPatch = "new_alpine_grass_a"; +var tShoreBlend = "alpine_shore_rocks"; +var tShore = "alpine_shore_rocks_grass_50"; +var tWater = "alpine_shore_rocks"; + +// gaia entities +var oOak = "gaia/flora_tree_pine"; +var oOakLarge = "gaia/flora_tree_pine"; +var oApple = "gaia/flora_tree_pine"; +var oPine = "gaia/flora_tree_pine"; +var oAleppoPine = "gaia/flora_tree_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_goat"; +var oFish = "gaia/fauna_fish_tuna"; +var oSheep = "gaia/fauna_deer"; +var oStoneLarge = "gaia/geology_stone_alpine_a"; +var oStoneSmall = "gaia/geology_stone_alpine_a"; +var oMetalLarge = "gaia/geology_metal_alpine"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; +var aReeds = "actor|props/flora/reeds_pond_dry.xml"; +var aLillies = "actor|geology/stone_granite_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; + +// terrain + entity (for painting) +} +//medit +else if (rt == 5){ +var tGrass = ["medit_grass_field_a", "medit_grass_field_b"]; +var tGrassPForest = "medit_plants_dirt"; +var tGrassDForest = "medit_grass_shrubs"; +var tCliff = ["medit_cliff_grass", "medit_cliff_greek", "medit_cliff_greek_2", "medit_cliff_aegean", "medit_cliff_italia", "medit_cliff_italia_grass"]; +var tGrassA = "medit_grass_field_b"; +var tGrassB = "medit_grass_field_brown"; +var tGrassC = "medit_grass_field_dry"; +var tHill = ["medit_rocks_grass_shrubs", "medit_rocks_shrubs"]; +var tDirt = ["medit_dirt", "medit_dirt_b"]; +var tRoad = "medit_city_tile"; +var tRoadWild = "medit_city_tile"; +var tGrassPatch = "medit_grass_wild"; +var tShoreBlend = "medit_sand"; +var tShore = "medit_rocks"; +var tWater = "medit_rocks_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_cretan_date_palm_short"; +var oOakLarge = "gaia/flora_tree_medit_fan_palm"; +var oApple = "gaia/flora_tree_apple"; +var oPine = "gaia/flora_tree_cypress"; +var oAleppoPine = "gaia/flora_tree_aleppo_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_deer"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_sheep"; +var oStoneLarge = "gaia/geology_stonemine_medit_quarry"; +var oStoneSmall = "gaia/geology_stone_mediterranean"; +var oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_large_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_large.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_b.xml"; +var aLillies = "actor|props/flora/water_lillies.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_medit_me.xml"; +var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; + +// terrain + entity (for painting) + +} +//savanah +else if (rt == 6) +{ +var tGrass = ["savanna_grass_a", "savanna_grass_b"]; +var tGrassPForest = "savanna_forestfloor_a"; +var tGrassDForest = "savanna_forestfloor_b"; +var tCliff = ["savanna_cliff_a", "savanna_cliff_b"]; +var tGrassA = "savanna_shrubs_a"; +var tGrassB = "savanna_dirt_rocks_b"; +var tGrassC = "dirt_brown_e"; +var tHill = ["savanna_grass_a", "savanna_grass_b"]; +var tDirt = ["savanna_dirt_rocks_b", "dirt_brown_e"]; +var tRoad = "savanna_tile_a"; +var tRoadWild = "savanna_tile_a"; +var tGrassPatch = "savanna_grass_a"; +var tShoreBlend = "savanna_riparian"; +var tShore = "savanna_riparian_bank"; +var tWater = "savanna_riparian_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_baobab"; +var oOakLarge = "gaia/flora_tree_baobab"; +var oApple = "gaia/flora_tree_baobab"; +var oPine = "gaia/flora_tree_baobab"; +var oAleppoPine = "gaia/flora_tree_baobab"; +var oBerryBush = "gaia/flora_bush_grapes"; +var oChicken = "gaia/fauna_chicken"; +var rts = randInt(1,4); +if (rts==1){ +var oDeer = "gaia/fauna_wildebeest"; +} +else if (rts==2) +{ +var oDeer = "gaia/fauna_zebra"; +} +else if (rts==3) +{ +var oDeer = "gaia/fauna_giraffe"; +} +else if (rts==4) +{ +var oDeer = "gaia/fauna_elephant_african_bush"; +} +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_gazelle"; +var oStoneLarge = "gaia/geology_stonemine_desert_quarry"; +var oStoneSmall = "gaia/geology_stone_savanna_small"; +var oMetalLarge = "gaia/geology_metal_savanna_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_savanna.xml"; +var aGrassShort = "actor|props/flora/grass_medit_field.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/reeds_pond_lush_b.xml"; +var aRockLarge = "actor|geology/stone_savanna_med.xml"; +var aRockMedium = "actor|geology/stone_savanna_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_dry_a.xml"; +// terrain + entity (for painting) +} +//tropic +else if (rt == 7){ +var tGrass = ["tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_plants", "tropic_plants", "tropic_plants_b"]; +var tGrassPForest = "tropic_plants_c"; +var tGrassDForest = "tropic_plants_c"; +var tCliff = ["tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a_plants"]; +var tGrassA = "tropic_grass_c"; +var tGrassB = "tropic_grass_plants"; +var tGrassC = "tropic_plants"; +var tHill = ["tropic_cliff_grass"]; +var tDirt = ["tropic_dirt_a", "tropic_dirt_a_plants"]; +var tRoad = "tropic_citytile_a"; +var tRoadWild = "tropic_citytile_plants"; +var tGrassPatch = "tropic_plants_b"; +var tShoreBlend = "temp_mud_plants"; +var tShore = "tropic_dirt_a_plants"; +var tWater = "tropic_mud_a"; + +// gaia entities +var oOak = "gaia/flora_tree_poplar"; +var oOakLarge = "gaia/flora_tree_poplar"; +var oApple = "gaia/flora_tree_poplar"; +var oPine = "gaia/flora_tree_cretan_date_palm_short"; +var oAleppoPine = "gaia/flora_tree_cretan_date_palm_tall"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_deer"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_tiger"; +var oStoneLarge = "gaia/geology_stonemine_tropic_quarry"; +var oStoneSmall = "gaia/geology_stone_tropic_a"; +var oMetalLarge = "gaia/geology_metal_tropic_slabs"; + +// decorative props +var aGrass = "actor|props/flora/plant_tropic_a.xml"; +var aGrassShort = "actor|props/flora/plant_lg.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_b.xml"; +var aLillies = "actor|props/flora/water_lillies.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/plant_tropic_large.xml"; +var aBushSmall = "actor|props/flora/plant_tropic_large.xml"; + +// terrain + entity (for painting) + +} + +var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oOak, tGrassDForest + TERRAIN_SEPARATOR + oOakLarge, tGrassDForest]; +var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest]; +const BUILDING_ANGlE = 0.75*PI; + +// initialize map + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clSettlement = createTileClass(); +var clShallow = createTileClass(); +for (var ix = 0; ix < mapSize; ix++) +{ + for (var iz = 0; iz < mapSize; iz++) + { + var x = ix / (mapSize + 1.0); + var z = iz / (mapSize + 1.0); + placeTerrain(ix, iz, tGrass); + } +} + +var fx = fractionToTiles(0.5); +var fz = fractionToTiles(0.5); +ix = round(fx); +iz = round(fz); + +var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); + +var placer = new ClumpPlacer(mapArea * 0.01 * lSize, 0.7, 0.1, 10, ix, iz); +var terrainPainter = new LayeredPainter( + [tShore, tWater, tWater, tWater], // terrains + [1, 4, 2] // widths +); +var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + -3, // elevation + 4 // blend radius +); +createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = shuffleArray(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); + +var startAngle = randFloat(0, TWO_PI); +for (var i = 0; i < numPlayers; i++) +{ + playerAngle[i] = startAngle + i*TWO_PI/numPlayers; + playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); + playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); +} + +for (var i = 0; i < numPlayers; i++) +{ + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + // some constants + var radius = scaleByMapSize(15,25); + var cliffRadius = 2; + var elevation = 20; + + // get the x and z in tiles + fx = fractionToTiles(playerX[i]); + fz = fractionToTiles(playerZ[i]); + ix = round(fx); + iz = round(fz); + addToClass(ix, iz, clPlayer); + addToClass(ix+5, iz, clPlayer); + addToClass(ix, iz+5, clPlayer); + addToClass(ix-5, iz, clPlayer); + addToClass(ix, iz-5, clPlayer); + + // create the city patch + var cityRadius = radius/3; + placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); + var painter = new LayeredPainter([tRoadWild, tRoad], [1]); + createArea(placer, painter, null); + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create the TC + var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) + [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], + true, null, ix, iz + ); + createObjectGroup(group, id); + + // create starting units + var uDist = 6; + var uSpace = 2; + for (var j = 1; j < civEntities.length; ++j) + { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; + var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } + } + + // create animals + for (var j = 0; j < 2; ++j) + { + var aAngle = randFloat(0, TWO_PI); + var aDist = 7; + var aX = round(fx + aDist * cos(aAngle)); + var aZ = round(fz + aDist * sin(aAngle)); + group = new SimpleGroup( + [new SimpleObject(oChicken, 5,5, 0,3)], + true, clBaseResource, aX, aZ + ); + createObjectGroup(group, 0); + } + + // create berry bushes + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oBerryBush, 5,5, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // create metal mine + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = radius - 4; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetalLarge, 1,1, 0,0)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create stone mines + mAngle += randFloat(PI/8, PI/4); + mX = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + var hillSize = PI * radius * radius; + // create starting straggler trees + var num = hillSize / 100; + for (var j = 0; j < num; j++) + { + var tAngle = randFloat(0, TWO_PI); + var tDist = randFloat(6, radius - 2); + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oOak, 1,3, 0,2)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + } + + // create grass tufts + var num = hillSize / 250; + for (var j = 0; j < num; j++) + { + var gAngle = randFloat(0, TWO_PI); + var gDist = radius - (5 + randInt(7)); + var gX = round(fx + gDist * cos(gAngle)); + var gZ = round(fz + gDist * sin(gAngle)); + group = new SimpleGroup( + [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)], + false, clBaseResource, gX, gZ + ); + createObjectGroup(group, 0); + } +} + +RMS.SetProgress(20); + +//init rivers +var PX = new Array(numPlayers+1); +var PZ = new Array(numPlayers+1); +//isRiver actually tells us if two points must be joined by river +var isRiver = new Array(numPlayers+1); +for (var q=0; q = Math.min(PZ[m],PZ[n]))) + { + //create the deep part of the river + if (dis <= sbms-5){ + if ((sit > shallowpoint[m])&&(sit < shallowpoint[m]+shallowlength[m])) + { + //create the shallow part + var h = -1; + addToClass(ix, iz, clShallow); + } + else + { + var h = -3; + } + var t = tWater; + addToClass(ix, iz, clWater); + } + //creating the rough edges + else if (dis <= sbms) + { + if ((sit > shallowpoint[m])&&(sit < shallowpoint[m]+shallowlength[m])) + { + if (2-(sbms-dis)<-1) + { + //checking if there is shallow water here + var h = -1; + addToClass(ix, iz, clShallow); + } + else + { + var h = 2-(sbms-dis); + } + } + else + { + var h = 2-(sbms-dis); + } + //we must create shore lines for more beautiful terrain + if (sbms-dis<=2) + { + var t = tShore; + } + else + { + var t = tWater; + } + addToClass(ix, iz, clWater); + } + //we don't want to cause problems when river joins sea + if (getHeight(ix, iz)>h) + { + placeTerrain(ix, iz, t); + setHeight(ix, iz, h); + } + } + } + } + } + } +} + +RMS.SetProgress(40); + +// create bumps +log("Creating bumps..."); +placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); +painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); +createAreas( + placer, + painter, + avoidClasses(clWater, 2, clPlayer, 10), + scaleByMapSize(100, 200) +); +if ((rt == 7)||(rt == 5)) +{ + // create river bumbs + log("Creating river bumps..."); + placer = new ClumpPlacer(scaleByMapSize(4, 6), 0.3, 0.06, 1); + painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); + createAreas( + placer, + painter, + stayClasses(clWater, 3), + scaleByMapSize(500, 700) + ); +} +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +terrainPainter = new LayeredPainter( + [tGrass, tCliff, tHill], // terrains + [1, 2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clPlayer, 12, clHill, 15, clWater, 2), + scaleByMapSize(1, 4) * numPlayers +); + + +// calculate desired number of trees for map (based on size) +if (rt == 6) +{ +var MIN_TREES = 200; +var MAX_TREES = 1250; +var P_FOREST = 0.02; +} +else if (rt == 7) +{ +var MIN_TREES = 1000; +var MAX_TREES = 6000; +var P_FOREST = 0.6; +} +else +{ +var MIN_TREES = 500; +var MAX_TREES = 3000; +var P_FOREST = 0.7; +} +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create forests +log("Creating forests..."); +var types = [ + [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]], + [[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]] +]; // some variation + +if (rt == 6) +{ +var size = numForest / (0.5 * scaleByMapSize(2,8) * numPlayers); +} +else +{ +var size = numForest / (scaleByMapSize(2,8) * numPlayers); +} +var num = floor(size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + avoidClasses(clPlayer, 12, clForest, 10, clHill, 0, clWater, 2), + num + ); +} + +RMS.SetProgress(60); + +// create dirt patches +log("Creating dirt patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12), + scaleByMapSize(15, 45) + ); +} + +// create grass patches +log("Creating grass patches..."); +var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new TerrainPainter(tGrassPatch); + createAreas( + placer, + painter, + avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12), + scaleByMapSize(15, 45) + ); +} +RMS.SetProgress(65); + + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1), + scaleByMapSize(4,16), 100 +); + +RMS.SetProgress(70); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockMedium, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), + scaleByMapSize(16, 262), 50 +); + + +// create large decorative rocks +log("Creating large decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), + scaleByMapSize(8, 131), 50 +); + +RMS.SetProgress(75); + +// create deer +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), + 3 * numPlayers, 50 +); + +// create sheep +log("Creating sheep..."); +group = new SimpleGroup( + [new SimpleObject(oSheep, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), + 3 * numPlayers, 50 +); + +// create fish +log("Creating fish..."); +group = new SimpleGroup( + [new SimpleObject(oFish, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clFood, 20), stayClasses(clWater, 6)], + 25 * numPlayers, 60 +); + +RMS.SetProgress(85); + + +// create straggler trees +log("Creating straggler trees..."); +var types = [oOak, oOakLarge, oPine, oApple]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1), + num + ); +} + + +//create small grass tufts +log("Creating small grass tufts..."); +var planetm = 1; +if (rt==7) +{ + planetm = 8; +} +group = new SimpleGroup( + [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0), + planetm * scaleByMapSize(13, 200) +); + +RMS.SetProgress(90); + +// create large grass tufts +log("Creating large grass tufts..."); +group = new SimpleGroup( + [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)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), + planetm * scaleByMapSize(13, 200) +); + +RMS.SetProgress(95); + +// create bushes +log("Creating bushes..."); +group = new SimpleGroup( + [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 2, clHill, 1, clPlayer, 1, clDirt, 1), + planetm * scaleByMapSize(13, 200), 50 +); + +// create shallow flora +log("Creating shallow flora..."); +group = new SimpleGroup( + [new SimpleObject(aLillies, 1,2, 0,2), new SimpleObject(aReeds, 2,4, 0,2)] +); +createObjectGroups(group, 0, + stayClasses(clShallow, 1), + 60 * scaleByMapSize(13, 200), 80 +); + + +rt = randInt(1,3) +if (rt==1){ +setSkySet("cirrus"); +} +else if (rt ==2){ +setSkySet("cumulus"); +} +else if (rt ==3){ +setSkySet("sunny"); +} +setSunRotation(randFloat(0, TWO_PI)); +setSunElevation(randFloat(PI/ 5, PI / 3)); +setWaterTint(0.447, 0.412, 0.322); // muddy brown +setWaterReflectionTint(0.447, 0.412, 0.322); // muddy brown +setWaterMurkiness(1.0); +setWaterReflectionTintStrength(0.677); + +// Export map data + +ExportMap(); \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/snowflake_searocks.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/snowflake_searocks.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/snowflake_searocks.json (revision 11137) @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Snowflake Searocks", + "Script" : "snowflake_searocks.js", + "Description" : "Many small islands connected to each other by narrow passages.", + "BaseTerrain" : ["medit_sea_depths"], + "BaseHeight" : -5, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} Index: ps/trunk/binaries/data/mods/public/maps/random/snowflake_searocks.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/snowflake_searocks.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/snowflake_searocks.js (revision 11137) @@ -0,0 +1 @@ +RMS.LoadLibrary("rmgen"); //random terrain textures var rt = randInt(1,7); //temperate if (rt == 1){ var tGrass = ["temp_grass_long_b"]; var tGrassPForest = "temp_forestfloor_pine"; var tGrassDForest = "temp_plants_bog"; var tCliff = ["temp_cliff_a", "temp_cliff_b"]; var tGrassA = "temp_grass_d"; var tGrassB = "temp_grass_c"; var tGrassC = "temp_grass_clovers_2"; var tHill = ["temp_grass_long_b", "temp_grass_d", "temp_grass_c"]; var tDirt = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; var tRoad = "temp_road"; var tRoadWild = "temp_road_overgrown"; var tGrassPatch = "temp_grass_plants"; var tShoreBlend = "temp_mud_plants"; var tShore = "sand_grass_25"; var tWater = "medit_sand_wet"; // gaia entities var oOak = "gaia/flora_tree_oak"; var oOakLarge = "gaia/flora_tree_oak_large"; var oApple = "gaia/flora_tree_apple"; var oPine = "gaia/flora_tree_pine"; var oAleppoPine = "gaia/flora_tree_aleppo_pine"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_deer"; var oFish = "gaia/fauna_fish"; var oSheep = "gaia/fauna_sheep"; var oStoneLarge = "gaia/geology_stonemine_medit_quarry"; var oStoneSmall = "gaia/geology_stone_mediterranean"; var oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; // decorative props var aGrass = "actor|props/flora/grass_soft_large_tall.xml"; var aGrassShort = "actor|props/flora/grass_soft_large.xml"; var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; var aLillies = "actor|props/flora/pond_lillies_large.xml"; var aRockLarge = "actor|geology/stone_granite_large.xml"; var aRockMedium = "actor|geology/stone_granite_med.xml"; var aBushMedium = "actor|props/flora/bush_medit_me.xml"; var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; // terrain + entity (for painting) } //snowy else if (rt == 2) { setSunColour(0.550, 0.601, 0.644); // a little darker var tGrass = ["polar_snow_b", "snow grass 75", "snow rocks", "snow forest"]; var tGrassPForest = "polar_tundra_snow"; var tGrassDForest = "polar_tundra_snow"; var tCliff = ["polar_cliff_a", "polar_cliff_b"]; var tGrassA = "snow grass 2"; var tGrassB = "polar_snow_a"; var tGrassC = "polar_ice_snow"; var tHill = ["polar_snow_b", "snow grass 75", "snow rocks", "snow forest"]; var tDirt = ["polar_ice_b", "polar_ice_c"]; var tRoad = "new_alpine_citytile"; var tRoadWild = "polar_ice_cracked"; var tGrassPatch = "snow grass 2"; var tShoreBlend = "polar_ice"; var tShore = "snow_glacial_01"; var tWater = "polar_ice_c"; // gaia entities var oOak = "gaia/flora_tree_pine_w"; var oOakLarge = "gaia/flora_tree_pine_w"; var oApple = "gaia/flora_tree_pine_w"; var oPine = "gaia/flora_tree_pine_w"; var oAleppoPine = "gaia/flora_tree_pine"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_muskox"; var oFish = "gaia/fauna_fish_tuna"; var oSheep = "gaia/fauna_walrus"; var oStoneLarge = "gaia/geology_stone_alpine_a"; var oStoneSmall = "gaia/geology_stone_alpine_a"; var oMetalLarge = "gaia/geology_metal_alpine"; // decorative props var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; var aRockLarge = "actor|geology/stone_granite_large.xml"; var aRockMedium = "actor|geology/stone_granite_med.xml"; var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; // terrain + entity (for painting) } //desert else if (rt == 3) { setSunColour(0.733, 0.746, 0.574); var tGrass = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; var tGrassPForest = "forestfloor_dirty"; var tGrassDForest = "desert_forestfloor_palms"; var tCliff = ["desert_cliff_1", "desert_cliff_2", "desert_cliff_3", "desert_cliff_4", "desert_cliff_5"]; var tGrassA = ["desert_dirt_persia_1", "desert_dirt_persia_2"]; var tGrassB = "dirta"; var tGrassC = "medit_dirt_dry"; var tHill = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; var tDirt = ["desert_lakebed_dry", "desert_lakebed_dry_b"]; var tRoad = "desert_city_tile"; var tRoadWild = "desert_city_tile"; var tGrassPatch = "desert_dirt_rough"; var tShoreBlend = "desert_shore_stones"; var tShore = "dirta"; var tWater = "desert_sand_wet"; // gaia entities var oOak = "gaia/flora_tree_cretan_date_palm_short"; var oOakLarge = "gaia/flora_tree_cretan_date_palm_tall"; var oApple = "gaia/flora_tree_fig"; var oPine = "gaia/flora_tree_dead"; var oAleppoPine = "gaia/flora_tree_date_palm"; var oBerryBush = "gaia/flora_bush_grapes"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_camel"; var oFish = "gaia/fauna_fish"; var oSheep = "gaia/fauna_gazelle"; var oStoneLarge = "gaia/geology_stonemine_desert_quarry"; var oStoneSmall = "gaia/geology_stone_desert_small"; var oMetalLarge = "gaia/geology_metal_desert_slabs"; // decorative props var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; var aRockLarge = "actor|geology/stone_desert_med.xml"; var aRockMedium = "actor|geology/stone_desert_med.xml"; var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; // terrain + entity (for painting) } //alpine else if (rt == 4) { var tGrass = ["alpine_dirt_grass_50"]; var tGrassPForest = "alpine_forrestfloor"; var tGrassDForest = "alpine_forrestfloor"; var tCliff = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"]; var tGrassA = "alpine_grass_rocky"; var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; var tGrassC = ["alpine_snow_a", "alpine_snow_b"]; var tHill = ["alpine_dirt_grass_50", "alpine_grass_rocky"]; var tDirt = ["alpine_dirt", "alpine_grass_d"]; var tRoad = "new_alpine_citytile"; var tRoadWild = "new_alpine_citytile"; var tGrassPatch = "new_alpine_grass_a"; var tShoreBlend = "alpine_shore_rocks"; var tShore = "alpine_shore_rocks_grass_50"; var tWater = "alpine_shore_rocks"; // gaia entities var oOak = "gaia/flora_tree_pine"; var oOakLarge = "gaia/flora_tree_pine"; var oApple = "gaia/flora_tree_pine"; var oPine = "gaia/flora_tree_pine"; var oAleppoPine = "gaia/flora_tree_pine"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_goat"; var oFish = "gaia/fauna_fish_tuna"; var oSheep = "gaia/fauna_deer"; var oStoneLarge = "gaia/geology_stone_alpine_a"; var oStoneSmall = "gaia/geology_stone_alpine_a"; var oMetalLarge = "gaia/geology_metal_alpine"; // decorative props var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; var aRockLarge = "actor|geology/stone_granite_large.xml"; var aRockMedium = "actor|geology/stone_granite_med.xml"; var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; // terrain + entity (for painting) } //medit else if (rt == 5){ var tGrass = ["medit_grass_field_a", "medit_grass_field_b"]; var tGrassPForest = "medit_plants_dirt"; var tGrassDForest = "medit_grass_shrubs"; var tCliff = ["medit_cliff_grass", "medit_cliff_greek", "medit_cliff_greek_2", "medit_cliff_aegean", "medit_cliff_italia", "medit_cliff_italia_grass"]; var tGrassA = "medit_grass_field_b"; var tGrassB = "medit_grass_field_brown"; var tGrassC = "medit_grass_field_dry"; var tHill = ["medit_grass_field_a", "medit_grass_field_b"]; var tDirt = ["medit_dirt", "medit_dirt_b"]; var tRoad = "medit_city_tile"; var tRoadWild = "medit_city_tile"; var tGrassPatch = "medit_grass_wild"; var tShoreBlend = "medit_sand"; var tShore = "sand_grass_25"; var tWater = "medit_sand_wet"; // gaia entities var oOak = "gaia/flora_tree_cretan_date_palm_short"; var oOakLarge = "gaia/flora_tree_medit_fan_palm"; var oApple = "gaia/flora_tree_apple"; var oPine = "gaia/flora_tree_cypress"; var oAleppoPine = "gaia/flora_tree_aleppo_pine"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_deer"; var oFish = "gaia/fauna_fish"; var oSheep = "gaia/fauna_sheep"; var oStoneLarge = "gaia/geology_stonemine_medit_quarry"; var oStoneSmall = "gaia/geology_stone_mediterranean"; var oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; // decorative props var aGrass = "actor|props/flora/grass_soft_large_tall.xml"; var aGrassShort = "actor|props/flora/grass_soft_large.xml"; var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; var aLillies = "actor|props/flora/pond_lillies_large.xml"; var aRockLarge = "actor|geology/stone_granite_large.xml"; var aRockMedium = "actor|geology/stone_granite_med.xml"; var aBushMedium = "actor|props/flora/bush_medit_me.xml"; var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; // terrain + entity (for painting) } //savanah else if (rt == 6) { var tGrass = ["savanna_grass_a", "savanna_grass_b"]; var tGrassPForest = "savanna_forestfloor_a"; var tGrassDForest = "savanna_forestfloor_b"; var tCliff = ["savanna_cliff_a", "savanna_cliff_b"]; var tGrassA = "savanna_shrubs_a"; var tGrassB = "savanna_dirt_rocks_b"; var tGrassC = "dirt_brown_e"; var tHill = ["savanna_grass_a", "savanna_grass_b"]; var tDirt = ["savanna_dirt_rocks_b", "dirt_brown_e"]; var tRoad = "savanna_tile_a"; var tRoadWild = "savanna_tile_a"; var tGrassPatch = "savanna_grass_a"; var tShoreBlend = "savanna_riparian"; var tShore = "savanna_riparian_bank"; var tWater = "savanna_riparian_wet"; // gaia entities var oOak = "gaia/flora_tree_baobab"; var oOakLarge = "gaia/flora_tree_baobab"; var oApple = "gaia/flora_tree_baobab"; var oPine = "gaia/flora_tree_baobab"; var oAleppoPine = "gaia/flora_tree_baobab"; var oBerryBush = "gaia/flora_bush_grapes"; var oChicken = "gaia/fauna_chicken"; var rts = randInt(1,4); if (rts==1){ var oDeer = "gaia/fauna_wildebeest"; } else if (rts==2) { var oDeer = "gaia/fauna_zebra"; } else if (rts==3) { var oDeer = "gaia/fauna_giraffe"; } else if (rts==4) { var oDeer = "gaia/fauna_elephant_african_bush"; } var oFish = "gaia/fauna_fish"; var oSheep = "gaia/fauna_gazelle"; var oStoneLarge = "gaia/geology_stonemine_desert_quarry"; var oStoneSmall = "gaia/geology_stone_savanna_small"; var oMetalLarge = "gaia/geology_metal_savanna_slabs"; // decorative props var aGrass = "actor|props/flora/grass_savanna.xml"; var aGrassShort = "actor|props/flora/grass_medit_field.xml"; var aRockLarge = "actor|geology/stone_savanna_med.xml"; var aRockMedium = "actor|geology/stone_savanna_med.xml"; var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; var aBushSmall = "actor|props/flora/bush_dry_a.xml"; // terrain + entity (for painting) } else if (rt == 7){ var tGrass = ["tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_plants", "tropic_plants", "tropic_plants_b"]; var tGrassPForest = "tropic_plants_c"; var tGrassDForest = "tropic_plants_c"; var tCliff = ["tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a_plants"]; var tGrassA = "tropic_grass_c"; var tGrassB = "tropic_grass_plants"; var tGrassC = "tropic_plants"; var tHill = ["tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_plants", "tropic_plants", "tropic_plants_b"]; var tDirt = ["tropic_dirt_a", "tropic_dirt_a_plants"]; var tRoad = "tropic_citytile_a"; var tRoadWild = "tropic_citytile_plants"; var tGrassPatch = "tropic_plants_b"; var tShoreBlend = "temp_mud_plants"; var tShore = "tropic_beach_dry"; var tWater = "tropic_beach_wet"; // gaia entities var oOak = "gaia/flora_tree_poplar"; var oOakLarge = "gaia/flora_tree_poplar"; var oApple = "gaia/flora_tree_poplar"; var oPine = "gaia/flora_tree_cretan_date_palm_short"; var oAleppoPine = "gaia/flora_tree_cretan_date_palm_tall"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_deer"; var oFish = "gaia/fauna_fish"; var oSheep = "gaia/fauna_tiger"; var oStoneLarge = "gaia/geology_stonemine_tropic_quarry"; var oStoneSmall = "gaia/geology_stone_tropic_a"; var oMetalLarge = "gaia/geology_metal_tropic_slabs"; // decorative props var aGrass = "actor|props/flora/plant_tropic_a.xml"; var aGrassShort = "actor|props/flora/plant_lg.xml"; var aReeds = "actor|props/flora/reeds_pond_lush_b.xml"; var aLillies = "actor|props/flora/water_lillies.xml"; var aRockLarge = "actor|geology/stone_granite_large.xml"; var aRockMedium = "actor|geology/stone_granite_med.xml"; var aBushMedium = "actor|props/flora/plant_tropic_large.xml"; var aBushSmall = "actor|props/flora/plant_tropic_large.xml"; // terrain + entity (for painting) } var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oOak, tGrassDForest + TERRAIN_SEPARATOR + oOakLarge, tGrassDForest]; var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest]; const BUILDING_ANGlE = 0.75*PI; // initialize map log("Initializing map..."); InitMap(); var numPlayers = getNumPlayers(); var mapSize = getMapSize(); var mapArea = mapSize*mapSize; log(mapSize); // create tile classes var clPlayer = createTileClass(); var clHill = createTileClass(); var clForest = createTileClass(); var clWater = createTileClass(); var clDirt = createTileClass(); var clRock = createTileClass(); var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); var clSettlement = createTileClass(); var clLand = createTileClass(); //Paint the whole map for (var ix = 0; ix < mapSize; ix++) { for (var iz = 0; iz < mapSize; iz++) { var x = ix / (mapSize + 1.0); var z = iz / (mapSize + 1.0); placeTerrain(ix, iz, tWater); } } var radius = scaleByMapSize(15,30); var cliffRadius = 2; var elevation = 20; // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = shuffleArray(playerIDs); // place players var playerX = new Array(numPlayers); var playerZ = new Array(numPlayers); var playerAngle = new Array(numPlayers); var startAngle = randFloat(0, TWO_PI); for (var i = 0; i < numPlayers; i++) { playerAngle[i] = startAngle + i*TWO_PI/numPlayers; playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); } // Creating other islands var numIslands = 0; //**************************** //---------------------------- //Tiny and Small Size //---------------------------- //**************************** if ((mapSize == 128)||(mapSize == 192)){ //2 PLAYERS //----------------- //----------------- if (numPlayers == 2){ numIslands = 4*numPlayers+1; var IslandX = new Array(numIslands); var IslandZ = new Array(numIslands); var isConnected = new Array(numIslands); for (var q=0; q 4){ numIslands = numPlayers + 1; var IslandX = new Array(numIslands); var IslandZ = new Array(numIslands); var isConnected = new Array(numIslands); for (var q=0; q 4){ numIslands = 2*numPlayers; var IslandX = new Array(numIslands); var IslandZ = new Array(numIslands); var isConnected = new Array(numIslands); for (var q=0; q 383){ //2,3,4,5 PLAYERS //----------------- //----------------- if ((numPlayers == 2)||(numPlayers == 3)||(numPlayers == 4)||(numPlayers == 5)){ numIslands = 4*numPlayers+1; var IslandX = new Array(numIslands); var IslandZ = new Array(numIslands); var isConnected = new Array(numIslands); for (var q=0; q = Math.min(IslandZ[m],IslandZ[n]))) { if (dis < 3){ var h = 20; if (dis < 2) { var t = tHill; } else { var t = tCliff; } addToClass(ix, iz, clLand); } else { var h = 50 - 10 * dis; var t = tCliff; addToClass(ix, iz, clLand); } if (getHeight(ix, iz) cu + 0.75) + { + var h; + if ((z < (cu + 0.75 + fadeDist))&&(z > (cu + 0.75))) + { + h = 1 - 4.0 * (1 - ((cu + 0.75 + fadeDist) - z)/fadeDist); + } + else + { + h = -3.0; + } + + if (h < -1.5) + { + placeTerrain(ix, iz, tWater); + } + else + { + placeTerrain(ix, iz, tShore); + } + + setHeight(ix, iz, h); + if (h < 0){ + addToClass(ix, iz, clWater); + } + } + } +} + +RMS.SetProgress(20); + +// create fish +log("Creating fish..."); + +num = scaleByMapSize(10, 20); +for (i=0; i < num; i++){ +group = new SimpleGroup( + [new SimpleObject(oFish, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clPlayer, 0, clHill, 0, clFood, 3, clHighlands, 0, clFlatlands, 3*scaleByMapSize(1, 4)), + numPlayers, 50 +); +} + +RMS.SetProgress(25); + +// create bumps +log("Creating bumps..."); +placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); +painter = new SmoothElevationPainter(ELEVATION_MODIFY, 4, 3); +createAreas( + placer, + painter, + stayClasses(clHighlands, 1), + scaleByMapSize(300, 600) +); + +RMS.SetProgress(30); + +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +var terrainPainter = new LayeredPainter( + [tCliff, tHill], // terrains + [2] // widths +); +var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clSea, 5, clPlayer, 15, clWater, 5, clHill, 15, clHighlands, 5), + scaleByMapSize(1, 4) * numPlayers +); + +RMS.SetProgress(35); + +// calculate desired number of trees for map (based on size) +const MIN_TREES = 500; +const MAX_TREES = 2500; +const P_FOREST = 0.7; + +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create mainland forests +log("Creating mainland forests..."); +var types = [ + [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]] +]; // some variation +var size = numForest*1.3 / (scaleByMapSize(2,8) * numPlayers); +var num = floor(0.7*size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + avoidClasses(clPlayer, 6, clWater, 3, clForest, 10, clHill, 0, clSea, 6), + num + ); +} +RMS.SetProgress(45); +// create highland forests +log("Creating highland forests..."); +var types = [ + [[tGrassDForest, tGrass, pForestP], [tGrassDForest, pForestP]] +]; // some variation +var size = numForest / (scaleByMapSize(2,8) * numPlayers); +var num = floor(size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + avoidClasses(clPlayer, 6, clWater, 3, clForest, 2, clHill, 0, clSea, 6, clFlatlands, 3), + num + ); +} + + +RMS.SetProgress(70); + +// create dirt patches +log("Creating dirt patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0, clSea, 0), + scaleByMapSize(15, 45) + ); +} + +RMS.SetProgress(75); + +// create grass patches +log("Creating grass patches..."); +var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new TerrainPainter(tGrassPatch); + createAreas( + placer, + painter, + avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0, clSea, 0), + scaleByMapSize(15, 45) + ); +} + +RMS.SetProgress(80); + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clSea, 2, clHill, 2)], + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clSea, 2, clHill, 2)], + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clMetal, 10, clRock, 5, clSea, 0, clHill, 2)], + scaleByMapSize(4,16), 100 +); + +RMS.SetProgress(85); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockMedium, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clSea, 0), + scaleByMapSize(16, 262), 50 +); + +RMS.SetProgress(90); + +// create large decorative rocks +log("Creating large decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clSea, 0), + scaleByMapSize(8, 131), 50 +); + + +// create deer +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clFood, 5, clSea, 0, clFlatlands, 0), + 6 * numPlayers, 50 +); + + +// create sheep +log("Creating sheep..."); +group = new SimpleGroup( + [new SimpleObject(oGoat, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clFood, 20, clSea, 0), + 3 * numPlayers, 50 +); + +// create boar +log("Creating boar..."); +group = new SimpleGroup( + [new SimpleObject(oBoar, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clFood, 20, clSea, 0, clFlatlands, 0), + 2 * numPlayers, 50 +); + + +// create straggler trees +log("Creating straggler trees..."); +var types = [oPoplar, oPalm, oApple]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clMetal, 1, clRock, 1, clSea, 1, clHighlands, 25), + num + ); +} + + +//create small grass tufts +log("Creating small grass tufts..."); +group = new SimpleGroup( + [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0, clSea, 1), + scaleByMapSize(13, 200) +); + + +// create large grass tufts +log("Creating large grass tufts..."); +group = new SimpleGroup( + [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)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0, clSea, 1), + scaleByMapSize(13, 200) +); + +RMS.SetProgress(95); + +// create bushes +log("Creating bushes..."); +group = new SimpleGroup( + [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1, clSea, 1), + scaleByMapSize(13, 200), 50 +); + +// Set environment +setSkySet("cirrus"); +setWaterTint(0.412, 0.412, 0.312); +setWaterReflectionTint(0.447, 0.402, 0.322); +setWaterMurkiness(1.0); +setWaterReflectionTintStrength(0.677); + +// Export map data +ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/neareastern_badlands.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/neareastern_badlands.js (revision 11136) +++ ps/trunk/binaries/data/mods/public/maps/random/neareastern_badlands.js (revision 11137) @@ -1,489 +1,488 @@ RMS.LoadLibrary("rmgen"); // terrain textures const tCity = "desert_city_tile"; const tCityPlaza = "desert_city_tile_plaza"; const tSand = "desert_dirt_rough"; const tDunes = "desert_sand_dunes_100"; const tFineSand = "desert_sand_smooth"; const tCliff = ["desert_cliff_badlands", "desert_cliff_badlands_2"]; const tForestFloor = "desert_forestfloor_palms"; const tGrass = "desert_grass_a"; const tGrassSand50 = "desert_grass_a_sand"; const tGrassSand25 = "desert_grass_a_stones"; const tDirt = "desert_dirt_rough"; const tDirtCracks = "desert_dirt_cracks"; const tShore = "desert_shore_stones"; const tWaterDeep = "desert_shore_stones_wet"; // gaia entities const oBerryBush = "gaia/flora_bush_berry"; const oChicken = "gaia/fauna_chicken"; const oCamel = "gaia/fauna_camel"; const oFish = "gaia/fauna_fish"; const oGazelle = "gaia/fauna_gazelle"; const oGiraffe = "gaia/fauna_giraffe"; const oGoat = "gaia/fauna_goat"; const oWildebeest = "gaia/fauna_wildebeest"; const oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry"; const oStoneSmall = "gaia/geology_stone_desert_small"; const oMetalLarge = "gaia/geology_metal_desert_slabs"; const oDatePalm = "gaia/flora_tree_date_palm"; const oSDatePalm = "gaia/flora_tree_senegal_date_palm"; // decorative props const aBush1 = "actor|props/flora/bush_desert_a.xml"; const aBush2 = "actor|props/flora/bush_desert_dry_a.xml"; const aBush3 = "actor|props/flora/bush_dry_a.xml"; const aBush4 = "actor|props/flora/plant_desert_a.xml"; const aBushes = [aBush1, aBush2, aBush3, aBush4]; const aDecorativeRock = "actor|geology/stone_desert_med.xml"; // terrain + entity (for painting) var pForest = [tForestFloor + TERRAIN_SEPARATOR + oDatePalm, tForestFloor + TERRAIN_SEPARATOR + oSDatePalm, tForestFloor]; var pForestOasis = [tGrass + TERRAIN_SEPARATOR + oDatePalm, tGrass + TERRAIN_SEPARATOR + oSDatePalm, tGrass]; const BUILDING_ANGlE = 0.75*PI; // initialize map log("Initializing map..."); InitMap(); var numPlayers = getNumPlayers(); var mapSize = getMapSize(); var mapArea = mapSize*mapSize; // create tile classes var clPlayer = createTileClass(); var clHill1 = createTileClass(); var clHill2 = createTileClass(); var clHill3 = createTileClass(); var clForest = createTileClass(); var clWater = createTileClass(); var clPatch = createTileClass(); var clRock = createTileClass(); var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = shuffleArray(playerIDs); // place players var playerX = new Array(numPlayers); var playerZ = new Array(numPlayers); var playerAngle = new Array(numPlayers); var startAngle = randFloat(0, TWO_PI); for (var i = 0; i < numPlayers; i++) { playerAngle[i] = startAngle + i*TWO_PI/numPlayers; playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); } for (var i = 0; i < numPlayers; i++) { var id = playerIDs[i]; log("Creating base for player " + id + "..."); // scale radius of player area by map size var radius = scaleByMapSize(15,25); // get the x and z in tiles var fx = fractionToTiles(playerX[i]); var fz = fractionToTiles(playerZ[i]); var ix = round(fx); var iz = round(fz); // calculate size based on the radius var size = PI * radius * radius; // create the player area var placer = new ClumpPlacer(size, 0.9, 0.5, 10, ix, iz); createArea(placer, paintClass(clPlayer), null); // create the city patch var cityRadius = 10; placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); var painter = new LayeredPainter([tCity, tCityPlaza], [3]); createArea(placer, painter, null); // get civ specific starting entities var civEntities = getStartingEntities(id-1); // create the TC var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], true, null, ix, iz ); createObjectGroup(group, id); // create starting units - var uDist = 8; - var uAngle = -BUILDING_ANGlE + randFloat(-PI/8, PI/8); + var uDist = 6; + var uSpace = 2; for (var j = 1; j < civEntities.length; ++j) { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); - var ux = round(fx + uDist * cos(uAngle)); - var uz = round(fz + uDist * sin(uAngle)); - group = new SimpleGroup( // elements (type, min/max count, min/max distance) - [new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))], - true, null, ux, uz - ); - createObjectGroup(group, id); - uAngle += PI/4; + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } } // create animals for (var j = 0; j < 2; ++j) { var aAngle = randFloat(0, TWO_PI); var aDist = 7; var aX = round(fx + aDist * cos(aAngle)); var aZ = round(fz + aDist * sin(aAngle)); group = new SimpleGroup( [new SimpleObject(oChicken, 5,5, 0,3)], true, clBaseResource, aX, aZ ); createObjectGroup(group, 0); } // create berry bushes var bbAngle = randFloat(0, TWO_PI); var bbDist = 12; var bbX = round(fx + bbDist * cos(bbAngle)); var bbZ = round(fz + bbDist * sin(bbAngle)); group = new SimpleGroup( [new SimpleObject(oBerryBush, 5,5, 0,3)], true, clBaseResource, bbX, bbZ ); createObjectGroup(group, 0); // create metal mine var mAngle = bbAngle; while(abs(mAngle - bbAngle) < PI/3) { mAngle = randFloat(0, TWO_PI); } var mDist = 11; var mX = round(fx + mDist * cos(mAngle)); var mZ = round(fz + mDist * sin(mAngle)); group = new SimpleGroup( [new SimpleObject(oMetalLarge, 1,1, 0,0), new RandomObject(aBushes, 2,4, 0,2)], true, clBaseResource, mX, mZ ); createObjectGroup(group, 0); // create stone mines mAngle += randFloat(PI/8, PI/4); mX = round(fx + mDist * cos(mAngle)); mZ = round(fz + mDist * sin(mAngle)); group = new SimpleGroup( [new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)], true, clBaseResource, mX, mZ ); createObjectGroup(group, 0); // create starting straggler trees group = new SimpleGroup( [new SimpleObject(oDatePalm, 1,1, 6,12), new SimpleObject(oSDatePalm, 1,1, 6,12)], true, null, ix, iz ); createObjectGroup(group, 0, avoidClasses(clBaseResource,1)); } RMS.SetProgress(10); // create patches log("Creating dune patches..."); placer = new ClumpPlacer(scaleByMapSize(40, 150), 0.2, 0.1, 0); painter = new TerrainPainter(tDunes); createAreas(placer, [painter, paintClass(clPatch)], avoidClasses(clPatch, 2, clPlayer, 0), scaleByMapSize(5, 20) ); RMS.SetProgress(15); log("Creating sand patches..."); var placer = new ClumpPlacer(scaleByMapSize(25, 100), 0.2, 0.1, 0); var painter = new TerrainPainter([tSand, tFineSand]); createAreas(placer, [painter, paintClass(clPatch)], avoidClasses(clPatch, 2, clPlayer, 0), scaleByMapSize(15, 50) ); RMS.SetProgress(20); log("Creating dirt patches..."); placer = new ClumpPlacer(scaleByMapSize(25, 100), 0.2, 0.1, 0); painter = new TerrainPainter([tDirt]); createAreas(placer, [painter, paintClass(clPatch)], avoidClasses(clPatch, 2, clPlayer, 0), scaleByMapSize(15, 50) ); RMS.SetProgress(25); // create the oasis log("Creating oasis..."); var oRadius = scaleByMapSize(14, 40); placer = new ClumpPlacer(PI*oRadius*oRadius, 0.6, 0.15, 0, mapSize/2, mapSize/2); painter = new LayeredPainter([[tSand, pForest], [tGrassSand25, pForestOasis], tGrassSand25, tShore, tWaterDeep], [2, 3, 1, 1]); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, -11, 8); createArea(placer, [painter, elevationPainter, paintClass(clForest)], null); RMS.SetProgress(30); // create oasis wildlife var num = round(PI * oRadius / 8); var constraint = new AndConstraint([borderClasses(clForest, 0, 3), avoidClasses(clForest, 0)]); var halfSize = mapSize/2; for (var i = 0; i < num; ++i) { var r = 0; var angle = TWO_PI / num * i; do { // Work outward until constraint met var gx = round(halfSize + r * cos(angle)); var gz = round(halfSize + r * sin(angle)); ++r; } while (!constraint.allows(gx,gz) && r < halfSize); group = new RandomGroup( [ new SimpleObject(oGiraffe, 2,4, 0,3), // select from these groups randomly new SimpleObject(oWildebeest, 3,5, 0,3), new SimpleObject(oGazelle, 5,7, 0,3) ], true, clFood, gx, gz ); createObjectGroup(group, 0); } constraint = new AndConstraint([borderClasses(clForest, 15, 0), avoidClasses(clFood, 5)]); num = round(PI * oRadius / 16); for (var i = 0; i < num; ++i) { var r = 0; var angle = TWO_PI / num * i; do { // Work outward until constraint met var gx = round(halfSize + r * cos(angle)); var gz = round(halfSize + r * sin(angle)); ++r; } while (!constraint.allows(gx,gz) && r < halfSize); group = new SimpleGroup( [new SimpleObject(oFish, 1,1, 0,1)], true, clFood, gx, gz ); createObjectGroup(group, 0); } RMS.SetProgress(35); // create hills log("Creating level 1 hills..."); placer = new ClumpPlacer(scaleByMapSize(50,300), 0.25, 0.1, 0.5); var terrainPainter = new LayeredPainter( [tCliff, tSand], // terrains [1] // widths ); var elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 16, 1); var hillAreas = createAreas(placer, [terrainPainter, elevationPainter, paintClass(clHill1)], avoidClasses(clForest, 3, clPlayer, 0, clHill1, 10), scaleByMapSize(10,20), 100 ); RMS.SetProgress(40); log("Creating small level 1 hills..."); placer = new ClumpPlacer(scaleByMapSize(25,150), 0.25, 0.1, 0.5); terrainPainter = new LayeredPainter( [tCliff, tSand], // terrains [1] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 16, 1); var tempAreas = createAreas(placer, [terrainPainter, elevationPainter, paintClass(clHill1)], avoidClasses(clForest, 3, clPlayer, 0, clHill1, 3), scaleByMapSize(15,25), 100 ); for (var i = 0; i < tempAreas.length; ++i) { hillAreas.push(tempAreas[i]); } RMS.SetProgress(45); // create decorative rocks for hills log("Creating decorative rocks..."); group = new SimpleGroup( [new RandomObject([aDecorativeRock, aBush2, aBush3], 3,8, 0,2)], true ); createObjectGroupsByAreas(group, 0, borderClasses(clHill1, 0, 3), scaleByMapSize(40,200), 50, hillAreas ); RMS.SetProgress(50); log("Creating level 2 hills..."); placer = new ClumpPlacer(scaleByMapSize(25,150), 0.25, 0.1, 0); terrainPainter = new LayeredPainter( [tCliff, tSand], // terrains [1] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 16, 1); createAreasInAreas(placer, [terrainPainter, elevationPainter], [stayClasses(clHill1, 0)], scaleByMapSize(15,25), 50, hillAreas ); RMS.SetProgress(55); log("Creating level 3 hills..."); placer = new ClumpPlacer(scaleByMapSize(12, 75), 0.25, 0.1, 0); terrainPainter = new LayeredPainter( [tCliff, tSand], // terrains [1] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 16, 1); createAreas(placer, [terrainPainter, elevationPainter], [stayClasses(clHill1, 0)], scaleByMapSize(15,25), 50, hillAreas ); hillAreas = []; RMS.SetProgress(60); // create bumps log("Creating bumps..."); placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 0); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); createAreas( placer, elevationPainter, avoidClasses(clForest, 0, clPlayer, 0, clHill1, 2), scaleByMapSize(100, 200) ); RMS.SetProgress(65); // calculate desired number of trees for map (based on size) const MIN_TREES = 500; const MAX_TREES = 2500; const P_FOREST = 0.5; var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); var numForest = totalTrees * P_FOREST; var numStragglers = totalTrees * (1.0 - P_FOREST); // create forests log("Creating forests..."); var num = scaleByMapSize(10,30); placer = new ClumpPlacer(numForest / num, 0.15, 0.1, 0.5); painter = new TerrainPainter([tSand, pForest]); createAreas(placer, [painter, paintClass(clForest)], avoidClasses(clPlayer, 1, clForest, 10, clHill1, 1), num, 50 ); RMS.SetProgress(70); log("Creating stone mines..."); // create large stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clRock); createObjectGroups(group, 0, [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill1, 1)], scaleByMapSize(4,16), 100 ); // create small stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3), new RandomObject(aBushes, 2,4, 0,2)], true, clRock); createObjectGroups(group, 0, [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill1, 1)], scaleByMapSize(4,16), 100 ); log("Creating metal mines..."); // create large metal quarries group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clMetal); createObjectGroups(group, 0, [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill1, 1)], scaleByMapSize(4,16), 100 ); RMS.SetProgress(80); // create gazelles log("Creating gazelles..."); group = new SimpleGroup([new SimpleObject(oGazelle, 5,7, 0,4)], true, clFood); createObjectGroups(group, 0, avoidClasses(clForest, 0, clPlayer, 5, clHill1, 1, clFood, 10), scaleByMapSize(5,20), 50 ); // create goats log("Creating goats..."); group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood); createObjectGroups(group, 0, avoidClasses(clForest, 0, clPlayer, 5, clHill1, 1, clFood, 10), scaleByMapSize(5,20), 50 ); // create camels log("Creating camels..."); group = new SimpleGroup([new SimpleObject(oCamel, 2,4, 0,2)], true, clFood); createObjectGroups(group, 0, avoidClasses(clForest, 0, clPlayer, 5, clHill1, 1, clFood, 10), scaleByMapSize(5,20), 50 ); RMS.SetProgress(85); // create straggler trees log("Creating straggler trees..."); var types = [oDatePalm, oSDatePalm]; // some variation var num = floor(numStragglers / types.length); for (var i = 0; i < types.length; ++i) { group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true); createObjectGroups(group, 0, avoidClasses(clForest, 0, clHill1, 1, clPlayer, 4, clMetal, 1, clRock, 1), num ); } RMS.SetProgress(90); // create bushes log("Creating bushes..."); group = new SimpleGroup([new RandomObject(aBushes, 2,3, 0,2)]); createObjectGroups(group, 0, avoidClasses(clHill1, 1, clPlayer, 0, clForest, 0), scaleByMapSize(16, 262) ); // create rocks log("Creating more decorative rocks..."); group = new SimpleGroup([new SimpleObject(aDecorativeRock, 1,2, 0,2)]); createObjectGroups(group, 0, avoidClasses(clHill1, 1, clPlayer, 0, clForest, 0), scaleByMapSize(16, 262) ); // Export map data ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/atlas_mountains.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/atlas_mountains.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/atlas_mountains.js (revision 11137) @@ -0,0 +1,530 @@ +RMS.LoadLibrary("rmgen"); + +// terrain textures +const tGrass = ["medit_rocks_grass", "medit_rocks_grass_shrubs", "medit_rocks_shrubs"]; +const tGrassPForest = "medit_grass_field_dry"; +const tGrassDForest = "medit_grass_field_dry"; +const tCliff = "medit_cliff_italia"; +const tHill = ["medit_rocks_grass", "medit_rocks_grass_shrubs", "medit_rocks_shrubs"]; +const tDirt = "medit_dirt"; +const tRoad = "medit_city_tile"; +const tRoadWild = "medit_city_tile"; +const tGrassPatch = "medit_grass_shrubs"; +const tShoreBlend = "medit_sand"; +const tShore = "medit_sand"; +const tWater = "medit_sand"; + +// gaia entities +const oCarob = "gaia/flora_tree_carob"; +const oAleppoPine = "gaia/flora_tree_aleppo_pine"; +const oBerryBush = "gaia/flora_bush_berry"; +const oChicken = "gaia/fauna_chicken"; +const oDeer = "gaia/fauna_deer"; +const oFish = "gaia/fauna_fish"; +const oSheep = "gaia/fauna_sheep"; +const oStoneLarge = "gaia/geology_stonemine_medit_quarry"; +const oStoneSmall = "gaia/geology_stone_mediterranean"; +const oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; +const oWood = "gaia/special_treasure_wood"; +const oFood = "gaia/special_treasure_food_bin"; + + +// decorative props +const aGrass = "actor|props/flora/grass_soft_large_tall.xml"; +const aGrassShort = "actor|props/flora/grass_soft_large.xml"; +const aRockLarge = "actor|geology/stone_granite_large.xml"; +const aRockMedium = "actor|geology/stone_granite_med.xml"; +const aBushMedium = "actor|props/flora/bush_medit_me.xml"; +const aBushSmall = "actor|props/flora/bush_medit_sm.xml"; +const aCarob = "actor|flora/trees/carob.xml"; +const aAleppoPine = "actor|flora/trees/aleppo_pine.xml"; + + + +// terrain + entity (for painting) +const pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oCarob, tGrassDForest]; +const pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest]; + +const BUILDING_ANGlE = 0.75*PI; + +// initialize map + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clTreasure = createTileClass(); +var clGrass = createTileClass(); + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = shuffleArray(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); + +var startAngle = randFloat(0, TWO_PI); +for (var i = 0; i < numPlayers; i++) +{ + playerAngle[i] = startAngle + i*TWO_PI/numPlayers; + playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); + playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); +} + +for (var i = 0; i < numPlayers; i++) +{ + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + // some constants + var radius = scaleByMapSize(15,25); + var cliffRadius = 2; + var elevation = 20; + + // get the x and z in tiles + var fx = fractionToTiles(playerX[i]); + var fz = fractionToTiles(playerZ[i]); + var ix = round(fx); + var iz = round(fz); + addToClass(ix, iz, clPlayer); + addToClass(ix+5, iz, clPlayer); + addToClass(ix, iz+5, clPlayer); + addToClass(ix-5, iz, clPlayer); + addToClass(ix, iz-5, clPlayer); + + // create the city patch + var cityRadius = radius/3; + var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); + var painter = new LayeredPainter([tRoadWild, tRoad], [1]); + createArea(placer, painter, null); + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create the TC + var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) + [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], + true, null, ix, iz + ); + createObjectGroup(group, id); + + // create starting units + var uDist = 6; + var uSpace = 2; + for (var j = 1; j < civEntities.length; ++j) + { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; + var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } + } + + // create animals + for (var j = 0; j < 2; ++j) + { + var aAngle = randFloat(0, TWO_PI); + var aDist = 7; + var aX = round(fx + aDist * cos(aAngle)); + var aZ = round(fz + aDist * sin(aAngle)); + group = new SimpleGroup( + [new SimpleObject(oChicken, 5,5, 0,3)], + true, clBaseResource, aX, aZ + ); + createObjectGroup(group, 0); + } + + // create berry bushes + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oBerryBush, 5,5, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // create metal mine + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = radius - 4; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetalLarge, 1,1, 0,0)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create stone mines + mAngle += randFloat(PI/8, PI/4); + mX = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + var hillSize = PI * radius * radius; + // create starting straggler trees + var num = hillSize / 100; + for (var j = 0; j < num; j++) + { + var tAngle = randFloat(0, TWO_PI); + var tDist = randFloat(6, radius - 2); + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oCarob, 1,3, 0,2)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + } + + // create grass tufts + var num = hillSize / 250; + for (var j = 0; j < num; j++) + { + var gAngle = randFloat(0, TWO_PI); + var gDist = radius - (5 + randInt(7)); + var gX = round(fx + gDist * cos(gAngle)); + var gZ = round(fz + gDist * sin(gAngle)); + group = new SimpleGroup( + [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)], + false, clBaseResource, gX, gZ + ); + createObjectGroup(group, 0); + } +} + +RMS.SetProgress(10); + +// create bumps +log("Creating bumps..."); +placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); +painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); +createAreas( + placer, + painter, + avoidClasses(clPlayer, 9), + scaleByMapSize(100, 200) +); + +// create hills 1 +log("Creating hills 1..."); +placer = new ClumpPlacer(scaleByMapSize(40, 300), 0.2, 0.1, 1); +var terrainPainter = new LayeredPainter( + [tCliff, tHill], // terrains + [2] // widths +); +var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 16, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clPlayer, 16, clWater, 5, clHill, 10), + 6*scaleByMapSize(1, 4) * numPlayers +); + +// create hills 2 +log("Creating hills 2..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.18, 0.15, 1); +terrainPainter = new LayeredPainter( + [tCliff, tHill], // terrains + [2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 20, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clPlayer, 16, clWater, 5, clHill, 7), + 7*scaleByMapSize(1, 4) * numPlayers +); + +// create hills 3 +log("Creating hills 2..."); +placer = new ClumpPlacer(scaleByMapSize(10, 75), 0.2, 0.1, 1); +terrainPainter = new LayeredPainter( + [tCliff, tHill], // terrains + [2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 24, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + stayClasses(clHill, 0), + 14*scaleByMapSize(1, 4) * numPlayers +); + +RMS.SetProgress(25); + +// calculate desired number of trees for map (based on size) +const MIN_TREES = 500; +const MAX_TREES = 2500; +const P_FOREST = 0.7; + +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create forests +log("Creating forests..."); +var types = [ + [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]], + [[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]] +]; // some variation +var size = numForest / (scaleByMapSize(2,8) * numPlayers); +var num = floor(size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + avoidClasses(clPlayer, 14, clForest, 8, clHill, 1), + num + ); +} + +RMS.SetProgress(40); + +// create dirt patches +log("Creating dirt patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [tDirt,tDirt], // terrains + [1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 10), + scaleByMapSize(15, 45) + ); +} + +// create grass patches +log("Creating grass patches..."); + +var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new TerrainPainter(tGrass); + createAreas( + placer, + [painter, paintClass(clGrass)], + avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 10, clGrass, 15), + scaleByMapSize(15, 45) + ); +} + +RMS.SetProgress(50); + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 9, clMetal, 10, clRock, 5, clHill, 2)], + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 9, clMetal, 10, clRock, 5, clHill, 2)], + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 9, clMetal, 10, clRock, 5, clHill, 2)], + scaleByMapSize(4,16), 100 +); + +RMS.SetProgress(60); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockMedium, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), + scaleByMapSize(16, 262), 50 +); + +RMS.SetProgress(65); + +// create large decorative rocks +log("Creating large decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), + scaleByMapSize(8, 131), 50 +); + +RMS.SetProgress(70); + +// create deer +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), + 3 * numPlayers, 50 +); + +RMS.SetProgress(75); + +// create sheep +log("Creating sheep..."); +group = new SimpleGroup( + [new SimpleObject(oSheep, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), + 3 * numPlayers, 50 +); + +// create food treasures +log("Creating food treasures..."); +group = new SimpleGroup( + [new SimpleObject(oFood, 2,3, 0,2)], + true, clTreasure +); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 18, clHill, 1, clFood, 5), + 3 * numPlayers, 50 +); + +// create wood treasures +log("Creating food treasures..."); +group = new SimpleGroup( + [new SimpleObject(oWood, 2,3, 0,2)], + true, clTreasure +); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 18, clHill, 1), + 3 * numPlayers, 50 +); + +RMS.SetProgress(80); + +// create straggler trees +log("Creating straggler trees..."); +var types = [oCarob, oAleppoPine]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 10, clMetal, 1, clRock, 1, clTreasure, 1), + num + ); +} + +// create hill trees +log("Creating hill trees..."); +var types = [aCarob, aAleppoPine]; // some variation +var num = floor(3 * numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + stayClasses(clHill, 2), + num + ); +} + +RMS.SetProgress(85); + +//create small grass tufts +log("Creating small grass tufts..."); +group = new SimpleGroup( + [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 2, clHill, 2, clPlayer, 16, clDirt, 0), + scaleByMapSize(13, 200) +); + +RMS.SetProgress(90); + +// create large grass tufts +log("Creating large grass tufts..."); +group = new SimpleGroup( + [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)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clHill, 2, clPlayer, 16, clDirt, 1, clForest, 0), + scaleByMapSize(13, 200) +); + +RMS.SetProgress(95); + +// create bushes +log("Creating bushes..."); +group = new SimpleGroup( + [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 1, clHill, 1, clPlayer, 10, clDirt, 1), + scaleByMapSize(13, 200), 50 +); + + +// Export map data +ExportMap(); \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/guadalquivir_river.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/guadalquivir_river.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/guadalquivir_river.json (revision 11137) @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Guadalquivir River", + "Script" : "guadalquivir_river.js", + "Description" : "Players start in the shores of the mediterranean sea with a river flowing between them.", + "BaseTerrain" : ["medit_sand_wet"], + "BaseHeight" : -5, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} Index: ps/trunk/binaries/data/mods/public/maps/random/guadalquivir_river.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/guadalquivir_river.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/guadalquivir_river.js (revision 11137) @@ -0,0 +1,587 @@ +RMS.LoadLibrary("rmgen"); + +function rndRiver(f, seed) +{ + var rndRq = seed; + var rndRw = rndRq; + var rndRe = 0; + var rndRr = f-floor(f); + var rndRa = 0; + for (var rndRx=0; rndRx<=floor(f); rndRx++) + { + rndRw = 10*(rndRw-floor(rndRw)); + } + if (rndRx%2==0) + { + var rndRs = -1; + } + else + { + var rndRs = 1; + } + rndRe = (floor(rndRw))%5; + if (rndRe==0) + { + rndRa = (rndRs)*2.3*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.5); + } + else if (rndRe==1) + { + rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.3)*(rndRr-0.7); + } + else if (rndRe==2) + { + rndRa = (rndRs)*22*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.3)*(rndRr-0.3)*(rndRr-0.8); + } + else if (rndRe==3) + { + rndRa = (rndRs)*180*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.2)*(rndRr-0.4)*(rndRr-0.6)*(rndRr-0.6)*(rndRr-0.8); + } + else if (rndRe==4) + { + rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.7); + } + return rndRa; +} + +var tGrass = ["medit_grass_field_a", "medit_grass_field_b"]; +var tGrassPForest = "medit_plants_dirt"; +var tGrassDForest = "medit_grass_shrubs"; +var tCliff = ["medit_cliff_grass", "medit_cliff_greek", "medit_cliff_greek_2", "medit_cliff_aegean", "medit_cliff_italia", "medit_cliff_italia_grass"]; +var tGrassA = "medit_grass_field_b"; +var tGrassB = "medit_grass_field_brown"; +var tGrassC = "medit_grass_field_dry"; +var tHill = ["medit_rocks_grass_shrubs", "medit_rocks_shrubs"]; +var tDirt = ["medit_dirt", "medit_dirt_b"]; +var tRoad = "medit_city_tile"; +var tRoadWild = "medit_city_tile"; +var tGrassPatch = "medit_grass_wild"; +var tShoreBlend = "medit_sand"; +var tShore = "sand_grass_25"; +var tWater = "medit_sand_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_poplar"; +var oOakLarge = "gaia/flora_tree_poplar"; +var oApple = "gaia/flora_tree_apple"; +var oPine = "gaia/flora_tree_carob"; +var oAleppoPine = "gaia/flora_tree_carob"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_deer"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_sheep"; +var oStoneLarge = "gaia/geology_stonemine_medit_quarry"; +var oStoneSmall = "gaia/geology_stone_mediterranean"; +var oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_large_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_large.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/pond_lillies_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_medit_me.xml"; +var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; + +// terrain + entity (for painting) + +var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oOak, tGrassDForest + TERRAIN_SEPARATOR + oOakLarge, tGrassDForest]; +var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest]; +const BUILDING_ANGlE = 0.75*PI; + +// initialize map + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clSettlement = createTileClass(); +var clLand = createTileClass(); +var clRiver = createTileClass(); +//Create the continent body + + + +var fx = fractionToTiles(0.5); +var fz = fractionToTiles(0.7); +var ix = round(fx); +var iz = round(fz); + +var placer = new ClumpPlacer(mapArea * 0.65, 0.75, 0.08, 10, ix, iz); +var terrainPainter = new LayeredPainter( + [tWater, tShore, tGrass], // terrains + [4, 2] // widths +); +var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 3, // elevation + 4 // blend radius +); +createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = shuffleArray(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); + +var startAngle = 0; +for (var i = 0; i < numPlayers; i++) +{ + playerAngle[i] = startAngle - 0.23*(i+(i%2))*TWO_PI/numPlayers - (i%2)*PI/2; + playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); + playerZ[i] = 0.7 + 0.35*sin(playerAngle[i]); +} + +for (var i = 0; i < numPlayers; i++) +{ + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + // some constants + var radius = scaleByMapSize(15,25); + var cliffRadius = 2; + var elevation = 20; + + // get the x and z in tiles + fx = fractionToTiles(playerX[i]); + fz = fractionToTiles(playerZ[i]); + ix = round(fx); + iz = round(fz); + addToClass(ix, iz, clPlayer); + addToClass(ix+5, iz, clPlayer); + addToClass(ix, iz+5, clPlayer); + addToClass(ix-5, iz, clPlayer); + addToClass(ix, iz-5, clPlayer); + + // create the city patch + var cityRadius = radius/3; + placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); + var painter = new LayeredPainter([tRoadWild, tRoad], [1]); + createArea(placer, painter, null); + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create the TC + var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) + [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], + true, null, ix, iz + ); + createObjectGroup(group, id); + + // create starting units + var uDist = 6; + var uSpace = 2; + for (var j = 1; j < civEntities.length; ++j) + { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; + var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } + } + + // create animals + for (var j = 0; j < 2; ++j) + { + var aAngle = randFloat(0, TWO_PI); + var aDist = 7; + var aX = round(fx + aDist * cos(aAngle)); + var aZ = round(fz + aDist * sin(aAngle)); + group = new SimpleGroup( + [new SimpleObject(oChicken, 5,5, 0,3)], + true, clBaseResource, aX, aZ + ); + createObjectGroup(group, 0); + } + + // create berry bushes + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oBerryBush, 5,5, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // create metal mine + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = radius - 4; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetalLarge, 1,1, 0,0)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create stone mines + mAngle += randFloat(PI/8, PI/4); + mX = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + var hillSize = PI * radius * radius; + // create starting straggler trees + var num = hillSize / 100; + for (var j = 0; j < num; j++) + { + var tAngle = randFloat(0, TWO_PI); + var tDist = randFloat(6, radius - 2); + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oOak, 1,3, 0,2)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + } + + // create grass tufts + var num = hillSize / 250; + for (var j = 0; j < num; j++) + { + var gAngle = randFloat(0, TWO_PI); + var gDist = radius - (5 + randInt(7)); + var gX = round(fx + gDist * cos(gAngle)); + var gZ = round(fz + gDist * sin(gAngle)); + group = new SimpleGroup( + [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)], + false, clBaseResource, gX, gZ + ); + createObjectGroup(group, 0); + } +} + +RMS.SetProgress(20); + +const WATER_WIDTH = 0.07; +log("Creating river"); +var theta = randFloat(0, 1); +var seed = randFloat(2,3); + +for (ix = 0; ix < mapSize; ix++) +{ + for (iz = 0; iz < mapSize; iz++) + { + var x = ix / (mapSize + 1.0); + var z = iz / (mapSize + 1.0); + + var h = 0; + var distToWater = 0; + + h = 32 * (z - 0.5); + + // add the rough shape of the water + var km = 12/scaleByMapSize(35, 160); + var cu = km*rndRiver(theta+z*0.5*(mapSize/64),seed); + var zk = z*randFloat(0.995,1.005); + var xk = x*randFloat(0.995,1.005); + if (-3.0 < getHeight(ix, iz)){ + if ((xk > cu+((1.0-WATER_WIDTH)/2))&&(xk < cu+((1.0+WATER_WIDTH)/2))) + { + if (xk < cu+((1.05-WATER_WIDTH)/2)) + { + h = -3 + 200.0* abs(cu+((1.05-WATER_WIDTH)/2-xk)); + if ((((zk>0.3)&&(zk<0.4))||((zk>0.5)&&(zk<0.6))||((zk>0.7)&&(zk<0.8)))&&(h<-1.5)) + { + h=-1.5; + } + + } + else if (xk > (cu+(0.95+WATER_WIDTH)/2)) + { + h = -3 + 200.0*(xk-(cu+((0.95+WATER_WIDTH)/2))); + if ((((zk>0.3)&&(zk<0.4))||((zk>0.5)&&(zk<0.6))||((zk>0.7)&&(zk<0.8)))&&(h<-1.5)) + { + h=-1.5; + } + } + else + { + if (((zk>0.3)&&(zk<0.4))||((zk>0.5)&&(zk<0.6))||((zk>0.7)&&(zk<0.8))){ + h = -1.5; + } + else + { + h = -3.0; + } + } + setHeight(ix, iz, h); + addToClass(ix, iz, clRiver); + placeTerrain(ix, iz, tWater); + } + } + } +} + +// create bumps +log("Creating bumps..."); +placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); +painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); +createAreas( + placer, + painter, + [avoidClasses(clWater, 2, clPlayer, 10, clRiver, 1), stayClasses(clLand, 3)], + scaleByMapSize(100, 200) +); + + +// calculate desired number of trees for map (based on size) + +var MIN_TREES = 500; +var MAX_TREES = 3000; +var P_FOREST = 0.7; + +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create forests +log("Creating forests..."); +var types = [ + [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]], + [[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]] +]; // some variation + + +var size = numForest / (scaleByMapSize(2,8) * numPlayers); + +var num = floor(size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + [avoidClasses(clPlayer, 6, clForest, 10, clHill, 0, clRiver, 1), stayClasses(clLand, 7)], + num + ); +} + +RMS.SetProgress(50); +// create dirt patches +log("Creating dirt patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0, clRiver, 1), stayClasses(clLand, 7)], + scaleByMapSize(15, 45) + ); +} + +// create grass patches +log("Creating grass patches..."); +var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new TerrainPainter(tGrassPatch); + createAreas( + placer, + painter, + [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0, clRiver, 1), stayClasses(clLand, 7)], + scaleByMapSize(15, 45) + ); +} +RMS.SetProgress(55); + + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clRiver, 1), stayClasses(clLand, 5)], + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clRiver, 1), stayClasses(clLand, 5)], + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1, clRiver, 1), stayClasses(clLand, 5)], + scaleByMapSize(4,16), 100 +); + +RMS.SetProgress(65); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockMedium, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clRiver, 1), stayClasses(clLand, 5)], + scaleByMapSize(16, 262), 50 +); + + +// create large decorative rocks +log("Creating large decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], + true +); +createObjectGroups( + group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0, clRiver, 1), stayClasses(clLand, 5)], + scaleByMapSize(8, 131), 50 +); + +RMS.SetProgress(70); + +// create deer +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20, clRiver, 1), stayClasses(clLand, 3)], + 3 * numPlayers, 50 +); + +RMS.SetProgress(75); + +// create sheep +log("Creating sheep..."); +group = new SimpleGroup( + [new SimpleObject(oSheep, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20, clRiver, 1), stayClasses(clLand, 3)], + 3 * numPlayers, 50 +); + +// create fish +log("Creating fish..."); +group = new SimpleGroup( + [new SimpleObject(oFish, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clLand, 2, clForest, 0, clPlayer, 0, clHill, 0, clFood, 20, clRiver, 1), + 5 * numPlayers, 60 +); + +RMS.SetProgress(85); + + +// create straggler trees +log("Creating straggler trees..."); +var types = [oOak, oOakLarge, oPine, oApple]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 9, clMetal, 1, clRock, 1, clRiver, 1), stayClasses(clLand, 7)], + num + ); +} + + +//create small grass tufts +log("Creating small grass tufts..."); +group = new SimpleGroup( + [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0, clRiver, 1), stayClasses(clLand, 6)], + scaleByMapSize(13, 200) +); + +RMS.SetProgress(90); + +// create large grass tufts +log("Creating large grass tufts..."); +group = new SimpleGroup( + [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)] +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0, clRiver, 1), stayClasses(clLand, 6)], + scaleByMapSize(13, 200) +); + +RMS.SetProgress(95); + +// create bushes +log("Creating bushes..."); +group = new SimpleGroup( + [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1, clRiver, 1), stayClasses(clLand, 6)], + scaleByMapSize(13, 200), 50 +); + +setSkySet("cumulus"); +setWaterTint(0.447, 0.412, 0.322); // muddy brown +setWaterReflectionTint(0.447, 0.412, 0.322); // muddy brown +setWaterMurkiness(1.0); +setWaterReflectionTintStrength(0.677); + +// Export map data +ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/lake.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/lake.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/lake.json (revision 11137) @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Lake", + "Script" : "lake.js", + "Description" : "Players start around a lake in the center of the map", + "BaseTerrain" : ["medit_sea_depths"], + "BaseHeight" : 3, + "CircularMap" : false, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/lake.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/lake.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/lake.js (revision 11137) @@ -0,0 +1,834 @@ +RMS.LoadLibrary("rmgen"); + + +//random terrain textures +var rt = randInt(1,7); +//temperate +if (rt == 1){ +var tGrass = ["temp_grass_long_b"]; +var tGrassPForest = "temp_forestfloor_pine"; +var tGrassDForest = "temp_plants_bog"; +var tCliff = ["temp_cliff_a", "temp_cliff_b"]; +var tGrassA = "temp_grass_d"; +var tGrassB = "temp_grass_c"; +var tGrassC = "temp_grass_clovers_2"; +var tHill = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; +var tDirt = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; +var tRoad = "temp_road"; +var tRoadWild = "temp_road_overgrown"; +var tGrassPatch = "temp_grass_plants"; +var tShoreBlend = "temp_mud_plants"; +var tShore = "sand_grass_25"; +var tWater = "medit_sand_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_oak"; +var oOakLarge = "gaia/flora_tree_oak_large"; +var oApple = "gaia/flora_tree_apple"; +var oPine = "gaia/flora_tree_pine"; +var oAleppoPine = "gaia/flora_tree_aleppo_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_deer"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_sheep"; +var oStoneLarge = "gaia/geology_stonemine_medit_quarry"; +var oStoneSmall = "gaia/geology_stone_mediterranean"; +var oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_large_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_large.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/pond_lillies_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_medit_me.xml"; +var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; + +// terrain + entity (for painting) + +} +//snowy +else if (rt == 2) +{ +setSunColour(0.550, 0.601, 0.644); // a little darker + +var tGrass = ["polar_snow_b", "snow grass 75", "snow rocks", "snow forest"]; +var tGrassPForest = "polar_tundra_snow"; +var tGrassDForest = "polar_tundra_snow"; +var tCliff = ["polar_cliff_a", "polar_cliff_b"]; +var tGrassA = "snow grass 2"; +var tGrassB = "polar_snow_a"; +var tGrassC = "polar_ice_snow"; +var tHill = ["polar_snow_rocks", "polar_cliff_snow"]; +var tDirt = ["polar_ice_b", "polar_ice_c"]; +var tRoad = "new_alpine_citytile"; +var tRoadWild = "polar_ice_cracked"; +var tGrassPatch = "snow grass 2"; +var tShoreBlend = "polar_ice"; +var tShore = "snow_glacial_01"; +var tWater = "polar_ice_c"; + +// gaia entities +var oOak = "gaia/flora_tree_pine_w"; +var oOakLarge = "gaia/flora_tree_pine_w"; +var oApple = "gaia/flora_tree_pine_w"; +var oPine = "gaia/flora_tree_pine_w"; +var oAleppoPine = "gaia/flora_tree_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_muskox"; +var oFish = "gaia/fauna_fish_tuna"; +var oSheep = "gaia/fauna_walrus"; +var oStoneLarge = "gaia/geology_stone_alpine_a"; +var oStoneSmall = "gaia/geology_stone_alpine_a"; +var oMetalLarge = "gaia/geology_metal_alpine"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; + +// terrain + entity (for painting) + +} +//desert +else if (rt == 3) +{ +setSunColour(0.733, 0.746, 0.574); + +var tGrass = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; +var tGrassPForest = "forestfloor_dirty"; +var tGrassDForest = "desert_forestfloor_palms"; +var tCliff = ["desert_cliff_1", "desert_cliff_2", "desert_cliff_3", "desert_cliff_4", "desert_cliff_5"]; +var tGrassA = ["desert_dirt_persia_1", "desert_dirt_persia_2"]; +var tGrassB = "dirta"; +var tGrassC = "medit_dirt_dry"; +var tHill = ["desert_dirt_rocks_1", "desert_dirt_rocks_2", "desert_dirt_rocks_3"]; +var tDirt = ["desert_lakebed_dry", "desert_lakebed_dry_b"]; +var tRoad = "desert_city_tile"; +var tRoadWild = "desert_city_tile"; +var tGrassPatch = "desert_dirt_rough"; +var tShoreBlend = "desert_shore_stones"; +var tShore = "dirta"; +var tWater = "desert_sand_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_cretan_date_palm_short"; +var oOakLarge = "gaia/flora_tree_cretan_date_palm_tall"; +var oApple = "gaia/flora_tree_fig"; +var oPine = "gaia/flora_tree_dead"; +var oAleppoPine = "gaia/flora_tree_date_palm"; +var oBerryBush = "gaia/flora_bush_grapes"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_camel"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_gazelle"; +var oStoneLarge = "gaia/geology_stonemine_desert_quarry"; +var oStoneSmall = "gaia/geology_stone_desert_small"; +var oMetalLarge = "gaia/geology_metal_desert_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; +var aRockLarge = "actor|geology/stone_desert_med.xml"; +var aRockMedium = "actor|geology/stone_desert_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; +// terrain + entity (for painting) +} +//alpine +else if (rt == 4) +{ +var tGrass = ["alpine_dirt_grass_50"]; +var tGrassPForest = "alpine_forrestfloor"; +var tGrassDForest = "alpine_forrestfloor"; +var tCliff = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"]; +var tGrassA = "alpine_grass_rocky"; +var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; +var tGrassC = ["alpine_snow_a", "alpine_snow_b"]; +var tHill = "alpine_cliff_snow"; +var tDirt = ["alpine_dirt", "alpine_grass_d"]; +var tRoad = "new_alpine_citytile"; +var tRoadWild = "new_alpine_citytile"; +var tGrassPatch = "new_alpine_grass_a"; +var tShoreBlend = "alpine_shore_rocks"; +var tShore = "alpine_shore_rocks_grass_50"; +var tWater = "alpine_shore_rocks"; + +// gaia entities +var oOak = "gaia/flora_tree_pine"; +var oOakLarge = "gaia/flora_tree_pine"; +var oApple = "gaia/flora_tree_pine"; +var oPine = "gaia/flora_tree_pine"; +var oAleppoPine = "gaia/flora_tree_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_goat"; +var oFish = "gaia/fauna_fish_tuna"; +var oSheep = "gaia/fauna_deer"; +var oStoneLarge = "gaia/geology_stone_alpine_a"; +var oStoneSmall = "gaia/geology_stone_alpine_a"; +var oMetalLarge = "gaia/geology_metal_alpine"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; + +// terrain + entity (for painting) +} +//medit +else if (rt == 5){ +var tGrass = ["medit_grass_field_a", "medit_grass_field_b"]; +var tGrassPForest = "medit_plants_dirt"; +var tGrassDForest = "medit_grass_shrubs"; +var tCliff = ["medit_cliff_grass", "medit_cliff_greek", "medit_cliff_greek_2", "medit_cliff_aegean", "medit_cliff_italia", "medit_cliff_italia_grass"]; +var tGrassA = "medit_grass_field_b"; +var tGrassB = "medit_grass_field_brown"; +var tGrassC = "medit_grass_field_dry"; +var tHill = ["medit_rocks_grass_shrubs", "medit_rocks_shrubs"]; +var tDirt = ["medit_dirt", "medit_dirt_b"]; +var tRoad = "medit_city_tile"; +var tRoadWild = "medit_city_tile"; +var tGrassPatch = "medit_grass_wild"; +var tShoreBlend = "medit_sand"; +var tShore = "sand_grass_25"; +var tWater = "medit_sand_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_cretan_date_palm_short"; +var oOakLarge = "gaia/flora_tree_medit_fan_palm"; +var oApple = "gaia/flora_tree_apple"; +var oPine = "gaia/flora_tree_cypress"; +var oAleppoPine = "gaia/flora_tree_aleppo_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_deer"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_sheep"; +var oStoneLarge = "gaia/geology_stonemine_medit_quarry"; +var oStoneSmall = "gaia/geology_stone_mediterranean"; +var oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_large_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_large.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/pond_lillies_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_medit_me.xml"; +var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; + +// terrain + entity (for painting) + +} +//savanah +else if (rt == 6) +{ +var tGrass = ["savanna_grass_a", "savanna_grass_b"]; +var tGrassPForest = "savanna_forestfloor_a"; +var tGrassDForest = "savanna_forestfloor_b"; +var tCliff = ["savanna_cliff_a", "savanna_cliff_b"]; +var tGrassA = "savanna_shrubs_a"; +var tGrassB = "savanna_dirt_rocks_b"; +var tGrassC = "dirt_brown_e"; +var tHill = ["savanna_grass_a", "savanna_grass_b"]; +var tDirt = ["savanna_dirt_rocks_b", "dirt_brown_e"]; +var tRoad = "savanna_tile_a"; +var tRoadWild = "savanna_tile_a"; +var tGrassPatch = "savanna_grass_a"; +var tShoreBlend = "savanna_riparian"; +var tShore = "savanna_riparian_bank"; +var tWater = "savanna_riparian_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_baobab"; +var oOakLarge = "gaia/flora_tree_baobab"; +var oApple = "gaia/flora_tree_baobab"; +var oPine = "gaia/flora_tree_baobab"; +var oAleppoPine = "gaia/flora_tree_baobab"; +var oBerryBush = "gaia/flora_bush_grapes"; +var oChicken = "gaia/fauna_chicken"; +var rts = randInt(1,4); +if (rts==1){ +var oDeer = "gaia/fauna_wildebeest"; +} +else if (rts==2) +{ +var oDeer = "gaia/fauna_zebra"; +} +else if (rts==3) +{ +var oDeer = "gaia/fauna_giraffe"; +} +else if (rts==4) +{ +var oDeer = "gaia/fauna_elephant_african_bush"; +} +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_gazelle"; +var oStoneLarge = "gaia/geology_stonemine_desert_quarry"; +var oStoneSmall = "gaia/geology_stone_savanna_small"; +var oMetalLarge = "gaia/geology_metal_savanna_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_savanna.xml"; +var aGrassShort = "actor|props/flora/grass_medit_field.xml"; +var aRockLarge = "actor|geology/stone_savanna_med.xml"; +var aRockMedium = "actor|geology/stone_savanna_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_dry_a.xml"; +// terrain + entity (for painting) +} +//tropic +else if (rt == 7){ +var tGrass = ["tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_plants", "tropic_plants", "tropic_plants_b"]; +var tGrassPForest = "tropic_plants_c"; +var tGrassDForest = "tropic_plants_c"; +var tCliff = ["tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a_plants"]; +var tGrassA = "tropic_grass_c"; +var tGrassB = "tropic_grass_plants"; +var tGrassC = "tropic_plants"; +var tHill = ["tropic_cliff_grass"]; +var tDirt = ["tropic_dirt_a", "tropic_dirt_a_plants"]; +var tRoad = "tropic_citytile_a"; +var tRoadWild = "tropic_citytile_plants"; +var tGrassPatch = "tropic_plants_b"; +var tShoreBlend = "temp_mud_plants"; +var tShore = "tropic_beach_dry"; +var tWater = "tropic_beach_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_poplar"; +var oOakLarge = "gaia/flora_tree_poplar"; +var oApple = "gaia/flora_tree_poplar"; +var oPine = "gaia/flora_tree_cretan_date_palm_short"; +var oAleppoPine = "gaia/flora_tree_cretan_date_palm_tall"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_deer"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_tiger"; +var oStoneLarge = "gaia/geology_stonemine_tropic_quarry"; +var oStoneSmall = "gaia/geology_stone_tropic_a"; +var oMetalLarge = "gaia/geology_metal_tropic_slabs"; + +// decorative props +var aGrass = "actor|props/flora/plant_tropic_a.xml"; +var aGrassShort = "actor|props/flora/plant_lg.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_b.xml"; +var aLillies = "actor|props/flora/water_lillies.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/plant_tropic_large.xml"; +var aBushSmall = "actor|props/flora/plant_tropic_large.xml"; + +// terrain + entity (for painting) + +} + +var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oOak, tGrassDForest + TERRAIN_SEPARATOR + oOakLarge, tGrassDForest]; +var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest]; +const BUILDING_ANGlE = 0.75*PI; + +// initialize map + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clSettlement = createTileClass(); + +for (var ix = 0; ix < mapSize; ix++) +{ + for (var iz = 0; iz < mapSize; iz++) + { + var x = ix / (mapSize + 1.0); + var z = iz / (mapSize + 1.0); + placeTerrain(ix, iz, tGrass); + } +} + +var fx = fractionToTiles(0.5); +var fz = fractionToTiles(0.5); +ix = round(fx); +iz = round(fz); + +var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); + +var placer = new ClumpPlacer(mapArea * 0.09 * lSize, 0.7, 0.1, 10, ix, iz); +var terrainPainter = new LayeredPainter( + [tShore, tWater, tWater, tWater], // terrains + [1, 4, 2] // widths +); +var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + -3, // elevation + 4 // blend radius +); +createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], null); + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = shuffleArray(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); + +var startAngle = randFloat(0, TWO_PI); +for (var i = 0; i < numPlayers; i++) +{ + playerAngle[i] = startAngle + i*TWO_PI/numPlayers; + playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); + playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); +} + +for (var i = 0; i < numPlayers; i++) +{ + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + // some constants + var radius = scaleByMapSize(15,25); + var cliffRadius = 2; + var elevation = 20; + + // get the x and z in tiles + fx = fractionToTiles(playerX[i]); + fz = fractionToTiles(playerZ[i]); + ix = round(fx); + iz = round(fz); + addToClass(ix, iz, clPlayer); + addToClass(ix+5, iz, clPlayer); + addToClass(ix, iz+5, clPlayer); + addToClass(ix-5, iz, clPlayer); + addToClass(ix, iz-5, clPlayer); + + // create the city patch + var cityRadius = radius/3; + placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); + var painter = new LayeredPainter([tRoadWild, tRoad], [1]); + createArea(placer, painter, null); + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create the TC + var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) + [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], + true, null, ix, iz + ); + createObjectGroup(group, id); + + // create starting units + var uDist = 6; + var uSpace = 2; + for (var j = 1; j < civEntities.length; ++j) + { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; + var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } + } + + // create animals + for (var j = 0; j < 2; ++j) + { + var aAngle = randFloat(0, TWO_PI); + var aDist = 7; + var aX = round(fx + aDist * cos(aAngle)); + var aZ = round(fz + aDist * sin(aAngle)); + group = new SimpleGroup( + [new SimpleObject(oChicken, 5,5, 0,3)], + true, clBaseResource, aX, aZ + ); + createObjectGroup(group, 0); + } + + // create berry bushes + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oBerryBush, 5,5, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // create metal mine + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = radius - 4; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetalLarge, 1,1, 0,0)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create stone mines + mAngle += randFloat(PI/8, PI/4); + mX = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + var hillSize = PI * radius * radius; + // create starting straggler trees + var num = hillSize / 100; + for (var j = 0; j < num; j++) + { + var tAngle = randFloat(0, TWO_PI); + var tDist = randFloat(6, radius - 2); + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oOak, 1,3, 0,2)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + } + + // create grass tufts + var num = hillSize / 250; + for (var j = 0; j < num; j++) + { + var gAngle = randFloat(0, TWO_PI); + var gDist = radius - (5 + randInt(7)); + var gX = round(fx + gDist * cos(gAngle)); + var gZ = round(fz + gDist * sin(gAngle)); + group = new SimpleGroup( + [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)], + false, clBaseResource, gX, gZ + ); + createObjectGroup(group, 0); + } +} + +RMS.SetProgress(20); + +// create bumps +log("Creating bumps..."); +placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); +painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); +createAreas( + placer, + painter, + avoidClasses(clWater, 2, clPlayer, 10), + scaleByMapSize(100, 200) +); + +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +terrainPainter = new LayeredPainter( + [tGrass, tCliff, tHill], // terrains + [1, 2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clPlayer, 12, clHill, 15, clWater, 2), + scaleByMapSize(1, 4) * numPlayers +); + + +// calculate desired number of trees for map (based on size) +if (rt == 6) +{ +var MIN_TREES = 200; +var MAX_TREES = 1250; +var P_FOREST = 0.02; +} +else if (rt == 7) +{ +var MIN_TREES = 1000; +var MAX_TREES = 6000; +var P_FOREST = 0.6; +} +else +{ +var MIN_TREES = 500; +var MAX_TREES = 3000; +var P_FOREST = 0.7; +} +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create forests +log("Creating forests..."); +var types = [ + [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]], + [[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]] +]; // some variation + +if (rt == 6) +{ +var size = numForest / (0.5 * scaleByMapSize(2,8) * numPlayers); +} +else +{ +var size = numForest / (scaleByMapSize(2,8) * numPlayers); +} +var num = floor(size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + avoidClasses(clPlayer, 12, clForest, 10, clHill, 0, clWater, 2), + num + ); +} + +RMS.SetProgress(50); + +// create dirt patches +log("Creating dirt patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12), + scaleByMapSize(15, 45) + ); +} + +// create grass patches +log("Creating grass patches..."); +var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new TerrainPainter(tGrassPatch); + createAreas( + placer, + painter, + avoidClasses(clWater, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12), + scaleByMapSize(15, 45) + ); +} +RMS.SetProgress(55); + + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1), + scaleByMapSize(4,16), 100 +); + +RMS.SetProgress(65); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockMedium, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), + scaleByMapSize(16, 262), 50 +); + + +// create large decorative rocks +log("Creating large decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), + scaleByMapSize(8, 131), 50 +); + +RMS.SetProgress(70); + +// create deer +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), + 3 * numPlayers, 50 +); + +RMS.SetProgress(75); + +// create sheep +log("Creating sheep..."); +group = new SimpleGroup( + [new SimpleObject(oSheep, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), + 3 * numPlayers, 50 +); + +// create fish +log("Creating fish..."); +group = new SimpleGroup( + [new SimpleObject(oFish, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clFood, 20), stayClasses(clWater, 6)], + 25 * numPlayers, 60 +); + +RMS.SetProgress(85); + + +// create straggler trees +log("Creating straggler trees..."); +var types = [oOak, oOakLarge, oPine, oApple]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + avoidClasses(clWater, 5, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1), + num + ); +} + +var planetm = 1; +if (rt==7) +{ + planetm = 8; +} +//create small grass tufts +log("Creating small grass tufts..."); +group = new SimpleGroup( + [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0), + planetm * scaleByMapSize(13, 200) +); + +RMS.SetProgress(90); + +// create large grass tufts +log("Creating large grass tufts..."); +group = new SimpleGroup( + [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)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), + planetm * scaleByMapSize(13, 200) +); + +RMS.SetProgress(95); + +// create bushes +log("Creating bushes..."); +group = new SimpleGroup( + [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] +); +createObjectGroups(group, 0, + avoidClasses(clWater, 2, clHill, 1, clPlayer, 1, clDirt, 1), + planetm * scaleByMapSize(13, 200), 50 +); + +rt = randInt(1,3) +if (rt==1){ +setSkySet("cirrus"); +} +else if (rt ==2){ +setSkySet("cumulus"); +} +else if (rt ==3){ +setSkySet("sunny"); +} +setSunRotation(randFloat(0, TWO_PI)); +setSunElevation(randFloat(PI/ 5, PI / 3)); +setWaterTint(0.447, 0.412, 0.322); // muddy brown +setWaterReflectionTint(0.447, 0.412, 0.322); // muddy brown +setWaterMurkiness(1.0); +setWaterReflectionTintStrength(0.677); + +// Export map data + +ExportMap(); \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/anatolian_plateau.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/anatolian_plateau.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/anatolian_plateau.json (revision 11137) @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Anatolian Plateau", + "Script" : "anatolian_plateau.js", + "Description" : "An indefensible open land with little wood and stone.", + "BaseTerrain" : ["steppe_grass_a", "steppe_grass_b", "steppe_grass_c", "steppe_grass_d"], + "BaseHeight" : 1, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/persian_highlands.json =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/persian_highlands.json (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/persian_highlands.json (revision 11137) @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Persian Highlands", + "Script" : "persian_highlands.js", + "Description" : "A dry centeral plateau rich in minerals surounded by rocky hills", + "BaseTerrain" : ["desert_dirt_persia_2", "desert_dirt_persia_1" , "desert_dirt_persia_2"], + "BaseHeight" : 10, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/anatolian_plateau.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/anatolian_plateau.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/anatolian_plateau.js (revision 11137) @@ -0,0 +1 @@ +RMS.LoadLibrary("rmgen"); var tGrass = ["steppe_grass_a", "steppe_grass_b", "steppe_grass_c", "steppe_grass_d"]; var tGrassPForest = "steppe_grass_c"; var tGrassDForest = "steppe_grass_c"; var tGrassA = "steppe_grass_green_a"; var tGrassB = "steppe_grass_dirt_33"; var tGrassC = ["steppe_grass_b", "steppe_grass_c", "steppe_grass_d"]; var tDirt = ["steppe_dirt_a", "steppe_dirt_b"]; var tRoad = "road_stones"; var tRoadWild = "road_stones"; var tShoreBlend = "desert_shore_stones"; var tShore = "dirta"; var tWater = "desert_sand_wet"; // gaia entities var oBeech = "gaia/flora_tree_euro_beech"; var oBush = "gaia/flora_bush_temperate"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_rabbit"; var oFish = "gaia/fauna_fish"; var oSheep = "gaia/fauna_sheep"; var oStoneLarge = "gaia/geology_stonemine_medit_quarry"; var oStoneSmall = "gaia/geology_stone_mediterranean"; var oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; // decorative props var aGrass = "actor|props/flora/grass_soft_small_tall.xml"; var aGrassShort = "actor|props/flora/grass_soft_large.xml"; var aRockLarge = "actor|geology/stone_granite_med.xml"; var aRockMedium = "actor|geology/stone_granite_med.xml"; var aBushMedium = "actor|props/flora/bush_medit_me.xml"; var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oBeech, tGrassDForest]; var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oBeech, tGrassPForest]; const BUILDING_ANGlE = 0.75*PI; // initialize map log("Initializing map..."); InitMap(); var numPlayers = getNumPlayers(); var mapSize = getMapSize(); var mapArea = mapSize*mapSize; // create tile classes var clPlayer = createTileClass(); var clHill = createTileClass(); var clForest = createTileClass(); var clWater = createTileClass(); var clDirt = createTileClass(); var clRock = createTileClass(); var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); var clSettlement = createTileClass(); // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = shuffleArray(playerIDs); // place players var playerX = new Array(numPlayers); var playerZ = new Array(numPlayers); var playerAngle = new Array(numPlayers); var startAngle = randFloat(0, TWO_PI); for (var i = 0; i < numPlayers; i++) { playerAngle[i] = startAngle + i*TWO_PI/numPlayers; playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); } for (var i = 0; i < numPlayers; i++) { var id = playerIDs[i]; log("Creating base for player " + id + "..."); // some constants var radius = scaleByMapSize(15,25); var cliffRadius = 2; var elevation = 20; // get the x and z in tiles var fx = fractionToTiles(playerX[i]); var fz = fractionToTiles(playerZ[i]); var ix = round(fx); var iz = round(fz); addToClass(ix, iz, clPlayer); addToClass(ix+5, iz, clPlayer); addToClass(ix, iz+5, clPlayer); addToClass(ix-5, iz, clPlayer); addToClass(ix, iz-5, clPlayer); // create the city patch var cityRadius = radius/3; var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); var painter = new LayeredPainter([tRoadWild, tRoad], [1]); createArea(placer, painter, null); // get civ specific starting entities var civEntities = getStartingEntities(id-1); // create the TC var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], true, null, ix, iz ); createObjectGroup(group, id); // create starting units var uDist = 6; var uSpace = 2; for (var j = 1; j < civEntities.length; ++j) { var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); for (var numberofentities = 0; numberofentities < count; numberofentities++) { var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); } } // create animals for (var j = 0; j < 2; ++j) { var aAngle = randFloat(0, TWO_PI); var aDist = 7; var aX = round(fx + aDist * cos(aAngle)); var aZ = round(fz + aDist * sin(aAngle)); group = new SimpleGroup( [new SimpleObject(oChicken, 5,5, 0,3)], true, clBaseResource, aX, aZ ); createObjectGroup(group, 0); } // create berry bushes var bbAngle = randFloat(0, TWO_PI); var bbDist = 12; var bbX = round(fx + bbDist * cos(bbAngle)); var bbZ = round(fz + bbDist * sin(bbAngle)); group = new SimpleGroup( [new SimpleObject(oBerryBush, 5,5, 0,3)], true, clBaseResource, bbX, bbZ ); createObjectGroup(group, 0); // create metal mine var mAngle = bbAngle; while(abs(mAngle - bbAngle) < PI/3) { mAngle = randFloat(0, TWO_PI); } var mDist = radius - 4; var mX = round(fx + mDist * cos(mAngle)); var mZ = round(fz + mDist * sin(mAngle)); group = new SimpleGroup( [new SimpleObject(oMetalLarge, 1,1, 0,0)], true, clBaseResource, mX, mZ ); createObjectGroup(group, 0); // create stone mines mAngle += randFloat(PI/8, PI/4); mX = round(fx + mDist * cos(mAngle)); mZ = round(fz + mDist * sin(mAngle)); group = new SimpleGroup( [new SimpleObject(oStoneLarge, 1,1, 0,2)], true, clBaseResource, mX, mZ ); createObjectGroup(group, 0); var hillSize = PI * radius * radius; // create starting straggler trees var num = hillSize / 110; for (var j = 0; j < num; j++) { var tAngle = randFloat(0, TWO_PI); var tDist = randFloat(6, radius - 2); var tX = round(fx + tDist * cos(tAngle)); var tZ = round(fz + tDist * sin(tAngle)); group = new SimpleGroup( [new SimpleObject(oBeech, 1,3, 0,2)], false, clBaseResource, tX, tZ ); createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); } // create grass tufts var num = hillSize / 250; for (var j = 0; j < num; j++) { var gAngle = randFloat(0, TWO_PI); var gDist = radius - (5 + randInt(7)); var gX = round(fx + gDist * cos(gAngle)); var gZ = round(fz + gDist * sin(gAngle)); group = new SimpleGroup( [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)], false, clBaseResource, gX, gZ ); createObjectGroup(group, 0); } } RMS.SetProgress(20); // create bumps log("Creating bumps..."); placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); createAreas( placer, painter, avoidClasses(clPlayer, 13), scaleByMapSize(300, 800) ); // calculate desired number of trees for map (based on size) var MIN_TREES = 150; var MAX_TREES = 900; var P_FOREST = 0.65; var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); var numForest = totalTrees * P_FOREST; var numStragglers = totalTrees * (1.0 - P_FOREST); // create forests log("Creating forests..."); var types = [ [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]], [[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]] ]; // some variation var size = numForest / (scaleByMapSize(2,8) * numPlayers); var num = 4 * floor(size / types.length); for (var i = 0; i < types.length; ++i) { placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); painter = new LayeredPainter( types[i], // terrains [2] // widths ); createAreas( placer, [painter, paintClass(clForest)], avoidClasses(clPlayer, 13, clForest, 20, clHill, 1), num ); } RMS.SetProgress(50); // create grass patches log("Creating grass patches..."); var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; for (var i = 0; i < sizes.length; i++) { placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); painter = new LayeredPainter( [[tGrass,tGrassA,tGrassC],[tGrass,tGrassA,tGrassC], [tGrass,tGrassA,tGrassC]], // terrains [1,1] // widths ); createAreas( placer, [painter, paintClass(clDirt)], avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 10), scaleByMapSize(20, 60) ); } // create dirt patches log("Creating dirt patches..."); var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; for (var i = 0; i < sizes.length; i++) { placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); painter = new LayeredPainter( [tGrassB ,tDirt], // terrains [1] // widths ); createAreas( placer, painter, avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 10), scaleByMapSize(30, 90) ); } RMS.SetProgress(55); log("Creating stone mines..."); // create large stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); createObjectGroups(group, 0, avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), scaleByMapSize(1,4), 100 ); // create small stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); createObjectGroups(group, 0, avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), scaleByMapSize(1,4), 100 ); log("Creating metal mines..."); // create large metal quarries group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); createObjectGroups(group, 0, avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1), scaleByMapSize(2,8), 100 ); RMS.SetProgress(65); // create small decorative rocks log("Creating small decorative rocks..."); group = new SimpleGroup( [new SimpleObject(aRockMedium, 1,3, 0,1)], true ); createObjectGroups( group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 10, clHill, 0), scaleByMapSize(16, 262), 50 ); // create large decorative rocks log("Creating large decorative rocks..."); group = new SimpleGroup( [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], true ); createObjectGroups( group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 10, clHill, 0), scaleByMapSize(8, 131), 50 ); RMS.SetProgress(70); // create deer log("Creating deer..."); group = new SimpleGroup( [new SimpleObject(oDeer, 5,7, 0,4)], true, clFood ); createObjectGroups(group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), 6 * numPlayers, 50 ); RMS.SetProgress(75); // create sheep log("Creating sheep..."); group = new SimpleGroup( [new SimpleObject(oSheep, 2,3, 0,2)], true, clFood ); createObjectGroups(group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), 3 * numPlayers, 50 ); RMS.SetProgress(85); // create straggler trees log("Creating straggler trees..."); var types = [oBush, oBeech]; // some variation var num = floor(numStragglers / types.length); for (var i = 0; i < types.length; ++i) { group = new SimpleGroup( [new SimpleObject(types[i], 1,1, 0,3)], true, clForest ); createObjectGroups(group, 0, avoidClasses(clForest, 1, clHill, 1, clPlayer, 13, clMetal, 1, clRock, 1), num ); } // create large grass tufts log("Creating large grass tufts..."); group = new SimpleGroup( [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)] ); createObjectGroups(group, 0, avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), scaleByMapSize(13, 200) ); RMS.SetProgress(95); // create bushes log("Creating bushes..."); group = new SimpleGroup( [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] ); createObjectGroups(group, 0, avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1), scaleByMapSize(13, 200), 50 ); ExportMap(); \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/persian_highlands.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/persian_highlands.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/persian_highlands.js (revision 11137) @@ -0,0 +1,440 @@ +RMS.LoadLibrary("rmgen"); + +const tCity = "desert_city_tile_plaza"; +const tSand = ["desert_dirt_persia_1", "desert_dirt_persia_2"]; +const tDunes = ["desert_lakebed_dry_b", "desert_dirt_persia_1", "desert_dirt_persia_2", "desert_lakebed_dry"]; +const tDunes2 = ["desert_lakebed_dry_b", "desert_dirt_persia_1", "desert_dirt_persia_2", "desert_lakebed_dry", "desert_dirt_persia_2", "desert_dirt_persia_1"]; +const tFineSand = "desert_pebbles_rough"; +const tCliff = ["desert_cliff_persia_1", "desert_cliff_persia_2"]; +const tForestFloor = "medit_grass_field_dry"; +const tRocky = "desert_dirt_persia_rocky"; +const tRocks = "desert_dirt_persia_rocks"; +const tDirt = "desert_dirt_rough"; +const tHill = "desert_cliff_persia_base"; + +// gaia entities +const oBerryBush = "gaia/flora_bush_grapes"; +const oChicken = "gaia/fauna_chicken"; +const oCamel = "gaia/fauna_camel"; +const oFish = "gaia/fauna_fish"; +const oSheep = "gaia/fauna_sheep"; +const oGoat = "gaia/fauna_goat"; +const oLion = "gaia/fauna_lioness"; +const oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry"; +const oStoneSmall = "gaia/geology_stone_desert_small"; +const oMetalLarge = "gaia/geology_metal_desert_slabs"; +const oDead = "gaia/flora_tree_dead"; +const oOak = "gaia/flora_tree_oak"; + +// decorative props +const aBush1 = "actor|props/flora/bush_desert_a.xml"; +const aBush2 = "actor|props/flora/bush_desert_dry_a.xml"; +const aBush3 = "actor|props/flora/bush_dry_a.xml"; +const aBush4 = "actor|props/flora/plant_desert_a.xml"; +const aBushes = [aBush1, aBush2, aBush3, aBush4]; +const aDecorativeRock = "actor|geology/stone_desert_med.xml"; + +// terrain + entity (for painting) +const pForestO = [tForestFloor + TERRAIN_SEPARATOR + oOak, tForestFloor + TERRAIN_SEPARATOR + oOak, tForestFloor]; +const pForestD = [tForestFloor + TERRAIN_SEPARATOR + oDead, tForestFloor + TERRAIN_SEPARATOR + oDead, tForestFloor]; + +const BUILDING_ANGlE = 0.75*PI; + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clPatch = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clCP = createTileClass(); + + +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = shuffleArray(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); + +var startAngle = randFloat(0, TWO_PI); +for (var i = 0; i < numPlayers; i++) +{ + playerAngle[i] = startAngle + i*TWO_PI/numPlayers; + playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); + playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); +} + +for (var i = 0; i < numPlayers; i++) +{ + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + // scale radius of player area by map size + var radius = scaleByMapSize(15,25); + + // get the x and z in tiles + var fx = fractionToTiles(playerX[i]); + var fz = fractionToTiles(playerZ[i]); + var ix = round(fx); + var iz = round(fz); + + // calculate size based on the radius + var size = PI * radius * radius; + + // create the player area + var placer = new ClumpPlacer(size, 0.9, 0.5, 10, ix, iz); + createArea(placer, paintClass(clPlayer), null); + + // create the city patch + var cityRadius = 10; + placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); + var painter = new LayeredPainter([tCity, tCity], [3]); + createArea(placer, painter, null); + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create the TC + var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) + [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], + true, null, ix, iz + ); + createObjectGroup(group, id); + + // create starting units + var uDist = 6; + var uSpace = 2; + for (var j = 1; j < civEntities.length; ++j) + { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; + var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } + } + + // create animals + for (var j = 0; j < 2; ++j) + { + var aAngle = randFloat(0, TWO_PI); + var aDist = 7; + var aX = round(fx + aDist * cos(aAngle)); + var aZ = round(fz + aDist * sin(aAngle)); + group = new SimpleGroup( + [new SimpleObject(oChicken, 5,5, 0,3)], + true, clBaseResource, aX, aZ + ); + createObjectGroup(group, 0); + } + + // create berry bushes + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oBerryBush, 5,5, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // create metal mine + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = 11; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetalLarge, 1,1, 0,0), new RandomObject(aBushes, 2,4, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create stone mines + mAngle += randFloat(PI/8, PI/4); + mX = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2), new RandomObject(aBushes, 2,4, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create starting straggler trees + group = new SimpleGroup( + [new SimpleObject(oOak, 3, 4, 6,12), new SimpleObject(oOak, 3,4, 6,12)], + true, null, ix, iz + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,1)); +} + +RMS.SetProgress(10); + +// create patches +log("Creating rock patches..."); +placer = new ClumpPlacer(scaleByMapSize(40, 150), 0.2, 0.1, 0); +painter = new TerrainPainter(tRocky); +createAreas(placer, [painter, paintClass(clPatch)], + avoidClasses(clPatch, 2, clPlayer, 0), + scaleByMapSize(5, 20) +); + +RMS.SetProgress(15); + +var placer = new ClumpPlacer(scaleByMapSize(25, 100), 0.2, 0.1, 0); +var painter = new TerrainPainter([tRocky, tRocks]); +createAreas(placer, [painter, paintClass(clPatch)], + avoidClasses(clPatch, 2, clPlayer, 0), + scaleByMapSize(15, 50) +); + +RMS.SetProgress(20); + +log("Creating dirt patches..."); +placer = new ClumpPlacer(scaleByMapSize(25, 100), 0.2, 0.1, 0); +painter = new TerrainPainter([tDirt]); +createAreas(placer, [painter, paintClass(clPatch)], + avoidClasses(clPatch, 2, clPlayer, 0), + scaleByMapSize(15, 50) +); + +RMS.SetProgress(25); + +// create centeral plateau +log("Creating centeral plateau..."); +var oRadius = scaleByMapSize(18, 68); +placer = new ClumpPlacer(PI*oRadius*oRadius, 0.6, 0.15, 0, mapSize/2, mapSize/2); +painter = new LayeredPainter([tDunes2, tDunes], [8]); +var elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, -10, 8); +createArea(placer, [painter, elevationPainter, paintClass(clCP)], null); + + +RMS.SetProgress(30); + + +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +var terrainPainter = new LayeredPainter( + [tCliff, tHill], // terrains + [2] // widths +); +var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 22, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + avoidClasses(clPlayer, 3, clCP, 5, clHill, 10), + round(scaleByMapSize(1, 4) * numPlayers * 1.4) +); + +RMS.SetProgress(35); + +// calculate desired number of trees for map (based on size) +const MIN_TREES = 500; +const MAX_TREES = 2500; +const P_FOREST = 0.7; + +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create forests +log("Creating forests..."); +var types = [ + [[tSand, tForestFloor, pForestO], [tForestFloor, pForestO]], + [[tSand, tForestFloor, pForestO], [tForestFloor, pForestO]] +]; // some variation +var size = numForest / (scaleByMapSize(2,8) * numPlayers); +var num = floor(size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + avoidClasses(clPlayer, 1, clWater, 3, clForest, 10, clHill, 1, clCP, 1), + num + ); +} + +RMS.SetProgress(50); + + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clCP, 1)], + scaleByMapSize(2,8), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3), new RandomObject(aBushes, 2,4, 0,2)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1, clCP, 1)], + scaleByMapSize(2,8), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clMetal); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1, clCP, 1)], + scaleByMapSize(2,8), 100 +); + + +log("Creating centeral stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clRock); +createObjectGroups(group, 0, + stayClasses(clCP, 3), + 5*scaleByMapSize(10,30), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3), new RandomObject(aBushes, 2,4, 0,2)], true, clRock); +createObjectGroups(group, 0, + stayClasses(clCP, 3), + 5*scaleByMapSize(10,30), 100 +); + +log("Creating centeral metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4), new RandomObject(aBushes, 2,4, 0,2)], true, clMetal); +createObjectGroups(group, 0, + stayClasses(clCP, 3), + 5*scaleByMapSize(10,30), 100 +); + +RMS.SetProgress(60); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aDecorativeRock, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), + scaleByMapSize(16, 262), 50 +); + +RMS.SetProgress(65); + +//create bushes +log("Creating bushes..."); +group = new SimpleGroup( + [new SimpleObject(aBush2, 1,2, 0,1), new SimpleObject(aBush1, 1,3, 0,2)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), + scaleByMapSize(8, 131), 50 +); + +RMS.SetProgress(70); + +// create goats +log("Creating goat..."); +group = new SimpleGroup( + [new SimpleObject(oGoat, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clCP, 2), + 3 * numPlayers, 50 +); + +// create sheep +log("Creating sheep..."); +group = new SimpleGroup( + [new SimpleObject(oSheep, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 1, clHill, 1, clFood, 20, clCP, 2), + 3 * numPlayers, 50 +); + +// create camels +log("Creating camels..."); +group = new SimpleGroup( + [new SimpleObject(oCamel, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + stayClasses(clCP, 2), + 3 * numPlayers, 50 +); + +RMS.SetProgress(85); + +// create dead trees +log("Creating dead trees..."); +var types = [oDead]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + [avoidClasses(clMetal, 1, clRock, 1), stayClasses(clCP, 2)], + num + ); +} + +RMS.SetProgress(90); + +// create straggler trees +log("Creating straggler trees..."); +var types = [oOak]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 1, clRock, 1, clCP, 2), + num + ); +} + + +setSunColour(0.733, 0.746, 0.574); +ExportMap(); \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/cantabrian_highlands.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/cantabrian_highlands.js (revision 11136) +++ ps/trunk/binaries/data/mods/public/maps/random/cantabrian_highlands.js (revision 11137) @@ -1,541 +1,540 @@ RMS.LoadLibrary("rmgen"); // terrain textures const tGrass = ["temp_grass_long_b"]; const tGrassPForest = "temp_forestfloor_pine"; const tGrassDForest = "temp_forestfloor_a"; const tCliff = ["temp_cliff_a", "temp_cliff_b"]; const tGrassA = "temp_grass_d"; const tGrassB = "temp_grass_c"; const tGrassC = "temp_grass_clovers_2"; const tHill = ["temp_highlands", "temp_grass_long_b"]; const tDirt = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; const tRoad = "temp_road"; const tRoadWild = "temp_road_overgrown"; const tGrassPatch = "temp_grass_plants"; const tShoreBlend = "temp_mud_plants"; const tShore = "temp_mud_a"; const tWater = "temp_mud_a"; // gaia entities const oOak = "gaia/flora_tree_oak"; const oOakLarge = "gaia/flora_tree_oak_large"; const oApple = "gaia/flora_tree_apple"; const oPine = "gaia/flora_tree_pine"; const oAleppoPine = "gaia/flora_tree_aleppo_pine"; const oBerryBush = "gaia/flora_bush_berry"; const oChicken = "gaia/fauna_chicken"; const oDeer = "gaia/fauna_deer"; const oFish = "gaia/fauna_fish"; const oSheep = "gaia/fauna_sheep"; const oStoneLarge = "gaia/geology_stonemine_medit_quarry"; const oStoneSmall = "gaia/geology_stone_mediterranean"; const oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; // decorative props const aGrass = "actor|props/flora/grass_soft_large_tall.xml"; const aGrassShort = "actor|props/flora/grass_soft_large.xml"; const aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; const aLillies = "actor|props/flora/pond_lillies_large.xml"; const aRockLarge = "actor|geology/stone_granite_large.xml"; const aRockMedium = "actor|geology/stone_granite_med.xml"; const aBushMedium = "actor|props/flora/bush_medit_me.xml"; const aBushSmall = "actor|props/flora/bush_medit_sm.xml"; // terrain + entity (for painting) const pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oOak, tGrassDForest + TERRAIN_SEPARATOR + oOakLarge, tGrassDForest]; const pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest]; const BUILDING_ANGlE = 0.75*PI; // initialize map log("Initializing map..."); InitMap(); var numPlayers = getNumPlayers(); var mapSize = getMapSize(); var mapArea = mapSize*mapSize; // create tile classes var clPlayer = createTileClass(); var clHill = createTileClass(); var clForest = createTileClass(); var clWater = createTileClass(); var clDirt = createTileClass(); var clRock = createTileClass(); var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); var clSettlement = createTileClass(); // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = shuffleArray(playerIDs); // place players var playerX = new Array(numPlayers); var playerZ = new Array(numPlayers); var playerAngle = new Array(numPlayers); var startAngle = randFloat(0, TWO_PI); for (var i = 0; i < numPlayers; i++) { playerAngle[i] = startAngle + i*TWO_PI/numPlayers; playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); } for (var i = 0; i < numPlayers; i++) { var id = playerIDs[i]; log("Creating base for player " + id + "..."); // some constants var radius = scaleByMapSize(15,25); var cliffRadius = 2; var elevation = 20; // get the x and z in tiles var fx = fractionToTiles(playerX[i]); var fz = fractionToTiles(playerZ[i]); var ix = round(fx); var iz = round(fz); // calculate size based on the radius var hillSize = PI * radius * radius; // create the hill var placer = new ClumpPlacer(hillSize, 0.95, 0.6, 10, ix, iz); var terrainPainter = new LayeredPainter( [tCliff, tHill], // terrains [cliffRadius] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type elevation, // elevation cliffRadius // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null); // create the ramp var rampAngle = playerAngle[i] + PI + randFloat(-PI/8, PI/8); var rampDist = radius; var rampX = round(fx + rampDist * cos(rampAngle)); var rampZ = round(fz + rampDist * sin(rampAngle)); placer = new ClumpPlacer(100, 0.9, 0.5, 1, rampX, rampZ); var painter = new SmoothElevationPainter(ELEVATION_SET, elevation-6, 5); createArea(placer, painter, null); placer = new ClumpPlacer(75, 0.9, 0.5, 1, rampX, rampZ); painter = new TerrainPainter(tGrass); createArea(placer, painter, null); // create the city patch var cityRadius = radius/3; placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); painter = new LayeredPainter([tRoadWild, tRoad], [1]); createArea(placer, painter, null); // get civ specific starting entities var civEntities = getStartingEntities(id-1); // create the TC var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], true, null, ix, iz ); createObjectGroup(group, id); // create starting units - var uDist = 8; - var uAngle = -BUILDING_ANGlE + randFloat(-PI/8, PI/8); + var uDist = 6; + var uSpace = 2; for (var j = 1; j < civEntities.length; ++j) { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); - var ux = round(fx + uDist * cos(uAngle)); - var uz = round(fz + uDist * sin(uAngle)); - group = new SimpleGroup( // elements (type, min/max count, min/max distance) - [new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))], - true, null, ux, uz - ); - createObjectGroup(group, id); - uAngle += PI/4; + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } } // create animals for (var j = 0; j < 2; ++j) { var aAngle = randFloat(0, TWO_PI); var aDist = 7; var aX = round(fx + aDist * cos(aAngle)); var aZ = round(fz + aDist * sin(aAngle)); group = new SimpleGroup( [new SimpleObject(oChicken, 5,5, 0,3)], true, clBaseResource, aX, aZ ); createObjectGroup(group, 0); } // create berry bushes var bbAngle = randFloat(0, TWO_PI); var bbDist = 12; var bbX = round(fx + bbDist * cos(bbAngle)); var bbZ = round(fz + bbDist * sin(bbAngle)); group = new SimpleGroup( [new SimpleObject(oBerryBush, 5,5, 0,3)], true, clBaseResource, bbX, bbZ ); createObjectGroup(group, 0); // create metal mine var mAngle = bbAngle; while(abs(mAngle - bbAngle) < PI/3) { mAngle = randFloat(0, TWO_PI); } var mDist = radius - 4; var mX = round(fx + mDist * cos(mAngle)); var mZ = round(fz + mDist * sin(mAngle)); group = new SimpleGroup( [new SimpleObject(oMetalLarge, 1,1, 0,0)], true, clBaseResource, mX, mZ ); createObjectGroup(group, 0); // create stone mines mAngle += randFloat(PI/8, PI/4); mX = round(fx + mDist * cos(mAngle)); mZ = round(fz + mDist * sin(mAngle)); group = new SimpleGroup( [new SimpleObject(oStoneLarge, 1,1, 0,2)], true, clBaseResource, mX, mZ ); createObjectGroup(group, 0); // create starting straggler trees var num = hillSize / 100; for (var j = 0; j < num; j++) { var tAngle = randFloat(0, TWO_PI); var tDist = randFloat(6, radius - 2); var tX = round(fx + tDist * cos(tAngle)); var tZ = round(fz + tDist * sin(tAngle)); group = new SimpleGroup( [new SimpleObject(oOak, 1,3, 0,2)], false, clBaseResource, tX, tZ ); createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); } // create grass tufts var num = hillSize / 250; for (var j = 0; j < num; j++) { var gAngle = randFloat(0, TWO_PI); var gDist = radius - (5 + randInt(7)); var gX = round(fx + gDist * cos(gAngle)); var gZ = round(fz + gDist * sin(gAngle)); group = new SimpleGroup( [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)], false, clBaseResource, gX, gZ ); createObjectGroup(group, 0); } } RMS.SetProgress(10); // create lakes log("Creating lakes..."); var numLakes = round(scaleByMapSize(1,4) * numPlayers); placer = new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, 10); terrainPainter = new LayeredPainter( [tShoreBlend, tShore, tWater], // terrains [1,1] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -7, 3); var waterAreas = createAreas( placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 2, clWater, 20), numLakes ); RMS.SetProgress(15); // create reeds log("Creating reeds..."); group = new SimpleGroup( [new SimpleObject(aReeds, 5,10, 0,4), new SimpleObject(aLillies, 0,1, 0,4)], true ); createObjectGroupsByAreas(group, 0, [borderClasses(clWater, 3, 0), stayClasses(clWater, 1)], numLakes, 100, waterAreas ); RMS.SetProgress(20); // create fish log("Creating fish..."); group = new SimpleGroup( [new SimpleObject(oFish, 1,1, 0,1)], true, clFood ); createObjectGroupsByAreas(group, 0, borderClasses(clWater, 2, 0), avoidClasses(clFood, 8), numLakes, 50, waterAreas ); waterAreas = []; RMS.SetProgress(25); // create bumps log("Creating bumps..."); placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); createAreas( placer, painter, avoidClasses(clWater, 2, clPlayer, 0), scaleByMapSize(100, 200) ); RMS.SetProgress(30); // create hills log("Creating hills..."); placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); terrainPainter = new LayeredPainter( [tCliff, tHill], // terrains [2] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 2, clWater, 5, clHill, 15), scaleByMapSize(1, 4) * numPlayers ); RMS.SetProgress(35); // calculate desired number of trees for map (based on size) const MIN_TREES = 500; const MAX_TREES = 2500; const P_FOREST = 0.7; var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); var numForest = totalTrees * P_FOREST; var numStragglers = totalTrees * (1.0 - P_FOREST); // create forests log("Creating forests..."); var types = [ [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]], [[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]] ]; // some variation var size = numForest / (scaleByMapSize(2,8) * numPlayers); var num = floor(size / types.length); for (var i = 0; i < types.length; ++i) { placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); painter = new LayeredPainter( types[i], // terrains [2] // widths ); createAreas( placer, [painter, paintClass(clForest)], avoidClasses(clPlayer, 1, clWater, 3, clForest, 10, clHill, 1), num ); } RMS.SetProgress(40); // create dirt patches log("Creating dirt patches..."); var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; for (var i = 0; i < sizes.length; i++) { placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); painter = new LayeredPainter( [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains [1,1] // widths ); createAreas( placer, [painter, paintClass(clDirt)], avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0), scaleByMapSize(15, 45) ); } RMS.SetProgress(45); // create grass patches log("Creating grass patches..."); var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; for (var i = 0; i < sizes.length; i++) { placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); painter = new TerrainPainter(tGrassPatch); createAreas( placer, painter, avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 0), scaleByMapSize(15, 45) ); } RMS.SetProgress(50); log("Creating stone mines..."); // create large stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); createObjectGroups(group, 0, [avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clHill, 1)], scaleByMapSize(4,16), 100 ); // create small stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); createObjectGroups(group, 0, [avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clRock, 10, clHill, 1)], scaleByMapSize(4,16), 100 ); log("Creating metal mines..."); // create large metal quarries group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); createObjectGroups(group, 0, [avoidClasses(clWater, 0, clForest, 1, clPlayer, 5, clMetal, 10, clRock, 5, clHill, 1)], scaleByMapSize(4,16), 100 ); RMS.SetProgress(60); // create small decorative rocks log("Creating small decorative rocks..."); group = new SimpleGroup( [new SimpleObject(aRockMedium, 1,3, 0,1)], true ); createObjectGroups( group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), scaleByMapSize(16, 262), 50 ); RMS.SetProgress(65); // create large decorative rocks log("Creating large decorative rocks..."); group = new SimpleGroup( [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], true ); createObjectGroups( group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), scaleByMapSize(8, 131), 50 ); RMS.SetProgress(70); // create deer log("Creating deer..."); group = new SimpleGroup( [new SimpleObject(oDeer, 5,7, 0,4)], true, clFood ); createObjectGroups(group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 1, clHill, 1, clFood, 20), 3 * numPlayers, 50 ); RMS.SetProgress(75); // create sheep log("Creating sheep..."); group = new SimpleGroup( [new SimpleObject(oSheep, 2,3, 0,2)], true, clFood ); createObjectGroups(group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 1, clHill, 1, clFood, 20), 3 * numPlayers, 50 ); RMS.SetProgress(80); // create straggler trees log("Creating straggler trees..."); var types = [oOak, oOakLarge, oPine, oApple]; // some variation var num = floor(numStragglers / types.length); for (var i = 0; i < types.length; ++i) { group = new SimpleGroup( [new SimpleObject(types[i], 1,1, 0,3)], true, clForest ); createObjectGroups(group, 0, avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 1, clMetal, 1, clRock, 1), num ); } RMS.SetProgress(85); //create small grass tufts log("Creating small grass tufts..."); group = new SimpleGroup( [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] ); createObjectGroups(group, 0, avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0), scaleByMapSize(13, 200) ); RMS.SetProgress(90); // create large grass tufts log("Creating large grass tufts..."); group = new SimpleGroup( [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)] ); createObjectGroups(group, 0, avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), scaleByMapSize(13, 200) ); RMS.SetProgress(95); // create bushes log("Creating bushes..."); group = new SimpleGroup( [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] ); createObjectGroups(group, 0, avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1), scaleByMapSize(13, 200), 50 ); // Set environment setSkySet("cirrus"); setWaterTint(0.447, 0.412, 0.322); // muddy brown setWaterReflectionTint(0.447, 0.412, 0.322); // muddy brown setWaterMurkiness(1.0); setWaterReflectionTintStrength(0.677); // Export map data ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/the_nile.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/the_nile.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/the_nile.js (revision 11137) @@ -0,0 +1,654 @@ +RMS.LoadLibrary("rmgen"); + +function rndRiver(f, seed) +{ + var rndRq = seed; + var rndRw = rndRq; + var rndRe = 0; + var rndRr = f-floor(f); + var rndRa = 0; + for (var rndRx=0; rndRx<=floor(f); rndRx++) + { + rndRw = 10*(rndRw-floor(rndRw)); + } + if (rndRx%2==0) + { + var rndRs = -1; + } + else + { + var rndRs = 1; + } + rndRe = (floor(rndRw))%5; + if (rndRe==0) + { + rndRa = (rndRs)*2.3*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.5); + } + else if (rndRe==1) + { + rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.3)*(rndRr-0.7); + } + else if (rndRe==2) + { + rndRa = (rndRs)*22*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.3)*(rndRr-0.3)*(rndRr-0.8); + } + else if (rndRe==3) + { + rndRa = (rndRs)*180*(rndRr)*(rndRr-1)*(rndRr-0.2)*(rndRr-0.2)*(rndRr-0.4)*(rndRr-0.6)*(rndRr-0.6)*(rndRr-0.8); + } + else if (rndRe==4) + { + rndRa = (rndRs)*2.6*(rndRr)*(rndRr-1)*(rndRr-0.5)*(rndRr-0.7); + } + return rndRa; +} + +const tCity = "desert_city_tile"; +const tCityPlaza = "desert_city_tile_plaza"; +const tSand = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; +const tDunes = "desert_sand_dunes_100"; +const tFineSand = "desert_sand_smooth"; +const tCliff = ["desert_cliff_badlands", "desert_cliff_badlands_2"]; +const tForestFloor = "desert_forestfloor_palms"; +const tGrass = "desert_dirt_rough_2"; +const tGrassSand50 = "desert_sand_dunes_50"; +const tGrassSand25 = "desert_dirt_rough"; +const tDirt = "desert_dirt_rough"; +const tDirtCracks = "desert_dirt_cracks"; +const tShore = "desert_sand_wet"; +const tLush = "desert_grass_a"; +const tSLush = "desert_grass_a_sand"; +const tSDry = "desert_plants_b"; +// gaia entities +const oBerryBush = "gaia/flora_bush_berry"; +const oChicken = "gaia/fauna_chicken"; +const oCamel = "gaia/fauna_camel"; +const oFish = "gaia/fauna_fish"; +const oGazelle = "gaia/fauna_gazelle"; +const oGiraffe = "gaia/fauna_giraffe"; +const oGoat = "gaia/fauna_goat"; +const oWildebeest = "gaia/fauna_wildebeest"; +const oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry"; +const oStoneSmall = "gaia/geology_stone_desert_small"; +const oMetalLarge = "gaia/geology_metal_desert_slabs"; +const oDatePalm = "gaia/flora_tree_date_palm"; +const oSDatePalm = "gaia/flora_tree_cretan_date_palm_short"; +const eObelisk = "other/obelisk"; +const ePyramid = "other/pyramid_minor"; +const oWood = "gaia/special_treasure_wood"; +const oFood = "gaia/special_treasure_food_bin"; + +// decorative props +const aBush1 = "actor|props/flora/bush_desert_a.xml"; +const aBush2 = "actor|props/flora/bush_desert_dry_a.xml"; +const aBush3 = "actor|props/flora/bush_medit_sm_dry.xml"; +const aBush4 = "actor|props/flora/plant_desert_a.xml"; +const aBushes = [aBush1, aBush2, aBush3, aBush4]; +const aDecorativeRock = "actor|geology/stone_desert_med.xml"; +const aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +const aLillies = "actor|props/flora/water_lillies.xml"; + +// terrain + entity (for painting) +var pForest = [tForestFloor + TERRAIN_SEPARATOR + oDatePalm, tForestFloor + TERRAIN_SEPARATOR + oSDatePalm, tForestFloor]; +var pForestOasis = [tGrass + TERRAIN_SEPARATOR + oDatePalm, tGrass + TERRAIN_SEPARATOR + oSDatePalm, tGrass]; + +const BUILDING_ANGlE = 0.75*PI; + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clSettlement = createTileClass(); +var clGrass = createTileClass(); +var clDesert = createTileClass(); +var clPond = createTileClass(); +var clShore = createTileClass(); +var clTreasure = createTileClass(); + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = shuffleArray(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); +var playerPos = new Array(numPlayers); +var iop = 0; +for (var i = 0; i < numPlayers; i++) +{ + iop = i - 1; + if (!(numPlayers%2)){ + playerPos[i] = ((iop + abs(iop%2))/2 + 1) / ((numPlayers / 2) + 1); + } + else + { + if (iop%2) + { + playerPos[i] = ((iop + abs(iop%2))/2 + 1) / (((numPlayers + 1) / 2) + 1); + } + else + { + playerPos[i] = ((iop)/2 + 1) / ((((numPlayers - 1)) / 2) + 1); + } + } + playerZ[i] = playerPos[i]; + playerX[i] = 0.30 + 0.4*(i%2); +} + +for (var i = 0; i < numPlayers; i++) +{ + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + // some constants + var radius = scaleByMapSize(15,25); + var cliffRadius = 2; + var elevation = 20; + + // get the x and z in tiles + var fx = fractionToTiles(playerX[i]); + var fz = fractionToTiles(playerZ[i]); + var ix = floor(fx); + var iz = floor(fz); + addToClass(ix, iz, clPlayer); + + // create the city patch + var cityRadius = radius/3; + var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); + var painter = new LayeredPainter([tCityPlaza, tCity], [1]); + createArea(placer, painter, null); + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create the TC + var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) + [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], + true, null, ix, iz + ); + createObjectGroup(group, id); + + // create starting units + var uDist = 6; + var uSpace = 2; + for (var j = 1; j < civEntities.length; ++j) + { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; + var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } + } + + // create animals + for (var j = 0; j < 2; ++j) + { + var aAngle = randFloat(0, TWO_PI); + var aDist = 7; + var aX = round(fx + aDist * cos(aAngle)); + var aZ = round(fz + aDist * sin(aAngle)); + group = new SimpleGroup( + [new SimpleObject(oChicken, 5,5, 0,3)], + true, clBaseResource, aX, aZ + ); + createObjectGroup(group, 0); + } + + // create berry bushes + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oBerryBush, 5,5, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // create metal mine + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = radius - 4; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetalLarge, 1,1, 0,0)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create stone mines + mAngle += randFloat(PI/8, PI/4); + mX = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + var hillSize = PI * radius * radius; + // create starting straggler trees + var num = hillSize / 100; + for (var j = 0; j < num; j++) + { + var tAngle = randFloat(0, TWO_PI); + var tDist = randFloat(6, radius - 2); + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oSDatePalm, 1,3, 0,2)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + } + + // create grass tufts + var num = hillSize / 250; + for (var j = 0; j < num; j++) + { + var gAngle = randFloat(0, TWO_PI); + var gDist = radius - (5 + randInt(7)); + var gX = round(fx + gDist * cos(gAngle)); + var gZ = round(fz + gDist * sin(gAngle)); + group = new SimpleGroup( + [new SimpleObject(aBush1, 2,5, 0,1, -PI/8,PI/8)], + false, clBaseResource, gX, gZ + ); + createObjectGroup(group, 0); + } +} + +RMS.SetProgress(30); + +const WATER_WIDTH = 0.1; +log("Creating river"); +var theta = randFloat(0, 1); +var seed = randFloat(2,3); +var theta2 = randFloat(0, 1); +var seed2 = randFloat(2,3); +for (ix = 0; ix < mapSize; ix++) +{ + for (iz = 0; iz < mapSize; iz++) + { + var x = ix / (mapSize + 1.0); + var z = iz / (mapSize + 1.0); + + var h = 0; + var distToWater = 0; + + h = 32 * (z - 0.5); + if ((x < 0.25)||(x > 0.75)) + { + addToClass(ix, iz, clDesert); + } + // add the rough shape of the water + var km = 12/scaleByMapSize(35, 160); + var cu = km*rndRiver(theta+z*0.5*(mapSize/64),seed)+(50/scaleByMapSize(35, 100))*rndRiver(theta2+z*0.5*(mapSize/128),seed2); + var zk = z*randFloat(0.995,1.005); + var xk = x*randFloat(0.995,1.005); + if (-3.0 < getHeight(ix, iz)){ + if ((xk > cu+((1.0-WATER_WIDTH)/2))&&(xk < cu+((1.0+WATER_WIDTH)/2))) + { + if (xk < cu+((1.05-WATER_WIDTH)/2)) + { + h = -3 + 200.0* abs(cu+((1.05-WATER_WIDTH)/2-xk)); + + } + else if (xk > (cu+(0.95+WATER_WIDTH)/2)) + { + h = -3 + 200.0*(xk-(cu+((0.95+WATER_WIDTH)/2))); + } + else + { + h = -3.0; + } + setHeight(ix, iz, h); + addToClass(ix, iz, clWater); + placeTerrain(ix, iz, tShore); + } + } + if (((xk > cu+((1.0-WATER_WIDTH)/2)-0.04)&&(xk < cu+((1.0-WATER_WIDTH)/2)))||((xk > cu+((1.0+WATER_WIDTH)/2))&&(xk < cu+((1.0+WATER_WIDTH)/2) + 0.04))) + { + placeTerrain(ix, iz, tLush); + addToClass(ix, iz, clShore); + } + else if (((xk > cu+((1.0-WATER_WIDTH)/2)-0.06)&&(xk < cu+((1.0-WATER_WIDTH)/2)-0.04))||((xk > cu+((1.0+WATER_WIDTH)/2)+0.04)&&(xk < cu+((1.0+WATER_WIDTH)/2) + 0.06))) + { + placeTerrain(ix, iz, tSLush); + addToClass(ix, iz, clShore); + } + else if (((xk > cu+((1.0-WATER_WIDTH)/2)-0.09)&&(xk < cu+((1.0-WATER_WIDTH)/2)-0.06))||((xk > cu+((1.0+WATER_WIDTH)/2)+0.06)&&(xk < cu+((1.0+WATER_WIDTH)/2) + 0.09))) + { + placeTerrain(ix, iz, tSDry); + addToClass(ix, iz, clShore); + } + } +} + +RMS.SetProgress(40); +// create bumps +log("Creating bumps..."); +placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); +painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); +createAreas( + placer, + painter, + avoidClasses(clWater, 2, clPlayer, 6), + scaleByMapSize(100, 200) +); + +// create ponds +log("Creating ponds..."); +var numLakes = round(scaleByMapSize(1,4) * numPlayers / 2); +placer = new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, 10); +var terrainPainter = new LayeredPainter( + [tShore, tShore, tShore], // terrains + [1,1] // widths +); +var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -7, 3); +var waterAreas = createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clPond)], + avoidClasses(clPlayer, 25, clWater, 10), + numLakes +); +waterAreas = []; + +log("Creating reeds..."); +group = new SimpleGroup( + [new SimpleObject(aReeds, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + stayClasses(clWater, 1, clPond, 1), + scaleByMapSize(300, 762), 50 +); + +log("Creating lillies..."); +group = new SimpleGroup( + [new SimpleObject(aLillies, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + stayClasses(clWater, 1, clPond, 1), + scaleByMapSize(300, 762), 50 +); + +// calculate desired number of trees for map (based on size) +const MIN_TREES = 700; +const MAX_TREES = 3500; +const P_FOREST = 0.5; + +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create forests +log("Creating forests..."); +var num = scaleByMapSize(10,30); +placer = new ClumpPlacer(numForest / num, 0.15, 0.1, 0.5); +painter = new TerrainPainter([pForest, tForestFloor]); +createAreas(placer, [painter, paintClass(clForest)], + avoidClasses(clPlayer, 8, clForest, 4, clWater, 1, clDesert, 5, clPond, 2), + num, 50 +); + +RMS.SetProgress(50); + +// create grass patches + +log("Creating grass patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tGrass,tGrassSand50],[tGrassSand50,tGrassSand25], [tGrassSand25,tGrass]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clForest, 0, clGrass, 5, clPlayer, 0, clWater, 1, clDirt, 5, clShore, 1, clPond, 1), + scaleByMapSize(15, 45) + ); +} + +RMS.SetProgress(55); + +// create dirt patches +log("Creating dirt patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tDirt,tDirtCracks],[tDirt,tFineSand], [tDirtCracks,tFineSand]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clForest, 0, clDirt, 5, clPlayer, 0, clWater, 1, clGrass, 5, clShore, 1, clPond, 1), + scaleByMapSize(15, 45) + ); +} + + + +RMS.SetProgress(60); + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + avoidClasses(clForest, 1, clPlayer, 12, clRock, 10, clWater, 1, clPond, 1), + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + avoidClasses(clForest, 1, clPlayer, 12, clRock, 10, clWater, 1, clPond, 1), + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + avoidClasses(clForest, 1, clPlayer, 12, clMetal, 10, clRock, 5, clWater, 1, clPond, 1), + scaleByMapSize(4,16), 100 +); + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 12, clRock, 10, clWater, 1, clPond, 1), stayClasses(clDesert, 3)], + scaleByMapSize(6,20), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 12, clRock, 10, clWater, 1, clPond, 1), stayClasses(clDesert, 3)], + scaleByMapSize(6,20), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 12, clMetal, 10, clRock, 5, clWater, 1, clPond, 1), stayClasses(clDesert, 3)], + scaleByMapSize(6,20), 100 +); + +RMS.SetProgress(65); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aDecorativeRock, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clPond, 1), + scaleByMapSize(16, 262), 50 +); + + +// create shrubs +log("Creating shrubs..."); +group = new SimpleGroup( + [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)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clWater, 1, clPlayer, 0, clPond, 1), + scaleByMapSize(40, 360), 50 +); + +RMS.SetProgress(70); + +// create gazelles +log("Creating gazelles..."); +group = new SimpleGroup([new SimpleObject(oGazelle, 5,7, 0,4)], true, clFood); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 10, clDesert, 5, clPond, 1), + 3*scaleByMapSize(5,20), 50 +); + +// create goats +log("Creating goats..."); +group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 10, clDesert, 5, clPond, 1), + 3*scaleByMapSize(5,20), 50 +); + +// create treasures +log("Creating treasures..."); +group = new SimpleGroup([new SimpleObject(oFood, 1,1, 0,2)], true, clTreasure); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 2, clDesert, 5, clTreasure, 6, clPond, 1), + 3*scaleByMapSize(5,20), 50 +); + +group = new SimpleGroup([new SimpleObject(oWood, 1,1, 0,2)], true, clTreasure); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 2, clDesert, 5, clTreasure, 6, clPond, 1), + 3*scaleByMapSize(5,20), 50 +); + +// create camels +log("Creating camels..."); +group = new SimpleGroup([new SimpleObject(oCamel, 2,4, 0,2)], true, clFood); +createObjectGroups(group, 0, + avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 10, clDesert, 5, clTreasure, 2, clPond, 1), + 3*scaleByMapSize(5,20), 50 +); + +RMS.SetProgress(90); + +// create straggler trees +log("Creating straggler trees..."); +var types = [oDatePalm, oSDatePalm]; // some variation +var num = floor(0.5 * numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true); + createObjectGroups(group, 0, + avoidClasses(clForest, 0, clWater, 1, clPlayer, 8, clMetal, 1, clDesert, 1, clTreasure, 2, clPond, 1), + num + ); +} + +var types = [oDatePalm, oSDatePalm]; // some variation +var num = floor(0.1 * numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true); + createObjectGroups(group, 0, + avoidClasses(clForest, 0, clWater, 1, clPlayer, 8, clMetal, 1, clTreasure, 2), + num + ); +} + +// create pond trees +log("Creating straggler trees..."); +var types = [oDatePalm, oSDatePalm]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true); + createObjectGroups(group, 0, + borderClasses(clPond, 0, 4), + num + ); +} + +//create eyecandy +log("Creating obelisks"); +group = new SimpleGroup( + [new SimpleObject(eObelisk, 1,1, 0,1)], + true +); +createObjectGroups( + group, 0, + [avoidClasses(clWater, 4, clForest, 3, clPlayer, 5, clMetal, 2, clRock, 2, clPond, 4, clTreasure, 2), stayClasses(clDesert, 3)], + scaleByMapSize(5, 30), 50 +); + +log("Creating pyramids"); +group = new SimpleGroup( + [new SimpleObject(ePyramid, 1,1, 0,1)], + true +); +createObjectGroups( + group, 0, + [avoidClasses(clWater, 7, clForest, 6, clPlayer, 14, clMetal, 5, clRock, 5, clPond, 7, clTreasure, 2), stayClasses(clDesert, 3)], + scaleByMapSize(2, 6), 50 +); + +// Set environment +setSkySet("sunny"); +setSunColour(0.873, 0.846, 0.674); +setWaterColour(0.312, 0.562, 0.652); +setWaterTint(0.412, 0.212, 0.212); +setWaterReflectionTint(0.447, 0.202, 0.222); +setWaterMurkiness(1.0); +setWaterReflectionTintStrength(0.677); + +// Export map data +ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/islands.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/islands.js (revision 11136) +++ ps/trunk/binaries/data/mods/public/maps/random/islands.js (revision 11137) @@ -1,605 +1,604 @@ RMS.LoadLibrary("rmgen"); // terrain textures const tOceanDepths = "medit_sea_depths"; const tOceanRockDeep = "medit_sea_coral_deep"; const tOceanRockShallow = "medit_rocks_wet"; const tOceanCoral = "medit_sea_coral_plants"; const tBeachWet = "medit_sand_wet"; const tBeachDry = "medit_sand"; const tBeachGrass = "medit_rocks_grass"; const tBeach = ["medit_rocks_grass","medit_sand", "medit_rocks_grass_shrubs"] //const tBeachBlend = ["medit_rocks_grass","medit_grass_field_dry", "medit_grass_field_brown","medit_rocks_shrubs", "medit_rocks_grass_shrubs"]; const tBeachBlend = ["medit_rocks_grass", "medit_rocks_grass_shrubs"]; const tBeachCliff = "medit_dirt"; const tCity = "medit_city_tile"; const tGrassDry = ["medit_grass_field_dry", "medit_grass_field_b"]; //const tGrass = ["medit_grass_field_dry", "medit_grass_field_brown", "medit_grass_field_b"]; const tGrass = ["medit_rocks_grass", "medit_rocks_grass","medit_dirt","medit_rocks_grass_shrubs"]; const tGrassLush = ["grass_temperate_dry_tufts", "medit_grass_flowers"]; const tGrassShrubs = "medit_shrubs"; const tCliffShrubs = ["medit_cliff_aegean_shrubs", "medit_cliff_italia_grass","medit_cliff_italia"] const tGrassRock = ["medit_rocks_grass"]; const tDirt = "medit_dirt"; const tDirtGrass = "medit_dirt_b"; const tDirtCliff = "medit_cliff_italia"; const tGrassCliff = "medit_cliff_italia_grass"; const tCliff = ["medit_cliff_italia", "medit_cliff_italia", "medit_cliff_italia_grass"]; const tForestFloor = "medit_forestfloor_a"; // gaia entities const oBeech = "gaia/flora_tree_euro_beech"; const oBerryBush = "gaia/flora_bush_berry"; const oCarob = "gaia/flora_tree_carob"; const oCypress1 = "gaia/flora_tree_cypress"; const oCypress2 = "gaia/flora_tree_cypress"; const oLombardyPoplar = "gaia/flora_tree_poplar_lombardy"; const oOak = "gaia/flora_tree_oak"; const oPalm = "gaia/flora_tree_medit_fan_palm"; const oPine = "gaia/flora_tree_aleppo_pine"; const oPoplar = "gaia/flora_tree_poplar"; const oDateT = "gaia/flora_tree_cretan_date_palm_tall"; const oDateS = "gaia/flora_tree_cretan_date_palm_short"; const oChicken = "gaia/fauna_chicken"; const oDeer = "gaia/fauna_deer"; const oFish = "gaia/fauna_fish"; const oWhale = "gaia/fauna_whale_humpback"; const oStoneLarge = "gaia/geology_stonemine_medit_quarry"; const oStoneSmall = "gaia/geology_stone_mediterranean"; const oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; const oShipwreck = "other/special_treasure_shipwreck"; const oShipDebris = "other/special_treasure_shipwreck_debris"; // decorative props const aBushLargeDry = "actor|props/flora/bush_medit_la_dry.xml"; const aBushLarge = "actor|props/flora/bush_medit_la.xml"; const aBushMedDry = "actor|props/flora/bush_medit_me_dry.xml"; const aBushMed = "actor|props/flora/bush_medit_me.xml"; const aBushSmall = "actor|props/flora/bush_medit_sm.xml"; const aBushSmallDry = "actor|props/flora/bush_medit_sm_dry.xml"; const aGrass = "actor|props/flora/grass_soft_large_tall.xml"; const aGrassDry = "actor|props/flora/grass_soft_dry_large_tall.xml"; const aRockLarge = "actor|geology/stone_granite_large.xml"; const aRockMed = "actor|geology/stone_granite_med.xml"; const aRockSmall = "actor|geology/stone_granite_small.xml"; // terrain + entity (for painting) var pPalmForest = [tForestFloor+TERRAIN_SEPARATOR+oPalm, tGrass]; var pPineForest = [tForestFloor+TERRAIN_SEPARATOR+oPine, tGrass]; var pPoplarForest = [tForestFloor+TERRAIN_SEPARATOR+oLombardyPoplar, tGrass]; var pMainForest = [tForestFloor+TERRAIN_SEPARATOR+oCarob, tForestFloor+TERRAIN_SEPARATOR+oBeech, tGrass, tGrass]; const BUILDING_ANGlE = 0.75*PI; // initialize map log("Initializing map..."); InitMap(); var numPlayers = getNumPlayers(); var mapSize = getMapSize(); // create tile classes var clCoral = createTileClass(); var clPlayer = createTileClass(); var clIsland = createTileClass(); var clCity = createTileClass(); var clDirt = createTileClass(); var clHill = createTileClass(); var clForest = createTileClass(); var clWater = createTileClass(); var clRock = createTileClass(); var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = shuffleArray(playerIDs); //array holding starting islands based on number of players var startingPlaces=[[0],[0,3],[0,2,4],[0,1,3,4],[0,1,2,3,4],[0,1,2,3,4,5]]; //figure out how many spoke islands var numIslands =6; if(numPlayers<6){ numIslands=6; }else{ numIslands=numPlayers; } //figure out coordinates of spoke islands var islandX = new Array(numIslands); var islandZ = new Array(numIslands); var islandAngle = new Array(numIslands); //holds all land areas var areas = []; var startAngle = randFloat() * 2 * PI; for (var i=0; i < numIslands; i++) { islandAngle[i] = startAngle + i*2*PI/numIslands; islandX[i] = 0.5 + 0.39*cos(islandAngle[i]); islandZ[i] = 0.5 + 0.39*sin(islandAngle[i]); } for(var i=0;i=6)||(i==startingPlaces[numPlayers-1][nPlayer])){ var id = playerIDs[nPlayer]; // get the x and z in tiles var fx = fractionToTiles(islandX[i]); var fz = fractionToTiles(islandZ[i]); var ix = round(fx); var iz = round(fz); //create city patch var cityRadius = 6; var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); var painter = new LayeredPainter([tGrass, tCity], [1]); createArea(placer, [painter,paintClass(clCity)], null); // get civ specific starting entities var civEntities = getStartingEntities(id-1); // create the TC var group = new SimpleGroup( // elements (type, min/max count, min/max distance) [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], true, null, ix, iz ); createObjectGroup(group, id); // create starting units - var uDist = 8; - var uAngle = -BUILDING_ANGlE + randFloat(-PI/8, PI/8); + var uDist = 6; + var uSpace = 2; for (var j = 1; j < civEntities.length; ++j) { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); - var ux = round(fx + uDist * cos(uAngle)); - var uz = round(fz + uDist * sin(uAngle)); - group = new SimpleGroup( // elements (type, min/max count, min/max distance) - [new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))], - true, null, ux, uz - ); - createObjectGroup(group, id); - uAngle += PI/4; + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } } nPlayer++; } } RMS.SetProgress(15); // get the x and z in tiles var nCenter=floor(scaleByMapSize(1,4)) var startAngle = randFloat() * 2 * PI; for (var i=0; i < nCenter; i++) { var fx=.5; var fz=.5; if(nCenter==1){ fx=.5; fz=.5; }else{ var isangle = startAngle + i*2*PI/nCenter+randFloat(-PI/8,PI/8); var dRadius = randFloat(.1,.16); fx = 0.5 + dRadius*cos(isangle); fz = 0.5 + dRadius*sin(isangle); } var ix = round(fractionToTiles(fx)); var iz = round(fractionToTiles(fz)); var radius = scaleByMapSize(15,30); var coral= 2; var wet = 3; var dry = 1; var gbeach = 2; var elevation = 3; var islandSize = PI*radius*radius; var islandBottom=PI*(radius+coral)*(radius+coral); //create base var placer = new ClumpPlacer(islandBottom, .7, .1, 10, ix, iz); var terrainPainter = new LayeredPainter( [tOceanRockDeep, tOceanCoral], [5] ); createArea(placer, [terrainPainter, paintClass(clCoral)],avoidClasses(clCoral,0,clPlayer,0)); // create island var placer = new ClumpPlacer(islandSize, .7, .1, 10, ix, iz); var terrainPainter = new LayeredPainter( [tOceanCoral,tBeachWet, tBeachDry, tBeach, tBeachBlend, tGrass], [1,wet,dry,1,gbeach] ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, elevation, 5 ); var temp = createArea(placer, [terrainPainter, paintClass(clIsland), elevationPainter],avoidClasses(clPlayer,0)); areas.push(temp); } RMS.SetProgress(30); // create bumps log("Creating bumps..."); placer = new ClumpPlacer(scaleByMapSize(20, 60), 0.3, 0.06, 1); painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 3); createAreasInAreas( placer, painter, avoidClasses(clCity, 0), scaleByMapSize(25, 75),15, areas ); // create hills log("Creating hills..."); placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); terrainPainter = new LayeredPainter( [tCliff, tCliffShrubs], // terrains [2] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2); createAreasInAreas( placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clCity, 15, clHill, 15), scaleByMapSize(5, 30), 15, areas ); RMS.SetProgress(40); //find all water for (var ix = 0; ix < mapSize; ix++) { for (var iz = 0; iz < mapSize; iz++) { if(getHeight(ix,iz)<0){ addToClass(ix,iz,clWater); } } } // create forests log("Creating forests..."); var types = [ [[tForestFloor, tGrass, pPalmForest], [tForestFloor, pPalmForest]], [[tForestFloor, tGrass, pPineForest], [tForestFloor, pPineForest]], [[tForestFloor, tGrass, pPoplarForest], [tForestFloor, pPoplarForest]], [[tForestFloor, tGrass, pMainForest], [tForestFloor, pMainForest]] ]; // some variation var size = 5; //size var num = scaleByMapSize(10, 64); //number for (var i = 0; i < types.length; ++i) { placer = new ClumpPlacer(6+randInt(12), 0.1, 0.1, 1); painter = new LayeredPainter( types[i], // terrains [2] // widths ); createAreasInAreas( placer, [painter, paintClass(clForest)], avoidClasses(clCity, 1, clWater, 3, clForest, 3, clHill, 1), num, 20, areas ); } RMS.SetProgress(60); log("Creating stone mines..."); // create large stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); createObjectGroupsByAreas(group, 0, [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 1)], scaleByMapSize(4,16), 200, areas ); // create small stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); createObjectGroupsByAreas(group, 0, [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clRock, 2)], scaleByMapSize(4,16), 200, areas ); RMS.SetProgress(70); log("Creating metal mines..."); // create large metal quarries group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); createObjectGroupsByAreas(group, 0, [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 5, clMetal, 2, clRock, 1)], scaleByMapSize(4,16), 200, areas ); RMS.SetProgress(80); //create shrub patches log("Creating shrub patches..."); var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; for (var i = 0; i < sizes.length; i++) { placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); painter = new LayeredPainter([tBeachBlend,tGrassShrubs],[1]); createAreasInAreas( placer, [painter, paintClass(clDirt)], avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0), scaleByMapSize(4, 16), 20, areas ); } //create grass patches log("Creating grass patches..."); var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; for (var i = 0; i < sizes.length; i++) { placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); painter = new LayeredPainter([tGrassDry],[]); createAreasInAreas( placer, [painter, paintClass(clDirt)], avoidClasses(clWater, 3, clHill, 0, clDirt, 6, clCity, 0), scaleByMapSize(4, 16), 20, areas ); } RMS.SetProgress(90); log("Creating straggler trees..."); // create straggler trees var trees = [oCarob, oBeech, oLombardyPoplar, oLombardyPoplar, oPine]; for (var t in trees) { group = new SimpleGroup([new SimpleObject(trees[t], 1,1, 0,1)], true, clForest); createObjectGroupsByAreas(group, 0, avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1), scaleByMapSize(2, 38), 50, areas ); } // create straggler cypresses group = new SimpleGroup( [new SimpleObject(oCypress2, 1,3, 0,3), new SimpleObject(oCypress1, 0,2, 0,2)], true ); createObjectGroupsByAreas(group, 0, avoidClasses(clWater, 2, clForest, 2, clCity, 3, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1), scaleByMapSize(5, 75), 50, areas ); // create straggler date palms group = new SimpleGroup( [new SimpleObject(oDateS, 1,3, 0,3), new SimpleObject(oDateT, 0,2, 0,2)], true ); createObjectGroupsByAreas(group, 0, avoidClasses(clWater, 2, clForest, 1, clCity, 0, clBaseResource, 1, clRock, 1, clMetal, 1, clPlayer, 1, clHill, 1), scaleByMapSize(5, 75), 50, areas ); log("Creating rocks..."); // create rocks group = new SimpleGroup( [new SimpleObject(aRockSmall, 0,3, 0,2), new SimpleObject(aRockMed, 0,2, 0,2), new SimpleObject(aRockLarge, 0,1, 0,2)] ); createObjectGroups(group, 0, avoidClasses(clWater, 0, clCity, 0), scaleByMapSize(30, 180), 50 ); // create deer log("Creating deer..."); group = new SimpleGroup( [new SimpleObject(oDeer, 5,7, 0,4)], true, clFood ); createObjectGroups(group, 0, avoidClasses(clWater, 5, clForest, 1, clHill, 1, clCity, 10, clMetal, 2, clRock, 2, clFood, 8), 3 * numPlayers, 50 ); RMS.SetProgress(95); log("Creating berry bushes..."); // create berry bushes group = new SimpleGroup([new SimpleObject(oBerryBush, 5,7, 0,3)], true, clFood); createObjectGroups(group, 0, avoidClasses(clWater, 2, clForest, 1, clHill, 1, clCity, 10, clMetal, 2, clRock, 2, clFood, 8), 1.5 * numPlayers, 100 ); log("Creating Fish..."); // create Fish group = new SimpleGroup([new SimpleObject(oFish, 1,1, 0,3)], true, clFood); createObjectGroups(group, 0, [stayClasses(clWater,1),avoidClasses(clFood, 8)], scaleByMapSize(40,200), 100 ); log("Creating Whales..."); // create Whales group = new SimpleGroup([new SimpleObject(oWhale, 1,1, 0,3)], true, clFood); createObjectGroups(group, 0, [stayClasses(clWater,1),avoidClasses(clFood, 8, clPlayer,4,clIsland,4)], scaleByMapSize(10,40), 100 ); log("Creating shipwrecks..."); // create shipwreck group = new SimpleGroup([new SimpleObject(oShipwreck, 1,1, 0,3)], true, clFood); createObjectGroups(group, 0, [stayClasses(clWater,1),avoidClasses(clFood, 8)], scaleByMapSize(6,16), 100 ); log("Creating shipwreck debris..."); // create shipwreck debris group = new SimpleGroup([new SimpleObject(oShipDebris, 1,2, 0,4)], true, clFood); createObjectGroups(group, 0, [stayClasses(clWater,1),avoidClasses(clFood, 8)], scaleByMapSize(10,20), 100 ); // Adjust environment setSkySet("sunny"); setWaterMurkiness(0.626953); setWaterShininess(0.732422); setWaterTint(0, 0.501961, 0.501961); setWaterReflectionTint(0.313726, 0.376471, 0.521569); setWaterReflectionTintStrength(0.615234); // Export map data ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/continent.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/continent.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/maps/random/continent.js (revision 11137) @@ -0,0 +1,832 @@ +RMS.LoadLibrary("rmgen"); + +//random terrain textures +var rt = randInt(1,7); +//temperate +if (rt == 1){ +var tGrass = ["temp_grass_long_b"]; +var tGrassPForest = "temp_forestfloor_pine"; +var tGrassDForest = "temp_plants_bog"; +var tCliff = ["temp_cliff_a", "temp_cliff_b"]; +var tGrassA = "temp_grass_d"; +var tGrassB = "temp_grass_c"; +var tGrassC = "temp_grass_clovers_2"; +var tHill = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; +var tDirt = ["temp_dirt_gravel", "temp_dirt_gravel_b"]; +var tRoad = "temp_road"; +var tRoadWild = "temp_road_overgrown"; +var tGrassPatch = "temp_grass_plants"; +var tShoreBlend = "temp_mud_plants"; +var tShore = "sand_grass_25"; +var tWater = "medit_sand_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_oak"; +var oOakLarge = "gaia/flora_tree_oak_large"; +var oApple = "gaia/flora_tree_apple"; +var oPine = "gaia/flora_tree_pine"; +var oAleppoPine = "gaia/flora_tree_aleppo_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_deer"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_sheep"; +var oStoneLarge = "gaia/geology_stonemine_medit_quarry"; +var oStoneSmall = "gaia/geology_stone_mediterranean"; +var oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_large_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_large.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/pond_lillies_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_medit_me.xml"; +var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; + +// terrain + entity (for painting) + +} +//snowy +else if (rt == 2) +{ +setSunColour(0.550, 0.601, 0.644); // a little darker + +var tGrass = ["polar_snow_b", "snow grass 75", "snow rocks", "snow forest"]; +var tGrassPForest = "polar_tundra_snow"; +var tGrassDForest = "polar_tundra_snow"; +var tCliff = ["polar_cliff_a", "polar_cliff_b"]; +var tGrassA = "snow grass 2"; +var tGrassB = "polar_snow_a"; +var tGrassC = "polar_ice_snow"; +var tHill = ["polar_snow_rocks", "polar_cliff_snow"]; +var tDirt = ["polar_ice_b", "polar_ice_c"]; +var tRoad = "new_alpine_citytile"; +var tRoadWild = "polar_ice_cracked"; +var tGrassPatch = "snow grass 2"; +var tShoreBlend = "polar_ice"; +var tShore = "snow_glacial_01"; +var tWater = "polar_ice_c"; + +// gaia entities +var oOak = "gaia/flora_tree_pine_w"; +var oOakLarge = "gaia/flora_tree_pine_w"; +var oApple = "gaia/flora_tree_pine_w"; +var oPine = "gaia/flora_tree_pine_w"; +var oAleppoPine = "gaia/flora_tree_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_muskox"; +var oFish = "gaia/fauna_fish_tuna"; +var oSheep = "gaia/fauna_walrus"; +var oStoneLarge = "gaia/geology_stone_alpine_a"; +var oStoneSmall = "gaia/geology_stone_alpine_a"; +var oMetalLarge = "gaia/geology_metal_alpine"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; + +// terrain + entity (for painting) + +} +//desert +else if (rt == 3) +{ +setSunColour(0.733, 0.746, 0.574); + +var tGrass = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; +var tGrassPForest = "forestfloor_dirty"; +var tGrassDForest = "desert_forestfloor_palms"; +var tCliff = ["desert_cliff_1", "desert_cliff_2", "desert_cliff_3", "desert_cliff_4", "desert_cliff_5"]; +var tGrassA = ["desert_dirt_persia_1", "desert_dirt_persia_2"]; +var tGrassB = "dirta"; +var tGrassC = "medit_dirt_dry"; +var tHill = ["desert_dirt_rocks_1", "desert_dirt_rocks_2", "desert_dirt_rocks_3"]; +var tDirt = ["desert_lakebed_dry", "desert_lakebed_dry_b"]; +var tRoad = "desert_city_tile"; +var tRoadWild = "desert_city_tile"; +var tGrassPatch = "desert_dirt_rough"; +var tShoreBlend = "desert_shore_stones"; +var tShore = "dirta"; +var tWater = "desert_sand_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_cretan_date_palm_short"; +var oOakLarge = "gaia/flora_tree_cretan_date_palm_tall"; +var oApple = "gaia/flora_tree_fig"; +var oPine = "gaia/flora_tree_dead"; +var oAleppoPine = "gaia/flora_tree_date_palm"; +var oBerryBush = "gaia/flora_bush_grapes"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_camel"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_gazelle"; +var oStoneLarge = "gaia/geology_stonemine_desert_quarry"; +var oStoneSmall = "gaia/geology_stone_desert_small"; +var oMetalLarge = "gaia/geology_metal_desert_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; +var aRockLarge = "actor|geology/stone_desert_med.xml"; +var aRockMedium = "actor|geology/stone_desert_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; +// terrain + entity (for painting) +} +//alpine +else if (rt == 4) +{ +var tGrass = ["alpine_dirt_grass_50"]; +var tGrassPForest = "alpine_forrestfloor"; +var tGrassDForest = "alpine_forrestfloor"; +var tCliff = ["alpine_cliff_a", "alpine_cliff_b", "alpine_cliff_c"]; +var tGrassA = "alpine_grass_rocky"; +var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; +var tGrassC = ["alpine_snow_a", "alpine_snow_b"]; +var tHill = "alpine_cliff_snow"; +var tDirt = ["alpine_dirt", "alpine_grass_d"]; +var tRoad = "new_alpine_citytile"; +var tRoadWild = "new_alpine_citytile"; +var tGrassPatch = "new_alpine_grass_a"; +var tShoreBlend = "alpine_shore_rocks"; +var tShore = "alpine_shore_rocks_grass_50"; +var tWater = "alpine_shore_rocks"; + +// gaia entities +var oOak = "gaia/flora_tree_pine"; +var oOakLarge = "gaia/flora_tree_pine"; +var oApple = "gaia/flora_tree_pine"; +var oPine = "gaia/flora_tree_pine"; +var oAleppoPine = "gaia/flora_tree_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_goat"; +var oFish = "gaia/fauna_fish_tuna"; +var oSheep = "gaia/fauna_deer"; +var oStoneLarge = "gaia/geology_stone_alpine_a"; +var oStoneSmall = "gaia/geology_stone_alpine_a"; +var oMetalLarge = "gaia/geology_metal_alpine"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_dry_small_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_dry_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_desert_dry_a.xml"; + +// terrain + entity (for painting) +} +//medit +else if (rt == 5){ +var tGrass = ["medit_grass_field_a", "medit_grass_field_b"]; +var tGrassPForest = "medit_plants_dirt"; +var tGrassDForest = "medit_grass_shrubs"; +var tCliff = ["medit_cliff_grass", "medit_cliff_greek", "medit_cliff_greek_2", "medit_cliff_aegean", "medit_cliff_italia", "medit_cliff_italia_grass"]; +var tGrassA = "medit_grass_field_b"; +var tGrassB = "medit_grass_field_brown"; +var tGrassC = "medit_grass_field_dry"; +var tHill = ["medit_rocks_grass_shrubs", "medit_rocks_shrubs"]; +var tDirt = ["medit_dirt", "medit_dirt_b"]; +var tRoad = "medit_city_tile"; +var tRoadWild = "medit_city_tile"; +var tGrassPatch = "medit_grass_wild"; +var tShoreBlend = "medit_sand"; +var tShore = "sand_grass_25"; +var tWater = "medit_sand_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_cretan_date_palm_short"; +var oOakLarge = "gaia/flora_tree_medit_fan_palm"; +var oApple = "gaia/flora_tree_apple"; +var oPine = "gaia/flora_tree_cypress"; +var oAleppoPine = "gaia/flora_tree_aleppo_pine"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_deer"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_sheep"; +var oStoneLarge = "gaia/geology_stonemine_medit_quarry"; +var oStoneSmall = "gaia/geology_stone_mediterranean"; +var oMetalLarge = "gaia/geology_metal_mediterranean_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_soft_large_tall.xml"; +var aGrassShort = "actor|props/flora/grass_soft_large.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +var aLillies = "actor|props/flora/pond_lillies_large.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/bush_medit_me.xml"; +var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; + +// terrain + entity (for painting) + +} +//savanah +else if (rt == 6) +{ +var tGrass = ["savanna_grass_a", "savanna_grass_b"]; +var tGrassPForest = "savanna_forestfloor_a"; +var tGrassDForest = "savanna_forestfloor_b"; +var tCliff = ["savanna_cliff_a", "savanna_cliff_b"]; +var tGrassA = "savanna_shrubs_a"; +var tGrassB = "savanna_dirt_rocks_b"; +var tGrassC = "dirt_brown_e"; +var tHill = ["savanna_grass_a", "savanna_grass_b"]; +var tDirt = ["savanna_dirt_rocks_b", "dirt_brown_e"]; +var tRoad = "savanna_tile_a"; +var tRoadWild = "savanna_tile_a"; +var tGrassPatch = "savanna_grass_a"; +var tShoreBlend = "savanna_riparian"; +var tShore = "savanna_riparian_bank"; +var tWater = "savanna_riparian_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_baobab"; +var oOakLarge = "gaia/flora_tree_baobab"; +var oApple = "gaia/flora_tree_baobab"; +var oPine = "gaia/flora_tree_baobab"; +var oAleppoPine = "gaia/flora_tree_baobab"; +var oBerryBush = "gaia/flora_bush_grapes"; +var oChicken = "gaia/fauna_chicken"; +var rts = randInt(1,4); +if (rts==1){ +var oDeer = "gaia/fauna_wildebeest"; +} +else if (rts==2) +{ +var oDeer = "gaia/fauna_zebra"; +} +else if (rts==3) +{ +var oDeer = "gaia/fauna_giraffe"; +} +else if (rts==4) +{ +var oDeer = "gaia/fauna_elephant_african_bush"; +} +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_gazelle"; +var oStoneLarge = "gaia/geology_stonemine_desert_quarry"; +var oStoneSmall = "gaia/geology_stone_savanna_small"; +var oMetalLarge = "gaia/geology_metal_savanna_slabs"; + +// decorative props +var aGrass = "actor|props/flora/grass_savanna.xml"; +var aGrassShort = "actor|props/flora/grass_medit_field.xml"; +var aRockLarge = "actor|geology/stone_savanna_med.xml"; +var aRockMedium = "actor|geology/stone_savanna_med.xml"; +var aBushMedium = "actor|props/flora/bush_desert_dry_a.xml"; +var aBushSmall = "actor|props/flora/bush_dry_a.xml"; +// terrain + entity (for painting) +} +else if (rt == 7){ +var tGrass = ["tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_c", "tropic_grass_plants", "tropic_plants", "tropic_plants_b"]; +var tGrassPForest = "tropic_plants_c"; +var tGrassDForest = "tropic_plants_c"; +var tCliff = ["tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a", "tropic_cliff_a_plants"]; +var tGrassA = "tropic_grass_c"; +var tGrassB = "tropic_grass_plants"; +var tGrassC = "tropic_plants"; +var tHill = ["tropic_cliff_grass"]; +var tDirt = ["tropic_dirt_a", "tropic_dirt_a_plants"]; +var tRoad = "tropic_citytile_a"; +var tRoadWild = "tropic_citytile_plants"; +var tGrassPatch = "tropic_plants_b"; +var tShoreBlend = "temp_mud_plants"; +var tShore = "tropic_beach_dry"; +var tWater = "tropic_beach_wet"; + +// gaia entities +var oOak = "gaia/flora_tree_poplar"; +var oOakLarge = "gaia/flora_tree_poplar"; +var oApple = "gaia/flora_tree_poplar"; +var oPine = "gaia/flora_tree_cretan_date_palm_short"; +var oAleppoPine = "gaia/flora_tree_cretan_date_palm_tall"; +var oBerryBush = "gaia/flora_bush_berry"; +var oChicken = "gaia/fauna_chicken"; +var oDeer = "gaia/fauna_deer"; +var oFish = "gaia/fauna_fish"; +var oSheep = "gaia/fauna_tiger"; +var oStoneLarge = "gaia/geology_stonemine_tropic_quarry"; +var oStoneSmall = "gaia/geology_stone_tropic_a"; +var oMetalLarge = "gaia/geology_metal_tropic_slabs"; + +// decorative props +var aGrass = "actor|props/flora/plant_tropic_a.xml"; +var aGrassShort = "actor|props/flora/plant_lg.xml"; +var aReeds = "actor|props/flora/reeds_pond_lush_b.xml"; +var aLillies = "actor|props/flora/water_lillies.xml"; +var aRockLarge = "actor|geology/stone_granite_large.xml"; +var aRockMedium = "actor|geology/stone_granite_med.xml"; +var aBushMedium = "actor|props/flora/plant_tropic_large.xml"; +var aBushSmall = "actor|props/flora/plant_tropic_large.xml"; + +// terrain + entity (for painting) + +} + +var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oOak, tGrassDForest + TERRAIN_SEPARATOR + oOakLarge, tGrassDForest]; +var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest + TERRAIN_SEPARATOR + oAleppoPine, tGrassPForest]; +const BUILDING_ANGlE = 0.75*PI; + +// initialize map + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clSettlement = createTileClass(); +var clLand = createTileClass(); +//Create the continent body + + +for (var ix = 0; ix < mapSize; ix++) +{ + for (var iz = 0; iz < mapSize; iz++) + { + var x = ix / (mapSize + 1.0); + var z = iz / (mapSize + 1.0); + placeTerrain(ix, iz, tWater); + } +} + +var fx = fractionToTiles(0.5); +var fz = fractionToTiles(0.5); +ix = round(fx); +iz = round(fz); + +var placer = new ClumpPlacer(mapArea * 0.45, 0.9, 0.1, 10, ix, iz); +var terrainPainter = new LayeredPainter( + [tWater, tShore, tGrass], // terrains + [4, 2] // widths +); +var elevationPainter = new SmoothElevationPainter( + ELEVATION_SET, // type + 5, // elevation + 4 // blend radius +); +createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = shuffleArray(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); + +var startAngle = randFloat(0, TWO_PI); +for (var i = 0; i < numPlayers; i++) +{ + playerAngle[i] = startAngle + i*TWO_PI/numPlayers; + playerX[i] = 0.5 + 0.25*cos(playerAngle[i]); + playerZ[i] = 0.5 + 0.25*sin(playerAngle[i]); +} + +for (var i = 0; i < numPlayers; i++) +{ + var id = playerIDs[i]; + log("Creating base for player " + id + "..."); + + // some constants + var radius = scaleByMapSize(15,25); + var cliffRadius = 2; + var elevation = 20; + + // get the x and z in tiles + fx = fractionToTiles(playerX[i]); + fz = fractionToTiles(playerZ[i]); + ix = round(fx); + iz = round(fz); + addToClass(ix, iz, clPlayer); + addToClass(ix+5, iz, clPlayer); + addToClass(ix, iz+5, clPlayer); + addToClass(ix-5, iz, clPlayer); + addToClass(ix, iz-5, clPlayer); + + // create the city patch + var cityRadius = radius/3; + placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); + var painter = new LayeredPainter([tRoadWild, tRoad], [1]); + createArea(placer, painter, null); + + // get civ specific starting entities + var civEntities = getStartingEntities(id-1); + + // create the TC + var group = new SimpleGroup( // elements (type, min/max count, min/max distance, min/max angle) + [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)], + true, null, ix, iz + ); + createObjectGroup(group, id); + + // create starting units + // create starting units + var uDist = 6; + var uSpace = 2; + for (var j = 1; j < civEntities.length; ++j) + { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; + var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1); + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = fx + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = fz + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, civEntities[j].Template, id, (j % 2 - 1) * PI + uAngle); + } + } + + // create animals + for (var j = 0; j < 2; ++j) + { + var aAngle = randFloat(0, TWO_PI); + var aDist = 7; + var aX = round(fx + aDist * cos(aAngle)); + var aZ = round(fz + aDist * sin(aAngle)); + group = new SimpleGroup( + [new SimpleObject(oChicken, 5,5, 0,3)], + true, clBaseResource, aX, aZ + ); + createObjectGroup(group, 0); + } + + // create berry bushes + var bbAngle = randFloat(0, TWO_PI); + var bbDist = 12; + var bbX = round(fx + bbDist * cos(bbAngle)); + var bbZ = round(fz + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oBerryBush, 5,5, 0,3)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // create metal mine + var mAngle = bbAngle; + while(abs(mAngle - bbAngle) < PI/3) + { + mAngle = randFloat(0, TWO_PI); + } + var mDist = radius - 4; + var mX = round(fx + mDist * cos(mAngle)); + var mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetalLarge, 1,1, 0,0)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + + // create stone mines + mAngle += randFloat(PI/8, PI/4); + mX = round(fx + mDist * cos(mAngle)); + mZ = round(fz + mDist * sin(mAngle)); + group = new SimpleGroup( + [new SimpleObject(oStoneLarge, 1,1, 0,2)], + true, clBaseResource, mX, mZ + ); + createObjectGroup(group, 0); + var hillSize = PI * radius * radius; + // create starting straggler trees + var num = hillSize / 100; + for (var j = 0; j < num; j++) + { + var tAngle = randFloat(0, TWO_PI); + var tDist = randFloat(6, radius - 2); + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oOak, 1,3, 0,2)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + } + + // create grass tufts + var num = hillSize / 250; + for (var j = 0; j < num; j++) + { + var gAngle = randFloat(0, TWO_PI); + var gDist = radius - (5 + randInt(7)); + var gX = round(fx + gDist * cos(gAngle)); + var gZ = round(fz + gDist * sin(gAngle)); + group = new SimpleGroup( + [new SimpleObject(aGrassShort, 2,5, 0,1, -PI/8,PI/8)], + false, clBaseResource, gX, gZ + ); + createObjectGroup(group, 0); + } +} + +RMS.SetProgress(20); + +// create bumps +log("Creating bumps..."); +placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); +painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); +createAreas( + placer, + painter, + [avoidClasses(clWater, 2, clPlayer, 10), stayClasses(clLand, 3)], + scaleByMapSize(100, 200) +); + +// create hills +log("Creating hills..."); +placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); +terrainPainter = new LayeredPainter( + [tCliff, tHill], // terrains + [2] // widths +); +elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); +createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clHill)], + [avoidClasses(clPlayer, 10, clHill, 15), stayClasses(clLand, 5)], + scaleByMapSize(1, 4) * numPlayers +); + + +// calculate desired number of trees for map (based on size) +if (rt == 6) +{ +var MIN_TREES = 200; +var MAX_TREES = 1250; +var P_FOREST = 0.02; +} +else if (rt == 7) +{ +var MIN_TREES = 1000; +var MAX_TREES = 6000; +var P_FOREST = 0.6; +} +else +{ +var MIN_TREES = 500; +var MAX_TREES = 3000; +var P_FOREST = 0.7; +} +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +// create forests +log("Creating forests..."); +var types = [ + [[tGrassDForest, tGrass, pForestD], [tGrassDForest, pForestD]], + [[tGrassPForest, tGrass, pForestP], [tGrassPForest, pForestP]] +]; // some variation + +if (rt == 6) +{ +var size = numForest / (0.5 * scaleByMapSize(2,8) * numPlayers); +} +else +{ +var size = numForest / (scaleByMapSize(2,8) * numPlayers); +} +var num = floor(size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + [avoidClasses(clPlayer, 6, clForest, 10, clHill, 0), stayClasses(clLand, 7)], + num + ); +} + +RMS.SetProgress(50); +// create dirt patches +log("Creating dirt patches..."); +var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new LayeredPainter( + [[tGrass,tGrassA],[tGrassA,tGrassB], [tGrassB,tGrassC]], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12), stayClasses(clLand, 7)], + scaleByMapSize(15, 45) + ); +} + +// create grass patches +log("Creating grass patches..."); +var sizes = [scaleByMapSize(2, 32), scaleByMapSize(3, 48), scaleByMapSize(5, 80)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); + painter = new TerrainPainter(tGrassPatch); + createAreas( + placer, + painter, + [avoidClasses(clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12), stayClasses(clLand, 7)], + scaleByMapSize(15, 45) + ); +} +RMS.SetProgress(55); + + +log("Creating stone mines..."); +// create large stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), stayClasses(clLand, 5)], + scaleByMapSize(4,16), 100 +); + +// create small stone quarries +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 10, clRock, 10, clHill, 1), stayClasses(clLand, 5)], + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +// create large metal quarries +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 10, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 5)], + scaleByMapSize(4,16), 100 +); + +RMS.SetProgress(65); + +// create small decorative rocks +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockMedium, 1,3, 0,1)], + true +); +createObjectGroups( + group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 5)], + scaleByMapSize(16, 262), 50 +); + + +// create large decorative rocks +log("Creating large decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aRockLarge, 1,2, 0,1), new SimpleObject(aRockMedium, 1,3, 0,2)], + true +); +createObjectGroups( + group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0), stayClasses(clLand, 5)], + scaleByMapSize(8, 131), 50 +); + +RMS.SetProgress(70); + +// create deer +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), stayClasses(clLand, 3)], + 3 * numPlayers, 50 +); + +RMS.SetProgress(75); + +// create sheep +log("Creating sheep..."); +group = new SimpleGroup( + [new SimpleObject(oSheep, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 0, clPlayer, 10, clHill, 1, clFood, 20), stayClasses(clLand, 3)], + 3 * numPlayers, 50 +); + +// create fish +log("Creating fish..."); +group = new SimpleGroup( + [new SimpleObject(oFish, 2,3, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clLand, 2, clForest, 0, clPlayer, 0, clHill, 0, clFood, 20), + 25 * numPlayers, 60 +); + +RMS.SetProgress(85); + + +// create straggler trees +log("Creating straggler trees..."); +var types = [oOak, oOakLarge, oPine, oApple]; // some variation +var num = floor(numStragglers / types.length); +for (var i = 0; i < types.length; ++i) +{ + group = new SimpleGroup( + [new SimpleObject(types[i], 1,1, 0,3)], + true, clForest + ); + createObjectGroups(group, 0, + [avoidClasses(clWater, 1, clForest, 1, clHill, 1, clPlayer, 9, clMetal, 1, clRock, 1), stayClasses(clLand, 7)], + num + ); +} + +var planetm = 1; +if (rt==7) +{ + planetm = 8; +} +//create small grass tufts +log("Creating small grass tufts..."); +group = new SimpleGroup( + [new SimpleObject(aGrassShort, 1,2, 0,1, -PI/8,PI/8)] +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 2, clHill, 2, clPlayer, 2, clDirt, 0), stayClasses(clLand, 6)], + planetm * scaleByMapSize(13, 200) +); + +RMS.SetProgress(90); + +// create large grass tufts +log("Creating large grass tufts..."); +group = new SimpleGroup( + [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)] +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 3, clHill, 2, clPlayer, 2, clDirt, 1, clForest, 0), stayClasses(clLand, 6)], + planetm * scaleByMapSize(13, 200) +); + +RMS.SetProgress(95); + +// create bushes +log("Creating bushes..."); +group = new SimpleGroup( + [new SimpleObject(aBushMedium, 1,2, 0,2), new SimpleObject(aBushSmall, 2,4, 0,2)] +); +createObjectGroups(group, 0, + [avoidClasses(clWater, 1, clHill, 1, clPlayer, 1, clDirt, 1), stayClasses(clLand, 6)], + planetm * scaleByMapSize(13, 200), 50 +); + +rt = randInt(1,3) +if (rt==1){ +setSkySet("cirrus"); +} +else if (rt ==2){ +setSkySet("cumulus"); +} +else if (rt ==3){ +setSkySet("sunny"); +} +setSunRotation(randFloat(0, TWO_PI)); +setSunElevation(randFloat(PI/ 5, PI / 3)); +setWaterTint(0.447, 0.412, 0.322); // muddy brown +setWaterReflectionTint(0.447, 0.412, 0.322); // muddy brown +setWaterMurkiness(1.0); +setWaterReflectionTintStrength(0.677); + +// Export map data +ExportMap();