1package com.fs.starfarer.api.impl.campaign;
3import java.util.HashMap;
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.BuffManagerAPI.Buff;
11import com.fs.starfarer.api.campaign.CampaignUIAPI.CoreUITradeMode;
12import com.fs.starfarer.api.campaign.FleetDataAPI;
13import com.fs.starfarer.api.campaign.econ.MarketAPI;
14import com.fs.starfarer.api.combat.HullModEffect;
15import com.fs.starfarer.api.combat.MutableShipStatsAPI;
16import com.fs.starfarer.api.combat.MutableStat;
17import com.fs.starfarer.api.combat.MutableStat.StatMod;
18import com.fs.starfarer.api.combat.ShipAPI;
19import com.fs.starfarer.api.combat.ShipAPI.HullSize;
20import com.fs.starfarer.api.combat.ShipVariantAPI;
21import com.fs.starfarer.api.fleet.FleetMemberAPI;
22import com.fs.starfarer.api.loading.HullModSpecAPI;
23import com.fs.starfarer.api.ui.TooltipMakerAPI;
33 public static class TowCableBuff
implements Buff {
35 private String buffId;
36 private int frames = 0;
38 public TowCableBuff(String buffId) {
42 public boolean isExpired() {
46 public String getId() {
49 public void apply(FleetMemberAPI member) {
52 member.getStats().getMaxBurnLevel().modifyFlat(buffId, 1);
54 public void advance(
float days) {
71 cleanUpTowCableBuffBy(member);
76 cleanUpTowCableBuffBy(member);
84 int thisCableIndex = -1;
86 if (!curr.canBeDeployedForCombat())
continue;
87 if (curr.getVariant().getHullMods().contains(
HULLMOD_ID)) {
89 thisCableIndex = numCables;
94 if (numCables <= 0 || thisCableIndex == -1) {
95 cleanUpTowCableBuffBy(member);
99 TowCableBuff buff = getTowCableBuffBy(member,
true);
100 Map<FleetMemberAPI, Integer> cables =
new HashMap<FleetMemberAPI, Integer>();
104 for (
int cableIndex = 0; cableIndex < numCables; cableIndex++) {
106 if (slowest ==
null)
break;
108 Integer bonus = cables.get(slowest);
109 if (bonus ==
null) bonus =
new Integer(0);
111 cables.put(slowest, bonus);
113 if (cableIndex == thisCableIndex) {
114 thisCableTarget = slowest;
116 if (existing == buff) {
134 if (curr != thisCableTarget) {
135 curr.getBuffManager().removeBuff(buff.getId());
140 private FleetMemberAPI getSlowest(List<FleetMemberAPI> all,
float speedCutoff, Map<FleetMemberAPI, Integer> cables) {
142 float minLevel = Float.MAX_VALUE;
144 if (!isSuitable(curr))
continue;
146 float baseBurn = getMaxBurnWithoutCables(curr);
147 Integer bonus = cables.get(curr);
148 if (bonus ==
null) bonus =
new Integer(0);
150 if (bonus >= getMaxCablesFor(curr))
continue;
152 float burnLevel = baseBurn + bonus;
154 if (burnLevel >= speedCutoff)
continue;
156 if (burnLevel < minLevel) {
157 minLevel = burnLevel;
164 private int getMaxCablesFor(FleetMemberAPI member) {
174 private float getMaxBurnWithoutCables(FleetMemberAPI member) {
178 for (StatMod mod : burn.getFlatMods().values()) {
179 if (mod.getSource().startsWith(
HULLMOD_ID)) sub++;
181 return Math.max(0, val - sub);
184 private boolean isSuitable(FleetMemberAPI member) {
185 if (member.isFighterWing())
return false;
189 private void cleanUpTowCableBuffBy(FleetMemberAPI member) {
190 if (member.getFleetData() ==
null)
return;
191 FleetDataAPI data = member.getFleetData();
192 TowCableBuff buff = getTowCableBuffBy(member,
false);
194 for (FleetMemberAPI curr : data.getMembersListCopy()) {
195 curr.getBuffManager().removeBuff(buff.getId());
205 @SuppressWarnings(
"unchecked")
206 private TowCableBuff getTowCableBuffBy(
FleetMemberAPI member,
boolean createIfMissing) {
207 Map<FleetMemberAPI, TowCableBuff> buffs;
209 buffs = (Map<FleetMemberAPI, TowCableBuff>) Global.getSector().getPersistentData().get(TOW_CABLE_KEY);
211 buffs = new HashMap<FleetMemberAPI, TowCableBuff>();
212 Global.getSector().getPersistentData().put(TOW_CABLE_KEY, buffs);
216 TowCableBuff buff = buffs.get(member);
217 if (buff ==
null && createIfMissing) {
218 String
id =
HULLMOD_ID +
"_" + member.getId();
219 buff =
new TowCableBuff(
id);
220 buffs.put(member, buff);
295 boolean isForModSpec) {
300 boolean isForModSpec,
boolean isForBuildInList) {
306 boolean isForModSpec,
boolean isForBuildInList) {
341 MarketAPI dockedAt,
float width,
boolean isForModSpec) {
static SectorAPI getSector()
void addRequiredItemSection(TooltipMakerAPI tooltip, FleetMemberAPI member, ShipVariantAPI currentVariant, MarketAPI dockedAt, float width, boolean isForModSpec)
String getUnapplicableReason(ShipAPI ship)
boolean canBeAddedOrRemovedNow(ShipAPI ship, MarketAPI marketOrNull, CoreUITradeMode mode)
String getDescriptionParam(int index, HullSize hullSize, ShipAPI ship)
boolean isApplicableToShip(ShipAPI ship)
String getCanNotBeInstalledNowReason(ShipAPI ship, MarketAPI marketOrNull, CoreUITradeMode mode)
boolean isSModEffectAPenalty()
void addSModSection(TooltipMakerAPI tooltip, HullSize hullSize, ShipAPI ship, float width, boolean isForModSpec)
void applyEffectsBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id)
boolean hasSModEffectSection(HullSize hullSize, ShipAPI ship, boolean isForModSpec)
boolean showInRefitScreenModPickerFor(ShipAPI ship)
String getSModDescriptionParam(int index, HullSize hullSize, ShipAPI ship)
String getSModDescriptionParam(int index, HullSize hullSize)
void applyEffectsAfterShipCreation(ShipAPI ship, String id)
void advanceInCampaign(FleetMemberAPI member, float amount)
int getDisplayCategoryIndex()
static final String HULLMOD_ID
int getDisplaySortOrder()
void advanceInCombat(ShipAPI ship, float amount)
void init(HullModSpecAPI spec)
void addPostDescriptionSection(TooltipMakerAPI tooltip, HullSize hullSize, ShipAPI ship, float width, boolean isForModSpec)
static final String TOW_CABLE_KEY
void addSModSection(TooltipMakerAPI tooltip, HullSize hullSize, ShipAPI ship, float width, boolean isForModSpec, boolean isForBuildInList)
void addSModEffectSection(TooltipMakerAPI tooltip, HullSize hullSize, ShipAPI ship, float width, boolean isForModSpec, boolean isForBuildInList)
void applyEffectsToFighterSpawnedByShip(ShipAPI fighter, ShipAPI ship, String id)
boolean shouldAddDescriptionToTooltip(HullSize hullSize, ShipAPI ship, boolean isForModSpec)
String getDescriptionParam(int index, HullSize hullSize)
CampaignFleetAPI getFleet()
List< FleetMemberAPI > getMembersListCopy()
Map< String, Object > getPersistentData()
MutableStat getMaxBurnLevel()
Collection< String > getHullMods()
BuffManagerAPI getBuffManager()
ShipVariantAPI getVariant()
boolean canBeDeployedForCombat()
FleetDataAPI getFleetData()
MutableShipStatsAPI getStats()