Starsector API
Loading...
Searching...
No Matches
SensorBurstAbilityAI.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.abilities.ai;
2
3import com.fs.starfarer.api.campaign.CampaignFleetAPI;
4import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
5import com.fs.starfarer.api.campaign.ai.FleetAIFlags;
6import com.fs.starfarer.api.campaign.econ.MarketAPI;
7import com.fs.starfarer.api.campaign.rules.MemoryAPI;
8import com.fs.starfarer.api.impl.campaign.events.BaseEventPlugin.MarketFilter;
9import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
10import com.fs.starfarer.api.util.IntervalUtil;
11import com.fs.starfarer.api.util.Misc;
12
13public class SensorBurstAbilityAI extends BaseAbilityAI {
14
15 private IntervalUtil interval = new IntervalUtil(0.05f, 0.15f);
16
17// public SensorBurstAbilityAI(AbilityPlugin ability, ModularFleetAIAPI ai) {
18// super(ability, ai);
19// }
20
21 public void advance(float days) {
22 interval.advance(days);
23 if (!interval.intervalElapsed()) return;
24
25 MemoryAPI mem = fleet.getMemoryWithoutUpdate();
26
27 if (ability.isActiveOrInProgress()) {
28 mem.set(FleetAIFlags.HAS_SPEED_PENALTY, true, 0.2f);
29 mem.set(FleetAIFlags.HAS_VISION_BONUS, true, 0.2f);
30 mem.set(FleetAIFlags.HAS_HIGHER_DETECTABILITY, true, 0.2f);
31 return;
32 }
33
34 if (fleet.getOrbit() != null) {
35 return;
36 }
37
38 CampaignFleetAPI pursueTarget = mem.getFleet(FleetAIFlags.PURSUIT_TARGET);
39 CampaignFleetAPI fleeingFrom = mem.getFleet(FleetAIFlags.NEAREST_FLEEING_FROM);
40
41 // being pursued: definitely not
42 if (fleeingFrom != null) {
43 return;
44 }
45
46 // pursuing an enemy, but can't see them anymore
47 if (pursueTarget != null) {
48 VisibilityLevel level = pursueTarget.getVisibilityLevelTo(fleet);
49 if (level != VisibilityLevel.NONE) return; // can already see them
50
51
52 float daysUnseen = mem.getFloat(FleetAIFlags.DAYS_TARGET_UNSEEN);
53 float prob = (daysUnseen - 1f) * 0.1f;
54 //prob /= EmergencyBurnAbilityAI.AI_FREQUENCY_MULT;
55
56 MarketAPI nearestMarket = Misc.findNearestLocalMarket(fleet, 1000000, new MarketFilter() {
57 public boolean acceptMarket(MarketAPI market) {
58 return true;
59 }
60 });
61 if (nearestMarket != null && nearestMarket.getFaction().isHostileTo(fleet.getFaction())) {
62 prob *= 0.25f;
63 }
64
65 if (Math.random() < prob) {
66 ability.activate();
67 }
68
69 return;
70 }
71
72 boolean trader = mem.getBoolean(MemFlags.MEMORY_KEY_TRADE_FLEET);
73 boolean smuggler = mem.getBoolean(MemFlags.MEMORY_KEY_SMUGGLER);
74 if (trader || smuggler) {
75 return;
76 }
77
78 // not pursuing or being pursued, use now and again; more often if nearest market is friendly
79 MarketAPI nearestMarket = Misc.findNearestLocalMarket(fleet, 1000000, new MarketFilter() {
80 public boolean acceptMarket(MarketAPI market) {
81 return true;
82 }
83 });
84 float prob = 0.01f;
85 if (nearestMarket != null && nearestMarket.getFaction().isHostileTo(fleet.getFaction())) {
86 prob *= 0.25f;
87 }
88 if (Math.random() < prob) {
89 ability.activate();
90 }
91 }
92}
93
94
95
96
97
98