private static bool FighterIsOnTargetableElevation(Fighter targetFighter, TargetElevation targetElevation) { if (targetElevation == TargetElevation.Any) { return(true); } switch (targetFighter.currentElevation) { case TargetElevation.Any: return(true); case TargetElevation.Air: return(targetElevation == TargetElevation.Air); case TargetElevation.Ceiling: return(targetElevation == TargetElevation.Ceiling || targetElevation == TargetElevation.Grounded); case TargetElevation.Floor: return(targetElevation == TargetElevation.Floor || targetElevation == TargetElevation.Air || targetElevation == TargetElevation.Grounded); } return(false); }
public static List <Fighter> GetTargettableFighters(Fighter originator, TargetCount targetCount, TargetSelection targetSelection, bool excludeSelf, TargetStatus targetStatus, ActionAttribute attackAttribute, TargetPosition targetPosition, TargetElevation targetElevation) { List <Fighter> targettableFighters = new List <Fighter>(); if (targetCount == TargetCount.AllFighters) { // Allys first targettableFighters.AddRange(originator.FighterTeam.TeamMembers); // Reverse ally order for navigation targettableFighters.Reverse(); if (excludeSelf) { targettableFighters.Remove(originator); } targettableFighters.AddRange(originator.FighterTeam.opposingTeam.TeamMembers); } else { switch (targetSelection) { case TargetSelection.Ally: targettableFighters.AddRange(originator.FighterTeam.TeamMembers); if (excludeSelf) { targettableFighters.Remove(originator); } break; case TargetSelection.Enemy: targettableFighters.AddRange(originator.FighterTeam.opposingTeam.TeamMembers); break; case TargetSelection.Self: targettableFighters.Add(originator); break; } } for (int i = targettableFighters.Count - 1; i >= 0; i--) { if (!FighterIsOnTargetableElevation(targettableFighters[i], targetElevation)) { targettableFighters.RemoveAt(i); continue; } // Positional actions will never focus on all teams, so lets do this conditionally switch (targetPosition) { case TargetPosition.Front: if (i > 0) { targettableFighters.RemoveAt(i); continue; } break; case TargetPosition.Rear: if (i < targettableFighters.Count - 1) { targettableFighters.RemoveAt(i); } break; } if (!FighterHasTargetableStatuses(targettableFighters[0], targetStatus)) { targettableFighters.RemoveAt(i); } if (!FighterHasTargetableAttributes(targettableFighters[0], attackAttribute)) { targettableFighters.RemoveAt(i); } } return(targettableFighters); }