Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    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);
    }