Wrap damage types in a Damage element in XML templates to prepare for genericizing them.

Patch By: Freagarach
Reviewed By: Wraitii
Differential Revision: https://code.wildfiregames.com/D1950
This was SVN commit r22379.
This commit is contained in:
wraitii
2019-06-16 17:08:27 +00:00
parent 61db02790c
commit f4babd9b34
141 changed files with 689 additions and 468 deletions
@@ -187,10 +187,11 @@ function GetTemplateDataHelper(template, player, auraTemplates, resources, damag
ret.attack[type] = { ret.attack[type] = {
"minRange": getAttackStat("MinRange"), "minRange": getAttackStat("MinRange"),
"maxRange": getAttackStat("MaxRange"), "maxRange": getAttackStat("MaxRange"),
"elevationBonus": getAttackStat("ElevationBonus") "elevationBonus": getAttackStat("ElevationBonus"),
"damage": {}
}; };
for (let damageType of damageTypes.GetTypes()) for (let damageType of damageTypes.GetTypes())
ret.attack[type][damageType] = getAttackStat(damageType); ret.attack[type].damage[damageType] = getAttackStat("Damage/" + damageType);
ret.attack[type].elevationAdaptedRange = Math.sqrt(ret.attack[type].maxRange * ret.attack[type].elevationAdaptedRange = Math.sqrt(ret.attack[type].maxRange *
(2 * ret.attack[type].elevationBonus + ret.attack[type].maxRange)); (2 * ret.attack[type].elevationBonus + ret.attack[type].maxRange));
@@ -202,10 +203,11 @@ function GetTemplateDataHelper(template, player, auraTemplates, resources, damag
ret.attack[type].splash = { ret.attack[type].splash = {
// true if undefined // true if undefined
"friendlyFire": template.Attack[type].Splash.FriendlyFire != "false", "friendlyFire": template.Attack[type].Splash.FriendlyFire != "false",
"shape": template.Attack[type].Splash.Shape "shape": template.Attack[type].Splash.Shape,
"damage": {}
}; };
for (let damageType of damageTypes.GetTypes()) for (let damageType of damageTypes.GetTypes())
ret.attack[type].splash[damageType] = getAttackStat("Splash/" + damageType); ret.attack[type].splash.damage[damageType] = getAttackStat("Splash/Damage/" + damageType);
} }
} }
} }
@@ -213,10 +215,11 @@ function GetTemplateDataHelper(template, player, auraTemplates, resources, damag
if (template.DeathDamage) if (template.DeathDamage)
{ {
ret.deathDamage = { ret.deathDamage = {
"friendlyFire": template.DeathDamage.FriendlyFire != "false" "friendlyFire": template.DeathDamage.FriendlyFire != "false",
"damage": {}
}; };
for (let damageType of damageTypes.GetTypes()) for (let damageType of damageTypes.GetTypes())
ret.deathDamage[damageType] = getEntityValue("DeathDamage/" + damageType); ret.deathDamage.damage[damageType] = getEntityValue("DeathDamage/Damage/" + damageType);
} }
if (template.Auras && auraTemplates) if (template.Auras && auraTemplates)
@@ -226,10 +229,10 @@ function GetTemplateDataHelper(template, player, auraTemplates, resources, damag
{ {
let aura = auraTemplates[auraID]; let aura = auraTemplates[auraID];
ret.auras[auraID] = { ret.auras[auraID] = {
"name": aura.auraName, "name": aura.auraName,
"description": aura.auraDescription || null, "description": aura.auraDescription || null,
"radius": aura.radius || null "radius": aura.radius || null
}; };
} }
} }
@@ -274,7 +274,7 @@ function getAttackTooltip(template)
"details": "details":
type == "Capture" ? type == "Capture" ?
template.attack.Capture.value : template.attack.Capture.value :
damageTypesToText(template.attack[type]), damageTypesToText(template.attack[type].damage),
"rate": rate "rate": rate
})); }));
continue; continue;
@@ -284,10 +284,9 @@ function getAttackTooltip(template)
let maxRange = Math.round(template.attack[type].maxRange); let maxRange = Math.round(template.attack[type].maxRange);
let realRange = template.attack[type].elevationAdaptedRange; let realRange = template.attack[type].elevationAdaptedRange;
let relativeRange = realRange ? Math.round(realRange - maxRange) : 0; let relativeRange = realRange ? Math.round(realRange - maxRange) : 0;
tooltips.push(sprintf(g_RangeTooltipString[relativeRange ? "relative" : "non-relative"][minRange ? "minRange" : "no-minRange"], { tooltips.push(sprintf(g_RangeTooltipString[relativeRange ? "relative" : "non-relative"][minRange ? "minRange" : "no-minRange"], {
"attackLabel": attackLabel, "attackLabel": attackLabel,
"damageTypes": damageTypesToText(template.attack[type]), "damageTypes": damageTypesToText(template.attack[type].damage),
"rangeLabel": headerFont(translate("Range:")), "rangeLabel": headerFont(translate("Range:")),
"minRange": minRange, "minRange": minRange,
"maxRange": maxRange, "maxRange": maxRange,
@@ -317,7 +316,7 @@ function getSplashDamageTooltip(template)
let splashDamageTooltip = sprintf(translate("%(label)s: %(value)s"), { let splashDamageTooltip = sprintf(translate("%(label)s: %(value)s"), {
"label": headerFont(g_SplashDamageTypes[splash.shape]), "label": headerFont(g_SplashDamageTypes[splash.shape]),
"value": damageTypesToText(splash) "value": damageTypesToText(splash.damage)
}); });
if (g_AlwaysDisplayFriendlyFire || splash.friendlyFire) if (g_AlwaysDisplayFriendlyFire || splash.friendlyFire)
@@ -87,6 +87,7 @@
{"nick": "Fire Giant", "name": "Malte Schwarzkopf"}, {"nick": "Fire Giant", "name": "Malte Schwarzkopf"},
{"name": "Fork AD"}, {"name": "Fork AD"},
{"nick": "fpre", "name": "Frederick Stallmeyer"}, {"nick": "fpre", "name": "Frederick Stallmeyer"},
{"nick": "Freagarach"},
{"nick": "freenity", "name": "Anton Galitch"}, {"nick": "freenity", "name": "Anton Galitch"},
{"nick": "Gallaecio", "name": "Adrián Chaves"}, {"nick": "Gallaecio", "name": "Adrián Chaves"},
{"nick": "gbish (aka Iny)", "name": "Grant Bishop"}, {"nick": "gbish (aka Iny)", "name": "Grant Bishop"},
@@ -233,9 +233,9 @@ m.Template = m.Class({
return undefined; return undefined;
return { return {
"Hack": +(this.get("Attack/" + type + "/Hack") || 0), "Hack": +(this.get("Attack/" + type + "/Damage/Hack") || 0),
"Pierce": +(this.get("Attack/" + type + "/Pierce") || 0), "Pierce": +(this.get("Attack/" + type + "/Damage/Pierce") || 0),
"Crush": +(this.get("Attack/" + type + "/Crush") || 0) "Crush": +(this.get("Attack/" + type + "/Damage/Crush") || 0)
}; };
}, },
@@ -122,7 +122,9 @@ Attack.prototype.Schema =
"<optional>" + "<optional>" +
"<element name='Melee'>" + "<element name='Melee'>" +
"<interleave>" + "<interleave>" +
DamageTypes.BuildSchema("damage strength") + "<element name='Damage'>" +
DamageTypes.BuildSchema("damage strength") +
"</element>" +
"<element name='MaxRange' a:help='Maximum attack range (in metres)'><ref name='nonNegativeDecimal'/></element>" + "<element name='MaxRange' a:help='Maximum attack range (in metres)'><ref name='nonNegativeDecimal'/></element>" +
"<element name='PrepareTime' a:help='Time from the start of the attack command until the attack actually occurs (in milliseconds). This value relative to RepeatTime should closely match the \"event\" point in the actor&apos;s attack animation'>" + "<element name='PrepareTime' a:help='Time from the start of the attack command until the attack actually occurs (in milliseconds). This value relative to RepeatTime should closely match the \"event\" point in the actor&apos;s attack animation'>" +
"<data type='nonNegativeInteger'/>" + "<data type='nonNegativeInteger'/>" +
@@ -139,7 +141,9 @@ Attack.prototype.Schema =
"<optional>" + "<optional>" +
"<element name='Ranged'>" + "<element name='Ranged'>" +
"<interleave>" + "<interleave>" +
DamageTypes.BuildSchema("damage strength") + "<element name='Damage'>" +
DamageTypes.BuildSchema("damage strength") +
"</element>" +
"<element name='MaxRange' a:help='Maximum attack range (in metres)'><ref name='nonNegativeDecimal'/></element>" + "<element name='MaxRange' a:help='Maximum attack range (in metres)'><ref name='nonNegativeDecimal'/></element>" +
"<element name='MinRange' a:help='Minimum attack range (in metres)'><ref name='nonNegativeDecimal'/></element>" + "<element name='MinRange' a:help='Minimum attack range (in metres)'><ref name='nonNegativeDecimal'/></element>" +
"<optional>"+ "<optional>"+
@@ -167,7 +171,9 @@ Attack.prototype.Schema =
"<element name='Shape' a:help='Shape of the splash damage, can be circular or linear'><text/></element>" + "<element name='Shape' a:help='Shape of the splash damage, can be circular or linear'><text/></element>" +
"<element name='Range' a:help='Size of the area affected by the splash'><ref name='nonNegativeDecimal'/></element>" + "<element name='Range' a:help='Size of the area affected by the splash'><ref name='nonNegativeDecimal'/></element>" +
"<element name='FriendlyFire' a:help='Whether the splash damage can hurt non enemy units'><data type='boolean'/></element>" + "<element name='FriendlyFire' a:help='Whether the splash damage can hurt non enemy units'><data type='boolean'/></element>" +
DamageTypes.BuildSchema("damage strength") + "<element name='Damage'>" +
DamageTypes.BuildSchema("damage strength") +
"</element>" +
Attack.prototype.bonusesSchema + Attack.prototype.bonusesSchema +
"</interleave>" + "</interleave>" +
"</element>" + "</element>" +
@@ -227,7 +233,9 @@ Attack.prototype.Schema =
"<optional>" + "<optional>" +
"<element name='Slaughter' a:help='A special attack to kill domestic animals'>" + "<element name='Slaughter' a:help='A special attack to kill domestic animals'>" +
"<interleave>" + "<interleave>" +
DamageTypes.BuildSchema("damage strength") + "<element name='Damage'>" +
DamageTypes.BuildSchema("damage strength") +
"</element>" +
"<element name='MaxRange'><ref name='nonNegativeDecimal'/></element>" + // TODO: how do these work? "<element name='MaxRange'><ref name='nonNegativeDecimal'/></element>" + // TODO: how do these work?
Attack.prototype.bonusesSchema + Attack.prototype.bonusesSchema +
Attack.prototype.preferredClassesSchema + Attack.prototype.preferredClassesSchema +
@@ -448,10 +456,10 @@ Attack.prototype.GetAttackStrengths = function(type)
} }
let applyMods = damageType => let applyMods = damageType =>
ApplyValueModificationsToEntity("Attack/" + type + splash + "/" + damageType, +(template[damageType] || 0), this.entity); ApplyValueModificationsToEntity("Attack/" + type + splash + "/Damage/" + damageType, +(template.Damage[damageType] || 0), this.entity);
if (type == "Capture") if (type == "Capture")
return { "value": applyMods("Value") }; return { "value": ApplyValueModificationsToEntity("Attack/Capture/Value", +(template.Value || 0), this.entity) };
let ret = {}; let ret = {};
for (let damageType of DamageTypes.GetTypes()) for (let damageType of DamageTypes.GetTypes())
@@ -465,7 +473,8 @@ Attack.prototype.GetSplashDamage = function(type)
if (!this.template[type].Splash) if (!this.template[type].Splash)
return false; return false;
let splash = this.GetAttackStrengths(type + ".Splash"); let splash = {};
splash.damage = this.GetAttackStrengths(type + ".Splash");
splash.friendlyFire = this.template[type].Splash.FriendlyFire != "false"; splash.friendlyFire = this.template[type].Splash.FriendlyFire != "false";
splash.shape = this.template[type].Splash.Shape; splash.shape = this.template[type].Splash.Shape;
return splash; return splash;
@@ -31,7 +31,9 @@ DeathDamage.prototype.Schema =
"<element name='Shape' a:help='Shape of the splash damage, can be circular'><text/></element>" + "<element name='Shape' a:help='Shape of the splash damage, can be circular'><text/></element>" +
"<element name='Range' a:help='Size of the area affected by the splash'><ref name='nonNegativeDecimal'/></element>" + "<element name='Range' a:help='Size of the area affected by the splash'><ref name='nonNegativeDecimal'/></element>" +
"<element name='FriendlyFire' a:help='Whether the splash damage can hurt non enemy units'><data type='boolean'/></element>" + "<element name='FriendlyFire' a:help='Whether the splash damage can hurt non enemy units'><data type='boolean'/></element>" +
DamageTypes.BuildSchema("damage strength") + "<element name='Damage'>" +
DamageTypes.BuildSchema("damage strength") +
"</element>" +
DeathDamage.prototype.bonusesSchema; DeathDamage.prototype.bonusesSchema;
DeathDamage.prototype.Init = function() DeathDamage.prototype.Init = function()
@@ -44,7 +46,7 @@ DeathDamage.prototype.GetDeathDamageStrengths = function()
{ {
// Work out the damage values with technology effects // Work out the damage values with technology effects
let applyMods = damageType => let applyMods = damageType =>
ApplyValueModificationsToEntity("DeathDamage/" + damageType, +(this.template[damageType] || 0), this.entity); ApplyValueModificationsToEntity("DeathDamage/Damage/" + damageType, +(this.template.Damage[damageType] || 0), this.entity);
let ret = {}; let ret = {};
for (let damageType of DamageTypes.GetTypes()) for (let damageType of DamageTypes.GetTypes())
@@ -388,7 +388,12 @@ GuiInterface.prototype.GetEntityState = function(player, ent)
for (let type of types) for (let type of types)
{ {
ret.attack[type] = cmpAttack.GetAttackStrengths(type); ret.attack[type] = {};
if (type == "Capture")
ret.attack[type] = cmpAttack.GetAttackStrengths(type);
else
ret.attack[type].damage = cmpAttack.GetAttackStrengths(type);
ret.attack[type].splash = cmpAttack.GetSplashDamage(type); ret.attack[type].splash = cmpAttack.GetSplashDamage(type);
let range = cmpAttack.GetRange(type); let range = cmpAttack.GetRange(type);
@@ -36,7 +36,7 @@ TechnologyManager.prototype.Init = function()
// ]} // ]}
this.modifications = {}; this.modifications = {};
this.modificationCache = {}; // Caches the values after technologies have been applied this.modificationCache = {}; // Caches the values after technologies have been applied
// e.g. { "Attack/Melee/Hack" : {5: {"origValue": 8, "newValue": 10}, 7: {"origValue": 9, "newValue": 12}, ...}, ...} // e.g. { "Attack/Melee/Damage/Hack" : {5: {"origValue": 8, "newValue": 10}, 7: {"origValue": 9, "newValue": 12}, ...}, ...}
// where 5 and 7 are entity id's // where 5 and 7 are entity id's
this.classCounts = {}; // stores the number of entities of each Class this.classCounts = {}; // stores the number of entities of each Class
@@ -43,10 +43,12 @@ function attackComponentTest(defenderClass, isEnemy, test_function)
}); });
let cmpAttack = ConstructComponent(attacker, "Attack", { let cmpAttack = ConstructComponent(attacker, "Attack", {
"Melee" : { "Melee": {
"Hack": 11, "Damage": {
"Pierce": 5, "Hack": 11,
"Crush": 0, "Pierce": 5,
"Crush": 0
},
"MinRange": 3, "MinRange": 3,
"MaxRange": 5, "MaxRange": 5,
"PreferredClasses": { "PreferredClasses": {
@@ -63,10 +65,12 @@ function attackComponentTest(defenderClass, isEnemy, test_function)
} }
} }
}, },
"Ranged" : { "Ranged": {
"Hack": 0, "Damage": {
"Pierce": 10, "Hack": 0,
"Crush": 0, "Pierce": 10,
"Crush": 0
},
"MinRange": 10, "MinRange": 10,
"MaxRange": 80, "MaxRange": 80,
"PrepareTime": 300, "PrepareTime": 300,
@@ -82,13 +86,15 @@ function attackComponentTest(defenderClass, isEnemy, test_function)
"RestrictedClasses": { "RestrictedClasses": {
"_string": "Elephant" "_string": "Elephant"
}, },
"Splash" : { "Splash": {
"Shape": "Circular", "Shape": "Circular",
"Range": 10, "Range": 10,
"FriendlyFire": "false", "FriendlyFire": "false",
"Hack": 0.0, "Damage": {
"Pierce": 15.0, "Hack": 0.0,
"Crush": 35.0, "Pierce": 15.0,
"Crush": 35.0
},
"Bonuses": { "Bonuses": {
"BonusCav": { "BonusCav": {
"Classes": "Cavalry", "Classes": "Cavalry",
@@ -97,7 +103,7 @@ function attackComponentTest(defenderClass, isEnemy, test_function)
} }
} }
}, },
"Capture" : { "Capture": {
"Value": 8, "Value": 8,
"MaxRange": 10, "MaxRange": 10,
}, },
@@ -128,7 +134,7 @@ function attackComponentTest(defenderClass, isEnemy, test_function)
} }
// Validate template getter functions // Validate template getter functions
attackComponentTest(undefined, true ,(attacker, cmpAttack, defender) => { attackComponentTest(undefined, true, (attacker, cmpAttack, defender) => {
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(), ["Melee", "Ranged", "Capture"]); TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(), ["Melee", "Ranged", "Capture"]);
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes([]), ["Melee", "Ranged", "Capture"]); TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes([]), ["Melee", "Ranged", "Capture"]);
@@ -151,7 +157,7 @@ attackComponentTest(undefined, true ,(attacker, cmpAttack, defender) => {
"Pierce": 10, "Pierce": 10,
"Crush": 0 "Crush": 0
}); });
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackStrengths("Ranged.Splash"), { TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackStrengths("Ranged.Splash"), {
"Hack": 0.0, "Hack": 0.0,
"Pierce": 15.0, "Pierce": 15.0,
@@ -169,9 +175,11 @@ attackComponentTest(undefined, true ,(attacker, cmpAttack, defender) => {
}); });
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetSplashDamage("Ranged"), { TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetSplashDamage("Ranged"), {
"Hack": 0, "damage": {
"Pierce": 15, "Hack": 0,
"Crush": 35, "Pierce": 15,
"Crush": 35,
},
"friendlyFire": false, "friendlyFire": false,
"shape": "Circular" "shape": "Circular"
}); });
@@ -12,7 +12,7 @@ let player = 1;
ApplyValueModificationsToEntity = function(value, stat, ent) ApplyValueModificationsToEntity = function(value, stat, ent)
{ {
if (value == "DeathDamage/Pierce" && ent == deadEnt) if (value == "DeathDamage/Damage/Pierce" && ent == deadEnt)
return stat + 200; return stat + 200;
return stat; return stat;
}; };
@@ -21,9 +21,11 @@ let template = {
"Shape": "Circular", "Shape": "Circular",
"Range": 10.7, "Range": 10.7,
"FriendlyFire": "false", "FriendlyFire": "false",
"Hack": 0.0, "Damage": {
"Pierce": 15.0, "Hack": 0.0,
"Crush": 35.0 "Pierce": 15.0,
"Crush": 35.0
}
}; };
let modifiedDamage = { let modifiedDamage = {
@@ -3,12 +3,12 @@
"radius": 50, "radius": 50,
"affects": ["Soldier"], "affects": ["Soldier"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.20 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.20 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.20 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.20 },
{ "value": "Attack/Melee/Crush", "multiply": 1.20 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.20 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.20 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.20 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.20 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.20 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.20 } { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.20 }
], ],
"auraName": "Religious Fervor", "auraName": "Religious Fervor",
"auraDescription": "+20% attack damage for soldiers.", "auraDescription": "+20% attack damage for soldiers.",
@@ -3,12 +3,12 @@
"radius": 60, "radius": 60,
"affects": ["Soldier"], "affects": ["Soldier"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.1 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.1 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.1 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.1 },
{ "value": "Attack/Melee/Crush", "multiply": 1.1 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.1 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.1 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.1 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.1 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.1 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.1 } { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.1 }
], ],
"auraName": "Exhortative Presence", "auraName": "Exhortative Presence",
"auraDescription": "Soldiers near Large Pyramids +10% attack.", "auraDescription": "Soldiers near Large Pyramids +10% attack.",
@@ -3,12 +3,12 @@
"affects": ["Soldier"], "affects": ["Soldier"],
"modifications": [ "modifications": [
{ "value": "Promotion/RequiredXp", "multiply": 0.75 }, { "value": "Promotion/RequiredXp", "multiply": 0.75 },
{ "value": "Attack/Melee/Hack", "multiply": 1.05 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.05 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.05 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.05 },
{ "value": "Attack/Melee/Crush", "multiply": 1.05 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.05 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.05 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.05 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.05 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.05 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.05 } { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.05 }
], ],
"auraName": "Ambush Slaughter", "auraName": "Ambush Slaughter",
@@ -4,12 +4,12 @@
"affects": ["Champion"], "affects": ["Champion"],
"modifications": [ "modifications": [
{ "value": "UnitMotion/WalkSpeed", "multiply": 1.1 }, { "value": "UnitMotion/WalkSpeed", "multiply": 1.1 },
{ "value": "Attack/Melee/Hack", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Melee/Crush", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Capture/Value", "add": 2 } { "value": "Attack/Capture/Value", "add": 2 }
], ],
"auraName": "Champion Army", "auraName": "Champion Army",
@@ -4,12 +4,12 @@
"affects": ["Mercenary"], "affects": ["Mercenary"],
"affectedPlayers": ["Enemy"], "affectedPlayers": ["Enemy"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 0.8 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 0.8 },
{ "value": "Attack/Melee/Pierce", "multiply": 0.8 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 0.8 },
{ "value": "Attack/Melee/Crush", "multiply": 0.8 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 0.8 },
{ "value": "Attack/Ranged/Hack", "multiply": 0.8 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 0.8 },
{ "value": "Attack/Ranged/Pierce", "multiply": 0.8 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 0.8 },
{ "value": "Attack/Ranged/Crush", "multiply": 0.8 } { "value": "Attack/Ranged/Damage/Crush", "multiply": 0.8 }
], ],
"auraName": "Subduer of Mercenaries", "auraName": "Subduer of Mercenaries",
"auraDescription": "-20% attack for enemy mercenaries." "auraDescription": "-20% attack for enemy mercenaries."
@@ -4,12 +4,12 @@
"affects": ["Soldier", "Siege"], "affects": ["Soldier", "Siege"],
"affectedPlayers": ["Ally"], "affectedPlayers": ["Ally"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.20 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.20 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.20 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.20 },
{ "value": "Attack/Melee/Crush", "multiply": 1.20 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.20 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.20 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.20 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.20 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.20 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.20 }, { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.20 },
{ "value": "Attack/Capture/Value", "add": 1 } { "value": "Attack/Capture/Value", "add": 1 }
], ],
"auraName": "Tactician", "auraName": "Tactician",
@@ -3,9 +3,9 @@
"radius": 60, "radius": 60,
"affects": ["Melee Cavalry"], "affects": ["Melee Cavalry"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.3 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.3 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.3 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.3 },
{ "value": "Attack/Melee/Crush", "multiply": 1.3 } { "value": "Attack/Melee/Damage/Crush", "multiply": 1.3 }
], ],
"auraName": "Cavalry Commander", "auraName": "Cavalry Commander",
"auraDescription": "+30% attack for cavalry melee soldiers.", "auraDescription": "+30% attack for cavalry melee soldiers.",
@@ -3,12 +3,12 @@
"radius": 60, "radius": 60,
"affects": ["Soldier", "Siege"], "affects": ["Soldier", "Siege"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.20 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.20 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.20 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.20 },
{ "value": "Attack/Melee/Crush", "multiply": 1.20 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.20 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.20 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.20 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.20 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.20 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.20 }, { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.20 },
{ "value": "Attack/Capture/Value", "add": 1 } { "value": "Attack/Capture/Value", "add": 1 }
], ],
"auraName": "Celtic Warlord", "auraName": "Celtic Warlord",
@@ -3,12 +3,12 @@
"radius": 60, "radius": 60,
"affects": ["Champion"], "affects": ["Champion"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Melee/Crush", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Capture/Value", "add": 2 } { "value": "Attack/Capture/Value", "add": 2 }
], ],
"auraName": "Warrior Queen", "auraName": "Warrior Queen",
@@ -7,12 +7,12 @@
{ "value": "Looter/Resource/wood", "multiply": 1.5 }, { "value": "Looter/Resource/wood", "multiply": 1.5 },
{ "value": "Looter/Resource/stone", "multiply": 1.5 }, { "value": "Looter/Resource/stone", "multiply": 1.5 },
{ "value": "Looter/Resource/metal", "multiply": 1.5 }, { "value": "Looter/Resource/metal", "multiply": 1.5 },
{ "value": "Attack/Melee/Hack", "multiply": 1.1 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.1 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.1 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.1 },
{ "value": "Attack/Melee/Crush", "multiply": 1.1 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.1 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.1 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.1 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.1 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.1 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.1 } { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.1 }
], ],
"auraName": "Savior of Kush", "auraName": "Savior of Kush",
"auraDescription": "Own units +10% attack.\nNastasen acquired lots of bounty from the defeated invaders. Gain +50% loot from killing enemy units." "auraDescription": "Own units +10% attack.\nNastasen acquired lots of bounty from the defeated invaders. Gain +50% loot from killing enemy units."
@@ -3,9 +3,9 @@
"radius": 60, "radius": 60,
"affects": ["Infantry Pike"], "affects": ["Infantry Pike"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Melee/Crush", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Capture/Value", "multiply": 1.2 } { "value": "Attack/Capture/Value", "multiply": 1.2 }
], ],
"auraName": "Taxiarchès", "auraName": "Taxiarchès",
@@ -6,12 +6,12 @@
{ "value": "Armour/Pierce", "add": 1 }, { "value": "Armour/Pierce", "add": 1 },
{ "value": "Armour/Hack", "add": 1 }, { "value": "Armour/Hack", "add": 1 },
{ "value": "Armour/Crush", "add": 1 }, { "value": "Armour/Crush", "add": 1 },
{ "value": "Attack/Melee/Hack", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Melee/Crush", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Ranged/MaxRange", "multiply": 1.1 }, { "value": "Attack/Ranged/MaxRange", "multiply": 1.1 },
{ "value": "Vision/Range", "multiply": 1.1 } { "value": "Vision/Range", "multiply": 1.1 }
], ],
@@ -3,12 +3,12 @@
"radius": 60, "radius": 60,
"affects": ["Champion"], "affects": ["Champion"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Melee/Crush", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Capture/Value", "add": 2 } { "value": "Attack/Capture/Value", "add": 2 }
], ],
"auraName": "Rise of Macedon", "auraName": "Rise of Macedon",
@@ -2,12 +2,12 @@
"type": "global", "type": "global",
"affects": ["Soldier"], "affects": ["Soldier"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Melee/Crush", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.2 },
{ "value": "Health/Max", "multiply": 0.85 } { "value": "Health/Max", "multiply": 0.85 }
], ],
"auraName": "Pyrrhic Victory", "auraName": "Pyrrhic Victory",
@@ -3,12 +3,12 @@
"radius": 45, "radius": 45,
"affects": ["Cavalry"], "affects": ["Cavalry"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Melee/Crush", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Capture/Value", "add": 1 } { "value": "Attack/Capture/Value", "add": 1 }
], ],
"auraName": "Forefront Leader", "auraName": "Forefront Leader",
@@ -3,12 +3,12 @@
"radius": 60, "radius": 60,
"affects": ["Cavalry"], "affects": ["Cavalry"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.15 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.15 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.15 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.15 },
{ "value": "Attack/Melee/Crush", "multiply": 1.15 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.15 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.15 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.15 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.15 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.15 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.15 } { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.15 }
], ],
"auraName": "Sword of Rome", "auraName": "Sword of Rome",
"auraDescription": "+15% attack for cavalry.", "auraDescription": "+15% attack for cavalry.",
@@ -4,12 +4,12 @@
"affects": ["Infantry"], "affects": ["Infantry"],
"affectedPlayers": ["Enemy"], "affectedPlayers": ["Enemy"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 0.9 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 0.9 },
{ "value": "Attack/Melee/Pierce", "multiply": 0.9 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 0.9 },
{ "value": "Attack/Melee/Crush", "multiply": 0.9 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 0.9 },
{ "value": "Attack/Ranged/Hack", "multiply": 0.9 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 0.9 },
{ "value": "Attack/Ranged/Pierce", "multiply": 0.9 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 0.9 },
{ "value": "Attack/Ranged/Crush", "multiply": 0.9 } { "value": "Attack/Ranged/Damage/Crush", "multiply": 0.9 }
], ],
"auraName": "Sword of Rome", "auraName": "Sword of Rome",
"auraDescription": "-10% attack for enemy infantry." "auraDescription": "-10% attack for enemy infantry."
@@ -3,12 +3,12 @@
"radius": 30, "radius": 30,
"affects": ["Soldier", "Siege"], "affects": ["Soldier", "Siege"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Melee/Crush", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Ranged/Hack", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Ranged/Pierce", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2 },
{ "value": "Attack/Ranged/Crush", "multiply": 1.2 }, { "value": "Attack/Ranged/Damage/Crush", "multiply": 1.2 },
{ "value": "Attack/Capture/Value", "add": 2 } { "value": "Attack/Capture/Value", "add": 2 }
], ],
"auraName": "Triumph", "auraName": "Triumph",
@@ -4,8 +4,8 @@
"affects": ["Elephant Champion"], "affects": ["Elephant Champion"],
"modifications": [ "modifications": [
{ "value": "UnitMotion/WalkSpeed", "multiply": 1.2 }, { "value": "UnitMotion/WalkSpeed", "multiply": 1.2 },
{ "value": "Attack/Melee/Hack", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Melee/Crush", "multiply": 1.2 } { "value": "Attack/Melee/Damage/Crush", "multiply": 1.2 }
], ],
"auraName": "Zooiarchos", "auraName": "Zooiarchos",
"auraDescription": "+20% attack and movement speed for war elephants.", "auraDescription": "+20% attack and movement speed for war elephants.",
@@ -3,7 +3,7 @@
"radius": 60, "radius": 60,
"affects": ["Javelin Infantry Citizen"], "affects": ["Javelin Infantry Citizen"],
"modifications": [ "modifications": [
{ "value": "Attack/Ranged/Pierce", "multiply": 1.25 }, { "value": "Attack/Ranged/Damage/Pierce", "multiply": 1.25 },
{ "value": "Armour/Pierce", "add": 1 }, { "value": "Armour/Pierce", "add": 1 },
{ "value": "Armour/Hack", "add": 1 }, { "value": "Armour/Hack", "add": 1 },
{ "value": "Armour/Crush", "add": 1 } { "value": "Armour/Crush", "add": 1 }
@@ -3,9 +3,9 @@
"radius": 30, "radius": 30,
"affects": ["Spear"], "affects": ["Spear"],
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.25 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.25 },
{ "value": "Attack/Melee/Pierce", "multiply": 1.25 }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.25 },
{ "value": "Attack/Melee/Crush", "multiply": 1.25 }, { "value": "Attack/Melee/Damage/Crush", "multiply": 1.25 },
{ "value": "Attack/Capture/Value", "add": 1 } { "value": "Attack/Capture/Value", "add": 1 }
], ],
"auraName": "Last Stand", "auraName": "Last Stand",
@@ -14,8 +14,8 @@
{ "value": "Attack/Ranged/MaxRange", "add": 4, "affects": "Ranged" }, { "value": "Attack/Ranged/MaxRange", "add": 4, "affects": "Ranged" },
{ "value": "Vision/Range", "add": 4, "affects": "Ranged" }, { "value": "Vision/Range", "add": 4, "affects": "Ranged" },
{ "value": "Attack/Ranged/Spread", "multiply": 0.9, "affects": "Ranged" }, { "value": "Attack/Ranged/Spread", "multiply": 0.9, "affects": "Ranged" },
{ "value": "Attack/Melee/Hack", "multiply": 1.2, "affects": "Melee" }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2, "affects": "Melee" },
{ "value": "Attack/Melee/Pierce", "multiply": 1.2, "affects": "Melee" }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.2, "affects": "Melee" },
{ "value": "Vision/Range", "add": 3, "affects": "Healer" }, { "value": "Vision/Range", "add": 3, "affects": "Healer" },
{ "value": "Heal/Range", "add": 3, "affects": "Healer" }, { "value": "Heal/Range", "add": 3, "affects": "Healer" },
{ "value": "Heal/HP", "add": 5, "affects": "Healer" }, { "value": "Heal/HP", "add": 5, "affects": "Healer" },
@@ -16,7 +16,7 @@
"icon": "spear_cavalry.png", "icon": "spear_cavalry.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "Equip your melee cavalry with better weapons. Melee Cavalry +2 Hack Attack.", "tooltip": "Equip your melee cavalry with better weapons. Melee Cavalry +2 Hack Attack.",
"modifications": [{"value": "Attack/Melee/Hack", "add": 2.0}], "modifications": [{"value": "Attack/Melee/Damage/Hack", "add": 2.0}],
"affects": ["Cavalry Melee"], "affects": ["Cavalry Melee"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -15,9 +15,9 @@
"icon": "horse_trainer.png", "icon": "horse_trainer.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "+20% melee cavalry attack.", "tooltip": "+20% melee cavalry attack.",
"modifications": [{"value": "Attack/Melee/Hack", "multiply": 1.2}, "modifications": [{"value": "Attack/Melee/Damage/Hack", "multiply": 1.2},
{"value": "Attack/Melee/Pierce", "multiply": 1.2}, {"value": "Attack/Melee/Damage/Pierce", "multiply": 1.2},
{"value": "Attack/Melee/Crush", "multiply": 1.2}], {"value": "Attack/Melee/Damage/Crush", "multiply": 1.2}],
"affects": ["Cavalry Melee"], "affects": ["Cavalry Melee"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -16,9 +16,9 @@
"icon": "spear_cavalry.png", "icon": "spear_cavalry.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "Equip your melee cavalry with better weapons. +20% melee cavalry attack.", "tooltip": "Equip your melee cavalry with better weapons. +20% melee cavalry attack.",
"modifications": [{"value": "Attack/Melee/Hack", "multiply": 1.2}, "modifications": [{"value": "Attack/Melee/Damage/Hack", "multiply": 1.2},
{"value": "Attack/Melee/Pierce", "multiply": 1.2}, {"value": "Attack/Melee/Damage/Pierce", "multiply": 1.2},
{"value": "Attack/Melee/Crush", "multiply": 1.2}], {"value": "Attack/Melee/Damage/Crush", "multiply": 1.2}],
"affects": ["Cavalry Melee"], "affects": ["Cavalry Melee"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -15,9 +15,9 @@
"icon": "horse_rider.png", "icon": "horse_rider.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "+20% ranged cavalry attack.", "tooltip": "+20% ranged cavalry attack.",
"modifications": [{"value": "Attack/Ranged/Hack", "multiply": 1.2}, "modifications": [{"value": "Attack/Ranged/Damage/Hack", "multiply": 1.2},
{"value": "Attack/Ranged/Pierce", "multiply": 1.2}, {"value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2},
{"value": "Attack/Ranged/Crush", "multiply": 1.2}], {"value": "Attack/Ranged/Damage/Crush", "multiply": 1.2}],
"affects": ["Cavalry Ranged"], "affects": ["Cavalry Ranged"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -16,9 +16,9 @@
"icon": "horse_rider.png", "icon": "horse_rider.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "Equip your ranged cavalry with better weapons. +20% ranged cavalry attack.", "tooltip": "Equip your ranged cavalry with better weapons. +20% ranged cavalry attack.",
"modifications": [{"value": "Attack/Ranged/Hack", "multiply": 1.2}, "modifications": [{"value": "Attack/Ranged/Damage/Hack", "multiply": 1.2},
{"value": "Attack/Ranged/Pierce", "multiply": 1.2}, {"value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2},
{"value": "Attack/Ranged/Crush", "multiply": 1.2}], {"value": "Attack/Ranged/Damage/Crush", "multiply": 1.2}],
"affects": ["Cavalry Ranged"], "affects": ["Cavalry Ranged"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -16,8 +16,8 @@
"researchTime": 40, "researchTime": 40,
"tooltip": "Guard units have uncommon courage and valor in battle. Champions +2 attack.", "tooltip": "Guard units have uncommon courage and valor in battle. Champions +2 attack.",
"modifications": [ "modifications": [
{"value": "Attack/Melee/Hack", "add": 2.0, "affects": "Champion Melee"}, {"value": "Attack/Melee/Damage/Hack", "add": 2.0, "affects": "Champion Melee"},
{"value": "Attack/Ranged/Pierce", "add": 2.0, "affects": "Champion Ranged"} {"value": "Attack/Ranged/Damage/Pierce", "add": 2.0, "affects": "Champion Ranged"}
], ],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -15,9 +15,9 @@
"icon": "sword.png", "icon": "sword.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "+20% melee infantry attack.", "tooltip": "+20% melee infantry attack.",
"modifications": [{"value": "Attack/Melee/Hack", "multiply": 1.2}, "modifications": [{"value": "Attack/Melee/Damage/Hack", "multiply": 1.2},
{"value": "Attack/Melee/Pierce", "multiply": 1.2}, {"value": "Attack/Melee/Damage/Pierce", "multiply": 1.2},
{"value": "Attack/Melee/Crush", "multiply": 1.2}], {"value": "Attack/Melee/Damage/Crush", "multiply": 1.2}],
"affects": ["Infantry Melee"], "affects": ["Infantry Melee"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -8,9 +8,9 @@
"icon": "sword_cross.png", "icon": "sword_cross.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "+20% melee infantry attack.", "tooltip": "+20% melee infantry attack.",
"modifications": [{"value": "Attack/Melee/Hack", "multiply": 1.2}, "modifications": [{"value": "Attack/Melee/Damage/Hack", "multiply": 1.2},
{"value": "Attack/Melee/Pierce", "multiply": 1.2}, {"value": "Attack/Melee/Damage/Pierce", "multiply": 1.2},
{"value": "Attack/Melee/Crush", "multiply": 1.2}], {"value": "Attack/Melee/Damage/Crush", "multiply": 1.2}],
"affects": ["Infantry Melee"], "affects": ["Infantry Melee"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -14,9 +14,9 @@
"icon": "arrow.png", "icon": "arrow.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "+20% ranged infantry attack.", "tooltip": "+20% ranged infantry attack.",
"modifications": [{"value": "Attack/Ranged/Hack", "multiply": 1.2}, "modifications": [{"value": "Attack/Ranged/Damage/Hack", "multiply": 1.2},
{"value": "Attack/Ranged/Pierce", "multiply": 1.2}, {"value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2},
{"value": "Attack/Ranged/Crush", "multiply": 1.2}], {"value": "Attack/Ranged/Damage/Crush", "multiply": 1.2}],
"affects": ["Infantry Ranged"], "affects": ["Infantry Ranged"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -15,9 +15,9 @@
"icon": "javelin_thong.png", "icon": "javelin_thong.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "+20% ranged infantry attack.", "tooltip": "+20% ranged infantry attack.",
"modifications": [{"value": "Attack/Ranged/Hack", "multiply": 1.2}, "modifications": [{"value": "Attack/Ranged/Damage/Hack", "multiply": 1.2},
{"value": "Attack/Ranged/Pierce", "multiply": 1.2}, {"value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2},
{"value": "Attack/Ranged/Crush", "multiply": 1.2}], {"value": "Attack/Ranged/Damage/Crush", "multiply": 1.2}],
"affects": ["Infantry Ranged"], "affects": ["Infantry Ranged"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -15,12 +15,12 @@
"researchTime": 40, "researchTime": 40,
"tooltip": "Inspire your troops with higher pay. All land and naval army +25% attack.", "tooltip": "Inspire your troops with higher pay. All land and naval army +25% attack.",
"modifications": [ "modifications": [
{"value": "Attack/Melee/Hack", "multiply": 1.25}, {"value": "Attack/Melee/Damage/Hack", "multiply": 1.25},
{"value": "Attack/Melee/Pierce", "multiply": 1.25}, {"value": "Attack/Melee/Damage/Pierce", "multiply": 1.25},
{"value": "Attack/Melee/Crush", "multiply": 1.25}, {"value": "Attack/Melee/Damage/Crush", "multiply": 1.25},
{"value": "Attack/Ranged/Hack", "multiply": 1.25}, {"value": "Attack/Ranged/Damage/Hack", "multiply": 1.25},
{"value": "Attack/Ranged/Pierce", "multiply": 1.25}, {"value": "Attack/Ranged/Damage/Pierce", "multiply": 1.25},
{"value": "Attack/Ranged/Crush", "multiply": 1.25} {"value": "Attack/Ranged/Damage/Crush", "multiply": 1.25}
], ],
"affects": ["Melee", "Ranged"], "affects": ["Melee", "Ranged"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
@@ -12,8 +12,8 @@
"researchTime": 60, "researchTime": 60,
"tooltip": "+20% Hack attack for all swordsmen and macemen.", "tooltip": "+20% Hack attack for all swordsmen and macemen.",
"modifications": [ "modifications": [
{ "value": "Attack/Melee/Hack", "multiply": 1.2 }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2 },
{ "value": "Attack/Melee/Crush", "multiply": 1.2 } { "value": "Attack/Melee/Damage/Crush", "multiply": 1.2 }
], ],
"affects": ["Sword", "Maceman"], "affects": ["Sword", "Maceman"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
@@ -14,8 +14,8 @@
{ "value": "Attack/Ranged/MaxRange", "add": 4, "affects": "Ranged" }, { "value": "Attack/Ranged/MaxRange", "add": 4, "affects": "Ranged" },
{ "value": "Vision/Range", "add": 4, "affects": "Ranged" }, { "value": "Vision/Range", "add": 4, "affects": "Ranged" },
{ "value": "Attack/Ranged/Spread", "multiply": 0.9, "affects": "Ranged" }, { "value": "Attack/Ranged/Spread", "multiply": 0.9, "affects": "Ranged" },
{ "value": "Attack/Melee/Hack", "multiply": 1.2, "affects": "Melee" }, { "value": "Attack/Melee/Damage/Hack", "multiply": 1.2, "affects": "Melee" },
{ "value": "Attack/Melee/Pierce", "multiply": 1.2, "affects": "Melee" }, { "value": "Attack/Melee/Damage/Pierce", "multiply": 1.2, "affects": "Melee" },
{ "value": "Vision/Range", "add": 3, "affects": "Healer" }, { "value": "Vision/Range", "add": 3, "affects": "Healer" },
{ "value": "Heal/Range", "add": 3, "affects": "Healer" }, { "value": "Heal/Range", "add": 3, "affects": "Healer" },
{ "value": "Heal/HP", "add": 5, "affects": "Healer" }, { "value": "Heal/HP", "add": 5, "affects": "Healer" },
@@ -12,7 +12,7 @@
"icon": "spear.png", "icon": "spear.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "Spearmen +2 hack attack.", "tooltip": "Spearmen +2 hack attack.",
"modifications": [{"value": "Attack/Melee/Hack", "add": 2.0}], "modifications": [{"value": "Attack/Melee/Damage/Hack", "add": 2.0}],
"affects": ["Infantry Spear"], "affects": ["Infantry Spear"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -16,7 +16,7 @@
"icon": "sword.png", "icon": "sword.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "Melee infantry +1 hack attack.", "tooltip": "Melee infantry +1 hack attack.",
"modifications": [{"value": "Attack/Melee/Hack", "add": 1.0}], "modifications": [{"value": "Attack/Melee/Damage/Hack", "add": 1.0}],
"affects": ["Infantry Melee"], "affects": ["Infantry Melee"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -14,7 +14,7 @@
"icon": "spear.png", "icon": "spear.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "All Spear units +2 hack attack.", "tooltip": "All Spear units +2 hack attack.",
"modifications": [{"value": "Attack/Melee/Hack", "add": 2.0}], "modifications": [{"value": "Attack/Melee/Damage/Hack", "add": 2.0}],
"affects": ["Spear"], "affects": ["Spear"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -14,9 +14,9 @@
"icon": "arrow.png", "icon": "arrow.png",
"researchTime": 40, "researchTime": 40,
"tooltip": "+20% ranged infantry attack.", "tooltip": "+20% ranged infantry attack.",
"modifications": [{"value": "Attack/Ranged/Hack", "multiply": 1.2}, "modifications": [{"value": "Attack/Ranged/Damage/Hack", "multiply": 1.2},
{"value": "Attack/Ranged/Pierce", "multiply": 1.2}, {"value": "Attack/Ranged/Damage/Pierce", "multiply": 1.2},
{"value": "Attack/Ranged/Crush", "multiply": 1.2}], {"value": "Attack/Ranged/Damage/Crush", "multiply": 1.2}],
"affects": ["Infantry Ranged"], "affects": ["Infantry Ranged"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -16,7 +16,7 @@
"researchTime": 30, "researchTime": 30,
"tooltip": "All Javelin units +2 pierce attack and +4 range.", "tooltip": "All Javelin units +2 pierce attack and +4 range.",
"modifications": [ "modifications": [
{"value": "Attack/Ranged/Pierce", "add": 2.0}, {"value": "Attack/Ranged/Damage/Pierce", "add": 2.0},
{"value": "Attack/Ranged/MaxRange", "add": 4.0}, {"value": "Attack/Ranged/MaxRange", "add": 4.0},
{"value": "Vision/Range", "add": 4.0}], {"value": "Vision/Range", "add": 4.0}],
"affects": ["Javelin"], "affects": ["Javelin"],
@@ -8,8 +8,8 @@
"researchTime": 40, "researchTime": 40,
"tooltip": "All siege weapons +25% Crush damage.", "tooltip": "All siege weapons +25% Crush damage.",
"modifications": [ "modifications": [
{"value": "Attack/Melee/Crush", "multiply": 1.25}, {"value": "Attack/Melee/Damage/Crush", "multiply": 1.25},
{"value": "Attack/Ranged/Crush", "multiply": 1.25}], {"value": "Attack/Ranged/Damage/Crush", "multiply": 1.25}],
"affects": ["Siege"], "affects": ["Siege"],
"soundComplete": "interface/alarm/alarm_upgradearmory.xml" "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
} }
@@ -1,8 +1,8 @@
DamageTypes.prototype.BuildSchema = function(helptext = "") DamageTypes.prototype.BuildSchema = function(helptext = "")
{ {
return this.GetTypes().reduce((schema, type) => return "<interleave>" + this.GetTypes().reduce((schema, type) =>
schema + "<element name='"+type+"' a:help='"+type+" "+helptext+"'><ref name='nonNegativeDecimal'/></element>", schema + "<element name='"+type+"' a:help='"+type+" "+helptext+"'><ref name='nonNegativeDecimal'/></element>",
""); "") + "</interleave>";
}; };
DamageTypes = new DamageTypes(); DamageTypes = new DamageTypes();
@@ -2,9 +2,11 @@
<Entity parent="template_structure_civic_civil_centre"> <Entity parent="template_structure_civic_civil_centre">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0.0</Hack> <Damage>
<Pierce>25.0</Pierce> <Hack>0.0</Hack>
<Crush>0.0</Crush> <Pierce>25.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>50.0</MaxRange> <MaxRange>50.0</MaxRange>
<MinRange>1.0</MinRange> <MinRange>1.0</MinRange>
<PrepareTime>1200</PrepareTime> <PrepareTime>1200</PrepareTime>
@@ -2,9 +2,11 @@
<Entity parent="template_structure_civic_civil_centre"> <Entity parent="template_structure_civic_civil_centre">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0.0</Hack> <Damage>
<Pierce>25.0</Pierce> <Hack>0.0</Hack>
<Crush>0.0</Crush> <Pierce>25.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>50.0</MaxRange> <MaxRange>50.0</MaxRange>
<MinRange>1.0</MinRange> <MinRange>1.0</MinRange>
<PrepareTime>1200</PrepareTime> <PrepareTime>1200</PrepareTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_hunt_aggressive"> <Entity parent="template_unit_fauna_hunt_aggressive">
<Attack> <Attack>
<Melee> <Melee>
<Hack>20.0</Hack> <Damage>
<Pierce>0.0</Pierce> <Hack>20.0</Hack>
<Crush>20.0</Crush> <Pierce>0.0</Pierce>
<Crush>20.0</Crush>
</Damage>
<MaxRange>6.0</MaxRange> <MaxRange>6.0</MaxRange>
<RepeatTime>2000</RepeatTime> <RepeatTime>2000</RepeatTime>
</Melee> </Melee>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_hunt_aggressive"> <Entity parent="template_unit_fauna_hunt_aggressive">
<Attack> <Attack>
<Melee> <Melee>
<Hack>12.0</Hack> <Damage>
<Pierce>0.0</Pierce> <Hack>12.0</Hack>
<Crush>0.0</Crush> <Pierce>0.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>1.0</MaxRange> <MaxRange>1.0</MaxRange>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
</Melee> </Melee>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_wild_aggressive"> <Entity parent="template_unit_fauna_wild_aggressive">
<Attack> <Attack>
<Melee> <Melee>
<Hack>30.0</Hack> <Damage>
<Pierce>0.0</Pierce> <Hack>30.0</Hack>
<Crush>0.0</Crush> <Pierce>0.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>8.0</MaxRange> <MaxRange>8.0</MaxRange>
<RepeatTime>2000</RepeatTime> <RepeatTime>2000</RepeatTime>
</Melee> </Melee>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_wild_violent"> <Entity parent="template_unit_fauna_wild_violent">
<Attack> <Attack>
<Melee> <Melee>
<Hack>20.0</Hack> <Damage>
<Pierce>0.0</Pierce> <Hack>20.0</Hack>
<Crush>0.0</Crush> <Pierce>0.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>4.0</MaxRange> <MaxRange>4.0</MaxRange>
<RepeatTime>2000</RepeatTime> <RepeatTime>2000</RepeatTime>
</Melee> </Melee>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_hunt_aggressive"> <Entity parent="template_unit_fauna_hunt_aggressive">
<Attack> <Attack>
<Melee> <Melee>
<Hack>20.0</Hack> <Damage>
<Pierce>0.0</Pierce> <Hack>20.0</Hack>
<Crush>20.0</Crush> <Pierce>0.0</Pierce>
<Crush>20.0</Crush>
</Damage>
<MaxRange>6.0</MaxRange> <MaxRange>6.0</MaxRange>
<RepeatTime>2000</RepeatTime> <RepeatTime>2000</RepeatTime>
</Melee> </Melee>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_wild_violent"> <Entity parent="template_unit_fauna_wild_violent">
<Attack> <Attack>
<Melee> <Melee>
<Hack>30.0</Hack> <Damage>
<Pierce>20.0</Pierce> <Hack>30.0</Hack>
<Crush>0.0</Crush> <Pierce>20.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>4.0</MaxRange> <MaxRange>4.0</MaxRange>
<RepeatTime>2000</RepeatTime> <RepeatTime>2000</RepeatTime>
</Melee> </Melee>
@@ -7,9 +7,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>15.0</Hack> <Damage>
<Pierce>10.0</Pierce> <Hack>15.0</Hack>
<Crush>0.0</Crush> <Pierce>10.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>4.0</MaxRange> <MaxRange>4.0</MaxRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
@@ -12,9 +12,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0.0</Hack> <Damage>
<Pierce>25.0</Pierce> <Hack>0.0</Hack>
<Crush>0.0</Crush> <Pierce>25.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>60.0</MaxRange> <MaxRange>60.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>1200</PrepareTime> <PrepareTime>1200</PrepareTime>
@@ -17,9 +17,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0.0</Hack> <Damage>
<Pierce>12.0</Pierce> <Hack>0.0</Hack>
<Crush>0.0</Crush> <Pierce>12.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>72.0</MaxRange> <MaxRange>72.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>1200</PrepareTime> <PrepareTime>1200</PrepareTime>
@@ -2,9 +2,11 @@
<Entity parent="template_structure_defensive"> <Entity parent="template_structure_defensive">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0</Hack> <Damage>
<Pierce>0</Pierce> <Hack>0</Hack>
<Crush>0</Crush> <Pierce>0</Pierce>
<Crush>0</Crush>
</Damage>
<PrepareTime>1200</PrepareTime> <PrepareTime>1200</PrepareTime>
<RepeatTime>2000</RepeatTime> <RepeatTime>2000</RepeatTime>
<Delay>0</Delay> <Delay>0</Delay>
@@ -12,7 +12,9 @@
</Armour> </Armour>
<Attack> <Attack>
<Ranged> <Ranged>
<Pierce>16</Pierce> <Damage>
<Pierce>16</Pierce>
</Damage>
<MaxRange>55</MaxRange> <MaxRange>55</MaxRange>
<MinRange>13</MinRange> <MinRange>13</MinRange>
<ElevationBonus>0</ElevationBonus> <ElevationBonus>0</ElevationBonus>
@@ -7,7 +7,9 @@
</Armour> </Armour>
<Attack> <Attack>
<Ranged> <Ranged>
<Pierce>9</Pierce> <Damage>
<Pierce>9</Pierce>
</Damage>
<MaxRange>70</MaxRange> <MaxRange>70</MaxRange>
<MinRange>10</MinRange> <MinRange>10</MinRange>
<ElevationBonus>9</ElevationBonus> <ElevationBonus>9</ElevationBonus>
@@ -2,7 +2,9 @@
<Entity parent="template_structure_defensive_tower"> <Entity parent="template_structure_defensive_tower">
<Attack> <Attack>
<Ranged> <Ranged>
<Pierce>12</Pierce> <Damage>
<Pierce>12</Pierce>
</Damage>
<MaxRange>76</MaxRange> <MaxRange>76</MaxRange>
<MinRange>10</MinRange> <MinRange>10</MinRange>
<ElevationBonus>15</ElevationBonus> <ElevationBonus>15</ElevationBonus>
@@ -2,9 +2,11 @@
<Entity parent="template_structure_defensive_wall"> <Entity parent="template_structure_defensive_wall">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0.0</Hack> <Damage>
<Pierce>8.0</Pierce> <Hack>0.0</Hack>
<Crush>0.0</Crush> <Pierce>8.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>72.0</MaxRange> <MaxRange>72.0</MaxRange>
<MinRange>12.0</MinRange> <MinRange>12.0</MinRange>
<PrepareTime>1200</PrepareTime> <PrepareTime>1200</PrepareTime>
@@ -7,9 +7,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0.0</Hack> <Damage>
<Pierce>16.0</Pierce> <Hack>0.0</Hack>
<Crush>0.0</Crush> <Pierce>16.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>72.0</MaxRange> <MaxRange>72.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>1200</PrepareTime> <PrepareTime>1200</PrepareTime>
@@ -13,9 +13,11 @@
<RestrictedClasses datatype="tokens">Field Palisade SiegeWall StoneWall</RestrictedClasses> <RestrictedClasses datatype="tokens">Field Palisade SiegeWall StoneWall</RestrictedClasses>
</Capture> </Capture>
<Slaughter> <Slaughter>
<Hack>100.0</Hack> <Damage>
<Pierce>0.0</Pierce> <Hack>100.0</Hack>
<Crush>0.0</Crush> <Pierce>0.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>2</MaxRange> <MaxRange>2</MaxRange>
</Slaughter> </Slaughter>
</Attack> </Attack>
@@ -6,9 +6,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>13</Hack> <Damage>
<Pierce>0</Pierce> <Hack>13</Hack>
<Crush>0.0</Crush> <Pierce>0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>3.5</MaxRange> <MaxRange>3.5</MaxRange>
<PrepareTime>375</PrepareTime> <PrepareTime>375</PrepareTime>
<RepeatTime>750</RepeatTime> <RepeatTime>750</RepeatTime>
@@ -2,8 +2,10 @@
<Entity parent="template_unit_cavalry_melee"> <Entity parent="template_unit_cavalry_melee">
<Attack> <Attack>
<Melee> <Melee>
<Hack>6.0</Hack> <Damage>
<Pierce>5.0</Pierce> <Hack>6.0</Hack>
<Pierce>5.0</Pierce>
</Damage>
<MaxRange>4.5</MaxRange> <MaxRange>4.5</MaxRange>
<Bonuses> <Bonuses>
<BonusCavMelee> <BonusCavMelee>
@@ -6,9 +6,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>6.5</Hack> <Damage>
<Pierce>0</Pierce> <Hack>6.5</Hack>
<Crush>0.0</Crush> <Pierce>0</Pierce>
<Crush>0.0</Crush>
</Damage>
<PreferredClasses datatype="tokens">Siege</PreferredClasses> <PreferredClasses datatype="tokens">Siege</PreferredClasses>
</Melee> </Melee>
</Attack> </Attack>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_cavalry"> <Entity parent="template_unit_cavalry">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0</Hack> <Damage>
<Pierce>9.0</Pierce> <Hack>0</Hack>
<Crush>0</Crush> <Pierce>9.0</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>16.0</MaxRange> <MaxRange>16.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>1000</PrepareTime> <PrepareTime>1000</PrepareTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_cavalry_ranged"> <Entity parent="template_unit_cavalry_ranged">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0</Hack> <Damage>
<Pierce>7.0</Pierce> <Hack>0</Hack>
<Crush>0</Crush> <Pierce>7.0</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>72.0</MaxRange> <MaxRange>72.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_cavalry_ranged"> <Entity parent="template_unit_cavalry_ranged">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0</Hack> <Damage>
<Pierce>18.0</Pierce> <Hack>0</Hack>
<Crush>0</Crush> <Pierce>18.0</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>28.0</MaxRange> <MaxRange>28.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>750</PrepareTime> <PrepareTime>750</PrepareTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_champion_cavalry"> <Entity parent="template_unit_champion_cavalry">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0</Hack> <Damage>
<Pierce>14.0</Pierce> <Hack>0</Hack>
<Crush>0</Crush> <Pierce>14.0</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>76.0</MaxRange> <MaxRange>76.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_champion_cavalry"> <Entity parent="template_unit_champion_cavalry">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0.0</Hack> <Damage>
<Pierce>36.0</Pierce> <Hack>0.0</Hack>
<Crush>0.0</Crush> <Pierce>36.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>32.0</MaxRange> <MaxRange>32.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>750</PrepareTime> <PrepareTime>750</PrepareTime>
@@ -6,9 +6,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>12.0</Hack> <Damage>
<Pierce>10.0</Pierce> <Hack>12.0</Hack>
<Crush>0.0</Crush> <Pierce>10.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>4.5</MaxRange> <MaxRange>4.5</MaxRange>
<Bonuses> <Bonuses>
<BonusCavMelee> <BonusCavMelee>
@@ -6,9 +6,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>13.0</Hack> <Damage>
<Pierce>0</Pierce> <Hack>13.0</Hack>
<Crush>0.0</Crush> <Pierce>0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>3.5</MaxRange> <MaxRange>3.5</MaxRange>
<PrepareTime>375</PrepareTime> <PrepareTime>375</PrepareTime>
<RepeatTime>750</RepeatTime> <RepeatTime>750</RepeatTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_champion_elephant"> <Entity parent="template_unit_champion_elephant">
<Attack replace=""> <Attack replace="">
<Melee> <Melee>
<Hack>20</Hack> <Damage>
<Pierce>0</Pierce> <Hack>20</Hack>
<Crush>150.0</Crush> <Pierce>0</Pierce>
<Crush>150.0</Crush>
</Damage>
<MaxRange>8.0</MaxRange> <MaxRange>8.0</MaxRange>
<PrepareTime>750</PrepareTime> <PrepareTime>750</PrepareTime>
<RepeatTime>1500</RepeatTime> <RepeatTime>1500</RepeatTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_champion_infantry"> <Entity parent="template_unit_champion_infantry">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0</Hack> <Damage>
<Pierce>6.5</Pierce> <Hack>0</Hack>
<Crush>0</Crush> <Pierce>6.5</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>76</MaxRange> <MaxRange>76</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>300</PrepareTime> <PrepareTime>300</PrepareTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_champion_infantry"> <Entity parent="template_unit_champion_infantry">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0</Hack> <Damage>
<Pierce>26.0</Pierce> <Hack>0</Hack>
<Crush>0</Crush> <Pierce>26.0</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>28.0</MaxRange> <MaxRange>28.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
@@ -6,9 +6,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>0</Hack> <Damage>
<Pierce>0</Pierce> <Hack>0</Hack>
<Crush>10.5</Crush> <Pierce>0</Pierce>
<Crush>10.5</Crush>
</Damage>
<MaxRange>3.5</MaxRange> <MaxRange>3.5</MaxRange>
<PrepareTime>375</PrepareTime> <PrepareTime>375</PrepareTime>
<RepeatTime>750</RepeatTime> <RepeatTime>750</RepeatTime>
@@ -7,9 +7,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>2.0</Hack> <Damage>
<Pierce>6.0</Pierce> <Hack>2.0</Hack>
<Crush>0.0</Crush> <Pierce>6.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>7</MaxRange> <MaxRange>7</MaxRange>
<PrepareTime>1000</PrepareTime> <PrepareTime>1000</PrepareTime>
<RepeatTime>2000</RepeatTime> <RepeatTime>2000</RepeatTime>
@@ -6,9 +6,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>6.0</Hack> <Damage>
<Pierce>5.0</Pierce> <Hack>6.0</Hack>
<Crush>0.0</Crush> <Pierce>5.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>4.5</MaxRange> <MaxRange>4.5</MaxRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>900</RepeatTime> <RepeatTime>900</RepeatTime>
@@ -6,9 +6,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>11.0</Hack> <Damage>
<Pierce>0</Pierce> <Hack>11.0</Hack>
<Crush>0.0</Crush> <Pierce>0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>3.5</MaxRange> <MaxRange>3.5</MaxRange>
<PrepareTime>375</PrepareTime> <PrepareTime>375</PrepareTime>
<RepeatTime>750</RepeatTime> <RepeatTime>750</RepeatTime>
@@ -7,9 +7,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>7</Hack> <Damage>
<Pierce>2</Pierce> <Hack>7</Hack>
<Crush>0.0</Crush> <Pierce>2</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>3</MaxRange> <MaxRange>3</MaxRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_hunt"> <Entity parent="template_unit_fauna_hunt">
<Attack> <Attack>
<Melee> <Melee>
<Hack>1</Hack> <Damage>
<Pierce>1</Pierce> <Hack>1</Hack>
<Crush>0</Crush> <Pierce>1</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>4</MaxRange> <MaxRange>4</MaxRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
@@ -6,9 +6,11 @@
</Footprint> </Footprint>
<Attack> <Attack>
<Melee> <Melee>
<Hack>1</Hack> <Damage>
<Pierce>5</Pierce> <Hack>1</Hack>
<Crush>2</Crush> <Pierce>5</Pierce>
<Crush>2</Crush>
</Damage>
<MaxRange>4</MaxRange> <MaxRange>4</MaxRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
@@ -7,9 +7,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>25.0</Hack> <Damage>
<Pierce>10.0</Pierce> <Hack>25.0</Hack>
<Crush>20.0</Crush> <Pierce>10.0</Pierce>
<Crush>20.0</Crush>
</Damage>
<MaxRange>6.0</MaxRange> <MaxRange>6.0</MaxRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_hunt"> <Entity parent="template_unit_fauna_hunt">
<Attack> <Attack>
<Melee> <Melee>
<Hack>1</Hack> <Damage>
<Pierce>1</Pierce> <Hack>1</Hack>
<Crush>0</Crush> <Pierce>1</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>4</MaxRange> <MaxRange>4</MaxRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_wild"> <Entity parent="template_unit_fauna_wild">
<Attack> <Attack>
<Melee> <Melee>
<Hack>1</Hack> <Damage>
<Pierce>1</Pierce> <Hack>1</Hack>
<Crush>0</Crush> <Pierce>1</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>4</MaxRange> <MaxRange>4</MaxRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
@@ -2,8 +2,10 @@
<Entity parent="template_unit_fauna_wild_aggressive_wolf"> <Entity parent="template_unit_fauna_wild_aggressive_wolf">
<Attack> <Attack>
<Melee> <Melee>
<Hack>7</Hack> <Damage>
<Pierce>2</Pierce> <Hack>7</Hack>
<Pierce>2</Pierce>
</Damage>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
</Melee> </Melee>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_wild_aggressive"> <Entity parent="template_unit_fauna_wild_aggressive">
<Attack> <Attack>
<Melee> <Melee>
<Hack>10.0</Hack> <Damage>
<Pierce>10.0</Pierce> <Hack>10.0</Hack>
<Crush>0.0</Crush> <Pierce>10.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>4.0</MaxRange> <MaxRange>4.0</MaxRange>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
</Melee> </Melee>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_wild_defensive"> <Entity parent="template_unit_fauna_wild_defensive">
<Attack> <Attack>
<Melee> <Melee>
<Hack>2.5</Hack> <Damage>
<Pierce>5.0</Pierce> <Hack>2.5</Hack>
<Crush>0.0</Crush> <Pierce>5.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>3.0</MaxRange> <MaxRange>3.0</MaxRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_fauna_wild"> <Entity parent="template_unit_fauna_wild">
<Attack> <Attack>
<Melee> <Melee>
<Hack>1</Hack> <Damage>
<Pierce>1</Pierce> <Hack>1</Hack>
<Crush>0</Crush> <Pierce>1</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>4</MaxRange> <MaxRange>4</MaxRange>
<PrepareTime>500</PrepareTime> <PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime> <RepeatTime>1000</RepeatTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_hero_cavalry"> <Entity parent="template_unit_hero_cavalry">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0</Hack> <Damage>
<Pierce>35</Pierce> <Hack>0</Hack>
<Crush>0</Crush> <Pierce>35</Pierce>
<Crush>0</Crush>
</Damage>
<MaxRange>80.0</MaxRange> <MaxRange>80.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>1200</PrepareTime> <PrepareTime>1200</PrepareTime>
@@ -2,9 +2,11 @@
<Entity parent="template_unit_hero_cavalry"> <Entity parent="template_unit_hero_cavalry">
<Attack> <Attack>
<Ranged> <Ranged>
<Hack>0.0</Hack> <Damage>
<Pierce>60.0</Pierce> <Hack>0.0</Hack>
<Crush>0.0</Crush> <Pierce>60.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>36.0</MaxRange> <MaxRange>36.0</MaxRange>
<MinRange>0.0</MinRange> <MinRange>0.0</MinRange>
<PrepareTime>750</PrepareTime> <PrepareTime>750</PrepareTime>
@@ -6,9 +6,11 @@
</Armour> </Armour>
<Attack> <Attack>
<Melee> <Melee>
<Hack>24.0</Hack> <Damage>
<Pierce>20.0</Pierce> <Hack>24.0</Hack>
<Crush>0.0</Crush> <Pierce>20.0</Pierce>
<Crush>0.0</Crush>
</Damage>
<MaxRange>4.5</MaxRange> <MaxRange>4.5</MaxRange>
<Bonuses> <Bonuses>
<BonusCavMelee> <BonusCavMelee>

Some files were not shown because too many files have changed in this diff Show More