Index: binaries/data/mods/public/maps/random/plague_swamp.js =================================================================== --- binaries/data/mods/public/maps/random/plague_swamp.js +++ binaries/data/mods/public/maps/random/plague_swamp.js @@ -0,0 +1,451 @@ +RMS.LoadLibrary("rmgen"); + +const tGrass = ["tropic_swamp_a", "tropic_grass_c", "tropic_grass_plants"]; +const tForestFloor = "temp_plants_bog"; +const tForestFloor2 = "tropic_swamp_a"; +const tGrassA = "temp_grass_plants"; +const tGrassB = "temp_plants_bog"; +const tMud = ["temp_mud_a", "tropic_mud_a", "tropic_swamp_a"]; +const tRoad = "temp_road"; +const tRoadWild = "temp_road_overgrown"; +const tShoreBlend = "tropic_grass_plants"; +const tShore = "temp_plants_bog"; +const tWater = "tropic_swamp_a"; + +const oTree1 = "gaia/flora_tree_dead"; +const oTree2 = "gaia/flora_tree_toona"; +const oBush = "gaia/flora_bush_badlands"; +const oCrocodile = "gaia/fauna_crocodile"; +const oDeer = "gaia/fauna_deer"; +const oRabbit = "gaia/fauna_rabbit"; +const oStoneLarge = "gaia/geology_stonemine_temperate_quarry"; +const oStoneSmall = "gaia/geology_stone_temperate"; +const oMetalLarge = "gaia/geology_metal_temperate_slabs"; + +const aGrass = "actor|props/flora/grass_soft_small_tall.xml"; +const aGrassShort = "actor|props/flora/grass_soft_large.xml"; +const aRockLarge = "actor|geology/stone_granite_med.xml"; +const aRockMedium = "actor|geology/stone_granite_med.xml"; +const aReeds = "actor|props/flora/reeds_pond_lush_a.xml"; +const aLillies = "actor|props/flora/water_lillies.xml"; +const aBushMedium = "actor|props/flora/bush_tropic_a.xml"; +const aBushSmall = "actor|props/flora/bush_tropic_b.xml"; +const aPlant = "actor|props/flora/plant_tropic_large.xml"; +const aSwarm = "actor|particle/destruction_dust_small_gray.xml"; +const aRain = "actor|particle/rain_shower.xml"; + +const pForest1 = [tForestFloor + TERRAIN_SEPARATOR + oTree1, tForestFloor]; +const pForest2 = [tForestFloor2 + TERRAIN_SEPARATOR + oTree1, tForestFloor2 + TERRAIN_SEPARATOR + oTree2, tForestFloor2]; + +log("Initializing map..."); + +InitMap(); + +const numPlayers = getNumPlayers(); +const mapSize = getMapSize(); + +// 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 clRain = 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); + + // 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); + + + // create metal mine + var bbAngle = randFloat(0, TWO_PI); + 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 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(oDeer, 4,4, 0,2)], + true, clBaseResource, aX, aZ + ); + createObjectGroup(group, 0); + } + + // create starting trees + var num = floor(hillSize / 100); + var tAngle = randFloat(-PI/3, 4*PI/3); + var tDist = 12; + var tX = round(fx + tDist * cos(tAngle)); + var tZ = round(fz + tDist * sin(tAngle)); + group = new SimpleGroup( + [new SimpleObject(oTree2, num, num, 0,5)], + false, clBaseResource, tX, tZ + ); + createObjectGroup(group, 0, avoidClasses(clBaseResource,2)); + + placeDefaultDecoratives(fx, fz, aGrassShort, clBaseResource, radius); +} + +RMS.SetProgress(15); + +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) +); + +log("Creating marshes..."); +for (var i = 0; i < 7; i++) +{ + placer = new ChainPlacer(1, floor(scaleByMapSize(20, 30)), floor(scaleByMapSize(35, 60)), 0.8); + 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, 20, clWater, round(scaleByMapSize(7,16)*randFloat(0.8,1.35))), + scaleByMapSize(4,20) + ); +} + + +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); + +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) +); + + +const MIN_TREES = 500; +const MAX_TREES = 1500; +const P_FOREST = 0.7; + +var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); +var numForest = totalTrees * P_FOREST; +var numStragglers = totalTrees * (1.0 - P_FOREST); + +log("Creating forests..."); +var types = [ + [[tForestFloor, tGrass, pForest1], [tForestFloor, pForest1]], + [[tForestFloor, tGrass, pForest2], [tForestFloor, pForest2]] + +]; +var size = numForest / (scaleByMapSize(3,6) * numPlayers); +var num = floor(size / types.length); +for (var i = 0; i < types.length; ++i) +{ + placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), numForest / (num * floor(scaleByMapSize(2,4))), 1); + painter = new LayeredPainter( + types[i], // terrains + [2] // widths + ); + createAreas( + placer, + [painter, paintClass(clForest)], + avoidClasses(clPlayer, 20, clForest, 10, clHill, 1), + num + ); +} + +RMS.SetProgress(50); + +log("Creating mud patches..."); +var sizes = [scaleByMapSize(3, 6), scaleByMapSize(5, 10), scaleByMapSize(8, 21)]; +for (var i = 0; i < sizes.length; i++) +{ + placer = new ChainPlacer(1, floor(scaleByMapSize(3, 5)), sizes[i], 1); + painter = new LayeredPainter( + [tGrassA, tGrassB, tMud], // terrains + [1,1] // widths + ); + createAreas( + placer, + [painter, paintClass(clDirt)], + avoidClasses(clWater, 1, clForest, 0, clHill, 0, clDirt, 5, clPlayer, 8), + scaleByMapSize(15, 45) + ); +} + + +log("Creating stone mines..."); +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, 20, clRock, 10, clHill, 1)], + scaleByMapSize(4,16), 100 +); + +group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock); +createObjectGroups(group, 0, + [avoidClasses(clForest, 1, clPlayer, 20, clRock, 10, clHill, 1)], + scaleByMapSize(4,16), 100 +); + +log("Creating metal mines..."); +group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); +createObjectGroups(group, 0, + [avoidClasses(clWater, 0, clForest, 1, clPlayer, 20, clMetal, 10, clRock, 5, clHill, 1)], + scaleByMapSize(4,16), 100 +); + +RMS.SetProgress(60); + +log("Creating small decorative rocks..."); +group = new SimpleGroup( + [new SimpleObject(aPlant, 1,2, 0,1)], + true +); +createObjectGroups( + group, 0, + avoidClasses(clPlayer, 1, clHill, 2), + scaleByMapSize(16, 262), 50 +); + +log("Creating insect swarms..."); +group = new SimpleGroup( + [new SimpleObject(aSwarm, 1,1, 0,1)], + true +); +createObjectGroups( + group, 0, + [avoidClasses(clPlayer, 1, clHill, 2), stayClasses( clWater, 2)], + scaleByMapSize(10, 26), 50 +); + +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); + +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); + +log("Creating deer..."); +group = new SimpleGroup( + [new SimpleObject(oDeer, 5,7, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 13), + 6 * numPlayers, 50 +); + + +RMS.SetProgress(75); + +log("Creating rabbit..."); +group = new SimpleGroup( + [new SimpleObject(oRabbit, 5,7, 0,2)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clWater, 0, clForest, 0, clPlayer, 20, clHill, 1, clFood, 13), + 6 * numPlayers, 50 +); + +log("Creating crocodiles..."); +group = new SimpleGroup( + [new SimpleObject(oCrocodile, 1,3, 0,4)], + true, clFood +); +createObjectGroups(group, 0, + avoidClasses(clPlayer, 10), + 6 * numPlayers, 50 +); + + +RMS.SetProgress(80); + +log("Creating straggler trees..."); +var types = [oTree1, oTree2, oBush]; // 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, 6, clRock, 6), + num + ); +} + +log("Creating rain drops..."); +createObjectGroups( + new SimpleGroup( + [new SimpleObject(aRain, 1, 1, 1, 4)], + true, + clRain), + 0, + avoidClasses(clRain, 5), + scaleByMapSize(80, 250)); + +RMS.SetProgress(85); + +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); + +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); + + +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 +); + +setSkySet("dark"); +setWaterColor(0.243,0.533,0.270); +setWaterTint(0.161,0.514,0.635); +setWaterMurkiness(0.8); +setWaterWaviness(1.0); +setWaterType("clap"); + +setFogThickness(2.65); +setFogFactor(1.7); + +setPPEffect("hdr"); +setPPSaturation(0.44); +setPPBloom(0.3); + +ExportMap(); Index: binaries/data/mods/public/maps/random/plague_swamp.json =================================================================== --- binaries/data/mods/public/maps/random/plague_swamp.json +++ binaries/data/mods/public/maps/random/plague_swamp.json @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Plague Swamp", + "Script" : "plague_swamp.js", + "Description" : "[color=\"red\"]IMPORTANT NOTE: EXPECT RANDOM UNITS TO DIE AFTER A CERTAIN TIME. [/color]\n Players start in the midst of a disease-ridden swampland with little territory to build on. When illness strikes with lightning speed out of the festering pools, will you be able to stand its onslaught?", + "BaseTerrain" : ["tropic_plants_c", "temp_mud_a"], + "BaseHeight" : 3, + "Preview" : "plague_swamp.png", + "CircularMap" : true + } +}