/** * Method to handle the finishing of a ship construction. * @param ship that is newly constructed * @param player owner of the ship */ public void handleShipConstructionFinished(IShip ship, IAIPlayer player) { player.addShip(ship); initializeNewShip(ship, player); }
/** * Add a new trade step for a player. * @param player for which to add the trade step * @param step to be added. */ public void append(IAIPlayer player, INavigableVessel vessel, ITradeStep step) { player.addTradeStep(step, vessel); }
@Override public boolean hireOrFireTradeManager(ICity city, IAIPlayer player) { Optional<ITradingOffice> optOffice = player.findTradingOffice(city); if (optOffice.isPresent()) { ITradingOffice office = optOffice.get(); if (office.getSteward().isPresent()) { return false; // never dismiss } else { return player.getHometown().equals(city) || player.getPlayerContext().getHints(city).stream() .filter(hint -> hint instanceof CentralStorageStrategyHint).findFirst().isPresent() || !player.findBuildings(city, IWorkShop.class).isEmpty(); } } return false; }
@Override public boolean acceptMarriagBrokereOffer(IAIPlayer player) { if (!player.getSpouseData().isPresent()) { long cash = player.getCompany().getCash(); return cash > 100000; } return false; }
@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); } }
ICity hometown = player.getHometown(); IProductionConsumptionKnowledge knowlege = player.getProductionAndConsumptionKnowledge(); knowlege.updateKnowledge(hometown); List<IShip> shipList = player.getFleet(); for (IShip ship : shipList) { try { if (!player.isInitialized(ship)) { initializeStrategyForVessel(player, ship); logger.error("Failed to initialize strategy for ship " + ship.getName() + " of " + player.getName() + " " + player.getLastName(), e); List<INavigableVessel> vesselList = player.getSelectableVessels(); for (INavigableVessel ship : vesselList) { startTradeStrategySteps(player, ship);
ICity hometown = player.getHometown(); Optional<ITradingOffice> optOffice = player.findTradingOffice(hometown); Preconditions.checkArgument(optOffice.isPresent(), "In the hometown a trading office is required"); ITradingOffice office = optOffice.get(); ITradeStep buy = tradeStepFactory.createAggregatedBuyTradingOfficeTradeStep(office, hometown, wares); buy.execute(); INavigableVessel nearestVessel = player.getFleet().get(0); double minDistance = Double.MAX_VALUE; Point2D coord = hometown.getCoordinates(); for (INavigableVessel vessel : player.getSelectableVessels()) { double distance = vessel.getLocation().distance(coord); if (distance < minDistance) { strategy.setCelebrationLocation(hometown); strategy.initializeTradeCycle(player, nearestVessel); player.updateTradeWaitingStatus(nearestVessel, false);
@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)); } } } } /**
@Override public boolean isSelectable(IAIPlayer player, INavigableVessel vessel) { // There are at least 4 ships if (player.getFleet().size() < 4) { return false; } List<ICity> citiesWithTradingOffice = map.getAllReachableCities(vessel).stream() .filter(city -> player.findTradingOffice(city).isPresent()) .collect(Collectors.toList()); // This city should not yet be supplied for (ICity city : citiesWithTradingOffice) { List<ITradeStategyHint> hints = player.getPlayerContext().getHints(city); for (ITradeStategyHint hint : hints) { if (hint instanceof CentralStorageStrategyHint) { CentralStorageHintContext hintContext = (CentralStorageHintContext) hint.getContext(); return hintContext.getDistributingVessels().isEmpty(); } } } return false; } }
@Override protected boolean additionalJoinRequirementsMet(IAIPlayer player, ICity city, Optional<INavigableVessel> vessel) { Optional<ITradingOffice> optTradingOffice = player.findTradingOffice(city); return optTradingOffice.isPresent(); } }
@Override public boolean shouldOrderCelebration(IAIPlayer player, ICity city) { long cash = player.getCompany().getCash(); return cash > 100000; } }
Pair<ICity, CentralStorageStrategyHint> setupContextHint(IAIPlayer player, INavigableVessel vessel) { .filter(city -> player.findTradingOffice(city).isPresent()) .collect(Collectors.toList()); Collections.shuffle(citiesWithTradingOffice); break; List<ITradeStategyHint> hints = player.getPlayerContext().getHints(city); for (ITradeStategyHint h : hints) { if (targetCity != null) { context.addSupplyingVessel(vessel); hint.setContext(context); player.getPlayerContext().add(city, hint); targetCity = city; IProductionConsumptionKnowledge knowledge = player.getProductionAndConsumptionKnowledge(); for (ICity suppliedCity : suppliedCities) { ICityProductionConsumptionKnowledge cityKnowledge = knowledge.getKnowlege(suppliedCity); requiredWares.removeAll(produced); requiredWares.stream().forEach(context::addWare); player.getPlayerContext().add(city, hint);
final ICity city = event.getCity(); final IAIPlayer player = (IAIPlayer) vessel.getOwner(); final CollectWaresMissionData tradeMission = (CollectWaresMissionData) player.getTradeMission(vessel); final ICity destination = tradeMission.getCity(); boolean haveEverything = false; if (city.equals(destination)) { Optional<ITradingOffice> optOffice = player.findTradingOffice(city); haveEverything = checkAllWaresCollected(city, vessel, tradeMission, optOffice); dumpStep.execute(); SpecialMissionFinishedEvent newEvent = new SpecialMissionFinishedEvent(vessel, city, tradeMission); player.setTradeMission(vessel, null); clientServerEventBus.post(newEvent);
@VisibleForTesting void handleTradeInCentralStorage(IAIPlayer player, INavigableVessel vessel, ICity centralStorageCity, CentralStorageHintContext context) { CentralStorageDeliverMissionData missionData = (CentralStorageDeliverMissionData) player.getTradeMission(vessel); ITradingOffice office = player.findTradingOffice(centralStorageCity).get(); IProductionConsumptionKnowledge globalKnowledge = player.getProductionAndConsumptionKnowledge(); if (missionData.getLastVisit() == null) { fillRequiredWaresAvailableBased(requiredWares, context, office);
ICompany company = player.getCompany(); if (company.getCash() < minCash) { return false; List<IShip> fleet = player.getFleet(); if (fleet.size() >= maxFeetSize) { return false;
/** * Check weather the vessel should return to the hometown * @param player for whom to check the returnal to the hometown * @param vessel which should return to the hometown * @return true if the vessle should return to the hometown */ @VisibleForTesting boolean shouldReturnToHometown(IAIPlayer player, INavigableVessel vessel) { if (player.getCompany().getCash() < lowMoney) { return true; } else { List<IWare> waresOfInterest = ((SupplyCityMissionData) player.getTradeMission(vessel)).getRequiredWares(); if (vessel.getCapacity() == 0) { for (EWare ware : EWare.values()) { if (vessel.getWare(ware).getAmount() > 0 && !waresOfInterest.contains(ware)) { return false; } } return true; } else { return false; } } }
@Override public boolean execute() { Preconditions.checkArgument(vessel.getLocation().equals(city.getCoordinates()), "Vessel " +vessel.getName()+" is not in city "+city.getName()); IAIPlayer owner = (IAIPlayer) vessel.getOwner(); IAIShipRepairStrategy repairStrategy = owner.getShipRepairStrategyType().getStrategy(); if (repairStrategy.shouldRepair(vessel, city)) { repairStrategy.repair(vessel, city); ICompany company = owner.getCompany(); int costs; if (vessel instanceof IShip) { costs = shipService.calculateRepairCosts(city, (IShip) vessel); } else { costs = shipService.calculateRepairCostsVessel(city, vessel); } company.updateCashDirectly(-costs); LOGGER.debug("Executed repair check, do NOT proceed for vessel {} in {}", vessel.getName(), city.getName()); return false; } LOGGER.debug("Executed repair check, do proceed for vessel {} in {}", vessel.getName(), city.getName()); return true; }
@VisibleForTesting void handleTradeInSuppliedCity(IAIPlayer player, INavigableVessel vessel, ICity city, CentralStorageDeliverMissionData missionData) { CentralStorageHintContext context = missionData.getContext(); IProductionConsumptionKnowledge globalKnowledge = player.getProductionAndConsumptionKnowledge(); List<ICity> forwardCities = calculateForwardCities(city, context); LinkedList<ICity> citiesToSell = new LinkedList<>(forwardCities); Optional<ITradingOffice> optOffice = player.findTradingOffice(city); sell = !(optOffice.isPresent() && optOffice.get().getSteward().isPresent()); if (sell) {
@Subscribe public void handleGameLoad(GameStateChange gameStateChange) { if (gameStateChange.getStatusChange() == EGameStatusChange.GAME_LOADED) { int nbShips = 0; for (IAIPlayer player : aiPlayers) { nbShips += player.getFleet().size(); } for (IPlayer player : players) { nbShips += player.getFleet().size(); } updateSegmentSize(nbShips); } } }
@Override public boolean execute() { IAIGuildJoinStrategy strategy = player.getGuildJoinStrategyType().getStrategy(); if (strategy.shouldJoin(player, city, Optional.ofNullable(vessel))) { strategy.join(player, city); } return true; } }