private List<IWare> getRequiredWares(INavigableVessel vessel, Map<IWare, Integer> requiredWareAmounts) { List<IWare> requiredWares = new ArrayList<>(requiredWareAmounts.keySet()); for (Iterator<IWare> iterator = requiredWares.iterator(); iterator.hasNext(); ) { IWare ware = iterator.next(); int loadedAmount = vessel.getWare(ware).getAmount(); if (loadedAmount >= requiredWareAmounts.get(ware)) { iterator.remove(); } } return requiredWares; }
/** * Find all wares that are loaded on the ship. * @param vessel for which to check the wares. * @return list of loaded wares. */ protected List<IWare> getLoadedWares(INavigableVessel vessel) { return vessel.getLoadedWares() .stream() .filter(ware -> vessel.getWare(ware).getAmount() > 0) .collect(Collectors.toList()); }
private boolean enoughStored(IPlayer player, ICity city) { Optional<ITradingOffice> optOffice = player.findTradingOffice(city); if (optOffice.isPresent()) { for (IWare ware : minAmounts.keySet()) { ITradingOffice office = optOffice.get(); AmountablePrice<IWare> stored = office.getWare(ware); if (stored.getAmount() < minAmounts.get(ware)) { return false; } } return true; } return false; } }
private void filterWareAvailability(List<EWeapon> producableWeapons, ICity city) { for (Iterator<EWeapon> iterator = producableWeapons.iterator(); iterator.hasNext(); ) { EWeapon weapon = iterator.next(); boolean remove = false; for (EWare ware : wares) { int requiredAmount = getConstructionAmount(weapon, ware); if (city.getWare(ware).getAmount() < requiredAmount) { remove = true; break; } } if (remove) { iterator.remove(); } } }
@VisibleForTesting void fillRequiredWaresAvailableBased(Map<IWare, Integer> requiredWares, CentralStorageHintContext context, ITradingOffice office) { asList(EWare.values()).stream() .filter(ware -> context.getWares().contains(ware)) .filter(ware -> !office.getSteward().isPresent() || office.getOfficeTrading().isMovableToShip(ware)) .forEach(ware -> { int availableInStore = office.getWare(ware).getAmount(); requiredWares.put(ware, availableInStore); }); } @VisibleForTesting
@Override public void run() { INavigableVessel ship = transfer.getVessel(); final IPlayer player = transfer.getPlayer(); Optional<ITradingOffice> optOffice = player.findTradingOffice(transfer.getCity()); if (optOffice.isPresent() && optOffice.get().getWare(ware).getAmount()>0){ ITradingOffice office = optOffice.get(); final AmountablePrice<IWare> amountable = office.getWare(this.ware); int availableAmountStorage = amountable.getAmount(); int amount2Move = transfer.getAmount(availableAmountStorage); // This is ware specific size tradeService.transferFromStorageToVessel(office, ship, player, ware, amount2Move); } }
@Override public boolean execute() { int maxSellAmount = vessel.getWare(ware).getAmount(); int minSellPrice = vessel.getWare(ware).getAVGPrice(); IAIPlayer player = (IAIPlayer) vessel.getOwner(); tradeService.sellWareShipToCity(vessel, player, city, ware, maxSellAmount, Optional.of(minSellPrice)); return executeNext; } }
@Override public void run() { final ICity city = transfer.getCity(); int availableAmountCity = city.getWare(ware).getAmount(); if (availableAmountCity>0) { int amount2Move = transfer.getAmount(availableAmountCity); // This is ware specific size final IPlayer player = transfer.getPlayer(); final INavigableVessel vessel = transfer.getVessel(); final int capacity = vessel.getCapacity(); amount2Move = Math.min(amount2Move, capacity); tradeService.buyFromCityToShip(vessel, player, city, ware, amount2Move, Optional.empty(), Optional.empty()); } // end no ware available } }
@Override public void run() { INavigableVessel ship = transfer.getVessel(); final AmountablePrice<IWare> amountable = ship.getWare(this.ware); int availableAmountShip = amountable.getAmount(); final IPlayer player = transfer.getPlayer(); ICity city = transfer.getCity(); Optional<ITradingOffice> optOffice = player.findTradingOffice(city); if (availableAmountShip>0 && optOffice.isPresent()){ Map<IWare, Integer> amounts = new HashMap<>(); amounts.put(ware, transfer.getAmount(availableAmountShip)); tradeService.transferFromVesselToStorage(ship, player, city, amounts); } }
@Override public void run() { int availableAmountCity = transfer.getCity().getWare(ware).getAmount(); Optional<ITradingOffice> optOffice = transfer.getPlayer().findTradingOffice(transfer.getCity()); if (availableAmountCity>0 && optOffice.isPresent()){ int amount2Move = transfer.getAmount(availableAmountCity); // This is ware specific size tradeService.buyFromCityToStorage(optOffice.get(), transfer.getPlayer(), transfer.getCity(), ware, amount2Move, Optional.empty(), Optional.empty()); } } }
@Override public void run() { Optional<ITradingOffice> optOffice = transfer.getPlayer().findTradingOffice(transfer.getCity()); if (optOffice.isPresent()) { ITradingOffice office = optOffice.get(); int amountInStorage = office.getWare(ware).getAmount(); if (amountInStorage > 0) { int amount2Move = transfer.getAmount(amountInStorage); tradeService.sellFromStorageToCity(office, transfer.getPlayer(), transfer.getCity(), ware, amount2Move, Optional.empty()); } // end stored amount } // end office }
@Override public void updateKnowledge(ICity city) { CityProductionConsumptionKnowledge knowledge = (CityProductionConsumptionKnowledge) productionAndConsumption.get(city); for (EWare ware : EWare.values()) { int amount = productionAndConsumptionService.getProductionOutputCurrentWeek(ware, city); knowledge.updateProduction(ware, amount); amount = (int) Math.floor(consume.getWeeklyConsumption(ware, city)); knowledge.updateConsumption(ware, amount); amount = city.getWare(ware).getAmount(); knowledge.updateStored(ware, amount); } }
@Override public void run() { final INavigableVessel vessel = transfer.getVessel(); int amountOnShip = vessel.getWare(ware).getAmount(); if (amountOnShip>0){ final ICity city = transfer.getCity(); int amount2Move = transfer.getAmount(amountOnShip); tradeService.sellWareShipToCity(vessel, transfer.getPlayer(), city, ware, amount2Move, Optional.empty()); } } }
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; }
@Override public boolean execute() { Preconditions.checkArgument(vessel.getLocation().equals(city.getCoordinates()), "The vessel is not in city "+city.getName()+" but at "+vessel.getLocation()); for (CheckedSellTradeStep sellTradeStep : tradeSteps) { if (vessel.getWare(sellTradeStep.getWare()).getAmount() > 0) { sellTradeStep.execute(); } } return executeNext; } @Override
@Override public boolean execute() { Preconditions.checkArgument(vessel.getLocation().equals(city.getCoordinates()), "The vessel is not in city "+city.getName()+" but at "+vessel.getLocation()); for (SellTradeStep sellTradeStep : tradeSteps) { if (vessel.getWare(sellTradeStep.getWare()).getAmount() > 0) { sellTradeStep.execute(); } } return executeNext; } @Override
@PostConstruct private void initializeDialog() { setTitle(messageSource.getMessage("ch.sahits.game.openpatrician.display.dialog.TavernBuyerDialog.title", new Object[]{}, locale.getCurrentLocal())); initializeButtons(); IBuyer buyer = (IBuyer) currentPerson.get(); int p = buyer.getAmountablePrice().getAVGPrice()*buyer.getAmountablePrice().getAmount(); Object[] args = new Object[]{buyer.getName(), buyer.getAmountablePrice().getAmount(), translator.getLocalDisplayName((EWare)buyer.getWare()), p}; String key = "ch.sahits.game.openpatrician.display.dialog.TavernBuyerDialog.bale.dialog"; if (buyer.getWare().isBarrelSizedWare()) { key = "ch.sahits.game.openpatrician.display.dialog.TavernBuyerDialog.barrel.dialog"; } String loadedText = messageSource.getMessage(key, args, locale.getCurrentLocal()); DecoratedText dt = decoratedTextFactory.createDecoratedText(loadedText, new HashMap<>()); getContent().addAll(dt); }
@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; }
@Override public boolean execute() { Preconditions.checkArgument(vessel.getLocation().equals(city.getCoordinates()), "The vessel is not in city "+city.getName()+" but at "+vessel.getLocation()); for (SellDumpTradeStep buyTradeStep : tradeSteps) { if (vessel.getWare(buyTradeStep.getWare()).getAmount() > 0) { buyTradeStep.execute(); } } return executeNext; } @Override
private Pair<Integer, Integer> buyWareFromCity(IPlayer player, ICity city, int availableAmountCity, IWare ware, long cash, int amountToBuy, int maxAvgPrice) { Pair<Integer, Integer> affordable = calculateAffordableAmountToBuy(ware, cash, amountToBuy, availableAmountCity, maxAvgPrice); amountToBuy = affordable.getKey(); int avgPriceCompleteAmount = affordable.getValue(); if (amountToBuy == 0) { return new Pair<>(0, 0); } int movedAmount = city.move(ware, -amountToBuy, player); if (amountToBuy != -movedAmount) { avgPriceCompleteAmount = computablePrice.buyPrice(ware, new SimpleIntegerProperty(city.getWare(ware).getAmount() + movedAmount), new ConstantIntegerBinding(movedAmount)); amountToBuy = -movedAmount; } return new Pair<>(amountToBuy, avgPriceCompleteAmount); }