1package com.fs.starfarer.api.impl.campaign.fleets;
3import java.util.ArrayList;
6import org.apache.log4j.Logger;
8import com.fs.starfarer.api.EveryFrameScript;
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.BaseCampaignEventListener;
11import com.fs.starfarer.api.campaign.BattleAPI;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.FleetStubAPI;
14import com.fs.starfarer.api.campaign.SectorEntityToken;
15import com.fs.starfarer.api.campaign.econ.MarketAPI;
16import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
17import com.fs.starfarer.api.impl.campaign.fleets.FleetFactory.PatrolType;
18import com.fs.starfarer.api.impl.campaign.ids.Conditions;
19import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
20import com.fs.starfarer.api.impl.campaign.ids.Industries;
21import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
22import com.fs.starfarer.api.impl.campaign.ids.Ranks;
23import com.fs.starfarer.api.util.IntervalUtil;
24import com.fs.starfarer.api.util.Misc;
25import com.fs.starfarer.api.util.RollingAverageTracker;
26import com.fs.starfarer.api.util.WeightedRandomPicker;
33 public static class PatrolFleetData {
34 public float startingFleetPoints = 0;
36 public PatrolType type;
38 public PatrolFleetData(
FleetStubAPI fleet, PatrolType type) {
47 private List<PatrolFleetData> activePatrols =
new ArrayList<PatrolFleetData>();
49 private int maxPatrols;
57 tracker =
new IntervalUtil(interval * 0.75f, interval * 1.25f);
63 if (patrolBattlesLost ==
null) {
65 float min = patrolStrengthCheckInterval - Math.min(patrolStrengthCheckInterval * 0.5f, 2f);
66 float max = patrolStrengthCheckInterval + Math.min(patrolStrengthCheckInterval * 0.5f, 2f);
76 patrolBattlesLost.
advance(days);
81 tracker.
advance(days * Math.max(1f, losses));
82 if (!tracker.intervalElapsed())
return;
90 List<PatrolFleetData>
remove =
new ArrayList<PatrolFleetData>();
91 for (PatrolFleetData data : activePatrols) {
92 if (data.stub.getContainingLocation() ==
null ||
93 (!data.stub.getContainingLocation().getFleets().contains(data.stub.getFleet()) &&
94 !data.stub.getContainingLocation().getFleetStubs().contains(data.stub))) {
96 log.info(
"Cleaning up orphaned patrol [" + data.stub.getId() +
"] for market [" + market.
getName() +
"]");
99 activePatrols.removeAll(
remove);
108 (int) Math.max(0, Math.min(losses, 5));
109 if (maxPatrols < 1) maxPatrols = 1;
116 if (hasStationOrSpaceport) maxPatrols++;
118 if (hasStationOrSpaceport) maxPatrols++;
124 log.debug(
"Checking whether to spawn patrol for market [" + market.
getName() +
"]");
125 if (activePatrols.size() < maxPatrols) {
126 log.info(activePatrols.size() +
" out of a maximum " + maxPatrols +
" patrols in play for market [" + market.
getName() +
"]");
129 picker.
add(PatrolType.FAST,
130 Math.max(1, maxPatrols - getCount(PatrolType.COMBAT, PatrolType.HEAVY)));
131 picker.
add(PatrolType.COMBAT,
132 Math.max(1, maxPatrols - getCount(PatrolType.FAST, PatrolType.HEAVY) + market.
getSize()) + losses * 0.5f);
135 picker.
add(PatrolType.HEAVY,
136 Math.max(1, maxPatrols - getCount(PatrolType.FAST, PatrolType.COMBAT) + market.
getSize() - 5) + losses);
140 PatrolType type = picker.
pick();
144 float freighter = 0f;
149 combat = Math.round(3f + (
float) Math.random() * 2f);
150 combat += Math.min(5f, losses * 2f);
154 combat = Math.round(6f + (
float) Math.random() * 3f);
155 combat += Math.min(15f, losses * 4f);
157 tanker = Math.round((
float) Math.random());
161 combat = Math.round(10f + (
float) Math.random() * 5f);
162 combat += Math.min(25f, losses * 6f);
199 PatrolFleetData data =
new PatrolFleetData(stub, type);
200 data.startingFleetPoints = combat * 3;
201 data.sourceMarket = market;
202 activePatrols.add(data);
212 if (type == PatrolType.FAST || type == PatrolType.COMBAT) {
236 log.info(
"Spawned patrol fleet [" + stub.
getId() +
"] from market " + market.
getName());
238 log.debug(
"Maximum number of " + maxPatrols +
" patrols already in play for market [" + market.
getName() +
"]");
242 private int getCount(PatrolType ... types) {
244 for (PatrolType type : types) {
245 for (PatrolFleetData data : activePatrols) {
246 if (data.type == type) count++;
262 for (PatrolFleetData data : activePatrols) {
263 if (data.stub.getId() == fleet.
getId()) {
264 activePatrols.remove(data);
static SettingsAPI getSettings()
static Logger getLogger(Class c)
static SectorAPI getSector()
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
PatrolFleetManagerV2(MarketAPI market)
void advance(float amount)
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
static final String DECIVILIZED
static final String PATROL_SMALL
static final String PATROL_LARGE
static final String PATROL_MEDIUM
static final String MILITARYBASE
static final String BATTLESTATION
static final String ORBITALSTATION
static final String MEMORY_KEY_CUSTOMS_INSPECTOR
static final String MEMORY_KEY_PATROL_FLEET
static String POST_PATROL_COMMANDER
static String SPACE_CAPTAIN
static String SPACE_COMMANDER
static String SPACE_LIEUTENANT
void advance(float amount)
static float getGenericRollingAverageFactor()
void advance(float amount)
float getFloat(String key)
float convertToDays(float realSeconds)
void addScript(EveryFrameScript script)
void setAdmiralPost(String admiralPost)
MemoryAPI getMemoryWithoutUpdate()
void setAdmiralRank(String admiralRank)
CampaignClockAPI getClock()
float getStabilityValue()
boolean hasIndustry(String id)
boolean hasCondition(String id)
SectorEntityToken getPrimaryEntity()
void set(String key, Object value)