More random maps and FeXoR's wall system.
This was SVN commit r11361.
This commit is contained in:
parent
d7128572ae
commit
208e642089
462
binaries/data/mods/public/maps/random/fortress.js
Normal file
462
binaries/data/mods/public/maps/random/fortress.js
Normal file
@ -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();
|
11
binaries/data/mods/public/maps/random/fortress.json
Normal file
11
binaries/data/mods/public/maps/random/fortress.json
Normal file
@ -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"
|
||||||
|
}
|
||||||
|
}
|
587
binaries/data/mods/public/maps/random/gulf_of_bothnia.js
Normal file
587
binaries/data/mods/public/maps/random/gulf_of_bothnia.js
Normal file
@ -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();
|
11
binaries/data/mods/public/maps/random/gulf_of_bothnia.json
Normal file
11
binaries/data/mods/public/maps/random/gulf_of_bothnia.json
Normal file
@ -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"
|
||||||
|
}
|
||||||
|
}
|
810
binaries/data/mods/public/maps/random/rmgen/wall_builder.js
Normal file
810
binaries/data/mods/public/maps/random/rmgen/wall_builder.js
Normal file
@ -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]);
|
||||||
|
};
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user