package mekhq.campaign.parts; import java.util.Objects; import java.util.regex.Pattern; import megamek.common.AmmoType; import mekhq.campaign.unit.Unit; import mekhq.campaign.work.IAcquisitionWork; public class PartInUse { private static final Pattern cleanUp1 = Pattern.compile("\\d+\\shit\\(s\\),\\s"); //$NON-NLS-1$ private static final Pattern cleanUp2 = Pattern.compile("\\d+\\shit\\(s\\)"); //$NON-NLS-1$ private String description; private IAcquisitionWork partToBuy; private int useCount; private int storeCount; private double tonnagePerItem; private int transferCount; private int plannedCount; private long cost; private void appendDetails(StringBuilder sb, Part part) { String details = part.getDetails(); details = cleanUp1.matcher(details).replaceFirst(""); //$NON-NLS-1$ details = cleanUp2.matcher(details).replaceFirst(""); //$NON-NLS-1$ if(details.length() > 0) { sb.append(" (").append(details).append(")"); //$NON-NLS-1$ //$NON-NLS-2$ } } public PartInUse(Part part) { StringBuilder sb = new StringBuilder(part.getName()); Unit u = part.getUnit(); if(!(part instanceof MissingBattleArmorSuit)) { part.setUnit(null); } if(!(part instanceof Armor) && !(part instanceof AmmoStorage)) { appendDetails(sb, part); } part.setUnit(u); this.description = sb.toString(); this.partToBuy = part.getAcquisitionWork(); this.tonnagePerItem = part.getTonnage(); // AmmoBin are special: They aren't buyable (yet?), but instead buy you the ammo inside // We redo the description based on that if(partToBuy instanceof AmmoStorage) { sb.setLength(0); sb.append(((AmmoStorage) partToBuy).getName()); appendDetails(sb, (Part) ((AmmoStorage) partToBuy).getAcquisitionWork()); this.description = sb.toString(); AmmoType ammoType = (AmmoType) ((AmmoStorage) partToBuy).getType(); if(ammoType.getKgPerShot() > 0) { this.tonnagePerItem = ammoType.getKgPerShot() / 1000.0; } else { this.tonnagePerItem = 1.0 / ammoType.getShots(); } } if(part instanceof Armor) { // Armor needs different tonnage values this.tonnagePerItem = 1.0 / ((Armor) part).getArmorPointsPerTon(); } if(null != partToBuy) { this.cost = partToBuy.getBuyCost(); } } public PartInUse(String description, IAcquisitionWork partToBuy, long cost) { this.description = Objects.requireNonNull(description); this.partToBuy = Objects.requireNonNull(partToBuy); this.cost = cost; } public PartInUse(String description, IAcquisitionWork partToBuy) { this(description, partToBuy, partToBuy.getBuyCost()); } public String getDescription() { return description; } public IAcquisitionWork getPartToBuy() { return partToBuy; } public int getUseCount() { return useCount; } public void setUseCount(int useCount) { this.useCount = useCount; } public void incUseCount() { ++ useCount; } public int getStoreCount() { return storeCount; } public double getStoreTonnage() { return storeCount * tonnagePerItem; } public void setStoreCount(int storeCount) { this.storeCount = storeCount; } public void incStoreCount() { ++ storeCount; } public int getTransferCount() { return transferCount; } public void incTransferCount() { ++ transferCount; } public void setTransferCount(int transferCount) { this.transferCount = transferCount; } public int getPlannedCount() { return plannedCount; } public void setPlannedCount(int plannedCount) { this.plannedCount = plannedCount; } public void incPlannedCount() { ++ plannedCount; } public long getCost() { return cost; } @Override public int hashCode() { return Objects.hashCode(description); } @Override public boolean equals(Object obj) { if(this == obj) { return true; } if((null == obj) || (getClass() != obj.getClass())) { return false; } final PartInUse other = (PartInUse) obj; return Objects.equals(description, other.description); } }