/// <summary> /// Makes the car approach the target and slow down. /// </summary> /// <param name="velocity">Current velocity of the car</param> /// <param name="yaw">Current relative yaw of the car</param> /// <param name="addedRotation">Amount of rotation (in degrees) to add</param> /// <param name="distanceToDestination">Distance to the destination</param> public void HandleApproachTarget(ref Vector velocity, ref double yaw, ref double addedRotation, ref double distanceToDestination) { // Get the current speed and rotation of the car. var speed = velocity.Length; var rotation = MathUtil.VelocityToRotation(velocity); // Check if we're going too fast, have passengers or are near the destination. if (speed > maxTurningSpeed / 2d || Car.PassengerCount > 0 || distanceToDestination < 20) { // Check if we need to drop passengers off. if (Car.PassengerCount > 0 && /*speed < 0.05 && */ speed > 0) { var distance = Car.DistanceTraveled - Car.PassengersBoardDistance; var price = GPSSystem.CalculatePrice(distance); App.Console.Print($"[C{Car.Id}] Charged €{price:F2} for {distance:F1} units", Colors.Blue); App.Console.Print($"[C{Car.Id}] Dropping customers", Colors.Blue); var passenger = Car.Passengers[0]; TripEnd?.Invoke(this, new TripEventArgs(passenger.Group, passenger.Building.Location, Car.Location, Car)); Car.Passengers.Clear(); MainScreen.AILoop.Unsubscribe(Update); } // Slow down the car. velocity = speed > 0.05 ? Vector.Add(velocity, CalculateDeccelerationVector(velocity)) : new Vector(); } // Get the target and current location. var destination = Car.Destination.Location; var location = Car.Location; // Calculate the angle between the car and the target. var sub = new Vector( destination.X - location.X, destination.Y - location.Y ); sub.Normalize(); var angle = Vector.AngleBetween(rotation, sub); // If we need to go to the right and are able to, do so. if (angle > 0) { if (yaw > -maxInLaneRotation) { addedRotation -= rotationSpeed; } } // If we need to go to the left and are able to, do so. else { if (yaw < maxInLaneRotation) { addedRotation += rotationSpeed; } } }