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); }
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); }