1package com.fs.starfarer.api.impl.campaign.fleets;
4import java.util.Random;
6import com.fs.starfarer.api.Script;
7import com.fs.starfarer.api.campaign.CampaignFleetAPI;
8import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
9import com.fs.starfarer.api.campaign.FleetActionTextProvider;
10import com.fs.starfarer.api.campaign.FleetAssignment;
11import com.fs.starfarer.api.campaign.LocationAPI;
12import com.fs.starfarer.api.campaign.SectorEntityToken;
13import com.fs.starfarer.api.campaign.StarSystemAPI;
14import com.fs.starfarer.api.campaign.ai.FleetAssignmentDataAPI;
15import com.fs.starfarer.api.campaign.econ.MarketAPI;
16import com.fs.starfarer.api.impl.campaign.econ.impl.MilitaryBase.PatrolFleetData;
17import com.fs.starfarer.api.impl.campaign.fleets.FleetFactory.PatrolType;
18import com.fs.starfarer.api.impl.campaign.fleets.RouteLocationCalculator.TaskInterval;
19import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
20import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
21import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
22import com.fs.starfarer.api.impl.campaign.ids.Tags;
23import com.fs.starfarer.api.impl.campaign.procgen.themes.RouteFleetAssignmentAI;
24import com.fs.starfarer.api.util.CountingMap;
25import com.fs.starfarer.api.util.Misc;
26import com.fs.starfarer.api.util.WeightedRandomPicker;
48 if (target ==
null)
return;
50 RouteSegment current =
route.getCurrent();
53 TaskInterval [] intervals =
new TaskInterval[] {
54 TaskInterval.days(3f + (
float) Math.random() * 3f),
55 TaskInterval.travel(),
56 TaskInterval.remaining(1f),
57 TaskInterval.travel(),
58 TaskInterval.days(3f + (
float) Math.random() * 3f),
63 source, source, target, target, source, source);
68 float combinedTravelAndPatrolTime = intervals[1].value + intervals[2].value;
70 if (intervals[0].value > 0) {
73 if (intervals[1].value > 0) {
76 combinedTravelAndPatrolTime = 0f;
78 if (intervals[2].value > 0) {
93 if (intervals[3].value > 0) {
112 if (curr ==
null)
return null;
118 if (target !=
null) {
133 return "preparing for patrol duty";
135 return "traveling to " + name;
138 }
else if (
PATROL_STAGE.equals(stage) && target !=
null) {
140 return "guarding " + name;
142 return "guarding " + name;
144 return "defending " + name;
149 return "returning to " + name;
151 return "standing down";
155 return "preparing for patrol duty";
157 return "traveling to " + name;
160 }
else if (
PATROL_STAGE.equals(stage) && target !=
null) {
162 return "guarding " + name;
164 return "guarding " + name;
166 return "patrolling around " + name;
171 return "returning to " + name;
173 return "standing down from patrol duty";
188 super.advance(amount);
196 Random random =
route.getRandom(1);
198 PatrolFleetData custom = (PatrolFleetData)
route.getCustom();
199 PatrolType type = custom.type;
202 if (loc ==
null)
return null;
209 if (other ==
null)
continue;
211 if (curr ==
null || curr.
getTarget() ==
null ||
223 hostileMax = Math.max(hostileMax, market.getSize());
225 ourMax = Math.max(ourMax, market.getSize());
228 boolean inControl = ourMax > hostileMax;
234 for (
int i = 0; i < existing.
getCount(entity); i++) w *= 0.1f;
236 if (type == PatrolType.HEAVY) w *= 0.1f;
238 picker.
add(entity, w);
244 for (
int i = 0; i < existing.
getCount(entity); i++) w *= 0.1f;
246 if (type == PatrolType.HEAVY) w *= 0.1f;
248 picker.
add(entity, w);
254 for (
int i = 0; i < existing.
getCount(entity); i++) w *= 0.1f;
256 if (type == PatrolType.HEAVY) w *= 0.1f;
258 picker.
add(entity, w);
261 if (loc instanceof
StarSystemAPI && custom.type == PatrolType.HEAVY) {
275 if (market ==
route.getMarket()) {
289 for (
int i = 0; i < existing.
getCount(market.getPrimaryEntity()); i++) w *= 0.1f;
290 picker.
add(market.getPrimaryEntity(), w);
301 if (target ==
null) {
void advance(float amount)
static final String TRAVEL_TO_STAGE
SectorEntityToken pickEntityToGuard()
String getActionText(CampaignFleetAPI fleet)
PatrolAssignmentAIV4(CampaignFleetAPI fleet, RouteData route)
static final String PATROL_STAGE
static final String PREP_STAGE
static final String RETURN_STAGE
void giveInitialAssignments()
static final String STAND_DOWN_STAGE
static void computeIntervalsAndSetLocation(CampaignFleetAPI fleet, float daysElapsed, float maxDays, boolean onlyComputeIntervals, TaskInterval[] intervals, SectorEntityToken ... sequence)
List< RouteData > getRoutesForSource(String source)
static RouteManager getInstance()
static final String MARKET_PATROL
static final String MEMORY_KEY_PIRATE
static final String MEMORY_KEY_ALLOW_LONG_PURSUIT
void checkCapture(float amount)
void checkBuild(float amount)
Script goNextScript(final RouteSegment current)
void add(K key, int quantity)
static List< MarketAPI > getMarketsInLocation(LocationAPI location, String factionId)
GO_TO_LOCATION_AND_DESPAWN
LocationAPI getContainingLocation()
CampaignFleetAIAPI getAI()
void addAssignment(FleetAssignment assignment, SectorEntityToken target, float maxDurationInDays)
FleetAssignmentDataAPI getCurrentAssignment()
List< SectorEntityToken > getJumpPoints()
List< SectorEntityToken > getEntitiesWithTag(String tag)
boolean hasTag(String tag)
MemoryAPI getMemoryWithoutUpdate()
CustomEntitySpecAPI getCustomEntitySpec()
SectorEntityToken getHyperspaceAnchor()
SectorEntityToken getCenter()
void setActionTextProvider(FleetActionTextProvider actionTextProvider)
SectorEntityToken getTarget()
FleetAssignment getAssignment()
SectorEntityToken getPrimaryEntity()
void set(String key, Object value)
boolean getBoolean(String key)