Starsector API
Loading...
Searching...
No Matches
MissionFleetInterceptPlayerIfNearby.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.missions.hub;
2
3import java.util.HashSet;
4import java.util.List;
5import java.util.Set;
6
7import com.fs.starfarer.api.EveryFrameScript;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.CampaignFleetAPI;
10import com.fs.starfarer.api.campaign.FleetAssignment;
11import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
12import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.EncounterOption;
13import com.fs.starfarer.api.campaign.ai.FleetAssignmentDataAPI;
14import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
15import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
16import com.fs.starfarer.api.util.IntervalUtil;
17import com.fs.starfarer.api.util.Misc;
18
20
21 protected CampaignFleetAPI fleet;
23 protected Set<Object> stages = new HashSet<Object>();
24 protected boolean done = false;
25 protected float delay;
26 protected float delayRemaining;
27 protected float maxRange;
28 protected boolean repeatable;
29 protected boolean mustBeStrongEnoughToFight;
30
31 protected IntervalUtil interval = new IntervalUtil(0.05f, 0.1f);
32
34 boolean mustBeStrongEnoughToFight, float maxRange, boolean repeatable, float repeatDelay, List<Object> stages) {
35 this.delay = repeatDelay;
36 this.mission = mission;
37 this.fleet = fleet;
38 this.mustBeStrongEnoughToFight = mustBeStrongEnoughToFight;
39 this.maxRange = maxRange;
40 this.repeatable = repeatable;
41 this.stages.addAll(stages);
42 }
43
44 public void advance(float amount) {
45 if (done) return;
46
47 float days = Global.getSector().getClock().convertToDays(amount);
48 delayRemaining -= days;
49 if (delayRemaining < 0) delayRemaining = 0;
50 if (delayRemaining > 0) return;
51
52 interval.advance(days);
53 if (!interval.intervalElapsed()) return;
54
55 if (fleet.getMemoryWithoutUpdate().getBoolean("$turnOffAutoInterceptScript")) {
56 done = true;
57 return;
58 }
59
60 Object stage = mission.getCurrentStage();
61 if (!stages.contains(stage)) {
62 done = true;
63 return;
64 }
65
66 if (fleet.getAI() instanceof ModularFleetAIAPI) {
67 ModularFleetAIAPI ai = (ModularFleetAIAPI) fleet.getAI();
68 CampaignFleetAPI player = Global.getSector().getPlayerFleet();
69
70 if (mustBeStrongEnoughToFight && ai.getTacticalModule() != null) {
71 EncounterOption option = ai.getTacticalModule().pickEncounterOption(null, player);
72 boolean recentlyBeaten = fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_RECENTLY_DEFEATED_BY_PLAYER);
73 if (recentlyBeaten) option = EncounterOption.DISENGAGE;
74 if (option == EncounterOption.DISENGAGE || option == EncounterOption.HOLD_VS_STRONGER) {
75 return;
76 }
77 }
78
79 if (ai.getAssignmentModule() != null) {
80 FleetAssignmentDataAPI curr = ai.getAssignmentModule().getCurrentAssignment();
81 if (curr != null && curr.getTarget() == player &&
82 (curr.getAssignment() == FleetAssignment.INTERCEPT ||
83 curr.getAssignment() == FleetAssignment.FOLLOW)) {
84 return;
85 } else {
86
87 if (player.getContainingLocation() == fleet.getContainingLocation() &&
88 Misc.getDistance(player, fleet) <= maxRange + player.getRadius() + fleet.getRadius() &&
89 fleet.getVisibilityLevelOfPlayerFleet() != VisibilityLevel.NONE) {
90 ai.getAssignmentModule().addAssignmentAtStart(FleetAssignment.INTERCEPT, player, 3f, null);
92 if (!repeatable) {
93 done = true;
94 }
95 }
96 }
97 }
98 }
99 }
100
101 public boolean isDone() {
102 return done;
103 }
104
105 public boolean runWhilePaused() {
106 return false;
107 }
108
109
110}
111
112
113
114
115
116
117
118
119
120
static SectorAPI getSector()
Definition Global.java:59
MissionFleetInterceptPlayerIfNearby(CampaignFleetAPI fleet, BaseHubMission mission, boolean mustBeStrongEnoughToFight, float maxRange, boolean repeatable, float repeatDelay, List< Object > stages)