1package com.fs.starfarer.api.impl.campaign.fleets;
3import java.util.ArrayList;
6import org.apache.log4j.Logger;
7import org.lwjgl.util.vector.Vector2f;
9import com.fs.starfarer.api.EveryFrameScript;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.BaseCampaignEventListener;
12import com.fs.starfarer.api.campaign.BattleAPI;
13import com.fs.starfarer.api.campaign.CampaignFleetAPI;
14import com.fs.starfarer.api.campaign.SectorEntityToken;
15import com.fs.starfarer.api.campaign.econ.MarketAPI;
16import com.fs.starfarer.api.impl.campaign.fleets.FleetFactory.PatrolType;
17import com.fs.starfarer.api.impl.campaign.ids.Conditions;
18import com.fs.starfarer.api.impl.campaign.ids.Factions;
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;
32 public static class PatrolFleetData {
33 public float startingFleetPoints = 0;
35 public PatrolType type;
46 private List<PatrolFleetData> activePatrols =
new ArrayList<PatrolFleetData>();
48 private int maxPatrols;
56 tracker =
new IntervalUtil(interval * 0.75f, interval * 1.25f);
62 if (patrolBattlesLost ==
null) {
64 float min = patrolStrengthCheckInterval - Math.min(patrolStrengthCheckInterval * 0.5f, 2f);
65 float max = patrolStrengthCheckInterval + Math.min(patrolStrengthCheckInterval * 0.5f, 2f);
75 patrolBattlesLost.
advance(days);
80 tracker.
advance(days * Math.max(1f, losses));
81 if (!tracker.intervalElapsed())
return;
85 List<PatrolFleetData>
remove =
new ArrayList<PatrolFleetData>();
86 for (PatrolFleetData data : activePatrols) {
87 if (data.fleet.getContainingLocation() ==
null ||
88 !data.fleet.getContainingLocation().getFleets().contains(data.fleet)) {
90 log.info(
"Cleaning up orphaned patrol [" + data.fleet.getNameWithFaction() +
"] for market [" + market.
getName() +
"]");
93 activePatrols.removeAll(
remove);
102 (int) Math.max(0, Math.min(losses, 5));
103 if (maxPatrols < 1) maxPatrols = 1;
110 if (hasStationOrSpaceport) maxPatrols++;
112 if (hasStationOrSpaceport) maxPatrols++;
117 log.debug(
"Checking whether to spawn patrol for market [" + market.
getName() +
"]");
118 if (activePatrols.size() < maxPatrols) {
119 log.info(activePatrols.size() +
" out of a maximum " + maxPatrols +
" patrols in play for market [" + market.
getName() +
"]");
122 picker.
add(PatrolType.FAST,
123 Math.max(1, maxPatrols - getCount(PatrolType.COMBAT, PatrolType.HEAVY)));
124 picker.
add(PatrolType.COMBAT,
125 Math.max(1, maxPatrols - getCount(PatrolType.FAST, PatrolType.HEAVY) + market.
getSize()) + losses);
128 picker.
add(PatrolType.HEAVY,
129 Math.max(1, maxPatrols - getCount(PatrolType.FAST, PatrolType.COMBAT) + market.
getSize()) + losses * 2f);
133 PatrolType type = picker.
pick();
136 if (fleet ==
null)
return;
142 PatrolFleetData data =
new PatrolFleetData(fleet, type);
144 data.sourceMarket = market;
145 activePatrols.add(data);
152 log.debug(
"Maximum number of " + maxPatrols +
" patrols already in play for market [" + market.
getName() +
"]");
159 PatrolType type,
MarketAPI market, String factionId, Vector2f locInHyper,
float losses) {
167 float freighter = 0f;
172 combat = Math.round(3f + (
float) Math.random() * 2f);
173 combat += Math.min(5f, losses * 2f);
177 combat = Math.round(6f + (
float) Math.random() * 3f);
178 combat += Math.min(25f, losses * 8f);
180 tanker = Math.round((
float) Math.random());
184 combat = Math.round(10f + (
float) Math.random() * 5f);
185 combat += Math.min(40f, losses * 12f);
191 if (market !=
null) {
202 if (market !=
null && factionId ==
null) {
244 if (fleet ==
null)
return null;
248 if (type == PatrolType.FAST || type == PatrolType.COMBAT) {
270 private int getCount(PatrolType ... types) {
272 for (PatrolType type : types) {
273 for (PatrolFleetData data : activePatrols) {
274 if (data.type == type) count++;
292 super.reportFleetDespawned(fleet, reason, param);
294 for (PatrolFleetData data : activePatrols) {
295 if (data.fleet == fleet) {
296 activePatrols.remove(data);
304 super.reportBattleOccurred(primaryWinner, battle);
314 if (loser.getFaction() == market.
getFaction()) {
316 patrolBattlesLost.
add(1);
325 patrolBattlesLost.
sub(1);
static SettingsAPI getSettings()
static Logger getLogger(Class c)
static SectorAPI getSector()
static CampaignFleetAPI createFleet(FleetParamsV3 params)
void reportFleetDespawned(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
static CampaignFleetAPI createPatrolFleet(PatrolType type, MarketAPI market, String factionId, Vector2f locInHyper, float losses)
PatrolFleetManager(MarketAPI market)
void advance(float amount)
void reportBattleOccurred(CampaignFleetAPI primaryWinner, BattleAPI battle)
static final String DECIVILIZED
static final String LUDDIC_PATH
static final String PIRATES
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)
List< CampaignFleetAPI > getOtherSideSnapshotFor(CampaignFleetAPI participantOrCombined)
List< CampaignFleetAPI > getSideFor(CampaignFleetAPI participantOrCombined)
List< CampaignFleetAPI > getOtherSideFor(CampaignFleetAPI participantOrCombined)
boolean isPlayerSide(EngagementResultForFleetAPI side)
float convertToDays(float realSeconds)
String getNameWithFaction()
void setLocation(float x, float y)
void addEntity(SectorEntityToken entity)
CampaignClockAPI getClock()
LocationAPI getContainingLocation()
boolean isInOrNearSystem(StarSystemAPI system)
void addScript(EveryFrameScript script)
MemoryAPI getMemoryWithoutUpdate()
float getStabilityValue()
boolean hasIndustry(String id)
StarSystemAPI getStarSystem()
boolean hasCondition(String id)
SectorEntityToken getPrimaryEntity()
void set(String key, Object value)
void setRankId(String rank)
void setPostId(String postId)