Exemple #1
0
    private TankArmourPiece FindBestPieceTowards(Vector2 direction, SearchFlags flag = SearchFlags.Any, bool wrapAround = false, bool ignoreRequirements = false, bool ignoreReservations = false)
    {
        if (armourPieces.Length < 1)
        {
            return(null);
        }
        TankArmourPiece bestPiece = null;
        float           bestScore = wrapAround ? float.NegativeInfinity : 0;

        for (int i = 0; i < armourPieces.Length; i++)
        {
            bool searchValid = (flag == SearchFlags.Any) || (flag == SearchFlags.EmptyOnly && !armourPieces[i].isActive) || (flag == SearchFlags.FullOnly && armourPieces[i].isActive);
            if ((armourPieces[i].IsRequirementSatisfied() || ignoreRequirements) && searchValid && (!armourPieces[i].reserved || ignoreReservations))
            {
                Vector2 internalDirection = (armourPieces[i].transform.position - transform.position).normalized;
                float   score             = Vector2.Dot(direction.normalized, internalDirection);
                if (score > bestScore)
                {
                    bestPiece = armourPieces[i];
                    bestScore = score;
                }
            }
        }
        if (bestPiece == null || (!bestPiece.IsRequirementSatisfied() && !ignoreRequirements))
        {
            return(null);
        }
        return(bestPiece);
    }
Exemple #2
0
    private TankArmourPiece FindBestPieceAtPoint(Vector2 point, SearchFlags flag = SearchFlags.Any, bool ignoreRequirements = false, bool ignoreReservations = false)
    {
        if (armourPieces.Length < 1)
        {
            return(null);
        }
        TankArmourPiece bestPiece    = null;
        float           bestDistance = float.PositiveInfinity;

        for (int i = 0; i < armourPieces.Length; i++)
        {
            bool searchValid = (flag == SearchFlags.Any) || (flag == SearchFlags.EmptyOnly && !armourPieces[i].isActive) || (flag == SearchFlags.FullOnly && armourPieces[i].isActive);
            if ((armourPieces[i].IsRequirementSatisfied() || ignoreRequirements) && searchValid && (!armourPieces[i].reserved || ignoreReservations))
            {
                float distance = Vector2.Distance(point, armourPieces[i].transform.position);
                if (distance < bestDistance)
                {
                    bestPiece    = armourPieces[i];
                    bestDistance = distance;
                }
            }
        }
        if (bestPiece == null || (!bestPiece.IsRequirementSatisfied() && !ignoreRequirements))
        {
            return(null);
        }
        return(bestPiece);
    }