001package com.fs.starfarer.api.impl.campaign.procgen.themes;
002
003import java.util.List;
004
005import com.fs.starfarer.api.EveryFrameScript;
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.CampaignFleetAPI;
008import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
009import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.EncounterOption;
010import com.fs.starfarer.api.impl.campaign.ids.Factions;
011import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
012import com.fs.starfarer.api.util.IntervalUtil;
013import com.fs.starfarer.api.util.Misc;
014
015public class ScavengerPiracyScript implements EveryFrameScript {
016
017        protected IntervalUtil piracyCheck = new IntervalUtil(0.2f, 0.4f);
018        protected CampaignFleetAPI fleet;
019        public ScavengerPiracyScript(CampaignFleetAPI fleet) {
020                this.fleet = fleet;
021        }
022        
023        public void advance(float amount) {
024                float days = Global.getSector().getClock().convertToDays(amount);
025                piracyCheck.advance(days);
026                if (piracyCheck.intervalElapsed()) {
027                        doPiracyCheck();
028                }
029        }
030        
031        protected void doPiracyCheck() {
032                if (fleet.getBattle() != null) return;
033                
034                
035                boolean isCurrentlyPirate = fleet.getFaction().getId().equals(Factions.PIRATES);
036                
037                if (fleet.isTransponderOn() && !isCurrentlyPirate) {
038                        return;
039                }
040                
041                if (isCurrentlyPirate) {
042                        List<CampaignFleetAPI> visible = Misc.getVisibleFleets(fleet, false);
043                        if (visible.isEmpty()) {
044                                fleet.setFaction(Factions.INDEPENDENT, true);
045                                Misc.clearTarget(fleet, true);
046                        }
047                        return;
048                }
049                
050                List<CampaignFleetAPI> visible = Misc.getVisibleFleets(fleet, false);
051                if (visible.size() == 1) {
052                        int weakerCount = 0;
053                        for (CampaignFleetAPI other : visible) {
054                                if (fleet.getAI() != null && 
055                                                Global.getSector().getFaction(Factions.PIRATES).isHostileTo(other.getFaction())) {
056                                        EncounterOption option = fleet.getAI().pickEncounterOption(null, other, true);
057                                        if (option == EncounterOption.ENGAGE || option == EncounterOption.HOLD) {
058                                                float dist = Misc.getDistance(fleet.getLocation(), other.getLocation());
059                                                VisibilityLevel level = other.getVisibilityLevelTo(fleet);
060                                                boolean seesComp = level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS ||
061                                                                                   level == VisibilityLevel.COMPOSITION_DETAILS;
062                                                if (dist < 800f && seesComp) {
063                                                        weakerCount++;
064                                                }
065                                        }
066                                }
067                        }
068                
069                        if (weakerCount == 1) {
070                                fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PIRATE, true);
071                                fleet.setNoFactionInName(true);
072                                fleet.setFaction(Factions.PIRATES, true);
073                        }
074                }
075                
076        }
077
078        public boolean isDone() {
079                return false;
080        }
081
082        public boolean runWhilePaused() {
083                return false;
084        }
085        
086
087
088        
089        
090}
091
092
093
094
095
096
097
098
099
100