Index: binaries/data/mods/public/globalscripts/Templates.js =================================================================== --- binaries/data/mods/public/globalscripts/Templates.js +++ binaries/data/mods/public/globalscripts/Templates.js @@ -207,6 +207,17 @@ for (let damageType of damageTypes.GetTypes()) ret.attack[type].splash[damageType] = getAttackStat("Splash/" + damageType); } + + if (template.Attack[type].Bonuses) + { + ret.attack[type].bonuses = {}; + for (let bonus in template.Attack[type].Bonuses) { + ret.attack[type].bonuses[bonus] = { + "classes": template.Attack[type].Bonuses[bonus].Classes, + "multiplier": getAttackStat("Bonuses/" + bonus + "/Multiplier") + }; + } + } } } Index: binaries/data/mods/public/gui/common/tooltips.js =================================================================== --- binaries/data/mods/public/gui/common/tooltips.js +++ binaries/data/mods/public/gui/common/tooltips.js @@ -823,6 +823,43 @@ }); } +function getCountersTooltip(template) +{ + + if (!template.attack) + return ""; + + let result = []; + for (let attackType in template.attack) + { + if (!template.attack[attackType].bonuses) + continue; + + if (!Object.keys(template.attack[attackType].bonuses).some(key => template.attack[attackType].bonuses[key].multiplier != 1)) + continue; + + let string = headerFont(sprintf(translate("Counters %(attackType)s : "), { + "attackType": translate(attackType) + })); + + let bonusesBody = []; + for (let key in template.attack[attackType].bonuses) + { + let bonus = template.attack[attackType].bonuses[key]; + + if(bonus.multiplier == 1) + continue; + + bonusesBody.push(sprintf(translate("%(multiplier)s× vs %(classes)s"), { + "multiplier": bonus.multiplier, + "classes": translate(bonus.classes) + })); + } + result.push(string + bodyFont(bonusesBody.join(", "))); + } + return result.join("\n"); +} + function showTemplateViewerOnRightClickTooltip() { // Translation: Appears in a tooltip to indicate that right-clicking the corresponding GUI element will open the Template Details GUI page. Index: binaries/data/mods/public/gui/credits/texts/programming.json =================================================================== --- binaries/data/mods/public/gui/credits/texts/programming.json +++ binaries/data/mods/public/gui/credits/texts/programming.json @@ -83,6 +83,7 @@ {"nick": "falsevision", "name": "Mahdi Khodadadifard"}, {"nick": "fatherbushido", "name": "Nicolas Tisserand"}, {"nick": "fcxSanya", "name": "Alexander Olkhovskiy"}, + {"nick": "Feldfeld"}, {"nick": "FeXoR", "name": "Florian Finke"}, {"nick": "Fire Giant", "name": "Malte Schwarzkopf"}, {"name": "Fork AD"}, Index: binaries/data/mods/public/gui/reference/common/draw.js =================================================================== --- binaries/data/mods/public/gui/reference/common/draw.js +++ binaries/data/mods/public/gui/reference/common/draw.js @@ -14,6 +14,7 @@ getHealerTooltip, getAttackTooltip, getSplashDamageTooltip, + getCountersTooltip, getArmorTooltip, getGarrisonTooltip, getProjectilesTooltip, Index: binaries/data/mods/public/gui/session/selection_details.js =================================================================== --- binaries/data/mods/public/gui/session/selection_details.js +++ binaries/data/mods/public/gui/session/selection_details.js @@ -286,6 +286,7 @@ Engine.GetGUIObjectByName("attackAndArmorStats").tooltip = [ getAttackTooltip, getSplashDamageTooltip, + getCountersTooltip, getHealerTooltip, getArmorTooltip, getGatherTooltip, Index: binaries/data/mods/public/gui/session/selection_panels.js =================================================================== --- binaries/data/mods/public/gui/session/selection_panels.js +++ binaries/data/mods/public/gui/session/selection_panels.js @@ -982,6 +982,7 @@ getHealthTooltip, getAttackTooltip, getSplashDamageTooltip, + getCountersTooltip, getHealerTooltip, getArmorTooltip, getGarrisonTooltip, Index: binaries/data/mods/public/simulation/components/Attack.js =================================================================== --- binaries/data/mods/public/simulation/components/Attack.js +++ binaries/data/mods/public/simulation/components/Attack.js @@ -491,7 +491,18 @@ if (!template) template = this.template[type.split(".")[0]].Splash; - return template.Bonuses || null; + if (!template.Bonuses) + return null; + + // The value of template.Bonuses is readonly so clone it. + let bonuses = clone(template.Bonuses); + for (let bonusKey in bonuses) + { + let bonus = bonuses[bonusKey]; + bonus.Multiplier = ApplyValueModificationsToEntity("Attack/" + type + "/Bonuses/" + bonusKey + "/Multiplier", +bonus.Multiplier, this.entity); + } + + return bonuses; }; /** @@ -562,7 +573,7 @@ // TODO: Use unit rotation to implement x/z offsets. let deltaLaunchPoint = new Vector3D(0, this.template[type].Projectile.LaunchPoint["@y"], 0.0); let launchPoint = Vector3D.add(selfPosition, deltaLaunchPoint); - + let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual); if (cmpVisual) { Index: binaries/data/mods/public/simulation/components/GuiInterface.js =================================================================== --- binaries/data/mods/public/simulation/components/GuiInterface.js +++ binaries/data/mods/public/simulation/components/GuiInterface.js @@ -399,6 +399,17 @@ ret.attack[type].prepareTime = timers.prepare; ret.attack[type].repeatTime = timers.repeat; + let bonuses = cmpAttack.GetBonusTemplate(type); + if (bonuses) + { + ret.attack[type].bonuses = {}; + for (let bonus in bonuses) + ret.attack[type].bonuses[bonus] = { + "classes": bonuses[bonus].Classes, + "multiplier": bonuses[bonus].Multiplier + }; + } + if (type != "Ranged") { // not a ranged attack, set some defaults Index: binaries/data/mods/public/simulation/data/technologies/tower_watch.json =================================================================== --- binaries/data/mods/public/simulation/data/technologies/tower_watch.json +++ binaries/data/mods/public/simulation/data/technologies/tower_watch.json @@ -16,7 +16,14 @@ "researchTime": 40, "tooltip": "Post sentries to add one arrow to defensive towers.", "modifications": [ - { "value": "BuildingAI/DefaultArrowCount", "add": 1 } + { + "value": "BuildingAI/DefaultArrowCount", + "add": 1 + }, + { + "value": "Attack/Ranged/Bonuses/Bonus1/Multiplier", + "add": 5.0 + } ], "affects": ["DefenseTower"], "soundComplete": "interface/alarm/alarm_upgradearmory.xml" Index: binaries/data/mods/public/simulation/templates/structures/athen_defense_tower.xml =================================================================== --- binaries/data/mods/public/simulation/templates/structures/athen_defense_tower.xml +++ binaries/data/mods/public/simulation/templates/structures/athen_defense_tower.xml @@ -1,5 +1,19 @@ + + + 12 + 72 + 10 + 15 + + + Ship + 1.0 + + + + 15.0 Index: binaries/data/mods/public/simulation/templates/template_unit_cavalry_melee_spearman.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_cavalry_melee_spearman.xml +++ binaries/data/mods/public/simulation/templates/template_unit_cavalry_melee_spearman.xml @@ -22,7 +22,6 @@ Spear Cavalry Spearman - Counters: 1.5x vs. Cavalry. 1.1 Index: binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_spearman.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_spearman.xml +++ binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_spearman.xml @@ -32,7 +32,6 @@ Melee Spear Champion Cavalry Spearman - Counters: 1.5x vs. Cavalry. 1.1 Index: binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_pikeman.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_pikeman.xml +++ binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_pikeman.xml @@ -33,7 +33,6 @@ Melee Spear Pike Champion Pikeman - Counters: 3x vs. Cavalry. special/formations/syntagma special/formations/testudo Index: binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_spearman.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_spearman.xml +++ binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_spearman.xml @@ -32,7 +32,6 @@ Champion Spearman Melee Spear - Counters: 3x vs. Cavalry. special/formations/testudo Index: binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_pikeman.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_pikeman.xml +++ binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_pikeman.xml @@ -24,7 +24,6 @@ Melee Spear Pike Hero Pikeman - Counters: 3x vs. Cavalry. special/formations/testudo Index: binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_spearman.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_spearman.xml +++ binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_spearman.xml @@ -24,7 +24,6 @@ Melee Spear Hero Spearman - Counters: 3x vs. Cavalry. special/formations/testudo Index: binaries/data/mods/public/simulation/templates/template_unit_infantry_melee_pikeman.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_infantry_melee_pikeman.xml +++ binaries/data/mods/public/simulation/templates/template_unit_infantry_melee_pikeman.xml @@ -26,7 +26,6 @@ Spear Pike Pikeman - Counters: 3x vs. Cavalry. special/formations/syntagma Index: binaries/data/mods/public/simulation/templates/template_unit_infantry_melee_spearman.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_infantry_melee_spearman.xml +++ binaries/data/mods/public/simulation/templates/template_unit_infantry_melee_spearman.xml @@ -25,7 +25,6 @@ Spear Spearman - Counters: 3x vs. Cavalry. 5