/** * 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); } } }