src/starpocalypse/submarket/RegulatedOpenMarket.java
package starpocalypse.submarket;
import com.fs.starfarer.api.campaign.CargoAPI;
import com.fs.starfarer.api.campaign.CargoStackAPI;
import com.fs.starfarer.api.campaign.FleetDataAPI;
import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
import com.fs.starfarer.api.combat.ShipHullSpecAPI;
import com.fs.starfarer.api.combat.ShipHullSpecAPI.ShipTypeHints;
import com.fs.starfarer.api.combat.ShipVariantAPI;
import com.fs.starfarer.api.fleet.FleetMemberAPI;
import com.fs.starfarer.api.impl.campaign.ids.Commodities;
import com.fs.starfarer.api.impl.campaign.ids.HullMods;
import com.fs.starfarer.api.impl.campaign.submarkets.OpenMarketPlugin;
import lombok.extern.log4j.Log4j;
import starpocalypse.helper.CargoUtils;
import starpocalypse.helper.ConfigHelper;
import starpocalypse.helper.SubmarketUtils;
@Log4j
public class RegulatedOpenMarket extends OpenMarketPlugin {
private String location;
@Override
public void init(SubmarketAPI submarket) {
super.init(submarket);
location = SubmarketUtils.getLocation(submarket);
}
@Override
public boolean isIllegalOnSubmarket(String commodityId, TransferAction action) {
if (!ConfigHelper.wantsRegulation(market.getFactionId())) {
return super.isIllegalOnSubmarket(commodityId, action);
}
if (isAlwaysLegal(commodityId)) {
return false;
}
if (isAlwaysIllegal(commodityId)) {
return true;
}
if (isSignificant(commodityId)) {
return true;
}
return super.isIllegalOnSubmarket(commodityId, action);
}
@Override
public boolean isIllegalOnSubmarket(CargoStackAPI stack, TransferAction action) {
if (!ConfigHelper.wantsRegulation(market.getFactionId())) {
return super.isIllegalOnSubmarket(stack, action);
}
String stackName = stack.getDisplayName();
if (isAlwaysLegal(stackName)) {
return false;
}
if (isAlwaysIllegal(stackName)) {
return true;
}
if (stack.isCommodityStack()) {
return isIllegalOnSubmarket((String) stack.getData(), action);
}
if (isSignificant(stack)) {
return true;
}
return super.isIllegalOnSubmarket(stack, action);
}
@Override
public boolean isIllegalOnSubmarket(FleetMemberAPI member, TransferAction action) {
if (!ConfigHelper.wantsRegulation(market.getFactionId())) {
return super.isIllegalOnSubmarket(member, action);
}
String hullName = getHullName(member);
if (isAlwaysLegal(hullName)) {
return false;
}
if (isAlwaysIllegal(hullName)) {
return true;
}
if (isCivilian(member.getVariant())) {
return false;
}
if (isSignificant(member)) {
return true;
}
return super.isIllegalOnSubmarket(member, action);
}
@Override
public void updateCargoPrePlayerInteraction() {
super.updateCargoPrePlayerInteraction();
if (ConfigHelper.wantsRegulation(market.getFactionId())) {
removeItems(submarket.getCargo());
removeShips(submarket.getCargo().getMothballedShips());
}
}
private String getHullName(FleetMemberAPI ship) {
ShipHullSpecAPI hullSpec = ship.getHullSpec().getBaseHull();
if (hullSpec == null) {
hullSpec = ship.getHullSpec();
}
return hullSpec.getHullName();
}
private boolean isAlwaysIllegal(String name) {
return ConfigHelper.getRegulationLegal().hasNot(name);
}
private boolean isAlwaysLegal(String name) {
return ConfigHelper.getRegulationLegal().has(name);
}
private boolean isCivilian(ShipVariantAPI variant) {
return variant.hasHullMod(HullMods.CIVGRADE) || variant.getHints().contains(ShipTypeHints.CIVILIAN);
}
private boolean isSignificant(String commodityId) {
CommodityOnMarketAPI com = market.getCommodityData(commodityId);
return com.getCommodity().getTags().contains(Commodities.TAG_MILITARY);
}
private boolean isSignificant(CargoStackAPI stack) {
return CargoUtils.getTier(stack) > ConfigHelper.getRegulationMaxTier();
}
private boolean isSignificant(FleetMemberAPI member) {
return member.getFleetPointCost() > ConfigHelper.getRegulationMaxFP();
}
private void removeItems(CargoAPI cargo) {
for (CargoStackAPI stack : cargo.getStacksCopy()) {
if (isIllegalOnSubmarket(stack, TransferAction.PLAYER_BUY)) {
log.info(location + ": Removing " + stack.getDisplayName());
cargo.removeStack(stack);
}
}
cargo.sort();
}
private void removeShips(FleetDataAPI ships) {
for (FleetMemberAPI member : ships.getMembersListCopy()) {
if (isIllegalOnSubmarket(member, TransferAction.PLAYER_BUY)) {
log.info(location + ": Removing " + member.getHullSpec().getHullName());
ships.removeFleetMember(member);
}
}
ships.sort();
}
}