diff --git a/binaries/data/mods/public/gui/reference/civinfo/Sections/Subsection.js b/binaries/data/mods/public/gui/reference/civinfo/Sections/Subsection.js index 8b7c1f84be..6055778092 100644 --- a/binaries/data/mods/public/gui/reference/civinfo/Sections/Subsection.js +++ b/binaries/data/mods/public/gui/reference/civinfo/Sections/Subsection.js @@ -11,8 +11,6 @@ class Subsection for (let auraCode of auraList) { let aura = this.page.TemplateParser.getAura(auraCode); - if (!aura.civ || aura.civ != civCode) - continue; captions.push(this.page.formatEntry( getEntityNames(aura), diff --git a/binaries/data/mods/public/gui/reference/civinfo/Sections/Subsections/BonusesSubsection.js b/binaries/data/mods/public/gui/reference/civinfo/Sections/Subsections/BonusesSubsection.js index 964d91fa43..4ec7ace8a5 100644 --- a/binaries/data/mods/public/gui/reference/civinfo/Sections/Subsections/BonusesSubsection.js +++ b/binaries/data/mods/public/gui/reference/civinfo/Sections/Subsections/BonusesSubsection.js @@ -29,7 +29,7 @@ class BonusesSubsection extends Subsection ); let teamBonuses = this.getAuraCaptions( - this.page.TemplateLoader.teamBonusAuraList, + this.page.TemplateParser.getPlayer(civCode).teambonuses, civCode ); teamBonuses.unshift( diff --git a/binaries/data/mods/public/gui/reference/common/TemplateLoader.js b/binaries/data/mods/public/gui/reference/common/TemplateLoader.js index eaa8668497..87a7ab3180 100644 --- a/binaries/data/mods/public/gui/reference/common/TemplateLoader.js +++ b/binaries/data/mods/public/gui/reference/common/TemplateLoader.js @@ -9,6 +9,7 @@ class TemplateLoader * Raw Data Caches. */ this.auraData = {}; + this.playerData = {}; this.technologyData = {}; this.templateData = {}; @@ -16,7 +17,6 @@ class TemplateLoader * Partly-composed data. */ this.autoResearchTechList = this.findAllAutoResearchedTechs(); - this.teamBonusAuraList = this.findAllTeamBonusAuras(); } /** @@ -71,6 +71,30 @@ class TemplateLoader return this.templateData[templateName]; } + /** + * Loads raw player template. + * + * Loads from local cache if data present, else from file system. + * + * If a civ doesn't have their own civ-specific template, + * then we return the generic template. + * + * @param {string} civCode + * @return {Object} Object containing raw template data. + */ + loadPlayerTemplate(civCode) + { + if (!(civCode in this.playerData)) + { + let templateName = this.buildPlayerTemplateName(civCode); + this.playerData[civCode] = Engine.GetTemplate(templateName); + + // No object keys need to be translated + } + + return this.playerData[civCode]; + } + /** * Loads raw technology template. * @@ -186,6 +210,22 @@ class TemplateLoader return DeriveModificationsFromTechnologies(techData); } + /** + * If a civ doesn't have its own civ-specific player template, + * this returns the name of the generic player template. + * + * @see simulation/helpers/Player.js GetPlayerTemplateName() + * (Which can't be combined with this due to different Engine contexts) + */ + buildPlayerTemplateName(civCode) + { + let templateName = this.PlayerPath + this.PlayerTemplatePrefix + civCode; + if (Engine.TemplateExists(templateName)) + return templateName; + + return this.PlayerPath + this.PlayerTemplateFallback; + } + /** * Crudely iterates through every tech JSON file and identifies those * that are auto-researched. @@ -204,33 +244,6 @@ class TemplateLoader return techList; } - /** - * Iterates through and loads all team bonus auras. - * - * We make an assumption in this method: that all team bonus auras are - * in a single folder. - * - * Team bonuses must have a "civ" attribute to indicate what civ they - * belong to. - * - * @return {array} List of teambonus auras - */ - findAllTeamBonusAuras() - { - let auraList = []; - let path = this.AuraPath + TemplateLoader.prototype.AuraTeamBonusSubpath; - for (let templateName of listFiles(path, ".json", true)) - { - let filename = TemplateLoader.prototype.AuraTeamBonusSubpath + templateName; - let data = this.loadAuraTemplate(filename); - if (!data || !data.civ) - continue; - - auraList.push(filename); - } - return auraList; - } - /** * A template may be a variant of another template, * eg. `*_house`, `*_trireme`, or a promotion. @@ -305,11 +318,17 @@ class TemplateLoader * It might be nice if we could get these from somewhere, instead of having them hardcoded here. */ TemplateLoader.prototype.AuraPath = "simulation/data/auras/"; -TemplateLoader.prototype.AuraTeamBonusSubpath = "teambonuses/"; +TemplateLoader.prototype.PlayerPath = "special/player/"; TemplateLoader.prototype.TechnologyPath = "simulation/data/technologies/"; TemplateLoader.prototype.DefaultCiv = "gaia"; +/** + * Expected prefix for player templates, and the file to use if a civ doesn't have its own. + */ +TemplateLoader.prototype.PlayerTemplatePrefix = "player_"; +TemplateLoader.prototype.PlayerTemplateFallback = "player"; + /** * Keys of template values that are to be translated on load. */ diff --git a/binaries/data/mods/public/gui/reference/common/TemplateParser.js b/binaries/data/mods/public/gui/reference/common/TemplateParser.js index ffe1e7cb29..988c2b8450 100644 --- a/binaries/data/mods/public/gui/reference/common/TemplateParser.js +++ b/binaries/data/mods/public/gui/reference/common/TemplateParser.js @@ -15,6 +15,7 @@ class TemplateParser this.techs = {}; this.phases = {}; this.modifiers = {}; + this.players = {}; this.phaseList = []; } @@ -33,6 +34,9 @@ class TemplateParser if (template.civ) parsed.civ = template.civ; + let affectedPlayers = template.affectedPlayers || this.AuraAffectedPlayerDefault; + parsed.affectsTeam = this.AuraTeamIndicators.some(indicator => affectedPlayers.includes(indicator)); + this.auras[auraName] = parsed; return this.auras[auraName]; } @@ -206,6 +210,28 @@ class TemplateParser return this.getTechnology(phaseCode, civCode); } + /** + * Load and parse the relevant player_{civ}.xml template. + */ + getPlayer(civCode) + { + if (civCode in this.players) + return this.players[civCode]; + + let template = this.TemplateLoader.loadPlayerTemplate(civCode); + let parsed = { + "teambonuses": [], + }; + + if (template.Auras) + for (let auraTemplateName of template.Auras._string.split(/\s+/)) + if (AuraTemplateExists(auraTemplateName) && this.getAura(auraTemplateName).affectsTeam) + parsed.teambonuses.push(auraTemplateName); + + this.players[civCode] = parsed; + return parsed; + } + /** * Provided with an array containing basic information about possible * upgrades, such as that generated by globalscript's GetTemplateDataHelper, @@ -340,3 +366,13 @@ class TemplateParser return finalReqs; } } + +// Default affected player token list to use if an aura doesn't explicitly give one. +// Keep in sync with simulation/components/Auras.js +TemplateParser.prototype.AuraAffectedPlayerDefault = + ["Player"]; + +// List of tokens that, if found in an aura's "affectedPlayers" attribute, indicate +// that the aura applies to team members. +TemplateParser.prototype.AuraTeamIndicators = + ["MutualAlly", "ExclusiveMutualAlly"]; diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/athen_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/athen_player_teambonus.json index 3ad6c321bf..77ecf29b3b 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/athen_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/athen_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["Warship"], "affectedPlayers": ["MutualAlly"], - "civ": "athen", "modifications": [ { "value": "Cost/BuildTime", "multiply": 0.75 } ], diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/brit_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/brit_player_teambonus.json index 36aeb027ea..f587d84cbf 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/brit_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/brit_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["Healer"], "affectedPlayers": ["MutualAlly"], - "civ": "brit", "modifications": [ { "value": "Cost/Resources/food", "multiply": 0.8 }, { "value": "Cost/Resources/wood", "multiply": 0.8 }, diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/cart_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/cart_player_teambonus.json index 96cbdbb8b7..1e5a7b88d7 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/cart_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/cart_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["Trade"], "affectedPlayers": ["MutualAlly"], - "civ": "cart", "modifications": [ { "value": "Market/InternationalBonus", "add": 0.1 } ], diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/gaul_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/gaul_player_teambonus.json index 472c3c1c23..f6a95d8057 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/gaul_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/gaul_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["Forge"], "affectedPlayers": ["MutualAlly"], - "civ": "gaul", "modifications": [ { "value": "ProductionQueue/TechCostMultiplier/food", "multiply": 0.85 }, { "value": "ProductionQueue/TechCostMultiplier/wood", "multiply": 0.85 }, diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/iber_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/iber_player_teambonus.json index 36724531d8..bba5581b3e 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/iber_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/iber_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["Citizen Javelineer"], "affectedPlayers": ["MutualAlly"], - "civ": "iber", "modifications": [ { "value": "Cost/Resources/food", "multiply": 0.9 }, { "value": "Cost/Resources/wood", "multiply": 0.9 }, diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/kush_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/kush_player_teambonus.json index 2ac9fa2610..17cae3eff6 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/kush_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/kush_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["Elephant"], "affectedPlayers": ["MutualAlly"], - "civ": "kush", "modifications": [ { "value": "Cost/BuildTime", "multiply": 0.8 }, { "value": "Cost/Resources/food", "multiply": 0.8 }, diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/mace_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/mace_player_teambonus.json index 2759207848..f40350cb5d 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/mace_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/mace_player_teambonus.json @@ -2,7 +2,6 @@ "type": "player", "affects": ["Player"], "affectedPlayers": ["MutualAlly"], - "civ": "mace", "modifications": [ { "value": "Player/BarterMultiplier/Sell/food", "multiply": 1.2 }, { "value": "Player/BarterMultiplier/Sell/wood", "multiply": 1.2 }, diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/maur_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/maur_player_teambonus.json index 445d2db0fb..4fdf79cca8 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/maur_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/maur_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["Temple"], "affectedPlayers": ["MutualAlly"], - "civ": "maur", "modifications": [ { "value": "Cost/BuildTime", "multiply": 0.5 }, { "value": "Cost/Resources/wood", "multiply": 0.5 }, diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/pers_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/pers_player_teambonus.json index 0601910110..4e3513e3f3 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/pers_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/pers_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["Trader !Ship"], "affectedPlayers": ["MutualAlly"], - "civ": "pers", "modifications": [ { "value": "Trader/GainMultiplier", "multiply": 1.15 } ], diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/ptol_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/ptol_player_teambonus.json index 8e5c051f94..bc473c5a58 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/ptol_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/ptol_player_teambonus.json @@ -2,7 +2,6 @@ "type": "player", "affects": ["Player"], "affectedPlayers": ["MutualAlly"], - "civ": "ptol", "modifications": [ { "value": "ResourceTrickle/Rates/food", "add": 1 } ], diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/rome_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/rome_player_teambonus.json index f1f8d0c0f8..9c50b94189 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/rome_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/rome_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["Citizen Infantry"], "affectedPlayers": ["MutualAlly"], - "civ": "rome", "modifications": [ { "value": "Cost/BuildTime", "multiply": 0.9 } ], diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/sele_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/sele_player_teambonus.json index 48b27147c2..069f8789df 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/sele_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/sele_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["CivilCentre"], "affectedPlayers": ["MutualAlly"], - "civ": "sele", "modifications": [ { "value": "Cost/Resources/food", "multiply": 0.8 }, { "value": "Cost/Resources/wood", "multiply": 0.8 }, diff --git a/binaries/data/mods/public/simulation/data/auras/teambonuses/spart_player_teambonus.json b/binaries/data/mods/public/simulation/data/auras/teambonuses/spart_player_teambonus.json index c7cd6f1b1a..64d58c7264 100644 --- a/binaries/data/mods/public/simulation/data/auras/teambonuses/spart_player_teambonus.json +++ b/binaries/data/mods/public/simulation/data/auras/teambonuses/spart_player_teambonus.json @@ -2,7 +2,6 @@ "type": "global", "affects": ["Citizen Infantry Spearman"], "affectedPlayers": ["MutualAlly"], - "civ": "spart", "modifications": [ { "value": "Health/Max", "multiply": 1.1 } ],