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);
26 public ScavengerFleetAssignmentAI(CampaignFleetAPI fleet, RouteData route, boolean pirate) {
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) {
51 SectorEntityToken target = RemnantSeededFleetManager.pickEntityToGuard(new Random(), (StarSystemAPI) segment.from.getContainingLocation(), fleet);
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()) {
106 fleet.setFaction(Factions.INDEPENDENT, true);
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) {
132 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PIRATE, true);
133 fleet.setNoFactionInName(true);
134 fleet.setFaction(Factions.PIRATES, true);
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:59
static SectorEntityToken pickEntityToGuard(Random random, StarSystemAPI system, CampaignFleetAPI fleet)
ScavengerFleetAssignmentAI(CampaignFleetAPI fleet, RouteData route, boolean pirate)