Ticket #2343: combat_preference_by_bonus_3.patch
File combat_preference_by_bonus_3.patch, 2.0 KB (added by , 10 years ago) |
---|
-
binaries/data/mods/public/simulation/components/UnitAI.js
5408 5408 { 5409 5409 var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack); 5410 5410 5411 if (!cmpAttack )5411 if (!cmpAttack || !ents.length) 5412 5412 return false; 5413 5413 5414 const animalfilter = function(e) {5414 const filter = function(e) { 5415 5415 var cmpUnitAI = Engine.QueryInterface(e, IID_UnitAI); 5416 5416 return !cmpUnitAI || !cmpUnitAI.IsAnimal() || cmpUnitAI.IsDangerousAnimal(); 5417 5417 }; 5418 5418 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 5423 5437 }; 5424 5438 5439 UnitAI.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 5452 if ( thisBonus > bestBonus ) { 5453 preferredUnit = target; 5454 bestBonus = thisBonus; 5455 } 5456 } 5457 5458 return preferredUnit; 5459 }; 5460 5425 5461 Engine.RegisterComponentType(IID_UnitAI, "UnitAI", UnitAI);