Index: binaries/data/mods/public/simulation/ai/common-api/entity.js
===================================================================
--- binaries/data/mods/public/simulation/ai/common-api/entity.js (revision 21899)
+++ binaries/data/mods/public/simulation/ai/common-api/entity.js (working copy)
@@ -335,7 +335,28 @@
return undefined;
return templates.replace(/\{native\}/g, this.civ()).replace(/\{civ\}/g, civ).split(/\s+/);
},
+
+ "upgradableEntity": function(civ) {
+ // missing choices
+ let choices = this.get("Upgrade");
+ if (!choices)
+ return undefined;
+ return choices;
+ },
+
+ "upgradeCost": function(civ) {
+ if (!this.get("Upgrade/Cost"))
+ return;
+
+ let ret = {};
+ for (let type in this.get("Upgrade/Cost/Resources"))
+ ret[type] = +this.get("Upgrade/Cost/Resources/" + type);
+
+ warn(uneval(ret));
+ return ret;
+ },
+
"researchableTechs": function(gameState, civ) {
let templates = this.get("ProductionQueue/Technologies/_string");
if (!templates)
Index: binaries/data/mods/public/simulation/ai/petra/config.js
===================================================================
--- binaries/data/mods/public/simulation/ai/petra/config.js (revision 21899)
+++ binaries/data/mods/public/simulation/ai/petra/config.js (working copy)
@@ -70,6 +70,7 @@
"structures/{civ}_royal_stoa"]
};
+// heres where the goddamn queus are initialized!
this.priorities =
{
"villager": 30, // should be slightly lower than the citizen soldier one to not get all the food
@@ -89,6 +90,7 @@
"majorTech": 700,
"minorTech": 40,
"wonder": 1000,
+ "entityUpgrading": 80,
"emergency": 1000 // used only in emergency situations, should be the highest one
};
Index: binaries/data/mods/public/simulation/ai/petra/headquarters.js
===================================================================
--- binaries/data/mods/public/simulation/ai/petra/headquarters.js (revision 21899)
+++ binaries/data/mods/public/simulation/ai/petra/headquarters.js (working copy)
@@ -1891,6 +1891,31 @@
plan.queueToReset = "defenseBuilding";
queues.defenseBuilding.addPlan(plan);
}
+
+ // Check for possible upgrades and do them if not saving resources
+ if (!this.saveResource)
+ {
+ let upgradableDefenses = gameState.getOwnEntitiesByClass("SentryTower", true).toEntityArray();
+ //warn(uneval(upgradableDefenses));
+
+ for (let ent of upgradableDefenses)
+ {
+ let upgradleEnt = ent.upgradableEntity();
+ let chosenUpgrade;
+ for (let choice of Object.keys(upgradableEnt))
+ {
+ // TODO Some fancy decision making
+ chosenUpgrade = choice;
+ }
+
+ let template = gameState.applyCiv(upgradableEnt[chosenUpgrade].Entity);
+ let plan = new m.UpgradePlan(gameState, ent, template);
+ let queue = "entityUpgrading";
+ plan.queueToReset = queue;
+ queues.entityUpgrading.addPlan(plan);
+ warn("added a queue");
+ }
+ }
};
m.HQ.prototype.buildBlacksmith = function(gameState, queues)
Index: binaries/data/mods/public/simulation/ai/petra/queueplanTraining.js
===================================================================
--- binaries/data/mods/public/simulation/ai/petra/queueplanTraining.js (revision 21899)
+++ binaries/data/mods/public/simulation/ai/petra/queueplanTraining.js (working copy)
@@ -1,7 +1,7 @@
var PETRA = function(m)
{
-m.TrainingPlan = function(gameState, type, metadata, number = 1, maxMerge = 5)
+m.TrainingPlan = function(gameState, type/*template_name*/, metadata, number = 1, maxMerge = 5)
{
if (!m.QueuePlan.call(this, gameState, type, metadata))
{
Index: binaries/data/mods/public/simulation/ai/petra/queueplanUpgrading.js
===================================================================
--- binaries/data/mods/public/simulation/ai/petra/queueplanUpgrading.js (nonexistent)
+++ binaries/data/mods/public/simulation/ai/petra/queueplanUpgrading.js (working copy)
@@ -0,0 +1,67 @@
+var PETRA = function(m)
+{
+
+m.UpgradePlan = function(gameState, ent, template)
+{
+ this.entity = ent;
+ this.template = template;
+ this.cost = new API3.Resources(this.entity.upgradeCost());
+ this.category = "upgrading";
+ return true;
+};
+
+m.UpgradePlan.prototype = Object.create(m.QueuePlan.prototype);
+
+m.UpgradePlan.prototype.canStart = function(gameState)
+{
+ let needed = false;
+ /*if (this.entity.requiredTech() && !gameState.isResearched(this.entity.requiredTech()))
+ return false;*/
+ needed = true;
+ if (needed)
+ return true;
+};
+
+m.UpgradePlan.prototype.start = function(gameState)
+{
+ Engine.PostCommand(PlayerID, {
+ "type": "upgrade",
+ "entities": [this.entity.id()],
+ "template": this.template,
+ "queued": false
+ });
+
+ this.onStart(gameState);
+};
+
+m.UpgradePlan.prototype.getCost = function()
+{
+ return this.cost;
+};
+
+m.UpgradePlan.prototype.onStart = function(gameState)
+{
+ if (this.queueToReset)
+ gameState.ai.queueManager.changePriority(this.queueToReset, gameState.ai.Config.priorities[this.queueToReset]);
+};
+
+m.UpgradePlan.prototype.Serialize = function()
+{
+ return {
+ "entity": this.entity,
+ "cost": this.cost.Serialize(),
+ "queueToReset": this.queueToReset || undefined
+ };
+};
+
+m.UpgradePlan.prototype.Deserialize = function(gameState, data)
+{
+ for (let key in data)
+ this[key] = data[key];
+
+ this.cost = new API3.Resources();
+ this.cost.Deserialize(data.cost);
+};
+
+return m;
+}(PETRA);