private static List <Pair <IAttackTarget, float> > GetAvailableShootingTargetsByScore(List <IAttackTarget> rawTargets, IAttackTargetSearcher searcher, Verb verb) { AttackTargetFinder.availableShootingTargets.Clear(); if (rawTargets.Count == 0) { return(AttackTargetFinder.availableShootingTargets); } AttackTargetFinder.tmpTargetScores.Clear(); AttackTargetFinder.tmpCanShootAtTarget.Clear(); float num = 0f; IAttackTarget attackTarget = null; for (int i = 0; i < rawTargets.Count; i++) { AttackTargetFinder.tmpTargetScores.Add(float.MinValue); AttackTargetFinder.tmpCanShootAtTarget.Add(false); if (rawTargets[i] != searcher) { bool flag = AttackTargetFinder.CanShootAtFromCurrentPosition(rawTargets[i], searcher, verb); AttackTargetFinder.tmpCanShootAtTarget[i] = flag; if (flag) { float shootingTargetScore = AttackTargetFinder.GetShootingTargetScore(rawTargets[i], searcher, verb); AttackTargetFinder.tmpTargetScores[i] = shootingTargetScore; if (attackTarget == null || shootingTargetScore > num) { attackTarget = rawTargets[i]; num = shootingTargetScore; } } } } if (num < 1f) { if (attackTarget != null) { AttackTargetFinder.availableShootingTargets.Add(new Pair <IAttackTarget, float>(attackTarget, 1f)); } } else { float num2 = num - 30f; for (int j = 0; j < rawTargets.Count; j++) { if (rawTargets[j] != searcher) { if (AttackTargetFinder.tmpCanShootAtTarget[j]) { float num3 = AttackTargetFinder.tmpTargetScores[j]; if (num3 >= num2) { float second = Mathf.InverseLerp(num - 30f, num, num3); AttackTargetFinder.availableShootingTargets.Add(new Pair <IAttackTarget, float>(rawTargets[j], second)); } } } } } return(AttackTargetFinder.availableShootingTargets); }
public static void DebugDrawAttackTargetScores_OnGUI() { IAttackTargetSearcher attackTargetSearcher = Find.Selector.SingleSelectedThing as IAttackTargetSearcher; if (attackTargetSearcher == null) { return; } if (attackTargetSearcher.Thing.Map != Find.CurrentMap) { return; } Verb currentEffectiveVerb = attackTargetSearcher.CurrentEffectiveVerb; if (currentEffectiveVerb == null) { return; } List <Thing> list = attackTargetSearcher.Thing.Map.listerThings.ThingsInGroup(ThingRequestGroup.AttackTarget); Text.Anchor = TextAnchor.MiddleCenter; Text.Font = GameFont.Tiny; for (int i = 0; i < list.Count; i++) { Thing thing = list[i]; if (thing != attackTargetSearcher) { string text; Color red; if (!AttackTargetFinder.CanShootAtFromCurrentPosition((IAttackTarget)thing, attackTargetSearcher, currentEffectiveVerb)) { text = "out of range"; red = Color.red; } else { text = AttackTargetFinder.GetShootingTargetScore((IAttackTarget)thing, attackTargetSearcher, currentEffectiveVerb).ToString("F0"); red = new Color(0.25f, 1f, 0.25f); } Vector2 screenPos = thing.DrawPos.MapToUIPosition(); GenMapUI.DrawThingLabel(screenPos, text, red); } } Text.Anchor = TextAnchor.UpperLeft; Text.Font = GameFont.Small; }