@Override protected boolean additionalJoinRequirementsMet(IAIPlayer player, ICity city, Optional<INavigableVessel> vessel) { Optional<ITradingOffice> optTradingOffice = player.findTradingOffice(city); return optTradingOffice.isPresent(); } }
@VisibleForTesting ICity calculateCostructionCity(IAIPlayer player) { List<ICity> chosableCities = map.getCities().stream() .filter(city -> player.findTradingOffice(city).isPresent()) .collect(toList()); return chosableCities.get(rnd.nextInt(chosableCities.size())); } }
@VisibleForTesting ICity calculateCostructionCity(IAIPlayer player) { List<ICity> chosableCities = map.getCities().stream() .filter(city -> player.findTradingOffice(city).isPresent()) .collect(toList()); return chosableCities.get(rnd.nextInt(chosableCities.size())); } }
public void hireOrDismiss(ICity city, IAIPlayer player) { Optional<ITradingOffice> optOffice = player.findTradingOffice(city); optOffice.ifPresent(iTradingOffice -> { ITradingOffice office = iTradingOffice; if (!office.getSteward().isPresent()) { tradeManagerService.hireSteward(office); } }); } }
@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 execute() { IAIPlayer player = (IAIPlayer) vessel.getOwner(); Optional<ITradingOffice> optOffice = player.findTradingOffice(city); //noinspection OptionalIsPresent if (optOffice.isPresent()) { ITradingOffice office = optOffice.get(); if (office.getSteward().isPresent()) { IAutomatedTrading trading = office.getOfficeTrading(); transferableWares.entrySet().removeIf(entry -> !trading.isMovableToShip(entry.getKey())); } tradeService.transferFromVesselToStorage(vessel, player, city, transferableWares); } return true; } }
@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.getSupplyingVessels().isEmpty(); } } return true; } return false; } }
@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) { for (ICity otherCity : map.getCities()) { Optional<ITradingOffice> optOffice = player.findTradingOffice(otherCity); if (optOffice.isPresent()) { double distance = otherCity.getCoordinates().distance(city.getCoordinates()); if (distance < maxDistanceInPixels) { return true; } } } return false; } }
/** * Hire if there is storage capacity larger than 1000 barrels and 80% are occupied. */ @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 { int capacity = office.capacityProperty().get(); return capacity >= 1000 && capacity - office.storedAmountBinding().get() <= (int)(0.2 * capacity); } } return false; } }
@Override protected CollectWaresMissionData createMissionData(IAIPlayer player) { Preconditions.checkNotNull(celebrationLocation); ICity where = celebrationLocation; CollectWaresForCity missionData = new CollectWaresForCity(); missionData.setCity(where); Map<EPopulationClass, Integer> population = new HashMap<>(); for (EPopulationClass populationClass : EPopulationClass.values()) { population.put(populationClass, where.getPopulation(populationClass)); } Map<IWare, Integer> requirements = celebrationService.calculateRequiredAmounts(population); Optional<ITradingOffice> optOffice = player.findTradingOffice(where); for (IWare ware : requirements.keySet()) { int amount; amount = optOffice.map(iTradingOffice -> Math.max(requirements.get(ware) - iTradingOffice.getWare(ware).getAmount(), 0)) .orElseGet(() -> requirements.get(ware)); missionData.require(ware, amount); } missionData.setInitialRequirements(missionData.getRequiredWareAmounts()); return missionData; }
@Override public boolean execute() { IAIPlayer player = (IAIPlayer) vessel.getOwner(); Optional<ITradingOffice> optOffice = player.findTradingOffice(city); //noinspection OptionalIsPresent if (optOffice.isPresent()) { ITradingOffice office = optOffice.get(); if (office.getSteward().isPresent()) { List<IWare> neededWares = tradeService.getBasicNeeds(); List<IWare> transferableWares = vessel.getLoadedWares().stream() .filter(neededWares::contains) .collect(toList()); Map<IWare, Integer> map = new HashMap<>(); for (IWare ware : transferableWares) { int amount = vessel.getWare(ware).getAmount(); if (ware.isBarrelSizedWare()) { amount *= 10; } int availableSpace = office.capacityProperty().get(); int movableAmount = Math.min(Math.min(availableSpace, amount), transferAmounts.get(ware)); map.put(ware, movableAmount); } if (!map.isEmpty()) { tradeService.transferFromVesselToStorage(vessel, player, city, map); } } } return true; } }
@Override public boolean execute() { IAIPlayer player = (IAIPlayer) vessel.getOwner(); Optional<ITradingOffice> optOffice = player.findTradingOffice(city); //noinspection OptionalIsPresent if (optOffice.isPresent()) { ITradingOffice office = optOffice.get(); if (office.getSteward().isPresent()) { List<IWare> neededWares = tradeService.getBasicNeeds(); List<IWare> transferableWares = vessel.getLoadedWares().stream() .filter(neededWares::contains) .collect(toList()); Map<IWare, Integer> map = new HashMap<>(); for (IWare ware : transferableWares) { int amount = vessel.getWare(ware).getAmount(); if (ware.isBarrelSizedWare()) { amount *= 10; } int availableSpace = office.capacityProperty().get(); int movableAmount = Math.min(availableSpace, amount); map.put(ware, movableAmount); } if (!map.isEmpty()) { tradeService.transferFromVesselToStorage(vessel, player, city, map); } } } return true; } }
protected CollectWaresMissionData createMissionData(IAIPlayer player) { ICity where = getConstructionCity(player); CollectConstructionWaresMissionData missionData = new CollectConstructionWaresMissionData(); missionData.setCity(where); missionData.setShipType(constructionType); for (EWare ware : EWare.values()) { int amount = shipFactory.getConstructionAmount(constructionType, ware); if (amount > 0) { Optional<ITradingOffice> optOffice = player.findTradingOffice(where); if (optOffice.isPresent()) { Optional<ISteward> steward = optOffice.get().getSteward(); tradeService.buyFromCityToStorage(optOffice.get(), player, where, ware, amount, Optional.of(ware.getMaxBuyPriceModerate()), steward); amount = Math.max(0,amount - optOffice.get().getWare(ware).getAmount()); } missionData.require(ware, amount); } } return missionData; }
/** * Unless the damage is heave only in towns where hte vessel owner has a * trading office repairs should be conducted. * @param vessel that should be checked for repair need. * @param city current possition of the vessel. * @return true if the ship should be repaired in the city. */ @Override public boolean shouldRepair(INavigableVessel vessel, ICity city) { Preconditions.checkArgument(vessel.getLocation().equals(city.getCoordinates()), "The vessel is not in city "+city.getName()+" but at "+vessel.getLocation()); int damage = vessel.getDamage(); if (damage > 90) { return true; } IAIPlayer owner = (IAIPlayer) vessel.getOwner(); return owner.findTradingOffice(city).isPresent(); } }
Pair<ICity, CentralStorageStrategyHint> setupContextHint(IAIPlayer player, INavigableVessel vessel) { .filter(city -> player.findTradingOffice(city).isPresent()) .collect(Collectors.toList()); Collections.shuffle(citiesWithTradingOffice);
if (city.equals(destination)) { Optional<ITradingOffice> optOffice = player.findTradingOffice(city); haveEverything = checkAllWaresCollected(city, vessel, tradeMission, optOffice);
Optional<ITradingOffice> optOffice = player.findTradingOffice(hometown); Preconditions.checkArgument(optOffice.isPresent(), "In the hometown a trading office is required"); ITradingOffice office = optOffice.get();
Optional<ITradingOffice> optOffice = player.findTradingOffice(city); sell = !(optOffice.isPresent() && optOffice.get().getSteward().isPresent()); if (sell) {
append(player, vessel, trasferToOfficeStep); Map<IWare, Integer> requiredWares = new HashMap<>(); ITradingOffice office = player.findTradingOffice(centralStorageCity).get(); IProductionConsumptionKnowledge globalKnowledge = player.getProductionAndConsumptionKnowledge(); if (missionData.getLastVisit() == null) {