1package com.fs.starfarer.api.impl.campaign.econ.impl;
3import java.util.Random;
7import org.lwjgl.util.vector.Vector2f;
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.BattleAPI;
11import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.PlanetAPI;
14import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
15import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
16import com.fs.starfarer.api.campaign.econ.Industry;
17import com.fs.starfarer.api.campaign.econ.MarketAPI;
18import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
19import com.fs.starfarer.api.campaign.rules.MemoryAPI;
20import com.fs.starfarer.api.impl.campaign.DebugFlags;
21import com.fs.starfarer.api.impl.campaign.fleets.FleetFactory.PatrolType;
22import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
23import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
24import com.fs.starfarer.api.impl.campaign.fleets.PatrolAssignmentAIV4;
25import com.fs.starfarer.api.impl.campaign.fleets.RouteManager;
26import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.OptionalFleetData;
27import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
28import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteFleetSpawner;
29import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
30import com.fs.starfarer.api.impl.campaign.ids.Commodities;
31import com.fs.starfarer.api.impl.campaign.ids.Factions;
32import com.fs.starfarer.api.impl.campaign.ids.Industries;
33import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
34import com.fs.starfarer.api.impl.campaign.ids.Ranks;
35import com.fs.starfarer.api.impl.campaign.ids.Stats;
36import com.fs.starfarer.api.impl.campaign.ids.Strings;
37import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.RaidDangerLevel;
38import com.fs.starfarer.api.ui.TooltipMakerAPI;
39import com.fs.starfarer.api.util.IntervalUtil;
40import com.fs.starfarer.api.util.Misc;
41import com.fs.starfarer.api.util.Pair;
42import com.fs.starfarer.api.util.WeightedRandomPicker;
80 }
else if (militaryBase) {
95 }
else if (size == 4) {
99 }
else if (size == 5) {
103 }
else if (size == 6) {
107 }
else if (size == 7) {
111 }
else if (size == 8) {
115 }
else if (size >= 9) {
122 if (militaryBase || command) {
124 medium = Math.max(medium + 1, size / 2 - 1);
125 heavy = Math.max(heavy, medium - 1);
185 if (militaryBase || command) {
225 return mode != IndustryTooltipMode.NORMAL ||
isFunctional();
230 if (mode != IndustryTooltipMode.NORMAL ||
isFunctional()) {
247 int stabilityMod = 1;
250 }
else if (militaryBase) {
252 }
else if (command) {
261 if (
getSpec().getName().contains(
"HQ")) {
293 return super.getCurrentImage();
306 boolean canBuild =
false;
308 if (ind ==
this)
continue;
309 if (!ind.isFunctional())
continue;
319 return "Requires a functional spaceport";
331 super.buildingFinished();
338 super.upgradeFinished(previous);
345 super.advance(amount);
357 float spawnRate = 1f;
359 spawnRate *= rateMult;
365 float extraTime = 0f;
369 extraTime = interval * days;
380 if (
tracker.intervalElapsed()) {
389 int light =
getCount(PatrolType.FAST);
390 int medium =
getCount(PatrolType.COMBAT);
391 int heavy =
getCount(PatrolType.HEAVY);
398 picker.
add(PatrolType.HEAVY, maxHeavy - heavy);
399 picker.
add(PatrolType.COMBAT, maxMedium - medium);
400 picker.
add(PatrolType.FAST, maxLight - light);
404 PatrolType type = picker.
pick();
405 PatrolFleetData custom =
new PatrolFleetData(type);
407 OptionalFleetData extra =
new OptionalFleetData(
market);
408 extra.fleetType = type.getFleetType();
415 float patrolDays = 35f + (float) Math.random() * 10f;
420 public static class PatrolFleetData {
421 public PatrolType type;
424 public PatrolFleetData(PatrolType type) {
446 if (data.getCustom() instanceof PatrolFleetData) {
447 PatrolFleetData custom = (PatrolFleetData) data.getCustom();
448 for (PatrolType type : types) {
449 if (type == custom.type) {
460 if (type == PatrolType.FAST) {
463 if (type == PatrolType.COMBAT) {
466 if (type == PatrolType.HEAVY) {
488 if (reason == FleetDespawnReason.REACHED_DESTINATION) {
490 if (route.getCustom() instanceof PatrolFleetData) {
491 PatrolFleetData custom = (PatrolFleetData) route.getCustom();
492 if (custom.spawnFP > 0) {
504 combat = Math.round(3f + (
float) random.nextFloat() * 2f) * 5f;
507 combat = Math.round(6f + (
float) random.nextFloat() * 3f) * 5f;
510 combat = Math.round(10f + (
float) random.nextFloat() * 5f) * 5f;
513 return (
int) Math.round(combat);
518 PatrolFleetData custom = (PatrolFleetData) route.getCustom();
519 PatrolType type = custom.type;
521 Random random = route.getRandom();
525 if (fleet ==
null || fleet.
isEmpty())
return null;
530 fleet.
setFacing((
float) Math.random() * 360f);
541 if (custom.spawnFP <= 0) {
552 if (random ==
null) random =
new Random();
557 float freighter = 0f;
558 String fleetType = type.getFleetType();
563 tanker = Math.round((
float) random.nextFloat() * 5f);
566 tanker = Math.round((
float) random.nextFloat() * 10f);
567 freighter = Math.round((
float) random.nextFloat() * 10f);
571 tanker += extraTankerPts;
577 route ==
null ?
null : route.getQualityOverride(),
588 params.timestamp = route.getTimestamp();
590 params.random = random;
593 if (fleet ==
null || fleet.
isEmpty())
return null;
597 if (type == PatrolType.FAST || type == PatrolType.COMBAT) {
653 String pre =
"Alpha-level AI core currently assigned. ";
654 if (mode == AICoreDescriptionMode.MANAGE_CORE_DIALOG_LIST || mode == AICoreDescriptionMode.INDUSTRY_TOOLTIP) {
655 pre =
"Alpha-level AI core. ";
659 String str = Strings.X + (1f + a);
661 if (mode == AICoreDescriptionMode.INDUSTRY_TOOLTIP) {
664 text.
addPara(pre +
"Reduces upkeep cost by %s. Reduces demand by %s unit. " +
665 "Increases fleet size by %s.", 0f, highlight,
672 tooltip.
addPara(pre +
"Reduces upkeep cost by %s. Reduces demand by %s unit. " +
673 "Increases fleet size by %s.", opad, highlight,
687 String key =
"mil_base_improve";
711 String type =
"medium patrols";
712 if (!patrol) type =
"heavy patrols";
714 if (mode == ImprovementDescriptionMode.INDUSTRY_TOOLTIP) {
715 info.
addPara(
"Number of " + type +
" launched increased by %s.", 0f, highlight, str);
717 info.
addPara(
"Increases the number of " + type +
" launched by %s.", 0f, highlight, str);
721 super.addImproveDesc(info, mode);
static SettingsAPI getSettings()
static SectorAPI getSector()
void modifyFlat(String source, float value)
void modifyMult(String source, float value)
void unmodifyMult(String source)
void modifyFlat(String source, float value)
float computeEffective(float baseValue)
void unmodifyFlat(String source)
static boolean FAST_PATROL_SPAWN
IndustrySpecAPI getSpec()
static int DEMAND_REDUCTION
void applyIncomeAndUpkeep(float sizeOverride)
Map< String, MutableCommodityQuantity > supply
static String getDeficitText(String commodityId)
void addStabilityPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode)
void unmodifyStabilityWithBaseMod()
void modifyStabilityWithBaseMod()
float getDeficitMult(String ... commodities)
void addGroundDefensesImpactSection(TooltipMakerAPI tooltip, float bonus, String ...commodities)
Map< String, MutableCommodityQuantity > demand
MutableStat demandReduction
Pair< String, Integer > getMaxDeficit(String ... commodityIds)
void applyAlphaCoreModifiers()
static float DEFENSE_BONUS_MILITARY
static float DEFENSE_BONUS_PATROL
void applyImproveModifiers()
boolean isAvailableToBuild()
void addImproveDesc(TooltipMakerAPI info, ImprovementDescriptionMode mode)
boolean shouldCancelRouteAfterDelayCheck(RouteData route)
static CampaignFleetAPI createPatrol(PatrolType type, String factionId, RouteData route, MarketAPI market, Vector2f locInHyper, Random random)
Pair< String, Integer > getStabilityAffectingDeficit()
int getCount(PatrolType ... types)
void applyAlphaCoreSupplyAndDemandModifiers()
void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle)
String getRouteSourceId()
void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param)
static float DEFENSE_BONUS_COMMAND
String getNameForModifier()
static CampaignFleetAPI createPatrol(PatrolType type, float extraTankerPts, String factionId, RouteData route, MarketAPI market, Vector2f locInHyper, Random random)
String getUnavailableReason()
boolean shouldRepeat(RouteData route)
boolean isDemandLegal(CommodityOnMarketAPI com)
RaidDangerLevel adjustCommodityDangerLevel(String commodityId, RaidDangerLevel level)
void upgradeFinished(Industry previous)
float returningPatrolValue
boolean isSupplyLegal(CommodityOnMarketAPI com)
RaidDangerLevel adjustItemDangerLevel(String itemId, String data, RaidDangerLevel level)
int getBaseStabilityMod()
static float OFFICER_PROB_MOD_PATROL_HQ
boolean hasPostDemandSection(boolean hasDemand, IndustryTooltipMode mode)
void reportAboutToBeDespawnedByRouteManager(RouteData route)
static float ALPHA_CORE_BONUS
void addPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode)
int getMaxPatrols(PatrolType type)
void addAlphaCoreDescription(TooltipMakerAPI tooltip, AICoreDescriptionMode mode)
static int getPatrolCombatFP(PatrolType type, Random random)
void advance(float amount)
static int IMPROVE_NUM_PATROLS_BONUS
void applyNoAICoreModifiers()
static float OFFICER_PROB_MOD_MILITARY_BASE
CampaignFleetAPI spawnFleet(RouteData route)
static float OFFICER_PROB_MOD_HIGH_COMMAND
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 CUSTOM_PATROLS_HAVE_NO_PATROL_MEMORY_KEY
static final String CUSTOM_PIRATE_BEHAVIOR
static final String TAG_COMMAND
static final String MILITARYBASE
static final String TAG_SPACEPORT
static final String TAG_MILITARY
static final String TAG_PATROL
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 MEMORY_KEY_PIRATE
static final String MEMORY_KEY_RAIDER
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_SIZE_MULT
static final String COMBAT_FLEET_SPAWN_RATE_MULT
static final String PATROL_NUM_MEDIUM_MOD
static final String OFFICER_PROB_MOD
static final String PATROL_NUM_LIGHT_MOD
static final String GROUND_DEFENSES_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 Color getHighlightColor()
static boolean setFlagWithReason(MemoryAPI memory, String flagKey, String reason, boolean value, float expire)
static float getAdjustedStrength(float fp, MarketAPI market)
String getSpriteName(String category, String id)
CommoditySpecAPI getCommoditySpec(String commodityId)
float getFloat(String key)
float convertToDays(float realSeconds)
void setLocation(float x, float y)
boolean getCustomBoolean(String key)
void addEventListener(FleetEventListener listener)
void addEntity(SectorEntityToken entity)
CampaignClockAPI getClock()
boolean isInNewGameAdvance()
void addScript(EveryFrameScript script)
void setFacing(float facing)
MemoryAPI getMemoryWithoutUpdate()
LocationAPI getContainingLocation()
MutableMarketStatsAPI getStats()
MemoryAPI getMemoryWithoutUpdate()
List< Industry > getIndustries()
PlanetAPI getPlanetEntity()
SectorEntityToken getPrimaryEntity()
void set(String key, Object value)
void setRankId(String rank)
void setPostId(String postId)
DynamicStatsAPI getDynamic()
boolean hasTag(String tag)
MutableStat getStat(String id)
StatBonus getMod(String id)