25 private CampaignFleetAPI fleet;
26 private PatrolFleetData data;
28 private IntervalUtil tracker =
new IntervalUtil(0.5f, 1.5f);
33 giveInitialAssignment();
36 private void giveInitialAssignment() {
38 float daysToOrbit = getDaysToOrbit() * 0.25f;
39 if (daysToOrbit < 0.2f) {
43 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
44 "preparing for patrol duty");
47 private boolean orderedReturn =
false;
64 if (fleet.getAI().getCurrentAssignment() !=
null) {
65 float fp = fleet.getFleetPoints();
66 if (fp < data.startingFleetPoints && !orderedReturn) {
68 fleet.clearAssignments();
70 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
71 "returning to " + data.sourceMarket.getName());
72 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), 1f,
73 "standing down from patrol duty");
74 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, data.sourceMarket.getPrimaryEntity(), 1000);
80 float daysToOrbit = getDaysToOrbit();
81 StarSystemAPI system = data.sourceMarket.getStarSystem();
83 fleet.addAssignment(FleetAssignment.DEFEND_LOCATION, data.sourceMarket.getPrimaryEntity(), 20,
84 "patrolling around " + data.sourceMarket.getName());
85 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
86 "returning to " + data.sourceMarket.getName());
87 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
88 "standing down from patrol duty");
90 if ((
float) Math.random() > 0.95f) {
91 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, system.getHyperspaceAnchor(), 20,
92 "patrolling around the " + system.getBaseName() +
" star system");
93 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
94 "returning to " + data.sourceMarket.getName());
95 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
96 "standing down from patrol duty");
98 WeightedRandomPicker<SectorEntityToken> defenseTargets =
new WeightedRandomPicker<SectorEntityToken>();
99 SectorEntityToken generalPatrol = data.sourceMarket.getPrimaryEntity().getContainingLocation().createToken(0, 0);
107 defenseTargets.add(generalPatrol, 30);
109 SectorEntityToken pick = defenseTargets.pick();
111 if (pick == generalPatrol) {
112 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, system.getStar(), 30,
113 "patrolling the " + system.getBaseName() +
" star system");
114 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
115 "returning to " + data.sourceMarket.getName());
116 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
117 "standing down from patrol duty");
119 fleet.addAssignment(FleetAssignment.DEFEND_LOCATION, pick, 30,
120 "patrolling around " + pick.getName());
121 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
122 "returning to " + data.sourceMarket.getName());
123 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
124 "standing down from patrol duty");
132 private void performInspectionIfNeeded() {
133 if (inspectionTarget !=
null) {
137 List<CampaignFleetAPI> hostiles = Misc.findNearbyFleets(fleet, 200,
new FleetFilter() {
138 public boolean accept(CampaignFleetAPI curr) {
140 return curr.isHostileTo(fleet);
143 if (inspectionTarget !=
null) {
144 float dist = Misc.getDistance(inspectionTarget.getLocation(), fleet.getLocation());
145 if (dist > 2000 || inspectionTarget.getContainingLocation() != fleet.getContainingLocation()) {
146 inspectionTarget.getAI().removeFirstAssignmentIfItIs(FleetAssignment.HOLD);
147 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.HOLD);
148 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.FOLLOW);
149 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.HOLD);
150 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.FOLLOW);
152 inspectionTarget =
null;
153 fleet.getMemoryWithoutUpdate().unset(
"$performingNPCInspection");
158 if (fleet.getMemoryWithoutUpdate().contains(
"$performingNPCInspection") && hostiles.isEmpty()) {
159 float dist = Misc.getDistance(inspectionTarget.getLocation(), fleet.getLocation());
160 float radSum = inspectionTarget.getRadius() + fleet.getRadius();
161 FleetAssignmentDataAPI curr = fleet.getAI().getCurrentAssignment();
162 Vector2f offset = Vector2f.sub(fleet.getLocation(), inspectionTarget.getLocation(),
new Vector2f());
163 Misc.normalise(offset);
164 offset.scale(radSum);
165 Vector2f.add(inspectionTarget.getLocation(), offset, offset);
166 SectorEntityToken loc = fleet.getContainingLocation().createToken(offset.x, offset.y);
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)) {
177 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.HOLD);
178 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.FOLLOW);
180 if (dist - radSum <= 50) {
181 fleet.getAI().addAssignmentAtStart(FleetAssignment.FOLLOW, loc, 0.1f,
"performing customs inspection",
null);
183 fleet.getAI().addAssignmentAtStart(FleetAssignment.FOLLOW, loc, 0.1f,
"approaching " + inspectionTarget.getName(),
null);
185 }
else if ((dist - radSum <= 5 && dist - radSum >= -5) && (curr ==
null || curr.getAssignment() != FleetAssignment.HOLD)) {
186 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.FOLLOW);
187 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.HOLD);
191 fleet.getAI().addAssignmentAtStart(FleetAssignment.HOLD,
null, 0.1f,
"performing customs inspection",
null);
194 inspectionTarget.getAI().removeFirstAssignmentIfItIs(FleetAssignment.HOLD);
195 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.HOLD);
196 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.FOLLOW);
197 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.HOLD);
198 fleet.getAI().removeFirstAssignmentIfItIs(FleetAssignment.FOLLOW);
200 inspectionTarget =
null;
201 fleet.getMemoryWithoutUpdate().unset(
"$performingNPCInspection");
206 private CampaignFleetAPI inspectionTarget =
null;
207 private void checkNPCCustomsInspection() {
212 if (inspectionTarget !=
null)
return;
213 if (fleet.getMemoryWithoutUpdate().contains(MemFlags.FLEET_BUSY))
return;
214 if (!fleet.getMemoryWithoutUpdate().contains(MemFlags.MEMORY_KEY_CUSTOMS_INSPECTOR))
return;
216 if (fleet.getAI() !=
null &&
217 !fleet.getAI().isCurrentAssignment(FleetAssignment.PATROL_SYSTEM) &&
218 !fleet.getAI().isCurrentAssignment(FleetAssignment.DEFEND_LOCATION))
return;
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;
232 List<CampaignFleetAPI> allFleets =
new ArrayList<CampaignFleetAPI>(fleet.getContainingLocation().getFleets());
233 allFleets.addAll(fleet.getContainingLocation().getFleets());
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);
269 fleet.getMemoryWithoutUpdate().set(MemFlags.FLEET_BUSY,
true, 3f);
270 fleet.getMemoryWithoutUpdate().set(
"$performingNPCInspection",
true, 2f);
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);