From 208e6420892892bca006aa49312c77b9ca7204e8 Mon Sep 17 00:00:00 2001 From: Spahbod Date: Sun, 18 Mar 2012 07:53:18 +0000 Subject: [PATCH] More random maps and FeXoR's wall system. This was SVN commit r11361. --- .../data/mods/public/maps/random/fortress.js | 462 ++++++++++ .../mods/public/maps/random/fortress.json | 11 + .../public/maps/random/gulf_of_bothnia.js | 587 +++++++++++++ .../public/maps/random/gulf_of_bothnia.json | 11 + .../public/maps/random/rmgen/wall_builder.js | 810 ++++++++++++++++++ 5 files changed, 1881 insertions(+) create mode 100644 binaries/data/mods/public/maps/random/fortress.js create mode 100644 binaries/data/mods/public/maps/random/fortress.json create mode 100644 binaries/data/mods/public/maps/random/gulf_of_bothnia.js create mode 100644 binaries/data/mods/public/maps/random/gulf_of_bothnia.json create mode 100644 binaries/data/mods/public/maps/random/rmgen/wall_builder.js diff --git a/binaries/data/mods/public/maps/random/fortress.js b/binaries/data/mods/public/maps/random/fortress.js new file mode 100644 index 0000000000..331fe629e4 --- /dev/null +++ b/binaries/data/mods/public/maps/random/fortress.js @@ -0,0 +1,462 @@ +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 tHill = ["temp_highlands", "temp_grass_long_b"]; +var tCliff = ["temp_cliff_a", "temp_cliff_b"]; +var tRoad = "temp_road"; +var tRoadWild = "temp_road_overgrown"; +var tGrassPatch = "temp_grass_plants"; +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 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"; +var oWood = "gaia/special_treasure_wood"; +var oFood = "gaia/special_treasure_food_bin"; +var oMetal = "gaia/special_treasure_metal"; +var oStone = "gaia/special_treasure_stone"; + +// 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 = 0.75*PI; + +// initialize map + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clSettlement = createTileClass(); + + +// randomize player order +var playerIDs = []; +for (var i = 0; i < numPlayers; i++) +{ + playerIDs.push(i+1); +} +playerIDs = sortPlayers(playerIDs); + +// place players + +var playerX = new Array(numPlayers); +var playerZ = new Array(numPlayers); +var playerAngle = new Array(numPlayers); +var baseRadius = 30; + +var startAngle = randFloat(0, TWO_PI); +for (var i = 0; i < numPlayers; i++) +{ + playerAngle[i] = startAngle + i*TWO_PI/numPlayers; + playerX[i] = mapSize*(0.5 + 0.35*cos(playerAngle[i])); + playerZ[i] = mapSize*(0.5 + 0.35*sin(playerAngle[i])); +} + +for (var i=0; i < numPlayers; i++) +{ + var civ = g_MapSettings.PlayerData[i].Civ; + var startEntities = getStartingEntities(i); + // Place starting entities + createStartingPlayerEntities(playerX[i], playerZ[i], i+1, startEntities, BUILDING_ANGlE) + var uDist = 8; + var uSpace = 2; + for (var j = 1; j < startEntities.length - 1; ++j) + { + var uAngle = -BUILDING_ANGlE + PI * (j - 1) / 2; + var count = (startEntities[j].Count !== undefined ? startEntities[j].Count : 1); + for (var numberofentities = 0; numberofentities < count; numberofentities++) + { + var ux = playerX[i] + uDist * cos(uAngle) + numberofentities * uSpace * cos(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * cos(uAngle + PI/2)); + var uz = playerZ[i] + uDist * sin(uAngle) + numberofentities * uSpace * sin(uAngle + PI/2) - (0.75 * uSpace * floor(count / 2) * sin(uAngle + PI/2)); + placeObject(ux, uz, startEntities[j].Template, i+1, (j % 2 - 1) * PI + uAngle); + } + } + // create resources + var bbAngle = BUILDING_ANGlE; + var bbDist = 10; + var bbX = round(playerX[i] + bbDist * cos(bbAngle)); + var bbZ = round(playerZ[i] + bbDist * sin(bbAngle)); + var group = new SimpleGroup( + [new SimpleObject(oFood, 5,5, 0,2)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + bbAngle += PI/2; + var bbX = round(playerX[i] + bbDist * cos(bbAngle)); + var bbZ = round(playerZ[i] + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oWood, 5,5, 0,2)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + bbAngle += PI/2; + var bbX = round(playerX[i] + bbDist * cos(bbAngle)); + var bbZ = round(playerZ[i] + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oMetal, 3,3, 0,2)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + bbAngle += PI/2; + var bbX = round(playerX[i] + bbDist * cos(bbAngle)); + var bbZ = round(playerZ[i] + bbDist * sin(bbAngle)); + group = new SimpleGroup( + [new SimpleObject(oStone, 2,2, 0,2)], + true, clBaseResource, bbX, bbZ + ); + createObjectGroup(group, 0); + + // Base texture + var placer = new ClumpPlacer(PI*baseRadius*baseRadius/4, 1/2, 1/8, 10, playerX[i], playerZ[i]); + createArea(placer,[new TerrainPainter(tRoad), paintClass(clPlayer)]); + // Place fortresses + // new wallTool(civ, "medium").place(x, z, i+1, buildAngle); + + // Place fortresses Spahbod (custom fortress method, standart for this case but no function "setFortress" implemented yet) + var fType = new fortress('Spahbod'+civ); + if (civ == "celt" || civ == "iber") + { + fType.wall = ['entry', 'wall', 'wall', + 'cornerIn', 'wall', 'barracks', 'wall', 'gate', 'wall', 'house', 'wall', + 'cornerIn', 'wall', 'house', 'wall', 'entry', 'wall', 'house', 'wall', + 'cornerIn', 'wall', 'house', 'wall', 'gate', 'wall', 'house', 'wall', + 'cornerIn', 'wall', 'house', 'wall']; + } + else + { + fType.wall = ['entry', 'wall', 'wall', + 'cornerIn', 'wall', 'barracks', 'wall', 'gate', 'wall', 'wall', + 'cornerIn', 'wall', 'house', 'wall', 'entry', 'wall', 'wall', + 'cornerIn', 'wall', 'house', 'wall', 'gate', 'wall', 'wall', + 'cornerIn', 'wall', 'house', 'wall']; + }; + var fort = new wallTool(civ); + fort.setFortress(fType); + fort.place(playerX[i], playerZ[i], i+1, BUILDING_ANGlE); + +}; + +// create lakes +log("Creating lakes..."); +var numLakes = round(scaleByMapSize(1,4) * numPlayers); +var placer = new ClumpPlacer(scaleByMapSize(100,250), 0.8, 0.1, 10); +var terrainPainter = new LayeredPainter( + [tShore, tWater, tWater], // terrains + [1,1] // widths +); +var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, -4, 3); +var waterAreas = createAreas( + placer, + [terrainPainter, elevationPainter, paintClass(clWater)], + avoidClasses(clPlayer, 7, 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); +var painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2); +createAreas( + placer, + painter, + avoidClasses(clWater, 2, clPlayer, 5), + 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, 5, 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, 5, clWater, 3, clForest, 7, 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, 1), + 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, 1), + 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, 6, 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, 6, clHill, 1, clFood, 20), + 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(clWater, 1, clForest, 1, clHill, 1, clPlayer, 4, 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 +); + +// Export map data +ExportMap(); \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/fortress.json b/binaries/data/mods/public/maps/random/fortress.json new file mode 100644 index 0000000000..5a8f820ecb --- /dev/null +++ b/binaries/data/mods/public/maps/random/fortress.json @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Fortress", + "Script" : "fortress.js", + "Description" : "Players start in a fortress with piles of resources", + "BaseTerrain" : ["temp_grass", "temp_grass", "temp_grass_d"], + "BaseHeight" : 3, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/gulf_of_bothnia.js b/binaries/data/mods/public/maps/random/gulf_of_bothnia.js new file mode 100644 index 0000000000..6a2e13bd0d --- /dev/null +++ b/binaries/data/mods/public/maps/random/gulf_of_bothnia.js @@ -0,0 +1,587 @@ +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 = 0.75*PI; + +// initialize map + +log("Initializing map..."); + +InitMap(); + +var numPlayers = getNumPlayers(); +var mapSize = getMapSize(); +var mapArea = mapSize*mapSize; + +// create tile classes + +var clPlayer = createTileClass(); +var clHill = createTileClass(); +var clForest = createTileClass(); +var clWater = createTileClass(); +var clDirt = createTileClass(); +var clRock = createTileClass(); +var clMetal = createTileClass(); +var clFood = createTileClass(); +var clBaseResource = createTileClass(); +var clSettlement = createTileClass(); +var 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) + + // 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 diff --git a/binaries/data/mods/public/maps/random/gulf_of_bothnia.json b/binaries/data/mods/public/maps/random/gulf_of_bothnia.json new file mode 100644 index 0000000000..402f00cbd8 --- /dev/null +++ b/binaries/data/mods/public/maps/random/gulf_of_bothnia.json @@ -0,0 +1,11 @@ +{ + "settings" : { + "Name" : "Gulf of Bothnia", + "Script" : "gulf_of_bothnia.js", + "Description" : "Players start around a gulf dotted with small islands.", + "BaseTerrain" : ["alpine_dirt_grass_50"], + "BaseHeight" : 3, + "CircularMap" : true, + "XXXXXX" : "Optionally define other things here, like we would for a scenario" + } +} \ No newline at end of file diff --git a/binaries/data/mods/public/maps/random/rmgen/wall_builder.js b/binaries/data/mods/public/maps/random/rmgen/wall_builder.js new file mode 100644 index 0000000000..b27201d4cc --- /dev/null +++ b/binaries/data/mods/public/maps/random/rmgen/wall_builder.js @@ -0,0 +1,810 @@ +// Functionality to create walls and fortresses +// Wall object +function wallElement(type) +{ + // NOTE: Not all wall elements have a symetry. So there's an direction 'outside' (towards top/positive Z by default) + // In this sense 'right'/'left' means right/left of you when you stand upon the wall and look 'outside' + // The wall is build towards 'right' so the next wall element will be placed right of the previous one + // In this sense the wall's direction is right meaning the 'bending' of a corner is used for the element following the corner + // With 'inside' and 'outside' defined as above, corners bend 'in'/'out' meaning placemant angle is increased/decreased (circlewise like building placement) + this.type = type; // Descriptive string for easy to add wall styles. Not really needed (wallTool.wallTypes['type string'] is used) + // Wall type documentation: + // wall: A blocking straight wall element that mainly lengthens the wall, self-explanatory + // tower: A blocking straight wall element with damage potential that slightly lengthens the wall, exsample: wall tower, palisade tower(No attack?) + // wallFort: A blocking straight wall element with massive damage potential that lengthens the wall, exsample: fortress, palisade fort + // NOTE: Not really needed but for palisades, I don't find it tragic that palisades are much less powerfull + // outpost: A zero-length wall element without bending far indented so it stands outside the wall, exsample: outpost, defense tower, watchtower + // house: A zero-length wall element without bending far indented so it stands inside the wall, exsample: house, hut, longhouse + // gate: A blocking straight wall element with passability determined by owner, example: gate + // entry: A non-blocking straight wall element represented by a single indented template, example: defense tower, wall tower, outpost, watchtower, nothing + // wideEntry: A non-blocking straight wall element represented by a single indented template, example: fortress? a unit? + // NOTE: Not really needed... + // endRight: A straight wall element that (only) visually ends the wall to the right (e.g. left of entrys), example: wall tower, palisade ending + // endLeft: A straight wall element that (only) visually ends the wall to the left (e.g. right of entrys), example: wall tower, palisade ending + // cornerIn: A wall element bending the wall PI/2 (90°) 'inside' (see above), example: wall tower, palisade curve + // cornerOut: A wall element bending the wall PI/2 (90°) 'outside' (see above), example: wall tower, palisade curve (placed the other way arround) + // barracks: Adding in progress... + this.entity = undefined; // Template (string) that will represent the wall element, example: "other/palisades_rocks_straight" + this.angle = -PI/2; // Placement angle so that 'outside' is 'top' (directs towards positive z, like buildings) + this.width = 0; // The width it lengthens the wall, width because it's the needed space in a right angle to 'outside' + this.indent = 0; // The indentation means its drawn inside (positive values) or pressed outwards (negative values) + this.bending = 0*PI; // How the angle of the wall is changed by this element for the following element, positive is bending 'in' +}; + +// Fortress object. A list would do for symetric fortresses but if 'getCenter' don't do sufficient the center can be set manually. +function fortress(type) +{ + this.type = type; // Only usefull to get the type of the actual fortress (by 'wallTool.fortress.type') + this.wall = []; + this.center = [0, 0]; // X/Z offset (in default orientation) from first wall element to center, perhaps should be the other way around... + // NOTE: The 'angle' is not implemented yet!!! + this.angle = 0; // Angle the first element has to be placed so that fortress orientation is with main entrance top (default), should always be 0 though. +}; + +// The wall tool +function wallTool(style, fortressType) +{ + // General setup + this.angle = 0; // Not really needed, may be useful to rotate fortresses after set... + this.wallTypes = {}; // An associative array including all wall elements associated with 'wallElement.type'. + this.wall = []; // A list of strings (wall element types) for simple wall building + this.center = [0, 0] // X/Z offset from first wall element to center, perhaps should be the other way around... + + // Presets needed for wall style + this.wallStyles = {}; + this.style = "palisades"; // Not really needed, perhaps helpfull to check current style + if (style !== undefined) + this.style = style; + + // Presets needed for tortess types + this.fortressTypes = {}; + this.fortress = false; // Not really needed, perhaps usefull for getting fortress type, should be renamed somehow but simply 'type' is not very descriptive and 'fortressType' may be mistaken as 'fortressTypes' + if (fortressType !== undefined) + this.fortress = fortressType; + this.calculateCenter = true; // If setFortress(Type) shall recalculate the center + + // Adding wall styles + // Wall style 'palisades' + this.wallStyles["palisades"] = {}; + this.wallStyles["palisades"]["wall"] = new wallElement("wall"); + this.wallStyles["palisades"]["wall"].entity = "other/palisades_rocks_straight"; + this.wallStyles["palisades"]["wall"].angle = -PI/2; + this.wallStyles["palisades"]["wall"].width = 2.5; + + this.wallStyles["palisades"]["tower"] = new wallElement("tower"); + this.wallStyles["palisades"]["tower"].entity = "other/palisades_rocks_tower"; + this.wallStyles["palisades"]["tower"].angle = -PI/2; + this.wallStyles["palisades"]["tower"].width = 0.7; + + this.wallStyles["palisades"]["wallFort"] = new wallElement("wallFort"); + this.wallStyles["palisades"]["wallFort"].entity = "other/palisades_rocks_fort"; + this.wallStyles["palisades"]["wallFort"].angle = PI; + this.wallStyles["palisades"]["wallFort"].width = 1.7; + + this.wallStyles["palisades"]["outpost"] = new wallElement("outpost"); + this.wallStyles["palisades"]["outpost"].entity = "other/palisades_rocks_outpost"; + this.wallStyles["palisades"]["outpost"].angle = PI; + this.wallStyles["palisades"]["outpost"].indent = -2; + + this.wallStyles["palisades"]["house"] = new wallElement("house"); + this.wallStyles["palisades"]["house"].entity = "other/celt_hut"; + this.wallStyles["palisades"]["house"].angle = PI; + this.wallStyles["palisades"]["house"].indent = 5; + + this.wallStyles["palisades"]["gate"] = new wallElement("gate"); + this.wallStyles["palisades"]["gate"].entity = "other/palisades_rocks_gate"; + this.wallStyles["palisades"]["gate"].angle = -PI/2; + this.wallStyles["palisades"]["gate"].width = 3.6; + + this.wallStyles["palisades"]["entry"] = new wallElement("entry"); + this.wallStyles["palisades"]["entry"].entity = "other/palisades_rocks_watchtower"; + this.wallStyles["palisades"]["entry"].angle = 0*PI; + this.wallStyles["palisades"]["entry"].width = 3.6; + this.wallStyles["palisades"]["entry"].indent = -2; + + this.wallStyles["palisades"]["wideEntry"] = new wallElement("wideEntry"); + this.wallStyles["palisades"]["wideEntry"].entity = "other/palisades_rocks_fort"; + this.wallStyles["palisades"]["wideEntry"].angle = PI; + this.wallStyles["palisades"]["wideEntry"].width = 6; + this.wallStyles["palisades"]["wideEntry"].indent = -3; + + this.wallStyles["palisades"]["endRight"] = new wallElement("endRight"); + this.wallStyles["palisades"]["endRight"].entity = "other/palisades_rocks_end"; + this.wallStyles["palisades"]["endRight"].angle = -PI/2; + this.wallStyles["palisades"]["endRight"].width = 0.2; + + this.wallStyles["palisades"]["endLeft"] = new wallElement("endLeft"); + this.wallStyles["palisades"]["endLeft"].entity = "other/palisades_rocks_end"; + this.wallStyles["palisades"]["endLeft"].angle = PI/2; + this.wallStyles["palisades"]["endLeft"].width = 0.2; + + this.wallStyles["palisades"]["cornerIn"] = new wallElement("cornerIn"); + this.wallStyles["palisades"]["cornerIn"].entity = "other/palisades_rocks_curve"; + this.wallStyles["palisades"]["cornerIn"].angle = -PI/4; + this.wallStyles["palisades"]["cornerIn"].width = 2.1; + this.wallStyles["palisades"]["cornerIn"].indent = 0.7; + this.wallStyles["palisades"]["cornerIn"].bending = PI/2; + + this.wallStyles["palisades"]["cornerOut"] = new wallElement("cornerOut"); + this.wallStyles["palisades"]["cornerOut"].entity = "other/palisades_rocks_curve"; + this.wallStyles["palisades"]["cornerOut"].angle = PI/4; + this.wallStyles["palisades"]["cornerOut"].width = 2.1; + this.wallStyles["palisades"]["cornerOut"].indent = -0.7; + this.wallStyles["palisades"]["cornerOut"].bending = -PI/2; + + // Wall style 'cart' + this.wallStyles["cart"] = {}; + this.wallStyles["cart"]["wall"] = new wallElement("wall"); + this.wallStyles["cart"]["wall"].entity = "structures/cart_wall"; + this.wallStyles["cart"]["wall"].angle = 0*PI; + this.wallStyles["cart"]["wall"].width = 6.2; + + this.wallStyles["cart"]["tower"] = new wallElement("tower"); + this.wallStyles["cart"]["tower"].entity = "structures/cart_wall_tower"; + this.wallStyles["cart"]["tower"].angle = PI; + this.wallStyles["cart"]["tower"].width = 2.7; + + this.wallStyles["cart"]["wallFort"] = new wallElement("wallFort"); + this.wallStyles["cart"]["wallFort"].entity = "structures/cart_fortress"; + this.wallStyles["cart"]["wallFort"].angle = PI; + this.wallStyles["cart"]["wallFort"].width = 5.1; + this.wallStyles["cart"]["wallFort"].indent = 1.6; + + this.wallStyles["cart"]["outpost"] = new wallElement("outpost"); + this.wallStyles["cart"]["outpost"].entity = "structures/cart_outpost"; + this.wallStyles["cart"]["outpost"].angle = PI; + this.wallStyles["cart"]["outpost"].indent = -5; + + this.wallStyles["cart"]["house"] = new wallElement("house"); + this.wallStyles["cart"]["house"].entity = "structures/cart_house"; + this.wallStyles["cart"]["house"].angle = PI; + this.wallStyles["cart"]["house"].indent = 7; + + this.wallStyles["cart"]["gate"] = new wallElement("gate"); + this.wallStyles["cart"]["gate"].entity = "structures/cart_wall_gate"; + this.wallStyles["cart"]["gate"].angle = 0*PI; + this.wallStyles["cart"]["gate"].width = 6.2; + + this.wallStyles["cart"]["entry"] = new wallElement("entry"); + this.wallStyles["cart"]["entry"].entity = "structures/cart_defense_tower"; + this.wallStyles["cart"]["entry"].angle = PI; + this.wallStyles["cart"]["entry"].width = 6.2; + this.wallStyles["cart"]["entry"].indent = -5; + + this.wallStyles["cart"]["wideEntry"] = new wallElement("wideEntry"); + this.wallStyles["cart"]["wideEntry"].entity = "structures/cart_fortress"; + this.wallStyles["cart"]["wideEntry"].angle = PI; + this.wallStyles["cart"]["wideEntry"].width = 12; + this.wallStyles["cart"]["wideEntry"].indent = 7; + + this.wallStyles["cart"]["endRight"] = new wallElement("endRight"); + this.wallStyles["cart"]["endRight"].entity = "structures/cart_wall_tower"; + this.wallStyles["cart"]["endRight"].angle = PI; + this.wallStyles["cart"]["endRight"].width = 2.7; + + this.wallStyles["cart"]["endLeft"] = new wallElement("endLeft"); + this.wallStyles["cart"]["endLeft"].entity = "structures/cart_wall_tower"; + this.wallStyles["cart"]["endLeft"].angle = PI; + this.wallStyles["cart"]["endLeft"].width = 2.7; + + this.wallStyles["cart"]["cornerIn"] = new wallElement("cornerIn"); + this.wallStyles["cart"]["cornerIn"].entity = "structures/cart_wall_tower"; + this.wallStyles["cart"]["cornerIn"].angle = 5*PI/4; + this.wallStyles["cart"]["cornerIn"].width = 0.1; + this.wallStyles["cart"]["cornerIn"].indent = 0.9; + this.wallStyles["cart"]["cornerIn"].bending = PI/2; + + this.wallStyles["cart"]["cornerOut"] = new wallElement("cornerOut"); + this.wallStyles["cart"]["cornerOut"].entity = "structures/cart_wall_tower"; + this.wallStyles["cart"]["cornerOut"].angle = 3*PI/4; + this.wallStyles["cart"]["cornerOut"].width = 1.3; // 1.6 + this.wallStyles["cart"]["cornerOut"].bending = -PI/2; + + this.wallStyles["cart"]["barracks"] = new wallElement("barracks"); + this.wallStyles["cart"]["barracks"].entity = "structures/cart_barracks"; + this.wallStyles["cart"]["barracks"].angle = PI; + this.wallStyles["cart"]["barracks"].indent = 7; + + // Wall style 'celt' + this.wallStyles["celt"] = {}; + this.wallStyles["celt"]["wall"] = new wallElement("wall"); + this.wallStyles["celt"]["wall"].entity = "structures/celt_wall"; + this.wallStyles["celt"]["wall"].angle = 0*PI; + this.wallStyles["celt"]["wall"].width = 5; + this.wallStyles["celt"]["wall"].indent = 0.5; + + this.wallStyles["celt"]["tower"] = new wallElement("tower"); + this.wallStyles["celt"]["tower"].entity = "structures/celt_wall_tower"; + this.wallStyles["celt"]["tower"].angle = PI; + this.wallStyles["celt"]["tower"].width = 0.7; + + this.wallStyles["celt"]["wallFort"] = new wallElement("wallFort"); + this.wallStyles["celt"]["wallFort"].entity = "structures/celt_fortress_g"; + this.wallStyles["celt"]["wallFort"].angle = PI; + this.wallStyles["celt"]["wallFort"].width = 4.2; + this.wallStyles["celt"]["wallFort"].indent = 2; + + this.wallStyles["celt"]["outpost"] = new wallElement("outpost"); + this.wallStyles["celt"]["outpost"].entity = "structures/celt_outpost"; + this.wallStyles["celt"]["outpost"].angle = PI; + this.wallStyles["celt"]["outpost"].indent = -5; + + this.wallStyles["celt"]["house"] = new wallElement("house"); + this.wallStyles["celt"]["house"].entity = "structures/celt_house"; + this.wallStyles["celt"]["house"].angle = PI; + this.wallStyles["celt"]["house"].indent = 5; + + this.wallStyles["celt"]["gate"] = new wallElement("gate"); + this.wallStyles["celt"]["gate"].entity = "structures/celt_wall_gate"; + this.wallStyles["celt"]["gate"].angle = 0*PI; + this.wallStyles["celt"]["gate"].width = 3.2; + + this.wallStyles["celt"]["entry"] = new wallElement("entry"); + this.wallStyles["celt"]["entry"].entity = "structures/celt_defense_tower"; + this.wallStyles["celt"]["entry"].angle = PI; + this.wallStyles["celt"]["entry"].width = 6; + this.wallStyles["celt"]["entry"].indent = -5; + + this.wallStyles["celt"]["wideEntry"] = new wallElement("wideEntry"); + this.wallStyles["celt"]["wideEntry"].entity = "structures/celt_fortress_b"; + this.wallStyles["celt"]["wideEntry"].angle = PI; + this.wallStyles["celt"]["wideEntry"].width = 12; + this.wallStyles["celt"]["wideEntry"].indent = 7; + + this.wallStyles["celt"]["endRight"] = new wallElement("endRight"); + this.wallStyles["celt"]["endRight"].entity = "structures/celt_wall_tower"; + this.wallStyles["celt"]["endRight"].angle = PI; + this.wallStyles["celt"]["endRight"].width = 0.7; + + this.wallStyles["celt"]["endLeft"] = new wallElement("endLeft"); + this.wallStyles["celt"]["endLeft"].entity = "structures/celt_wall_tower"; + this.wallStyles["celt"]["endLeft"].angle = PI; + this.wallStyles["celt"]["endLeft"].width = 0.7; + + this.wallStyles["celt"]["cornerIn"] = new wallElement("cornerIn"); + this.wallStyles["celt"]["cornerIn"].entity = "structures/celt_wall_tower"; + this.wallStyles["celt"]["cornerIn"].angle = PI; + this.wallStyles["celt"]["cornerIn"].width = 0.7; + this.wallStyles["celt"]["cornerIn"].indent = 0; + this.wallStyles["celt"]["cornerIn"].bending = PI/2; + + this.wallStyles["celt"]["cornerOut"] = new wallElement("cornerOut"); + this.wallStyles["celt"]["cornerOut"].entity = "structures/celt_wall_tower"; + this.wallStyles["celt"]["cornerOut"].angle = PI; + this.wallStyles["celt"]["cornerOut"].width = 0.7; + this.wallStyles["celt"]["cornerOut"].indent = 0; + this.wallStyles["celt"]["cornerOut"].bending = -PI/2; + + this.wallStyles["celt"]["barracks"] = new wallElement("barracks"); + this.wallStyles["celt"]["barracks"].entity = "structures/celt_barracks"; + this.wallStyles["celt"]["barracks"].angle = PI; + this.wallStyles["celt"]["barracks"].indent = 7; + + // Wall style 'hele' + this.wallStyles["hele"] = {}; + this.wallStyles["hele"]["wall"] = new wallElement("wall"); + this.wallStyles["hele"]["wall"].entity = "structures/hele_wall"; + this.wallStyles["hele"]["wall"].angle = 0*PI; + this.wallStyles["hele"]["wall"].width = 5.95; + + this.wallStyles["hele"]["tower"] = new wallElement("tower"); + this.wallStyles["hele"]["tower"].entity = "structures/hele_wall_tower"; + this.wallStyles["hele"]["tower"].angle = PI; + this.wallStyles["hele"]["tower"].width = 1.5; + + this.wallStyles["hele"]["wallFort"] = new wallElement("wallFort"); + this.wallStyles["hele"]["wallFort"].entity = "structures/hele_fortress"; + this.wallStyles["hele"]["wallFort"].angle = 2*PI/2; // PI/2 + this.wallStyles["hele"]["wallFort"].width = 5.1; // 5.6 + this.wallStyles["hele"]["wallFort"].indent = 1.9; // 1.9 + + this.wallStyles["hele"]["outpost"] = new wallElement("outpost"); + this.wallStyles["hele"]["outpost"].entity = "structures/hele_outpost"; + this.wallStyles["hele"]["outpost"].angle = PI; + this.wallStyles["hele"]["outpost"].indent = -5; + + this.wallStyles["hele"]["house"] = new wallElement("house"); + this.wallStyles["hele"]["house"].entity = "structures/hele_house"; + this.wallStyles["hele"]["house"].angle = PI/2; + this.wallStyles["hele"]["house"].indent = 6; + + this.wallStyles["hele"]["gate"] = new wallElement("gate"); + this.wallStyles["hele"]["gate"].entity = "structures/hele_wall_gate"; + this.wallStyles["hele"]["gate"].angle = 0*PI; + this.wallStyles["hele"]["gate"].width = 9.1; + + this.wallStyles["hele"]["entry"] = new wallElement("entry"); + this.wallStyles["hele"]["entry"].entity = "structures/hele_defense_tower"; + this.wallStyles["hele"]["entry"].angle = PI; + this.wallStyles["hele"]["entry"].width = 9.1; + this.wallStyles["hele"]["entry"].indent = -4; + + this.wallStyles["hele"]["wideEntry"] = new wallElement("wideEntry"); + this.wallStyles["hele"]["wideEntry"].entity = "structures/hele_fortress"; + this.wallStyles["hele"]["wideEntry"].angle = 5*PI/2; + this.wallStyles["hele"]["wideEntry"].width = 12; + this.wallStyles["hele"]["wideEntry"].indent = 7; + + this.wallStyles["hele"]["endRight"] = new wallElement("endRight"); + this.wallStyles["hele"]["endRight"].entity = "structures/hele_wall_tower"; + this.wallStyles["hele"]["endRight"].angle = PI; + this.wallStyles["hele"]["endRight"].width = 1.5; + + this.wallStyles["hele"]["endLeft"] = new wallElement("endLeft"); + this.wallStyles["hele"]["endLeft"].entity = "structures/hele_wall_tower"; + this.wallStyles["hele"]["endLeft"].angle = PI; + this.wallStyles["hele"]["endLeft"].width = 1.5; + + this.wallStyles["hele"]["cornerIn"] = new wallElement("cornerIn"); + this.wallStyles["hele"]["cornerIn"].entity = "structures/hele_wall_tower"; + this.wallStyles["hele"]["cornerIn"].angle = 5*PI/4; + this.wallStyles["hele"]["cornerIn"].width = 0; + this.wallStyles["hele"]["cornerIn"].indent = 0.5; + this.wallStyles["hele"]["cornerIn"].bending = PI/2; + + this.wallStyles["hele"]["cornerOut"] = new wallElement("cornerOut"); + this.wallStyles["hele"]["cornerOut"].entity = "structures/hele_wall_tower"; + this.wallStyles["hele"]["cornerOut"].angle = 3*PI/4; + this.wallStyles["hele"]["cornerOut"].width = 1; + this.wallStyles["hele"]["cornerOut"].bending = -PI/2; + + this.wallStyles["hele"]["barracks"] = new wallElement("barracks"); + this.wallStyles["hele"]["barracks"].entity = "structures/hele_barracks"; + this.wallStyles["hele"]["barracks"].angle = PI; + this.wallStyles["hele"]["barracks"].indent = 6; + + // Wall style 'iber' + this.wallStyles["iber"] = {}; + this.wallStyles["iber"]["wall"] = new wallElement("wall"); + this.wallStyles["iber"]["wall"].entity = "structures/iber_wall"; + this.wallStyles["iber"]["wall"].angle = 0*PI; + this.wallStyles["iber"]["wall"].width = 6.9; + + this.wallStyles["iber"]["tower"] = new wallElement("tower"); + this.wallStyles["iber"]["tower"].entity = "structures/iber_wall_tower"; + this.wallStyles["iber"]["tower"].angle = PI; + this.wallStyles["iber"]["tower"].width = 2.1; + + this.wallStyles["iber"]["wallFort"] = new wallElement("wallFort"); + this.wallStyles["iber"]["wallFort"].entity = "structures/iber_fortress"; + this.wallStyles["iber"]["wallFort"].angle = PI; + this.wallStyles["iber"]["wallFort"].width = 4.5; + this.wallStyles["iber"]["wallFort"].indent = 0.7; + + this.wallStyles["iber"]["outpost"] = new wallElement("outpost"); + this.wallStyles["iber"]["outpost"].entity = "structures/iber_outpost"; + this.wallStyles["iber"]["outpost"].angle = PI; + this.wallStyles["iber"]["outpost"].indent = -5; + + this.wallStyles["iber"]["house"] = new wallElement("house"); + this.wallStyles["iber"]["house"].entity = "structures/iber_house"; + this.wallStyles["iber"]["house"].angle = PI; + this.wallStyles["iber"]["house"].indent = 4; + + this.wallStyles["iber"]["gate"] = new wallElement("gate"); + this.wallStyles["iber"]["gate"].entity = "structures/iber_wall_gate"; + this.wallStyles["iber"]["gate"].angle = 0*PI; + this.wallStyles["iber"]["gate"].width = 9.2; + + this.wallStyles["iber"]["entry"] = new wallElement("entry"); + this.wallStyles["iber"]["entry"].entity = "structures/iber_wall_tower"; + this.wallStyles["iber"]["entry"].angle = PI; + this.wallStyles["iber"]["entry"].width = 6.9; + this.wallStyles["iber"]["entry"].indent = -5; + + this.wallStyles["iber"]["wideEntry"] = new wallElement("wideEntry"); + this.wallStyles["iber"]["wideEntry"].entity = "structures/iber_fortress"; + this.wallStyles["iber"]["wideEntry"].angle = PI/2; + this.wallStyles["iber"]["wideEntry"].width = 9.2; + this.wallStyles["iber"]["wideEntry"].indent = 7; + + this.wallStyles["iber"]["endRight"] = new wallElement("endRight"); + this.wallStyles["iber"]["endRight"].entity = "structures/iber_wall_tower"; + this.wallStyles["iber"]["endRight"].angle = PI; + this.wallStyles["iber"]["endRight"].width = 2.1; + + this.wallStyles["iber"]["endLeft"] = new wallElement("endLeft"); + this.wallStyles["iber"]["endLeft"].entity = "structures/iber_wall_tower"; + this.wallStyles["iber"]["endLeft"].angle = PI; + this.wallStyles["iber"]["endLeft"].width = 2.1; + + this.wallStyles["iber"]["cornerIn"] = new wallElement("cornerIn"); + this.wallStyles["iber"]["cornerIn"].entity = "structures/iber_wall_tower"; + this.wallStyles["iber"]["cornerIn"].angle = PI; + this.wallStyles["iber"]["cornerIn"].width = 2.1; + this.wallStyles["iber"]["cornerIn"].bending = PI/2; + + this.wallStyles["iber"]["cornerIn2"] = new wallElement("cornerIn2"); + this.wallStyles["iber"]["cornerIn2"].entity = "structures/iber_defense_tower"; + this.wallStyles["iber"]["cornerIn2"].angle = 5*PI/4; + this.wallStyles["iber"]["cornerIn2"].width = 1; + this.wallStyles["iber"]["cornerIn2"].indent = 0.2; + this.wallStyles["iber"]["cornerIn2"].bending = PI/2; + + this.wallStyles["iber"]["cornerIn3"] = new wallElement("cornerIn3"); + this.wallStyles["iber"]["cornerIn3"].entity = "structures/iber_wall_tower"; + this.wallStyles["iber"]["cornerIn3"].angle = 5*PI/4; + this.wallStyles["iber"]["cornerIn3"].width = 0.3; + this.wallStyles["iber"]["cornerIn3"].indent = 0.5; + this.wallStyles["iber"]["cornerIn3"].bending = PI/2; + + this.wallStyles["iber"]["cornerOut"] = new wallElement("cornerOut"); + this.wallStyles["iber"]["cornerOut"].entity = "structures/iber_wall_tower"; + this.wallStyles["iber"]["cornerOut"].angle = 3*PI/4; + this.wallStyles["iber"]["cornerOut"].width = 1.3; + this.wallStyles["iber"]["cornerOut"].indent = 0; + this.wallStyles["iber"]["cornerOut"].bending = -PI/2; + + this.wallStyles["iber"]["barracks"] = new wallElement("barracks"); + this.wallStyles["iber"]["barracks"].entity = "structures/iber_barracks"; + this.wallStyles["iber"]["barracks"].angle = PI; + this.wallStyles["iber"]["barracks"].indent = 7; + + // Wall style 'pers' + this.wallStyles["pers"] = {}; + this.wallStyles["pers"]["wall"] = new wallElement("wall"); + this.wallStyles["pers"]["wall"].entity = "structures/pers_wall"; + this.wallStyles["pers"]["wall"].angle = 0*PI; + this.wallStyles["pers"]["wall"].width = 5.9; + + this.wallStyles["pers"]["tower"] = new wallElement("tower"); + this.wallStyles["pers"]["tower"].entity = "structures/pers_wall_tower"; + this.wallStyles["pers"]["tower"].angle = PI; + this.wallStyles["pers"]["tower"].width = 1.7; + + this.wallStyles["pers"]["wallFort"] = new wallElement("wallFort"); + this.wallStyles["pers"]["wallFort"].entity = "structures/pers_fortress"; + this.wallStyles["pers"]["wallFort"].angle = PI; + this.wallStyles["pers"]["wallFort"].width = 5.6; // 5.5 + this.wallStyles["pers"]["wallFort"].indent = 1.9; // 1.7 + + this.wallStyles["pers"]["outpost"] = new wallElement("outpost"); + this.wallStyles["pers"]["outpost"].entity = "structures/pers_outpost"; + this.wallStyles["pers"]["outpost"].angle = PI; + this.wallStyles["pers"]["outpost"].indent = -5; + + this.wallStyles["pers"]["house"] = new wallElement("house"); + this.wallStyles["pers"]["house"].entity = "structures/pers_house"; + this.wallStyles["pers"]["house"].angle = PI; + this.wallStyles["pers"]["house"].indent = 6; + + this.wallStyles["pers"]["gate"] = new wallElement("gate"); + this.wallStyles["pers"]["gate"].entity = "structures/pers_wall_gate"; + this.wallStyles["pers"]["gate"].angle = 0*PI; + this.wallStyles["pers"]["gate"].width = 6; + + this.wallStyles["pers"]["entry"] = new wallElement("entry"); + this.wallStyles["pers"]["entry"].entity = "structures/pers_defense_tower"; + this.wallStyles["pers"]["entry"].angle = PI; + this.wallStyles["pers"]["entry"].width = 6; + this.wallStyles["pers"]["entry"].indent = -4; + + this.wallStyles["pers"]["wideEntry"] = new wallElement("wideEntry"); + this.wallStyles["pers"]["wideEntry"].entity = "structures/pers_fortress"; + this.wallStyles["pers"]["wideEntry"].angle = PI; + this.wallStyles["pers"]["wideEntry"].width = 12; + this.wallStyles["pers"]["wideEntry"].indent = 7; + + this.wallStyles["pers"]["endRight"] = new wallElement("endRight"); + this.wallStyles["pers"]["endRight"].entity = "structures/pers_wall_tower"; + this.wallStyles["pers"]["endRight"].angle = PI; + this.wallStyles["pers"]["endRight"].width = 1.7; + + this.wallStyles["pers"]["endLeft"] = new wallElement("endLeft"); + this.wallStyles["pers"]["endLeft"].entity = "structures/pers_wall_tower"; + this.wallStyles["pers"]["endLeft"].angle = PI; + this.wallStyles["pers"]["endLeft"].width = 1.7; + + this.wallStyles["pers"]["cornerIn"] = new wallElement("cornerIn"); + this.wallStyles["pers"]["cornerIn"].entity = "structures/pers_wall_tower"; + this.wallStyles["pers"]["cornerIn"].angle = 5*PI/4; + this.wallStyles["pers"]["cornerIn"].width = 0.2; + this.wallStyles["pers"]["cornerIn"].indent = 0.5; + this.wallStyles["pers"]["cornerIn"].bending = PI/2; + + this.wallStyles["pers"]["cornerOut"] = new wallElement("cornerOut"); + this.wallStyles["pers"]["cornerOut"].entity = "structures/pers_wall_tower"; + this.wallStyles["pers"]["cornerOut"].angle = 3*PI/4; + this.wallStyles["pers"]["cornerOut"].width = 0.8; + this.wallStyles["pers"]["cornerOut"].indent = 0; + this.wallStyles["pers"]["cornerOut"].bending = -PI/2; + + this.wallStyles["pers"]["barracks"] = new wallElement("barracks"); + this.wallStyles["pers"]["barracks"].entity = "structures/pers_barracks"; + this.wallStyles["pers"]["barracks"].angle = PI; + this.wallStyles["pers"]["barracks"].indent = 7; + + // Wall style 'rome' + this.wallStyles["rome"] = {}; + this.wallStyles["rome"]["wall"] = new wallElement("wall"); + this.wallStyles["rome"]["wall"].entity = "structures/rome_wall"; + this.wallStyles["rome"]["wall"].angle = 0*PI; + this.wallStyles["rome"]["wall"].width = 5.9; + + this.wallStyles["rome"]["tower"] = new wallElement("tower"); + this.wallStyles["rome"]["tower"].entity = "structures/rome_wall_tower"; + this.wallStyles["rome"]["tower"].angle = PI; + this.wallStyles["rome"]["tower"].width = 2.1; + + this.wallStyles["rome"]["wallFort"] = new wallElement("wallFort"); + this.wallStyles["rome"]["wallFort"].entity = "structures/rome_fortress"; + this.wallStyles["rome"]["wallFort"].angle = PI; + this.wallStyles["rome"]["wallFort"].width = 6.3; + this.wallStyles["rome"]["wallFort"].indent = 2.1; + + this.wallStyles["rome"]["outpost"] = new wallElement("outpost"); + this.wallStyles["rome"]["outpost"].entity = "structures/rome_outpost"; + this.wallStyles["rome"]["outpost"].angle = PI; + this.wallStyles["rome"]["outpost"].indent = -5; + + this.wallStyles["rome"]["house"] = new wallElement("house"); + this.wallStyles["rome"]["house"].entity = "structures/rome_house"; + this.wallStyles["rome"]["house"].angle = PI; + this.wallStyles["rome"]["house"].indent = 7; + + this.wallStyles["rome"]["gate"] = new wallElement("gate"); + this.wallStyles["rome"]["gate"].entity = "structures/rome_wall_gate"; + this.wallStyles["rome"]["gate"].angle = 0*PI; + this.wallStyles["rome"]["gate"].width = 5.9; + + this.wallStyles["rome"]["entry"] = new wallElement("entry"); + this.wallStyles["rome"]["entry"].entity = "structures/rome_defense_tower"; + this.wallStyles["rome"]["entry"].angle = PI; + this.wallStyles["rome"]["entry"].width = 5.9; + this.wallStyles["rome"]["entry"].indent = -4; + + this.wallStyles["rome"]["wideEntry"] = new wallElement("wideEntry"); + this.wallStyles["rome"]["wideEntry"].entity = "structures/rome_fortress"; + this.wallStyles["rome"]["wideEntry"].angle = PI; + this.wallStyles["rome"]["wideEntry"].width = 12; + this.wallStyles["rome"]["wideEntry"].indent = 7; + + this.wallStyles["rome"]["endRight"] = new wallElement("endRight"); + this.wallStyles["rome"]["endRight"].entity = "structures/rome_wall_tower"; + this.wallStyles["rome"]["endRight"].angle = PI; + this.wallStyles["rome"]["endRight"].width = 2.1; + + this.wallStyles["rome"]["endLeft"] = new wallElement("endLeft"); + this.wallStyles["rome"]["endLeft"].entity = "structures/rome_wall_tower"; + this.wallStyles["rome"]["endLeft"].angle = PI; + this.wallStyles["rome"]["endLeft"].width = 2.1; + + this.wallStyles["rome"]["cornerIn"] = new wallElement("cornerIn"); + this.wallStyles["rome"]["cornerIn"].entity = "structures/rome_wall_tower"; + this.wallStyles["rome"]["cornerIn"].angle = 5*PI/4; + this.wallStyles["rome"]["cornerIn"].width = 0; + this.wallStyles["rome"]["cornerIn"].indent = 0.7; + this.wallStyles["rome"]["cornerIn"].bending = PI/2; + + this.wallStyles["rome"]["cornerOut"] = new wallElement("cornerOut"); + this.wallStyles["rome"]["cornerOut"].entity = "structures/rome_wall_tower"; + this.wallStyles["rome"]["cornerOut"].angle = 3*PI/4; + this.wallStyles["rome"]["cornerOut"].width = 1.1; // 1.4 + this.wallStyles["rome"]["cornerOut"].indent = 0; + this.wallStyles["rome"]["cornerOut"].bending = -PI/2; + + this.wallStyles["rome"]["barracks"] = new wallElement("barracks"); + this.wallStyles["rome"]["barracks"].entity = "structures/rome_barracks"; + this.wallStyles["rome"]["barracks"].angle = PI; + this.wallStyles["rome"]["barracks"].indent = 6; + + // Setup some default fortress types + // General default fortress types + this.fortressTypes["tiny"] = new fortress("tiny"); + var wallPart = ['entry', 'endLeft', 'wall', 'cornerIn', 'wall', 'endRight']; + var parts = 4; + for (var part = 0; part < parts; part++) + { + for (var wallIndex = 0; wallIndex < wallPart.length; wallIndex++) + this.fortressTypes["tiny"].wall.push(wallPart[wallIndex]) + }; + + this.fortressTypes["small"] = new fortress("small"); + var wallPart = ['entry', 'endLeft', 'wall', 'tower', 'wall', + 'cornerIn', 'wall', 'tower', 'wall', 'endRight']; + var parts = 4; + for (var part = 0; part < parts; part++) + { + for (var wallIndex = 0; wallIndex < wallPart.length; wallIndex++) + this.fortressTypes["small"].wall.push(wallPart[wallIndex]) + }; + + this.fortressTypes["medium"] = new fortress("medium"); + var wallPart = ['entry', 'endLeft', 'wall', 'tower', 'wall', 'cornerIn', 'wall', + 'cornerOut', 'wall', 'cornerIn', 'wall', 'tower', 'wall', 'endRight']; + var parts = 4; + for (var part = 0; part < parts; part++) + { + for (var wallIndex = 0; wallIndex < wallPart.length; wallIndex++) + this.fortressTypes["medium"].wall.push(wallPart[wallIndex]) + }; + + this.fortressTypes["normal"] = new fortress("normal"); + var wallPart = ['entry', 'endLeft', 'wall', 'tower', 'wall', 'outpost', 'wall', 'cornerIn', 'wall', + 'cornerOut', 'wall', 'cornerIn', 'wall', 'outpost', 'wall', 'tower', 'wall', 'endRight']; + var parts = 4; + for (var part = 0; part < parts; part++) + { + for (var wallIndex = 0; wallIndex < wallPart.length; wallIndex++) + this.fortressTypes["normal"].wall.push(wallPart[wallIndex]) + }; + + this.fortressTypes["large"] = new fortress("large"); + var wallPart = ['entry', 'endLeft', 'wall', 'tower', 'wall', 'outpost', 'wall', 'cornerIn', 'wall', 'tower', 'wall', + 'cornerOut', 'wall', 'tower', 'wall', 'cornerIn', 'wall', 'outpost', 'wall', 'tower', 'wall', 'endRight']; + var parts = 4; + for (var part = 0; part < parts; part++) + { + for (var wallIndex = 0; wallIndex < wallPart.length; wallIndex++) + this.fortressTypes["large"].wall.push(wallPart[wallIndex]) + }; + + this.fortressTypes["very large"] = new fortress("very large"); + var wallPart = ['entry', 'endLeft', 'wall', 'tower', 'wall', 'outpost', 'wall', + 'tower', 'gate', 'tower', 'wall', 'cornerIn', 'wall', 'tower', 'wall', + 'cornerOut', 'wall', 'tower', 'wall', 'cornerIn', 'wall', 'tower', 'gate', + 'tower', 'wall', 'outpost', 'wall', 'tower', 'wall', 'endRight']; + var parts = 4; + for (var part = 0; part < parts; part++) + { + for (var wallIndex = 0; wallIndex < wallPart.length; wallIndex++) + this.fortressTypes["very large"].wall.push(wallPart[wallIndex]) + }; + + this.fortressTypes["giant"] = new fortress("giant"); + var wallPart = ['entry', 'endLeft', 'wall', 'tower', 'wall', 'outpost', 'wall', 'tower', + 'gate', 'tower', 'wall', 'cornerIn', 'wall', 'outpost', 'wall', 'tower', 'wall', + 'cornerOut', 'wall', 'tower', 'wall', 'outpost', 'wall', 'cornerIn', 'wall', 'tower', + 'gate', 'tower', 'wall', 'outpost', 'wall', 'tower', 'wall', 'endRight']; + var parts = 4; + for (var part = 0; part < parts; part++) + { + for (var wallIndex = 0; wallIndex < wallPart.length; wallIndex++) + this.fortressTypes["giant"].wall.push(wallPart[wallIndex]) + }; + + this.fortressTypes["demo"] = new fortress("demo"); + var wallPart = ['entry', 'endLeft', 'wall', 'tower', 'wall', 'wallFort', 'wall', 'tower', 'gate', 'tower', 'wall', 'outpost', + 'wall', 'cornerIn', 'wall', 'outpost', 'wall', 'endRight', 'wideEntry', 'endLeft', 'wall', 'tower', 'wall', + 'cornerOut', 'wall', 'tower', 'wall', 'endRight', 'wideEntry', 'endLeft', 'wall', 'outpost', 'wall', 'cornerIn', + 'wall', 'outpost', 'wall', 'tower', 'gate', 'tower', 'wall', 'wallFort', 'wall', 'tower', 'wall', 'endRight']; + var parts = 4; + for (var part = 0; part < parts; part++) + { + for (var wallIndex = 0; wallIndex < wallPart.length; wallIndex++) + this.fortressTypes["demo"].wall.push(wallPart[wallIndex]) + }; + + // Default civ dependent fortresses for Spahbod + this.fortressTypes["cartSB"] = new fortress("cartSB"); + this.fortressTypes["cartSB"].wall = ['entry', 'wall', 'wall', + 'cornerIn', 'wall', 'barracks', 'wall', 'gate', 'wall', 'wall', + 'cornerIn', 'wall', 'house', 'wall', 'entry', 'wall', 'wall', + 'cornerIn', 'wall', 'house', 'wall', 'gate', 'wall', 'wall', + 'cornerIn', 'wall', 'house', 'wall']; + this.fortressTypes["celtSB"] = new fortress("celtSB"); + this.fortressTypes["celtSB"].wall = ['entry', 'wall', 'wall', + 'cornerIn', 'wall', 'barracks', 'wall', 'gate', 'wall', 'house', 'wall', + 'cornerIn', 'wall', 'house', 'wall', 'entry', 'wall', 'house', 'wall', + 'cornerIn', 'wall', 'house', 'wall', 'gate', 'wall', 'house', 'wall', + 'cornerIn', 'wall', 'house', 'wall']; + this.fortressTypes["iberSB"] = this.fortressTypes["celtSB"]; + this.fortressTypes["heleSB"] = this.fortressTypes["cartSB"]; + this.fortressTypes["persSB"] = this.fortressTypes["cartSB"]; + this.fortressTypes["romeSB"] = this.fortressTypes["cartSB"]; + + // Setup style + this.setStyle(this.style); + + // Setup fortress type if preasent + if (this.fortress !== false && this.fortress !== undefined) + this.setFortressType(this.fortress); +}; + +wallTool.prototype.setStyle = function(style) +{ + if (style in this.wallStyles) + { + this.style = style; + this.wallTypes = this.wallStyles[style]; + } + else + { + warn("Wall style '" + style + "' not found, falling back to 'palisades'..."); + this.style = 'palisades'; + this.wallTypes = this.wallStyles['palisades']; + }; +}; + +wallTool.prototype.getAlignment = function(startX, startZ, orientation) +{ + if (startX == undefined) + startX = 0; + if (startZ == undefined) + startZ = 0; + if (orientation == undefined) + orientation = 0; + var wallAlignment = []; + var outside = orientation; + var wallX = startX - this.center[1]*sin(orientation) - this.center[0]*cos(orientation); + var wallZ = startZ - this.center[1]*cos(orientation) + this.center[0]*sin(orientation); + for (var iWall = 0; iWall < this.wall.length; iWall++) + { + var element = this.wallTypes[this.wall[iWall]]; + var x = wallX - element.indent*sin(outside); + var z = wallZ - element.indent*cos(outside); + wallAlignment.push([x, z, element.entity, outside + element.angle]); + // Presets for the next element + if (iWall + 1 < this.wall.length) + { + outside += element.bending; + var nextElement = this.wallTypes[this.wall[iWall + 1]]; + var distance = (element.width + nextElement.width)/2; + // Indent corrections for corners + if (element.bending !== 0 && element.indent !== 0) + { + // Indent correction of distance, not sure for non-right angles... + distance += element.indent*sin(element.bending); + // Indent correction of next normalized indentation + wallX += element.indent * sin(outside); + wallZ += element.indent * cos(outside); + }; + wallX += distance * sin(outside + PI/2); + wallZ += distance * cos(outside + PI/2); + }; + }; + return wallAlignment +}; + +wallTool.prototype.getCenter = function(wallAlignment) +{ + var x = 0; + var z = 0; + for (var iWall = 0; iWall < wallAlignment.length; iWall++) + { + x += wallAlignment[iWall][0]/wallAlignment.length; + z += wallAlignment[iWall][1]/wallAlignment.length; + }; + var output = [x, z]; + return output; +}; + +wallTool.prototype.setFortress = function(fortress) +{ + this.fortress = fortress.type; + this.wall = fortress.wall; + if (this.calculateCenter == true) + { + this.center = [0, 0]; + var AM = this.getAlignment(0, 0, 0*PI); + var center = this.getCenter(AM); + this.center = center; + } + else + { + this.center = this.fortress.center + }; +}; + +wallTool.prototype.setFortressType = function(type) +{ + if (type in this.fortressTypes) + { + this.setFortress(this.fortressTypes[type]); + } + else + { + warn("Fortress type '" + type + "' not found, falling back to 'medium'"); + this.setFortress(this.fortressTypes["medium"]); + }; +}; + +wallTool.prototype.place = function(startX, startZ, playerId, orientation) +{ + var AM = this.getAlignment(startX, startZ, orientation); + for (var iWall = 0; iWall < this.wall.length; iWall++) + { + if (AM[iWall][2] !== undefined) + placeObject(AM[iWall][0], AM[iWall][1], AM[iWall][2], playerId, AM[iWall][3]); + }; +};