Starsector API
Loading...
Searching...
No Matches
BaseRaidStage.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.intel.raid;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.CampaignFleetAPI;
8import com.fs.starfarer.api.campaign.SectorEntityToken;
9import com.fs.starfarer.api.impl.campaign.DebugFlags;
10import com.fs.starfarer.api.impl.campaign.fleets.RouteLocationCalculator;
11import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
12import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
13import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
14import com.fs.starfarer.api.impl.campaign.intel.raid.RaidIntel.RaidStage;
15import com.fs.starfarer.api.impl.campaign.intel.raid.RaidIntel.RaidStageStatus;
16import com.fs.starfarer.api.ui.TooltipMakerAPI;
17import com.fs.starfarer.api.util.IntervalUtil;
18import com.fs.starfarer.api.util.Misc;
19
20public class BaseRaidStage implements RaidStage {
21
22 public static final String STRAGGLER = "raid_straggler";
23
24 protected RaidIntel intel;
25
26 protected IntervalUtil statusInterval = new IntervalUtil(0.1f, 0.2f);
27 protected RaidStageStatus status = RaidStageStatus.ONGOING;
28 protected float elapsed = 0f;
29 protected float maxDays = 1f;
30
31 protected float abortFP = 0;
32
33 public BaseRaidStage(RaidIntel raid) {
34 this.intel = raid;
35 }
36
37 public float getAbortFP() {
38 return abortFP;
39 }
40
41 public void setAbortFP(float abortFP) {
42 this.abortFP = abortFP;
43 }
44
45// protected float getTotalRouteFP() {
46// float total = 0f;
47// for (RouteData route : getRoutes()) {
48// total += route.
49// }
50// }
51
52 public void resetRoutes() {
53 List<RouteData> routes = RouteManager.getInstance().getRoutesForSource(intel.getRouteSourceId());
54 for (RouteData route : routes) {
55 resetRoute(route);
56 }
57 }
58
59 public void resetRoute(RouteData route) {
60 CampaignFleetAPI fleet = route.getActiveFleet();
61 if (fleet != null) {
62 fleet.clearAssignments();
63 }
64 route.getSegments().clear();
65 route.setCurrent(null);
66 }
67
68 public List<RouteData> getRoutes() {
69 List<RouteData> routes = RouteManager.getInstance().getRoutesForSource(intel.getRouteSourceId());
70 List<RouteData> result = new ArrayList<RouteData>();
71 for (RouteData route : routes) {
72 if (!STRAGGLER.equals(route.getCustom())) {
73 result.add(route);
74 }
75 }
76 return result;
77 }
78
79 public void giveReturnOrdersToStragglers(List<RouteData> stragglers) {
80 for (RouteData route : stragglers) {
81 SectorEntityToken from = Global.getSector().getHyperspace().createToken(route.getInterpolatedHyperLocation());
82
83 route.setCustom(STRAGGLER);
84 resetRoute(route);
85
86 float travelDays = RouteLocationCalculator.getTravelDays(from, route.getMarket().getPrimaryEntity());
88 travelDays *= 0.1f;
89 }
90
91 float orbitDays = 1f + 1f * (float) Math.random();
92 route.addSegment(new RouteSegment(travelDays, from, route.getMarket().getPrimaryEntity()));
93 route.addSegment(new RouteSegment(orbitDays, route.getMarket().getPrimaryEntity()));
94
95 //route.addSegment(new RouteSegment(2f + (float) Math.random() * 1f, route.getMarket().getPrimaryEntity()));
96 }
97 }
98
99 public void advance(float amount) {
100 float days = Misc.getDays(amount);
101
102 elapsed += days;
103
104 statusInterval.advance(days);
105 if (statusInterval.intervalElapsed()) {
106 updateStatus();
107 }
108 }
109
110 public RaidStageStatus getStatus() {
111 return status;
112 }
113
114
115 public void notifyStarted() {
116
117 }
118
119
120 protected boolean enoughMadeIt(List<RouteData> routes, List<RouteData> stragglers) {
121 float madeItFP = 0;
122 for (RouteData route : routes) {
123 if (stragglers.contains(route)) continue;
124 CampaignFleetAPI fleet = route.getActiveFleet();
125 if (fleet != null) {
126// float mult = Misc.getAdjustedFP(1f, route.getMarket());
127// if (mult < 1) mult = 1f;
128 float mult = Misc.getSpawnFPMult(fleet);
129 madeItFP += fleet.getFleetPoints() / mult;
130 } else {
131 madeItFP += route.getExtra().fp;
132 }
133 }
134 return madeItFP >= abortFP;
135 }
136
137 protected void updateStatus() {
139 }
140
141 protected void abortIfNeededBasedOnFP(boolean giveReturnOrders) {
142 List<RouteData> routes = getRoutes();
143 List<RouteData> stragglers = new ArrayList<RouteData>();
144
145 boolean enoughMadeIt = enoughMadeIt(routes, stragglers);
146 //enoughMadeIt = false;
147 if (!enoughMadeIt) {
148 //enoughMadeIt = enoughMadeIt(routes, stragglers);
149 status = RaidStageStatus.FAILURE;
150 if (giveReturnOrders) {
152 }
153 return;
154 }
155 }
156
157 protected void updateStatusBasedOnReaching(SectorEntityToken dest, boolean giveReturnOrders) {
158 updateStatusBasedOnReaching(dest, giveReturnOrders, true);
159 }
160 protected void updateStatusBasedOnReaching(SectorEntityToken dest, boolean giveReturnOrders, boolean requireNearTarget) {
161 List<RouteData> routes = getRoutes();
162 float maxRange = 2000f;
163 if (!requireNearTarget) {
164 maxRange = 10000000f;
165 }
166 List<RouteData> stragglers = getStragglers(routes, dest, maxRange);
167
168 boolean enoughMadeIt = enoughMadeIt(routes, stragglers);
169
170 if (stragglers.isEmpty() && enoughMadeIt) {
171 status = RaidStageStatus.SUCCESS;
172 return;
173 }
174
175 if (elapsed > maxDays + intel.getExtraDays()) {
176 if (enoughMadeIt) {
177 status = RaidStageStatus.SUCCESS;
178 if (giveReturnOrders) {
180 }
181 } else {
182 status = RaidStageStatus.FAILURE;
183 if (giveReturnOrders) {
185 }
186 }
187 return;
188 }
189 }
190
191 public float getExtraDaysUsed() {
192 return Math.max(0, elapsed - maxDays);
193 }
194
195 public List<RouteData> getStragglers(List<RouteData> routes, SectorEntityToken dest, float maxRange) {
196 List<RouteData> stragglers = new ArrayList<RouteData>();
197
198 for (RouteData route : routes) {
199 CampaignFleetAPI fleet = route.getActiveFleet();
200 if (fleet != null) {
201 if (fleet.getContainingLocation() == dest.getContainingLocation()) {
202 float dist = Misc.getDistance(fleet, dest);
203 if (dist > maxRange) {
204 stragglers.add(route);
205 }
206 } else {
207 stragglers.add(route);
208 }
209 } else if (!route.isExpired()) {
210 boolean waiting = false;
211 if (route.getCurrent() != null && AssembleStage.WAIT_STAGE.equals(route.getCurrent().custom)) {
212 waiting = true;
213 }
214 if (!waiting) {
215 stragglers.add(route);
216 }
217 }
218 }
219
220 return stragglers;
221 }
222
223
224 public float getElapsed() {
225 return elapsed;
226 }
227
228 public float getMaxDays() {
229 return maxDays;
230 }
231
232 public void showStageInfo(TooltipMakerAPI info) {
233 }
234
235
236
237}
238
239
static SectorAPI getSector()
Definition Global.java:59
void giveReturnOrdersToStragglers(List< RouteData > stragglers)
void updateStatusBasedOnReaching(SectorEntityToken dest, boolean giveReturnOrders, boolean requireNearTarget)
boolean enoughMadeIt(List< RouteData > routes, List< RouteData > stragglers)
List< RouteData > getStragglers(List< RouteData > routes, SectorEntityToken dest, float maxRange)
void updateStatusBasedOnReaching(SectorEntityToken dest, boolean giveReturnOrders)