/** * Travel between two locations, where neither is a city. * @param vessel travelling between two locations at sea * @param location destination location */ public void travelNotBetweenCities(INavigableVessel vessel, Point2D location) { List<Point2D> path = travelTo(vessel, location); Preconditions.checkNotNull(path); pathConverter.createPath(vessel, path, 1); VesselPositionUpdateData vesselPositionUpdateData = interpolators.get(vessel); vesselPositionUpdateData.setDestinationCity(false); vesselPositionUpdateData.setSourceCity(false); }
@Subscribe public void handleGameSpeedChange(ClockTickIntervalChange intervallChange) { synchronized (interpolators) { for (Entry<INavigableVessel, VesselPositionUpdateData> entry : interpolators.entrySet()) { final VesselPositionUpdateData data = entry.getValue(); final PathInterpolator interpolator = data.getInterpolator(); double traveledFraction = interpolator.getTraveldFraction(); double traveledTimeMS = data.getDurationInMs() * traveledFraction; double fractionToTravel = 1 - traveledFraction; long remainingDuration = pathConverter.calculateDuration(entry.getKey(), interpolator, fractionToTravel); long newDuration = Math.round(traveledTimeMS + remainingDuration); long nbTicks = remainingDuration / EngineConfiguration.CLOCK_TICK_INTERVALL_MS; double fractionPerTick = fractionToTravel / nbTicks; interpolator.setTravelFractionPerTick(fractionPerTick); data.setDurationInMs(newDuration); logger.debug("Update the game speed, fraction to travel={}, nbTicks={}, remainingDuration={}, update fraction per tick={}", fractionToTravel, nbTicks, remainingDuration, fractionPerTick); } } }
/** * Travel from a city to a place that is not a city. * @param vessel traveling from a city to a location at sea * @param location destination location */ public void travelFromCity(INavigableVessel vessel, Point2D location) { List<Point2D> path = travelTo(vessel, location); Preconditions.checkNotNull(path); pathConverter.createPath(vessel, path, 1); VesselPositionUpdateData vesselPositionUpdateData = interpolators.get(vessel); vesselPositionUpdateData.setDestinationCity(false); vesselPositionUpdateData.setSourceCity(true); } }
/** * Travel from one city to another. * @param vessel which travels between cities * @param toCity destination city */ public void travelBetweenCities(INavigableVessel vessel, ICity toCity) { List<Point2D> path = travelTo(vessel, toCity.getCoordinates()); Preconditions.checkNotNull(path); pathConverter.createPath(vessel, path, 1); VesselPositionUpdateData vesselPositionUpdateData = interpolators.get(vessel); vesselPositionUpdateData.setDestinationCity(true); vesselPositionUpdateData.setSourceCity(true); }
/** * Travel from a location that is not a city to a city. * @param vessel traveling to a city * @param toCity destination city */ public void travelToCity(INavigableVessel vessel, ICity toCity) { List<Point2D> path = travelTo(vessel, toCity.getCoordinates()); Preconditions.checkNotNull(path); pathConverter.createPath(vessel, path, 1); VesselPositionUpdateData vesselPositionUpdateData = interpolators.get(vessel); vesselPositionUpdateData.setDestinationCity(true); vesselPositionUpdateData.setSourceCity(false); }
/** * Calculate a new path for the <code>vessel</code> and draw it on the map. * @param vessel that travels along the path * @param path series of points defining the path. */ private void drawPath(INavigableVessel vessel, List<Point2D> path) { if (path != null) { clearLines(); Optional<Path> p = pathConverter.createPath(vessel, path, scale.doubleValue()); if (p.isPresent()) { drawPathOnMap(vessel, path, p.get()); } else { logger.warn("Path not available for {} of {} {}", vessel.getName(), vessel.getOwner().getName(), vessel.getOwner().getLastName()); } } }