1package com.fs.starfarer.api.impl.campaign.abilities;
5import com.fs.starfarer.api.EveryFrameScript;
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.BattleAPI;
8import com.fs.starfarer.api.campaign.CampaignFleetAPI;
9import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
10import com.fs.starfarer.api.campaign.ai.FleetAIFlags;
11import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
12import com.fs.starfarer.api.campaign.econ.MarketAPI;
13import com.fs.starfarer.api.campaign.rules.MemoryAPI;
14import com.fs.starfarer.api.characters.AbilityPlugin;
15import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActionEnvelope;
16import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
17import com.fs.starfarer.api.impl.campaign.ids.Abilities;
18import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
19import com.fs.starfarer.api.impl.campaign.ids.Pings;
20import com.fs.starfarer.api.loading.CampaignPingSpec;
21import com.fs.starfarer.api.ui.LabelAPI;
22import com.fs.starfarer.api.ui.TooltipMakerAPI;
23import com.fs.starfarer.api.util.Misc;
42 this.activationDays = activationDays;
43 delay = 0.3f + 0.3f * (float) Math.random();
46 public void advance(
float amount) {
50 if (delay > 0)
return;
53 if (
level == VisibilityLevel.NONE ||
level == VisibilityLevel.SENSOR_CONTACT) {
67 float eta = dist / speed;
70 rushTime += 0.5f + 0.5f * (float) Math.random();
75 if (eta < rushTime && pursueTarget == fleet) {
81 float getAwayTime = 1f + (range - dist) / speed;
83 if (getAwayTime > rushTime && sb !=
null && sb.isUsable() && (
float) Math.random() > 0.67f) {
90 float avoidRange =
getRange(other) + 100f;
92 fleet.
getLocation(), avoidRange, avoidRange + 50f, activationDays + 0.01f);
101 public boolean isDone() {
104 public boolean runWhilePaused() {
131 return "Interdiction pulse";
142 if (fleet ==
null)
return;
148 if (other == fleet)
continue;
151 if (dist > range + 500f)
continue;
162 if (fleet ==
null)
return;
165 if (vis == VisibilityLevel.NONE || vis == VisibilityLevel.SENSOR_CONTACT)
return;
168 boolean fire =
false;
202 if (fleet ==
null)
return;
244 if (other == fleet)
continue;
245 if (other.getFaction() == fleet.
getFaction())
continue;
246 if (other.isInHyperspaceTransition())
continue;
249 if (dist > range)
continue;
253 if (interdictSeconds > 0 && interdictSeconds < 1f) interdictSeconds = 1f;
255 VisibilityLevel vis = other.getVisibilityLevelToPlayerFleet();
256 if (vis == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS ||
257 vis == VisibilityLevel.COMPOSITION_DETAILS ||
258 (vis == VisibilityLevel.SENSOR_CONTACT && fleet.
isPlayerFleet())) {
259 if (interdictSeconds <= 0) {
263 other.addFloatingText(
"Interdict! (" + (
int) Math.round(interdictSeconds) +
"s)" , fleet.
getFaction().
getBaseUIColor(), 1f,
true);
269 for (
AbilityPlugin ability : other.getAbilities().values()) {
274 float origCooldown = ability.getCooldownLeft();
276 if (ability.isActiveOrInProgress()) {
277 extra += ability.getSpec().getDeactivationCooldown() * ability.getProgressFraction();
278 ability.deactivate();
284 float cooldown = interdictDays;
286 cooldown += origCooldown;
288 float max = Math.max(ability.getSpec().getDeactivationCooldown(), 2f);
289 if (cooldown > max) cooldown = max;
290 ability.setCooldownLeft(cooldown);
295 new RepActionEnvelope(RepActions.INTERDICTED,
null,
null,
false),
296 other.getFaction().getId());
315 float diff = offense - defense;
320 if (total < 0f) total = 0f;
351 if (fleet ==
null)
return;
365 return super.isUsable() &&
403 if (fleet ==
null)
return;
421 tooltip.
addPara(
"Slows* the fleet and uses its active sensor network to charge and release a powerful energy pulse that " +
422 "can disrupt the drive fields of nearby fleets.", pad);
425 Color hc = highlight;
427 tooltip.
addPara(
"The disruption interrupts any movement-related abilities (such as %s or %s) " +
428 "and prevents their use for some time afterwards. Also interrupts charging interdiction pulses.", pad,
429 hc,
"Sustained Burn",
"Emergency Burn");
431 tooltip.
addPara(
"The disruption lasts for %s seconds, modified by %s second for " +
432 "every %s points of difference in the fleets' sensor strengths.", pad, highlight,
437 tooltip.
addPara(
"Base range of %s* units, increased by half your fleet's sensor strength, " +
438 "for a total of %s units. While the pulse is charging, the range at which the fleet can be detected will " +
439 "gradually increase by up to %s.", pad, highlight,
444 tooltip.
addPara(
"A successful interdict is considered a hostile act, though not on the same level as " +
445 "open warfare.", pad);
447 tooltip.
addPara(
"*2000 units = 1 map grid cell", gray, pad);
448 tooltip.
addPara(
"*A fleet is considered slow-moving at a burn level of half that of its slowest ship.", gray, pad);
459 if (engagedInHostilities) {
static SettingsAPI getSettings()
static boolean CODEX_TOOLTIP_MODE
static SoundPlayerAPI getSoundPlayer()
static SectorAPI getSector()
static final String PURSUIT_TARGET
void modifyPercent(String source, float value)
float computeEffective(float baseValue)
CampaignFleetAPI getFleet()
float getActivationDays()
void addIncompatibleToTooltip(TooltipMakerAPI tooltip, boolean expanded)
static final float STRENGTH_PER_SECOND
void showRangePing(float amount)
static final float BASE_SECONDS
void createTooltip(TooltipMakerAPI tooltip, boolean expanded)
static float getInterdictSeconds(CampaignFleetAPI fleet, CampaignFleetAPI other)
static float getRange(CampaignFleetAPI fleet)
String getActivationText()
static final float DETECTABILITY_PERCENT
static final float MAX_EFFECT
void fleetOpenedMarket(MarketAPI market)
static final float BASE_RANGE
void applyEffect(float amount, float level)
void fleetLeftBattle(BattleAPI battle, boolean engagedInHostilities)
static final String SENSOR_BURST
static final String INTERDICTION_PULSE
static final String TAG_BURN
static final String TAG_DISABLED_BY_INTERDICT
static final String GLOBAL_INTERDICTION_PULSE_JUST_USED_IN_CURRENT_LOCATION
static final String JUST_DID_INTERDICTION_PULSE
static final String INTERDICT
void setAlphaMult(float alphaMult)
void setDuration(float duration)
void setInFraction(float inFraction)
void setRange(float range)
void setUseFactionColor(boolean useFactionColor)
void setMinRange(float minRange)
void setWidth(float width)
static Color getNegativeHighlightColor()
static Color getBasePlayerColor()
static Color getGrayColor()
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static Color getHighlightColor()
static Color getTooltipTitleAndLightHighlightColor()
static Vector2f getPointAtRadius(Vector2f from, float r)
Color getColor(String id)
SoundAPI playSound(String id, float pitch, float volume, Vector2f loc, Vector2f vel)
LocationAPI getContainingLocation()
CampaignFleetAIAPI getAI()
void goSlowOneFrame(boolean stop)
MutableFleetStatsAPI getStats()
List< CampaignFleetAPI > getFleets()
ReputationAdjustmentResult adjustPlayerReputation(Object action, String factionId)
CampaignClockAPI getClock()
EveryFrameScript addPing(SectorEntityToken entity, String pingType)
MemoryAPI getMemoryWithoutUpdate()
boolean isInCurrentLocation()
StatBonus getSensorRangeMod()
VisibilityLevel getVisibilityLevelTo(SectorEntityToken other)
boolean isVisibleToPlayerFleet()
VisibilityLevel getVisibilityLevelToPlayerFleet()
float getSensorStrength()
MemoryAPI getMemoryWithoutUpdate()
AbilityPlugin getAbility(String id)
NavigationModulePlugin getNavModule()
void avoidLocation(LocationAPI containingLocation, Vector2f loc, float minRange, float maxRange, float duration)
void set(String key, Object value)
CampaignFleetAPI getFleet(String key)
StatBonus getDetectedRangeMod()