jaghaimo/stellics

View on GitHub
src/main/java/stellics/transfer/SmartCargoTransfer.java

Summary

Maintainability
A
0 mins
Test Coverage
package stellics.transfer;

import java.util.List;

import com.fs.starfarer.api.Global;
import com.fs.starfarer.api.campaign.CargoAPI;
import com.fs.starfarer.api.campaign.CargoStackAPI;
import com.fs.starfarer.api.campaign.econ.SubmarketAPI;

import stellics.helper.MonthlyReportHelper;
import stellics.helper.StorageHelper;

public class SmartCargoTransfer extends IntelAwareTransfer implements CargoTransferAction {

    private CargoAPI filteredCargo;
    private CargoAPI playerCargo;

    public SmartCargoTransfer(CargoAPI filteredCargo) {
        this.filteredCargo = filteredCargo;
        this.playerCargo = Global.getSector().getPlayerFleet().getCargo();
    }

    @Override
    public CargoAPI getSource() {
        return filteredCargo;
    }

    @Override
    public void transfer(CargoAPI cargo) {
        List<SubmarketAPI> storages = StorageHelper.getAllSortedWithAccess();
        for (SubmarketAPI storage : storages) {
            CargoAPI storageCargo = storage.getCargo();
            CargoAPI commonCargo = getCommonCargo(cargo, storageCargo);
            MonthlyReportHelper.registerCargoTransfer(storage.getMarket(), cargo);
            playerCargo.addAll(commonCargo);
            storageCargo.removeAll(commonCargo);
            cargo.removeAll(commonCargo);
            fireIntel(commonCargo, storage.getMarket());
            if (cargo.isEmpty()) {
                break;
            }
        }
    }

    private CargoAPI getCommonCargo(CargoAPI cargoA, CargoAPI cargoB) {
        CargoAPI aLessB = cargoA.createCopy();
        aLessB.removeAll(cargoB);
        CargoAPI bLessA = cargoB.createCopy();
        bLessA.removeAll(cargoA);
        CargoAPI intersection = cargoA.createCopy();
        intersection.addAll(cargoB);
        intersection.removeAll(aLessB);
        intersection.removeAll(bLessA);
        halveQuantities(intersection);
        return intersection;
    }

    private void halveQuantities(CargoAPI cargo) {
        for (CargoStackAPI cargoStack : cargo.getStacksCopy()) {
            float size = cargoStack.getSize();
            cargoStack.setSize(size / 2);
        }
    }

    @Override
    protected String getToOrFrom() {
        return "from";
    }
}