protected override float CalculatePriority() { var blockMask = new ShipMask(~ship.BlockContext); var closestDistance = float.MaxValue; foreach (var enemy in ship.QueryNeighbours(detectionRadius, blockMask, true)) { var distance = (enemy.transform.position - ship.transform.position).magnitude; if (distance < closestDistance) { closestDistance = distance; enemyTarget = enemy; } } if (closestDistance == float.MaxValue) { enemyTarget = null; } DebugString = $"Target: {enemyTarget?.GetInstanceString()}"; return(enemyTarget == null ? 0f : 5f); }
// TODO: Improve detection of large ships, as this only registers other ships whose centre overlaps the detection radius protected override float CalculatePriority() { var globalPos = ship.transform.position; var shipMask = new ShipMask(~BlockContext.None); var shortestDistance = float.MaxValue; neighbourCache?.Clear(); neighbourCache = neighbourCache ?? new List <Ship>(); foreach (var neighbour in ship.QueryNeighbours(settings.detectionRadius, shipMask)) { if (!ShouldYield(neighbour)) { continue; } var neighbourPos = neighbour.transform.position; var dist = (globalPos - neighbourPos).magnitude; if (shortestDistance > dist) { shortestDistance = dist; } neighbourCache.Add(neighbour); } if (shortestDistance == float.MaxValue) { return(0f); } // Calculate the priority value due to distance to the shortest var distancePriority = (settings.detectionRadius - shortestDistance) / settings.detectionRadius * settings.priorityMultiplier; return(distancePriority + settings.priorityBase); }