Starsector API
Loading...
Searching...
No Matches
TriggerFleetAssignmentAI.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.missions.hub;
2
3import java.util.ArrayList;
4import java.util.List;
5import java.util.Random;
6
7import org.lwjgl.util.vector.Vector2f;
8
9import com.fs.starfarer.api.EveryFrameScript;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.CampaignFleetAPI;
12import com.fs.starfarer.api.campaign.FleetAssignment;
13import com.fs.starfarer.api.campaign.LocationAPI;
14import com.fs.starfarer.api.campaign.SectorEntityToken;
15import com.fs.starfarer.api.campaign.StarSystemAPI;
16import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
17import com.fs.starfarer.api.campaign.comm.IntelInfoPlugin;
18import com.fs.starfarer.api.util.Misc;
19import com.fs.starfarer.api.util.WeightedRandomPicker;
20
22
23 protected CampaignFleetAPI fleet;
24 protected LocationAPI system;
25
26 protected List<SectorEntityToken> patrolPoints = new ArrayList<SectorEntityToken>();
27 protected float elapsedWaitingForDespawn = 0f;
29 protected String patrolText;
30 protected String travelText;
31
32 public TriggerFleetAssignmentAI(String travelText, String patrolText, HubMission mission, LocationAPI system, boolean randomLocation, CampaignFleetAPI fleet, SectorEntityToken ... patrolPoints) {
33 this.travelText = travelText;
34 this.patrolText = patrolText;
35 this.mission = mission;
36 this.fleet = fleet;
37 this.system = system;
38
39 if (patrolPoints != null) {
40 for (SectorEntityToken curr : patrolPoints) {
41 if (curr == null) continue;
42 if (curr == fleet) continue;
43 this.patrolPoints.add(curr);
44 }
45 }
46
47 if (!fleet.hasScriptOfClass(MissionFleetAutoDespawn.class)) {
49 }
50
51 // moving this to CreateFleetAction, since most mission fleets are likely to want to ignore WarSimScript
52 //fleet.getMemoryWithoutUpdate().set(MemFlags.FLEET_BUSY, true);
53
54 giveInitialAssignments(randomLocation);
55 }
56
57 protected void giveInitialAssignments(boolean randomLocation) {
58 if (randomLocation) {
59 // start at random location
60 SectorEntityToken target = pickPatrolPoint();
61 if (target != null) {
62 Vector2f loc = Misc.getPointAtRadius(target.getLocation(), target.getRadius() + 100f);
63 fleet.setLocation(loc.x, loc.y);
64 } else {
65 Vector2f loc = Misc.getPointAtRadius(new Vector2f(), 5000f);
66 fleet.setLocation(loc.x, loc.y);
67 }
68 }
69 pickNext();
70 }
71
72 protected SectorEntityToken pickPatrolPoint() {
73 if (patrolPoints != null) {
74 Random random = null;
75 if (mission instanceof BaseHubMission) random = ((BaseHubMission)mission).getGenRandom();
76 WeightedRandomPicker<SectorEntityToken> picker = new WeightedRandomPicker<SectorEntityToken>(random);
77 for (SectorEntityToken curr : patrolPoints) {
78 if (!curr.isAlive()) continue;
79 picker.addAll(patrolPoints);
80 }
81 return picker.pick();
82 }
83 return null;
84 }
85
86 protected SectorEntityToken currTarget;
87 protected void pickNext() {
89 if (currTarget != null) {
90 float speed = Misc.getSpeedForBurnLevel(8);
91 float dist = Misc.getDistance(fleet.getLocation(), currTarget.getLocation());
92 float seconds = dist / speed;
93 float days = seconds / Global.getSector().getClock().getSecondsPerDay();
94 days += 5f + 5f * (float) Math.random();
95 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, currTarget, days, patrolText == null ? "patrolling" : patrolText);
96 return;
97 } else if (system instanceof StarSystemAPI) {
98 float days = 5f + 5f * (float) Math.random();
99 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, ((StarSystemAPI)system).getCenter(), days, patrolText == null ? "patrolling" : patrolText);
100 }
101 }
102
103 public void advance(float amount) {
104 if (fleet.getCurrentAssignment() == null) {
105 pickNext();
106 } else {
107 String travel = travelText;
108 if (travel == null) {
109 if (Misc.isPatrol(fleet)) {
110 travel = "patrolling";
111 } else {
112 travel = "traveling";
113 }
114 }
115 if (fleet.getAI() != null &&
116 travel != null && currTarget != null && fleet.getCurrentAssignment().getTarget() == currTarget &&
117 fleet.getCurrentAssignment().getAssignment() == FleetAssignment.PATROL_SYSTEM) {
118 float dist = Misc.getDistance(fleet, currTarget);
119 if (dist > 1500 || fleet.getContainingLocation() != currTarget.getContainingLocation()) {
120 boolean standingDown = fleet.getAI() instanceof ModularFleetAIAPI &&
121 ((ModularFleetAIAPI) fleet.getAI()).getTacticalModule() != null &&
122 ((ModularFleetAIAPI) fleet.getAI()).getTacticalModule().isStandingDown();
123 if (standingDown) {
124 fleet.getAI().setActionTextOverride(null);
125 } else {
126 fleet.getAI().setActionTextOverride(travel);
127 }
128 } else {
129 fleet.getAI().setActionTextOverride(null);
130 }
131 } else if (fleet.getAI() != null) {
132 fleet.getAI().setActionTextOverride(null);
133 }
134 }
135
136 // replaced with separate MissionFleetAutoDespawn script
137 //despawnIfNeeded(amount);
138 }
139
140// protected void despawnIfNeeded(float amount) {
141// if (isMissionEnded()) {
142// if (!fleet.isInCurrentLocation()) {
143// elapsedWaitingForDespawn += Global.getSector().getClock().convertToDays(amount);
144// if (elapsedWaitingForDespawn > 30f && fleet.getBattle() == null) {
145// fleet.despawn(FleetDespawnReason.PLAYER_FAR_AWAY, null);
146// elapsedWaitingForDespawn = 0f;
147// }
148// } else {
149// elapsedWaitingForDespawn = 0f;
150// }
151// }
152// }
153
154 public boolean isMissionEnded() {
155 return mission instanceof IntelInfoPlugin && ((IntelInfoPlugin)mission).isEnded();
156 }
157
158 public boolean isDone() {
159 return false;
160 }
161
162 public boolean runWhilePaused() {
163 return false;
164 }
165
166
167
168}
169
170
171
172
173
174
175
176
177
178
static SectorAPI getSector()
Definition Global.java:59
TriggerFleetAssignmentAI(String travelText, String patrolText, HubMission mission, LocationAPI system, boolean randomLocation, CampaignFleetAPI fleet, SectorEntityToken ... patrolPoints)