diff --git a/binaries/data/mods/public/simulation/ai/petra/config.js b/binaries/data/mods/public/simulation/ai/petra/config.js
index ba5d99bec2..4a36117118 100644
--- a/binaries/data/mods/public/simulation/ai/petra/config.js
+++ b/binaries/data/mods/public/simulation/ai/petra/config.js
@@ -167,7 +167,7 @@ m.Config.prototype.setConfig = function(gameState)
// changing settings based on difficulty or personality
this.Military.towerLapseTime = Math.round(this.Military.towerLapseTime * (1.1 - 0.2 * this.personality.defensive));
this.Military.fortressLapseTime = Math.round(this.Military.fortressLapseTime * (1.1 - 0.2 * this.personality.defensive));
- this.priorities.defenseBuilding = Math.round(this.priorities.defenseBuilding * ( 0.9 + 0.2 * this.personality.defensive));
+ this.priorities.defenseBuilding = Math.round(this.priorities.defenseBuilding * (0.9 + 0.2 * this.personality.defensive));
if (this.difficulty < 2)
{
diff --git a/binaries/data/mods/public/simulation/ai/petra/headquarters.js b/binaries/data/mods/public/simulation/ai/petra/headquarters.js
index c91d336843..d48efbe3cb 100644
--- a/binaries/data/mods/public/simulation/ai/petra/headquarters.js
+++ b/binaries/data/mods/public/simulation/ai/petra/headquarters.js
@@ -1915,51 +1915,69 @@ m.HQ.prototype.constructTrainingBuildings = function(gameState, queues)
if (this.saveResources && !this.canBarter || queues.militaryBuilding.hasQueuedUnits())
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;
+ let numBarracks = gameState.getOwnEntitiesByClass("Barracks", true).length;
if (this.saveResources && numBarracks != 0)
return;
+ let barracksTemplate = this.canBuild(gameState, "structures/{civ}_barracks") ? "structures/{civ}_barracks" : undefined;
+
+ let rangeTemplate = this.canBuild(gameState, "structures/{civ}_range") ? "structures/{civ}_range" : undefined;
+ let numRanges = gameState.getOwnEntitiesByClass("Archery", true).length;
+ numBarracks -= numRanges;
+
+ let stableTemplate = this.canBuild(gameState, "structures/{civ}_stables") ? "structures/{civ}_stables" :
+ this.canBuild(gameState, "structures/{civ}_stable") ? "structures/{civ}_stable" : undefined;
+ let numStables = gameState.getOwnEntitiesByClass("Stables", true).length;
+
if (this.getAccountedPopulation(gameState) > this.Config.Military.popForBarracks1 ||
this.phasing == 2 && gameState.getOwnStructures().filter(API3.Filters.byClass("Village")).length < 5)
{
- // first barracks and stables.
- if (numBarracks == 0)
+ // first barracks/range and stables.
+ if (numBarracks + numRanges == 0)
{
- gameState.ai.queueManager.changePriority("militaryBuilding", 2*this.Config.priorities.militaryBuilding);
- let plan = new m.ConstructionPlan(gameState, "structures/{civ}_barracks", { "militaryBase": true });
- plan.queueToReset = "militaryBuilding";
- queues.militaryBuilding.addPlan(plan);
- return;
+ let template = barracksTemplate || rangeTemplate;
+ if (template)
+ {
+ gameState.ai.queueManager.changePriority("militaryBuilding", 2 * this.Config.priorities.militaryBuilding);
+ let plan = new m.ConstructionPlan(gameState, template, { "militaryBase": true });
+ plan.queueToReset = "militaryBuilding";
+ queues.militaryBuilding.addPlan(plan);
+ return;
+ }
}
- if (numStables == 0)
+ if (numStables == 0 && stableTemplate)
{
- queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_stables", { "militaryBase": true }));
+ queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, stableTemplate, { "militaryBase": true }));
return;
}
- // Second barracks and stables
- if (numBarracks == 1 && this.getAccountedPopulation(gameState) > this.Config.Military.popForBarracks2)
+ // Second range/barracks and stables
+ if (numBarracks + numRanges == 1 && this.getAccountedPopulation(gameState) > this.Config.Military.popForBarracks2)
{
- queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_barracks", { "militaryBase": true }));
- return;
+ let template = numBarracks == 0 ? (barracksTemplate || rangeTemplate) : (rangeTemplate || barracksTemplate);
+ if (template)
+ {
+ if (template != barracksTemplate) API3.warn(" civ " + gameState.getPlayerCiv() + " rototo B template " + template);
+ queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, template, { "militaryBase": true }));
+ return;
+ }
}
- if (numStables == 1 && this.getAccountedPopulation(gameState) > this.Config.Military.popForBarracks2)
+ if (numStables == 1 && stableTemplate && this.getAccountedPopulation(gameState) > this.Config.Military.popForBarracks2)
{
- queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_stables", { "militaryBase": true }));
+ queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, stableTemplate, { "militaryBase": true }));
return;
}
- // Then 3rd barracks/stables if needed
- if (numBarracks == 2 && numStables == -1 && this.getAccountedPopulation(gameState) > this.Config.Military.popForBarracks2 + 30)
+ // Then 3rd barracks/range/stables if needed
+ if (numBarracks + numRanges + numStables == 2 && this.getAccountedPopulation(gameState) > this.Config.Military.popForBarracks2 + 30)
{
- queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_barracks", { "militaryBase": true }));
- return;
- }
- if (numBarracks == -1 && numStables == 2 && this.getAccountedPopulation(gameState) > this.Config.Military.popForBarracks2 + 30)
- {
- queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, "structures/{civ}_stables", { "militaryBase": true }));
- return;
+ let template = barracksTemplate || stableTemplate || rangeTemplate;
+ if (template)
+ {
+ if (template != barracksTemplate) API3.warn(" civ " + gameState.getPlayerCiv() + " rototo C template " + template);
+ queues.militaryBuilding.addPlan(new m.ConstructionPlan(gameState, template, { "militaryBase": true }));
+ return;
+ }
}
}
diff --git a/binaries/data/mods/public/simulation/templates/template_structure_military_barracks_range.xml b/binaries/data/mods/public/simulation/templates/template_structure_military_barracks_range.xml
index cd161d1cca..aadc9dabc6 100644
--- a/binaries/data/mods/public/simulation/templates/template_structure_military_barracks_range.xml
+++ b/binaries/data/mods/public/simulation/templates/template_structure_military_barracks_range.xml
@@ -4,9 +4,10 @@
Infantry -Cavalry
+ Archery
Archery Range
- Train citizen-soldier ranged infantry. Research training improvements.
structures/range.png
+ Train citizen-soldier ranged infantry. Research training improvements.
0.8