Index: binaries/data/mods/public/globalscripts/DamageTypes.js
===================================================================
--- binaries/data/mods/public/globalscripts/DamageTypes.js
+++ binaries/data/mods/public/globalscripts/DamageTypes.js
@@ -54,4 +54,19 @@
{
return this.damageTypeData[code] ? this.damageTypeData[code].name : code;
}
+
+ /**
+ * @returns whether to show the @param code damage type in the tooltip.
+ * The possible choices are "always", "nonzero", "never".
+ */
+ showInTooltip(code, value)
+ {
+ if (!this.damageTypeData[code])
+ return true;
+ if (this.damageTypeData[code] === "always")
+ return true;
+ if (this.damageTypeData[code] === "never")
+ return false;
+ return value !== 0;
+ }
}
Index: binaries/data/mods/public/globalscripts/Templates.js
===================================================================
--- binaries/data/mods/public/globalscripts/Templates.js
+++ binaries/data/mods/public/globalscripts/Templates.js
@@ -169,7 +169,7 @@
if (template.Resistance.Entity.Damage)
{
ret.resistance.Damage = {};
- for (let damageType in template.Resistance.Entity.Damage)
+ for (const damageType in template.Resistance.Entity.Damage)
ret.resistance.Damage[damageType] = getEntityValue("Resistance/Entity/Damage/" + damageType);
}
if (template.Resistance.Entity.Capture)
@@ -177,10 +177,10 @@
if (template.Resistance.Entity.ApplyStatus)
{
ret.resistance.ApplyStatus = {};
- for (let statusEffect in template.Resistance.Entity.ApplyStatus)
+ for (const statusEffect in template.Resistance.Entity.ApplyStatus)
ret.resistance.ApplyStatus[statusEffect] = {
- "blockChance": getEntityValue("Resistance/Entity/ApplyStatus/" + statusEffect + "/BlockChance"),
- "duration": getEntityValue("Resistance/Entity/ApplyStatus/" + statusEffect + "/Duration")
+ "blockChance": getEntityValue("Resistance/Entity/ApplyStatus/" + statusEffect + "/BlockChance") || 0,
+ "duration": getEntityValue("Resistance/Entity/ApplyStatus/" + statusEffect + "/Duration") || 1
};
}
}
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
@@ -205,7 +205,11 @@
details.push(getCaptureResistanceTooltip(template.resistance.Capture));
if (template.resistance.ApplyStatus)
- details.push(getStatusEffectsResistanceTooltip(template.resistance.ApplyStatus));
+ {
+ const tp = getStatusEffectsResistanceTooltip(template.resistance.ApplyStatus);
+ if (tp)
+ details.push(tp);
+ }
return details.length ? sprintf(translate("%(label)s\n%(details)s"), {
"label": headerFont(translate("Resistance:")),
@@ -217,11 +221,12 @@
{
if (!resistanceTypeTemplate)
return "";
-
+ const keys = Object.keys(resistanceTypeTemplate)
+ .filter(dmgType => g_DamageTypesMetadata.showInTooltip(dmgType, resistanceTypeTemplate[dmgType]));
return sprintf(translate("%(label)s %(details)s"), {
"label": headerFont(translate("Damage:")),
"details":
- g_DamageTypesMetadata.sort(Object.keys(resistanceTypeTemplate)).map(
+ g_DamageTypesMetadata.sort(keys).map(
dmgType => sprintf(translate("%(damage)s %(damageType)s %(resistancePercentage)s"), {
"damage": resistanceTypeTemplate[dmgType].toFixed(1),
"damageType": unitFont(translateWithContext("damage type", g_DamageTypesMetadata.getName(dmgType))),
@@ -258,44 +263,79 @@
{
if (!resistanceTypeTemplate)
return "";
+ const keys = Object.keys(resistanceTypeTemplate)
+ .filter(statusEffect => resistanceTypeTemplate[statusEffect].blockChance > 0 ||
+ resistanceTypeTemplate[statusEffect].duration !== 1);
+ if (!keys.length)
+ return "";
return sprintf(translate("%(label)s %(details)s"), {
"label": headerFont(translate("Status Effects:")),
- "details":
- Object.keys(resistanceTypeTemplate).map(
- statusEffect => {
- if (resistanceTypeTemplate[statusEffect].blockChance == 1)
- return sprintf(translate("Blocks %(name)s"), {
- "name": unitFont(translateWithContext("status effect", g_StatusEffectsMetadata.getName(statusEffect)))
- });
-
- if (resistanceTypeTemplate[statusEffect].blockChance == 0)
- return sprintf(translate("%(name)s %(details)s"), {
- "name": unitFont(translateWithContext("status effect", g_StatusEffectsMetadata.getName(statusEffect))),
- "details": sprintf(translate("Duration reduction: %(durationReduction)s%%"), {
- "durationReduction": (100 - resistanceTypeTemplate[statusEffect].duration * 100)
- })
- });
-
- if (resistanceTypeTemplate[statusEffect].duration == 1)
- return sprintf(translate("%(name)s %(details)s"), {
- "name": unitFont(translateWithContext("status effect", g_StatusEffectsMetadata.getName(statusEffect))),
- "details": sprintf(translate("Blocks: %(blockPercentage)s%%"), {
- "blockPercentage": resistanceTypeTemplate[statusEffect].blockChance * 100
- })
- });
+ "details": keys.map(
+ statusEffect => {
+ if (resistanceTypeTemplate[statusEffect].blockChance === 1)
+ return sprintf(translate("Blocks %(name)s"), {
+ "name": unitFont(translateWithContext("status effect", g_StatusEffectsMetadata.getName(statusEffect)))
+ });
+ if (resistanceTypeTemplate[statusEffect].blockChance === 0)
return sprintf(translate("%(name)s %(details)s"), {
"name": unitFont(translateWithContext("status effect", g_StatusEffectsMetadata.getName(statusEffect))),
- "details": sprintf(translate("Blocks: %(blockPercentage)s%%, Duration reduction: %(durationReduction)s%%"), {
- "blockPercentage": resistanceTypeTemplate[statusEffect].blockChance * 100,
+ "details": sprintf(translate("Duration reduction: %(durationReduction)s%%"), {
"durationReduction": (100 - resistanceTypeTemplate[statusEffect].duration * 100)
})
});
- }
- ).join(commaFont(translate(", ")))
+
+ if (resistanceTypeTemplate[statusEffect].duration === 1)
+ return sprintf(translate("%(name)s %(details)s"), {
+ "name": unitFont(translateWithContext("status effect", g_StatusEffectsMetadata.getName(statusEffect))),
+ "details": sprintf(translate("Blocks: %(blockPercentage)s%%"), {
+ "blockPercentage": resistanceTypeTemplate[statusEffect].blockChance * 100
+ })
+ });
+
+ return sprintf(translate("%(name)s %(details)s"), {
+ "name": unitFont(translateWithContext("status effect", g_StatusEffectsMetadata.getName(statusEffect))),
+ "details": sprintf(translate("Blocks: %(blockPercentage)s%%, Duration reduction: %(durationReduction)s%%"), {
+ "blockPercentage": resistanceTypeTemplate[statusEffect].blockChance * 100,
+ "durationReduction": (100 - resistanceTypeTemplate[statusEffect].duration * 100)
+ })
+ });
+ }
+ ).join(commaFont(translate(", ")))
});
}
+function getVulnerabilityTooltip(template)
+{
+ if (!template.resistance)
+ return "";
+
+ const details = [];
+ for (const type in template.resistance)
+ {
+ if (type === "Capture")
+ details.push(headerFont(translate("Capture")));
+ else
+ {
+ const context = type === "Damage" ? "damage type" : "status effect";
+ const metadata = type === "Damage" ? g_DamageTypesMetadata : g_StatusEffectsMetadata;
+ const typeName = type === "Damage" ? translate("Damage:") : translate("Status Effects:");
+ const subTypes = Object.keys(template.resistance[type])
+ .map(subtype => unitFont(translateWithContext(context, metadata.getName(subtype))));
+ details.push(sprintf(translate("%(type)s %(subtypes)s"),
+ {
+ "type": headerFont(typeName),
+ "subtypes": subTypes.join(commaFont(translate(", ")))
+ })
+ );
+ }
+ }
+ return details.length ? sprintf(translate("%(label)s\n%(details)s"), {
+ "label": headerFont(translate("Vulnerability:")),
+ "details": g_Indent + details.join(translate(", "))
+ }) : "";
+}
+
function attackRateDetails(interval, projectiles)
{
if (!interval)
Index: binaries/data/mods/public/gui/reference/common/ReferencePage.js
===================================================================
--- binaries/data/mods/public/gui/reference/common/ReferencePage.js
+++ binaries/data/mods/public/gui/reference/common/ReferencePage.js
@@ -56,6 +56,7 @@
getAttackTooltip,
getHealerTooltip,
getResistanceTooltip,
+ getVulnerabilityTooltip,
getGarrisonTooltip,
getTurretsTooltip,
getProjectilesTooltip,
Index: binaries/data/mods/public/gui/reference/viewer/viewer.xml
===================================================================
--- binaries/data/mods/public/gui/reference/viewer/viewer.xml
+++ binaries/data/mods/public/gui/reference/viewer/viewer.xml
@@ -11,7 +11,7 @@
-