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.
This commit is contained in:
wraitii
2019-08-24 08:52:15 +00:00
parent 47581ea900
commit 9280b57e79
4 changed files with 18 additions and 11 deletions
@@ -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)) -
@@ -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);
};
/**
@@ -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;
@@ -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;