From 9280b57e79d244524f3aaa2826fa93abb77de8db Mon Sep 17 00:00:00 2001 From: wraitii Date: Sat, 24 Aug 2019 08:52:15 +0000 Subject: [PATCH] Make damage bonuses, attack preferred classes and garrisonHolder ejectable classes use MatchesClassList. MatchesClassList supports additional functionalities (and, not and or). Reviewed By: wraitii Patch By: Freagarach Differential Revision: https://code.wildfiregames.com/D2115 This was SVN commit r22769. --- .../mods/public/simulation/components/Attack.js | 14 +++++++++----- .../public/simulation/components/GarrisonHolder.js | 8 ++++++-- .../simulation/components/tests/test_Damage.js | 2 +- .../mods/public/simulation/helpers/DamageBonus.js | 5 ++--- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/binaries/data/mods/public/simulation/components/Attack.js b/binaries/data/mods/public/simulation/components/Attack.js index cd6a8c0984..09653cd93d 100644 --- a/binaries/data/mods/public/simulation/components/Attack.js +++ b/binaries/data/mods/public/simulation/components/Attack.js @@ -347,6 +347,12 @@ Attack.prototype.GetAttackEffectsData = function(type, splash) return Attacking.GetAttackEffectsData("Attack/" + type + splash ? "/Splash" : "", tp, this.entity); }; +/** + * Find the best attack against a target. + * @param {number} target - The entity-ID of the target. + * @param {boolean} allowCapture - Whether capturing is allowed. + * @return {string} - The preferred attack type. + */ Attack.prototype.GetBestAttackAgainst = function(target, allowCapture) { let cmpFormation = Engine.QueryInterface(target, IID_Formation); @@ -361,11 +367,8 @@ Attack.prototype.GetBestAttackAgainst = function(target, allowCapture) if (!cmpIdentity) return undefined; - let targetClasses = cmpIdentity.GetClassesList(); - let isTargetClass = className => targetClasses.indexOf(className) != -1; - // Always slaughter domestic animals instead of using a normal attack - if (isTargetClass("Domestic") && this.template.Slaughter) + if (this.template.Slaughter && cmpIdentity.HasClass("Domestic")) return "Slaughter"; let types = this.GetAttackTypes().filter(type => this.CanAttack(target, [type])); @@ -379,7 +382,8 @@ Attack.prototype.GetBestAttackAgainst = function(target, allowCapture) types.splice(captureIndex, 1); } - let isPreferred = className => this.GetPreferredClasses(className).some(isTargetClass); + let targetClasses = cmpIdentity.GetClassesList(); + let isPreferred = attackType => MatchesClassList(targetClasses, this.GetPreferredClasses(attackType)); return types.sort((a, b) => (types.indexOf(a) + (isPreferred(a) ? types.length : 0)) - diff --git a/binaries/data/mods/public/simulation/components/GarrisonHolder.js b/binaries/data/mods/public/simulation/components/GarrisonHolder.js index 4282b247be..ef587b4586 100644 --- a/binaries/data/mods/public/simulation/components/GarrisonHolder.js +++ b/binaries/data/mods/public/simulation/components/GarrisonHolder.js @@ -674,16 +674,20 @@ GarrisonHolder.prototype.EjectOrKill = function(entities) this.UpdateGarrisonFlag(); }; +/** + * Whether an entity is ejectable. + * @param {number} entity - The entity-ID to be tested. + * @return {boolean} - Whether the entity is ejectable. + */ GarrisonHolder.prototype.IsEjectable = function(entity) { if (!this.entities.find(ent => ent == entity)) return false; let ejectableClasses = this.template.EjectClassesOnDestroy._string; - ejectableClasses = ejectableClasses ? ejectableClasses.split(/\s+/) : []; let entityClasses = Engine.QueryInterface(entity, IID_Identity).GetClassesList(); - return ejectableClasses.some(ejectableClass => entityClasses.indexOf(ejectableClass) != -1); + return MatchesClassList(entityClasses, ejectableClasses); }; /** diff --git a/binaries/data/mods/public/simulation/components/tests/test_Damage.js b/binaries/data/mods/public/simulation/components/tests/test_Damage.js index d80b994f01..542ff2cc98 100644 --- a/binaries/data/mods/public/simulation/components/tests/test_Damage.js +++ b/binaries/data/mods/public/simulation/components/tests/test_Damage.js @@ -505,7 +505,7 @@ function Test_MissileHit() let splashBonus = { "BonusCav": { "Classes": "Cavalry", "Multiplier": 10000 } }; AddMock(61, IID_Identity, { - "HasClass": cl => cl == "Cavalry" + "GetClassesList": () => ["Cavalry"] }); data.attackData.Bonuses = bonus; diff --git a/binaries/data/mods/public/simulation/helpers/DamageBonus.js b/binaries/data/mods/public/simulation/helpers/DamageBonus.js index b44c14d44a..b92ed46f3a 100644 --- a/binaries/data/mods/public/simulation/helpers/DamageBonus.js +++ b/binaries/data/mods/public/simulation/helpers/DamageBonus.js @@ -20,9 +20,8 @@ function GetAttackBonus(source, target, type, template) let bonus = template[key]; if (bonus.Civ && bonus.Civ !== cmpIdentity.GetCiv()) continue; - if (bonus.Classes && bonus.Classes.split(/\s+/).some(cls => !cmpIdentity.HasClass(cls))) - continue; - attackBonus *= ApplyValueModificationsToEntity("Attack/" + type + "/Bonuses/" + key + "/Multiplier", +bonus.Multiplier, source); + if (!bonus.Classes || MatchesClassList(cmpIdentity.GetClassesList(), bonus.Classes)) + attackBonus *= ApplyValueModificationsToEntity("Attack/" + type + "/Bonuses/" + key + "/Multiplier", +bonus.Multiplier, source); } return attackBonus;