Beispiel #1
0
    private Vector2Int?SelectTargetForAttackFromPosition(List <PlayableAgent> Players, Vector2Int Pos)
    {
        if (!AbilitySystem.CanActivateAbilityByTag(MainAbility))
        {
            return(null);
        }

        Vector2Int OriginalPosition = GridPos;

        GridPos = Pos;
        Grid.setOccupied((Vector3Int)OriginalPosition, false);
        Grid.setOccupied((Vector3Int)GridPos, true);

        PlayableAgent TargetAgent = null;

        foreach (PlayableAgent Player in Players)
        {
            // Can target
            if (AbilitySystem.CanActivateTargetAbilityByTag(MainAbility, Player.GridPos))
            {
                // First
                if (TargetAgent == null)
                {
                    TargetAgent = Player;
                }
                else
                {
                    float BestDist = Vector2Int.Distance(GridPos, TargetAgent.GridPos);
                    float NewDist  = Vector2Int.Distance(GridPos, Player.GridPos);

                    // Closest
                    if (NewDist < BestDist)
                    {
                        TargetAgent = Player;
                    }
                    else if (NewDist == BestDist)
                    {
                        int BestHealth = TargetAgent.AbilitySystem.GetAttributeValue(Attribute.Health).Value;
                        int NewHealth  = Player.AbilitySystem.GetAttributeValue(Attribute.Health).Value;
                        // Lowest health
                        if (NewHealth < BestHealth)
                        {
                            TargetAgent = Player;
                        }
                        else if (BestHealth == NewHealth)
                        {
                            // First role
                            if (Player.Role < TargetAgent.Role)
                            {
                                TargetAgent = Player;
                            }
                        }
                    }
                }
            }
        }

        Grid.setOccupied((Vector3Int)GridPos, false);
        Grid.setOccupied((Vector3Int)OriginalPosition, true);
        GridPos = OriginalPosition;

        if (TargetAgent != null)
        {
            return(TargetAgent.GridPos);
        }
        return(null);
    }