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