Starsector API
Loading...
Searching...
No Matches
CargoPodsResponse.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign;
2
3import java.util.List;
4
5import org.lwjgl.util.vector.Vector2f;
6
7import com.fs.starfarer.api.EveryFrameScript;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.Script;
10import com.fs.starfarer.api.campaign.CampaignFleetAPI;
11import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
12import com.fs.starfarer.api.campaign.FleetAssignment;
13import com.fs.starfarer.api.campaign.SectorEntityToken;
14import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
15import com.fs.starfarer.api.campaign.ai.FleetAssignmentDataAPI;
16import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
17import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
18import com.fs.starfarer.api.impl.campaign.ids.Tags;
19import com.fs.starfarer.api.util.IntervalUtil;
20import com.fs.starfarer.api.util.Misc;
21
22public class CargoPodsResponse implements EveryFrameScript {
23
24 public static String PODS_BUSY_REASON = "pods";
25
26
27 protected IntervalUtil tracker = new IntervalUtil(0.05f, 0.15f);
28 protected float elapsed;
29 protected CustomCampaignEntityAPI pods;
30
31 public CargoPodsResponse(CustomCampaignEntityAPI pods) {
32 this.pods = pods;
33 }
34
35 public void advance(float amount) {
36 float days = Global.getSector().getClock().convertToDays(amount);
37 tracker.advance(days);
38
39 elapsed += days;
40
41
42 if (tracker.intervalElapsed()) {
44 }
45 }
46
47 public boolean isDone() {
48 return elapsed >= 3f || !pods.isAlive() || pods.hasTag(Tags.NON_CLICKABLE);
49 }
50
51 public boolean runWhilePaused() {
52 return false;
53 }
54
55
56 public void checkResponse() {
57 List<CampaignFleetAPI> fleets = pods.getContainingLocation().getFleets();
58
59 CampaignFleetAPI closest = null;
60 float minDist = Float.MAX_VALUE;
61
62 for (CampaignFleetAPI fleet : fleets) {
63 if (!couldInvestigatePods(fleet)) continue;
64
65 float dist = Misc.getDistance(pods, fleet);
66 if (dist < minDist) {
67 minDist = dist;
68 closest = fleet;
69 }
70 }
71
72 if (closest != null && minDist < 500f) {
73 respond(closest);
74 elapsed = 10f; // make it "done"
75 }
76 }
77
78 protected float getBaseDur(CampaignFleetAPI fleet) {
79 float dur = pods.getCargo().getFuel() + pods.getCargo().getSpaceUsed() + pods.getCargo().getTotalPersonnel();
80 dur = dur / fleet.getCargo().getMaxCapacity();
81
82 return dur;
83 }
84
85
86 protected void respond(final CampaignFleetAPI fleet) {
87 unrespond(fleet);
88
89 //float dur = (1.5f + (float) Math.random());
90 float dur = getBaseDur(fleet);
91 dur *= 5f;
92 if (dur > 1f) dur = 1f;
93
94 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(),
95 MemFlags.FLEET_BUSY, PODS_BUSY_REASON, true, dur);
96
97 Vector2f loc = Misc.getUnitVectorAtDegreeAngle(
98 Misc.getAngleInDegrees(pods.getLocation(), fleet.getLocation()));
99 loc.scale(fleet.getRadius() + pods.getRadius());
100 Vector2f.add(loc, pods.getLocation(), loc);
101 final SectorEntityToken holdLoc = pods.getContainingLocation().createToken(loc);
102
103 fleet.addAssignmentAtStart(FleetAssignment.HOLD, holdLoc, dur, "investigating " + pods.getName().toLowerCase(),
104 new Script() {
105 public void run() {
106 Misc.fadeAndExpire(pods);
107 fleet.getCargo().addAll(pods.getCargo());
108 pods.getCargo().clear();
109 }
110 });
111 FleetAssignmentDataAPI curr = fleet.getCurrentAssignment();
112 if (curr != null) {
114 }
115 fleet.addScript(new EveryFrameScript() {
116 private boolean done = false;
117 public boolean runWhilePaused() {
118 return false;
119 }
120 public boolean isDone() {
121 return done || !Misc.isBusy(fleet) || pods.hasTag(Tags.NON_CLICKABLE) || !pods.isAlive();
122 }
123 public void advance(float amount) {
124 Vector2f loc = Misc.getUnitVectorAtDegreeAngle(
125 Misc.getAngleInDegrees(pods.getLocation(), fleet.getLocation()));
126 loc.scale(fleet.getRadius() + pods.getRadius());
127 Vector2f.add(loc, pods.getLocation(), loc);
128 holdLoc.setLocation(loc.x, loc.y);
129
130 if (!pods.isAlive()) {
131 if (Misc.isBusy(fleet)) {
132 unrespond(fleet);
133 }
134 done = true;
135 }
136 }
137 });
138 }
139
140 protected void unrespond(CampaignFleetAPI fleet) {
141 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(),
142 MemFlags.FLEET_BUSY, PODS_BUSY_REASON, false, 0f);
143 for (FleetAssignmentDataAPI curr : fleet.getAI().getAssignmentsCopy()) {
144 if (MilitaryResponseScript.RESPONSE_ASSIGNMENT.equals(curr.getCustom())) {
145 fleet.getAI().removeAssignment(curr);
146 }
147 }
148 }
149
150 protected boolean couldInvestigatePods(CampaignFleetAPI fleet) {
151 //if (fleet.getFaction() != params.faction) return false;
152 if (fleet.getAI() == null) return false;
153 if (fleet.isPlayerFleet()) return false;
154
155 if (!fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_PIRATE)) return false;
156
157 if (fleet.getBattle() != null) return false;
158 if (fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.FLEET_BUSY)) return false;
159
160 if (fleet.getAI() instanceof ModularFleetAIAPI) {
161 ModularFleetAIAPI ai = (ModularFleetAIAPI) fleet.getAI();
162 if (ai.getAssignmentModule().areAssignmentsFrozen()) return false;
163 if (ai.isFleeing() || ai.isMaintainingContact()) return false;
164 if (ai.isCurrentAssignment(FleetAssignment.INTERCEPT)) return false;
165 }
166
167
168 VisibilityLevel level = pods.getVisibilityLevelTo(fleet);
169 if (level == VisibilityLevel.NONE) return false;
170
171 if (fleet.getCurrentAssignment() != null &&
172 fleet.getCurrentAssignment().getAssignment() == FleetAssignment.GO_TO_LOCATION_AND_DESPAWN) {
173 return false;
174 }
175
176 float dur = getBaseDur(fleet);
177 if (dur < 0.05f) return false;
178
179 //MemoryAPI memory = fleet.getMemoryWithoutUpdate();
180// boolean patrol = memory.getBoolean(MemFlags.MEMORY_KEY_PATROL_FLEET);
181// boolean noMilitary = memory.getBoolean(MemFlags.FLEET_NO_MILITARY_RESPONSE);
182// if (!patrol || noMilitary) return false;
183
184 return true;
185 }
186
187
188
189
190}
static SectorAPI getSector()
Definition Global.java:59