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 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/new_rms_test.js (revision 11754) @@ -1,69 +1,65 @@ RMS.LoadLibrary("rmgen"); const BUILDING_ANGlE = -PI/4; // 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) - + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); } // 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 (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/rivers.js (revision 11754) @@ -1,709 +1,706 @@ RMS.LoadLibrary("rmgen"); //random terrain textures var rt = randomizeBiome(); var tGrass = rBiomeT1(); var tGrassPForest = rBiomeT2(); var tGrassDForest = rBiomeT3(); var tCliff = rBiomeT4(); var tGrassA = rBiomeT5(); var tGrassB = rBiomeT6(); var tGrassC = rBiomeT7(); var tHill = rBiomeT8(); var tDirt = rBiomeT9(); var tRoad = rBiomeT10(); var tRoadWild = rBiomeT11(); var tGrassPatch = rBiomeT12(); var tShoreBlend = rBiomeT13(); var tShore = rBiomeT14(); var tWater = rBiomeT15(); if (rt == 2) { tShore = "alpine_shore_rocks_icy"; tWater = "alpine_shore_rocks"; } // gaia entities var oOak = rBiomeE1(); var oOakLarge = rBiomeE2(); var oApple = rBiomeE3(); var oPine = rBiomeE4(); var oAleppoPine = rBiomeE5(); var oBerryBush = rBiomeE6(); var oChicken = rBiomeE7(); var oDeer = rBiomeE8(); var oFish = rBiomeE9(); var oSheep = rBiomeE10(); var oStoneLarge = rBiomeE11(); var oStoneSmall = rBiomeE12(); var oMetalLarge = rBiomeE13(); // decorative props var aGrass = rBiomeA1(); var aGrassShort = rBiomeA2(); var aReeds = rBiomeA3(); var aLillies = rBiomeA4(); var aRockLarge = rBiomeA5(); var aRockMedium = rBiomeA6(); var aBushMedium = rBiomeA7(); var aBushSmall = rBiomeA8(); 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 = -PI/4; // 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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/volcanic_lands.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/volcanic_lands.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/volcanic_lands.js (revision 11754) @@ -1,380 +1,377 @@ RMS.LoadLibrary("rmgen"); var tGrass = ["cliff volcanic light", "ocean_rock_a", "ocean_rock_b"]; var tGrassA = "cliff volcanic light"; var tGrassB = "ocean_rock_a"; var tGrassC = "ocean_rock_b"; var tCliff = "cliff volcanic coarse" var tDirt = ["ocean_rock_a", "ocean_rock_b"]; var tRoad = "road1"; var tRoadWild = "road1"; var tShoreBlend = "temp_grass_plants"; var tShore = "temp_plants_bog"; var tWater = "temp_mud_a"; var tLava1 = "LavaTest05" var tLava2 = "LavaTest04" var tLava3 = "LavaTest03" // gaia entities var oTree = "gaia/flora_tree_dead"; var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; var oStoneSmall = "gaia/geology_stone_alpine_a"; var oMetalLarge = "gaia/geology_metal_alpine_slabs"; // decorative props var aRockLarge = "actor|geology/stone_granite_med.xml"; var aRockMedium = "actor|geology/stone_granite_med.xml"; var aSmoke = "actor|particle/smoke.xml"; var pForestD = [tGrassC + TERRAIN_SEPARATOR + oTree, tGrassC]; var pForestP = [tGrassB + TERRAIN_SEPARATOR + oTree, tGrassB]; const BUILDING_ANGlE = -PI/4; // 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 clHill2 = createTileClass(); var clHill3 = createTileClass(); var clHill4 = 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // create metal mine var bbAngle = randFloat(0, TWO_PI); var bbDist = 12; var bbX = round(fx + bbDist * cos(bbAngle)); var bbZ = round(fz + bbDist * sin(bbAngle)); 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)); var 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 trees var num = floor(hillSize / 60); var tAngle = randFloat(0, TWO_PI); var tDist = randFloat(9, radius - 2); var tX = round(fx + tDist * cos(tAngle)); var tZ = round(fz + tDist * sin(tAngle)); group = new SimpleGroup( [new SimpleObject(oTree, num, num, 0,7)], false, clBaseResource, tX, tZ ); createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); } RMS.SetProgress(15); // create volcano log("Creating volcano"); var fx = fractionToTiles(0.5); var fz = fractionToTiles(0.5); var ix = round(fx); var iz = round(fz); var placer = new ClumpPlacer(mapArea * 0.067, 0.7, 0.05, 100, ix, iz); var terrainPainter = new LayeredPainter( [tCliff, tCliff], // terrains [3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 15, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], null); var placer = new ClumpPlacer(mapArea * 0.05, 0.7, 0.05, 100, ix, iz); var terrainPainter = new LayeredPainter( [tCliff, tCliff], // terrains [3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 25, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill2)], stayClasses(clHill, 1)); var placer = new ClumpPlacer(mapArea * 0.02, 0.7, 0.05, 100, ix, iz); var terrainPainter = new LayeredPainter( [tCliff, tCliff], // terrains [3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 45, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill3)], stayClasses(clHill2, 1)); var placer = new ClumpPlacer(mapArea * 0.011, 0.7, 0.05, 100, ix, iz); var terrainPainter = new LayeredPainter( [tCliff, tCliff], // terrains [3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 62, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill4)], stayClasses(clHill3, 1)); var placer = new ClumpPlacer(mapArea * 0.003, 0.7, 0.05, 100, ix, iz); var terrainPainter = new LayeredPainter( [tCliff, tLava1, tLava2, tLava3], // terrains [1, 1, 1] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 42, // elevation 1 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill4)], stayClasses(clHill4, 1)); var num = floor(mapArea * 0.03 / 15); var tX = round(fx); var tZ = round(fz); var group = new SimpleGroup( [new SimpleObject(aSmoke, num, num, 0,7)], false, clBaseResource, tX, tZ ); createObjectGroup(group, 0, stayClasses(clHill4,1)); RMS.SetProgress(45); // create hills log("Creating hills..."); placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); terrainPainter = new LayeredPainter( [tCliff, tGrass], // terrains [2] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 12, clHill, 15, clWater, 2), scaleByMapSize(2, 8) * numPlayers ); // calculate desired number of trees for map (based on size) var MIN_TREES = 200; var MAX_TREES = 1250; 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 = [ [[tGrassB, tGrassA, pForestD], [tGrassB, pForestD]], [[tGrassB, tGrassA, pForestP], [tGrassB, 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, 12, clForest, 10, clHill, 0, clWater, 2), 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, 3, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 12), scaleByMapSize(15, 45) ); } 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(90); // 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(95); // create straggler trees log("Creating straggler trees..."); var types = [oTree]; // 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 ); } ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/corsica.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/corsica.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/corsica.js (revision 11754) @@ -1,723 +1,721 @@ RMS.LoadLibrary("rmgen"); var tGrass = ["medit_grass_field", "medit_grass_field_b", "temp_grass_c"]; var tDune = ["medit_grass_field_brown"]; var tBigDune = ["medit_grass_field_brown"]; var tGrassPForest = "forestfloor_dirty"; var tForestFloor = "medit_grass_shrubs"; var tGrassA = ["desert_dirt_persia_1", "desert_dirt_persia_2"]; var tGrassB = "dirta"; var tSteepCliffs = ["temp_cliff_b", "temp_cliff_a"]; var tCliffs = ["temp_cliff_b", "medit_cliff_italia", "medit_cliff_italia_grass"]; var tHill = ["medit_cliff_italia_grass","medit_cliff_italia_grass", "medit_grass_field", "medit_grass_field", "temp_grass"]; var tMountain = ["medit_cliff_italia_grass","medit_cliff_italia"]; var tMountainTop = ["medit_cliff_italia"]; var tDirt = ["medit_dirt", "medit_dirt_b"]; var tRoad = ["medit_city_tile","medit_rocks_grass","medit_grass_field_b"]; var tRoadWild = ["medit_rocks_grass","medit_grass_field_b"]; var tGrassPatch = "medit_dirt_b"; var tShoreBlend = "medit_rocks_wet"; var tShore = ["medit_rocks","medit_sand"]; var tVeryDeepWater = ["medit_sea_depths","medit_sea_coral_deep"]; var tDeepWater = ["medit_sea_coral_deep","tropic_ocean_coral"]; var tCreekWater = "medit_sea_coral_plants"; // gaia entities var ePine = "gaia/flora_tree_aleppo_pine"; var ePalmTall = "gaia/flora_tree_cretan_date_palm_tall"; var eFanPalm = "gaia/flora_tree_medit_fan_palm"; var eCypress = "gaia/flora_tree_cypress"; var eApple = "gaia/flora_tree_apple" var eBush = "gaia/flora_bush_berry"; var eChicken = "gaia/fauna_chicken"; var eFish = "gaia/fauna_fish"; var ePig = "gaia/fauna_pig"; var eStoneMine = "gaia/geology_stonemine_medit_quarry"; var eMetalMine = "gaia/geology_metal_mediterranean_slabs"; // decorative props var aFlower1 = "actor|props/flora/decals_flowers_daisies.xml"; var aWaterFlower = "actor|props/flora/water_lillies.xml"; var aReedsA = "actor|props/flora/reeds_pond_lush_a.xml"; var aReedsB = "actor|props/flora/reeds_pond_lush_b.xml"; var aRock = "actor|geology/stone_granite_med.xml"; var aLargeRock = "actor|geology/stone_granite_large.xml"; var aBushA = "actor|props/flora/bush_medit_sm_lush.xml"; var aBushB = "actor|props/flora/bush_medit_me_lush.xml"; var aPlantA = "actor|props/flora/plant_medit_artichoke.xml"; var aPlantB = "actor|props/flora/grass_tufts_a.xml"; var aPlantC = "actor|props/flora/grass_soft_tuft_a.xml"; var aShorePlantA = "actor|props/flora/reeds_beach.xml"; var aShorePlantB = "actor|props/flora/grass_temp_field_brown.xml"; var aStandingStone = "actor|props/special/eyecandy/standing_stones.xml"; var tForestNicae = [tForestFloor + TERRAIN_SEPARATOR + ePine,tForestFloor + TERRAIN_SEPARATOR + ePine,tForestFloor + TERRAIN_SEPARATOR + ePine,tForestFloor + TERRAIN_SEPARATOR + ePine,tForestFloor + TERRAIN_SEPARATOR + eFanPalm, tForestFloor + TERRAIN_SEPARATOR + ePalmTall, tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor]; var tForestNicaeLight = [tForestFloor + TERRAIN_SEPARATOR + ePine,tForestFloor + TERRAIN_SEPARATOR + ePine,tForestFloor + TERRAIN_SEPARATOR + eFanPalm, tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor]; var tForestNicaeScarce = [tForestFloor + TERRAIN_SEPARATOR + ePine,tForestFloor + TERRAIN_SEPARATOR + ePine,tForestFloor + TERRAIN_SEPARATOR + eFanPalm, tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor,tForestFloor]; const BUILDING_ANGlE = -PI/4; // initialize map log("Initializing map..."); InitMap(); var numPlayers = getNumPlayers(); var mapSize = getMapSize(); var mapArea = mapSize*mapSize; // create tile classes var clCorsica = createTileClass(); var clSardinia = createTileClass(); var clCreek = createTileClass(); var clWater = createTileClass(); var clCliffs = createTileClass(); var clForest = createTileClass(); var clPeak = createTileClass(); var clShore = createTileClass(); var clPathToShore = createTileClass(); var clPlayer = createTileClass(); var clBaseResource = createTileClass(); var clPassage = createTileClass(); var clHill = createTileClass(); var clWater = createTileClass(); var clDirt = createTileClass(); var clRock = createTileClass(); var clMetal = createTileClass(); var clFood = createTileClass(); var clSettlement = createTileClass(); var clDune = createTileClass(); // on every pixel of the map, set wet sand 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, tVeryDeepWater); //addToClass(ix,iz,clWater); } } // let's decide if we swap var swap = Math.round(Math.random()); // should return about 50/50 a 0 or a 1 // let's create Corsica log("Creating Corsica"); var CorsicaX = fractionToTiles(0.99); var CorsicaZ = fractionToTiles(0.9); if (swap) CorsicaX = fractionToTiles(0.01); // Okay so the thing here is that we'll make a sort of jagged circle. To achieve this, I'll make a few islands // that will basically be put together // first, let's make a big round island in the corner. // okay so actually subdivided cleverly to make it work and give jagedness with the multiple islands var llx = round(CorsicaX); var llz = round(CorsicaZ); // okay so the circle reaches close to a third of the map var placer = new ClumpPlacer(fractionToSize(0.3)*1.8, 1.0, 0.5, 10, llx, llz); var terrainPainter = new LayeredPainter([tCliffs, tGrass], [2] ); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 5,0); createArea(placer, [terrainPainter, paintClass(clCorsica), elevationPainter], null); var nbSubIsland = 5; // actually 5+1 for (var i = 0; i <= nbSubIsland; i++) { // radius is "sqrt(this.size / PI)"... so in my case it's "sqrt(fractionofSize(0.33)*2.0/PI), about 0.64, sqrt-ed //Let's round down. // only from π to 3π/2 var angle = (i * (-PI/(nbSubIsland*2)) + PI); if (!swap) angle *= -1; var llx = round (CorsicaX + sqrt(fractionToSize(0.3)*0.55)*sin(angle)); var llz = round (CorsicaZ + sqrt(fractionToSize(0.3)*0.55)*cos(angle)); var placer = new ClumpPlacer(fractionToSize(0.05)/2, 0.6, 0.03, 10, llx, llz); var terrainPainter = new LayeredPainter([tCliffs, tGrass], [2] ); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 5,1); createArea(placer, [terrainPainter, paintClass(clCorsica), elevationPainter], null); } RMS.SetProgress(10); log("Creating Sardinia"); var SardiniaX = fractionToTiles(0.01); var SardiniaZ = fractionToTiles(0.1); if (swap) SardiniaX = fractionToTiles(0.99); var llx = round(SardiniaX); var llz = round(SardiniaZ); // okay so the circle reaches close to a third of the map var placer = new ClumpPlacer(fractionToSize(0.3)*1.8, 1.0, 0.5, 10, llx, llz); var terrainPainter = new LayeredPainter([tCliffs, tGrass], [2] ); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 5,0); createArea(placer, [terrainPainter, paintClass(clSardinia), elevationPainter], null); // same as Corsica on the other side for (var i = 0; i <= nbSubIsland; i++) { var angle = (i * (-PI/(nbSubIsland*2))); if (!swap) angle *= -1; var llx = round (SardiniaX + sqrt(fractionToSize(0.3)*0.55)*sin(angle)); var llz = round (SardiniaZ + sqrt(fractionToSize(0.3)*0.55)*cos(angle)); var placer = new ClumpPlacer(fractionToSize(0.05)/2, 0.6, 0.03, 10, llx, llz); var terrainPainter = new LayeredPainter([tCliffs, tGrass], [2] ); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 5,1); createArea(placer, [terrainPainter, paintClass(clSardinia), elevationPainter], null); } log("Creating Creeks"); // okay so now let's make some cleverly designed creeks: this creates a very jagged relief, looks good var nbCreeks = scaleByMapSize(6,5); // inCorsica first var islandX = [SardiniaX,CorsicaX]; var islandZ = [SardiniaZ,CorsicaZ]; // first: the creeks for (island = 0; island <= 1; island++) for (var i = 0; i <= nbCreeks; i++) { var radius = fractionToTiles( (Math.random()/17) + 0.49); var angle = PI*island + i*(PI/(nbCreeks*2)); if (swap) angle += PI/2; fx = radius * cos(angle); fz = radius * sin(angle); fx = round(islandX[island] + fx); fz = round(islandZ[island] + fz); var size = scaleByMapSize(75,100); if (Math.random() > 0.5) size = Math.random() * 40 + 10; else size += Math.random() * 20; var placer = new ClumpPlacer(size, 0.4, 0.01, 10, fx,fz); var terrainPainter = new TerrainPainter(tSteepCliffs); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5,0); // base height is -10 createArea(placer, [terrainPainter, paintClass(clCreek), elevationPainter], null); } var nbBeaches = scaleByMapSize(2,5); for (island = 0; island <= 1; island++) { for (var i = 0; i <= nbBeaches; i++) { var smallRadius = fractionToTiles( 0.45); var bigRadius = fractionToTiles( 0.55); var angle = PI*island + i*(PI/(nbBeaches*2.5)) + PI/(nbBeaches*6) + randFloat(-PI/(nbBeaches*7),PI/(nbBeaches*7)); if (swap) angle += PI/2; var startX = smallRadius * cos(angle); var startZ = smallRadius * sin(angle); startX = round(islandX[island] + startX); startZ = round(islandZ[island] + startZ); var endX = bigRadius * cos(angle); var endZ = bigRadius * sin(angle); endX = round(islandX[island] + endX); endZ = round(islandZ[island] + endZ); var placer = new ClumpPlacer(130, 0.7, 0.8, 10, round((startX+endX*3)/4),round((startZ+endZ*3)/4)); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -1,5); // base height is -10 createArea(placer, [elevationPainter], null); straightPassageMaker(startX, startZ,endX,endZ, 25, 18, 4,clShore,null); } } RMS.SetProgress(20); log("Creating Main Relief"); // Let's make it generally cliffy placer = new ClumpPlacer(fractionToSize(0.3)*1.8, 1.0, 0.2, 4,round((CorsicaX * 5 + fractionToTiles(0.5)) / 6.0),round(fractionToTiles(0.8))); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 30,fractionToTiles(0.45)); createArea( placer, [elevationPainter], null); placer = new ClumpPlacer(fractionToSize(0.3)*1.8, 1.0, 0.2, 4,round((SardiniaX * 5 + fractionToTiles(0.5)) / 6.0),round(fractionToTiles(0.2))); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 30,fractionToTiles(0.45)); createArea( placer, [elevationPainter], null); log("Creating players"); // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = sortPlayers(playerIDs); // place players var playerX = new Array(numPlayers); var playerZ = new Array(numPlayers); var playerAngle = new Array(numPlayers); var island = 0; var formerTeam = getPlayerTeam(0); var onCorsica = []; var onSardinia = []; for (var o = 0; o < numPlayers; o++) { if (getPlayerTeam(o) === formerTeam && formerTeam !== -1) { // same island if (island === 0) onCorsica.push(o); else onSardinia.push(o); } else if (getPlayerTeam(o) !== -1){ if (island === 0) { island = 1; onSardinia.push(o); } else { island = 0; onCorsica.push(o); } } else { // okay now the less crowded: if (onCorsica.length > onSardinia.length) onSardinia.push(o); else onCorsica.push(o); } formerTeam = getPlayerTeam(o); } // le'ts place the players in a circle around the island. for (var i = 0;i < onCorsica.length; i++) { var angle = (i * (PI/(onCorsica.length*2)) + PI + PI/(4*onCorsica.length)); if (swap) angle += PI/2; playerAngle[onCorsica[i]] = angle; playerX[onCorsica[i]] = round( CorsicaX + fractionToTiles(0.36*cos(angle))); playerZ[onCorsica[i]] = round( fractionToTiles(1 + 0.36*sin(angle))); } for (var i = 0;i < onSardinia.length; i++) { var angle = (i * (PI/(onSardinia.length*2)) + PI/(4*onSardinia.length)); if (swap) angle += PI/2; playerAngle[onSardinia[i]] = angle; playerX[onSardinia[i]] = round( SardiniaX + fractionToTiles(0.36*cos(angle))); playerZ[onSardinia[i]] = round( fractionToTiles(0 + 0.36*sin(angle))); } var placer = undefined; var fx = 0; var fz = 0; var ix =0; var iz = 0; for (var i = 0; i < numPlayers; i++) { var id = playerIDs[i]; log("Creating base for player " + id + "..."); // some constants var radius = 23; // get the x and z in tiles fx = playerX[i]; fz = playerZ[i]; // let's create a nice platform var placer = new ClumpPlacer(PI*radius*radius, 0.95, 0.3, 10, fx,fz); var PlayerArea = createArea(placer, [paintClass(clPlayer)], null); // create the city patch var cityRadius = radius/4; placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.8, 0.3, 10, fx, fz); var painter = new LayeredPainter([tRoadWild,tRoad],[1]); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, getHeight(fx,fz),10); createArea(placer, [painter,paintClass(clSettlement),elevationPainter], null); - // get civ specific starting entities - var civEntities = getStartingEntities(id-1); // create starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // create animals for (var j = 0; j < 2; ++j) { var aAngle = randFloat(0, TWO_PI); var aDist = 8; var aX = round(fx + aDist * cos(aAngle)); var aZ = round(fz + aDist * sin(aAngle)); var group = new SimpleGroup( [new SimpleObject(eChicken, 5,5, 0,2)], true, clBaseResource, aX, aZ ); createObjectGroup(group, 0); } // create berry bushes var bbAngle = randFloat(0, TWO_PI); var bbDist = 11; var bbX = round(fx + bbDist * cos(bbAngle)); var bbZ = round(fz + bbDist * sin(bbAngle)); group = new SimpleGroup( [new SimpleObject(eBush, 5,5, 1,2)], true, clBaseResource, bbX, bbZ ); createObjectGroup(group, 0); // create metal mine // this makes sure it's created on the same level as the player. var mAngle = randFloat(playerAngle[i] + PI/2,playerAngle[i] + PI/3); var mDist = 18; var mX = round(fx + mDist * cos(mAngle)); var mZ = round(fz + mDist * sin(mAngle)); group = new SimpleGroup( [new SimpleObject(eMetalMine, 1,1, 0,0),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3), new SimpleObject(ePine, 0,1, 3,3)], true, clBaseResource, mX, mZ ); createObjectGroup(group, 0); // create stone mines mAngle += randFloat(PI/8, PI/5); mX = round(fx + mDist * cos(mAngle)); mZ = round(fz + mDist * sin(mAngle)); group = new SimpleGroup( [new SimpleObject(eStoneMine, 1,1, 0,2),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3), new SimpleObject(ePine, 0,1, 3,3)], true, clBaseResource, mX, mZ ); createObjectGroup(group, 0); group = new SimpleGroup([new SimpleObject(ePine, 1,3, 1,4),new SimpleObject(ePalmTall, 0,1, 1,4),new SimpleObject(eFanPalm, 0,1, 0,2)], true, clForest); createObjectGroups(group, 0, [avoidClasses(clBaseResource,3, clSettlement,0), stayClasses(clPlayer,1)], 150, 1000); } RMS.SetProgress(40); log ("making plateaux"); // Corsica and Sardinia var SardX = round((SardiniaX*5 + fractionToTiles(0.5))/6.0); var SardZ = round(fractionToTiles(0.1)); var CorsX = round((CorsicaX*5 + fractionToTiles(0.5))/6.0); var CorsZ = round(fractionToTiles(0.9)); // first level plateaux, puts the player higher placer = new ClumpPlacer(fractionToSize(0.18)*1.8, 0.95, 0.02, 4,CorsX,CorsZ); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 9,1); createArea( placer, [elevationPainter], null); placer = new ClumpPlacer(fractionToSize(0.18)*1.8, 0.95, 0.02, 4,SardX,SardZ); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 9,1); createArea( placer, [elevationPainter], null); // second level plateaux, top of the hill if(mapSize > 150) { placer = new ClumpPlacer(fractionToSize(0.1), 0.98, 0.04, 4,CorsX,CorsZ); terrainPainter = new LayeredPainter([tCliffs, tGrass], [2] ); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 8,1); createArea( placer, [terrainPainter,elevationPainter], null); placer = new ClumpPlacer(fractionToSize(0.1), 0.98, 0.04, 4,SardX,SardZ); terrainPainter = new LayeredPainter([tCliffs, tGrass], [2] ); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 8,1); createArea( placer, [terrainPainter,elevationPainter], null); } log ("creating passages towards the island"); if(mapSize > 150) { var nb = scaleByMapSize(1,4); for (var i = 0; i < nb; i++) { var radius = sqrt(fractionToSize(0.1)/PI); var angle = PI + i*(PI/(2*nb)) + PI/(4*nb); if (swap) angle += PI/2; var x1 = round(CorsX + (radius+5)*cos(angle)); var y1 = round(CorsZ + (radius+5)*sin(angle)); var x2 = round(CorsX + (radius-4)*cos(angle)); var y2 = round(CorsZ + (radius-4)*sin(angle)); straightPassageMaker(x1, y1, x2, y2, 1, 6, 2,clPassage,tGrass) } for (var i = 0; i < nb; i++) { var radius = sqrt(fractionToSize(0.1)/PI)+ 2; var angle = i*(PI/(2*nb)) + PI/(4*nb); if (swap) angle += PI/2; var x1 = round(SardX + (radius+5)*cos(angle)); var y1 = round(SardZ + (radius+5)*sin(angle)); var x2 = round(SardX + (radius-4)*cos(angle)); var y2 = round(SardZ + (radius-4)*sin(angle)); straightPassageMaker(x1, y1, x2, y2, 1, 6, 2,clPassage,tGrass) } } for (var i = 0; i <= 3; i++) { var radius = sqrt(fractionToSize(0.18)*1.8/PI) + 2; var angle = PI + i*(PI/7) + PI/9; if (swap) angle += PI/2; var x1 = round(CorsX + (radius+7)*cos(angle)); var y1 = round(CorsZ + (radius+7)*sin(angle)); var x2 = round(CorsX + (radius-5)*cos(angle)); var y2 = round(CorsZ + (radius-5)*sin(angle)); straightPassageMaker(x1, y1, x2, y2, 4, 10, 3,clPassage,tGrass) } for (var i = 0; i <= 3; i++) { var radius = sqrt(fractionToSize(0.18)*1.8/PI)+ 2; var angle = i*(PI/7) + PI/9; if (swap) angle += PI/2; var x1 = round(SardX + (radius+7)*cos(angle)); var y1 = round(SardZ + (radius+7)*sin(angle)); var x2 = round(SardX + (radius-5)*cos(angle)); var y2 = round(SardZ + (radius-5)*sin(angle)); straightPassageMaker(x1, y1, x2, y2, 4, 10, 3,clPassage,tGrass) } RMS.SetProgress(50); log ("creating bumps"); placer = new ClumpPlacer(70, 0.6, 0.1, 4); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, 2,3); createAreas( placer, [elevationPainter], [avoidClasses(clPlayer,2,clPassage, 2), stayClasses(clCorsica,2)],scaleByMapSize(20,100), 5 ); createAreas( placer, [elevationPainter], [avoidClasses(clPlayer,2,clPassage, 2), stayClasses(clSardinia,2)],scaleByMapSize(20,100), 5 ); log ("creating anti bumps"); placer = new ClumpPlacer(120, 0.3, 0.1, 4); elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, -5,6); createAreas( placer, [elevationPainter], [avoidClasses(clPlayer,2,clPassage, 2,clCorsica,2,clSardinia,2)],scaleByMapSize(20,100), 5 ); log("Repainting"); var terrTop = createTerrain(tMountainTop); var terrMount = createTerrain(tMountain); var terrHill = createTerrain(tHill); var terrCliff = createTerrain(tCliffs); var terrSteepCliff = createTerrain(tSteepCliffs); var terrGrass = createTerrain(tGrass); var terrShallow = createTerrain(tCreekWater); var terrDeep = createTerrain(tDeepWater); var terrDark = createTerrain(tVeryDeepWater); var terrSand = createTerrain(tShore); var terrWetSand = createTerrain(tShoreBlend); // first pass: who's water? for (var sandx = 0; sandx < mapSize; sandx++) for (var sandz = 0; sandz < mapSize; sandz++) if (getHeight(sandx,sandz) < 0) addToClass(sandx,sandz,clWater); // second pass: who's not water for (var sandx = 0; sandx < mapSize; sandx++) { for (var sandz = 0; sandz < mapSize; sandz++) { if (getTileClass(clSettlement).countMembersInRadius(sandx,sandz,2) === 0) { var height = getHeight(sandx,sandz); var heightDiff = getHeightDiff(sandx,sandz); if (height >= 1 && getTileClass(clWater).countMembersInRadius(sandx,sandz,2) == 0) { // paint hills or cliffs depending on terrain elevation difference if (height > 17 && getTileClass(clPassage).countMembersInRadius(sandx,sandz,2) == 0) { if (heightDiff < 5) terrHill.place(sandx,sandz); else if(heightDiff < 10) terrMount.place(sandx,sandz); } else { terrGrass.place(sandx,sandz); } if (height > 25 && heightDiff >= 10 && getTileClass(clPassage).countMembersInRadius(sandx,sandz,2) == 0) terrSteepCliff.place(sandx,sandz); else if(heightDiff >= 10 && getTileClass(clPassage).countMembersInRadius(sandx,sandz,2) == 0) terrCliff.place(sandx,sandz); } else { if (height >= 0 && heightDiff >= 9) { terrCliff.place(sandx,sandz); } else if (height >= -1 && height < 1 && heightDiff < 9) { terrSand.place(sandx,sandz); } else if (height >= -3 && height < -1 && heightDiff < 9) { terrWetSand.place(sandx,sandz); } else if (height >= -6 && height < -3 && heightDiff < 9) { terrShallow.place(sandx,sandz); } else if (height > -10 && height < -6 && heightDiff < 6) { terrDeep.place(sandx,sandz); } if (heightDiff >= 9) terrCliff.place(sandx,sandz); } } } } RMS.SetProgress(65); log("Creating stone mines..."); // create large stone quarries group = new SimpleGroup([new SimpleObject(eStoneMine, 1,1, 0,0),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3)], true, clBaseResource); createObjectGroups(group, 0,[stayClasses(clCorsica, 1),avoidClasses(clWater, 3, clPlayer,2 , clBaseResource, 2)], scaleByMapSize(6,25), 1000 ); createObjectGroups(group, 0,[stayClasses(clSardinia, 1),avoidClasses(clWater, 3, clPlayer,2 , clBaseResource, 2)], scaleByMapSize(6,25), 1000 ); log("Creating metal mines..."); // create large metal quarries group = new SimpleGroup([new SimpleObject(eMetalMine, 1,1, 0,0),new SimpleObject(aBushB, 1,1, 2,2), new SimpleObject(aBushA, 0,2, 1,3)], true, clBaseResource); createObjectGroups(group, 0,[avoidClasses(clWater, 3, clPlayer,2 , clBaseResource, 2),stayClasses(clCorsica, 1)], scaleByMapSize(6,25), 1000 ); createObjectGroups(group, 0,[avoidClasses(clWater, 3, clPlayer,2 , clBaseResource, 2),stayClasses(clSardinia, 1)], scaleByMapSize(6,25), 1000 ); log ("creating forests"); var TreeGroup = new SimpleGroup([new SimpleObject(ePine, 2,5, 1,4),new SimpleObject(ePalmTall, 1,2, 1,4),new SimpleObject(eFanPalm, 0,1, 0,2),new SimpleObject(eApple, 0,1, 1,2)], true, clForest); createObjectGroups(TreeGroup, 0, [avoidClasses(clWater, 1, clForest, 0,clPlayer, 0,clBaseResource, 3), stayClasses(clCorsica, 5)], scaleByMapSize(350,2500), 100 ); createObjectGroups(TreeGroup, 0, [avoidClasses(clWater, 1, clForest, 0,clPlayer, 0,clBaseResource, 3), stayClasses(clSardinia, 5)], scaleByMapSize(350,2500), 100 ); RMS.SetProgress(75); // create small decorative rocks log("Creating small decorative rocks..."); group = new SimpleGroup( [new SimpleObject(aRock, 1,3, 0,1),new SimpleObject(aStandingStone, 0,2, 0,3)], true ); createObjectGroups( group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 0,clBaseResource, 0, clPassage, 2), scaleByMapSize(16, 262), 50 ); // create large decorative rocks log("Creating large decorative rocks..."); group = new SimpleGroup( [new SimpleObject(aLargeRock, 1,2, 0,1), new SimpleObject(aRock, 1,3, 0,2)], true ); createObjectGroups( group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 0,clBaseResource, 0, clPassage, 2), scaleByMapSize(8, 131), 50 ); createObjectGroups( group, 0, borderClasses(clWater, 5,10), scaleByMapSize(100,800), 500); // create decorative grass log("Creating beautification..."); group = new SimpleGroup( [new SimpleObject(aPlantA, 3,7, 0,3),new SimpleObject(aPlantB, 3,6, 0,3),new SimpleObject(aPlantC, 1,4, 0,4)], true ); createObjectGroups( group, 0, avoidClasses(clWater, 0,clBaseResource, 0, clShore,3), scaleByMapSize(100, 600), 50 ); group = new SimpleGroup( [new SimpleObject(aPlantB, 5,20, 0,5),new SimpleObject(aPlantC, 4,10, 0,4)], true ); createObjectGroups( group, 0, avoidClasses(clWater, 0,clBaseResource, 0, clShore,3), scaleByMapSize(100, 600), 50 ); RMS.SetProgress(80); log("Creating animals..."); group = new SimpleGroup( [new SimpleObject(ePig, 2,4, 0,3)] ); createObjectGroups( group, 0, avoidClasses(clWater, 3,clBaseResource, 0), scaleByMapSize(20, 100), 50 ); group = new SimpleGroup( [new SimpleObject(eFish, 1,2, 0,3)] ); createObjectGroups( group, 0, [avoidClasses(clCreek,3,clShore,3),stayClasses(clWater, 3)], scaleByMapSize(50, 150), 100 ); RMS.SetProgress(90); RMS.SetProgress(95); setSkySet("cumulus"); setSunColour(0.8,0.66,0.48); setSunElevation(0.828932); if (!swap) setSunRotation(6.3*PI/8); else setSunRotation(2.3*PI/8); setTerrainAmbientColour(0.564706,0.543726,0.419608); setUnitsAmbientColour(0.53,0.55,0.45); setWaterColour(0.2, 0.35, 0.45); setWaterTint(0.2, 0.6, 0.9); setWaterReflectionTint(0.2, 0.6, 0.9); setWaterMurkiness(0.7); setWaterReflectionTintStrength(0.377); setWaterWaviness(4); // Export map data ExportMap(); // this function will go from point [x1,z1] to point [x2,z2], while following a curve of width (starting-center-starting) // it can smooth on the side depending on "smooth", which is the distance of the smooth. Tileclass and Terrain set a tileclass/terrain // it effectively can create a smooth path from point [x1,z1] to point [x2,z2], ie Canyon, whatever. // note: NOT efficient for large distances: I'm widely oversampling function straightPassageMaker(x1, z1, x2, z2, startWidth, centerWidth, smooth, tileclass, terrain) { var mapSize = g_Map.size; var stepNB = sqrt((x2-x1)*(x2-x1) + (z2-z1)*(z2-z1)) + 2; var startHeight = getHeight(x1,z1); var finishHeight = getHeight(x2,z2); for (var step = 0; step <= stepNB; step+=0.5) { var ix = ((stepNB-step)*x1 + x2*step) / stepNB; var iz = ((stepNB-step)*z1 + z2*step) / stepNB; // 5 at star/end, and 0 at the center var width = (abs(step - stepNB/2.0) *startWidth + (stepNB/2 - abs(step - stepNB/2.0)) * centerWidth ) / (stepNB/2); var oldDirection = [x2-x1, z2-z1]; // let's get the perpendicular direction var direction = [ -oldDirection[1],oldDirection[0] ]; if (abs(direction[0]) > abs(direction[1])) { direction[1] = direction[1] / abs(direction[0]); if (direction[0] > 0) direction[0] = 1; else direction[0] = -1; } else { direction[0] = direction[0] / abs(direction[1]); if (direction[1] > 0) direction[1] = 1; else direction[1] = -1; } for (var po = -Math.floor(width/2.0); po <= Math.floor(width/2.0); po+=0.5) { var rx = po*direction[0]; var rz = po*direction[1]; var relativeWidth = abs(po / Math.floor(width/2)); var targetHeight = ((stepNB-step)*startHeight + finishHeight*step) / stepNB; if (round(ix + rx) < mapSize && round(iz + rz) < mapSize && round(ix + rx) >= 0 && round(iz + rz) >= 0) { // smoothing the sides if ( abs(abs(po) - abs(Math.floor(width/2.0))) < smooth) { var localHeight = getHeight(round(ix + rx), round(iz + rz)); var localPart = smooth - abs(abs(po) - abs(Math.floor(width/2.0))); var targetHeight = (localHeight * localPart + targetHeight * (1/localPart) )/ (localPart + 1/localPart); } g_Map.setHeight(round(ix + rx), round(iz + rz), targetHeight); if (tileclass !== null) addToClass(round(ix + rx), round(iz + rz), tileclass); if (terrain !== null) placeTerrain(round(ix + rx), round(iz + rz), terrain); } } } } // no need for preliminary rounding function getHeightDiff(x1, z1) { var height = getHeight(round(x1),round(z1)); var diff = 0; if (z1 + 1 < mapSize) diff += abs(getHeight(round(x1),round(z1+1)) - height); if (x1 + 1 < mapSize && z1 + 1 < mapSize) diff += abs(getHeight(round(x1+1),round(z1+1)) - height); if (x1 + 1 < mapSize) diff += abs(getHeight(round(x1+1),round(z1)) - height); if (x1 + 1 < mapSize && z1 - 1 >= 0) diff += abs(getHeight(round(x1+1),round(z1-1)) - height); if (z1 - 1 >= 0) diff += abs(getHeight(round(x1),round(z1-1)) - height); if (x1 - 1 >= 0 && z1 - 1 >= 0) diff += abs(getHeight(round(x1-1),round(z1-1)) - height); if (x1 - 1 >= 0) diff += abs(getHeight(round(x1-1),round(z1)) - height); if (x1 - 1 >= 0 && z1 + 1 < mapSize) diff += abs(getHeight(round(x1-1),round(z1+1)) - height); return diff; } function hasTextureInRadius(x1, z1,radius, textureName) { for (var xx = x1-radius;xx <= x1 + radius; xx++) for (var zz = z1-radius;zz <= z1 + radius; zz++) if (xx !== x1 || zz !== z1) if (xx >= 0 && xx < mapSize) if (zz >= 0 && zz < mapSize) { if (typeof(textureName) != "number") { for (i in textureName) if ( g_Map.getTexture(xx,zz) == textureName[i]) return true; } else { if ( g_Map.getTexture(xx,zz) == textureName) return true; } } return false; } Index: ps/trunk/binaries/data/mods/public/maps/random/gulf_of_bothnia.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/gulf_of_bothnia.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/gulf_of_bothnia.js (revision 11754) @@ -1,587 +1,584 @@ RMS.LoadLibrary("rmgen"); TILE_CENTERED_HEIGHT_MAP = true; var rt = randInt(1,2); if (rt == 1) { 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 tDirt = ["alpine_dirt", "alpine_grass_d"]; var tRoad = "new_alpine_citytile"; var tRoadWild = "new_alpine_citytile"; var tShore = "alpine_shore_rocks_grass_50"; var tWater = "alpine_shore_rocks"; // gaia entities var oPine = "gaia/flora_tree_pine"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_deer"; var oGoat = "gaia/fauna_goat"; var oFish = "gaia/fauna_fish"; var oRabbit = "gaia/fauna_rabbit"; var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; var oStoneSmall = "gaia/geology_stone_alpine_a"; var oMetalLarge = "gaia/geology_metal_alpine_slabs"; } else { var tGrass = ["alpine_snow_a", "alpine_snow_b"]; var tGrassPForest = "alpine_forrestfloor_snow"; var tGrassDForest = "alpine_forrestfloor_snow"; var tCliff = ["alpine_cliff_a", "alpine_cliff_b"]; var tGrassA = "alpine_grass_snow_50"; var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; var tGrassC = ["alpine_snow_rocky"]; var tDirt = ["alpine_dirt_snow", "alpine_snow_a"]; var tRoad = "new_alpine_citytile"; var tRoadWild = "new_alpine_citytile"; var tShore = "alpine_shore_rocks_icy"; var tWater = "alpine_shore_rocks"; // gaia entities var oPine = "gaia/flora_tree_pine_w"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_deer"; var oGoat = "gaia/fauna_goat"; var oFish = "gaia/fauna_fish"; var oRabbit = "gaia/fauna_rabbit"; var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; var oStoneSmall = "gaia/geology_stone_alpine_a"; var oMetalLarge = "gaia/geology_metal_alpine_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 aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; var aLillies = "actor|props/flora/water_lillies.xml"; var aBushMedium = "actor|props/flora/bush_medit_me.xml"; var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oPine, tGrassDForest]; var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest]; const BUILDING_ANGlE = -PI/4; // 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 clPass = 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); } } // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = sortPlayers(playerIDs); // place players var playerX = new Array(numPlayers); var playerZ = new Array(numPlayers); var playerAngle = new Array(numPlayers); var startAngle = -PI/6; for (var i = 0; i < numPlayers; i++) { playerAngle[i] = startAngle + i*TWO_PI/(numPlayers-1)*2/3; 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]); 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; 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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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(oPine, 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); 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.08 * lSize, 0.7, 0.05, 10, ix, iz); var terrainPainter = new LayeredPainter( [tGrass, tGrass, tGrass, tGrass], // terrains [1, 4, 2] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type -3, // elevation 4 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,scaleByMapSize(15,25))); var fx = fractionToTiles(0.5); var fz = fractionToTiles(0.3); ix = round(fx); iz = round(fz); var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); var placer = new ClumpPlacer(mapArea * 0.13 * lSize, 0.7, 0.05, 10, ix, iz); var terrainPainter = new LayeredPainter( [tGrass, tGrass, tGrass, tGrass], // terrains [1, 4, 2] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type -3, // elevation 4 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,scaleByMapSize(15,25))); var fx = fractionToTiles(0.5); var fz = fractionToTiles(0.0); ix = round(fx); iz = round(fz)+1; var lSize = sqrt(sqrt(sqrt(scaleByMapSize(1, 6)))); var placer = new ClumpPlacer(mapArea * 0.17 * lSize, 0.7, 0.05, 10, ix, iz); var terrainPainter = new LayeredPainter( [tGrass, tGrass, tGrass, tGrass], // terrains [1, 4, 2] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type -3, // elevation 4 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,scaleByMapSize(15,25))); var placer = new ClumpPlacer(mapArea * 0.17 * lSize, 0.9, 0.9, 10, ix, iz); var terrainPainter = new LayeredPainter( [tGrass, tGrass, tGrass, tGrass], // terrains [1, 4, 2] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type -3, // elevation 0 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer,scaleByMapSize(15,25))); // create islands log("Creating islands..."); placer = new ClumpPlacer(floor(hillSize*randFloat(0.05,0.3)), 0.80, 0.1, 10); terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [2] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); createAreas( placer, [terrainPainter, elevationPainter, unPaintClass(clWater)], borderClasses(clWater, scaleByMapSize(8,16), 0), scaleByMapSize(2, 5)*randInt(8,14), 30 ); paintTerrainBasedOnHeight(1, 3, 0, tShore); paintTerrainBasedOnHeight(-8, 1, 2, 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), scaleByMapSize(100, 200) ); // create hills log("Creating hills..."); placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); var terrainPainter = new LayeredPainter( [tGrass, tCliff, tGrass], // terrains [1, 2] // widths ); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 12, clHill, 15, clWater, 0, clPass, 1), scaleByMapSize(1, 4) * numPlayers ); // calculate desired number of trees for map (based on size) var MIN_TREES = 600; var MAX_TREES = 3600; 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, 12, clForest, 8, clHill, 0, clWater, 2, clPass, 1), 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(tGrassB); 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 rabbit log("Creating rabbit..."); group = new SimpleGroup( [new SimpleObject(oRabbit, 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)], 11 * numPlayers, 60 ); RMS.SetProgress(85); // create straggler trees log("Creating straggler trees..."); var types = [oPine, oPine]; // 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, 3, clForest, 1, clHill, 1, clPlayer, 12, clMetal, 1, clRock, 1), num ); } //create small grass tufts log("Creating small grass tufts..."); var planetm = 1; 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 ); setSkySet("stormy"); 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/pheonician_levant.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/pheonician_levant.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/pheonician_levant.js (revision 11754) @@ -1,508 +1,505 @@ RMS.LoadLibrary("rmgen"); //TILE_CENTERED_HEIGHT_MAP = true; const tCity = "medit_city_pavement"; const tCityPlaza = "medit_city_pavement"; const tHill = ["medit_dirt", "medit_dirt_b", "medit_dirt_c", "medit_rocks_grass", "medit_rocks_grass"]; const tMainDirt = "medit_dirt"; const tCliff = "medit_cliff_aegean"; const tForestFloor = "medit_rocks_shrubs"; const tGrass = "medit_rocks_grass"; const tGrassSand50 = "medit_rocks_shrubs"; const tGrassSand25 = "medit_rocks_grass"; 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 = -PI/4; 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 = sortPlayers(playerIDs); // place players var playerX = new Array(numPlayers); var playerZ = new Array(numPlayers); var playerPos = new Array(numPlayers); for (var i = 0; i < numPlayers; i++) { playerPos[i] = (i + 1) / (numPlayers + 1); playerZ[i] = playerPos[i]; playerX[i] = 0.66 + 0.2*(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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); log("Creating sea"); 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); // 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 fadeDist = 0.05; if (x < cu + 0.5) { var h; if (x < (cu + 0.5 + fadeDist)) { h = 1 + 4.0 * (1 - ((cu + 0.5 + fadeDist) - x)/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) ); // 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, 15, 2); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 16, clForest, 1, clHill, 15, clWater, 0), scaleByMapSize(1, 4) * numPlayers * 3 ); // 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, clHill, 1), 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, 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 cyprus log("Creating cyprus..."); placer = new ClumpPlacer(4.5 * scaleByMapSize(60, 540), 0.2, 0.1, 0.01); var terrainPainter = new LayeredPainter( [tShore, tHill], // terrains [12] // widths ); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 6, 8); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clIsland)], [stayClasses (clWater, 5)], 1 ); 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, 9), 14 * 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, 9), 14 * 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, 9), 14 * 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 = 3*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, 9), num ); } // Set environment setSkySet("sunny"); setSunColour(0.917, 0.828, 0.734); setWaterColour(0.292, 0.347, 0.691); // Export map data ExportMap(); // Export map data ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/canyon.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/canyon.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/canyon.js (revision 11754) @@ -1,719 +1,714 @@ RMS.LoadLibrary("rmgen"); //random terrain textures var rt = randomizeBiome(); var tGrass = rBiomeT1(); var tGrassPForest = rBiomeT2(); var tGrassDForest = rBiomeT3(); var tCliff = rBiomeT4(); var tGrassA = rBiomeT5(); var tGrassB = rBiomeT6(); var tGrassC = rBiomeT7(); var tHill = rBiomeT8(); var tDirt = rBiomeT9(); var tRoad = rBiomeT10(); var tRoadWild = rBiomeT11(); var tGrassPatch = rBiomeT12(); var tShoreBlend = rBiomeT13(); var tShore = rBiomeT14(); var tWater = rBiomeT15(); // gaia entities var oOak = rBiomeE1(); var oOakLarge = rBiomeE2(); var oApple = rBiomeE3(); var oPine = rBiomeE4(); var oAleppoPine = rBiomeE5(); var oBerryBush = rBiomeE6(); var oChicken = rBiomeE7(); var oDeer = rBiomeE8(); var oFish = rBiomeE9(); var oSheep = rBiomeE10(); var oStoneLarge = rBiomeE11(); var oStoneSmall = rBiomeE12(); var oMetalLarge = rBiomeE13(); var oWood = "gaia/special_treasure_wood"; var oFood = "gaia/special_treasure_food_bin"; // decorative props var aGrass = rBiomeA1(); var aGrassShort = rBiomeA2(); var aReeds = rBiomeA3(); var aLillies = rBiomeA4(); var aRockLarge = rBiomeA5(); var aRockMedium = rBiomeA6(); var aBushMedium = rBiomeA7(); var aBushSmall = rBiomeA8(); var aTree = rBiomeA9(); 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 = -PI/4; // 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 clHill2 = 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(); 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.065 * lSize, 0.7, 0.1, 10, ix, iz); var terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 3, // elevation 3 // 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 = sortPlayers(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(18,32); var cliffRadius = 2; var elevation = 20; var hillSize = PI * radius * radius; // get the x and z in tiles fx = fractionToTiles(playerX[i]); fz = fractionToTiles(playerZ[i]); ix = round(fx); iz = round(fz); // create the hill var placer = new ClumpPlacer(hillSize, 0.65, 0.1, 10, ix, iz); var terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [cliffRadius] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 3, // elevation cliffRadius // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); - - - // get civ specific starting entities - var civEntities = getStartingEntities(id-1); - // create starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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 - 7; 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); } // create the city patch var cityRadius = radius/2; placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, fractionToTiles(playerX[i]), fractionToTiles(playerZ[i])); var painter = new LayeredPainter([tGrass, tGrass], [1]); createArea(placer, [painter, paintClass(clPlayer)], null); } placer = new ClumpPlacer(150, 0.6, 0.3, 10, fractionToTiles(0.5), fractionToTiles(0.5)); var painter = new LayeredPainter([tRoad, tRoad], [1]); createArea(placer, [painter, paintClass(clHill)], null); for (var i = 0; i < scaleByMapSize(9,16); i++) { var ix = randInt(1, mapSize - 1); var iz = randInt(1, mapSize - 1); var ix2 = randInt(1, mapSize - 1); var iz2 = randInt(1, mapSize - 1); var placer = new PathPlacer(ix, iz, ix2, iz2, scaleByMapSize(11,16), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); var terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 30, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill2)], avoidClasses(clPlayer, 6, clHill2, 3, clHill, 2)); } for (var g = 0; g < scaleByMapSize(20,80); g++) { var tx = randInt(1, mapSize - 1); var tz = randInt(1, mapSize - 1); placer = new ClumpPlacer(mapArea * 0.01 * lSize, 0.7, 0.1, 10, tx, tz); terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [3] // widths ); elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 3, // elevation 3 // blend radius ); var newarea = createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], avoidClasses(clLand, 6)); if (newarea !== null) { var distances = new Array(0); var d1 = 9999; var d2 = 9999; var p1 = -1; var p2 = 0; for (var i = 0; i < numPlayers; i++) { distances.push(sqrt((tx-mapSize*playerX[i])*(tx-mapSize*playerX[i])+(tz-mapSize*playerZ[i])*(tz-mapSize*playerZ[i]))); } for (var a = 0; a < numPlayers; a++) { if (d1 >= distances[a]) { d2 = d1; d1 = distances[a]; p2 = p1; p1 = a; } else if (d2 >= distances[a]) { d2 = distances[a]; p2 = a; } } var placer = new PathPlacer(tx, tz, mapSize*playerX[p1], mapSize*playerZ[p1], scaleByMapSize(11,17), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.1); var terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 3, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); var placer = new PathPlacer(tx, tz, mapSize*playerX[p2], mapSize*playerZ[p2], scaleByMapSize(11,17), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.1); var terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 3, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand)], null); } } for (var i = 0; i < numPlayers; i++) { if (i+1 == numPlayers) { var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[0]), fractionToTiles(playerZ[0]), scaleByMapSize(8,13), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); } else { var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[i+1]), fractionToTiles(playerZ[i+1]), scaleByMapSize(8,13), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); } var terrainPainter = new LayeredPainter( [tRoadWild, tRoad], // terrains [1] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 3, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand), paintClass(clHill)], null); var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(0.5), fractionToTiles(0.5), scaleByMapSize(8,13), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); var terrainPainter = new LayeredPainter( [tRoadWild, tRoad], // terrains [1] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 3, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clLand), paintClass(clHill)], null); } for (var i = 0; i < numPlayers; i++) { // create the city patch var cityRadius = radius/3; placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, fractionToTiles(playerX[i]), fractionToTiles(playerZ[i])); var painter = new LayeredPainter([tRoad, tRoad], [1]); createArea(placer, [painter, paintClass(clPlayer)], null); } placer = new ClumpPlacer(150, 0.6, 0.3, 10, fractionToTiles(0.5), fractionToTiles(0.5)); var painter = new LayeredPainter([tRoad, tRoad], [1]); createArea(placer, [painter, paintClass(clHill)], null); RMS.SetProgress(20); paintTerrainBasedOnHeight(3.1, 29, 0, tCliff); paintTileClassBasedOnHeight(3.1, 32, 0, clHill2); // 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, 2), stayClasses(clLand, 2)], 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, 2, clHill, 8, clHill2, 8), stayClasses(clLand, 5)], scaleByMapSize(1, 4) * numPlayers ); // create hills log("Creating hills..."); placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1); terrainPainter = new LayeredPainter( [tCliff, tGrass], // terrains [2] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 40, 2); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clLand, 1, clHill, 1), scaleByMapSize(20, 150) ); // 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, 1, clForest, 5, clHill, 1, clHill2, 0), stayClasses(clLand, 4)], 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, 4, clHill2, 0), stayClasses(clLand, 3)], 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, 4, clHill2, 0), stayClasses(clLand, 3)], 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, 3, clRock, 10, clHill, 1, clHill2, 1), stayClasses(clLand, 2)], scaleByMapSize(6,24), 100 ); // create small stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); createObjectGroups(group, 0, [avoidClasses(clForest, 1, clPlayer, 3, clRock, 10, clHill, 1, clHill2, 1), stayClasses(clLand, 2)], scaleByMapSize(6,24), 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, 3, clMetal, 10, clRock, 5, clHill, 1, clHill2, 1), stayClasses(clLand, 2)], scaleByMapSize(6,24), 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), 3*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), 3*scaleByMapSize(8, 131), 50 ); // create actor trees log("Creating actor trees..."); group = new SimpleGroup( [new SimpleObject(aTree, 1,1, 0,1)], true ); createObjectGroups( group, 0, avoidClasses(clLand, 5), scaleByMapSize(200, 800), 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, 4, clHill, 1, clFood, 20, clHill2, 1), stayClasses(clLand, 3)], 3 * numPlayers, 50 ); // create berries log("Creating berries..."); group = new SimpleGroup( [new SimpleObject(oBerryBush, 5,7, 0,4)], true, clFood ); createObjectGroups(group, 0, [avoidClasses(clWater, 0, clForest, 0, clPlayer, 4, clHill, 1, clFood, 20, clHill2, 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, 4, clHill, 1, clFood, 20, clHill2, 1), stayClasses(clLand, 3)], 3 * numPlayers, 50 ); 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, clHill2, 1), stayClasses(clLand, 3)], 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, 3)], 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, 3)], 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, 3)], planetm * scaleByMapSize(13, 200), 50 ); // create treasures var fx = fractionToTiles(0.5); var fz = fractionToTiles(0.5); for (var i = 0; i < randInt(3,8); i++) { placeObject(fx+randFloat(-7,7), fz+randFloat(-7,7), oWood, 0, randFloat(0, TWO_PI)) } for (var i = 0; i < randInt(3,8); i++) { placeObject(fx+randFloat(-7,7), fz+randFloat(-7,7), oFood, 0, randFloat(0, TWO_PI)) } 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/neareastern_badlands.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/neareastern_badlands.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/neareastern_badlands.js (revision 11754) @@ -1,469 +1,466 @@ 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 = -PI/4; // 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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/hyrcanian_shores.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/hyrcanian_shores.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/hyrcanian_shores.js (revision 11754) @@ -1,557 +1,554 @@ RMS.LoadLibrary("rmgen"); // terrain textures const tGrass = ["temp_grass_clovers"]; const tGrassPForest = "temp_plants_bog"; const tGrassDForest = "alpine_dirt_grass_50"; 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 = "medit_sand_wet"; const tWater = "medit_sand_wet"; // gaia entities const oPoplar = "gaia/flora_tree_poplar"; const oPalm = "gaia/flora_tree_cretan_date_palm_short"; const oApple = "gaia/flora_tree_apple"; const oOak = "gaia/flora_tree_oak"; const oBerryBush = "gaia/flora_bush_berry"; const oChicken = "gaia/fauna_chicken"; const oDeer = "gaia/fauna_deer"; const oFish = "gaia/fauna_fish"; const oGoat = "gaia/fauna_goat"; const oBoar = "gaia/fauna_boar"; const oStoneLarge = "gaia/geology_stonemine_temperate_quarry"; const oStoneSmall = "gaia/geology_stone_temperate"; const oMetalLarge = "gaia/geology_metal_temperate_slabs"; // 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_lush.xml"; const aBushSmall = "actor|props/flora/bush_medit_sm_lush.xml"; // terrain + entity (for painting) const pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oPoplar, tGrassDForest]; const pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oOak, tGrassPForest]; const WATER_WIDTH = 0.25; const BUILDING_ANGlE = -PI/4; // 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 clSea = createTileClass(); var clHighlands = createTileClass(); var clFlatlands = createTileClass(); // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = sortPlayers(playerIDs); // place players var playerX = new Array(numPlayers); var playerZ = new Array(numPlayers); var playerPos = new Array(numPlayers); for (var i = 0; i < numPlayers; i++) { playerPos[i] = (i + 1) / (numPlayers + 1); playerX[i] = playerPos[i]; playerZ[i] = 0.4 + 0.2*(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 = round(fx); var iz = round(fz); // Setting tile class addToClass(ix, iz, clPlayer); addToClass(ix+5, iz, clPlayer); addToClass(ix, iz+5, clPlayer); addToClass(ix-5, iz, clPlayer); addToClass(ix, iz-5, clPlayer); // calculate size based on the radius var hillSize = PI * radius * radius; // 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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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(oPoplar, 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 sea and hills log("Creating sea and northern hills..."); 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); // add the rough shape of the water var km = 20/scaleByMapSize(35, 160); var cu = km*rndRiver(theta+x*0.5*(mapSize/64),seed); var fadeDist = 0.05; if (z < 0.25) { addToClass(ix, iz, clHighlands); } if (z > 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/atlas_mountains.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/atlas_mountains.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/atlas_mountains.js (revision 11754) @@ -1,511 +1,508 @@ 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 = -PI/4; // 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/guadalquivir_river.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/guadalquivir_river.js (revision 11754) @@ -1,525 +1,522 @@ RMS.LoadLibrary("rmgen"); 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 = -PI/4; // 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 = primeSortPlayers(sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // create animals for (var j = 0; j < 2; ++j) { var aAngle = randFloat(0, TWO_PI); var aDist = 6; var aX = round(fx + aDist * cos(aAngle)); var aZ = round(fz + aDist * sin(aAngle)); var 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 = 8; 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 - 7; 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/saharan_oases.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/saharan_oases.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/saharan_oases.js (revision 11754) @@ -1,380 +1,377 @@ RMS.LoadLibrary("rmgen"); var tCity = "desert_city_tile"; var tCityPlaza = "desert_city_tile_plaza"; var tSand = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; var tDunes = "desert_sand_dunes_100"; var tFineSand = "desert_sand_smooth"; var tCliff = ["desert_cliff_badlands", "desert_cliff_badlands_2"]; var tForestFloor = "desert_forestfloor_palms"; var tGrass = "desert_dirt_rough_2"; var tGrassSand50 = "desert_sand_dunes_50"; var tGrassSand25 = "desert_dirt_rough"; var tDirt = "desert_dirt_rough"; var tDirtCracks = "desert_dirt_cracks"; var tShore = "desert_shore_stones"; var tWaterDeep = "desert_shore_stones_wet"; var tLush = "desert_grass_a"; var tSLush = "desert_grass_a_sand"; var tSDry = "desert_plants_b"; // gaia entities var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oCamel = "gaia/fauna_camel"; var oFish = "gaia/fauna_fish"; var oGazelle = "gaia/fauna_gazelle"; var oGiraffe = "gaia/fauna_giraffe"; var oGoat = "gaia/fauna_goat"; var oWildebeest = "gaia/fauna_wildebeest"; var oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry"; var oStoneSmall = "gaia/geology_stone_desert_small"; var oMetalLarge = "gaia/geology_metal_desert_slabs"; var oDatePalm = "gaia/flora_tree_date_palm"; var oSDatePalm = "gaia/flora_tree_cretan_date_palm_short"; var eObelisk = "other/obelisk"; var ePyramid = "other/pyramid_minor"; var oWood = "gaia/special_treasure_wood"; var oFood = "gaia/special_treasure_food_bin"; // decorative props var aBush1 = "actor|props/flora/bush_desert_a.xml"; var aBush2 = "actor|props/flora/bush_desert_dry_a.xml"; var aBush3 = "actor|props/flora/bush_medit_sm_dry.xml"; var aBush4 = "actor|props/flora/plant_desert_a.xml"; var aBushes = [aBush1, aBush2, aBush3, aBush4]; var aDecorativeRock = "actor|geology/stone_desert_med.xml"; var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; var aLillies = "actor|props/flora/water_lillies.xml"; // terrain + entity (for painting) var pForest = [tLush + TERRAIN_SEPARATOR + oDatePalm, tLush + TERRAIN_SEPARATOR + oSDatePalm, tLush]; var pForestOasis = [tLush + TERRAIN_SEPARATOR + oDatePalm, tLush + TERRAIN_SEPARATOR + oSDatePalm, tLush]; const BUILDING_ANGlE = -PI/4; 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 = sortPlayers(playerIDs); 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 = 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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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); for (var i = 0; i < numPlayers; i++) { // create the oases log("Creating oases..."); var oRadius = scaleByMapSize(16, 60); placer = new ClumpPlacer(PI*oRadius*oRadius*0.185, 0.6, 0.15, 0, mapSize*(0.5 + 0.18*cos(playerAngle[i]) + scaleByMapSize(1, 4)*cos(playerAngle[i])/100), mapSize*(0.5 + 0.18*sin(playerAngle[i]) + scaleByMapSize(1, 4)*sin(playerAngle[i])/100)); painter = new LayeredPainter([tSLush ,[tLush, pForest], [tLush, pForestOasis], tShore, tShore, tWaterDeep], [2, 2, 1, 3, 1]); var elevationPainter = new SmoothElevationPainter(ELEVATION_MODIFY, -3, 8); createArea(placer, [painter, elevationPainter, paintClass(clWater)], null); } // 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), 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), 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, 26, clRock, 10, clWater, 1), 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, 26, clRock, 10, clWater, 1), 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, 26, clMetal, 10, clRock, 5, clWater, 1), 2*scaleByMapSize(4,16), 100 ); // 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), 5*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(10, 100), 50 ); // create small decorative rocks on mines log("Creating small decorative rocks..."); group = new SimpleGroup( [new SimpleObject(aDecorativeRock, 1,3, 0,1)], true ); createObjectGroups( group, 0, stayClasses(clRock, 0), 5*scaleByMapSize(16, 262), 50 ); group = new SimpleGroup( [new SimpleObject(aDecorativeRock, 1,3, 0,1)], true ); createObjectGroups( group, 0, stayClasses(clMetal, 0), 5*scaleByMapSize(16, 262), 50 ); // create gazelles log("Creating gazelles..."); group = new SimpleGroup([new SimpleObject(oGazelle, 5,7, 0,4)], true, clFood); createObjectGroups(group, 0, borderClasses(clWater, 8, 5), 6*scaleByMapSize(5,20), 50 ); // create goats log("Creating goats..."); group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood); createObjectGroups(group, 0, borderClasses(clWater, 8, 5), 5*scaleByMapSize(5,20), 50 ); // create treasures log("Creating treasures..."); group = new SimpleGroup([new SimpleObject(oFood, 1,1, 0,2)], true, clTreasure); createObjectGroups(group, 0, borderClasses(clWater, 8, 5), 3*scaleByMapSize(5,20), 50 ); group = new SimpleGroup([new SimpleObject(oWood, 1,1, 0,2)], true, clTreasure); createObjectGroups(group, 0, borderClasses(clWater, 8, 5), 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, borderClasses(clWater, 14, 5), 5*scaleByMapSize(5,20), 50 ); // Set environment setSkySet("sunny"); setSunColour(0.746, 0.718, 0.539); setWaterColour(0.292, 0.347, 0.691); setWaterTint(0.550, 0.543, 0.437); setWaterReflectionTint(0.562, 0.511, 0.425); setWaterMurkiness(0.83); setWaterReflectionTintStrength(0.377); // Export map data ExportMap(); \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/rhine_marshlands.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rhine_marshlands.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/rhine_marshlands.js (revision 11754) @@ -1,490 +1,487 @@ RMS.LoadLibrary("rmgen"); var tGrass = ["temp_grass", "temp_grass", "temp_grass_d"]; var tGrassPForest = "temp_plants_bog"; var tGrassDForest = "temp_plants_bog"; var tGrassA = "temp_grass_plants"; var tGrassB = "temp_plants_bog"; var tGrassC = ["temp_grass_b", "temp_grass_c"]; var tDirt = ["temp_plants_bog", "temp_mud_a"]; var tRoad = "temp_road"; var tRoadWild = "temp_road_overgrown"; var tShoreBlend = "temp_grass_plants"; var tShore = "temp_plants_bog"; var tWater = "temp_mud_a"; // gaia entities var oBeech = "gaia/flora_tree_euro_beech"; var oOak = "gaia/flora_tree_oak"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_deer"; var oHorse = "gaia/fauna_horse"; var oWolf = "gaia/fauna_wolf"; var oFish = "gaia/fauna_fish"; var oSheep = "gaia/fauna_rabbit"; var oStoneLarge = "gaia/geology_stonemine_temperate_quarry"; var oStoneSmall = "gaia/geology_stone_temperate"; var oMetalLarge = "gaia/geology_metal_temperate_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 aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; var aLillies = "actor|props/flora/water_lillies.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 + oOak, tGrassPForest]; const BUILDING_ANGlE = -PI/4; // 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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(15); // 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) ); // create marshes log("Creating marshes..."); for (var i = 0; i < 7; i++) { placer = new ClumpPlacer(9*scaleByMapSize(50,130)*randFloat(0.6,1.4), 0.8, 0.1, 10); var terrainPainter = new LayeredPainter( [tShoreBlend, tShore, tWater], // terrains [1,1] // widths ); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -2, 3); var waterAreas = createAreas( placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 15, clWater, round(scaleByMapSize(7,16)*randFloat(0.8,1.35))), scaleByMapSize(4,20) ); } // create reeds log("Creating reeds..."); group = new SimpleGroup( [new SimpleObject(aReeds, 5,10, 0,4), new SimpleObject(aLillies, 5,10, 0,4)], true ); createObjectGroups(group, 0, stayClasses(clWater, 1), scaleByMapSize(400,2000), 100 ); waterAreas = []; RMS.SetProgress(40); // create bumps log("Creating bumps..."); placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1); painter = new SmoothElevationPainter(ELEVATION_MODIFY, 1, 2); createAreas( placer, painter, stayClasses(clWater, 2), scaleByMapSize(50, 100) ); // 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, 15, clWater, 0, clForest, 10, clHill, 1), num ); } RMS.SetProgress(50); // create dirt patches log("Creating dirt patches..."); var sizes = [scaleByMapSize(3, 21), scaleByMapSize(5, 37), scaleByMapSize(8, 50)]; 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, 8), scaleByMapSize(15, 45) ); } // create grass patches log("Creating grass patches..."); var sizes = [scaleByMapSize(3, 21), scaleByMapSize(5, 37), scaleByMapSize(8, 40)]; for (var i = 0; i < sizes.length; i++) { placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); painter = new TerrainPainter(tDirt); createAreas( placer, painter, avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 8), scaleByMapSize(15, 45) ); } 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, 15, 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, 15, 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, 15, 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, 15, clHill, 1, clFood, 13), 6 * numPlayers, 50 ); // create horse log("Creating horse..."); group = new SimpleGroup( [new SimpleObject(oHorse, 1,3, 0,4)], true, clFood ); createObjectGroups(group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 15, clHill, 1, clFood, 13), 3 * numPlayers, 50 ); RMS.SetProgress(75); // create sheep log("Creating sheep..."); group = new SimpleGroup( [new SimpleObject(oSheep, 5,7, 0,2)], true, clFood ); createObjectGroups(group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 15, clHill, 1, clFood, 13), 6 * numPlayers, 50 ); // create wolf log("Creating wolf..."); group = new SimpleGroup( [new SimpleObject(oWolf, 1,3, 0,4)], true, clFood ); createObjectGroups(group, 0, avoidClasses(clWater, 0, clForest, 0, clPlayer, 15, clHill, 1, clFood, 13), 3 * numPlayers, 50 ); RMS.SetProgress(80); // create straggler trees log("Creating straggler trees..."); var types = [oOak, 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, clWater, 0), 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, 13, 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, 13, 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, 13, clDirt, 1), scaleByMapSize(13, 200), 50 ); // Set environment setSkySet("cirrus"); setWaterTint(0.747, 0.712, 0.322); // muddy brown setWaterReflectionTint(0.747, 0.712, 0.322); // muddy brown setWaterMurkiness(1.0); setWaterReflectionTintStrength(0.377); ExportMap(); \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/alpine_valley.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/alpine_valley.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/alpine_valley.js (revision 11754) @@ -1,589 +1,586 @@ RMS.LoadLibrary("rmgen"); TILE_CENTERED_HEIGHT_MAP = true; var rt = randInt(1,2); if (rt == 1) { 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 tDirt = ["alpine_dirt", "alpine_grass_d"]; var tRoad = "new_alpine_citytile"; var tRoadWild = "new_alpine_citytile"; var tShore = "alpine_shore_rocks_grass_50"; var tWater = "alpine_shore_rocks"; // gaia entities var oPine = "gaia/flora_tree_pine"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_deer"; var oGoat = "gaia/fauna_goat"; var oFish = "gaia/fauna_fish"; var oRabbit = "gaia/fauna_rabbit"; var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; var oStoneSmall = "gaia/geology_stone_alpine_a"; var oMetalLarge = "gaia/geology_metal_alpine_slabs"; } else { var tGrass = ["alpine_snow_a", "alpine_snow_b"]; var tGrassPForest = "alpine_forrestfloor_snow"; var tGrassDForest = "alpine_forrestfloor_snow"; var tCliff = ["alpine_cliff_a", "alpine_cliff_b"]; var tGrassA = "alpine_grass_snow_50"; var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; var tGrassC = ["alpine_snow_rocky"]; var tDirt = ["alpine_dirt_snow", "alpine_snow_a"]; var tRoad = "new_alpine_citytile"; var tRoadWild = "new_alpine_citytile"; var tShore = "alpine_shore_rocks_icy"; var tWater = "alpine_shore_rocks"; // gaia entities var oPine = "gaia/flora_tree_pine_w"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_deer"; var oGoat = "gaia/fauna_goat"; var oFish = "gaia/fauna_fish"; var oRabbit = "gaia/fauna_rabbit"; var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; var oStoneSmall = "gaia/geology_stone_alpine_a"; var oMetalLarge = "gaia/geology_metal_alpine_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 aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; var aLillies = "actor|props/flora/water_lillies.xml"; var aBushMedium = "actor|props/flora/bush_medit_me.xml"; var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oPine, tGrassDForest]; var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest]; const BUILDING_ANGlE = -PI/4; // 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 clPass = 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); } } // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = sortPlayers(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]); 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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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(oPine, 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 hills log ("Creating hills..."); for (var i = 0; i < scaleByMapSize(15,40); i++) { var ix = randInt(1, mapSize - 1); var iz = randInt(1, mapSize - 1); var ix2 = randInt(1, mapSize - 1); var iz2 = randInt(1, mapSize - 1); var placer = new PathPlacer(ix, iz, ix2, iz2, scaleByMapSize(7,13), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.1); var terrainPainter = new LayeredPainter( [tCliff, tGrass], // terrains [3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 20, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 15)); } //create passages log ("Creating passages..."); for (var i = 0; i < numPlayers; i++) { if (i+1 == numPlayers) { var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[0]), fractionToTiles(playerZ[0]), scaleByMapSize(12,25), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); } else { var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[i+1]), fractionToTiles(playerZ[i+1]), scaleByMapSize(12,25), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); } var terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [1] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 3, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clPass)], null); } //create rivers log ("Creating rivers..."); for (var m = 0; m < scaleByMapSize(1,3)*randInt(3,4); m++) { var tang = randFloat(0, TWO_PI); var placer = new PathPlacer(fractionToTiles(0.5), fractionToTiles(0.5), fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang)), scaleByMapSize(10,20), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.05); var terrainPainter = new LayeredPainter( [tShore, tWater, tWater], // terrains [1, 3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type -4, // elevation 4 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 15)); placer = new ClumpPlacer(floor(PI*scaleByMapSize(10,20)*scaleByMapSize(10,20)/4), 0.95, 0.6, 10, fractionToTiles(0.5 + 0.49*cos(tang)), fractionToTiles(0.5 + 0.49*sin(tang))); var painter = new LayeredPainter([tWater, tWater], [1]); var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 4); createArea(placer, [painter, elevationPainter], avoidClasses(clPlayer, 15)); } paintTerrainBasedOnHeight(3.1, 20, 0, tCliff); paintTerrainBasedOnHeight(20, 21, 1, tGrass); for (var i = 0; i < numPlayers; i++) { if (i+1 == numPlayers) { passageMaker(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[0]), fractionToTiles(playerZ[0]), 6, -2, -2, 2) } else { passageMaker(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[i+1]), fractionToTiles(playerZ[i+1]), 6, -2, -2, 2) } } // 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, tGrass], // terrains [1, 2] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 12, clHill, 15, clWater, 2, clPass, 1), scaleByMapSize(1, 4) * numPlayers ); // 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, 12, clForest, 10, clHill, 0, clWater, 2, clPass, 1), 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(tGrassB); 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 rabbit log("Creating rabbit..."); group = new SimpleGroup( [new SimpleObject(oRabbit, 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)], 11 * numPlayers, 60 ); RMS.SetProgress(85); // create straggler trees log("Creating straggler trees..."); var types = [oPine, oPine]; // 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; 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 ); var 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/the_nile.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/the_nile.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/the_nile.js (revision 11754) @@ -1,619 +1,616 @@ RMS.LoadLibrary("rmgen"); var tCity = "desert_city_tile"; var tCityPlaza = "desert_city_tile_plaza"; var tSand = ["desert_dirt_rough", "desert_dirt_rough_2", "desert_sand_dunes_50", "desert_sand_smooth"]; var tDunes = "desert_sand_dunes_100"; var tFineSand = "desert_sand_smooth"; var tCliff = ["desert_cliff_badlands", "desert_cliff_badlands_2"]; var tForestFloor = "desert_forestfloor_palms"; var tGrass = "desert_dirt_rough_2"; var tGrassSand50 = "desert_sand_dunes_50"; var tGrassSand25 = "desert_dirt_rough"; var tDirt = "desert_dirt_rough"; var tDirtCracks = "desert_dirt_cracks"; var tShore = "desert_sand_wet"; var tLush = "desert_grass_a"; var tSLush = "desert_grass_a_sand"; var tSDry = "desert_plants_b"; // gaia entities var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oCamel = "gaia/fauna_camel"; var oFish = "gaia/fauna_fish"; var oGazelle = "gaia/fauna_gazelle"; var oGiraffe = "gaia/fauna_giraffe"; var oGoat = "gaia/fauna_goat"; var oWildebeest = "gaia/fauna_wildebeest"; var oStoneLarge = "gaia/geology_stonemine_desert_badlands_quarry"; var oStoneSmall = "gaia/geology_stone_desert_small"; var oMetalLarge = "gaia/geology_metal_desert_slabs"; var oDatePalm = "gaia/flora_tree_date_palm"; var oSDatePalm = "gaia/flora_tree_cretan_date_palm_short"; var eObelisk = "other/obelisk"; var ePyramid = "other/pyramid_minor"; var oWood = "gaia/special_treasure_wood"; var oFood = "gaia/special_treasure_food_bin"; // decorative props var aBush1 = "actor|props/flora/bush_desert_a.xml"; var aBush2 = "actor|props/flora/bush_desert_dry_a.xml"; var aBush3 = "actor|props/flora/bush_medit_sm_dry.xml"; var aBush4 = "actor|props/flora/plant_desert_a.xml"; var aBushes = [aBush1, aBush2, aBush3, aBush4]; var aDecorativeRock = "actor|geology/stone_desert_med.xml"; var aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; var 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 = -PI/4; log("Initializing map..."); InitMap(); var mapSize = getMapSize(); if (mapSize < 256) { var aPlants = "actor|props/flora/grass_tropical.xml"; } else { var aPlants = "actor|props/flora/grass_tropic_field_tall.xml"; } var numPlayers = getNumPlayers(); 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 = primeSortPlayers(sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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); var rifp = 0; var rifp2 = 0; 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)); if ((h < 0.1)&&(h>-0.2)) { if (rifp%2 == 0) { rifp = 0; placeObject(ix, iz, aPlants, 0, randFloat(0,TWO_PI)); } ++rifp; } } else if (xk > (cu+(0.95+WATER_WIDTH)/2)) { h = -3 + 200.0*(xk-(cu+((0.95+WATER_WIDTH)/2))); if ((h < 0.1)&&(h>-0.2)) { if (rifp2%2 == 0) { rifp2 = 0; placeObject(ix, iz, aPlants, 0, randFloat(0,TWO_PI)); } ++rifp2; } } 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.711, 0.746, 0.574); setWaterColour(0.292, 0.347, 0.691); setWaterTint(0.550, 0.543, 0.437); setWaterReflectionTint(0.562, 0.511, 0.425); setWaterMurkiness(0.83); setWaterReflectionTintStrength(0.377); // Export map data ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/alpine_lakes.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/alpine_lakes.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/alpine_lakes.js (revision 11754) @@ -1,567 +1,564 @@ RMS.LoadLibrary("rmgen"); var rt = randInt(1,2); if (rt == 1) { 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 tDirt = ["alpine_dirt", "alpine_grass_d"]; var tRoad = "new_alpine_citytile"; var tRoadWild = "new_alpine_citytile"; var tShore = "alpine_shore_rocks_grass_50"; var tWater = "alpine_shore_rocks"; // gaia entities var oPine = "gaia/flora_tree_pine"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_deer"; var oGoat = "gaia/fauna_goat"; var oFish = "gaia/fauna_fish"; var oRabbit = "gaia/fauna_rabbit"; var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; var oStoneSmall = "gaia/geology_stone_alpine_a"; var oMetalLarge = "gaia/geology_metal_alpine_slabs"; } else { var tGrass = ["alpine_snow_a", "alpine_snow_b"]; var tGrassPForest = "alpine_forrestfloor_snow"; var tGrassDForest = "alpine_forrestfloor_snow"; var tCliff = ["alpine_cliff_a", "alpine_cliff_b"]; var tGrassA = "alpine_grass_snow_50"; var tGrassB = ["alpine_grass_snow_50", "alpine_dirt_snow"]; var tGrassC = ["alpine_snow_rocky"]; var tDirt = ["alpine_dirt_snow", "alpine_snow_a"]; var tRoad = "new_alpine_citytile"; var tRoadWild = "new_alpine_citytile"; var tShore = "alpine_shore_rocks_icy"; var tWater = "alpine_shore_rocks"; // gaia entities var oPine = "gaia/flora_tree_pine_w"; var oBerryBush = "gaia/flora_bush_berry"; var oChicken = "gaia/fauna_chicken"; var oDeer = "gaia/fauna_deer"; var oGoat = "gaia/fauna_goat"; var oFish = "gaia/fauna_fish"; var oRabbit = "gaia/fauna_rabbit"; var oStoneLarge = "gaia/geology_stonemine_alpine_quarry"; var oStoneSmall = "gaia/geology_stone_alpine_a"; var oMetalLarge = "gaia/geology_metal_alpine_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 aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; var aLillies = "actor|props/flora/water_lillies.xml"; var aBushMedium = "actor|props/flora/bush_medit_me.xml"; var aBushSmall = "actor|props/flora/bush_medit_sm.xml"; var pForestD = [tGrassDForest + TERRAIN_SEPARATOR + oPine, tGrassDForest]; var pForestP = [tGrassPForest + TERRAIN_SEPARATOR + oPine, tGrassPForest]; const BUILDING_ANGlE = -PI/4; // 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 clPass = 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); } } // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = sortPlayers(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]); 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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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(oPine, 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); for (var i = 0; i < scaleByMapSize(15,40); i++) { var ix = randInt(1, mapSize - 1); var iz = randInt(1, mapSize - 1); var ix2 = randInt(1, mapSize - 1); var iz2 = randInt(1, mapSize - 1); var placer = new PathPlacer(ix, iz, ix2, iz2, scaleByMapSize(9,15), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0.1); var terrainPainter = new LayeredPainter( [tCliff, tGrass], // terrains [3] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 25, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 15)); } for (var i = 0; i < numPlayers; i++) { if (i+1 == numPlayers) { var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[0]), fractionToTiles(playerZ[0]), scaleByMapSize(12,25), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); } else { var placer = new PathPlacer(fractionToTiles(playerX[i]), fractionToTiles(playerZ[i]), fractionToTiles(playerX[i+1]), fractionToTiles(playerZ[i+1]), scaleByMapSize(12,25), 0.4, 3*(scaleByMapSize(1,4)), 0.1, 0); } var terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [1] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type 3, // elevation 3 // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clPass)], null); } // create lakes log("Creating lakes..."); placer = new ClumpPlacer(scaleByMapSize(160, 700), 0.2, 0.1, 1); terrainPainter = new LayeredPainter( [tShore, tWater, tWater], // terrains [1, 3] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -5, 5); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clWater)], avoidClasses(clPlayer, 12, clWater, 8, clPass, 4), scaleByMapSize(5, 16) ); paintTerrainBasedOnHeight(3.1, 20, 0, tCliff); paintTerrainBasedOnHeight(20, 21, 1, tGrass); // 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, tGrass], // terrains [1, 2] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 18, 2); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clHill)], avoidClasses(clPlayer, 12, clHill, 15, clWater, 2, clPass, 1), scaleByMapSize(1, 4) * numPlayers ); // 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, 12, clForest, 10, clHill, 0, clWater, 2, clPass, 1), 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(tGrassB); 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 rabbit log("Creating rabbit..."); group = new SimpleGroup( [new SimpleObject(oRabbit, 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)], 11 * numPlayers, 60 ); RMS.SetProgress(85); // create straggler trees log("Creating straggler trees..."); var types = [oPine, oPine]; // 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; 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 ); var 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/latium.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/latium.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/latium.js (revision 11754) @@ -1,639 +1,636 @@ 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 = -PI/4; // 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/continent.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/continent.js (revision 11754) @@ -1,522 +1,519 @@ RMS.LoadLibrary("rmgen"); //random terrain textures var rt = randomizeBiome(); var tGrass = rBiomeT1(); var tGrassPForest = rBiomeT2(); var tGrassDForest = rBiomeT3(); var tCliff = rBiomeT4(); var tGrassA = rBiomeT5(); var tGrassB = rBiomeT6(); var tGrassC = rBiomeT7(); var tHill = rBiomeT8(); var tDirt = rBiomeT9(); var tRoad = rBiomeT10(); var tRoadWild = rBiomeT11(); var tGrassPatch = rBiomeT12(); var tShoreBlend = rBiomeT13(); var tShore = rBiomeT14(); var tWater = rBiomeT15(); // gaia entities var oOak = rBiomeE1(); var oOakLarge = rBiomeE2(); var oApple = rBiomeE3(); var oPine = rBiomeE4(); var oAleppoPine = rBiomeE5(); var oBerryBush = rBiomeE6(); var oChicken = rBiomeE7(); var oDeer = rBiomeE8(); var oFish = rBiomeE9(); var oSheep = rBiomeE10(); var oStoneLarge = rBiomeE11(); var oStoneSmall = rBiomeE12(); var oMetalLarge = rBiomeE13(); // decorative props var aGrass = rBiomeA1(); var aGrassShort = rBiomeA2(); var aReeds = rBiomeA3(); var aLillies = rBiomeA4(); var aRockLarge = rBiomeA5(); var aRockMedium = rBiomeA6(); var aBushMedium = rBiomeA7(); var aBushSmall = rBiomeA8(); 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 = -PI/4; // 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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(); Index: ps/trunk/binaries/data/mods/public/maps/random/wall_demo.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/wall_demo.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/wall_demo.js (revision 11754) @@ -1,153 +1,175 @@ RMS.LoadLibrary("rmgen"); // initialize map log("Initializing map..."); InitMap(); // General map setup var mapSize = getMapSize(); var mapCenterX = mapSize/2; var mapCenterY = mapSize/2; const BUILDING_ANlE = -PI/4; //////////////////////////////////////// // Demonstration code for wall placement //////////////////////////////////////// // Some general notes to the arguments: // First all the place functions take the coordinates needed to place the wall // X and Y coordinate are taken in seperate arguments like in placeObject // Their meaning differs for different placement methods but are mainly self explanatory // placeLinearWall takes 4 arguments here (2 coordinates) for startX, startY, targetX and targetY // The next argument is always the 'wall' definition, an array of wall element type strings in most cases // That looks like ['endLeft', 'wall', 'tower', 'wall', 'endRight', 'entry', 'endLeft', 'wall', 'tower', 'wall', 'endRight'] // For placeCircularWall and placeLinearWall only wall parts are needed like: ['tower', 'wall'] // They will automatically end with the first wall element if that makes sense (e.g. the wall is not closed) // NOTE: They take further optional arguments to adjust this behaviour (See the wall_builder.js for that) // placeFortress just takes a fortress type string that includes the wall definition // The default fortress type strings are made for easy placement of predefined fortresses // They are chosen like map sizes: 'tiny', 'small', 'medium', 'normal', 'large', 'veryLarge' and 'giant' // NOTE: To place a custom fortress use placeCustomFortress instead // It takes an instance of the Fortress class instead of the default fortress type strings // The next argument is always the wall style string // Wall styles are chosen by strings so the civ strings got by g_MapSettings.PlayerData[playerId - 1].Civ can be used // Other styles may be present as well but besides the civ styles only 'palisades' includes all wall element types (yet) // The next argument is always the index of the player that owns the wall. // 0 is Gaia, 1 is Player 1 (default colour blue), 2 is Player 2 (default colour red), ... // The next argument is an angle defining the orientation of the wall // placeLinearWall does not need an angle since it's defined by startX/Y and targetX/Y // Orientation works like the angle argument in placeObject // 0 is always right (towards positive X) // Raising the angle will rotate the wall counter-clockwise (mathmatical positive in default 2D) // PI/2 faces top (positive Y) // Orientation might be a little confusing for placeWall since it defines where the wall has its 'front' or 'outside' not the direction it will be build to. // It's because all other methods work like that and it's intuitive there // That means the walls outside by default (orientation = 0) faces positive X and (without bending wall elements) will be build towards positive Y // Some other arguments are taken but all of them are optional and in most cases not needed -// One example is maxAngle for placeCircularWall that defines how far the wall will circumvent the center. -// Default is 2*PI which makes a full circle +// One example is maxAngle for placeCircularWall that defines how far the wall will circumvent the center. Default is 2*PI which makes a full circle // General wall placement setup const distToMapBorder = 5; const distToOtherWalls = 5; var buildableMapSize = mapSize - 2 * distToMapBorder; var actualX = distToMapBorder; var actualY = distToMapBorder; // Wall styles are chosen by strings so the civ strings got by g_MapSettings.PlayerData[playerId - 1].Civ can be used // Other styles may be present as well but besides the civ styles only 'palisades' includes all wall element types (yet) -const wallStyleList = ['athen', 'cart', 'celt', 'hele', 'iber', 'mace', 'pers', 'rome', 'spart', 'romeSiege', 'palisades']; +const wallStyleList = ['athen', 'cart', 'celt', 'hele', 'iber', 'mace', 'pers', 'rome', 'spart', 'rome_siege', 'palisades']; //////////////////////////////////////// // Custom wall placement (element based) //////////////////////////////////////// var wall = ['endLeft', 'wallLong', 'tower', 'wall', 'outpost', 'wall', 'cornerOut', 'wall', 'cornerIn', 'wall', 'house', 'endRight', 'entryTower', 'endLeft', 'wallShort', 'barracks', 'gate', 'tower', 'wall', 'wallFort', 'wall', 'endRight']; for (var styleIndex = 0; styleIndex < wallStyleList.length; styleIndex++) { var startX = actualX + styleIndex * buildableMapSize/wallStyleList.length; // X coordinate of the first wall element var startY = actualY; // Y coordinate of the first wall element var style = wallStyleList[styleIndex]; // // The wall's style like 'cart', 'celt', 'hele', 'iber', 'pers', 'rome', 'romeSiege' or 'palisades' var orientation = styleIndex * PI/64; // Orientation of the first wall element. 0 means 'outside' or 'front' is right (positive X, like object placement) // That means the wall will be build towards top (positive Y) if no corners are used var playerId = 0; // Owner of the wall (like in placeObject). 0 is Gaia, 1 is Player 1 (default colour blue), ... placeWall(startX, startY, wall, style, playerId, orientation); // Actually placing the wall } actualX = distToMapBorder; // Reset actualX actualY += 80 + distToOtherWalls; // Increase actualY for next wall placement method ////////////////////////////////////////////////////////////// // Default fortress placement (chosen by fortress type string) ////////////////////////////////////////////////////////////// var fortressRadius = 15; // The space the fortresses take in average. Just for design of this map for (var styleIndex = 0; styleIndex < wallStyleList.length; styleIndex++) { var centerX = actualX + fortressRadius + styleIndex * buildableMapSize/wallStyleList.length; // X coordinate of the center of the fortress var centerY = actualY + fortressRadius; // Y coordinate of the center of the fortress var type = 'tiny'; // Default fortress types are like map sizes: 'tiny', 'small', 'medium', 'large', 'veryLarge', 'giant' var style = wallStyleList[styleIndex]; // The wall's style like 'cart', 'celt', 'hele', 'iber', 'pers', 'rome', 'romeSiege' or 'palisades' var playerId = 0; // Owner of the wall. 0 is Gaia, 1 is Player 1 (default colour blue), ... var orientation = styleIndex * PI/32; // Where the 'main entrance' of the fortress should face (like in placeObject). All fortresses walls should start with an entrance placeFortress(centerX, centerY, type, style, playerId, orientation); // Actually placing the fortress placeObject(centerX, centerY, 'other/obelisk', 0, 0*PI); // Place visual marker to see the center of the fortress } actualX = distToMapBorder; // Reset actualX actualY += 2 * fortressRadius + 2 * distToOtherWalls; // Increase actualY for next wall placement method ////////////////////////// // Circular wall placement ////////////////////////// // NOTE: Don't use bending wall elements like corners here! -var radius = min((mapSize - actualY - distToOtherWalls) / 2, (buildableMapSize / wallStyleList.length - distToOtherWalls) / 2); // The radius of wall circle +var radius = min((mapSize - actualY - distToOtherWalls) / 3, (buildableMapSize / wallStyleList.length - distToOtherWalls) / 2); // The radius of wall circle var centerY = actualY + radius; // Y coordinate of the center of the wall circle var orientation = 0; // Where the wall circle will be open if maxAngle < 2*PI, see below. Otherwise where the first wall element will be placed for (var styleIndex = 0; styleIndex < wallStyleList.length; styleIndex++) { var centerX = actualX + radius + styleIndex * buildableMapSize/wallStyleList.length; // X coordinate of the center of the wall circle var playerID = 0; // Player ID of the player owning the wall, 0 is Gaia, 1 is the first player (default blue), ... var wallPart = ['tower', 'wall', 'house']; // List of wall elements the wall will be build of. Optional, default id ['wall'] var style = wallStyleList[styleIndex]; // The wall's style like 'cart', 'celt', 'hele', 'iber', 'pers', 'rome', 'romeSiege' or 'palisades' var maxAngle = PI/2 * (styleIndex%3 + 2); // How far the wall should circumvent the center - placeCircularWall(centerX, centerY, radius, wallPart, style, playerID, orientation, maxAngle) // Actually placing the wall + placeCircularWall(centerX, centerY, radius, wallPart, style, playerID, orientation, maxAngle); // Actually placing the wall + placeObject(centerX, centerY, 'other/obelisk', 0, 0*PI); // Place visual marker to see the center of the wall circle + orientation += PI/16; // Increasing orientation to see how rotation works (like for object placement) +} +actualX = distToMapBorder; // Reset actualX +actualY += 2 * radius + distToOtherWalls; // Increase actualY for next wall placement method + +/////////////////////////// +// Polygonal wall placement +/////////////////////////// +// NOTE: Don't use bending wall elements like corners here! +var radius = min((mapSize - actualY - distToOtherWalls) / 2, (buildableMapSize / wallStyleList.length - distToOtherWalls) / 2); // The radius of wall polygons +var centerY = actualY + radius; // Y coordinate of the center of the wall polygon +var orientation = 0; // Where the wall circle will be open if ???, see below. Otherwise where the first wall will be placed +for (var styleIndex = 0; styleIndex < wallStyleList.length; styleIndex++) +{ + var centerX = actualX + radius + styleIndex * buildableMapSize/wallStyleList.length; // X coordinate of the center of the wall circle + var playerID = 0; // Player ID of the player owning the wall, 0 is Gaia, 1 is the first player (default blue), ... + var cornerWallElement = 'tower'; // With wall element type will be uset for the corners of the polygon + var wallPart = ['wall', 'tower']; // List of wall elements the wall will be build of. Optional, default id ['wall'] + var style = wallStyleList[styleIndex]; // The wall's style like 'cart', 'celt', 'hele', 'iber', 'pers', 'rome', 'romeSiege' or 'palisades' + var numCorners = (styleIndex)%6 + 3; // How many corners the plogon will have + var skipFirstWall = true; // If the wall should be open towards orientation + placePolygonalWall(centerX, centerY, radius, wallPart, cornerWallElement, style, playerID, orientation, numCorners, skipFirstWall); placeObject(centerX, centerY, 'other/obelisk', 0, 0*PI); // Place visual marker to see the center of the wall circle orientation += PI/16; // Increasing orientation to see how rotation works (like for object placement) } actualX = distToMapBorder; // Reset actualX actualY += 2 * radius + distToOtherWalls; // Increase actualY for next wall placement method //////////////////////// // Linear wall placement //////////////////////// // NOTE: Don't use bending wall elements like corners here! var maxWallLength = (mapSize - actualY - distToMapBorder - distToOtherWalls); // Just for this maps design. How long the longest wall will be var numWallsPerStyle = floor(buildableMapSize / distToOtherWalls / wallStyleList.length); // Just for this maps design. How many walls of the same style will be placed for (var styleIndex = 0; styleIndex < wallStyleList.length; styleIndex++) { for (var wallIndex = 0; wallIndex < numWallsPerStyle; wallIndex++) { var startX = actualX + (styleIndex * numWallsPerStyle + wallIndex) * distToOtherWalls; // X coordinate the wall will start from var startY = actualY; // Y coordinate the wall will start from var endX = actualX + (styleIndex * numWallsPerStyle + wallIndex) * distToOtherWalls; // X coordinate the wall will end var endY = actualY + (wallIndex + 1) * maxWallLength/numWallsPerStyle; // Y coordinate the wall will end var playerID = 0; // Player ID of the player owning the wall, 0 is Gaia, 1 is the first player (default blue), ... var wallPart = ['tower', 'wall']; // List of wall elements the wall will be build of var style = wallStyleList[styleIndex]; // The wall's style like 'cart', 'celt', 'hele', 'iber', 'pers', 'rome', 'romeSiege' or 'palisades' - placeLinearWall(startX, startY, endX, endY, wallPart, style, playerID); // Actually placing the wall + placeLinearWall(startX, startY, endX, endY, wallPart, style, playerID, false); // Actually placing the wall // placeObject(startX, startY, 'other/obelisk', 0, 0*PI); // Place visual marker to see where exsactly the wall begins // placeObject(endX, endY, 'other/obelisk', 0, 0*PI); // Place visual marker to see where exsactly the wall ends } } actualX = distToMapBorder; // Reset actualX actualY += maxWallLength + distToOtherWalls; // Increase actualY for next wall placement method // Export map data ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/aegean_sea.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/aegean_sea.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/aegean_sea.js (revision 11754) @@ -1,525 +1,522 @@ RMS.LoadLibrary("rmgen"); TILE_CENTERED_HEIGHT_MAP = true; 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 = -PI/4; 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 = primeSortPlayers(sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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/archipelago.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/archipelago.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/archipelago.js (revision 11754) @@ -1,547 +1,544 @@ RMS.LoadLibrary("rmgen"); TILE_CENTERED_HEIGHT_MAP = true; //random terrain textures var rt = randomizeBiome(); var tGrass = rBiomeT1(); var tGrassPForest = rBiomeT2(); var tGrassDForest = rBiomeT3(); var tCliff = rBiomeT4(); var tGrassA = rBiomeT5(); var tGrassB = rBiomeT6(); var tGrassC = rBiomeT7(); var tHill = rBiomeT8(); var tDirt = rBiomeT9(); var tRoad = rBiomeT10(); var tRoadWild = rBiomeT11(); var tGrassPatch = rBiomeT12(); var tShoreBlend = rBiomeT13(); var tShore = rBiomeT14(); var tWater = rBiomeT15(); if (rt == 2) { tShore = "alpine_shore_rocks_icy"; tWater = "alpine_shore_rocks"; } // gaia entities var oOak = rBiomeE1(); var oOakLarge = rBiomeE2(); var oApple = rBiomeE3(); var oPine = rBiomeE4(); var oAleppoPine = rBiomeE5(); var oBerryBush = rBiomeE6(); var oChicken = rBiomeE7(); var oDeer = rBiomeE8(); var oFish = rBiomeE9(); var oSheep = rBiomeE10(); var oStoneLarge = rBiomeE11(); var oStoneSmall = rBiomeE12(); var oMetalLarge = rBiomeE13(); var oWood = "gaia/special_treasure_wood"; // decorative props var aGrass = rBiomeA1(); var aGrassShort = rBiomeA2(); var aReeds = rBiomeA3(); var aLillies = rBiomeA4(); var aRockLarge = rBiomeA5(); var aRockMedium = rBiomeA6(); var aBushMedium = rBiomeA7(); var aBushSmall = rBiomeA8(); 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 = -PI/4; // 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(); // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = sortPlayers(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(17,29); var shoreRadius = 4; var elevation = 3; var hillSize = PI * radius * radius; // 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); // create the hill var placer = new ClumpPlacer(hillSize, 0.80, 0.1, 10, ix, iz); var terrainPainter = new LayeredPainter( [tGrass , tGrass, tGrass], // terrains [1, shoreRadius] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type elevation, // elevation shoreRadius // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null); - // get civ specific starting entities - var civEntities = getStartingEntities(id-1); - // create starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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 woods var bbAngle = randFloat(0, TWO_PI); var bbDist = 13; var bbX = round(fx + bbDist * cos(bbAngle)); var bbZ = round(fz + bbDist * sin(bbAngle)); group = new SimpleGroup( [new SimpleObject(oWood, 7,7, 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); } } // create islands log("Creating islands..."); placer = new ClumpPlacer(floor(hillSize*randFloat(0.8,1.2)), 0.80, 0.1, 10); terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [2] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clLand)], null, scaleByMapSize(2, 5)*randInt(8,14) ); paintTerrainBasedOnHeight(1, 3, 0, tShore); paintTerrainBasedOnHeight(-8, 1, 2, tWater); for (var i = 0; i < numPlayers; i++) { var fx = fractionToTiles(playerX[i]); var fz = fractionToTiles(playerZ[i]); var ix = round(fx); var iz = round(fz); // 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); } // 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), 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, 2, clHill, 15), stayClasses(clLand, 0)], scaleByMapSize(8, 25) ); // 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, 0, clForest, 10, clHill, 0), stayClasses(clLand, 4)], num ); } RMS.SetProgress(50); // create dirt patches log("Creating dirt patches..."); var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; var numb = 1; if (rt == 6) numb = 3 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), stayClasses(clLand, 4)], numb*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), stayClasses(clLand, 4)], numb*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, 0, clRock, 10, clHill, 1), stayClasses(clLand, 3)], 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, 0, clRock, 10, clHill, 1), stayClasses(clLand, 3)], 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, 0, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 3)], 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, 3)], 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, 3)], 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, 0, clHill, 1, clFood, 20), stayClasses(clLand, 2)], 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, 0, clHill, 1, clFood, 20), stayClasses(clLand, 2)], 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, 4, 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, 0, clMetal, 1, clRock, 1), stayClasses(clLand, 4)], 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, 3)], 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, 3)], 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, 3)], 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(); Index: ps/trunk/binaries/data/mods/public/maps/random/snowflake_searocks.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/snowflake_searocks.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/snowflake_searocks.js (revision 11754) @@ -1 +1 @@ -RMS.LoadLibrary("rmgen"); //random terrain textures var rt = randomizeBiome(); var tGrass = rBiomeT1(); var tGrassPForest = rBiomeT2(); var tGrassDForest = rBiomeT3(); var tCliff = rBiomeT4(); var tGrassA = rBiomeT5(); var tGrassB = rBiomeT6(); var tGrassC = rBiomeT7(); var tHill = rBiomeT1(); var tDirt = rBiomeT9(); var tRoad = rBiomeT10(); var tRoadWild = rBiomeT11(); var tGrassPatch = rBiomeT12(); var tShoreBlend = rBiomeT13(); var tShore = rBiomeT14(); var tWater = rBiomeT15(); // gaia entities var oOak = rBiomeE1(); var oOakLarge = rBiomeE2(); var oApple = rBiomeE3(); var oPine = rBiomeE4(); var oAleppoPine = rBiomeE5(); var oBerryBush = rBiomeE6(); var oChicken = rBiomeE7(); var oDeer = rBiomeE8(); var oFish = rBiomeE9(); var oSheep = rBiomeE10(); var oStoneLarge = rBiomeE11(); var oStoneSmall = rBiomeE12(); var oMetalLarge = rBiomeE13(); // decorative props var aGrass = rBiomeA1(); var aGrassShort = rBiomeA2(); var aReeds = rBiomeA3(); var aLillies = rBiomeA4(); var aRockLarge = rBiomeA5(); var aRockMedium = rBiomeA6(); var aBushMedium = rBiomeA7(); var aBushSmall = rBiomeA8(); 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 = -PI/4; // 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 = sortPlayers(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) 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) -1 && fillTowersBetween.indexOf(oldWall[j+1]) > -1) // ... > -1 means 'exists' here fortressTypes[newKey].wall.push('tower'); } } -////////////////////////////////////////////////////////////////// -// Define the abstract getWallAlignment and getWallCenter function -////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// Define some helper functions: getWallAlignment, getWallCenter, getWallLength +/////////////////////////////////////////////////////////////////////////////// // Get alignment of a wall // Returns a list of lists of most arguments needed to place the different wall elements for a given wall // Placing the first wall element at startX/startY placed with angle given by orientation // An alignement can be used to get the center of a 'wall' (more likely used for closed walls like fortresses) with the getWallCenter function function getWallAlignment(startX, startY, wall, style, orientation) { orientation = (orientation !== undefined) ? orientation : 0*PI; var alignment = [] var wallX = startX; var wallY = startY; for (var i = 0; i < wall.length; i++) { if (wallStyles[style][wall[i]] === undefined) warn('No valid wall element: ' + wall[i]); var element = wallStyles[style][wall[i]] // Indentation var placeX = wallX - element.indent * cos(orientation); var placeY = wallY - element.indent * sin(orientation); // Add element alignment alignment.push([placeX, placeY, element.entity, orientation + element.angle]); // Preset vars for the next wall element if (i+1 < wall.length) { orientation += element.bending; if (wallStyles[style][wall[i+1]] === undefined) warn('No valid wall element: ' + wall[i+1]); var nextElement = wallStyles[style][wall[i+1]]; var distance = (element.width + nextElement.width)/2; // Corrections for elements with indent AND bending if (element.bending !== 0 && element.indent !== 0) { // Indent correction to adjust distance distance += element.indent*sin(element.bending); // Indent correction to normalize indentation wallX += element.indent * cos(orientation); wallY += element.indent * sin(orientation); } // Set the next coordinates of the next element in the wall (meaning without indentation adjustment) wallX -= distance * sin(orientation); wallY += distance * cos(orientation); } } return alignment; } - -///////////////////////////////////////////////////////////////////////////// // Get the center of a wall (mainly usefull for closed walls like fortresses) -///////////////////////////////////////////////////////////////////////////// - // Center calculation works like getting the center of mass assuming all wall elements have the same 'waight' // It returns the vector (array [x, y]) from the first wall element to the center -// So if used to preset the center in an instance of the fortress class use the negative values (I think) function getWallCenter(alignment) { var x = 0; var y = 0; for (var i = 0; i < alignment.length; i++) { x += alignment[i][0]/alignment.length; y += alignment[i][1]/alignment.length; } var center = [x, y]; return center; } +// Get the length of a wall used by placeIrregularPolygonalWall +// NOTE: Does not support bending wall elements like corners! +function getWallLength(wall, style) +{ + var length = 0; + for (var i = 0; i < wall.length; i++) + { + length += wallStyles[style][wall[i]].width; + } + return length; +} + ///////////////////////////////////////////// // Define the different wall placer functions ///////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////// // Place simple wall starting with the first wall element placed at startX/startY ///////////////////////////////////////////////////////////////////////////////// - // orientation: 0 means 'outside' or 'front' of the wall is right (positive X) like placeObject -// It will then be build towards top (positive Y) if no bending wall elements like corners are used -// Raising orientation means the wall is rotated counter-clockwise like placeObject +// It will then be build towards top (positive Y) if no bending wall elements like corners are used +// Raising orientation means the wall is rotated counter-clockwise like placeObject function placeWall(startX, startY, wall, style, playerId, orientation) { var AM = getWallAlignment(startX, startY, wall, style, orientation); for (var iWall = 0; iWall < wall.length; iWall++) { if (AM[iWall][2] !== undefined) placeObject(AM[iWall][0], AM[iWall][1], AM[iWall][2], playerId, AM[iWall][3]); } } - ////////////////////////////////////////////////////////////////////////////////////////////////// // Place a fortress (mainly a closed wall build like placeWall) with the center at centerX/centerY ////////////////////////////////////////////////////////////////////////////////////////////////// - // Should always start with the main entrance (like 'entry' or 'gate') to get the orientation right (like placeObject) function placeCustomFortress(centerX, centerY, fortress, style, playerId, orientation, scipGetCenter) { if (!scipGetCenter) { var alignment = getWallAlignment(0, 0, fortress.wall, style); var center = getWallCenter(alignment); - var startX = centerX - center[0] * cos(orientation) - center[1] * sin(orientation); + var startX = centerX - center[0] * cos(orientation) + center[1] * sin(orientation); var startY = centerY - center[1] * cos(orientation) - center[0] * sin(orientation); } else { var startX = centerX + fortress.center[0]; var startY = centerY + fortress.center[1]; } placeWall(startX, startY, fortress.wall, style, playerId, orientation) } function placeFortress(centerX, centerY, type, style, playerId, orientation, scipGetCenter) { placeCustomFortress(centerX, centerY, fortressTypes[type], style, playerId, orientation, scipGetCenter); } - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Place a linear wall of repeatant wall elements given in the argument wallPart from startX/startY to targetX/targetY ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // startX: x coordinate of the beginning of the wall // startY: y coordinate of the beginning of the wall // targetX: x coordinate of the ending of the wall // targetY: y coordinate of the ending of the wall // NOTE: Start and target coordinates are exact (besides the scale offset) meaning the wall will begin/end at the given coordinates (not the first/last entity is placed there) // wallPart: Optional. An array of wall element type strings (see WallElement.type). Default is ['wall'] // NOTE: Don't use wall elements with bending like corners! // style: Optional. An wall style string (like defined in the 'wallStyles' dictionary). Default is 'palisades' // playerId: Optional. The walls owners player ID (like in the function 'placeObject' so 0 is gaia, 1 is the first player), Default is 0 (gaia) // endWithFirst: Optional. A boolean value. If true the 1st wall element in the wallPart array will finalize the wall. Default is true function placeLinearWall(startX, startY, targetX, targetY, wallPart, style, playerId, endWithFirst) { // Setup optional arguments to the default wallPart = (wallPart || ['wall']); style = (style || 'palisades'); playerId = (playerId || 0); - endWithFirst = (endWithFirst || true); + // endWithFirst = (endWithFirst || true); + endWithFirst = typeof endWithFirst == 'undefined' ? true : endWithFirst; + log("endWithFirst = " + endWithFirst); + // Check arguments + for (var elementIndex = 0; elementIndex < wallPart.length; elementIndex++) + if (wallStyles[style][wallPart[elementIndex]].bending != 0) + warn("Bending is not supported by placeLinearWall but a bending wall element is used: " + wallPart[elementIndex] + " -> wallStyles[style][wallPart[elementIndex]].entity"); // Setup number of wall parts var totalLength = getDistance(startX, startY, targetX, targetY); var wallPartLength = 0; for (var elementIndex = 0; elementIndex < wallPart.length; elementIndex++) wallPartLength += wallStyles[style][wallPart[elementIndex]].width; var numParts = 0; if (endWithFirst == true) numParts = ceil((totalLength - wallStyles[style][wallPart[0]].width) / wallPartLength) else numParts = ceil(totalLength / wallPartLength); // Setup scale factor var scaleFactor = 1; if (endWithFirst == true) scaleFactor = totalLength / (numParts * wallPartLength + wallStyles[style][wallPart[0]].width) else scaleFactor = totalLength / (numParts * wallPartLength); // Setup angle var wallAngle = getAngle(startX, startY, targetX, targetY); // NOTE: function 'getAngle()' is about to be changed... var placeAngle = wallAngle - PI/2; // Place wall entities var x = startX; var y = startY; for (var partIndex = 0; partIndex < numParts; partIndex++) { for (var elementIndex = 0; elementIndex < wallPart.length; elementIndex++) { var wallEle = wallStyles[style][wallPart[elementIndex]]; // Width correction x += scaleFactor * wallEle.width/2 * cos(wallAngle); y += scaleFactor * wallEle.width/2 * sin(wallAngle); // Indent correction var placeX = x - wallEle.indent * sin(wallAngle); var placeY = y + wallEle.indent * cos(wallAngle); // Placement if (wallEle.entity !== undefined) placeObject(placeX, placeY, wallEle.entity, playerId, placeAngle + wallEle.angle); x += scaleFactor * wallEle.width/2 * cos(wallAngle); y += scaleFactor * wallEle.width/2 * sin(wallAngle); } } if (endWithFirst == true) { var wallEle = wallStyles[style][wallPart[0]]; x += scaleFactor * wallEle.width/2 * cos(wallAngle); y += scaleFactor * wallEle.width/2 * sin(wallAngle); if (wallEle.entity !== undefined) placeObject(x, y, wallEle.entity, playerId, placeAngle + wallEle.angle); } } - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Place a circular wall of repeatant wall elements given in the argument wallPart arround centerX/centerY with the given radius //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // The wall is not necessarily closed depending on the optional argument maxAngle (better name?) // NOTE: Don't use wall elements with bending like corners! +// Todo: add eccentricity function placeCircularWall(centerX, centerY, radius, wallPart, style, playerId, orientation, maxAngle, endWithFirst, maxBendOff) { // Setup optional arguments to the default wallPart = (wallPart || ['wall']); style = (style || 'palisades'); playerId = (playerId || 0); orientation = (orientation || 0); maxAngle = (maxAngle || 2*PI); if (endWithFirst === undefined) { if (maxAngle >= 2*PI - 0.001) // Can this be done better? { endWithFirst = false; } else { endWithFirst = true; } } maxBendOff = (maxBendOff || 0); + // Check arguments if (maxBendOff > PI/2 || maxBendOff < 0) warn('placeCircularWall maxBendOff sould satisfy 0 < maxBendOff < PI/2 (~1.5) but it is: ' + maxBendOff); + for (var elementIndex = 0; elementIndex < wallPart.length; elementIndex++) + if (wallStyles[style][wallPart[elementIndex]].bending != 0) + warn("Bending is not supported by placeCircularWall but a bending wall element is used: " + wallPart[elementIndex]); // Setup number of wall parts var totalLength = maxAngle * radius; var wallPartLength = 0; for (var elementIndex = 0; elementIndex < wallPart.length; elementIndex++) wallPartLength += wallStyles[style][wallPart[elementIndex]].width; var numParts = 0; if (endWithFirst == true) { numParts = ceil((totalLength - wallStyles[style][wallPart[0]].width) / wallPartLength); } else { numParts = ceil(totalLength / wallPartLength); } // Setup scale factor var scaleFactor = 1; if (endWithFirst == true) scaleFactor = totalLength / (numParts * wallPartLength + wallStyles[style][wallPart[0]].width) else scaleFactor = totalLength / (numParts * wallPartLength); // Place wall entities var actualAngle = orientation + (2*PI - maxAngle) / 2; var x = centerX + radius*cos(actualAngle); var y = centerY + radius*sin(actualAngle); for (var partIndex = 0; partIndex < numParts; partIndex++) { for (var elementIndex = 0; elementIndex < wallPart.length; elementIndex++) { var wallEle = wallStyles[style][wallPart[elementIndex]]; // Width correction var addAngle = scaleFactor * wallEle.width / radius; var targetX = centerX + radius * cos(actualAngle + addAngle); var targetY = centerY + radius * sin(actualAngle + addAngle); var placeX = x + (targetX - x)/2; var placeY = y + (targetY - y)/2; var placeAngle = actualAngle + addAngle/2; // Indent correction placeX -= wallEle.indent * cos(placeAngle); placeY -= wallEle.indent * sin(placeAngle); // Placement if (wallEle.entity !== undefined) placeObject(placeX, placeY, wallEle.entity, playerId, placeAngle + wallEle.angle); // Prepare for the next wall element actualAngle += addAngle; x = centerX + radius*cos(actualAngle); y = centerY + radius*sin(actualAngle); } } if (endWithFirst == true) { var wallEle = wallStyles[style][wallPart[0]]; var addAngle = scaleFactor * wallEle.width / radius; var targetX = centerX + radius * cos(actualAngle + addAngle); var targetY = centerY + radius * sin(actualAngle + addAngle); var placeX = x + (targetX - x)/2; var placeY = y + (targetY - y)/2; var placeAngle = actualAngle + addAngle/2; placeObject(placeX, placeY, wallEle.entity, playerId, placeAngle + wallEle.angle); } } + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Place a polygonal wall of repeatant wall elements given in the argument wallPart arround centerX/centerY with the given radius +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NOTE: Don't use wall elements with bending like corners! +// TODO: Check some arguments +// TODO: Add eccentricity and irregularity (how far the corners can differ from a regulare convex poygon) +function placePolygonalWall(centerX, centerY, radius, wallPart, cornerWallElement, style, playerId, orientation, numCorners, skipFirstWall) +{ + // Setup optional arguments to the default + wallPart = (wallPart || ['wall']); + cornerWallElement = (cornerWallElement || 'tower'); // Don't use wide elements for this. Not supported well... + style = (style || 'palisades'); + playerId = (playerId || 0); + orientation = (orientation || 0); + numCorners = (numCorners || 8); + skipFirstWall = (skipFirstWall || false); + // Setup angles + var angleAdd = 2*PI/numCorners; + var angleStart = orientation - angleAdd/2; + // Setup corners + var corners = []; + for (var i = 0; i < numCorners; i++) + corners.push([centerX + radius*cos(angleStart + i*angleAdd), centerY + radius*sin(angleStart + i*angleAdd)]); + // Place Corners and walls + for (var i = 0; i < numCorners; i++) + { + var angleToCorner = getAngle(corners[i][0], corners[i][1], centerX, centerY); + placeObject(corners[i][0], corners[i][1], wallStyles[style][cornerWallElement].entity, playerId, angleToCorner); + if (!(skipFirstWall && i == 0)) + { + placeLinearWall( + // Adjustment to the corner element width (approximately) + corners[i][0] + wallStyles[style][cornerWallElement].width/2 * sin(angleToCorner + angleAdd/2), // startX + corners[i][1] - wallStyles[style][cornerWallElement].width/2 * cos(angleToCorner + angleAdd/2), // startY + corners[(i+1)%numCorners][0] - wallStyles[style][cornerWallElement].width/2 * sin(angleToCorner + angleAdd/2), // targetX + corners[(i+1)%numCorners][1] + wallStyles[style][cornerWallElement].width/2 * cos(angleToCorner + angleAdd/2), // targetY + wallPart, style, playerId); + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Place an irregular polygonal wall of some wall parts to choose from arround centerX/centerY with the given radius +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NOTE: Under construction!!! +// NOTE: wallPartList is put to the end because it's hardest to set +// NOTE: Don't use wall elements with bending like corners! +// TODO: Check some arguments +// TODO: Add eccentricity and irregularity (how far the corners can differ from a regulare convex poygon) +function placeIrregularPolygonalWall(centerX, centerY, radius, cornerWallElement, style, playerId, orientation, numCorners, irregularity, skipFirstWall, wallPartsAssortment) +{ + // Generating a generic wall part assortment with each wall part including 1 gate enlengthend by walls and towers + // NOTE: It might be a good idea to write an own function for that... + var defaultWallPartsAssortment = [['wallShort'], ['wall'], ['wallLong'], ['gate', 'tower', 'wallShort']]; + var centeredWallPart = ['gate']; // NOTE: Since gates are not functional yet entrys are used instead... + var extandingWallPartAssortment = [['tower', 'wallLong'], ['tower', 'wall']]; + defaultWallPartsAssortment.push(centeredWallPart) + for (var i = 0; i < extandingWallPartAssortment.length; i++) + { + var wallPart = centeredWallPart; + for (var j = 0; j < radius; j++) + { + if (j%2 == 0) + wallPart = wallPart.concat(extandingWallPartAssortment[i]); + else + { + extandingWallPartAssortment[i].reverse(); + wallPart = extandingWallPartAssortment[i].concat(wallPart); + extandingWallPartAssortment[i].reverse(); + } + defaultWallPartsAssortment.push(wallPart); + } + } + // Setup optional arguments to the default + wallPartsAssortment = (wallPartsAssortment || defaultWallPartsAssortment); + cornerWallElement = (cornerWallElement || 'tower'); // Don't use wide elements for this. Not supported well... + style = (style || 'palisades'); + playerId = (playerId || 0); + orientation = (orientation || 0); + numCorners = (numCorners || randInt(5, 7)); + irregularity = (irregularity || 0.5); + skipFirstWall = (skipFirstWall || false); + // Setup angles + var angleToCover = 2*PI; + var angleAddList = []; + for (var i = 0; i < numCorners; i++) + { + // Randomize covered angles. Variety scales down with raising angle though... + angleAddList.push(angleToCover/(numCorners-i) * (1 + randFloat(-irregularity, irregularity))); + angleToCover -= angleAddList[angleAddList.length - 1]; + } + // Setup corners + var corners = []; + var angleActual = orientation - angleAddList[0]/2; + for (var i = 0; i < numCorners; i++) + { + corners.push([centerX + radius*cos(angleActual), centerY + radius*sin(angleActual)]); + if (i < numCorners - 1) + angleActual += angleAddList[i+1] + } + // Setup best wall parts for the different walls (a bit confusing naming...) + var wallPartLengths = []; + var maxWallPartLength = 0; + for (var partIndex = 0; partIndex < wallPartsAssortment.length; partIndex++) + { + wallPartLengths.push(getWallLength(wallPartsAssortment[partIndex], style)); + log("wallPartLengths = " + wallPartLengths); + if (wallPartLengths[partIndex] > maxWallPartLength) + maxWallPartLength = wallPartLengths[partIndex]; + } + var wallPartList = []; // This is the list of the wall parts to use for the walls between the corners, not to confuse with wallPartsAssortment! + for (var i = 0; i < numCorners; i++) + { + var bestWallPart = []; // This is a simpel wall part not a wallPartsAssortment! + var bestWallLength = 99999999; + // NOTE: This is not exsactly like the length the wall will be in the end. Has to be tweeked... + var wallLength = getDistance(corners[i][0], corners[i][1], corners[(i+1)%numCorners][0], corners[(i+1)%numCorners][1]) + var numWallParts = ceil(wallLength/maxWallPartLength); + log("numWallParts = " + numWallParts); + log("wallLength = " + wallLength); + for (var partIndex = 0; partIndex < wallPartsAssortment.length; partIndex++) + { + if (numWallParts*wallPartLengths[partIndex] < bestWallLength && numWallParts*wallPartLengths[partIndex] > wallLength) + { + bestWallPart = wallPartsAssortment[partIndex]; + bestWallLength = numWallParts*wallPartLengths[partIndex]; + } + } + wallPartList.push(bestWallPart) + log("bestWallLength = " + bestWallLength); + log("bestWallPart = " + bestWallPart); + } + log("getWallLength(['wall', 'gate'], style) = " + getWallLength(['wall', 'gate'], style)); + log("wallPartList = " + wallPartList); + // Place Corners and walls + for (var i = 0; i < numCorners; i++) + { + log("wallPartList[" + i + "] = " + wallPartList[i]); + var angleToCorner = getAngle(corners[i][0], corners[i][1], centerX, centerY); + placeObject(corners[i][0], corners[i][1], wallStyles[style][cornerWallElement].entity, playerId, angleToCorner); + if (!(skipFirstWall && i == 0)) + { + placeLinearWall( + // Adjustment to the corner element width (approximately) + corners[i][0] + wallStyles[style][cornerWallElement].width/2 * sin(angleToCorner + angleAddList[i]/2), // startX + corners[i][1] - wallStyles[style][cornerWallElement].width/2 * cos(angleToCorner + angleAddList[i]/2), // startY + corners[(i+1)%numCorners][0] - wallStyles[style][cornerWallElement].width/2 * sin(angleToCorner + angleAddList[(i+1)%numCorners]/2), // targetX + corners[(i+1)%numCorners][1] + wallStyles[style][cornerWallElement].width/2 * cos(angleToCorner + angleAddList[(i+1)%numCorners]/2), // targetY + wallPartList[i], style, playerId, false); + } + } +} + +// Just a test function, USE WITH CARE! +// radius: A float seting the aproximate radius of the fortress +// maxBendOff: Optional, The maximum random bending offset of the wall elements NOTE: If maxBendOff > PI/2 the wall might never close!!! +// wallPart: Optional, An array of wall element string, example: ["tower", "wall"] NOTE: Don't use wall elements with bending!!! +function placeGenericFortress(centerX, centerY, radius, playerId, wallPart, style, maxBendOff) +{ + if (wallPart == undefined) + wallPart = ['tower', 'wall', 'tower', 'entry', 'tower', 'wall']; + if (maxBendOff > PI/2 || maxBendOff < 0) + warn("setGenericFortress maxBendOff sould satisfy 0 < maxBendOff < PI/2 (~1.5) but it is: " + maxBendOff); + if (maxBendOff === undefined) + maxBendOff = 0; + var wallLength = 0; + for (var eleIndex = 0; eleIndex < wallPart.length; eleIndex++) + { + wallLength += wallStyles[style][wallPart[eleIndex]].width + } + if (wallLength > 2*PI*radius || wallLength <= 0) + warn("setGenericFortress: sum of the width of wall's elements should satisfy 0 < total length < 2*PI*radius but: radius = " + radius + ", wallPart = " + wallPart + " with total length of " + wallLength); + + var minEleWidth = 1000000; // Assuming the smallest element is about as wide as deep. + for (var eleIndex = 0; eleIndex < wallPart.length; eleIndex++) + { + eleWidth = wallStyles[style][wallPart[eleIndex]].width; + if (eleWidth < minEleWidth) + minEleWidth = eleWidth; + } + var widthSafty = minEleWidth/4; // Can be done better... + + var x = radius; + var y = 0; + var angle = 0; + var targetX = radius; + var targetY = 0; + var targetReached = false; + var eleIndex = 0; + while (targetReached == false) + { + var wallElement = wallStyles[style][wallPart[eleIndex % wallPart.length]]; + var eleWidth = wallElement.width - widthSafty; + // Stabalized bendOff + var actualRadius = getDistance(centerX, centerY, centerX + x, centerY + y); + var bendOff = randFloat(-maxBendOff*radius/actualRadius, maxBendOff*actualRadius/radius); + // Element width in radians + var eleAngleWidth = eleWidth*cos(bendOff) / radius; // A/L = da/dl -> da = A * dl / L -> da = 2*PI * eleWidth / (2*PI * radius) -> da = eleWidth/radius + var eleAngle = angle + eleAngleWidth/2 + bendOff; + var placeX = x - eleWidth/2 * sin(eleAngle); + var placeY = y + eleWidth/2 * cos(eleAngle); + if (wallElement.entity) + placeObject(centerX + placeX, centerY + placeY, wallElement.entity, playerId, eleAngle + wallElement.angle); + x = placeX - eleWidth/2 * sin(eleAngle); + y = placeY + eleWidth/2 * cos(eleAngle); + angle += eleAngleWidth; + if (eleIndex % wallPart.length == 0 && eleIndex > wallPart.length && (getDistance(x, y, targetX, targetY) < wallLength || angle > 2*PI)) + targetReached = true; + eleIndex++; + // if (eleIndex == 10) + // break; + } + placeLinearWall(centerX + x, centerY + y, centerX + targetX, centerY + targetY, ['wall', 'tower'], style, playerId, true); +} Index: ps/trunk/binaries/data/mods/public/maps/random/rmgen/misc.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/rmgen/misc.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/rmgen/misc.js (revision 11754) @@ -1 +1 @@ -///////////////////////////////////////////////////////////////////////////////////////// // passageMaker // // Function for creating shallow water between two given points by changing the heiight of all tiles in // the path with height less than or equal to "maxheight" to "height" // // x1,z1: Starting point of path // x2,z2: Ending point of path // width: Width of the shallow // maxheight: Maximum height that it changes // height: Height of the shallow // smooth: smooth elevation in borders // tileclass: (Optianal) - Adds those tiles to the class given // terrain: (Optional) - Changes the texture of the elevated land // ///////////////////////////////////////////////////////////////////////////////////////// function passageMaker(x1, z1, x2, z2, width, maxheight, height, smooth, tileclass, terrain) { var mapSize = g_Map.size; for (var ix = 0; ix < mapSize; ix++) { for (var iz = 0; iz < mapSize; iz++) { var a = z1-z2; var b = x2-x1; var c = (z1*(x1-x2))-(x1*(z1-z2)); var dis = abs(a*ix + b*iz + c)/sqrt(a*a + b*b); var k = (a*ix + b*iz + c)/(a*a + b*b); var my = iz-(b*k); var inline = 0; if (b == 0) { if ((iz <= Math.max(z1,z2))&&(Math.min(z1,z2))) { inline = 1; } } else { if ((my <= Math.max(z1,z2))&&(my >= Math.min(z1,z2))) { inline = 1; } } if ((dis <= width)&&(inline)) { if(g_Map.getHeight(ix, iz) <= maxheight) { if (dis >= width - smooth) { g_Map.setHeight(ix, iz, ((width - dis)*(height)+(g_Map.getHeight(ix, iz))*(dis + smooth - width))/(smooth)/2); } else { g_Map.setHeight(ix, iz, height); } if (tileclass !== undefined) { addToClass(ix, iz, tileclass); } if (terrain !== undefined) { placeTerrain(ix, iz, terrain); } } } } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //rndRiver is a fuction that creates random values useful for making a jagged river. // //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 // // f: Input: Same as angle in a sine function // seed: Random Seed: Best to implement is to use randFloat() // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 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; } ///////////////////////////////////////////////////////////////////////////////////////// // createStartingPlayerEntities // // Creates the starting player entities // fx&fz: position of player base // playerid: id of player // civEntities: use getStartingEntities(id-1) fo this one // BUILDING_ANGlE: angle of main base building // /////////////////////////////////////////////////////////////////////////////////////////// function createStartingPlayerEntities(fx, fz, playerid, civEntities, BUILDING_ANGlE) { var uDist = 6; var uSpace = 2; placeObject(fx, fz, civEntities[0].Template, playerid, BUILDING_ANGlE); for (var j = 1; j < civEntities.length; ++j) { var uAngle = BUILDING_ANGlE - PI * (2-j) / 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, playerid, uAngle); } } } ///////////////////////////////////////////////////////////////////////////////////////// // paintTerrainBasedOnHeight // // paints the tiles which have a height between minheight and maxheight with the given terrain // minheight: minimum height of the tile // maxheight: maximum height of the tile // mode: accepts 4 values. 0 means the it will select tiles with height more than minheight and less than maxheight. // 1 means it selects tiles with height more than or equal to minheight and less than max height. 2 means more than // minheight and less than or equal to maxheight. 3 means more than or equal to minheight and less than or equal to maxheight // terrain: intended terrain texture // /////////////////////////////////////////////////////////////////////////////////////////// function paintTerrainBasedOnHeight(minheight, maxheight, mode, terrain) { var mSize = g_Map.size; for (var qx = 0; qx < mSize; qx++) { for (var qz = 0; qz < mSize; qz++) { if (mode == 0) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { placeTerrain(qx, qz, terrain); } } else if (mode == 1) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { placeTerrain(qx, qz, terrain); } } else if (mode == 2) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { placeTerrain(qx, qz, terrain); } } else if (mode == 3) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { placeTerrain(qx, qz, terrain); } } } } } ///////////////////////////////////////////////////////////////////////////////////////// // paintTileClassBasedOnHeight // // paints the tiles which have a height between minheight and maxheight with the given tile class // minheight: minimum height of the tile // maxheight: maximum height of the tile // mode: accepts 4 values. 0 means the it will select tiles with height more than minheight and less than maxheight. // 1 means it selects tiles with height more than or equal to minheight and less than max height. 2 means more than // minheight and less than or equal to maxheight. 3 means more than or equal to minheight and less than or equal to maxheight // tileclass: intended tile class // /////////////////////////////////////////////////////////////////////////////////////////// function paintTileClassBasedOnHeight(minheight, maxheight, mode, tileclass) { var mSize = g_Map.size; for (var qx = 0; qx < mSize; qx++) { for (var qz = 0; qz < mSize; qz++) { if (mode == 0) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { addToClass(qx, qz, tileclass); } } else if (mode == 1) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { addToClass(qx, qz, tileclass); } } else if (mode == 2) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { addToClass(qx, qz, tileclass); } } else if (mode == 3) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { addToClass(qx, qz, tileclass); } } } } } \ No newline at end of file +///////////////////////////////////////////////////////////////////////////////////////// // passageMaker // // Function for creating shallow water between two given points by changing the heiight of all tiles in // the path with height less than or equal to "maxheight" to "height" // // x1,z1: Starting point of path // x2,z2: Ending point of path // width: Width of the shallow // maxheight: Maximum height that it changes // height: Height of the shallow // smooth: smooth elevation in borders // tileclass: (Optianal) - Adds those tiles to the class given // terrain: (Optional) - Changes the texture of the elevated land // ///////////////////////////////////////////////////////////////////////////////////////// function passageMaker(x1, z1, x2, z2, width, maxheight, height, smooth, tileclass, terrain) { var mapSize = g_Map.size; for (var ix = 0; ix < mapSize; ix++) { for (var iz = 0; iz < mapSize; iz++) { var a = z1-z2; var b = x2-x1; var c = (z1*(x1-x2))-(x1*(z1-z2)); var dis = abs(a*ix + b*iz + c)/sqrt(a*a + b*b); var k = (a*ix + b*iz + c)/(a*a + b*b); var my = iz-(b*k); var inline = 0; if (b == 0) { if ((iz <= Math.max(z1,z2))&&(Math.min(z1,z2))) { inline = 1; } } else { if ((my <= Math.max(z1,z2))&&(my >= Math.min(z1,z2))) { inline = 1; } } if ((dis <= width)&&(inline)) { if(g_Map.getHeight(ix, iz) <= maxheight) { if (dis >= width - smooth) { g_Map.setHeight(ix, iz, ((width - dis)*(height)+(g_Map.getHeight(ix, iz))*(dis + smooth - width))/(smooth)/2); } else { g_Map.setHeight(ix, iz, height); } if (tileclass !== undefined) { addToClass(ix, iz, tileclass); } if (terrain !== undefined) { placeTerrain(ix, iz, terrain); } } } } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //rndRiver is a fuction that creates random values useful for making a jagged river. // //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 // // f: Input: Same as angle in a sine function // seed: Random Seed: Best to implement is to use randFloat() // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 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; } ///////////////////////////////////////////////////////////////////////////////////////// // createStartingPlayerEntities // // Creates the starting player entities // fx&fz: position of player base // playerid: id of player // civEntities: use getStartingEntities(id-1) fo this one // BUILDING_ANGlE: angle of main base building // /////////////////////////////////////////////////////////////////////////////////////////// function createStartingPlayerEntities(fx, fz, playerid, civEntities, BUILDING_ANGlE) { var uDist = 6; var uSpace = 2; placeObject(fx, fz, civEntities[0].Template, playerid, BUILDING_ANGlE); for (var j = 1; j < civEntities.length; ++j) { var uAngle = BUILDING_ANGlE - PI * (2-j) / 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, playerid, uAngle); } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // placeCivDefaultEntities // // Creates the default starting player entities depending on the players civ // fx&fy: position of player base // playerid: id of player // angle: angle of main base building, optional, default is BUILDING_ANGlE // kwargs: Takes some optional keyword arguments to tweek things // 'iberWall': may be false, 'walls' (default) or 'towers'. Determines the defensive structures Iberians get as civ bonus // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function placeCivDefaultEntities(fx, fz, playerid, angle, kwargs) { // Unpack kwargs kwargs = (kwargs || {}); var iberWall = 'walls'; if ('iberWall' in kwargs) iberWall = kwargs['iberWall']; // Place default civ starting entities var civ = g_MapSettings.PlayerData[playerid-1].Civ; var civEntities = getStartingEntities(playerid-1); var uDist = 6; var uSpace = 2; placeObject(fx, fz, civEntities[0].Template, playerid, angle); for (var j = 1; j < civEntities.length; ++j) { var uAngle = angle - PI * (2-j) / 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, playerid, uAngle); } } // Add defensive structiures for Iberians as their civ bonus if (civ == 'iber' && iberWall != false) { var iberWallRadius = 20; if (iberWall == 'towers') placePolygonalWall(fx, fz, 15, ['entry'], 'tower', civ, playerid, angle, 5); else { // Irregular polygonal Fortress // Documented while in test. Remove documentation when sufficient. // placeIrregularPolygonalWall(fx, fz, iberWallRadius/*radius*/, 'tower'/*corner wall element*/, civ, playerid, angle/*angle the first wall faces*/, randInt(5, 7)/*corners*/, 0.4/*irregularity (0 to 1)*/); // Generic 'organic' looking fortress placeGenericFortress(fx, fz, iberWallRadius/*radius*/, playerid, ['tower', 'wall', 'tower', 'gate', 'tower', 'wall'], civ, PI/6/*angle randomness (0-PI/4 reccommendet)*/) // Polygonal Fortress // placePolygonalWall(fx, fz, iberWallRadius, ['wall', 'tower', 'gate', 'tower'], 'tower', civ, playerid, angle, randInt(5, 7)); // A circular Fortress // placeCircularWall(fx, fz, iberWallRadius, ['tower', 'wallLong', 'tower', 'gate', 'tower', 'wall'], civ, playerid, angle, 2*PI); // A 'lego' fortress // placeFortress(fx, fz, 'iberCivBonus', civ, playerid, angle + randInt(4) * PI/2); } } } ///////////////////////////////////////////////////////////////////////////////////////// // paintTerrainBasedOnHeight // // paints the tiles which have a height between minheight and maxheight with the given terrain // minheight: minimum height of the tile // maxheight: maximum height of the tile // mode: accepts 4 values. 0 means the it will select tiles with height more than minheight and less than maxheight. // 1 means it selects tiles with height more than or equal to minheight and less than max height. 2 means more than // minheight and less than or equal to maxheight. 3 means more than or equal to minheight and less than or equal to maxheight // terrain: intended terrain texture // /////////////////////////////////////////////////////////////////////////////////////////// function paintTerrainBasedOnHeight(minheight, maxheight, mode, terrain) { var mSize = g_Map.size; for (var qx = 0; qx < mSize; qx++) { for (var qz = 0; qz < mSize; qz++) { if (mode == 0) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { placeTerrain(qx, qz, terrain); } } else if (mode == 1) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { placeTerrain(qx, qz, terrain); } } else if (mode == 2) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { placeTerrain(qx, qz, terrain); } } else if (mode == 3) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { placeTerrain(qx, qz, terrain); } } } } } ///////////////////////////////////////////////////////////////////////////////////////// // paintTileClassBasedOnHeight // // paints the tiles which have a height between minheight and maxheight with the given tile class // minheight: minimum height of the tile // maxheight: maximum height of the tile // mode: accepts 4 values. 0 means the it will select tiles with height more than minheight and less than maxheight. // 1 means it selects tiles with height more than or equal to minheight and less than max height. 2 means more than // minheight and less than or equal to maxheight. 3 means more than or equal to minheight and less than or equal to maxheight // tileclass: intended tile class // /////////////////////////////////////////////////////////////////////////////////////////// function paintTileClassBasedOnHeight(minheight, maxheight, mode, tileclass) { var mSize = g_Map.size; for (var qx = 0; qx < mSize; qx++) { for (var qz = 0; qz < mSize; qz++) { if (mode == 0) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { addToClass(qx, qz, tileclass); } } else if (mode == 1) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) < maxheight)) { addToClass(qx, qz, tileclass); } } else if (mode == 2) { if ((g_Map.getHeight(qx, qz) > minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { addToClass(qx, qz, tileclass); } } else if (mode == 3) { if ((g_Map.getHeight(qx, qz) >= minheight)&&(g_Map.getHeight(qx, qz) <= maxheight)) { addToClass(qx, qz, tileclass); } } } } } \ No newline at end of file Index: ps/trunk/binaries/data/mods/public/maps/random/cycladic_archipelago.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/cycladic_archipelago.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/cycladic_archipelago.js (revision 11754) @@ -1,586 +1,581 @@ 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 = -PI/4; // 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) - + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE, {'iberWall' : 'towers'}); 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/anatolian_plateau.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/anatolian_plateau.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/anatolian_plateau.js (revision 11754) @@ -1 +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 = -PI/4; // 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 = sortPlayers(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 starting units createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) // 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)); var 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 +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 = -PI/4; // 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 = sortPlayers(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); // create starting units placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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 (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/persian_highlands.js (revision 11754) @@ -1,421 +1,418 @@ 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 = -PI/4; 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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/islands.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/islands.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/islands.js (revision 11754) @@ -1,547 +1,544 @@ RMS.LoadLibrary("rmgen"); TILE_CENTERED_HEIGHT_MAP = true; //random terrain textures var rt = randomizeBiome(); var tGrass = rBiomeT1(); var tGrassPForest = rBiomeT2(); var tGrassDForest = rBiomeT3(); var tCliff = rBiomeT4(); var tGrassA = rBiomeT5(); var tGrassB = rBiomeT6(); var tGrassC = rBiomeT7(); var tHill = rBiomeT8(); var tDirt = rBiomeT9(); var tRoad = rBiomeT10(); var tRoadWild = rBiomeT11(); var tGrassPatch = rBiomeT12(); var tShoreBlend = rBiomeT13(); var tShore = rBiomeT14(); var tWater = rBiomeT15(); if (rt == 2) { tShore = "alpine_shore_rocks_icy"; tWater = "alpine_shore_rocks"; } // gaia entities var oOak = rBiomeE1(); var oOakLarge = rBiomeE2(); var oApple = rBiomeE3(); var oPine = rBiomeE4(); var oAleppoPine = rBiomeE5(); var oBerryBush = rBiomeE6(); var oChicken = rBiomeE7(); var oDeer = rBiomeE8(); var oFish = rBiomeE9(); var oSheep = rBiomeE10(); var oStoneLarge = rBiomeE11(); var oStoneSmall = rBiomeE12(); var oMetalLarge = rBiomeE13(); var oWood = "gaia/special_treasure_wood"; // decorative props var aGrass = rBiomeA1(); var aGrassShort = rBiomeA2(); var aReeds = rBiomeA3(); var aLillies = rBiomeA4(); var aRockLarge = rBiomeA5(); var aRockMedium = rBiomeA6(); var aBushMedium = rBiomeA7(); var aBushSmall = rBiomeA8(); 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 = -PI/4; // 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(); // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = sortPlayers(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(17,29); var shoreRadius = 4; var elevation = 3; var hillSize = PI * radius * radius; // 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); // create the hill var placer = new ClumpPlacer(hillSize, 0.80, 0.1, 10, ix, iz); var terrainPainter = new LayeredPainter( [tGrass , tGrass, tGrass], // terrains [1, shoreRadius] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, // type elevation, // elevation shoreRadius // blend radius ); createArea(placer, [terrainPainter, elevationPainter, paintClass(clPlayer)], null); - // get civ specific starting entities - var civEntities = getStartingEntities(id-1); - // create starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE, {'iberWall' : 'towers'}); // 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)); var 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 woods var bbAngle = randFloat(0, TWO_PI); var bbDist = 13; var bbX = round(fx + bbDist * cos(bbAngle)); var bbZ = round(fz + bbDist * sin(bbAngle)); group = new SimpleGroup( [new SimpleObject(oWood, 7,7, 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); } } // create islands log("Creating islands..."); placer = new ClumpPlacer(floor(hillSize*randFloat(0.5,2)), 0.80, 0.1, 0); terrainPainter = new LayeredPainter( [tGrass, tGrass], // terrains [2] // widths ); elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 3, 4); createAreas( placer, [terrainPainter, elevationPainter, paintClass(clLand)], avoidClasses(clLand, 3, clPlayer, 3), scaleByMapSize(2, 6)*randInt(8,14), 30 ); paintTerrainBasedOnHeight(1, 3, 0, tShore); paintTerrainBasedOnHeight(-8, 1, 2, tWater); for (var i = 0; i < numPlayers; i++) { var fx = fractionToTiles(playerX[i]); var fz = fractionToTiles(playerZ[i]); var ix = round(fx); var iz = round(fz); // 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); } // 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), 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, 2, clHill, 15), stayClasses(clLand, 0)], scaleByMapSize(8, 25) ); // 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, 0, clForest, 10, clHill, 0), stayClasses(clLand, 4)], num ); } RMS.SetProgress(50); // create dirt patches log("Creating dirt patches..."); var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]; var numb = 1; if (rt == 6) numb = 3 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), stayClasses(clLand, 4)], numb*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), stayClasses(clLand, 4)], numb*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, 0, clRock, 10, clHill, 1), stayClasses(clLand, 3)], 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, 0, clRock, 10, clHill, 1), stayClasses(clLand, 3)], 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, 0, clMetal, 10, clRock, 5, clHill, 1), stayClasses(clLand, 3)], 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, 3)], 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, 3)], 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, 0, clHill, 1, clFood, 20), stayClasses(clLand, 2)], 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, 0, clHill, 1, clFood, 20), stayClasses(clLand, 2)], 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, 4, 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, 0, clMetal, 1, clRock, 1), stayClasses(clLand, 4)], 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, 3)], 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, 3)], 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, 3)], 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(); Index: ps/trunk/binaries/data/mods/public/maps/random/deep_forest.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/deep_forest.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/deep_forest.js (revision 11754) @@ -1,258 +1,256 @@ RMS.LoadLibrary("rmgen"); // initialize map log("Initializing map..."); InitMap(); // Setup 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(); // Setup Templates var templateStone = "gaia/geology_stone_temperate" var templateStoneMine = "gaia/geology_stonemine_temperate_quarry"; var templateMetal = "gaia/geology_metal_temperate"; var templateMetalMine = "gaia/geology_metal_temperate_slabs"; var startingResourcees = ["gaia/flora_tree_oak_large", "gaia/flora_bush_temperate", templateStoneMine, "gaia/flora_bush_grapes", "gaia/flora_tree_apple", "gaia/flora_bush_berry", templateMetalMine, "gaia/flora_bush_badlands"]; // Setup terrain var terrainWood = ['temp_grass_mossy|gaia/flora_tree_oak', 'temp_forestfloor_pine|gaia/flora_tree_pine', 'temp_mud_plants|gaia/flora_tree_dead', 'temp_plants_bog|gaia/flora_tree_oak_large', 'temp_plants_bog|gaia/flora_tree_pine_animated', "temp_dirt_gravel_plants|gaia/flora_tree_aleppo_pine", 'temp_forestfloor_autumn|gaia/flora_tree_carob']; //'temp_forestfloor_autumn|gaia/flora_tree_fig' var terrainWoodBorder = ['temp_grass_plants|gaia/flora_tree_euro_beech', 'temp_grass_mossy|gaia/flora_tree_poplar', 'temp_grass_mossy|gaia/flora_tree_poplar_lombardy', 'temp_grass_long|gaia/flora_bush_temperate', 'temp_mud_plants|gaia/flora_bush_temperate', 'temp_mud_plants|gaia/flora_bush_badlands', 'temp_grass_long|gaia/flora_tree_apple', 'temp_grass_clovers|gaia/flora_bush_berry', 'temp_grass_clovers_2|gaia/flora_bush_grapes', 'temp_grass_plants|gaia/fauna_deer', "temp_grass_long_b|gaia/fauna_rabbit", "temp_grass_plants"]; var terrainBase = ['temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_dirt_gravel', 'temp_grass_b', 'temp_grass_b|gaia/fauna_pig', 'temp_dirt_gravel|gaia/fauna_chicken']; var terrainBaseBorder = ["temp_grass_b", "temp_grass_b", "temp_grass", "temp_grass_c", "temp_grass_mossy"]; var terrainPath = ['temp_road', "temp_road_overgrown", 'temp_grass_b']; var terrainHill = ["temp_highlands", "temp_highlands", "temp_highlands", "temp_dirt_gravel_b", "temp_cliff_a"]; var terrainHillBorder = ["temp_highlands", "temp_highlands", "temp_highlands", "temp_dirt_gravel_b", "temp_dirt_gravel_plants", "temp_highlands", "temp_highlands", "temp_highlands", "temp_dirt_gravel_b", "temp_dirt_gravel_plants", "temp_highlands", "temp_highlands", "temp_highlands", "temp_cliff_b", "temp_dirt_gravel_plants", "temp_highlands", "temp_highlands", "temp_highlands", "temp_cliff_b", "temp_dirt_gravel_plants", "temp_highlands|gaia/fauna_goat"]; // Setup map var mapSize = getMapSize(); var mapRadius = mapSize/2; var playableMapRadius = mapRadius - 5; var mapCenterX = mapRadius; var mapCenterZ = mapRadius; // Setup players and bases var numPlayers = getNumPlayers(); var baseRadius = 20; var minPlayerRadius = min(mapRadius-1.5*baseRadius, 5*mapRadius/8); var maxPlayerRadius = min(mapRadius-baseRadius, 3*mapRadius/4); -const BUILDING_ANlE = -PI/4; +const BUILDING_ANGlE = -PI/4; var playerStartLocX = new Array(numPlayers); var playerStartLocZ = new Array(numPlayers); var playerAngle = new Array(numPlayers); var playerAngleStart = randFloat(0, 2*PI); var playerAngleAddAvrg = 2*PI / numPlayers; var playerAngleMaxOff = playerAngleAddAvrg/4; // Setup eyecandy var templateEC = "other/unfinished_greek_temple"; var radiusEC = max(mapRadius/8, baseRadius/2); // Setup paths var pathSucsessRadius = baseRadius/2; var pathAngleOff = PI/2; var pathWidth = 5; // This is not really the path's sickness in tiles but the number of tiles in the clumbs of the path // Setup additional resources var resourceRadius = 2*mapRadius/3; // 3*mapRadius/8; var resourcePerPlayer = [templateStone, templateMetalMine]; // Setup woods var maxTreeDensity = min(256*256/mapSize/mapSize, 1); // Has to be tweeked but works ok var bushChance = 1/3; // 1 means 50% chance in deepest wood, 0.5 means 25% chance in deepest wood RMS.SetProgress(2); // Place bases for (var i=0; i < numPlayers; i++) { - var civ = g_MapSettings.PlayerData[i].Civ; - var startEntities = getStartingEntities(i); playerAngle[i] = (playerAngleStart + i*playerAngleAddAvrg + randFloat(0, playerAngleMaxOff))%(2*PI); var x = round(mapCenterX + randFloat(minPlayerRadius, maxPlayerRadius)*cos(playerAngle[i])); var z = round(mapCenterZ + randFloat(minPlayerRadius, maxPlayerRadius)*sin(playerAngle[i])); playerStartLocX[i] = x; playerStartLocZ[i] = z; // Place starting entities - createStartingPlayerEntities(x, z, i+1, startEntities, BUILDING_ANlE) + placeCivDefaultEntities(x, z, i+1, BUILDING_ANGlE); // Place base texture var placer = new ClumpPlacer(2*baseRadius*baseRadius, 2/3, 1/8, 10, x, z); var painter = [new LayeredPainter([terrainBaseBorder, terrainBase], [baseRadius/4]), paintClass(clPlayer)]; createArea(placer, painter); // Place starting resources var distToSL = 10; var resStartAngle = playerAngle[i] + PI; var resAddAngle = 2*PI / startingResourcees.length; for (var rIndex = 0; rIndex < startingResourcees.length; rIndex++) { var angleOff = randFloat(-resAddAngle/2, resAddAngle/2); var placeX = x + distToSL*cos(resStartAngle + rIndex*resAddAngle + angleOff); var placeZ = z + distToSL*sin(resStartAngle + rIndex*resAddAngle + angleOff); placeObject(placeX, placeZ, startingResourcees[rIndex], 0, randFloat(0, 2*PI)); addToClass(round(placeX), round(placeZ), clBaseResource); } } RMS.SetProgress(10); // Place paths var doublePaths = true; if (numPlayers > 4) doublePaths = false; var doublePathMayPlayers = 4; if (doublePaths == true) var maxI = numPlayers+1 else var maxI = numPlayers; for (var i = 0; i < maxI; i++) { if (doublePaths == true) var minJ = 0 else var minJ = i+1; for (var j = minJ; j < numPlayers+1; j++) { // Setup start and target coordinates if (i < numPlayers) { var x = playerStartLocX[i]; var z = playerStartLocZ[i]; } else { var x = mapCenterX; var z = mapCenterZ; }; if (j < numPlayers) { var targetX = playerStartLocX[j]; var targetZ = playerStartLocZ[j]; } else { var targetX = mapCenterX; var targetZ = mapCenterZ; }; // Prepare path placement var angle = getAngle(x, z, targetX, targetZ); x += round(pathSucsessRadius*cos(angle)); z += round(pathSucsessRadius*sin(angle)); var targetReached = false; var tries = 0; // Placing paths while (targetReached == false && tries < 2*mapSize) { var placer = new ClumpPlacer(pathWidth, 1, 1, 1, x, z); var painter = [new TerrainPainter(terrainPath), new ElevationPainter(-randFloat()), paintClass(clPath)]; createArea(placer, painter, avoidClasses(clHill, 0, clBaseResource, 4)); // addToClass(x, z, clPath); // Not needed... // Set vars for next loop angle = getAngle(x, z, targetX, targetZ); if (doublePaths == true) // Bended paths { x += round(cos(angle + randFloat(-pathAngleOff/2, 3*pathAngleOff/2))); z += round(sin(angle + randFloat(-pathAngleOff/2, 3*pathAngleOff/2))); } else // Straight paths { x += round(cos(angle + randFloat(-pathAngleOff, pathAngleOff))); z += round(sin(angle + randFloat(-pathAngleOff, pathAngleOff))); } if (getDistance(x, z, targetX, targetZ) < pathSucsessRadius) targetReached = true; tries++; } } } RMS.SetProgress(50); // Place expansion resources for (var i=0; i < numPlayers; i++) { for (var rIndex = 0; rIndex < resourcePerPlayer.length; rIndex++) { if (numPlayers > 1) var angleDist = (playerAngle[(i+1)%numPlayers] - playerAngle[i] + 2*PI)%(2*PI); else var angleDist = 2*PI; var placeX = round(mapCenterX + resourceRadius*cos(playerAngle[i] + (rIndex+1)*angleDist/(resourcePerPlayer.length+1))); var placeZ = round(mapCenterX + resourceRadius*sin(playerAngle[i] + (rIndex+1)*angleDist/(resourcePerPlayer.length+1))); placeObject(placeX, placeZ, resourcePerPlayer[rIndex], 0, randFloat(0, 2*PI)); var placer = new ClumpPlacer(40, 1/2, 1/8, 1, placeX, placeZ); var painter = [new LayeredPainter([terrainHillBorder, terrainHill], [1]), new ElevationPainter(1+randFloat()), paintClass(clHill)]; createArea(placer, painter); } } RMS.SetProgress(60); // Place eyecandy placeObject(mapCenterX, mapCenterZ, templateEC, 0, randFloat(0, 2*PI)); var placer = new ClumpPlacer(radiusEC*radiusEC, 1/2, 1/8, 1, mapCenterX, mapCenterZ); var painter = [new LayeredPainter([terrainHillBorder, terrainHill], [radiusEC/4]), new ElevationPainter(1+randFloat()), paintClass(clHill)]; createArea(placer, painter); // Woods and general hight map for (var x = 0; x < mapSize; x++) { for (var z = 0;z < mapSize;z++) { // Some variables var radius = Math.pow(Math.pow(mapCenterX - x, 2) + Math.pow(mapCenterZ - z, 2), 1/2); var minDistToSL = mapSize; for (var i=0; i < numPlayers; i++) minDistToSL = min(minDistToSL, getDistance(playerStartLocX[i], playerStartLocZ[i], x, z)) // Woods tile based var tDensFactSL = max(min((minDistToSL - baseRadius) / baseRadius, 1), 0); var tDensFactRad = abs((resourceRadius - radius) / resourceRadius); var tDensFactEC = max(min((radius - radiusEC) / radiusEC, 1), 0); var tDensActual = maxTreeDensity * tDensFactSL * tDensFactRad * tDensFactEC; if (randFloat() < tDensActual && radius < playableMapRadius) { if (tDensActual < bushChance*randFloat()*maxTreeDensity) { var placer = new ClumpPlacer(1, 1.0, 1.0, 1, x, z); var painter = [new TerrainPainter(terrainWoodBorder), new ElevationPainter(randFloat()), paintClass(clForest)]; createArea(placer, painter, avoidClasses(clPath, 1, clHill, 0)); } else { var placer = new ClumpPlacer(1, 1.0, 1.0, 1, x, z); var painter = [new TerrainPainter(terrainWood), new ElevationPainter(randFloat()), paintClass(clForest)]; createArea(placer, painter, avoidClasses(clPath, 2, clHill, 1)); } } // General hight map var hVarMiddleHill = mapSize/64 * (1+cos(3*PI/2 * radius/mapRadius)); var hVarHills = 5*(1+sin(x/10)*sin(z/10)); setHeight(x, z, getHeight(x, z) + hVarMiddleHill + hVarHills + 1); } } RMS.SetProgress(95); // Export map data ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/lake.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/lake.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/lake.js (revision 11754) @@ -1,524 +1,521 @@ RMS.LoadLibrary("rmgen"); //random terrain textures var rt = randomizeBiome(); var tGrass = rBiomeT1(); var tGrassPForest = rBiomeT2(); var tGrassDForest = rBiomeT3(); var tCliff = rBiomeT4(); var tGrassA = rBiomeT5(); var tGrassB = rBiomeT6(); var tGrassC = rBiomeT7(); var tHill = rBiomeT8(); var tDirt = rBiomeT9(); var tRoad = rBiomeT10(); var tRoadWild = rBiomeT11(); var tGrassPatch = rBiomeT12(); var tShoreBlend = rBiomeT13(); var tShore = rBiomeT14(); var tWater = rBiomeT15(); // gaia entities var oOak = rBiomeE1(); var oOakLarge = rBiomeE2(); var oApple = rBiomeE3(); var oPine = rBiomeE4(); var oAleppoPine = rBiomeE5(); var oBerryBush = rBiomeE6(); var oChicken = rBiomeE7(); var oDeer = rBiomeE8(); var oFish = rBiomeE9(); var oSheep = rBiomeE10(); var oStoneLarge = rBiomeE11(); var oStoneSmall = rBiomeE12(); var oMetalLarge = rBiomeE13(); // decorative props var aGrass = rBiomeA1(); var aGrassShort = rBiomeA2(); var aReeds = rBiomeA3(); var aLillies = rBiomeA4(); var aRockLarge = rBiomeA5(); var aRockMedium = rBiomeA6(); var aBushMedium = rBiomeA7(); var aBushSmall = rBiomeA8(); 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 = -PI/4; // 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); // 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)); var 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/ardennes_forest.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/ardennes_forest.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/ardennes_forest.js (revision 11754) @@ -1,672 +1,669 @@ /* * Map : Ardennes Forest * Author : Michael Mayfield * Version : 1.2 * * CHANGES: * * 1.2: - Improved hill generation * - Changed name from Black Forest to Ardennes Forest * * 1.1: - Reduces amount and jaggedness of cliffs * - Improved forest generation - some clumps join together * - Increased distance between minerals / stones and hills * - Reduce noise around players bases * * 1.0: - Initial release * */ RMS.LoadLibrary("rmgen"); const BUILDING_ANGlE = -PI/4; // initialize map log("Initializing map..."); InitMap(); var numPlayers = getNumPlayers(); var mapSize = getMapSize(); const tGrass = ["new_alpine_grass_b", "new_alpine_grass_c", "new_alpine_grass_d"]; const tPineForestFloor = "temp_forestfloor_pine"; const tForestFloor = [tPineForestFloor, tPineForestFloor, "alpine_dirt_grass_50"]; const tCliff = ["alpine_cliff_c", "alpine_cliff_c", "alpine_grass_rocky"]; const tCity = ["new_alpine_citytile", "new_alpine_grass_dirt_a"]; const tGrassPatch = ["alpine_grass_a", "alpine_grass_b"]; const oBoar = "gaia/fauna_boar"; const oDeer = "gaia/fauna_deer"; const oBear = "gaia/fauna_bear"; const oPig = "gaia/fauna_pig"; const oBerryBush = "gaia/flora_bush_berry"; const oMetalSmall = "gaia/geology_metal_alpine"; const oMetalLarge = "gaia/geology_metal_temperate_slabs"; const oStoneSmall = "gaia/geology_stone_alpine_a"; const oStoneLarge = "gaia/geology_stonemine_temperate_quarry"; const oOak = "gaia/flora_tree_oak"; const oOakLarge = "gaia/flora_tree_oak_large"; const oPine = "gaia/flora_tree_pine"; const oAleppoPine = "gaia/flora_tree_aleppo_pine"; const aTreeA = "actor|flora/trees/oak.xml"; const aTreeB = "actor|flora/trees/oak_large.xml"; const aTreeC = "actor|flora/trees/pine.xml"; const aTreeD = "actor|flora/trees/aleppo_pine.xml"; const aTrees = [aTreeA, aTreeB, aTreeC, aTreeD]; const aGrassLarge = "actor|props/flora/grass_soft_large.xml"; const aWoodLarge = "actor|props/special/eyecandy/wood_pile_1_b.xml"; const aWoodA = "actor|props/special/eyecandy/wood_sm_pile_a.xml"; const aWoodB = "actor|props/special/eyecandy/wood_sm_pile_b.xml"; const aBarrel = "actor|props/special/eyecandy/barrel_a.xml"; const aWheel = "actor|props/special/eyecandy/wheel_laying.xml"; const aCeltHomestead = "actor|structures/celts/homestead.xml"; const aCeltHouse = "actor|structures/celts/house.xml"; const aCeltLongHouse = "actor|structures/celts/longhouse.xml"; var pForest = [ tPineForestFloor+TERRAIN_SEPARATOR+oOak, tForestFloor, tPineForestFloor+TERRAIN_SEPARATOR+oPine, tForestFloor, tPineForestFloor+TERRAIN_SEPARATOR+oAleppoPine, tForestFloor, tForestFloor ]; // create tile classes var clPlayer = createTileClass(); var clPath = createTileClass(); var clHill = createTileClass(); var clForest = createTileClass(); var clForestJoin = createTileClass(); var clWater = createTileClass(); var clRock = createTileClass(); var clMetal = createTileClass(); var clFood = createTileClass(); var clBaseResource = createTileClass(); var clPlayable = createTileClass(); var clHillDeco = createTileClass(); // Create central dip var centerX = fractionToTiles(0.5); var centerZ = fractionToTiles(0.5); var placer = new ClumpPlacer(scaleByMapSize(mapSize * 70, mapSize * 300), 0.94, 0.05, 0.1, centerX, centerZ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, 30, 3 ); var painter = new LayeredPainter( [tCliff, tGrass], // terrains [3] // widths ); createArea(placer, [painter, elevationPainter], null); RMS.SetProgress(5); // Find all hills var noise0 = new Noise2D(20); for (var ix = 0; ix < mapSize; ix++) { for (var iz = 0; iz < mapSize; iz++) { var h = getHeight(ix,iz); if(h > 40){ addToClass(ix,iz,clHill); // Add hill noise var x = ix / (mapSize + 1.0); var z = iz / (mapSize + 1.0); var n = (noise0.get(x,z) - 0.5) * 40; setHeight(ix, iz, h + n); } } } // randomize player order var playerIDs = []; for (var i = 0; i < numPlayers; i++) { playerIDs.push(i+1); } playerIDs = sortPlayers(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.3*cos(playerAngle[i]); playerZ[i] = 0.5 + 0.3*sin(playerAngle[i]); } function distanceToPlayers(x, z) { var r = 10000; for (var i = 0; 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; } } RMS.SetProgress(10); 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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE); var citySize = 250 var placer = new ClumpPlacer(citySize, 0.95, 0.3, 0.1, ix, iz); createArea(placer, [paintClass(clPlayer)], null); // Create the city patch var placer = new ClumpPlacer(citySize * 0.4, 0.6, 0.05, 10, ix, iz); var painter = new TerrainPainter([tCity]); createArea(placer, painter, null); // Create starter 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)); var group = new SimpleGroup( [new SimpleObject(oPig, 5,5, 0,3)], true, clBaseResource, aX, aZ ); createObjectGroup(group, 0); } // Create starter 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, 3,3, 0,3)], true, clBaseResource, bbX, bbZ ); createObjectGroup(group, 0); // Create starter metal mine var mAngle = bbAngle; while(abs(mAngle - bbAngle) < PI/3) { mAngle = randFloat(0, TWO_PI); } var mDist = bbDist + 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 starter 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 starter straggler trees var num = scaleByMapSize(3, 4) for (var j = 0; j < num; j++) { var tAngle = randFloat(0, TWO_PI); var tDist = randFloat(6, bbDist + 5); 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)); } } RMS.SetProgress(30); log("Creating hills..."); var sizes = [scaleByMapSize(50, 800), scaleByMapSize(50, 400), scaleByMapSize(10, 30), scaleByMapSize(10, 30)]; for (var i = 0; i < sizes.length; i++) { var placer = new ClumpPlacer(sizes[i], 0.1, 0.2, 0.1); var painter = new LayeredPainter( [tCliff, [tForestFloor, tForestFloor, tCliff]], // terrains [2] // widths ); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, 50, sizes[i] < 50 ? 2 : 4 ); var mountains = createAreas( placer, [painter, paintClass(clHill), elevationPainter], avoidClasses(clPlayer, 8, clBaseResource, 2, clHill, 5), scaleByMapSize(1, 4) ); if(sizes[i] > 100 && mountains.length > 0) { var placer = new ClumpPlacer(sizes[i] * 0.3, 0.94, 0.05, 0.1); var elevationPainter = new SmoothElevationPainter( ELEVATION_MODIFY, 10, 3 ); var painter = new LayeredPainter( [tCliff, tForestFloor], // terrains [2] // widths ); createAreasInAreas( placer, [painter, elevationPainter], stayClasses(clHill, 4), mountains.length * 2, 20, mountains ); } var placer = new ClumpPlacer(sizes[i], 0.1, 0.2, 0.1); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, 10, 2 ); var ravine = createAreas( placer, [painter, paintClass(clHill), elevationPainter], avoidClasses(clPlayer, 6, clBaseResource, 2, clHill, 5), scaleByMapSize(1, 3) ); if(sizes[i] > 150 && ravine.length > 0) { // Place huts in ravines var group = new RandomGroup( [ new SimpleObject(aCeltHouse, 0,1, 4,5), new SimpleObject(aCeltLongHouse, 1,1, 4,5) ], true, clHillDeco); createObjectGroupsByAreas( group, 0, [avoidClasses(clHillDeco, 3), stayClasses(clHill, 3)], ravine.length * 5, 20, ravine ); var group = new RandomGroup( [ new SimpleObject(aCeltHomestead, 1,1, 1,1) ], true, clHillDeco); createObjectGroupsByAreas( group, 0, [avoidClasses(clHillDeco, 5), stayClasses(clHill, 4)], ravine.length * 2, 100, ravine ); // Place noise var placer = new ClumpPlacer(sizes[i] * 0.3, 0.94, 0.05, 0.1); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, 2, 2 ); var painter = new LayeredPainter( [tCliff, tForestFloor], // terrains [2] // widths ); createAreasInAreas( placer, [painter, elevationPainter], [avoidClasses(clHillDeco, 2), stayClasses(clHill, 0)], ravine.length * 2, 20, ravine ); var placer = new ClumpPlacer(sizes[i] * 0.1, 0.3, 0.05, 0.1); var elevationPainter = new SmoothElevationPainter( ELEVATION_SET, 40, 2 ); var painter = new LayeredPainter( [tCliff, tForestFloor], // terrains [2] // widths ); createAreasInAreas( placer, [painter, paintClass(clHill), elevationPainter], [avoidClasses(clHillDeco, 2), borderClasses(clHill, 15, 1)], ravine.length * 2, 50, ravine ); } RMS.SetProgress(30 + (20 * (i / sizes.length))); } RMS.SetProgress(50); var explorableArea = {}; explorableArea.points = []; var playerClass = getTileClass(clPlayer); var hillDecoClass = getTileClass(clHillDeco); for (var ix = 0; ix < mapSize; ix++) { for (var iz = 0; iz < mapSize; iz++) { var h = getHeight(ix,iz); if(h > 15 && h < 45 && playerClass.countMembersInRadius(ix, iz, 1) == 0) { // explorable area var pt = {}; pt.x = ix; pt.z = iz; explorableArea.points.push(pt); } if(h > 35) { var rnd = randFloat(); if(g_Map.validT(ix, iz) && rnd < 0.1) { var i = randInt(aTrees.length); placeObject(ix+randFloat(), iz+randFloat(), aTrees[i], 0, randFloat(0, TWO_PI)); } } else if(h < 15 && hillDecoClass.countMembersInRadius(ix, iz, 1) == 0) { var rnd = randFloat(); if(g_Map.validT(ix, iz) && rnd < 0.05) { var i = randInt(aTrees.length); placeObject(ix+randFloat(), iz+randFloat(), aTrees[i], 0, randFloat(0, TWO_PI)); } } } } RMS.SetProgress(55); // Add some general noise - after placing height dependant trees for (var ix = 0; ix < mapSize; ix++) { var x = ix / (mapSize + 1.0); for (var iz = 0; iz < mapSize; iz++) { var z = iz / (mapSize + 1.0); var h = getHeight(ix,iz); var pn = playerNearness(x,z); var n = (noise0.get(x,z) - 0.5) * 10; setHeight(ix, iz, h + (n * pn)); } } RMS.SetProgress(60); // Calculate desired number of trees for map (based on size) const MIN_TREES = 400; const MAX_TREES = 6000; const P_FOREST = 0.8; const P_FOREST_JOIN = 0.25; var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); var numForest = totalTrees * P_FOREST * (1.0 - P_FOREST_JOIN); var numForestJoin = totalTrees * P_FOREST * P_FOREST_JOIN; var numStragglers = totalTrees * (1.0 - P_FOREST); // create forests log("Creating forests..."); var num = numForest / (scaleByMapSize(6,16) * numPlayers); placer = new ClumpPlacer(numForest / num, 0.1, 0.1, 1); painter = new TerrainPainter(pForest); createAreasInAreas( placer, [painter, paintClass(clForest)], avoidClasses(clPlayer, 5, clBaseResource, 4, clForest, 6, clHill, 4), num, 100, [explorableArea] ); var num = numForestJoin / (scaleByMapSize(4,6) * numPlayers); placer = new ClumpPlacer(numForestJoin / num, 0.1, 0.1, 1); painter = new TerrainPainter(pForest); createAreasInAreas( placer, [painter, paintClass(clForest), paintClass(clForestJoin)], [avoidClasses(clPlayer, 5, clBaseResource, 4, clForestJoin, 5, clHill, 4), borderClasses(clForest, 1, 4)], num, 100, [explorableArea] ); RMS.SetProgress(70); // 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,tGrassPatch],[tGrassPatch,tGrass], [tGrass,tGrassPatch]], // terrains [1,1] // widths ); createAreas( placer, painter, avoidClasses(clForest, 0, clHill, 2, clPlayer, 5), scaleByMapSize(15, 45) ); } // create chopped forest patches log("Creating chopped forest patches..."); var sizes = [scaleByMapSize(20, 120)]; for (var i = 0; i < sizes.length; i++) { placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5); painter = new TerrainPainter(tForestFloor); createAreas( placer, painter, avoidClasses(clForest, 0, clHill, 2, clPlayer, 5), scaleByMapSize(4, 12) ); } RMS.SetProgress(75); log("Creating stone mines..."); // create stone quarries var group = new SimpleGroup([new SimpleObject(oStoneSmall, 1,2, 0,4), new SimpleObject(oStoneLarge, 0,1, 0,4)], true, clRock); createObjectGroupsByAreas(group, 0, [avoidClasses(clHill, 4, clForest, 2, clPlayer, 20, clRock, 10)], scaleByMapSize(6,20), 100, [explorableArea] ); // create small stone quarries group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); createObjectGroupsByAreas(group, 0, [avoidClasses(clHill, 4, clForest, 2, clPlayer, 20, clRock, 10)], scaleByMapSize(6,20), 100, [explorableArea] ); log("Creating metal mines..."); // create metal quarries group = new SimpleGroup([new SimpleObject(oMetalSmall, 1,2, 0,4), new SimpleObject(oMetalLarge, 0,1, 0,4)], true, clMetal); createObjectGroupsByAreas(group, 0, [avoidClasses(clHill, 4, clForest, 2, clPlayer, 20, clMetal, 10, clRock, 5)], scaleByMapSize(6,20), 100, [explorableArea] ); RMS.SetProgress(80); // create wildlife log("Creating wildlife..."); group = new SimpleGroup( [new SimpleObject(oDeer, 5,7, 0,4)], true, clFood ); createObjectGroupsByAreas(group, 0, avoidClasses(clHill, 2, clForest, 0, clPlayer, 0, clBaseResource, 20), 3 * numPlayers, 100, [explorableArea] ); group = new SimpleGroup( [new SimpleObject(oBoar, 2,3, 0,5)], true, clFood ); createObjectGroupsByAreas(group, 0, avoidClasses(clHill, 2, clForest, 0, clPlayer, 0, clBaseResource, 15), numPlayers, 50, [explorableArea] ); group = new SimpleGroup( [new SimpleObject(oBear, 1,1, 0,4)], false, clFood ); createObjectGroupsByAreas(group, 0, avoidClasses(clHill, 2, clForest, 0, clPlayer, 20), scaleByMapSize(3, 12), 200, [explorableArea] ); RMS.SetProgress(85); log("Creating decorative props..."); group = new SimpleGroup( [ new SimpleObject(aWoodA, 1,2, 0,1), new SimpleObject(aWoodB, 1,3, 0,1), new SimpleObject(aWheel, 0,2, 0,1), new SimpleObject(aWoodLarge, 0,1, 0,1), new SimpleObject(aBarrel, 0,2, 0,1) ], true ); createObjectGroupsByAreas( group, 0, avoidClasses(clForest, 0), scaleByMapSize(5, 50), 50, [explorableArea] ); RMS.SetProgress(90); // create straggler trees log("Creating straggler trees..."); var types = [oOak, oOakLarge, oPine, 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 ); createObjectGroupsByAreas(group, 0, avoidClasses(clForest, 4, clHill, 5, clPlayer, 10, clBaseResource, 2, clMetal, 5, clRock, 5), num, 20, [explorableArea] ); } RMS.SetProgress(95); // create grass tufts log("Creating grass tufts..."); group = new SimpleGroup( [new SimpleObject(aGrassLarge, 1,2, 0,1, -PI/8,PI/8)] ); createObjectGroupsByAreas(group, 0, avoidClasses(clHill, 2, clPlayer, 2), scaleByMapSize(50, 300), 20, [explorableArea] ); setTerrainAmbientColour(0.44,0.51,0.56); setUnitsAmbientColour(0.44,0.51,0.56); // Export map data ExportMap(); Index: ps/trunk/binaries/data/mods/public/maps/random/cantabrian_highlands.js =================================================================== --- ps/trunk/binaries/data/mods/public/maps/random/cantabrian_highlands.js (revision 11753) +++ ps/trunk/binaries/data/mods/public/maps/random/cantabrian_highlands.js (revision 11754) @@ -1,521 +1,518 @@ 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 = -PI/4; // 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 = sortPlayers(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 starting units - createStartingPlayerEntities(fx, fz, id, civEntities, BUILDING_ANGlE) + placeCivDefaultEntities(fx, fz, id, BUILDING_ANGlE, {'iberWall' : 'towers'}); // 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)); var 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.1); 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();