public void GoTo(Unit self, double tX, double tY, double tSpeedX, double tSpeedY, double back, Game game, Move move) { double Rx = self.X - tX; double Ry = self.Y - tY; double Vx = self.SpeedX - tSpeedX; double Vy = self.SpeedY - tSpeedY; double t = (Vx * Vx + Vy * Vy) / (Vx * Vx + Vy * Vy + Rx * Rx + Ry * Ry); double Ax = -Rx * (1 - t) - Vx * t; double Ay = -Ry * (1 - t) - Vy * t; move.SpeedUp = Math.Cos(GetAngleBetween(0, 0, Ax, Ay, self.Angle)) * Math.Sqrt(Ax * Ax + Ay * Ay); if (move.SpeedUp > 0) move.SpeedUp /= game.HockeyistSpeedUpFactor; else move.SpeedUp /= game.HockeyistSpeedDownFactor; double Frw = GetAngleBetween(0, 0, Ax, Ay, self.Angle); double Bck = GetAngleBetween(0, 0, -Ax, -Ay, self.Angle); move.Turn = (self.GetDistanceTo(tX, tY) > back || Math.Abs(Frw) < Math.Abs(Bck)) ? Frw : Bck; }