/**
  * Selects a faction from the salvage list and generates a table using the same parameters as this
  * table, but from five years earlier. Generated tables are cached for later use. If the generated
  * table contains no units, it is discarded and the selected entry is deleted. This continues
  * until either a unit is generated or there are no remaining entries.
  *
  * @param filter - passed to generateUnit() in the generated table.
  * @return - a unit generated from another faction, or null if none of the factions in the salvage
  *     list contain any units that meet the parameters.
  */
 private MechSummary generateSalvage(UnitFilter filter) {
   while (salvageTotal > 0) {
     int roll = Compute.randomInt(salvageTotal);
     TableEntry salvageEntry = null;
     for (TableEntry te : salvageTable) {
       if (roll < te.weight) {
         salvageEntry = te;
         break;
       }
       roll -= te.weight;
     }
     if (salvageEntry != null) {
       UnitTable salvage =
           UnitTable.findTable(
               salvageEntry.getSalvageFaction(),
               key.getUnitType(),
               key.getYear() - 5,
               key.getRating(),
               key.getWeightClasses(),
               key.getNetworkMask(),
               key.getMovementModes(),
               key.getRoles(),
               key.getRoleStrictness(),
               key.getFaction());
       if (salvage.hasUnits()) {
         return salvage.generateUnit(filter);
       } else {
         salvageTotal -= salvageEntry.weight;
         salvageTable.remove(salvageEntry);
       }
     }
   }
   assert (salvageTable.isEmpty() && salvageTotal == 0);
   return null;
 }
  /**
   * Initializes table based on values provided by key
   *
   * @param key - a structure providing the parameters for generating the table
   */
  protected UnitTable(CacheKey key) {
    this.key = key;
    /**
     * Generate the RAT, then go through it to build the NavigableMaps that will be used for random
     * selection.
     */
    if (key.getFaction().isActiveInYear(key.getYear())) {
      List<TableEntry> table =
          RATGenerator.getInstance()
              .generateTable(
                  key.getFaction(),
                  key.getUnitType(),
                  key.getYear(),
                  key.getRating(),
                  key.getWeightClasses(),
                  key.getNetworkMask(),
                  key.getMovementModes(),
                  key.getRoles(),
                  key.getRoleStrictness(),
                  key.getDeployingFaction());
      Collections.sort(table);

      table.forEach(
          te -> {
            if (te.isUnit()) {
              unitTotal += te.weight;
              unitTable.add(te);
            } else {
              salvageTotal += te.weight;
              salvageTable.add(te);
            }
          });
      if (salvageTotal + unitTotal > 0) {
        salvagePct = salvageTotal * 100 / (salvageTotal + unitTotal);
      }
    }
  }