/** * Calculates how much of the given goods type this settlement wants and should retain. * * @param type The <code>GoodsType</code>. * @return The amount of goods wanted. */ protected int getWantedGoodsAmount(GoodsType type) { if (getUnitCount() <= 0) return 0; final Specification spec = getSpecification(); final UnitType unitType = getFirstUnit().getType(); final Role militaryRole = Role.getAvailableRoles(getOwner(), unitType, spec.getMilitaryRoles()).get(0); if (type.isMilitaryGoods()) { // Retain enough goods to fully arm. int need = 0; for (Unit u : ownedUnits) { if (u.getRole() == militaryRole) continue; List<AbstractGoods> required = u.getGoodsDifference(militaryRole, 1); need += AbstractGoods.getCount(type, required); } return need; } int consumption = getConsumptionOf(type); if (type == spec.getPrimaryFoodType()) { // Food is perishable, do not try to retain that much return Math.max(40, consumption * 3); } if (type.isTradeGoods() || type.isNewWorldLuxuryType() || type.isRefined()) { // Aim for 10 years supply, resupply is doubtful return Math.max(80, consumption * 20); } // Just keep some around return 2 * getUnitCount(); }
/** * Add some initial goods to a newly generated settlement. After all, they have been here for some * time. * * @param random A pseudo-random number source. */ public void addRandomGoods(Random random) { HashMap<GoodsType, Integer> goodsMap = new HashMap<>(); for (Tile t : getOwnedTiles()) { for (AbstractGoods ag : t.getSortedPotential()) { GoodsType type = ag.getType().getStoredAs(); Integer i = goodsMap.get(type); int value = (i == null) ? 0 : i; goodsMap.put(type, value + ag.getAmount()); } } double d = randomInt(logger, "Goods at " + getName(), random, 10) * 0.1 + 1.0; for (Entry<GoodsType, Integer> e : goodsMap.entrySet()) { int i = e.getValue(); if (!e.getKey().isFoodType()) i = (int) Math.round(d * e.getValue()); i = Math.min(i, GoodsContainer.CARGO_SIZE); if (i > 0) addGoods(e.getKey(), i); } }