@VisibleForTesting Map<IWare, Integer> calculateBuyAmounts(Set<IWare> buyWares) { Map<IWare, Integer> buyAmounts = new HashMap<>(); for (IWare buyWare : buyWares) { int amount = 5; if (buyWare.isBarrelSizedWare()) { amount *= 10; } buyAmounts.put(buyWare, amount); } return buyAmounts; }
private List<Object[]> determineLimits(Map<IWare, ETradeReason> definiteReasons, ICity city, IAIPlayer player, List<IWorkShop> workShops) { List<Object[]> list = new ArrayList<>(); for (IWare ware : definiteReasons.keySet()) { Object[] entry = new Object[3]; entry[0] = ware; ETradeReason tradeReason = definiteReasons.get(ware); if (tradeReason.isBuyReason()) { entry[1] = calculateBuyAmount(ware, city, player, tradeReason, workShops); entry[2] = ware.getMaxBuyPriceModerate(); } else { entry[1] = calculateSellAmount(ware, city, player, tradeReason, workShops); entry[2] = ware.getMinSellPriceModerate(); } list.add(entry); } return list; }
@Override protected String computeValue() { switch (type) { case PORT_CITY_TO_SHIP: case PORT_CITY_TO_STORAGE: if (movableAmount.get()==ETransferAmount.MAX){ return String.valueOf(ware.getMaxValueSell()); } else if (amountToSell.get() > 0){ return String.valueOf(computablePrice.sellPrice(ware, availableAmount, amountToSell)); } else { return String.valueOf(ware.getMaxValueSell()); } default: return ">"; } } };
@Override public String toString() { StringBuilder sb = new StringBuilder(); tradeSteps.stream().forEach(step -> sb.append(step.getWare().name()).append(" ")); return "AggregatedBuyTradeStep in "+city.getName()+" buying: "+ sb.toString(); } }
@Override public boolean execute() { IWare ware = getWare(); INavigableVessel vessel = getVessel(); IPlayer player = (IPlayer) vessel.getOwner(); int size = vessel.getSize(); int alreadyLoaded = vessel.getWare(ware).getAmount(); int maxAmountBasedOnPercentage = (int) (size * ware.getAiMaxBuyPercentage()) - alreadyLoaded; int maxAbsoluteAmount = ware.getAiMaxBuyAbsolute() - alreadyLoaded; int affordableAmount = Math.min(maxAmountBasedOnPercentage, maxAbsoluteAmount); transferFromOfficeOrBuyFromCity(player, affordableAmount); return executeNext; }
protected AggregatedBuyTradeStep createAggregatedBuyTradeStep(INavigableVessel vessel, ICity city, List<IWare> waresToBuy) { AggregatedBuyTradeStep buyStepHometown = context.getBean(AggregatedBuyTradeStep.class); buyStepHometown.setCity(city); buyStepHometown.setVessel(vessel); buyStepHometown.setExecuteNext(true); for (IWare ware : waresToBuy) { int maxPrice = ware.getMaxBuyPriceOffensive(); buyStepHometown.addBuyStep(ware, maxPrice); } return buyStepHometown; }
int amountWares = 0; for (IWare ware : availableMap.keySet()) { amountWares += availableMap.get(ware).get() * ware.getSizeAsBarrels();
@Override public String toString() { StringBuilder sb = new StringBuilder(); tradeSteps.stream().forEach(step -> sb.append(step.getWare().name()).append(" ")); return "AggregatesSellTradeStep in "+city.getName()+" buying: "+ sb.toString(); }
protected AggregatedCheckedBuyTradeStep createAggregatedCheckedBuyTradeStep(INavigableVessel vessel, ICity city, List<IWare> waresToBuy) { AggregatedCheckedBuyTradeStep buyStepHometown = context.getBean(AggregatedCheckedBuyTradeStep.class); buyStepHometown.setCity(city); buyStepHometown.setVessel(vessel); buyStepHometown.setExecuteNext(true); for (IWare ware : waresToBuy) { int maxPrice = ware.getMaxBuyPriceOffensive(); buyStepHometown.addBuyStep(ware, maxPrice); } return buyStepHometown; }
@VisibleForTesting int calculateBuyAmount(IWare ware, ICity city, IAIPlayer player, ETradeReason tradeReason, List<IWorkShop> workShops) { switch (tradeReason) { case REQUIRE_FOR_PRODUCTION: // one week supply return workShops.stream() .filter(workshop -> productionChain.getRequiredWares(workshop.getProducableWare()).contains(ware)) .mapToInt(workshop -> (int)Math.ceil(productionChain.getRequiredAmount(workshop.getProducableWare(), ware))) .sum(); case PRODUCED_WARE_IN_CITY: // if needed in city or city is central storage, buy higher amount int baseAmount; if (ware.isBarrelSizedWare()) { baseAmount = 20; } else { baseAmount = 5; } if (tradeService.getBasicNeeds().contains(ware) || hasCentralStorageStrategy(city, player)) { baseAmount *= 2; } return baseAmount; default: throw new IllegalStateException("Unhandled buy trade reason: "+tradeReason); } }
@Override public String toString() { StringBuilder sb = new StringBuilder(); tradeSteps.stream().forEach(step -> sb.append(step.getWare().name()).append(" ")); return getClass().getSimpleName()+" in "+city.getName()+" buying: "+ sb.toString(); } }
/** * Create a trade step for buiyn wares into the trading office * @param office trading office for which to buy the wares * @param city from which to buy the wares * @param waresToBuy wares to buy * @return aggregate buy step for the trading offic */ public AggregatedBuyTradingOfficeTradeStep createAggregatedBuyTradingOfficeTradeStep(ITradingOffice office, ICity city, List<IWare> waresToBuy) { AggregatedBuyTradingOfficeTradeStep buyStepHometown = context.getBean(AggregatedBuyTradingOfficeTradeStep.class); buyStepHometown.setCity(city); buyStepHometown.setTradingOffice(office); for (IWare ware : waresToBuy) { int maxPrice = ware.getMaxBuyPriceOffensive(); buyStepHometown.addBuyStep(ware, maxPrice); } return buyStepHometown; } }
@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 String toString() { StringBuilder sb = new StringBuilder(); tradeSteps.stream().forEach(step -> sb.append(step.getWare().name()).append(" ")); return "AggregatedCheckedBuyTradeStep in "+city.getName()+" buying: "+ sb.toString(); } }
@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; } }
@Override public String toString() { StringBuilder sb = new StringBuilder(); tradeSteps.stream().forEach(step -> sb.append(step.getWare().name()).append(" ")); return "AggregatesCheckedSellTradeStep in "+city.getName()+" buying: "+ sb.toString(); }
@Override public boolean execute() { IWare ware = getWare(); IPlayer player = tradingOffice.getOwner(); int maxAmount = tradingOffice.capacityProperty().get() - tradingOffice.getOccupiedSpace(); if (!ware.isBarrelSizedWare()) { maxAmount /= 10; } tradeService.buyFromCityToStorage(tradingOffice, player, city, ware, maxAmount, Optional.of(maxBuyPrice), tradingOffice.getSteward()); return true; } }
@Override public String toString() { StringBuilder sb = new StringBuilder(); tradeSteps.stream().forEach(step -> sb.append(step.getWare().name()).append(" ")); return "AggregatedBuyTradingOfficeTradeStep in "+city.getName()+" buying: "+ sb.toString(); } }
AmountablePrice<IWare> amountable = amountableProvider.createWareAmountable(); int amount; if (ware.get().isBarrelSizedWare()) { amount = rnd.nextInt(280) + 20; } else {