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"]);