private Double shouldWeBreak(double desiredSpeed, World world) { TrackModel track = world.getTrackModel(); double distance = track.getLaneDistanceBetweenPieces( track.getCurrent(), track.getNextCurve(), world.getMyLane()); double inPieceDistance = world.myPhysics.getPreviousPosition().inPieceDistance; double distanceToCurve = distance - inPieceDistance; double endSpeed; double newThrottle = 0; endSpeed = world.getMySpeed(); int ticksTillCurve = ticksToRunDistance(distanceToCurve, world, newThrottle); if (ticksTillCurve == -1) return null; for (int i = 0; i < ticksTillCurve; i++) { endSpeed = world.myPhysics.getAccelerationEstimator().getSpeedOnNextTick(endSpeed, newThrottle); } // Now we have reached the point that if (endSpeed > desiredSpeed) { return 0d; } else { return null; } }
@Override public Double getThrottle(World world) { TrackModel track = world.getTrackModel(); if (world.getMySpeed() == 0) { return 1.0d; } if (track.getCurrent().equals(nextCurve)) { // System.out.println(String.format( // "Wanted speed to curve %s but was %s", speedForNextCurve, // world.getMySpeed())); nextCurve = null; } double curveSpeed = determineMaxCurveSpeed(track.getNextCurve()) * ERROR_CORRECTION; if (curveSpeed > 10) curveSpeed = 10 * ERROR_CORRECTION; this.nextCurve = track.getNextCurve(); this.speedForNextCurve = curveSpeed; Double shouldWeBreak = shouldWeBreak(curveSpeed, world); if (shouldWeBreak != null) { return shouldWeBreak; } return null; }
private int ticksToRunDistance(double distance, World world, double throttle) { double speedAtStartOfTick = world.getMySpeed(); int ticks = 0; while (distance > 0) { double speedAtEndOfTick = world .myPhysics .getAccelerationEstimator() .getSpeedOnNextTick(speedAtStartOfTick, throttle); double distanceToTravelInNextTick = (speedAtEndOfTick + speedAtEndOfTick) / 2; if (distanceToTravelInNextTick < 0.0001) return -1; distance -= distanceToTravelInNextTick; ticks++; speedAtStartOfTick = speedAtEndOfTick; } return ticks; }