Index: ps/trunk/binaries/data/mods/public/simulation/components/Attack.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/Attack.js +++ ps/trunk/binaries/data/mods/public/simulation/components/Attack.js @@ -347,6 +347,12 @@ 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 @@ 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 @@ 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)) - Index: ps/trunk/binaries/data/mods/public/simulation/components/GarrisonHolder.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/GarrisonHolder.js +++ ps/trunk/binaries/data/mods/public/simulation/components/GarrisonHolder.js @@ -674,16 +674,20 @@ 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); }; /** Index: ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Damage.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Damage.js +++ ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Damage.js @@ -505,7 +505,7 @@ let splashBonus = { "BonusCav": { "Classes": "Cavalry", "Multiplier": 10000 } }; AddMock(61, IID_Identity, { - "HasClass": cl => cl == "Cavalry" + "GetClassesList": () => ["Cavalry"] }); data.attackData.Bonuses = bonus; Index: ps/trunk/binaries/data/mods/public/simulation/helpers/DamageBonus.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/helpers/DamageBonus.js +++ ps/trunk/binaries/data/mods/public/simulation/helpers/DamageBonus.js @@ -20,9 +20,8 @@ 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;