public override float PowerScoreFor(AbilityAIDef abilityDef, Pawn pawn) { var baseScore = abilityDef.power; //Grab enemies \ allies var potentionalTargets = new List <Thing>(GrabTargets(abilityDef, pawn, CustomGrabTargetsPredicate(abilityDef, pawn), MaxTargetsToCheck)); //Add self if can target allies. if (abilityDef.canTargetAlly) { potentionalTargets.Add(pawn); } //Get the highest intersecting target. var targetInfos = new List <LocalTargetInfo>(); foreach (var target in potentionalTargets) { targetInfos.Add(new LocalTargetInfo(target)); } var bestTarget = AbilityMaths.PickMostRadialIntersectingTarget(targetInfos, abilityDef.abilityRadius); //If we found no valid target, return negative power. if (bestTarget == LocalTargetInfo.Invalid) { return(-abilityDef.power); } //Calculate final score from best target. var finalScore = baseScore; foreach (var targetPawn in AbilityUtility.GetPawnsInsideRadius(bestTarget, pawn.Map, abilityDef.abilityRadius, predPawn => abilityDef.abilityRadiusNeedSight && GenSight.LineOfSight(pawn.Position, predPawn.Position, pawn.Map, true) || abilityDef.abilityRadiusNeedSight == false)) { if (targetPawn.HostileTo(pawn) || targetPawn.AnimalOrWildMan() ) //Hostile pawns or animals increase score. { finalScore += abilityDef.power; } else //Friendly pawns decrease score. { finalScore -= abilityDef.power; } } //Log.Message("AbilityWorker_AreaOfEffect, finalScore=" + finalScore); return(finalScore); }
public override LocalTargetInfo TargetAbilityFor(AbilityAIDef abilityDef, Pawn pawn) { //Grab enemies \ allies List <Thing> potentionalTargets = new List <Thing>(GrabTargets(abilityDef, pawn, CustomGrabTargetsPredicate(abilityDef, pawn), MaxTargetsToCheck)); //Add self if can target allies. if (abilityDef.canTargetAlly) { potentionalTargets.Add(pawn); } //Get the highest intersecting target. List <LocalTargetInfo> targetInfos = new List <LocalTargetInfo>(); foreach (Thing target in potentionalTargets) { targetInfos.Add(new LocalTargetInfo(target)); } LocalTargetInfo bestTarget = AbilityMaths.PickMostRadialIntersectingTarget(targetInfos, abilityDef.abilityRadius); return(bestTarget); }