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