package campaign.submarkets;
import com.fs.starfarer.api.Global;
import com.fs.starfarer.api.campaign.*;
import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflater;
import com.fs.starfarer.api.impl.campaign.ids.Items;
import com.fs.starfarer.api.impl.campaign.submarkets.MilitarySubmarketPlugin;
import com.fs.starfarer.api.loading.FighterWingSpecAPI;
import com.fs.starfarer.api.loading.HullModSpecAPI;
import com.fs.starfarer.api.loading.WeaponSpecAPI;
import com.fs.starfarer.api.util.Misc;
import com.fs.starfarer.api.util.WeightedRandomPicker;
import java.util.List;
public class prv_labmarket extends MilitarySubmarketPlugin {
private static final int WEAPON_COUNT_NATIVE = 3; // n to 1.5 n
private static final int WEAPON_COUNT_ALLY = 3; // n to 1.5 n
private static final int WING_COUNT = 3; // n to 1.5 n
private static final int HULLMOD_COUNT = 3; // 0 to n-1
private static final float GOODYCHANCE = 0.33f;
private static final RepLevel ALLY_THRESHOLD = RepLevel.WELCOMING; // +25
@Override
public String getName() {
return Misc.ucFirst(submarket.getFaction().getPersonNamePrefix()) + "\n" + "R&D";
}
@Override
protected boolean requiresCommission(RepLevel req) {
return false;
}
@Override
public void updateCargoPrePlayerInteraction() {
float seconds = Global.getSector().getClock().convertToSeconds(sinceLastCargoUpdate);
addAndRemoveStockpiledResources(seconds, false, true, true);
sinceLastCargoUpdate = 0f;
if (okToUpdateShipsAndWeapons()) {
sinceSWUpdate = 0f;
WeightedRandomPicker<String> factionPicker = new WeightedRandomPicker<String>();
String owner = market.getFactionId();
List<FactionAPI> factions = Global.getSector().getAllFactions();
for(FactionAPI faction : factions){
if(faction.getRelationshipLevel(owner).isAtWorst(ALLY_THRESHOLD)){
factionPicker.add(faction.getId(),10f);
}
}
if (factionPicker.isEmpty()) {
factionPicker.add(owner);
}
pruneWeapons(0f);
addWeaponsMintier(WEAPON_COUNT_NATIVE, Math.round(WEAPON_COUNT_NATIVE * 1.5f) , 3,2, submarket.getFaction().getId());
addWeaponsMintier(WEAPON_COUNT_ALLY, Math.round(WEAPON_COUNT_ALLY * 1.5f) , 3,2, factionPicker);
addFightersMintier(WING_COUNT, Math.round(WING_COUNT * 1.5f), 3,2, market.getFactionId());
addHullModsMintier(4, 2,itemGenRandom.nextInt(HULLMOD_COUNT));
if(Math.random() < GOODYCHANCE){
addGoodies(0,3);
}
float stability = market.getStabilityValue();
float sMult = Math.max(0.1f, stability / 10f);
getCargo().getMothballedShips().clear();
addShips(submarket.getFaction().getId(),
50f * sMult, // combat
15f * sMult, // freighter
10f * sMult, // tanker
20f * sMult, // transport
10f * sMult, // liner
10f * sMult, // utilityPts
null, // qualityOverride
sMult, // qualityMod
null,
null);
}
getCargo().sort();
}
protected void addGoodies(int min, int max){
int num = min + itemGenRandom.nextInt(max - min + 1);
WeightedRandomPicker<WeaponSpecAPI> picker = new WeightedRandomPicker<WeaponSpecAPI>(itemGenRandom);
for (String id : Global.getSector().getAllWeaponIds()) {
WeaponSpecAPI spec = Global.getSettings().getWeaponSpec(id);
float p = 1f;
if (spec.getTags().contains("prv_lab_bp")) {
picker.add(spec, p);
}
}
for (int i = 0; i < num && !picker.isEmpty(); i++) {
WeaponSpecAPI spec = picker.pick();
int count = 1;
CargoAPI cargo = submarket.getCargo();
cargo.addWeapons(spec.getWeaponId(), count);
}
}
protected void addWeaponsMintier(int min, int max, int maxTier, int minTier, WeightedRandomPicker<String> factionPicker) {
int num = min + itemGenRandom.nextInt(max - min + 1);
for (int i = 0; i < num; i++) {
String factionId = factionPicker.pick();
addWeaponsMintier(1, 1, maxTier, minTier, factionId);
}
}
protected void addWeaponsMintier(int min, int max, int maxTier, int minTier, String factionId) {
if (factionId == null) factionId = market.getFactionId();
int num = min + itemGenRandom.nextInt(max - min + 1);
float quality = Misc.getShipQuality(market, factionId);
FactionAPI faction = Global.getSector().getFaction(factionId);
WeightedRandomPicker<WeaponSpecAPI> picker = new WeightedRandomPicker<WeaponSpecAPI>(itemGenRandom);
for (String id : faction.getKnownWeapons()) {
WeaponSpecAPI spec = Global.getSettings().getWeaponSpec(id);
if (spec.getTier() > maxTier) continue;
if (spec.getTier() < minTier) continue;
float p = DefaultFleetInflater.getTierProbability(spec.getTier(), quality);
p = 1f;
picker.add(spec, p);
}
for (int i = 0; i < num && !picker.isEmpty(); i++) {
WeaponSpecAPI spec = picker.pick();
int count = 2;
switch (spec.getSize()) {
case LARGE: count = 2; break;
case MEDIUM: count = 4; break;
case SMALL: count = 8; break;
}
count = count + itemGenRandom.nextInt(count + 1) - count/2;
CargoAPI cargo = submarket.getCargo();
cargo.addWeapons(spec.getWeaponId(), count);
}
}
protected void addFightersMintier(int min, int max, int maxTier, int minTier, String factionId) {
if (factionId == null) factionId = market.getFactionId();
int num = min + itemGenRandom.nextInt(max - min + 1);
float quality = Misc.getShipQuality(market, factionId);
FactionAPI faction = Global.getSector().getFaction(factionId);
WeightedRandomPicker<FighterWingSpecAPI> picker = new WeightedRandomPicker<FighterWingSpecAPI>(itemGenRandom);
for (String id : faction.getKnownFighters()) {
FighterWingSpecAPI spec = Global.getSettings().getFighterWingSpec(id);
if (spec.getTier() > maxTier) continue;
if (spec.getTier() < minTier) continue;
float p = DefaultFleetInflater.getTierProbability(spec.getTier(), quality);
picker.add(spec, p);
}
for (int i = 0; i < num && !picker.isEmpty(); i++) {
FighterWingSpecAPI spec = picker.pick();
int count = 2;
switch (spec.getRole()) {
case ASSAULT: count = 2; break;
case BOMBER: count = 2; break;
case INTERCEPTOR: count = 4; break;
case FIGHTER: count = 3; break;
case SUPPORT: count = 2; break;
}
count = count + itemGenRandom.nextInt(count + 1) - count/2;
CargoAPI cargo = submarket.getCargo();
cargo.addItems(CargoAPI.CargoItemType.FIGHTER_CHIP, spec.getId(), count);
}
}
protected void addHullModsMintier(int maxTier, int minTier, int num) {
CargoAPI cargo = getCargo();
for (CargoStackAPI stack : cargo.getStacksCopy()) {
//if (stack.isModSpecStack()) {
if (stack.isSpecialStack() && stack.getSpecialDataIfSpecial().getId().equals(Items.MODSPEC)){
cargo.removeStack(stack);
}
}
WeightedRandomPicker<HullModSpecAPI> picker = new WeightedRandomPicker<HullModSpecAPI>(itemGenRandom);
for (String id : submarket.getFaction().getKnownHullMods()) {
//if (Global.getSector().getCharacterData().knowsHullMod(id)) continue;
HullModSpecAPI spec = Global.getSettings().getHullModSpec(id);
if (spec.isHidden()) continue;
if (spec.isAlwaysUnlocked()) continue;
if (spec.getTier() > maxTier) continue;
if (spec.getTier() < minTier) continue;
picker.add(spec, spec.getRarity());
}
for (int i = 0; i < num; i++) {
HullModSpecAPI pick = picker.pickAndRemove();
if (pick == null) continue;
String id = pick.getId();
if (cargoAlreadyHasMod(id)) continue;
if (Global.getSector().getPlayerFaction().knowsHullMod(id)) continue;
//cargo.addItems(CargoItemType.MOD_SPEC, id, 1);
cargo.addItems(CargoAPI.CargoItemType.SPECIAL, new SpecialItemData(Items.MODSPEC, id), 1);
}
}
}