1package com.fs.starfarer.api.impl.campaign.econ.impl;
3import java.util.Random;
5import com.fs.starfarer.api.Global;
6import com.fs.starfarer.api.campaign.BattleAPI;
7import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
8import com.fs.starfarer.api.campaign.CampaignFleetAPI;
9import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
10import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
11import com.fs.starfarer.api.campaign.econ.Industry;
12import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
13import com.fs.starfarer.api.campaign.rules.MemoryAPI;
14import com.fs.starfarer.api.fleet.FleetMemberAPI;
15import com.fs.starfarer.api.impl.campaign.econ.impl.MilitaryBase.PatrolFleetData;
16import com.fs.starfarer.api.impl.campaign.fleets.FleetFactory.PatrolType;
17import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
18import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
19import com.fs.starfarer.api.impl.campaign.fleets.PatrolAssignmentAIV4;
20import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
21import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.OptionalFleetData;
22import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
23import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteFleetSpawner;
24import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
25import com.fs.starfarer.api.impl.campaign.ids.Commodities;
26import com.fs.starfarer.api.impl.campaign.ids.Factions;
27import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
28import com.fs.starfarer.api.impl.campaign.ids.Ranks;
29import com.fs.starfarer.api.impl.campaign.ids.Stats;
30import com.fs.starfarer.api.impl.campaign.ids.Tags;
31import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.RaidDangerLevel;
32import com.fs.starfarer.api.loading.VariantSource;
33import com.fs.starfarer.api.ui.TooltipMakerAPI;
34import com.fs.starfarer.api.util.IntervalUtil;
35import com.fs.starfarer.api.util.Misc;
36import com.fs.starfarer.api.util.Pair;
37import com.fs.starfarer.api.util.WeightedRandomPicker;
94 return mode != IndustryTooltipMode.NORMAL ||
isFunctional();
99 if (mode != IndustryTooltipMode.NORMAL ||
isFunctional()) {
110 if (
getSpec().getName().contains(
"HQ")) {
123 return super.getCurrentImage();
142 super.buildingFinished();
149 super.upgradeFinished(previous);
156 super.advance(amount);
164 float spawnRate = 1f;
166 spawnRate *= rateMult;
169 float extraTime = 0f;
173 extraTime = interval * days;
181 if (
tracker.intervalElapsed()) {
184 int light =
getCount(PatrolType.FAST);
185 int medium =
getCount(PatrolType.COMBAT);
186 int heavy =
getCount(PatrolType.HEAVY);
193 picker.
add(PatrolType.HEAVY, maxHeavy - heavy);
194 picker.
add(PatrolType.COMBAT, maxMedium - medium);
195 picker.
add(PatrolType.FAST, maxLight - light);
199 PatrolType type = picker.
pick();
200 PatrolFleetData custom =
new PatrolFleetData(type);
202 OptionalFleetData extra =
new OptionalFleetData(
market);
203 extra.fleetType = type.getFleetType();
206 float patrolDays = 35f + (float) Math.random() * 10f;
222 if (data.getCustom() instanceof PatrolFleetData) {
223 PatrolFleetData custom = (PatrolFleetData) data.getCustom();
224 for (PatrolType type : types) {
225 if (type == custom.type) {
236 if (type == PatrolType.FAST) {
239 if (type == PatrolType.COMBAT) {
242 if (type == PatrolType.HEAVY) {
259 if (reason == FleetDespawnReason.REACHED_DESTINATION) {
261 if (route.getCustom() instanceof PatrolFleetData) {
262 PatrolFleetData custom = (PatrolFleetData) route.getCustom();
263 if (custom.spawnFP > 0) {
273 PatrolFleetData custom = (PatrolFleetData) route.getCustom();
274 PatrolType type = custom.type;
276 Random random = route.getRandom();
280 float freighter = 0f;
281 String fleetType = type.getFleetType();
284 combat = Math.round(3f + (
float) random.nextFloat() * 2f) * 5f;
287 combat = Math.round(6f + (
float) random.nextFloat() * 3f) * 5f;
288 tanker = Math.round((
float) random.nextFloat()) * 5f;
291 combat = Math.round(10f + (
float) random.nextFloat() * 5f) * 5f;
292 tanker = Math.round((
float) random.nextFloat()) * 10f;
293 freighter = Math.round((
float) random.nextFloat()) * 10f;
301 route.getQualityOverride(),
311 params.timestamp = route.getTimestamp();
312 params.random = random;
314 params.modeOverride = ShipPickMode.PRIORITY_THEN_ALL;
317 if (fleet ==
null || fleet.
isEmpty())
return null;
330 if (type == PatrolType.FAST || type == PatrolType.COMBAT) {
352 if (member.isCapital()) {
353 member.setVariant(member.getVariant().clone(),
false,
false);
362 fleet.
setFacing((
float) Math.random() * 360f);
371 if (custom.spawnFP <= 0) {
static SettingsAPI getSettings()
static SectorAPI getSector()
float computeEffective(float baseValue)
IndustrySpecAPI getSpec()
Map< String, MutableCommodityQuantity > supply
void addStabilityPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode)
void unmodifyStabilityWithBaseMod()
void modifyStabilityWithBaseMod()
Map< String, MutableCommodityQuantity > demand
Pair< String, Integer > getMaxDeficit(String ... commodityIds)
void applyDeficitToProduction(int index, Pair< String, Integer > deficit, String ... commodities)
int getBaseStabilityMod()
String getRouteSourceId()
CampaignFleetAPI spawnFleet(RouteData route)
String getNameForModifier()
boolean shouldCancelRouteAfterDelayCheck(RouteData route)
boolean shouldRepeat(RouteData route)
RaidDangerLevel adjustCommodityDangerLevel(String commodityId, RaidDangerLevel level)
void reportAboutToBeDespawnedByRouteManager(RouteData route)
RaidDangerLevel adjustItemDangerLevel(String itemId, String data, RaidDangerLevel level)
boolean isDemandLegal(CommodityOnMarketAPI com)
int getMaxPatrols(PatrolType type)
void advance(float amount)
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
int getCount(PatrolType ... types)
boolean isAvailableToBuild()
Pair< String, Integer > getStabilityAffectingDeficit()
boolean isSupplyLegal(CommodityOnMarketAPI com)
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
float returningPatrolValue
void upgradeFinished(Industry previous)
boolean hasPostDemandSection(boolean hasDemand, IndustryTooltipMode mode)
boolean showWhenUnavailable()
void addPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode)
static CampaignFleetAPI createFleet(FleetParamsV3 params)
RouteData addRoute(String source, MarketAPI market, Long seed, OptionalFleetData extra, RouteFleetSpawner spawner)
List< RouteData > getRoutesForSource(String source)
static RouteManager getInstance()
RouteData getRoute(String source, CampaignFleetAPI fleet)
static final String SUPPLIES
static final String MARINES
static final String SHIPS
static final String HAND_WEAPONS
static final String DIKTAT
static final String LIONS_GUARD
static final String MEMORY_KEY_CUSTOMS_INSPECTOR
static final String MEMORY_KEY_PATROL_FLEET
static final String MARKET_MILITARY
static final String MARKET_PATROL
static final String FLEET_IGNORES_OTHER_FLEETS
static String POST_PATROL_COMMANDER
static String SPACE_CAPTAIN
static String SPACE_COMMANDER
static String SPACE_LIEUTENANT
static final String COMBAT_FLEET_SPAWN_RATE_MULT
static final String PATROL_NUM_MEDIUM_MOD
static final String PATROL_NUM_LIGHT_MOD
static final String PATROL_NUM_HEAVY_MOD
void forceIntervalElapsed()
float getIntervalDuration()
void advance(float amount)
static String ucFirst(String str)
static long genRandomSeed()
static boolean setFlagWithReason(MemoryAPI memory, String flagKey, String reason, boolean value, float expire)
static ShipPickMode getShipPickMode(MarketAPI market)
float getFloat(String key)
float convertToDays(float realSeconds)
void setFaction(String factionId, boolean includeCaptains)
FleetDataAPI getFleetData()
void setNoFactionInName(boolean noFactionInName)
void setLocation(float x, float y)
List< FleetMemberAPI > getMembersListCopy()
void addEventListener(FleetEventListener listener)
void addEntity(SectorEntityToken entity)
CampaignClockAPI getClock()
void addScript(EveryFrameScript script)
void setFacing(float facing)
MemoryAPI getMemoryWithoutUpdate()
LocationAPI getContainingLocation()
MutableMarketStatsAPI getStats()
MemoryAPI getMemoryWithoutUpdate()
SectorEntityToken getPrimaryEntity()
void set(String key, Object value)
void setRankId(String rank)
void setPostId(String postId)
DynamicStatsAPI getDynamic()
MutableStat getStat(String id)
StatBonus getMod(String id)