forked from mirrors/0ad
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user