private double CalculateTargetBadness(Tuple<Vector, Stack<RobotMove>> target, Map map) { double badness = 0.0; bool deadend = false; bool moved = CanMoveToTargetExactlyByPath(target.Item2, map, m => { deadend = FindBestTarget(m, false) == null && m.GetCell(m.Robot) != MapCell.OpenedLift; }); if(moved && deadend) badness += 100; if(specialTargetType == SpecialTargetType.Kamikadze || !CanMoveToTargetExactlyByPathWithNoRocksMoved(target.Item2, map)) badness += 500; if (map.IsInWater(target.Item2.Count, target.Item1.Y) && !CanEscapeFromUnderwater(target, map)) badness += 500; badness += target.Item2.Count; if (specialTargetType == SpecialTargetType.Favorite && specialTarget != null && target.Item1.X == specialTarget.X && target.Item1.Y == specialTarget.Y) badness -= 550; return badness; }