diff --git a/binaries/data/mods/public/simulation/ai/petra/config.js b/binaries/data/mods/public/simulation/ai/petra/config.js index 7db9960556..d86d46157c 100644 --- a/binaries/data/mods/public/simulation/ai/petra/config.js +++ b/binaries/data/mods/public/simulation/ai/petra/config.js @@ -55,10 +55,9 @@ m.Config = function(difficulty) "structures/{civ}_embassy_italiote" ], "gaul": [ "structures/{civ}_rotarymill", "structures/{civ}_tavern" ], "iber": [ "structures/{civ}_monument" ], - "mace": [ "structures/{civ}_siege_workshop", "structures/{civ}_library", - "structures/{civ}_theatron" ], + "mace": [ "structures/{civ}_library", "structures/{civ}_theatron" ], "maur": [ "structures/{civ}_elephant_stables", "structures/{civ}_pillar_ashoka" ], - "pers": [ "structures/{civ}_stables", "structures/{civ}_apadana", "structures/{civ}_hall"], + "pers": [ "structures/{civ}_apadana", "structures/{civ}_hall"], "ptol": [ "structures/{civ}_library" ], "rome": [ "structures/{civ}_army_camp" ], "sele": [ "structures/{civ}_library" ], diff --git a/binaries/data/mods/public/simulation/ai/petra/headquarters.js b/binaries/data/mods/public/simulation/ai/petra/headquarters.js index 54a71e936a..df459a88aa 100644 --- a/binaries/data/mods/public/simulation/ai/petra/headquarters.js +++ b/binaries/data/mods/public/simulation/ai/petra/headquarters.js @@ -1746,41 +1746,56 @@ m.HQ.prototype.constructTrainingBuildings = function(gameState, queues) if (this.saveResources && !this.canBarter || queues.militaryBuilding.hasQueuedUnits()) return; - if (this.canBuild(gameState, "structures/{civ}_barracks")) - { - let barrackNb = gameState.getOwnEntitiesByClass("Barracks", true).length; - if (this.saveResources && barrackNb > 0) - return; + let numBarracks = this.canBuild(gameState, "structures/{civ}_barracks") ? gameState.getOwnEntitiesByClass("Barracks", true).length : -1; + let numStables = this.canBuild(gameState, "structures/{civ}_stables") ? gameState.getOwnEntitiesByClass("Stables", true).length : -1; + if (this.saveResources && numBarracks != 0) + return; - // first barracks. - if (!barrackNb && (gameState.getPopulation() > this.Config.Military.popForBarracks1 || - this.phasing == 2 && gameState.getOwnStructures().filter(API3.Filters.byClass("Village")).length < 5)) + if (gameState.getPopulation() > this.Config.Military.popForBarracks1 || + this.phasing == 2 && gameState.getOwnStructures().filter(API3.Filters.byClass("Village")).length < 5) + { + // first barracks and stables. + if (numBarracks == 0) { gameState.ai.queueManager.changePriority("militaryBuilding", 2*this.Config.priorities.militaryBuilding); - let preferredBase = this.findBestBaseForMilitary(gameState); - let plan = new m.ConstructionPlan(gameState, "structures/{civ}_barracks", { "preferredBase": preferredBase }); + let metadata = { "preferredBase": this.findBestBaseForMilitary(gameState) }; + let plan = new m.ConstructionPlan(gameState, "structures/{civ}_barracks", metadata); plan.queueToReset = "militaryBuilding"; queues.militaryBuilding.addPlan(plan); return; } - // second barracks, then 3rd barrack, and optional 4th for some civs as they rely on barracks more. - if (barrackNb == 1 && gameState.getPopulation() > this.Config.Military.popForBarracks2) + if (numStables == 0) { - let preferredBase = this.findBestBaseForMilitary(gameState); - queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_barracks", { "preferredBase": preferredBase })); + let metadata = { "preferredBase": this.findBestBaseForMilitary(gameState) }; + queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_stables", metadata)); return; } - if (barrackNb == 2 && gameState.getPopulation() > this.Config.Military.popForBarracks2 + 20) + + // Second barracks and stables, then 3rd barrack, and optional 4th for some civs as they rely on barracks more. + if (numBarracks == 1 && gameState.getPopulation() > this.Config.Military.popForBarracks2) { - let preferredBase = this.findBestBaseForMilitary(gameState); - queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_barracks", { "preferredBase": preferredBase })); + let metadata = { "preferredBase": this.findBestBaseForMilitary(gameState) }; + queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_barracks", metadata)); return; } - if (barrackNb == 3 && gameState.getPopulation() > this.Config.Military.popForBarracks2 + 50 && - (gameState.getPlayerCiv() === "gaul" || gameState.getPlayerCiv() === "brit" || gameState.getPlayerCiv() === "iber")) + if (numStables == 1 && gameState.getPopulation() > this.Config.Military.popForBarracks2) { - let preferredBase = this.findBestBaseForMilitary(gameState); - queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_barracks", { "preferredBase": preferredBase })); + let metadata = { "preferredBase": this.findBestBaseForMilitary(gameState) }; + queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_stables", metadata)); + return; + } + + // Then 3rd barracks/stables if needed + if (numBarracks == 2 && numStables == -1 && gameState.getPopulation() > this.Config.Military.popForBarracks2 + 30) + { + let metadata = { "preferredBase": this.findBestBaseForMilitary(gameState) }; + queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_barracks", metadata)); + return; + } + if (numBarracks == -1 && numStables == 2 && gameState.getPopulation() > this.Config.Military.popForBarracks2 + 30) + { + let metadata = { "preferredBase": this.findBestBaseForMilitary(gameState) }; + queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_stables", metadata)); return; } } @@ -1788,7 +1803,18 @@ m.HQ.prototype.constructTrainingBuildings = function(gameState, queues) if (this.saveResources) return; - if (this.currentPhase < 3 || gameState.getPopulation() < 80 || !this.bAdvanced.length) + if (this.currentPhase < 3) + return; + + let numWorkshop = this.canBuild(gameState, "structures/{civ}_siege_workshop") ? gameState.getOwnEntitiesByClass("Workshop", true).length : -1; + if (numWorkshop == 0) + { + let metadata = { "preferredBase": this.findBestBaseForMilitary(gameState) }; + queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_siege_workshop", metadata)); + return; + } + + if (gameState.getPopulation() < 80 || !this.bAdvanced.length) return; //build advanced military buildings @@ -1807,8 +1833,8 @@ m.HQ.prototype.constructTrainingBuildings = function(gameState, queues) continue; if (template.hasDefensiveFire() || template.trainableEntities()) { - let preferredBase = this.findBestBaseForMilitary(gameState); - queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, advanced, { "preferredBase": preferredBase })); + let metadata = { "preferredBase": this.findBestBaseForMilitary(gameState) }; + queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, advanced, metadata)); } else // not a military building, but still use this queue queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, advanced)); diff --git a/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js b/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js index e0b9d66330..5488aadbd6 100644 --- a/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js +++ b/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js @@ -144,12 +144,9 @@ m.ConstructionPlan.prototype.findGoodPosition = function(gameState) let pos = gameState.ai.HQ.findDefensiveLocation(gameState, template); if (pos) return { "x": pos[0], "z": pos[1], "angle": 3*Math.PI/4, "base": pos[2] }; - - if (template.hasClass("DefenseTower") || gameState.getPlayerCiv() === "mace" || gameState.getPlayerCiv() === "maur" || - gameState.countEntitiesByType(gameState.applyCiv("structures/{civ}_fortress"), true) > 0 || - gameState.countEntitiesByType(gameState.applyCiv("structures/{civ}_army_camp"), true) > 0) + // if this fortress is our first one, just try the standard placement + if (!template.hasClass("Fortress") || gameState.getOwnEntitiesByClass("Fortress", true).hasEntities()) return false; - // if this fortress is our first siege unit builder, just try the standard placement as we want siege units } else if (template.hasClass("Market")) // Docks (i.e. NavalMarket) are done before { diff --git a/binaries/data/mods/public/simulation/templates/structures/mace_siege_workshop.xml b/binaries/data/mods/public/simulation/templates/structures/mace_siege_workshop.xml index 73d8fcec37..246bebd47b 100644 --- a/binaries/data/mods/public/simulation/templates/structures/mace_siege_workshop.xml +++ b/binaries/data/mods/public/simulation/templates/structures/mace_siege_workshop.xml @@ -19,6 +19,7 @@ Build siege engines. Research siege technologies. structures/siege_workshop.png phase_city + Workshop 75