Ticket #2343: combat_preference_by_bonus_2.patch

File combat_preference_by_bonus_2.patch, 2.1 KB (added by dumbo, 10 years ago)
  • binaries/data/mods/public/simulation/components/UnitAI.js

     
    54085408{
    54095409    var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
    54105410
    5411     if (!cmpAttack)
     5411    if (!cmpAttack || !ents.length)
    54125412        return false;
    54135413
    5414     const animalfilter = function(e) {
     5414    const filter = function(e) {
    54155415        var cmpUnitAI = Engine.QueryInterface(e, IID_UnitAI);
    54165416        return !cmpUnitAI || !cmpUnitAI.IsAnimal() || cmpUnitAI.IsDangerousAnimal();
    54175417    };
    54185418
    5419     return this.RespondToTargetedEntities(
    5420         ents.filter(function (v, i, a) { return cmpAttack.CanAttack(v) && animalfilter(v); })
    5421         .sort(function (a, b) { return cmpAttack.CompareEntitiesByPreference(a, b); })
    5422     );
     5419    // Use filter() to remove non-dangerous animals from ents.
     5420    var filteredEnts = ents.filter(function (v, i, a) { return cmpAttack.CanAttack(v) && filter(v); });
     5421   
     5422    // If it was only non-dangerous animals, do nothing.
     5423    if (!filteredEnts.length)
     5424        return false;
     5425
     5426    while (filteredEnts.length) {
     5427        // Otherwise prefer unit for best attack bonus.
     5428        var preferredEntity = this.GetAttackBonusPreference(filteredEnts);
     5429        if (this.RespondToTargetedEntities([preferredEntity]))
     5430            return true;
     5431        else
     5432            filteredEnts = filteredEnts.filter(function (v, i, a) { return v != preferredEntity; });
     5433    }
     5434   
     5435    return false;
     5436   
    54235437};
    54245438
     5439UnitAI.prototype.GetAttackBonusPreference = function(ents)
     5440{
     5441    var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
     5442
     5443    if (!cmpAttack || !ents.length)
     5444        return false;
     5445
     5446    var preferredUnit = ents[0];
     5447    var bestBonus = 0;
     5448
     5449    for each (var target in ents) {
     5450        var thisBonus = cmpAttack.GetAttackBonus(cmpAttack.GetBestAttackAgainst(target),target);
     5451        if (thisBonus == 2)
     5452            return target;
     5453
     5454        if ( thisBonus > bestBonus ) {
     5455            preferredUnit = target;
     5456            bestBonus = thisBonus;
     5457        }
     5458    }
     5459
     5460    return preferredUnit;
     5461};
     5462
    54255463Engine.RegisterComponentType(IID_UnitAI, "UnitAI", UnitAI);