Starsector API
Loading...
Searching...
No Matches
ScavengerFleetAssignmentAI.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.procgen.themes;
2
3import java.util.List;
4import java.util.Random;
5
6import org.lwjgl.util.vector.Vector2f;
7
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;
12import com.fs.starfarer.api.campaign.StarSystemAPI;
13import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
14import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.EncounterOption;
15import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
16import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
17import com.fs.starfarer.api.impl.campaign.ids.Factions;
18import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
19import com.fs.starfarer.api.util.IntervalUtil;
20import com.fs.starfarer.api.util.Misc;
21
23
24 protected boolean pirate;
25 protected IntervalUtil piracyCheck = new IntervalUtil(0.2f, 0.4f);
27 super(fleet, route);
28 this.pirate = pirate;
29 }
30
31 @Override
32 protected String getTravelActionText(RouteSegment segment) {
33 //if (segment.systemTo == route.getMarket().getContainingLocation()) {
34 if (segment.to == route.getMarket().getPrimaryEntity()) {
35 return "returning to " + route.getMarket().getName();
36 }
37 return "on a salvage expedition";
38 }
39
40 @Override
41 protected String getInSystemActionText(RouteSegment segment) {
42 return "exploring";
43 }
44
45
46 @Override
47 protected void addLocalAssignment(RouteSegment segment, boolean justSpawned) {
48 //boolean pickSpecificEntity = (float) Math.random() > 0.2f && segment.systemFrom instanceof StarSystemAPI;
49 boolean pickSpecificEntity = (float) Math.random() > 0.2f && !segment.from.getContainingLocation().isHyperspace();
50 if (pickSpecificEntity) {
52 if (target != null) {
53 if (justSpawned) {
54 Vector2f loc = Misc.getPointAtRadius(new Vector2f(target.getLocation()), 500);
55 fleet.setLocation(loc.x, loc.y);
56 }
57
58 float speed = Misc.getSpeedForBurnLevel(8);
59 float dist = Misc.getDistance(fleet.getLocation(), target.getLocation());
60 float seconds = dist / speed;
61 float days = seconds / Global.getSector().getClock().getSecondsPerDay();
62 days += 5f + 5f * (float) Math.random();
63 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, target, days, "investigating");
64 return;
65 } else {
66 if (justSpawned) {
67 Vector2f loc = Misc.getPointAtRadius(new Vector2f(), 8000);
68 fleet.setLocation(loc.x, loc.y);
69 }
70
71 float days = 5f + 5f * (float) Math.random();
72 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, null, days, "exploring");
73 }
74 } else {
75 super.addLocalAssignment(segment, justSpawned);
76 }
77 }
78
79
80 @Override
81 public void advance(float amount) {
82 super.advance(amount);
83
84 if (pirate) {
85 float days = Global.getSector().getClock().convertToDays(amount);
86 piracyCheck.advance(days);
87 if (piracyCheck.intervalElapsed()) {
89 }
90 }
91 }
92
93 protected void doPiracyCheck() {
94 if (fleet.getBattle() != null) return;
95
96
97 boolean isCurrentlyPirate = fleet.getFaction().getId().equals(Factions.PIRATES);
98
99 if (fleet.isTransponderOn() && !isCurrentlyPirate) {
100 return;
101 }
102
103 if (isCurrentlyPirate) {
104 List<CampaignFleetAPI> visible = Misc.getVisibleFleets(fleet, false);
105 if (visible.isEmpty()) {
107 Misc.clearTarget(fleet, true);
108 }
109 return;
110 }
111
112 List<CampaignFleetAPI> visible = Misc.getVisibleFleets(fleet, false);
113 if (visible.size() == 1) {
114 int weakerCount = 0;
115 for (CampaignFleetAPI other : visible) {
116 if (fleet.getAI() != null &&
117 Global.getSector().getFaction(Factions.PIRATES).isHostileTo(other.getFaction())) {
118 EncounterOption option = fleet.getAI().pickEncounterOption(null, other, true);
119 if (option == EncounterOption.ENGAGE || option == EncounterOption.HOLD) {
120 float dist = Misc.getDistance(fleet.getLocation(), other.getLocation());
121 VisibilityLevel level = other.getVisibilityLevelTo(fleet);
122 boolean seesComp = level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS ||
123 level == VisibilityLevel.COMPOSITION_DETAILS;
124 if (dist < 800f && seesComp) {
125 weakerCount++;
126 }
127 }
128 }
129 }
130
131 if (weakerCount == 1) {
135 }
136 }
137
138 }
139
140
141
142
143
144}
145
146
147
148
149
150
151
152
153
154
static SectorAPI getSector()
Definition Global.java:65
static SectorEntityToken pickEntityToGuard(Random random, StarSystemAPI system, CampaignFleetAPI fleet)
ScavengerFleetAssignmentAI(CampaignFleetAPI fleet, RouteData route, boolean pirate)
static List< CampaignFleetAPI > getVisibleFleets(SectorEntityToken from, boolean includeSensorContacts)
Definition Misc.java:3759
static float getDistance(SectorEntityToken from, SectorEntityToken to)
Definition Misc.java:599
static Vector2f getPointAtRadius(Vector2f from, float r)
Definition Misc.java:697
static float getSpeedForBurnLevel(float burnLevel)
Definition Misc.java:1671
static void clearTarget(CampaignFleetAPI fleet, boolean forgetTransponder)
Definition Misc.java:3824
void setFaction(String factionId, boolean includeCaptains)
void setNoFactionInName(boolean noFactionInName)
void addAssignment(FleetAssignment assignment, SectorEntityToken target, float maxDurationInDays)
boolean isHostileTo(FactionAPI other)
FactionAPI getFaction(String factionId)
EncounterOption pickEncounterOption(FleetEncounterContextPlugin context, CampaignFleetAPI otherFleet)
void set(String key, Object value)