private void DefenseMode() { var ballMap = Game.GameManager.Navigation.PotentialMaps["BallMap"]; float ballValue = PlayerAI.MapValue(ballMap, PlayerAI.Player.Position); float teamMateBallValue = PlayerAI.MapValue(ballMap, PlayerAI.Player.TeamMate.Position); bool canTakeBall = PlayerAI.Player.BallTrigger.Enabled && !Game.GameManager.Ball.Properties.Untakable && !Game.GameManager.Ball.Properties.PassThroughPlayer; bool otherTeamHasBall = canTakeBall && Game.GameManager.Ball != null && Game.GameManager.Ball.Player != null; float defenseValue = GetDefenseValue(PlayerAI.Player.Team, PlayerAI.Player.Position); float attackValue = GetShootValue(PlayerAI.Player.Team, PlayerAI.Player.Position); float relativePosition = attackValue / defenseValue; float teamMateDefenseValue = GetDefenseValue(PlayerAI.Player.Team, PlayerAI.Player.TeamMate.Position); float teamMateAttackValue = GetShootValue(PlayerAI.Player.Team, PlayerAI.Player.TeamMate.Position); float teamMateRelativePosition = teamMateAttackValue / teamMateDefenseValue; float otherTeamAttackValue = float.NegativeInfinity; if (otherTeamHasBall) { otherTeamAttackValue = GetDefenseValue(PlayerAI.Player.Team, Game.GameManager.Ball.Position); } float ballDefensePosition = GetDefenseValue(PlayerAI.Player.Team, Game.GameManager.Ball.Position); float ballAttackPosition = GetShootValue(PlayerAI.Player.Team, Game.GameManager.Ball.Position); float ballRelativePosition = ballAttackPosition / ballDefensePosition; //ballRelativePosition > 1 if in attack float ballThreshold = 0.9f; float defThreshold = 0.65f; float mateDefThreshold = 0.85f; Engine.Debug.Screen.AddCircle(PlayerAI.Position, 180); if ((PlayerAI.Info.BallInGoal || Game.Arena.SelectedLauncher != null) && (PlayerAI.Info.GoalTeam != null && PlayerAI.Player.Team != PlayerAI.Info.GoalTeam)) { MoveToInitialPosition(); //MoveToDefense(); } else if (canTakeBall && ballValue >= teamMateBallValue) { PlayerAI.TackleIfInRange(); PlayerAI.NavigateToBall(); } else if (defenseValue < teamMateDefenseValue && ballDefensePosition > ballThreshold && defenseValue < defThreshold && teamMateDefenseValue < mateDefThreshold) { if (PlayerAI.AiState.TeleportToDefense && !PlayerAI.Player.TeamMate.Properties.Blink) { PlayerAI.Blink(Vector2.Zero); } else { MoveToDefense(); } } else if (!PlayerAI.Player.BallTrigger.Enabled) { //MoveToInitialPosition(); MoveToDefense(); } else { PlayerAI.TackleIfInRange(); PlayerAI.NavigateToAssistPosition(); } }