1package com.fs.starfarer.api.impl.campaign.abilities.ai;
3import com.fs.starfarer.api.Global;
4import com.fs.starfarer.api.campaign.CampaignFleetAPI;
5import com.fs.starfarer.api.campaign.FleetAssignment;
6import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
7import com.fs.starfarer.api.campaign.ai.FleetAIFlags;
8import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
9import com.fs.starfarer.api.campaign.rules.MemoryAPI;
10import com.fs.starfarer.api.fleet.FleetMemberAPI;
11import com.fs.starfarer.api.impl.campaign.abilities.EmergencyBurnAbility;
12import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin;
13import com.fs.starfarer.api.util.IntervalUtil;
14import com.fs.starfarer.api.util.Misc;
45 if (!
interval.intervalElapsed())
return;
103 if (fleeingFrom !=
null) {
108 if (level == VisibilityLevel.NONE)
return;
114 if (avoidingPlayer)
return;
117 UseCost cost = getUseCost();
125 if ((theirSpeed > ourSpeed && closingSpeed > 1) || (closingSpeed > 1 && dist < 100)) {
126 if (hopelessFight && dist < 200) {
128 }
else if ((cost == UseCost.LOW || cost == UseCost.MEDIUM) && dist < 500) {
130 }
else if ((cost == UseCost.LOW || cost == UseCost.MEDIUM) && dist < 100) {
132 }
else if ((cost == UseCost.LOW || cost == UseCost.MEDIUM) && dist > detRange - 100f) {
140 if (pursueTarget !=
null) {
151 if (level == VisibilityLevel.NONE)
return;
155 if (level == VisibilityLevel.NONE) {
158 if (closingSpeed > 0) {
172 UseCost cost = getUseCost();
174 if (dist < 0)
return;
183 if (cost == UseCost.LOW && closingSpeed <= -1 && dist > detRange - 100f) {
185 }
else if (cost == UseCost.LOW && dist < 200 && closingSpeed < 50 && !targetInsignificant) {
187 }
else if (cost == UseCost.LOW && theirSpeed > ourSpeed && dist > 300 && !targetInsignificant) {
203 public static enum UseCost {
208 private UseCost getUseCost() {
210 float numCritAlready = 0;
218 boolean allCRMaxed =
true;
222 if (member.isCivilian()) {
228 float cr = member.getRepairTracker().getCR();
229 float maxCR = member.getRepairTracker().getMaxCR();
231 float crAfter = cr - useCost;
237 if (cr <= crCrit * 0.5f) {
240 if (crAfter <= crCrit) {
242 }
else if (crAfter <= crLow) {
249 if (numCritAlready >= count)
return UseCost.LOW;
251 if (allCRMaxed)
return UseCost.LOW;
252 if (numOk + numLow >= count)
return UseCost.MEDIUM;
265 if (us < 0.1f) us = 0.1f;
266 if (them < 0.1f) them = 0.1f;
267 return them > us * 3f;
274 if (us < 0.1f) us = 0.1f;
275 if (them < 0.1f) them = 0.1f;
276 return us > them * 5f;
282 if (member.canBeDeployedForCombat()) {
283 float strength = member.getMemberStrength();
static SettingsAPI getSettings()
static final String HAS_SPEED_BONUS
static final String HAS_VISION_PENALTY
static final String PURSUIT_TARGET
static final String USE_EB_FOR_TRAVEL
static final String NEAREST_FLEEING_FROM
static float CR_COST_MULT
static float AI_USE_TIMEOUT_DAYS_MIN
static float AI_USE_TIMEOUT_DAYS_MAX
static float AI_FREQUENCY_MULT
static String AI_USE_TIMEOUT_KEY
boolean otherInsignificant(CampaignFleetAPI other)
boolean isGreatlyOutmatchedBy(CampaignFleetAPI other)
static float getStrength(CampaignFleetAPI fleet)
static String STORM_STRIKE_TIMEOUT_KEY
void advance(float amount)
static boolean isInsideSlipstream(Vector2f loc, float radius)
static boolean isInsideBlackHole(CampaignFleetAPI fleet, boolean includeEventHorizon)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static float getClosingSpeed(Vector2f p1, Vector2f p2, Vector2f v1, Vector2f v2)
static boolean isAvoidingPlayerHalfheartedly(CampaignFleetAPI fleet)
static boolean isSlowMoving(CampaignFleetAPI fleet)
CombatReadinessPlugin getCRPlugin()
CampaignFleetAIAPI getAI()
FleetDataAPI getFleetData()
MutableFleetStatsAPI getStats()
List< FleetMemberAPI > getMembersListCopy()
VisibilityLevel getVisibilityLevelTo(SectorEntityToken other)
float getMaxSensorRangeToDetect(SectorEntityToken other)
MemoryAPI getMemoryWithoutUpdate()
FleetAssignment getCurrentAssignmentType()
TacticalModulePlugin getTacticalModule()
boolean isMaintainingContact()
void set(String key, Object value)
boolean getBoolean(String key)
CampaignFleetAPI getFleet(String key)
boolean isActiveOrInProgress()
float getCriticalMalfunctionThreshold(MutableShipStatsAPI stats)
float getMalfunctionThreshold(MutableShipStatsAPI stats)
StatBonus getFleetwideMaxBurnMod()