if (hasMoreTradeSteps(player, vessel)) { try { logger.debug("Executed more steps for {} of {} {}", vessel.getName(), player.getName(), player.getLastName()); ITradeStep nextStep = getNextStep(player, vessel); logger.debug("Next step for {} of {} {}: {}", vessel.getName(), player.getName(), player.getLastName(), nextStep); if (nextStep.execute()) { logger.debug("Execute recursive after {} for {}", nextStep, vessel.getName()); throw e; } catch (RuntimeException e) { logger.error("Failed in execution of trade step for strategy: "+player.getTradeStrategyType(vessel)+" player "+player.getName()+" "+player.getLastName()+", vessel: "+vessel.getName(), e); throw new IllegalStateException(String.format("There are no further steps defined for %s of %s %s for strategy %s", vessel.getName(), player.getName(), player.getLastName(), getClass().getName()));
@Override public void handleMarriageEvent(IAIPlayer player, MarriageBrokerAnnouncementState state) { IAIEventDecisionStrategy strategy = player.getEventDecitionStrategyType().getStrategy(); if (!player.getSpouseData().isPresent() && strategy.acceptMarriagBrokereOffer(player)) { int delay = rnd.nextInt(50) + 24; LocalDateTime deadLine = state.getDate().plusDays(delay); MarriageOfferTask task = taskFactory.getMarriageOfferTask(player, state, deadLine); logger.debug("Add marriage offer task for {} {}", player.getName(), player.getLastName()); taskList.add(task); eventState.setMarriageState(player, EEventState.MARRIAGE_UNDER_CONSIDERATION); } }
/** * Handle the event of the ship coming back from repair and the trade steps have to * be picked up again. * @param event ship repair has finished */ @Subscribe public void handleRepairFinished(RepairFinishedEvent event) { INavigableVessel vessel = event.getShip(); IAIPlayer player = (IAIPlayer) vessel.getOwner(); if (isMatchingTradeStrategy(vessel)) { Preconditions.checkArgument(hasMoreTradeSteps(player, vessel), "There most be steps defined after repair for "+vessel.getName()+" of "+player.getName()+" "+player.getLastName()); player.updateTradeWaitingStatus(vessel, false); executeTradeSteps(player, vessel); } }
/** * Handle the event of the ship coming back from repair and the trade steps have to * be picked up again. * @param event ship refitting has finished. */ @Subscribe public void handleRefitFinished(RefitFinishedEvent event) { INavigableVessel vessel = event.getShip(); IAIPlayer player = (IAIPlayer) vessel.getOwner(); if (isMatchingTradeStrategy(vessel)) { Preconditions.checkArgument(hasMoreTradeSteps(player, vessel), "There most be steps defined after repair for "+vessel.getName()+" of "+player.getName()+" "+player.getLastName()); player.updateTradeWaitingStatus(vessel, false); executeTradeSteps(player, vessel); } }
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)); } }
logger.error("Failed to initialize strategy for ship " + ship.getName() + " of " + player.getName() + " " + player.getLastName(), e);
/** * Handle the reinitialisation after finishing a special mission. * @param event special mission is finished */ @Subscribe public void handleSpecialMissionFinished(SpecialMissionFinishedEvent event) { INavigableVessel vessel = event.getVessel(); IAIPlayer player = (IAIPlayer) vessel.getOwner(); ICity city = event.getCity(); logger.debug("Special mission for ship {} of {} {} ended in {}",vessel.getName(), player.getName(), player.getLastName(), city.getName()); ITradeMissionData missionData = event.getMissionData(); if (missionData instanceof CollectConstructionWaresMissionData) { IShipyard shipyard = city.getCityState().getShipyardState(); ShipyardOrderBuild shipConstructionOrder = new ShipyardOrderBuild(shipyard, ((CollectConstructionWaresMissionData) missionData).getShipType(), player); shipyardEngine.handleOrderBuildEvent(shipConstructionOrder); } initializeRandomTradeStrategy(vessel, player); initializeStrategyForVessel(player, vessel); // Execute IAITradeStrategy tradeStrategy = player.getTradeStrategyType(vessel).getStrategy(); tradeStrategy.executeTradeSteps(player, vessel); }
@Subscribe public void handleWeeklyTasks(PeriodicalTimeWeekEndUpdate event) { if (disableService.aiTradingEnabled()) { for (IAIPlayer player : players) { List<INavigableVessel> shipList = player.getSelectableVessels(); for (INavigableVessel vessel : shipList) { if (!tradeChecker.isEngagedInTrading(vessel) && tradeChecker.shouldBeTrading(vessel)) { IAIPlayer owner = (IAIPlayer) vessel.getOwner(); logger.warn("The vessel {} of {} {} is currently not trading (position: {}), strategy={}: reinitialize", vessel.getName(), owner.getName(), owner.getLastName(), vessel.getLocation(), owner.getTradeStrategyType(vessel)); clearRemainingTradeSteps(vessel, player); initializeStrategyForVessel(player, vessel); // Execute IAITradeStrategy tradeStrategy = player.getTradeStrategyType(vessel).getStrategy(); tradeStrategy.executeTradeSteps(player, vessel); } } // Check Ship construction IAIConstructionSelectionStrategy constructionStategy = player.getConstructionSelectionType().getStrategy(); if (constructionStategy.shouldOrderNewConstruction(player)) { EShipType type = constructionStategy.shouldBuildShipType(player); Optional<INavigableVessel> vessel = constructionStategy.selectCollectingVessel(player, type); vessel.ifPresent(iNavigableVessel -> constructionStategy.initShipConstruction(player, iNavigableVessel, type)); } } } } /**
strategy.handleShipArrivesInPort(event); } catch (RuntimeException e) { logger.error("Failed to handle ship arrival of "+vessel.getName()+" of "+player.getName()+" "+player.getLastName(), e); } finally { engineState.deactivateVesselForTrade(vessel);