001package com.fs.starfarer.api.impl.campaign.abilities.ai;
002
003import com.fs.starfarer.api.campaign.CampaignFleetAPI;
004import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
005import com.fs.starfarer.api.campaign.ai.FleetAIFlags;
006import com.fs.starfarer.api.campaign.econ.MarketAPI;
007import com.fs.starfarer.api.campaign.rules.MemoryAPI;
008import com.fs.starfarer.api.impl.campaign.events.BaseEventPlugin.MarketFilter;
009import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
010import com.fs.starfarer.api.util.IntervalUtil;
011import com.fs.starfarer.api.util.Misc;
012
013public class SensorBurstAbilityAI extends BaseAbilityAI {
014
015        private IntervalUtil interval = new IntervalUtil(0.05f, 0.15f);
016
017//      public SensorBurstAbilityAI(AbilityPlugin ability, ModularFleetAIAPI ai) {
018//              super(ability, ai);
019//      }
020
021        public void advance(float days) {
022                interval.advance(days);
023                if (!interval.intervalElapsed()) return;
024                
025//              if (fleet.isInCurrentLocation()) {
026//                      ability.activate();
027//                      return;
028//              }
029                
030                MemoryAPI mem = fleet.getMemoryWithoutUpdate();
031                
032                if (ability.isActiveOrInProgress()) {
033                        mem.set(FleetAIFlags.HAS_SPEED_PENALTY, true, 0.2f);
034                        mem.set(FleetAIFlags.HAS_VISION_BONUS, true, 0.2f);
035                        mem.set(FleetAIFlags.HAS_HIGHER_DETECTABILITY, true, 0.2f);
036                        return;
037                }
038                
039                if (fleet.getOrbit() != null) {
040                        return;
041                }
042                
043                CampaignFleetAPI pursueTarget = mem.getFleet(FleetAIFlags.PURSUIT_TARGET);
044                CampaignFleetAPI fleeingFrom = mem.getFleet(FleetAIFlags.NEAREST_FLEEING_FROM);
045                
046                // being pursued: definitely not
047                if (fleeingFrom != null) {
048                        return;
049                }
050                
051                // pursuing an enemy, but can't see them anymore
052                if (pursueTarget != null) {
053                        VisibilityLevel level = pursueTarget.getVisibilityLevelTo(fleet);
054                        if (level != VisibilityLevel.NONE) return; // can already see them
055                        
056                        
057                        float daysUnseen = mem.getFloat(FleetAIFlags.DAYS_TARGET_UNSEEN);
058                        float prob = (daysUnseen - 1f) * 0.1f;
059                        //prob /= EmergencyBurnAbilityAI.AI_FREQUENCY_MULT;
060                        
061                        MarketAPI nearestMarket = Misc.findNearestLocalMarket(fleet, 1000000, new MarketFilter() {
062                                public boolean acceptMarket(MarketAPI market) {
063                                        return true;
064                                }
065                        });
066                        if (nearestMarket != null && nearestMarket.getFaction().isHostileTo(fleet.getFaction())) {
067                                prob *= 0.25f;
068                        }
069                        
070                        if (Math.random() < prob) {
071                                ability.activate();
072                        }
073                        
074                        return;
075                }
076                
077                boolean trader = mem.getBoolean(MemFlags.MEMORY_KEY_TRADE_FLEET);
078                boolean smuggler = mem.getBoolean(MemFlags.MEMORY_KEY_SMUGGLER);
079                if (trader || smuggler) {
080                        return;
081                }
082                
083                // not pursuing or being pursued, use now and again; more often if nearest market is friendly
084                MarketAPI nearestMarket = Misc.findNearestLocalMarket(fleet, 1000000, new MarketFilter() {
085                        public boolean acceptMarket(MarketAPI market) {
086                                return true;
087                        }
088                });
089                float prob = 0.01f;
090                if (nearestMarket != null && nearestMarket.getFaction().isHostileTo(fleet.getFaction())) {
091                        prob *= 0.25f;
092                }
093                if (Math.random() < prob) {
094                        ability.activate();
095                }
096        }
097}
098
099
100
101
102
103