Starsector API
Loading...
Searching...
No Matches
DurationAbilityWithCost2.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.abilities;
2
3import java.awt.Color;
4import java.util.ArrayList;
5import java.util.List;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.BattleAPI;
9import com.fs.starfarer.api.campaign.BuffManagerAPI.Buff;
10import com.fs.starfarer.api.campaign.CampaignFleetAPI;
11import com.fs.starfarer.api.campaign.econ.MarketAPI;
12import com.fs.starfarer.api.fleet.FleetMemberAPI;
13import com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin;
14import com.fs.starfarer.api.impl.campaign.terrain.CRRecoveryBuff;
15import com.fs.starfarer.api.ui.LabelAPI;
16import com.fs.starfarer.api.ui.TooltipMakerAPI;
17import com.fs.starfarer.api.util.Misc;
18import com.fs.starfarer.api.util.Misc.FleetMemberDamageLevel;
19
21
22 public float getFuelCostMult() {
23 return 1f;
24 }
25 public float getCRCostMult() {
26 return 0.25f;
27 }
28
30 return 0.33f;
31 }
32
33 public FleetMemberDamageLevel getActivationDamageLevel() {
34 return FleetMemberDamageLevel.LOW;
35 }
36
37 public boolean canRecoverCRWhileActive() {
38 return false;
39 }
40
41 protected void deductCost() {
42 CampaignFleetAPI fleet = getFleet();
43 if (fleet == null) return;
44
45 float crCostMult = getCRCostMult();
46 if (crCostMult > 0) {
47 for (FleetMemberAPI member : getNonReadyShips()) {
48 if ((float) Math.random() < getActivationAtLowCRShipDamageProbability()) {
49 Misc.applyDamage(member, null, getActivationDamageLevel(), false, null, null,
50 true, null, member.getShipName() + " suffers damage from " + spec.getName() + " activation");
51 }
52 }
53 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
54 float crLoss = getCRCost(member);
55 member.getRepairTracker().applyCREvent(-crLoss, Misc.ucFirst(spec.getName().toLowerCase()));
56 }
57 }
58
59 float cost = computeFuelCost();
60 fleet.getCargo().removeFuel(cost);
61 }
62
63
64 protected void applyStatsEffect(float amount, float level) {
65
66 }
67
68 protected void unapplyStatsEffect() {
69
70 }
71
72 protected void applyFleetVisual(float amount, float level) {
73
74 }
75
76 @Override
77 protected void applyEffect(float amount, float level) {
78 CampaignFleetAPI fleet = getFleet();
79 if (fleet == null) return;
80
81 applyStatsEffect(amount, level);
82 applyFleetVisual(amount, level);
83
85 String buffId = getModId();
86 float buffDur = 0.1f;
87 boolean needsSync = false;
88 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
89 if (level <= 0) {
90 member.getBuffManager().removeBuff(buffId);
91 needsSync = true;
92 } else {
93 Buff test = member.getBuffManager().getBuff(buffId);
94 if (test instanceof CRRecoveryBuff) {
95 CRRecoveryBuff buff = (CRRecoveryBuff) test;
96 buff.setDur(buffDur);
97 } else {
98 member.getBuffManager().addBuff(new CRRecoveryBuff(buffId, 0f, buffDur));
99 needsSync = true;
100 }
101 }
102 }
103
104 if (needsSync) {
105 fleet.forceSync();
106 }
107 }
108
109 }
110
111 @Override
112 protected void deactivateImpl() {
113 cleanupImpl();
114 }
115
116 @Override
117 protected void cleanupImpl() {
119 }
120
121 protected List<FleetMemberAPI> getNonReadyShips() {
122 List<FleetMemberAPI> result = new ArrayList<FleetMemberAPI>();
123 if (getCRCostMult() <= 0f) return result;
124
125 CampaignFleetAPI fleet = getFleet();
126 if (fleet == null) return result;
127
128 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
129 float crLoss = getCRCost(member);
130 if (Math.round(member.getRepairTracker().getCR() * 100) < Math.round(crLoss * 100)) {
131 result.add(member);
132 }
133 }
134 return result;
135 }
136
137 public float getCRCost(FleetMemberAPI member) {
138 float crCostMult = getCRCostMult();
139 float crLoss = member.getDeployCost() * crCostMult;
140 return Math.round(crLoss * 100f) / 100f;
141 }
142
143 protected float computeFuelCost() {
144 CampaignFleetAPI fleet = getFleet();
145 if (fleet == null) return 0f;
146
147 float cost = fleet.getLogistics().getFuelCostPerLightYear() * getFuelCostMult();
148 return cost;
149 }
150
151 protected float computeSupplyCost() {
152 CampaignFleetAPI fleet = getFleet();
153 if (fleet == null) return 0f;
154
155 float crCostMult = getCRCostMult();
156
157 float cost = 0f;
158 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
159 cost += member.getDeploymentCostSupplies() * crCostMult;
160 }
161 return cost;
162 }
163
164
165 public void addInitialDescription(TooltipMakerAPI tooltip, boolean expanded) {
166
167 }
168
169 public boolean addNotUsableReasonBeforeFuelCost(TooltipMakerAPI tooltip, boolean expanded) {
170 return false;
171 }
172 public void addNotUsableReasonAfterFuelCost(TooltipMakerAPI tooltip, boolean expanded) {
173
174 }
175
176 @Override
177 public void createTooltip(TooltipMakerAPI tooltip, boolean expanded) {
178 CampaignFleetAPI fleet = getFleet();
179 if (fleet == null) return;
180
181 Color gray = Misc.getGrayColor();
182 Color highlight = Misc.getHighlightColor();
183 Color fuel = Global.getSettings().getColor("progressBarFuelColor");
184 Color bad = Misc.getNegativeHighlightColor();
185
186 LabelAPI title = tooltip.addTitle(spec.getName());
187
188 addInitialDescription(tooltip, expanded);
189
190 float pad = 10f;
191
192 float fuelCost = computeFuelCost();
193 float supplyCost = computeSupplyCost();
194
195 String preventsRecovery = "";
197 preventsRecovery = " Prevents combat readiness recovery while active.";
198 }
199
200 if (supplyCost > 0 && fuelCost > 0) {
201 tooltip.addPara("Consumes %s fuel and reduces the combat readiness" +
202 " of all ships, costing up to %s supplies to recover." + preventsRecovery, pad,
203 highlight,
204 Misc.getRoundedValueMaxOneAfterDecimal(fuelCost),
205 Misc.getRoundedValueMaxOneAfterDecimal(supplyCost));
206 } else if (supplyCost > 0) {
207 tooltip.addPara("Reduces the combat readiness" +
208 " of all ships, costing up to %s supplies to recover." + preventsRecovery, pad,
209 highlight,
210 Misc.getRoundedValueMaxOneAfterDecimal(supplyCost));
211 } else if (fuelCost > 0) {
212 tooltip.addPara("Consumes %s fuel." + preventsRecovery, pad,
213 highlight,
214 Misc.getRoundedValueMaxOneAfterDecimal(fuelCost));
215 }
216
217 boolean addedReason = addNotUsableReasonBeforeFuelCost(tooltip, expanded);
218 if (!addedReason && fuelCost > 0 && fuelCost > fleet.getCargo().getFuel()) {
219 tooltip.addPara("Not enough fuel.", bad, pad);
220 } else {
221 addNotUsableReasonAfterFuelCost(tooltip, expanded);
222 }
223
224 List<FleetMemberAPI> nonReady = getNonReadyShips();
225 if (!nonReady.isEmpty()) {
226 tooltip.addPara("Some ships don't have enough combat readiness " +
227 "and may suffer damage if the ability is activated:", pad,
228 Misc.getNegativeHighlightColor(), "may suffer damage");
229 int j = 0;
230 int max = 4;
231 float initPad = 5f;
232 for (FleetMemberAPI member : nonReady) {
233 if (j >= max) {
234 if (nonReady.size() > max + 1) {
235 tooltip.addPara(BaseIntelPlugin.INDENT + "... and several other ships", initPad);
236 break;
237 }
238 }
239 String str = "";
240 if (!member.isFighterWing()) {
241 str += member.getShipName() + ", ";
242 str += member.getHullSpec().getHullNameWithDashClass();
243 } else {
244 str += member.getVariant().getFullDesignationWithHullName();
245 }
246
247 tooltip.addPara(BaseIntelPlugin.INDENT + str, initPad);
248 initPad = 0f;
249 j++;
250 }
251 }
252
253 addIncompatibleToTooltip(tooltip, expanded);
254 }
255
256 public boolean hasTooltip() {
257 return true;
258 }
259
260
261 @Override
262 public void fleetLeftBattle(BattleAPI battle, boolean engagedInHostilities) {
263 if (engagedInHostilities) {
264 deactivate();
265 }
266 }
267
268 @Override
269 public void fleetOpenedMarket(MarketAPI market) {
270 deactivate();
271 }
272
273 protected boolean showAlarm() {
274 return !getNonReadyShips().isEmpty() && !isOnCooldown() && !isActiveOrInProgress() && isUsable();
275 }
276
277 @Override
278 public boolean isOnCooldown() {
279 return super.getCooldownFraction() < 1f;
280 }
281
282 @Override
283 public boolean isUsable() {
284 return super.isUsable() &&
285 getFleet() != null &&
286 (getFleet().isAIMode() || computeFuelCost() <= getFleet().getCargo().getFuel());
287 }
288 @Override
289 public float getCooldownFraction() {
290 if (showAlarm()) {
291 return 0f;
292 }
293 return super.getCooldownFraction();
294 }
295
296 @Override
297 public Color getCooldownColor() {
298 if (showAlarm()) {
299 Color color = Misc.getNegativeHighlightColor();
300 return Misc.scaleAlpha(color, Global.getSector().getCampaignUI().getSharedFader().getBrightness() * 0.5f);
301 }
302 return super.getCooldownColor();
303 }
304
305 @Override
307 if (showAlarm()) {
308 return true;
309 }
310 return false;
311 }
312
313 @Override
314 protected void activateImpl() {
315
316 }
317}
318
319
320
321
322
static SettingsAPI getSettings()
Definition Global.java:51
static SectorAPI getSector()
Definition Global.java:59
void addIncompatibleToTooltip(TooltipMakerAPI tooltip, boolean expanded)
boolean addNotUsableReasonBeforeFuelCost(TooltipMakerAPI tooltip, boolean expanded)
void addNotUsableReasonAfterFuelCost(TooltipMakerAPI tooltip, boolean expanded)
void fleetLeftBattle(BattleAPI battle, boolean engagedInHostilities)