26 private PatrolFleetData data;
33 giveInitialAssignment();
36 private void giveInitialAssignment() {
38 float daysToOrbit = getDaysToOrbit() * 0.25f;
39 if (daysToOrbit < 0.2f) {
44 "preparing for patrol duty");
47 private boolean orderedReturn =
false;
66 if (fp < data.startingFleetPoints && !orderedReturn) {
71 "returning to " + data.sourceMarket.getName());
73 "standing down from patrol duty");
80 float daysToOrbit = getDaysToOrbit();
84 "patrolling around " + data.sourceMarket.getName());
86 "returning to " + data.sourceMarket.getName());
88 "standing down from patrol duty");
90 if ((
float) Math.random() > 0.95f) {
92 "patrolling around the " + system.
getBaseName() +
" star system");
94 "returning to " + data.sourceMarket.getName());
96 "standing down from patrol duty");
99 SectorEntityToken generalPatrol = data.sourceMarket.getPrimaryEntity().getContainingLocation().createToken(0, 0);
107 defenseTargets.
add(generalPatrol, 30);
111 if (pick == generalPatrol) {
113 "patrolling the " + system.
getBaseName() +
" star system");
115 "returning to " + data.sourceMarket.getName());
117 "standing down from patrol duty");
120 "patrolling around " + pick.
getName());
122 "returning to " + data.sourceMarket.getName());
124 "standing down from patrol duty");
132 private void performInspectionIfNeeded() {
133 if (inspectionTarget !=
null) {
143 if (inspectionTarget !=
null) {
152 inspectionTarget =
null;
163 Misc.normalise(offset);
164 offset.scale(radSum);
165 Vector2f.add(inspectionTarget.
getLocation(), offset, offset);
168 boolean forceReapproach =
false;
169 if (curr !=
null && curr.getTarget() !=
null) {
170 float locDist = Misc.getDistance(inspectionTarget.
getLocation(), curr.getTarget().getLocation());
171 forceReapproach = locDist > radSum + 5f;
176 if ((dist - radSum > 5 || dist - radSum < -5) && (curr ==
null || curr.getAssignment() != FleetAssignment.FOLLOW || forceReapproach)) {
180 if (dist - radSum <= 50) {
185 }
else if ((dist - radSum <= 5 && dist - radSum >= -5) && (curr ==
null || curr.getAssignment() != FleetAssignment.HOLD)) {
200 inspectionTarget =
null;
206 private CampaignFleetAPI inspectionTarget =
null;
207 private void checkNPCCustomsInspection() {
212 if (inspectionTarget !=
null)
return;
216 if (fleet.
getAI() !=
null &&
220 MarketAPI closest = Misc.findNearestLocalMarketWithSameFaction(fleet, 1500);
221 if (closest ==
null || !closest.getFactionId().equals(fleet.
getFaction().
getId()))
return;
223 List<CampaignFleetAPI> hostiles = Misc.findNearbyFleets(fleet, 600,
new FleetFilter() {
224 public boolean accept(CampaignFleetAPI curr) {
226 return curr.isHostileTo(fleet);
229 if (!hostiles.isEmpty())
return;
234 WeightedRandomPicker<CampaignFleetAPI> picker =
new WeightedRandomPicker<CampaignFleetAPI>();
235 for (
final CampaignFleetAPI curr : allFleets) {
236 if (curr == fleet)
continue;
238 if (curr.isHostileTo(fleet))
continue;
240 if (curr.isInHyperspaceTransition())
continue;
242 if (!curr.getMemoryWithoutUpdate().contains(MemFlags.MEMORY_KEY_SMUGGLER) &&
243 !curr.getMemoryWithoutUpdate().contains(MemFlags.MEMORY_KEY_TRADE_FLEET))
continue;
245 if (curr.getMemoryWithoutUpdate().contains(
"$recentlyInspected"))
return;
246 if (curr.getMemoryWithoutUpdate().contains(MemFlags.FLEET_BUSY))
return;
248 float dist = Misc.getDistance(curr.getLocation(), fleet.
getLocation());
249 if (dist > 1000)
continue;
250 if (dist < 100) dist = 100f;
252 hostiles = Misc.findNearbyFleets(curr, 600,
new FleetFilter() {
253 public boolean accept(CampaignFleetAPI curr) {
255 return curr.isHostileTo(fleet);
258 if (!hostiles.isEmpty())
continue;
260 picker.add(curr, 1000f / dist);
263 if (picker.isEmpty())
return;
265 CampaignFleetAPI target = picker.pick();
267 target.getMemoryWithoutUpdate().set(
"$recentlyInspected",
true, 15f);
268 target.getMemoryWithoutUpdate().set(MemFlags.FLEET_BUSY,
true, 3f);
273 target.getAI().addAssignmentAtStart(FleetAssignment.HOLD,
null, 2f,
"standing by for inspection",
null);
276 inspectionTarget = target;
283 private float getDaysToOrbit() {
284 float daysToOrbit = 0f;
297 daysToOrbit = daysToOrbit * (0.5f + (float) Math.random() * 0.5f);