예제 #1
0
  /**
   * 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();
  }
예제 #2
0
 /**
  * Updates the goods wanted by this settlement.
  *
  * <p>It is only meaningful to call this method from the server, since the settlement's {@link
  * GoodsContainer} is hidden from the clients.
  */
 public void updateWantedGoods() {
   final Specification spec = getSpecification();
   final java.util.Map<GoodsType, Integer> prices = new HashMap<>();
   for (GoodsType gt : spec.getGoodsTypeList()) {
     // The natives do not trade military or non-storable goods.
     if (gt.isMilitaryGoods() || !gt.isStorable()) continue;
     prices.put(gt, getNormalGoodsPriceToBuy(gt, GoodsContainer.CARGO_SIZE));
   }
   int wantedIndex = 0;
   for (Entry<GoodsType, Integer> e : mapEntriesByValue(prices, descendingIntegerComparator)) {
     GoodsType goodsType = e.getKey();
     if (e.getValue() <= GoodsContainer.CARGO_SIZE * TRADE_MINIMUM_PRICE
         || wantedIndex >= wantedGoods.length) break;
     wantedGoods[wantedIndex] = goodsType;
     wantedIndex++;
   }
   for (; wantedIndex < wantedGoods.length; wantedIndex++) {
     wantedGoods[wantedIndex] = null;
   }
 }