Ticket #2944: gen_wall_builder2015-8-16.patch
File gen_wall_builder2015-8-16.patch, 56.2 KB (added by , 9 years ago) |
---|
-
binaries/data/mods/public/maps/random/belgian_uplands.js
21 21 // Heightmap functionality 22 22 ////////// 23 23 24 // Some general heightmap settings25 const MIN_HEIGHT = - SEA_LEVEL; // 20, should be set in the libs!26 const MAX_HEIGHT = 0xFFFF/HEIGHT_UNITS_PER_METRE - SEA_LEVEL; // A bit smaler than 90, should be set in the libs!27 28 24 // Add random heightmap generation functionality 29 25 function getRandomReliefmap(minHeight, maxHeight) 30 26 { -
binaries/data/mods/public/maps/random/rmgen/library.js
6 6 const PI = Math.PI; 7 7 const TWO_PI = 2 * Math.PI; 8 8 const TERRAIN_SEPARATOR = "|"; 9 const SEA_LEVEL = 20.0;9 const SEA_LEVEL = 160.0; 10 10 const CELL_SIZE = 4; 11 11 const HEIGHT_UNITS_PER_METRE = 92; 12 12 const MIN_MAP_SIZE = 128; 13 13 const MAX_MAP_SIZE = 512; 14 14 const FALLBACK_CIV = "athen"; 15 // Constants needed for heightmap_manipulation.js 16 const MAX_HEIGHT_RANGE = 0xFFFF / HEIGHT_UNITS_PER_METRE // Engine limit, Roughly 700 meters 17 const MIN_HEIGHT = - SEA_LEVEL; 18 const MAX_HEIGHT = MAX_HEIGHT_RANGE - SEA_LEVEL; 19 // Entity template structure keys that might change, for easier mod support 20 const STARTING_ENTITY_KEY = "StartEntities"; 21 const START_ENTITY_TEMPLATE_PATH_KEY = "Template" 22 const BUILDER_TEMPLATEPATH_KEYS = ["Builder", "Entities", "_string"]; 23 const PRODUCTION_TEMPLATEPATH_KEYS = ["ProductionQueue", "Entities", "_string"]; 24 const CIV_PLACEHOLDER_STRING = "{civ}"; 15 25 16 26 ///////////////////////////////////////////////////////////////////////////////////////////// 17 27 // Utility functions … … 394 404 return g_MapSettings.PlayerData.length - 1; 395 405 } 396 406 407 // Takes nothing, returns an array of strings representing all available civilizations 408 function getCivList() 409 { 410 var raw_civData = RMS.GetCivData(); 411 var civList = []; 412 for (var i = 0; i < raw_civData.length; ++i) 413 civList.push(JSON.parse(raw_civData[i]).Code); 414 415 return civList; 416 } 417 418 // Takes nothing, returns an associative array with civ strings as keys containing all unpacked civ data (Templates need to be unpacked with RMS.GetTemplate() if needed) 419 function getFullCivData() 420 { 421 var rawCivData = RMS.GetCivData(); 422 var unpackedCivData = {}; 423 for (var i = 0; i < rawCivData.length; i++) 424 { 425 var singleCivData = JSON.parse(rawCivData[i]); 426 unpackedCivData[singleCivData.Code] = singleCivData; 427 } 428 429 return unpackedCivData; 430 } 431 432 // Takes a player number (0-7, so Gaia excluded). Returns this players civ string 433 // ToDo: If the player number is to high an error will occur (and the fallback won't be reached)! 397 434 function getCivCode(player) 398 435 { 399 436 if (g_MapSettings.PlayerData[player+1].Civ) 400 437 return g_MapSettings.PlayerData[player+1].Civ; 401 438 402 warn(" undefined civ specified for player " + (player + 1) + ", falling back to '" + FALLBACK_CIV + "'");439 warn("Undefined civ specified for player " + (player + 1) + ", falling back to '" + FALLBACK_CIV + "'"); 403 440 return FALLBACK_CIV; 404 441 } 405 442 443 // Takes an entity path and a key list to get the templates value 444 function getTemplateValue(entPath, key_list) 445 { 446 var subdata = RMS.GetTemplate(entPath); 447 for (var i = 0; i < key_list.length; i++) 448 { 449 if (key_list[i] in subdata) 450 { 451 subdata = subdata[key_list[i]]; 452 } 453 else 454 { 455 return false; 456 } 457 } 458 return subdata; 459 } 460 461 // Returns a list of all templates paths available to the given civ 462 function getTempatePathList(civ) 463 { 464 var templatePaths = getFullCivData(); 465 if (civ in templatePaths) 466 { 467 templatePaths = templatePaths[civ]; 468 } 469 else 470 { 471 var keys = []; 472 for (var key in templatePaths) 473 keys.push(key); 474 warn("getTempatePathList: Unknown civ: " + civ + " not in " + uneval(keys)); 475 return false; 476 } 477 if (STARTING_ENTITY_KEY in templatePaths) 478 { 479 templatePaths = templatePaths[STARTING_ENTITY_KEY]; 480 } 481 else 482 { 483 var keys = []; 484 for (var key in templatePaths) 485 keys.push(key); 486 warn("getTempatePathList: Civ has no starting entities as defined in STARTING_ENTITY_KEY (" + STARTING_ENTITY_KEY + "): " + uneval(keys)); 487 return false; 488 } 489 for (var i = 0; i < templatePaths.length; i++) 490 { 491 if (START_ENTITY_TEMPLATE_PATH_KEY in templatePaths[i]) 492 { 493 templatePaths[i] = templatePaths[i][START_ENTITY_TEMPLATE_PATH_KEY]; 494 } 495 else 496 { 497 var keys = []; 498 for (var key in templatePaths[i]) 499 keys.push(key); 500 warn("getTempatePathList: Starting entity list item has no template as defined in START_ENTITY_TEMPLATE_PATH_KEY (" + START_ENTITY_TEMPLATE_PATH_KEY + "): " + uneval(keys)); 501 return false; 502 } 503 } 504 var foundNew = 1; 505 while (foundNew > 0) 506 { 507 foundNew = 0; 508 var methods = [BUILDER_TEMPLATEPATH_KEYS, PRODUCTION_TEMPLATEPATH_KEYS]; 509 for (var m = 0; m < methods.length; m++) 510 { 511 for (var t = 0; t < templatePaths.length; t++) 512 { 513 var pathsToCheck = getTemplateValue(templatePaths[t], methods[m]); 514 if (typeof(pathsToCheck) === typeof("")) 515 { 516 pathsToCheck = pathsToCheck.split(/\s+/); 517 for (var c = 0; c < pathsToCheck.length; c++) 518 { 519 var actualPath = pathsToCheck[c].replace(CIV_PLACEHOLDER_STRING, civ); 520 if (templatePaths.indexOf(actualPath) == -1 && RMS.TemplateExists(actualPath)) 521 { 522 templatePaths.push(actualPath); 523 foundNew++; 524 } 525 } 526 } 527 } 528 } 529 } 530 return templatePaths; 531 } 532 406 533 function areAllies(player1, player2) 407 534 { 408 535 if ((g_MapSettings.PlayerData[player1+1].Team === undefined) || (g_MapSettings.PlayerData[player2+1].Team === undefined) || (g_MapSettings.PlayerData[player2+1].Team == -1) || (g_MapSettings.PlayerData[player1+1].Team == -1)) -
binaries/data/mods/public/maps/random/rmgen/misc.js
157 157 } 158 158 } 159 159 160 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 160 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 161 161 // placeCivDefaultEntities 162 162 // 163 163 // Creates the default starting player entities depending on the players civ 164 164 // fx&fy: position of player base 165 165 // playerid: id of player 166 166 // angle: angle of main base building, optional, default is BUILDING_ANGlE 167 // kwargs: Takes some optional keyword arguments to tweek things168 // 'iberWall': may be false, 'walls' (default) or 'towers'. Determines the defensive structures Iberians get as civ bonus167 // kwargs: Optional. Takes an associative array with keyword arguments to tweak things: 168 // Known keys: 'iberWall': may be false, 'walls' (default) or 'towers'. Determines the defensive structures Iberians get as civ bonus 169 169 // 170 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 170 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 171 171 function placeCivDefaultEntities(fx, fz, playerid, angle, kwargs) 172 172 { 173 173 // Unpack kwargs -
binaries/data/mods/public/maps/random/rmgen/wall_builder.js
37 37 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 38 38 // WallElement class definition 39 39 // 40 // Concept: If placed unrotated the wall's courseis towards positive Y (top) with "outside" right (+X) and "inside" left (-X) like unrotated entities has their drop-points right (in rmgen)41 // The courseof the wall will be changed by corners (bending != 0) and so the "inside"/"outside" direction40 // Concept: If placed unrotated the wall's build direction is towards positive Y (top) with "outside" right (+X) and "inside" left (-X) like unrotated entities has their drop-points right (in rmgen) 41 // The build direction of the wall will be changed by corners (bending != 0) and so the "inside"/"outside" direction 42 42 // 43 // type Descriptive string, example: "wallLong". NOTE: Not really needed. Mainly for custom wall elements and to get the wall element type in code44 // ent ity Optional. Template namestring of the entity to be placed, example: "structures/cart_wall_long". Default is undefined (No entity placed)45 // angle Optional. The angle (float) added to place the entity so "outside" is right when the wall element is placed unrotated. Default is 046 // width 47 // indent 48 // bending Optional. How the courseof the wall is changed after this element, positive is bending "in"/left/counter clockwise (like entity placement)43 // type Identification string. 44 // entPath Optional. Template entity path string of the entity to be placed, example: "structures/cart_wall_long". Default is undefined (No entity placed) 45 // angle Optional. Relative angle to the build direction. Default is 0 46 // width Optional. How far this wall element lengthens the wall (float), if unrotated the Y space needed. Default is 0 47 // indent Optional. The lateral indentation of the entity, drawn "inside" (positive values) or pushed "outside" (negative values). Default is 0 48 // bending Optional. How the build direction of the wall is changed after this element, positive is bending "in"/left/counter clockwise (like entity placement) 49 49 // NOTE: Bending is not supported by all placement functions (see there) 50 50 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 51 function WallElement(type, ent ity, angle, width, indent, bending)51 function WallElement(type, entPath, angle, width, indent, bending) 52 52 { 53 53 this.type = type; 54 // Default wall element type documentation: 55 // Lengthening straight blocking (mainly left/right symmetric) wall elements (Walls and wall fortifications) 56 // "wall" A blocking straight wall element that mainly lengthens the wall, self-explanatory 57 // "wallShort" self-explanatory 58 // "wallLong" self-explanatory 59 // "tower" A blocking straight wall element with damage potential (but for palisades) that slightly lengthens the wall, example: wall tower, palisade tower(No attack) 60 // "wallFort" A blocking straight wall element with massive damage potential that lengthens the wall, example: fortress, palisade fort 61 // Lengthening straight non/custom blocking (mainly left/right symmetric) wall elements (Gates and entries) 62 // "gate" A blocking straight wall element with passability determined by owner, example: gate (Functionality not yet implemented) 63 // "entry" A non-blocking straight wall element (same width as gate) but without an actual template or just a flag/column/obelisk 64 // "entryTower" A non-blocking straight wall element (same width as gate) represented by a single (maybe indented) template, example: defence tower, wall tower, outpost, watchtower 65 // "entryFort" A non-blocking straight wall element represented by a single (maybe indented) template, example: fortress, palisade fort 66 // Bending wall elements (Wall corners) 67 // "cornerIn" A wall element bending the wall by PI/2 "inside" (left, +, see above), example: wall tower, palisade curve 68 // "cornerOut" A wall element bending the wall by PI/2 "outside" (right, -, see above), example: wall tower, palisade curve 69 // "cornerHalfIn" A wall element bending the wall by PI/4 "inside" (left, +, see above), example: wall tower, palisade curve. NOTE: Not yet implemented 70 // "cornerHalfOut" A wall element bending the wall by PI/4 "outside" (right, -, see above), example: wall tower, palisade curve. NOTE: Not yet implemented 71 // Zero length straight indented (mainly left/right symmetric) wall elements (Outposts/watchtowers and non-defensive base structures) 72 // "outpost" A zero-length wall element without bending far indented so it stands outside the wall, example: outpost, defence tower, watchtower 73 // "house" A zero-length wall element without bending far indented so it stands inside the wall that grants population bonus, example: house, hut, longhouse 74 // "barracks" A zero-length wall element without bending far indented so it stands inside the wall that grants unit production, example: barracks, tavern, ... 75 this.entity = entity; 76 this.angle = (angle !== undefined) ? angle : 0*PI; 54 this.entPath = entPath; 55 this.angle = (angle !== undefined) ? angle : 0; 77 56 this.width = (width !== undefined) ? width : 0; 78 57 this.indent = (indent !== undefined) ? indent : 0; 79 this.bending = (bending !== undefined) ? bending : 0 *PI;58 this.bending = (bending !== undefined) ? bending : 0; 80 59 } 81 60 82 61 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// … … 86 65 // It's mainly the abstract shape defined in a Fortress instances wall because different styles can be used for it (see wallStyles) 87 66 // 88 67 // type Descriptive string, example: "tiny". Not really needed (WallTool.wallTypes["type string"] is used). Mainly for custom wall elements 89 // wall Optional. Array of wall element strings. Can be set afterwards. Default is an e pty array.68 // wall Optional. Array of wall element strings. Can be set afterwards. Default is an empty array. 90 69 // Example: ["entrance", "wall", "cornerIn", "wall", "gate", "wall", "entrance", "wall", "cornerIn", "wall", "gate", "wall", "cornerIn", "wall"] 91 70 // centerToFirstElement Optional. Object with properties "x" and "y" representing a vector from the visual center to the first wall element. Default is undefined 92 71 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 93 72 function Fortress(type, wall, centerToFirstElement) 94 73 { 95 this.type = type; // Only usefull to get the type of the actual fortress74 this.type = type; 96 75 this.wall = (wall !== undefined) ? wall : []; 97 76 this.centerToFirstElement = undefined; 98 77 } … … 107 86 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 108 87 var wallStyles = {}; 109 88 110 // Generic civ dependent wall style definition. "rome_siege" needs some tweek... 111 var wallScaleByType = {"athen" : 1.5, "brit" : 1.5, "cart" : 1.8, "gaul" : 1.5, "iber" : 1.5, "mace" : 1.5, "maur": 1.5, "pers" : 1.5, "ptol" : 1.5, "rome" : 1.5, "sele" : 1.5, "spart" : 1.5, "rome_siege" : 1.5}; 89 // Get wall element width by template file path and angle 90 function getTemplateWidthByAngle(entPath, angle) 91 { 92 var template = RMS.GetTemplate(entPath); 93 var width = getTemplateValue(entPath, ["WallPiece", "Length"]) / CELL_SIZE; 94 95 return width; 96 } 97 98 // Add new WallElement by it's properties 99 function addNewWallElement(style, type, angle) 100 { 101 var templatePath = "structures/" + style + "_" + type 102 wallStyles[style][type] = new WallElement(type, templatePath, angle, getTemplateWidthByAngle(templatePath, angle)); 103 } 104 105 // Find all wall sets by civ to be then put into wallStyles 106 var entitiesByCiv = {}; 107 var civList = getCivList(); 108 for (var i = 0; i < civList.length; i++) 109 { 110 var civ = civList[i]; 111 var templatePathList = getTempatePathList(civ); 112 entitiesByCiv[civ] = templatePathList; 113 } 114 115 // Generic civ dependent wall style definition. Some, e.g. "rome_siege" needs tweaking... 116 var wallScaleByType = {}; // To be removed TODO 117 var civData = getFullCivData(); 118 for (var i = 0; i < civList.length; i++) 119 { 120 var civ = civList[i]; 121 var wallSets = civData[civ].WallSets; 122 if (wallSets.hasOwnProperty("Stone")) 123 wallScaleByType[civ] = wallSets.Stone.Scale; 124 } 125 // Non-civ but civ specific wall styles 126 wallScaleByType.rome_siege = 1.5; 112 127 for (var style in wallScaleByType) 113 128 { 114 129 var civ = style; … … 116 131 civ = "rome"; 117 132 wallStyles[style] = {}; 118 133 // Default wall elements 119 wallStyles[style]["tower"] = new WallElement("tower", "structures/" + style + "_wall_tower", PI, wallScaleByType[style]); 134 var templatePath = "structures/" + style + "_wall_tower"; 135 var angle = PI; 136 var width = getTemplateWidthByAngle(templatePath, angle); // DEBUG 137 log("getTemplateWidthByAngle(" + templatePath + ") = " + width + ", used to be width = " + wallScaleByType[style]); // DEBUG 138 // wallStyles[style]["tower"] = new WallElement("tower", templatePath, angle, width);//wallScaleByType[style]); 139 addNewWallElement(style, "wall_tower", PI); 140 wallStyles[style]["tower"] = wallStyles[style]["wall_tower"]; // Shortcut 141 120 142 wallStyles[style]["endLeft"] = new WallElement("endLeft", "structures/" + style + "_wall_tower", PI, wallScaleByType[style]); // Same as tower. To be compatible with palisades... 121 143 wallStyles[style]["endRight"] = new WallElement("endRight", "structures/" + style + "_wall_tower", PI, wallScaleByType[style]); // Same as tower. To be compatible with palisades... 122 144 wallStyles[style]["cornerIn"] = new WallElement("cornerIn", "structures/" + style + "_wall_tower", 5*PI/4, 0, 0.35*wallScaleByType[style], PI/2); // 2^0.5 / 4 ~= 0.35 ~= 1/3 123 145 wallStyles[style]["cornerOut"] = new WallElement("cornerOut", "structures/" + style + "_wall_tower", 3*PI/4, 0.71*wallScaleByType[style], 0, -PI/2); // // 2^0.5 / 2 ~= 0.71 ~= 2/3 146 147 var templatePath = "structures/" + style + "_wall_short"; // DEBUG 148 var angle = 0*PI; // DEBUG 149 var width = getTemplateWidthByAngle(templatePath, angle); // DEBUG 150 log("getTemplateWidthByAngle(" + templatePath + ") = " + width + ", used to be width = " + 2*wallScaleByType[style]); // DEBUG 124 151 wallStyles[style]["wallShort"] = new WallElement("wallShort", "structures/" + style + "_wall_short", 0*PI, 2*wallScaleByType[style]); 152 153 var templatePath = "structures/" + style + "_wall_medium"; // DEBUG 154 var angle = 0*PI; // DEBUG 155 var width = getTemplateWidthByAngle(templatePath, angle); // DEBUG 156 log("getTemplateWidthByAngle(" + templatePath + ") = " + width + ", used to be width = " + 4*wallScaleByType[style]); // DEBUG 125 157 wallStyles[style]["wall"] = new WallElement("wall", "structures/" + style + "_wall_medium", 0*PI, 4*wallScaleByType[style]); 158 126 159 wallStyles[style]["wallMedium"] = new WallElement("wall", "structures/" + style + "_wall_medium", 0*PI, 4*wallScaleByType[style]); 160 161 var templatePath = "structures/" + style + "_wall_long"; // DEBUG 162 var angle = 0*PI; // DEBUG 163 var width = getTemplateWidthByAngle(templatePath, angle); // DEBUG 164 log("getTemplateWidthByAngle(" + templatePath + ") = " + width + ", used to be width = " + 6*wallScaleByType[style]); // DEBUG 127 165 wallStyles[style]["wallLong"] = new WallElement("wallLong", "structures/" + style + "_wall_long", 0*PI, 6*wallScaleByType[style]); 166 128 167 // Gate and entrance wall elements 129 168 var gateWidth = 6*wallScaleByType[style]; 169 170 var templatePath = "structures/" + style + "_wall_gate"; // DEBUG 171 var angle = PI; // DEBUG 172 var width = getTemplateWidthByAngle(templatePath, angle); // DEBUG 173 log("getTemplateWidthByAngle(" + templatePath + ") = " + width + ", used to be width = " + 6*wallScaleByType[style]); // DEBUG 130 174 wallStyles[style]["gate"] = new WallElement("gate", "structures/" + style + "_wall_gate", PI, gateWidth); 175 131 176 wallStyles[style]["entry"] = new WallElement("entry", undefined, 0*PI, gateWidth); 132 177 wallStyles[style]["entryTower"] = new WallElement("entryTower", "structures/" + civ + "_defense_tower", PI, gateWidth, -4*wallScaleByType[style]); 133 178 wallStyles[style]["entryFort"] = new WallElement("entryFort", "structures/" + civ + "_fortress", 0*PI, 8*wallScaleByType[style], 6*wallScaleByType[style]); … … 150 195 wallStyles[style]["space3"] = new WallElement("space3", undefined, 0*PI, 3*wallScaleByType[style]); 151 196 wallStyles[style]["space4"] = new WallElement("space4", undefined, 0*PI, 4*wallScaleByType[style]); 152 197 } 153 // Add wall fortresses for all generic styles154 wallStyles["athen"]["wallFort"] = new WallElement("wallFort", "structures/athen_fortress", 2*PI/2 /* PI/2 */, 5.1 /* 5.6 */, 1.9 /* 1.9 */);155 wallStyles["brit"]["wallFort"] = new WallElement("wallFort", "structures/brit_fortress", PI, 2.8);156 wallStyles["cart"]["wallFort"] = new WallElement("wallFort", "structures/cart_fortress", PI, 5.1, 1.6);157 wallStyles["gaul"]["wallFort"] = new WallElement("wallFort", "structures/gaul_fortress", PI, 4.2, 1.5);158 wallStyles["iber"]["wallFort"] = new WallElement("wallFort", "structures/iber_fortress", PI, 5, 0.2);159 wallStyles["mace"]["wallFort"] = new WallElement("wallFort", "structures/mace_fortress", 2*PI/2 /* PI/2 */, 5.1 /* 5.6 */, 1.9 /* 1.9 */);160 wallStyles["maur"]["wallFort"] = new WallElement("wallFort", "structures/maur_fortress", PI, 5.5);161 wallStyles["pers"]["wallFort"] = new WallElement("wallFort", "structures/pers_fortress", PI, 5.6/*5.5*/, 1.9/*1.7*/);162 wallStyles["ptol"]["wallFort"] = new WallElement("wallFort", "structures/ptol_fortress", 2*PI/2 /* PI/2 */, 5.1 /* 5.6 */, 1.9 /* 1.9 */);163 wallStyles["rome"]["wallFort"] = new WallElement("wallFort", "structures/rome_fortress", PI, 6.3, 2.1);164 wallStyles["sele"]["wallFort"] = new WallElement("wallFort", "structures/sele_fortress", 2*PI/2 /* PI/2 */, 5.1 /* 5.6 */, 1.9 /* 1.9 */);165 wallStyles["spart"]["wallFort"] = new WallElement("wallFort", "structures/spart_fortress", 2*PI/2 /* PI/2 */, 5.1 /* 5.6 */, 1.9 /* 1.9 */);166 198 // Adjust "rome_siege" style 167 wallStyles["rome_siege"]["wallFort"] = new WallElement("wallFort", "structures/rome_army_camp", PI, 7.2, 2);168 wallStyles["rome_siege"]["entryFort"] = new WallElement("entryFort", "structures/rome_army_camp", PI, 12, 7);169 199 wallStyles["rome_siege"]["house"] = new WallElement("house", "structures/rome_tent", PI, 0, 4); 170 200 171 201 // Add special wall styles not well to implement generic (and to show how custom styles can be added) … … 178 208 wallStyles["palisades"]["wallLong"] = new WallElement("wall", "other/palisades_rocks_long", 0*PI, 3.5); 179 209 wallStyles["palisades"]["wallShort"] = new WallElement("wall", "other/palisades_rocks_short", 0*PI, 1.2); 180 210 wallStyles["palisades"]["tower"] = new WallElement("tower", "other/palisades_rocks_tower", -PI/2, 0.7); 181 wallStyles["palisades"]["wallFort"] = new WallElement("wallFort", "other/palisades_rocks_fort", PI, 1.7);211 // wallStyles["palisades"]["wallFort"] = new WallElement("wallFort", "other/palisades_rocks_fort", PI, 1.7); 182 212 wallStyles["palisades"]["gate"] = new WallElement("gate", "other/palisades_rocks_gate", PI, 3.6); 183 213 wallStyles["palisades"]["entry"] = new WallElement("entry", undefined, wallStyles["palisades"]["gate"].angle, wallStyles["palisades"]["gate"].width); 184 214 wallStyles["palisades"]["entryTower"] = new WallElement("entryTower", "other/palisades_rocks_watchtower", 0*PI, wallStyles["palisades"]["gate"].width, -3); … … 208 238 wallStyles["road"]["tLeft"] = new WallElement("road", "actor|props/special/eyecandy/road_temperate_intersect_T.xml", PI, 4.5, 1.25); 209 239 wallStyles["road"]["tRight"] = new WallElement("road", "actor|props/special/eyecandy/road_temperate_intersect_T.xml", 0*PI, 4.5, -1.25); 210 240 211 // Add special wall element collection "other"212 // NOTE: This is not a wall style in the common sense. Use with care!213 wallStyles["other"] = {};214 wallStyles["other"]["fence"] = new WallElement("fence", "other/fence_long", -PI/2, 3.1);215 wallStyles["other"]["fence_medium"] = new WallElement("fence", "other/fence_long", -PI/2, 3.1);216 wallStyles["other"]["fence_short"] = new WallElement("fence_short", "other/fence_short", -PI/2, 1.5);217 wallStyles["other"]["fence_stone"] = new WallElement("fence_stone", "other/fence_stone", -PI/2, 2.5);218 wallStyles["other"]["palisade"] = new WallElement("palisade", "other/palisades_rocks_short", 0, 1.2);219 wallStyles["other"]["column"] = new WallElement("column", "other/column_doric", 0, 1);220 wallStyles["other"]["obelisk"] = new WallElement("obelisk", "other/obelisk", 0, 2);221 wallStyles["other"]["spike"] = new WallElement("spike", "other/palisades_angle_spike", -PI/2, 1);222 wallStyles["other"]["bench"] = new WallElement("bench", "other/bench", PI/2, 1.5);223 wallStyles["other"]["benchForTable"] = new WallElement("benchForTable", "other/bench", 0, 0.5);224 wallStyles["other"]["table"] = new WallElement("table", "other/table_rectangle", 0, 1);225 wallStyles["other"]["table_square"] = new WallElement("table_square", "other/table_square", PI/2, 1);226 wallStyles["other"]["flag"] = new WallElement("flag", "special/rallypoint", PI, 1);227 wallStyles["other"]["standing_stone"] = new WallElement("standing_stone", "gaia/special_ruins_standing_stone", PI, 1);228 wallStyles["other"]["settlement"] = new WallElement("settlement", "gaia/special_settlement", PI, 6);229 wallStyles["other"]["gap"] = new WallElement("gap", undefined, 0, 2);230 wallStyles["other"]["gapSmall"] = new WallElement("gapSmall", undefined, 0, 1);231 wallStyles["other"]["gapLarge"] = new WallElement("gapLarge", undefined, 0, 4);232 wallStyles["other"]["cornerIn"] = new WallElement("cornerIn", undefined, 0, 0, 0, PI/2);233 wallStyles["other"]["cornerOut"] = new WallElement("cornerOut", undefined, 0, 0, 0, -PI/2);234 241 235 236 242 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 237 243 // fortressTypes data structure for some default fortress types 238 244 // … … 339 345 { 340 346 var element = wallStyles[style][wall[i]]; 341 347 if (element === undefined && i == 0) 342 warn("No valid wall element: " + wall[i]);348 warn("No valid wall element: style = " + style + ", wall[" + i + "] = " + wall[i] + ", wallStyles[" + style + "][wall[" + i + "]] = " + wallStyles[style][wall[i]] + ", element = " + element + ", wall = " + wall); 343 349 // Indentation 344 350 var placeX = wallX - element.indent * cos(orientation); 345 351 var placeY = wallY - element.indent * sin(orientation); 346 352 // Add wall elements entity placement arguments to the alignment 347 alignment.push({"x": placeX, "y": placeY, "ent ity": element.entity, "angle":orientation + element.angle});353 alignment.push({"x": placeX, "y": placeY, "entPath": element.entPath, "angle":orientation + element.angle}); 348 354 // Preset vars for the next wall element 349 355 if (i+1 < wall.length) 350 356 { 351 357 orientation += element.bending; 352 358 var nextElement = wallStyles[style][wall[i+1]]; 353 359 if (nextElement === undefined) 354 warn("No valid wall element: " + wall[i+1]);360 warn("No valid wall element: style = " + style + ", wall[" + (i+1) + "] = " + wall[i+1] + ", wallStyles[" + style + "][wall[" + (i+1) + "]] = " + wallStyles[style][wall[i+1]] + ", nextElement = " + uneval(nextElement) + ", wall = " + wall); 355 361 var distance = (element.width + nextElement.width)/2; 356 362 // Corrections for elements with indent AND bending 357 363 var indent = element.indent; … … 427 433 // Places a wall with wall elements attached to another like determined by WallElement properties. 428 434 // 429 435 // startX, startY Where the first wall element should be placed 430 // wall Array of wall element type strings. Example: ["endLeft", "wallLong", "tower", "wallLong", "endRight"]436 // wall Array of wall element types. Example: ["endLeft", "wallLong", "tower", "wallLong", "endRight"] 431 437 // style Optional. Wall style string. Default is the civ of the given player, "palisades" for gaia 432 438 // playerId Optional. Number of the player the wall will be placed for. Default is 0 (gaia) 433 439 // orientation Optional. Angle the first wall element is placed. Default is 0 … … 455 461 // Place the wall 456 462 for (var iWall = 0; iWall < wall.length; iWall++) 457 463 { 458 var ent ity = AM[iWall].entity;459 if (ent ity!== undefined)460 placeObject(AM[iWall].x, AM[iWall].y, ent ity, playerId, AM[iWall].angle);464 var entPath = AM[iWall].entPath; 465 if (entPath !== undefined) 466 placeObject(AM[iWall].x, AM[iWall].y, entPath, playerId, AM[iWall].angle); 461 467 } 462 468 } 463 469 … … 526 532 // 527 533 // startX/startY Coordinate of the approximate beginning of the wall (Not the place of the first wall element) 528 534 // targetX/targetY Coordinate of the approximate ending of the wall (Not the place of the last wall element) 529 // wallPart Optional. An array of NON-BENDING wall element type strings. Default is ["tower", "wallLong"]535 // wallPart Optional. An array of NON-BENDING wall element types. Default is ["tower", "wallLong"] 530 536 // style Optional. Wall style string. Default is the civ of the given player, "palisades" for gaia 531 537 // playerId Optional. Integer number of the player. Default is 0 (gaia) 532 538 // endWithFirst Optional. A boolean value. If true the 1st wall element in the wallPart array will finalize the wall. Default is true … … 552 558 { 553 559 var bending = wallStyles[style][wallPart[elementIndex]].bending; 554 560 if (bending != 0) 555 warn("Bending is not supported by placeLinearWall but a bending wall element is used: " + wallPart[elementIndex] + " -> wallStyles[style][wallPart[elementIndex]].ent ity");561 warn("Bending is not supported by placeLinearWall but a bending wall element is used: " + wallPart[elementIndex] + " -> wallStyles[style][wallPart[elementIndex]].entPath"); 556 562 } 557 563 // Setup number of wall parts 558 564 var totalLength = getDistance(startX, startY, targetX, targetY); … … 588 594 var placeX = x - wallEle.indent * sin(wallAngle); 589 595 var placeY = y + wallEle.indent * cos(wallAngle); 590 596 // Placement 591 var ent ity = wallEle.entity;592 if (ent ity!== undefined)593 placeObject(placeX, placeY, ent ity, playerId, placeAngle + wallEle.angle);597 var entPath = wallEle.entPath; 598 if (entPath !== undefined) 599 placeObject(placeX, placeY, entPath, playerId, placeAngle + wallEle.angle); 594 600 x += scaleFactor * wallEle.width/2 * cos(wallAngle); 595 601 y += scaleFactor * wallEle.width/2 * sin(wallAngle); 596 602 } … … 600 606 var wallEle = wallStyles[style][wallPart[0]]; 601 607 x += scaleFactor * wallEle.width/2 * cos(wallAngle); 602 608 y += scaleFactor * wallEle.width/2 * sin(wallAngle); 603 var ent ity = wallEle.entity;604 if (ent ity!== undefined)605 placeObject(x, y, ent ity, playerId, placeAngle + wallEle.angle);609 var entPath = wallEle.entPath; 610 if (entPath !== undefined) 611 placeObject(x, y, entPath, playerId, placeAngle + wallEle.angle); 606 612 } 607 613 } 608 614 … … 615 621 // 616 622 // centerX/Y Coordinates of the circle's center 617 623 // radius How wide the circle should be (approximate, especially if maxBendOff != 0) 618 // wallPart Optional. An array of NON-BENDING wall element type strings. Default is ["tower", "wallLong"]624 // wallPart Optional. An array of NON-BENDING wall element types. Default is ["tower", "wallLong"] 619 625 // style Optional. Wall style string. Default is the civ of the given player, "palisades" for gaia 620 626 // playerId Optional. Integer number of the player. Default is 0 (gaia) 621 627 // orientation Optional. Where the open part of the (circular) arc should face (if maxAngle is < 2*PI). Default is 0 … … 624 630 // maxBendOff Optional. How irregular the circle should be. 0 means regular circle, PI/2 means very irregular. Default is 0 (regular circle) 625 631 // 626 632 // NOTE: Don't use wall elements with bending like corners! 627 // TODO: Perhaps add eccentricity and maxBendOff functionality (untill now an unused argument) 633 // TODO: Perhaps add eccentricity 634 // TODO: Check if maxBendOff parameter works in all cases 628 635 // TODO: Perhaps add functionality for spirals 629 636 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 630 637 function placeCircularWall(centerX, centerY, radius, wallPart, style, playerId, orientation, maxAngle, endWithFirst, maxBendOff) … … 652 659 653 660 // Check arguments 654 661 if (maxBendOff > PI/2 || maxBendOff < 0) 655 warn("placeCircularWall maxBendOff s ould satisfy 0 < maxBendOff < PI/2 (~1.5) but it is: " + maxBendOff);662 warn("placeCircularWall maxBendOff should satisfy 0 < maxBendOff < PI/2 (~1.5) but it is: " + maxBendOff); 656 663 for (var elementIndex = 0; elementIndex < wallPart.length; elementIndex++) 657 664 { 658 665 var bending = wallStyles[style][wallPart[elementIndex]].bending; … … 699 706 placeX -= wallEle.indent * cos(placeAngle); 700 707 placeY -= wallEle.indent * sin(placeAngle); 701 708 // Placement 702 var ent ity = wallEle.entity;703 if (ent ity!== undefined)704 placeObject(placeX, placeY, ent ity, playerId, placeAngle + wallEle.angle);709 var entPath = wallEle.entPath; 710 if (entPath !== undefined) 711 placeObject(placeX, placeY, entPath, playerId, placeAngle + wallEle.angle); 705 712 // Prepare for the next wall element 706 713 actualAngle += addAngle; 707 714 x = centerX + radius*cos(actualAngle); … … 717 724 var placeX = x + (targetX - x)/2; 718 725 var placeY = y + (targetY - y)/2; 719 726 var placeAngle = actualAngle + addAngle/2; 720 placeObject(placeX, placeY, wallEle.ent ity, playerId, placeAngle + wallEle.angle);727 placeObject(placeX, placeY, wallEle.entPath, playerId, placeAngle + wallEle.angle); 721 728 } 722 729 } 723 730 … … 728 735 // 729 736 // centerX/Y Coordinates of the polygon's center 730 737 // radius How wide the circle should be in which the polygon fits 731 // wallPart Optional. An array of NON-BENDING wall element type strings. Default is ["wallLong", "tower"]738 // wallPart Optional. An array of NON-BENDING wall element types. Default is ["wallLong", "tower"] 732 739 // cornerWallElement Optional. Wall element to be placed at the polygon's corners. Default is "tower" 733 740 // style Optional. Wall style string. Default is the civ of the given player, "palisades" for gaia 734 741 // playerId Optional. Integer number of the player. Default is 0 (gaia) … … 769 776 for (var i = 0; i < numCorners; i++) 770 777 { 771 778 var angleToCorner = getAngle(corners[i][0], corners[i][1], centerX, centerY); 772 placeObject(corners[i][0], corners[i][1], wallStyles[style][cornerWallElement].ent ity, playerId, angleToCorner);779 placeObject(corners[i][0], corners[i][1], wallStyles[style][cornerWallElement].entPath, playerId, angleToCorner); 773 780 if (!(skipFirstWall && i == 0)) 774 781 { 775 782 placeLinearWall( … … 899 906 for (var i = 0; i < numCorners; i++) 900 907 { 901 908 var angleToCorner = getAngle(corners[i][0], corners[i][1], centerX, centerY); 902 placeObject(corners[i][0], corners[i][1], wallStyles[style][cornerWallElement].ent ity, playerId, angleToCorner);909 placeObject(corners[i][0], corners[i][1], wallStyles[style][cornerWallElement].entPath, playerId, angleToCorner); 903 910 if (!(skipFirstWall && i == 0)) 904 911 { 905 912 placeLinearWall( … … 996 1003 var wallElement = "wallLong"; 997 1004 if ((pointIndex + 1) % gateOccurence == 0) 998 1005 wallElement = "gate"; 999 var ent ity = wallStyles[style][wallElement].entity;1000 if (ent ity)1006 var entPath = wallStyles[style][wallElement].entPath; 1007 if (entPath) 1001 1008 { 1002 1009 placeObject(startX + (getDistance(startX, startY, targetX, targetY)/2)*cos(angle), // placeX 1003 1010 startY + (getDistance(startX, startY, targetX, targetY)/2)*sin(angle), // placeY 1004 ent ity, playerId, angle - PI/2 + wallStyles[style][wallElement].angle);1011 entPath, playerId, angle - PI/2 + wallStyles[style][wallElement].angle); 1005 1012 } 1006 1013 // Place tower 1007 1014 var startX = centerX + bestPointDerivation[(pointIndex + bestPointDerivation.length - 1) % bestPointDerivation.length][0]; 1008 1015 var startY = centerY + bestPointDerivation[(pointIndex + bestPointDerivation.length - 1) % bestPointDerivation.length][1]; 1009 1016 var angle = getAngle(startX, startY, targetX, targetY); 1010 placeObject(centerX + bestPointDerivation[pointIndex][0], centerY + bestPointDerivation[pointIndex][1], wallStyles[style]["tower"].ent ity, playerId, angle - PI/2 + wallStyles[style]["tower"].angle);1017 placeObject(centerX + bestPointDerivation[pointIndex][0], centerY + bestPointDerivation[pointIndex][1], wallStyles[style]["tower"].entPath, playerId, angle - PI/2 + wallStyles[style]["tower"].angle); 1011 1018 } 1012 1019 } -
binaries/data/mods/public/maps/random/schwarzwald.js
131 131 // Setup paths 132 132 var pathSucsessRadius = baseRadius/2; 133 133 var pathAngleOff = PI/2; 134 var pathWidth = 10; // This is not really the path's thickness in tiles but the number of tiles in the clum bs of the path134 var pathWidth = 10; // This is not really the path's thickness in tiles but the number of tiles in the clumps of the path 135 135 136 136 // Setup additional resources 137 137 var resourceRadius = 2*mapRadius/3; // 3*mapRadius/8; … … 232 232 // 233 233 //////////////// 234 234 235 // Some heightmap constants236 const MIN_HEIGHT = - SEA_LEVEL; // -20237 const MAX_HEIGHT = 0xFFFF/HEIGHT_UNITS_PER_METRE - SEA_LEVEL; // A bit smaller than 90238 239 235 // Get the diferrence between minimum and maxumum height 240 236 function getMinAndMaxHeight(reliefmap) 241 237 { -
binaries/data/mods/public/maps/random/wall_demo.js
62 62 var actualX = distToMapBorder; 63 63 var actualY = distToMapBorder; 64 64 // Wall styles are chosen by strings so the civ strings got by getCivCode() can be used 65 // Other styles may be present as well but besides the civ styles only 'palisades' includes all wall element types (yet) 66 const wallStyleList = ["athen", "brit", "cart", "gaul", "iber", "mace", "maur", "pers", "ptol", "rome", "sele", "spart", "rome_siege", "palisades"]; 65 var wallStyleList = getCivList(); 66 // Other styles may be available as well... 67 wallStyleList.push("rome_siege"); 68 wallStyleList.push("palisades"); 69 // Check if all wall styles are present and remove unknown ones 70 for (var i = 0; i < wallStyleList.length; i++) 71 if (!wallStyles.hasOwnProperty(wallStyleList[i])) 72 wallStyleList.splice(i, 1); 67 73 68 74 69 75 //////////////////////////////////////// 70 76 // Custom wall placement (element based) 71 77 //////////////////////////////////////// 72 var wall = ['endLeft', 'wallLong', 'tower', ' wall', 'outpost', 'wall', 'cornerOut', 'wall', 'cornerIn', 'wall', 'house', 'endRight', 'entryTower', 'endLeft', 'wallShort', 'barracks', 'gate', 'tower', 'wall', 'wallFort', 'wall', 'endRight'];78 var wall = ['endLeft', 'wallLong', 'tower', 'tower', 'tower', 'wall', 'outpost', 'wall', 'cornerOut', 'wall', 'cornerIn', 'wall', 'house', 'endRight', 'entryTower', 'endLeft', 'wallShort', 'barracks', 'gate', 'tower', 'wall', 'endRight']; 73 79 for (var styleIndex = 0; styleIndex < wallStyleList.length; styleIndex++) 74 80 { 75 81 var startX = actualX + styleIndex * buildableMapSize/wallStyleList.length; // X coordinate of the first wall element 76 82 var startY = actualY; // Y coordinate of the first wall element 77 var style = wallStyleList[styleIndex]; // //The wall's style like 'cart', 'iber', 'pers', 'rome', 'romeSiege' or 'palisades'78 var orientation = styleIndex * PI/64; // Orientation of the first wall element. 0 means 'outside' or 'front' is right (positive X, like object placement)83 var style = wallStyleList[styleIndex]; // The wall's style like 'cart', 'iber', 'pers', 'rome', 'romeSiege' or 'palisades' 84 var orientation = PI/16 * sin(styleIndex * PI/4); // Orientation of the first wall element. 0 means 'outside' or 'front' is right (positive X, like object placement in Atlas) 79 85 // That means the wall will be build towards top (positive Y) if no corners are used 80 86 var playerId = 0; // Owner of the wall (like in placeObject). 0 is Gaia, 1 is Player 1 (default color blue), ... 81 87 placeWall(startX, startY, wall, style, playerId, orientation); // Actually placing the wall … … 155 161 { 156 162 for (var wallIndex = 0; wallIndex < numWallsPerStyle; wallIndex++) 157 163 { 158 var startX = actualX + (styleIndex * numWallsPerStyle + wallIndex) * distToOtherWalls; // X coordinate the wall will start from164 var startX = actualX + (styleIndex * numWallsPerStyle + wallIndex) * buildableMapSize/wallStyleList.length/numWallsPerStyle; // X coordinate the wall will start from 159 165 var startY = actualY; // Y coordinate the wall will start from 160 166 var endX = startX; // X coordinate the wall will end 161 167 var endY = actualY + (wallIndex + 1) * maxWallLength/numWallsPerStyle; // Y coordinate the wall will end … … 167 173 // placeObject(endX, endY, 'other/obelisk', 0, 0*PI); // Place visual marker to see where exsactly the wall ends 168 174 } 169 175 } 170 actualX = distToMapBorder; // Reset actualX171 actualY += maxWallLength + distToOtherWalls; // Increase actualY for next wall placement method172 176 173 177 174 178 // Export map data -
binaries/data/mods/public/maps/random/wall_demo.json
2 2 "settings" : { 3 3 "Name" : "Wall Demo", 4 4 "Script" : "wall_demo.js", 5 "Description" : "A demonstration of wall placement methods/code in random maps. Very large map size is recommended.",5 "Description" : "A demonstration of wall placement methods/code in random maps. Giant map size is recommended!", 6 6 "BaseTerrain" : ["grass1"], 7 7 "BaseHeight" : 0, 8 8 "Keywords": ["demo"], -
binaries/data/mods/public/simulation/data/civs/athen.json
109 109 "Special":"Train heroes and research technology pertaining to heroes." 110 110 } 111 111 ], 112 "WallSets": 113 { 114 "Palisades": 115 { 116 "Template": "other/wallset_palisade", 117 "Scale": 0.55 118 }, 119 "Stone": 120 { 121 "Template": "structures/athen_wallset_stone", 122 "Scale": 1.5 123 } 124 }, 112 125 "StartEntities": 113 126 [ 114 127 { -
binaries/data/mods/public/simulation/data/civs/brit.json
87 87 "Special": "" 88 88 } 89 89 ], 90 "WallSets": 91 { 92 "Palisades": 93 { 94 "Template": "other/wallset_palisade", 95 "Scale": 0.55 96 }, 97 "Stone": 98 { 99 "Template": "structures/athen_wallset_stone", 100 "Scale": 1.5 101 } 102 }, 90 103 "StartEntities": 91 104 [ 92 105 { -
binaries/data/mods/public/simulation/data/civs/cart.json
112 112 "Special":"Hire Iberian mercenaries." 113 113 } 114 114 ], 115 "WallSets": 116 { 117 "Palisades": 118 { 119 "Template": "other/wallset_palisade", 120 "Scale": 0.55 121 }, 122 "Stone": 123 { 124 "Template": "structures/athen_wallset_stone", 125 "Scale": 1.8 126 } 127 }, 115 128 "StartEntities": 116 129 [ 117 130 { -
binaries/data/mods/public/simulation/data/civs/gaul.json
87 87 "Special": "" 88 88 } 89 89 ], 90 "WallSets": 91 { 92 "Palisades": 93 { 94 "Template": "other/wallset_palisade", 95 "Scale": 0.55 96 }, 97 "Stone": 98 { 99 "Template": "structures/athen_wallset_stone", 100 "Scale": 1.5 101 } 102 }, 90 103 "StartEntities": 91 104 [ 92 105 { -
binaries/data/mods/public/simulation/data/civs/iber.json
85 85 "Special": "Defensive Aura - Gives all Iberian units and buildings within vision range of the monument a 10-15% attack boost. Build Limit: Only 5 may be built per map." 86 86 } 87 87 ], 88 "WallSets": 89 { 90 "Palisades": 91 { 92 "Template": "other/wallset_palisade", 93 "Scale": 0.55 94 }, 95 "Stone": 96 { 97 "Template": "structures/athen_wallset_stone", 98 "Scale": 1.5 99 } 100 }, 88 101 "StartEntities": 89 102 [ 90 103 { -
binaries/data/mods/public/simulation/data/civs/mace.json
114 114 "Special":"Constructs and upgrades all Macedonian siege engines." 115 115 } 116 116 ], 117 "WallSets": 118 { 119 "Palisades": 120 { 121 "Template": "other/wallset_palisade", 122 "Scale": 0.55 123 }, 124 "Stone": 125 { 126 "Template": "structures/athen_wallset_stone", 127 "Scale": 1.5 128 } 129 }, 117 130 "StartEntities": 118 131 [ 119 132 { -
binaries/data/mods/public/simulation/data/civs/maur.json
94 94 "Special":"Contentment: +10% Health and +10% resource gathering rates for all citizens and allied citizens within its range. Can be built anywhere except in enemy territory. Max Built: 10." 95 95 } 96 96 ], 97 "WallSets": 98 { 99 "Palisades": 100 { 101 "Template": "other/wallset_palisade", 102 "Scale": 0.55 103 }, 104 "Stone": 105 { 106 "Template": "structures/athen_wallset_stone", 107 "Scale": 1.5 108 } 109 }, 97 110 "StartEntities": 98 111 [ 99 112 { -
binaries/data/mods/public/simulation/data/civs/pers.json
104 104 "Special": "Train heroes and Persian Immortals. Gives a slow trickle of all resources as 'Satrapy Tribute.'" 105 105 } 106 106 ], 107 "WallSets": 108 { 109 "Palisades": 110 { 111 "Template": "other/wallset_palisade", 112 "Scale": 0.55 113 }, 114 "Stone": 115 { 116 "Template": "structures/athen_wallset_stone", 117 "Scale": 1.5 118 } 119 }, 107 120 "StartEntities": 108 121 [ 109 122 { -
binaries/data/mods/public/simulation/data/civs/ptol.json
113 113 "Special":"When built along the shoreline, removes shroud of darkness over all the water, revealing all the coast lines on the map. Limit: 1." 114 114 } 115 115 ], 116 "WallSets": 117 { 118 "Palisades": 119 { 120 "Template": "other/wallset_palisade", 121 "Scale": 0.55 122 }, 123 "Stone": 124 { 125 "Template": "structures/athen_wallset_stone", 126 "Scale": 1.5 127 } 128 }, 116 129 "StartEntities": 117 130 [ 118 131 { -
binaries/data/mods/public/simulation/data/civs/rome.json
89 89 "Special": "Can be built in neutral and enemy territory to strangle enemy towns." 90 90 } 91 91 ], 92 "WallSets": 93 { 94 "Palisades": 95 { 96 "Template": "other/wallset_palisade", 97 "Scale": 0.55 98 }, 99 "Stone": 100 { 101 "Template": "structures/athen_wallset_stone", 102 "Scale": 1.5 103 }, 104 "Siege": 105 { 106 "Template": "structures/rome_wallset_siege", 107 "Scale": 1.5 108 } 109 }, 92 110 "StartEntities": 93 111 [ 94 112 { -
binaries/data/mods/public/simulation/data/civs/sele.json
114 114 "Special":"This is the Seleucid expansion building, similar to Civic Centers for other factions. It is weaker and carries a smaller territory influence, but is cheaper and built faster." 115 115 } 116 116 ], 117 "WallSets": 118 { 119 "Palisades": 120 { 121 "Template": "other/wallset_palisade", 122 "Scale": 0.55 123 }, 124 "Stone": 125 { 126 "Template": "structures/athen_wallset_stone", 127 "Scale": 1.5 128 } 129 }, 117 130 "StartEntities": 118 131 [ 119 132 { -
binaries/data/mods/public/simulation/data/civs/spart.json
105 105 "Special":"Train heroes and Spartiates and research technologies related to them." 106 106 } 107 107 ], 108 "WallSets": 109 { 110 "Palisades": 111 { 112 "Template": "other/wallset_palisade", 113 "Scale": 0.55 114 }, 115 "Stone": 116 { 117 "Template": "structures/athen_wallset_stone", 118 "Scale": 1.5 119 } 120 }, 108 121 "StartEntities": 109 122 [ 110 123 { -
binaries/data/mods/public/simulation/templates/structures/athen_wall_tower.xml
16 16 <Actor>structures/hellenes/wall_tower.xml</Actor> 17 17 </VisualActor> 18 18 <WallPiece> 19 <Length>7. 5</Length>19 <Length>7.0</Length> 20 20 </WallPiece> 21 21 </Entity> 22 No newline at end of file -
binaries/data/mods/public/simulation/templates/structures/brit_wall_tower.xml
20 20 <Actor>structures/celts/wall_tower.xml</Actor> 21 21 </VisualActor> 22 22 <WallPiece> 23 <Length> 9.0</Length>23 <Length>7.0</Length> 24 24 </WallPiece> 25 25 </Entity> -
binaries/data/mods/public/simulation/templates/structures/cart_wall_tower.xml
20 20 <FoundationActor>structures/fndn_3x3.xml</FoundationActor> 21 21 </VisualActor> 22 22 <WallPiece> 23 <Length>1 1.0</Length>23 <Length>10.5</Length> 24 24 </WallPiece> 25 25 </Entity> -
binaries/data/mods/public/simulation/templates/structures/gaul_wall_tower.xml
20 20 <Actor>structures/celts/wall_tower.xml</Actor> 21 21 </VisualActor> 22 22 <WallPiece> 23 <Length> 9.0</Length>23 <Length>7.0</Length> 24 24 </WallPiece> 25 25 </Entity> -
binaries/data/mods/public/simulation/templates/structures/iber_wall_tower.xml
21 21 <Actor>structures/iberians/wall_tower.xml</Actor> 22 22 </VisualActor> 23 23 <WallPiece> 24 <Length> 10</Length>24 <Length>8.5</Length> 25 25 </WallPiece> 26 26 </Entity> -
binaries/data/mods/public/simulation/templates/structures/mace_wall_tower.xml
16 16 <Actor>structures/hellenes/wall_tower.xml</Actor> 17 17 </VisualActor> 18 18 <WallPiece> 19 <Length>7. 5</Length>19 <Length>7.0</Length> 20 20 </WallPiece> 21 21 </Entity> 22 No newline at end of file -
binaries/data/mods/public/simulation/templates/structures/maur_wall_tower.xml
25 25 <Actor>structures/mauryans/wall_tower.xml</Actor> 26 26 </VisualActor> 27 27 <WallPiece> 28 <Length> 9.5</Length>28 <Length>7.0</Length> 29 29 </WallPiece> 30 30 </Entity> -
binaries/data/mods/public/simulation/templates/structures/pers_wall_tower.xml
16 16 <Actor>structures/persians/wall_tower.xml</Actor> 17 17 </VisualActor> 18 18 <WallPiece> 19 <Length> 8.5</Length>19 <Length>7.5</Length> 20 20 </WallPiece> 21 21 </Entity> -
binaries/data/mods/public/simulation/templates/structures/ptol_wall_tower.xml
16 16 <Actor>structures/ptolemies/wall_tower.xml</Actor> 17 17 </VisualActor> 18 18 <WallPiece> 19 <Length> 10</Length>19 <Length>6.5</Length> 20 20 </WallPiece> 21 21 </Entity> 22 No newline at end of file -
binaries/data/mods/public/simulation/templates/structures/rome_siege_wall_tower.xml
43 43 <Actor>structures/romans/siege_wall_tower.xml</Actor> 44 44 </VisualActor> 45 45 <WallPiece> 46 <Length> 6.0</Length>46 <Length>5.5</Length> 47 47 </WallPiece> 48 48 </Entity> -
binaries/data/mods/public/simulation/templates/structures/rome_wall_tower.xml
16 16 <Actor>structures/romans/wall_tower.xml</Actor> 17 17 </VisualActor> 18 18 <WallPiece> 19 <Length> 9.5</Length>19 <Length>8.0</Length> 20 20 </WallPiece> 21 21 </Entity> -
binaries/data/mods/public/simulation/templates/structures/sele_wall_tower.xml
16 16 <Actor>structures/hellenes/wall_tower.xml</Actor> 17 17 </VisualActor> 18 18 <WallPiece> 19 <Length>7. 5</Length>19 <Length>7.0</Length> 20 20 </WallPiece> 21 21 </Entity> 22 No newline at end of file -
binaries/data/mods/public/simulation/templates/structures/spart_wall_tower.xml
16 16 <Actor>structures/hellenes/wall_tower.xml</Actor> 17 17 </VisualActor> 18 18 <WallPiece> 19 <Length>7. 5</Length>19 <Length>7.0</Length> 20 20 </WallPiece> 21 21 </Entity> 22 No newline at end of file