diff --git a/binaries/data/mods/public/gui/reference/common/core.js b/binaries/data/mods/public/gui/reference/common/core.js
index 4801d0d548..24eb337478 100644
--- a/binaries/data/mods/public/gui/reference/common/core.js
+++ b/binaries/data/mods/public/gui/reference/common/core.js
@@ -104,7 +104,7 @@ function getTemplateListsFromUnit(templateName)
if (template.Builder && template.Builder.Entities._string)
for (let build of template.Builder.Entities._string.split(" "))
{
- build = build.replace("{civ}", g_SelectedCiv);
+ build = build.replace(/\{(civ|native)\}/g, g_SelectedCiv);
if (Engine.TemplateExists(build) && templateLists.structures.indexOf(build) === -1)
templateLists.structures.push(build);
}
@@ -114,7 +114,7 @@ function getTemplateListsFromUnit(templateName)
if (template.ProductionQueue.Entities)
for (let build of template.ProductionQueue.Entities._string.split(" "))
{
- build = build.replace("{civ}", g_SelectedCiv);
+ build = build.replace(/\{(civ|native)\}/g, g_SelectedCiv);
if (Engine.TemplateExists(build) && templateLists.units.indexOf(build) === -1)
templateLists.units.push(build);
}
@@ -158,7 +158,7 @@ function getTemplateListsFromStructure(templateName)
if (template.ProductionQueue.Entities && template.ProductionQueue.Entities._string)
for (let build of template.ProductionQueue.Entities._string.split(" "))
{
- build = build.replace("{civ}", g_SelectedCiv);
+ build = build.replace(/\{(civ|native)\}/g, g_SelectedCiv);
if (Engine.TemplateExists(build) && templateLists.units.indexOf(build) === -1)
templateLists.units.push(build);
}
diff --git a/binaries/data/mods/public/gui/reference/common/helper.js b/binaries/data/mods/public/gui/reference/common/helper.js
index ef1ed5ea7a..7ac987d61d 100644
--- a/binaries/data/mods/public/gui/reference/common/helper.js
+++ b/binaries/data/mods/public/gui/reference/common/helper.js
@@ -21,7 +21,7 @@ function getActualUpgradeData(upgradesInfo)
let newUpgrades = [];
for (let upgrade of upgradesInfo)
{
- upgrade.entity = upgrade.entity.replace("{civ}", g_SelectedCiv);
+ upgrade.entity = upgrade.entity.replace(/\{(civ|native)\}/g, g_SelectedCiv);
let data = GetTemplateDataHelper(loadTemplate(upgrade.entity), null, g_AuraData, g_ResourceData, g_DamageTypes);
data.cost = upgrade.cost;
diff --git a/binaries/data/mods/public/gui/reference/common/load.js b/binaries/data/mods/public/gui/reference/common/load.js
index 9f2f160156..088fba49d1 100644
--- a/binaries/data/mods/public/gui/reference/common/load.js
+++ b/binaries/data/mods/public/gui/reference/common/load.js
@@ -117,7 +117,7 @@ function loadUnit(templateName)
unit.production.units = [];
for (let build of template.ProductionQueue.Entities._string.split(" "))
{
- build = build.replace("{civ}", g_SelectedCiv);
+ build = build.replace(/\{(civ|native)\}/g, g_SelectedCiv);
if (Engine.TemplateExists(build))
unit.production.units.push(build);
}
@@ -147,7 +147,7 @@ function loadUnit(templateName)
unit.builder = [];
for (let build of template.Builder.Entities._string.split(" "))
{
- build = build.replace("{civ}", g_SelectedCiv);
+ build = build.replace(/\{(civ|native)\}/g, g_SelectedCiv);
if (Engine.TemplateExists(build))
unit.builder.push(build);
}
@@ -183,7 +183,7 @@ function loadStructure(templateName)
if (template.ProductionQueue.Entities && template.ProductionQueue.Entities._string)
for (let build of template.ProductionQueue.Entities._string.split(" "))
{
- build = build.replace("{civ}", g_SelectedCiv);
+ build = build.replace(/\{(civ|native)\}/g, g_SelectedCiv);
if (Engine.TemplateExists(build))
structure.production.units.push(build);
}
diff --git a/binaries/data/mods/public/simulation/components/Builder.js b/binaries/data/mods/public/simulation/components/Builder.js
index 1406614467..2f4f92e3e8 100644
--- a/binaries/data/mods/public/simulation/components/Builder.js
+++ b/binaries/data/mods/public/simulation/components/Builder.js
@@ -5,13 +5,13 @@ Builder.prototype.Schema =
"" +
"1.0" +
"" +
- "\n structures/{civ}_barracks\n structures/{civ}_civil_centre\n structures/pers_apadana\n " +
+ "\n structures/{civ}_barracks\n structures/{native}_civil_centre\n structures/pers_apadana\n " +
"" +
"" +
"" +
"" +
"" +
- "" +
+ "" +
"" +
"tokens" +
"" +
@@ -34,6 +34,10 @@ Builder.prototype.GetEntitiesList = function()
if (!cmpPlayer)
return [];
+ let cmpIdentity = Engine.QueryInterface(this.entity, IID_Identity);
+ if (cmpIdentity)
+ string = string.replace(/\{native\}/g, cmpIdentity.GetCiv());
+
let entities = string.replace(/\{civ\}/g, cmpPlayer.GetCiv()).split(/\s+/);
let disabledTemplates = cmpPlayer.GetDisabledTemplates();
diff --git a/binaries/data/mods/public/simulation/components/ProductionQueue.js b/binaries/data/mods/public/simulation/components/ProductionQueue.js
index c1fd3c01e6..65e88cb3dd 100644
--- a/binaries/data/mods/public/simulation/components/ProductionQueue.js
+++ b/binaries/data/mods/public/simulation/components/ProductionQueue.js
@@ -8,14 +8,14 @@ ProductionQueue.prototype.Schema =
"" +
"0.7" +
"" +
- "\n units/{civ}_support_female_citizen\n units/{civ}_support_trader\n units/athen_infantry_spearman_b\n " +
+ "\n units/{civ}_support_female_citizen\n units/{native}_support_trader\n units/athen_infantry_spearman_b\n " +
"" +
"" +
"" +
"" +
"" +
"" +
- "" +
+ "" +
"" +
"tokens" +
"" +
@@ -96,31 +96,33 @@ ProductionQueue.prototype.CalculateEntitiesList = function()
if (!this.template.Entities)
return;
- var string = this.template.Entities._string;
+ let string = this.template.Entities._string;
if (!string)
return;
- // Replace the "{civ}" codes with this entity's civ ID
- var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
- var cmpPlayer = QueryOwnerInterface(this.entity);
+ // Replace the "{civ}" and "{native}" codes with the owner's civ ID and entity's civ ID.
+ let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
+ let cmpPlayer = QueryOwnerInterface(this.entity);
if (!cmpPlayer)
return;
- var entitiesList = string.replace(/\{civ\}/g, cmpPlayer.GetCiv()).split(/\s+/);
+ let cmpIdentity = Engine.QueryInterface(this.entity, IID_Identity);
+ if (cmpIdentity)
+ string = string.replace(/\{native\}/g, cmpIdentity.GetCiv());
+
+ let entitiesList = string.replace(/\{civ\}/g, cmpPlayer.GetCiv()).split(/\s+/);
// filter out disabled and invalid entities
- var disabledEntities = cmpPlayer.GetDisabledTemplates();
- entitiesList = entitiesList.filter(
- function(v) { return !disabledEntities[v] && cmpTemplateManager.TemplateExists(v); }
- );
+ let disabledEntities = cmpPlayer.GetDisabledTemplates();
+ entitiesList = entitiesList.filter(ent => !disabledEntities[ent] && cmpTemplateManager.TemplateExists(ent));
// check if some templates need to show their advanced or elite version
- var upgradeTemplate = function(templateName)
+ let upgradeTemplate = function(templateName)
{
- var template = cmpTemplateManager.GetTemplate(templateName);
+ let template = cmpTemplateManager.GetTemplate(templateName);
while (template && template.Promotion !== undefined)
{
- var requiredXp = ApplyValueModificationsToTemplate("Promotion/RequiredXp", +template.Promotion.RequiredXp, cmpPlayer.GetPlayerID(), template);
+ let requiredXp = ApplyValueModificationsToTemplate("Promotion/RequiredXp", +template.Promotion.RequiredXp, cmpPlayer.GetPlayerID(), template);
if (requiredXp > 0)
break;
templateName = template.Promotion.Entity;
diff --git a/binaries/data/mods/public/simulation/components/tests/test_Builder.js b/binaries/data/mods/public/simulation/components/tests/test_Builder.js
index 7c33c5c89a..1051bf19cf 100644
--- a/binaries/data/mods/public/simulation/components/tests/test_Builder.js
+++ b/binaries/data/mods/public/simulation/components/tests/test_Builder.js
@@ -13,7 +13,7 @@ AddMock(SYSTEM_ENTITY, IID_TemplateManager, {
let cmpBuilder = ConstructComponent(builderId, "Builder", {
"Rate": 1.0,
- "Entities": { "_string": "structures/{civ}_barracks structures/{civ}_civil_centre" }
+ "Entities": { "_string": "structures/{civ}_barracks structures/{civ}_civil_centre structures/{native}_house" }
});
TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetEntitiesList(), []);
@@ -32,7 +32,11 @@ AddMock(builderId, IID_Ownership, {
"GetOwner": () => playerId
});
-TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetEntitiesList(), ["structures/iber_barracks", "structures/iber_civil_centre"]);
+AddMock(builderId, IID_Identity, {
+ "GetCiv": () => "iber"
+});
+
+TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetEntitiesList(), ["structures/iber_barracks", "structures/iber_civil_centre", "structures/iber_house"]);
AddMock(SYSTEM_ENTITY, IID_TemplateManager, {
"TemplateExists": name => name == "structures/iber_civil_centre"
@@ -50,7 +54,7 @@ AddMock(playerEntityID, IID_Player, {
"GetPlayerID": () => playerId
});
-TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetEntitiesList(), ["structures/iber_barracks", "structures/iber_civil_centre"]);
+TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetEntitiesList(), ["structures/iber_barracks", "structures/iber_civil_centre", "structures/iber_house"]);
AddMock(playerEntityID, IID_Player, {
"GetCiv": () => "iber",
@@ -58,7 +62,15 @@ AddMock(playerEntityID, IID_Player, {
"GetPlayerID": () => playerId
});
-TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetEntitiesList(), ["structures/iber_civil_centre"]);
+TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetEntitiesList(), ["structures/iber_civil_centre", "structures/iber_house"]);
+
+AddMock(playerEntityID, IID_Player, {
+ "GetCiv": () => "athen",
+ "GetDisabledTemplates": () => ({ "structures/athen_barracks": true }),
+ "GetPlayerID": () => playerId
+});
+
+TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetEntitiesList(), ["structures/athen_civil_centre", "structures/iber_house"]);
TS_ASSERT_UNEVAL_EQUALS(cmpBuilder.GetRange(), { "max": 2, "min": 0 });
diff --git a/binaries/data/mods/public/simulation/components/tests/test_ProductionQueue.js b/binaries/data/mods/public/simulation/components/tests/test_ProductionQueue.js
new file mode 100644
index 0000000000..d517f8a53e
--- /dev/null
+++ b/binaries/data/mods/public/simulation/components/tests/test_ProductionQueue.js
@@ -0,0 +1,87 @@
+Resources = {
+ "BuildSchema": (a, b) => {}
+};
+
+Engine.LoadHelperScript("Player.js");
+Engine.LoadComponentScript("interfaces/ProductionQueue.js");
+Engine.LoadComponentScript("ProductionQueue.js");
+
+const productionQueueId = 6;
+const playerId = 1;
+const playerEntityID = 2;
+
+AddMock(SYSTEM_ENTITY, IID_TemplateManager, {
+ "TemplateExists": () => true,
+ "GetTemplate": name => {}
+});
+
+let cmpProductionQueue = ConstructComponent(productionQueueId, "ProductionQueue", {
+ "Entities": { "_string": "units/{civ}_cavalry_javelinist_b units/{civ}_infantry_swordsman_b " +
+ "units/{native}_support_female_citizen" }
+});
+
+cmpProductionQueue.CalculateEntitiesList();
+TS_ASSERT_UNEVAL_EQUALS(cmpProductionQueue.GetEntitiesList(), []);
+
+AddMock(SYSTEM_ENTITY, IID_PlayerManager, {
+ "GetPlayerByID": id => playerEntityID
+});
+
+AddMock(playerEntityID, IID_Player, {
+ "GetCiv": () => "iber",
+ "GetDisabledTemplates": () => ({}),
+ "GetPlayerID": () => playerId
+});
+
+AddMock(productionQueueId, IID_Ownership, {
+ "GetOwner": () => playerId
+});
+
+AddMock(productionQueueId, IID_Identity, {
+ "GetCiv": () => "iber"
+});
+
+cmpProductionQueue.CalculateEntitiesList();
+TS_ASSERT_UNEVAL_EQUALS(cmpProductionQueue.GetEntitiesList(), ["units/iber_cavalry_javelinist_b", "units/iber_infantry_swordsman_b",
+ "units/iber_support_female_citizen"]);
+
+AddMock(SYSTEM_ENTITY, IID_TemplateManager, {
+ "TemplateExists": name => name == "units/iber_support_female_citizen",
+ "GetTemplate": name => {}
+});
+
+cmpProductionQueue.CalculateEntitiesList();
+TS_ASSERT_UNEVAL_EQUALS(cmpProductionQueue.GetEntitiesList(), ["units/iber_support_female_citizen"]);
+
+AddMock(SYSTEM_ENTITY, IID_TemplateManager, {
+ "TemplateExists": () => true,
+ "GetTemplate": name => {}
+});
+
+AddMock(playerEntityID, IID_Player, {
+ "GetCiv": () => "iber",
+ "GetDisabledTemplates": () => ({ "units/athen_infantry_swordsman_b": true }),
+ "GetPlayerID": () => playerId
+});
+
+cmpProductionQueue.CalculateEntitiesList();
+TS_ASSERT_UNEVAL_EQUALS(cmpProductionQueue.GetEntitiesList(), ["units/iber_cavalry_javelinist_b", "units/iber_infantry_swordsman_b",
+ "units/iber_support_female_citizen"]);
+
+AddMock(playerEntityID, IID_Player, {
+ "GetCiv": () => "iber",
+ "GetDisabledTemplates": () => ({ "units/iber_infantry_swordsman_b": true }),
+ "GetPlayerID": () => playerId
+});
+
+cmpProductionQueue.CalculateEntitiesList();
+TS_ASSERT_UNEVAL_EQUALS(cmpProductionQueue.GetEntitiesList(), ["units/iber_cavalry_javelinist_b", "units/iber_support_female_citizen"]);
+
+AddMock(playerEntityID, IID_Player, {
+ "GetCiv": () => "athen",
+ "GetDisabledTemplates": () => ({ "units/athen_infantry_swordsman_b": true }),
+ "GetPlayerID": () => playerId
+});
+
+cmpProductionQueue.CalculateEntitiesList();
+TS_ASSERT_UNEVAL_EQUALS(cmpProductionQueue.GetEntitiesList(), ["units/athen_cavalry_javelinist_b", "units/iber_support_female_citizen"]);