@Subscribe public void handleShipReachesDestination(ShipArrivesAtDestinationEvent event) { INavigableVessel vessel = event.getShip(); vessels.remove(vessel); } }
/** * Check if the vessel is engaged in trading. That means it is either traveling, trading or repairing. * @param vessel to check if it is engaiged in trading. * @return true if the vessel can execute trade steps. */ public boolean isEngagedInTrading(INavigableVessel vessel) { // Is travelling (Check TravelingVessels) if (vessels.isTravelling(vessel)) { return true; } // Is repairing (check shipyards) for (ICity city : map.getCities()) { IShipyard shipyard = city.getCityState().getShipyardState(); List<IShipDueDate> repairlist = shipyard.getShipRepairList(); for (IShipDueDate dueDate : repairlist) { if (dueDate.getShip().equals(vessel)) { return true; } } } if (vessel.getNumberOfSailors() < shipService.getMinNumberOfSailors(vessel)) { return true; // needs more sailors } // is trading the AIEngine is currently executing tasks return playerEngine.executeCurrentTrade(vessel); }
/** * Create a path shape out of a list of points. * When the path is created the vessel will be added to the * TravellingVessels container. * @param vessel vessel that is traveling the path. * @param pointedPath input points. * @param scale scaling that is used on the path due to the sacle of the map. * @return shape representing a path. */ public Optional<Path> createPath(INavigableVessel vessel, List<Point2D> pointedPath, double scale) { Path path = new Path(); path.setStroke(Color.RED); path.setStrokeWidth(2); if (!pointedPath.isEmpty()) { Point2D p = pointedPath.get(0); MoveTo moveTo = new MoveTo(); moveTo.setX(p.getX() * scale); moveTo.setY(p.getY() * scale); path.getElements().add(moveTo); for (int i = 1; i < pointedPath.size(); i++) { p = pointedPath.get(i); LineTo lineTo = new LineTo(); lineTo.setX(p.getX() * scale); lineTo.setY(p.getY() * scale); path.getElements().add(lineTo); } } vessels.addVessel(vessel, Optional.ofNullable(path), pointedPath); return Optional.ofNullable(path); }
private void startTradeStrategySteps(IAIPlayer player, INavigableVessel ship) { IAITradeStrategy tradeStrategy = player.getTradeStrategyType(ship).getStrategy(); // If the vessel is traveling do not execute if (!player.hasMoreTradeSteps(ship)) { if (shipService.findCity(ship).isPresent()) { tradeStrategy.initializeTradeCycle(player, ship); logger.info("No more tradesteps for vessel {} of {} {} defined, but located in city: Reinitialize trade strategy", ship.getName(), player.getName(), player.getLastName()); } else { if (!vessels.isTravelling(ship)) { // already traveling to destination ICity nearestCity = tradeStrategy.getCityToRestartTradeCycle(ship); seafaringService.travelToCity(ship, nearestCity); logger.warn("No tradesteps defined for vessel {} of {} {}. Travel to nearest city {}", ship.getName(), player.getName(), player.getLastName(), nearestCity.getName()); } } } if (!player.waitingForTradeStepToFinish(ship)) { tradeStrategy.executeTradeSteps(player, ship); } else { logger.warn("Skip starting of trade execution as waitingForTradeStepToFinish for {} of {} {} is {}", ship.getName(), player.getName(), player.getLastName(), player.waitingForTradeStepToFinish(ship)); } }
vessels.addVessel(vessel, optPath, reducedList); final PathInterpolator pathInterpolator = new PathInterpolator(reducedList); long duration = calculateDuration(vessel, pathInterpolator, 1);
vessels.remove(vessel); if (owner instanceof IAIPlayer) { IAIPlayer player = (IAIPlayer) owner;