001package com.fs.starfarer.api.impl.campaign.procgen.themes;
002
003import java.util.List;
004import java.util.Random;
005
006import org.lwjgl.util.vector.Vector2f;
007
008import com.fs.starfarer.api.Global;
009import com.fs.starfarer.api.campaign.CampaignFleetAPI;
010import com.fs.starfarer.api.campaign.FleetAssignment;
011import com.fs.starfarer.api.campaign.SectorEntityToken;
012import com.fs.starfarer.api.campaign.StarSystemAPI;
013import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
014import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.EncounterOption;
015import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData;
016import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment;
017import com.fs.starfarer.api.impl.campaign.ids.Factions;
018import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
019import com.fs.starfarer.api.util.IntervalUtil;
020import com.fs.starfarer.api.util.Misc;
021
022public class ScavengerFleetAssignmentAI extends RouteFleetAssignmentAI {
023
024        protected boolean pirate;
025        protected IntervalUtil piracyCheck = new IntervalUtil(0.2f, 0.4f);
026        public ScavengerFleetAssignmentAI(CampaignFleetAPI fleet, RouteData route, boolean pirate) {
027                super(fleet, route);
028                this.pirate = pirate;
029        }
030        
031        @Override
032        protected String getTravelActionText(RouteSegment segment) {
033                //if (segment.systemTo == route.getMarket().getContainingLocation()) {
034                if (segment.to == route.getMarket().getPrimaryEntity()) {
035                        return "returning to " + route.getMarket().getName();
036                }
037                return "on a salvage expedition";
038        }
039        
040        @Override
041        protected String getInSystemActionText(RouteSegment segment) {
042                return "exploring";
043        }
044
045
046        @Override
047        protected void addLocalAssignment(RouteSegment segment, boolean justSpawned) {
048                //boolean pickSpecificEntity = (float) Math.random() > 0.2f && segment.systemFrom instanceof StarSystemAPI;
049                boolean pickSpecificEntity = (float) Math.random() > 0.2f && !segment.from.getContainingLocation().isHyperspace();
050                if (pickSpecificEntity) {
051                        SectorEntityToken target = RemnantSeededFleetManager.pickEntityToGuard(new Random(), (StarSystemAPI) segment.from.getContainingLocation(), fleet);
052                        if (target != null) {
053                                if (justSpawned) {
054                                        Vector2f loc = Misc.getPointAtRadius(new Vector2f(target.getLocation()), 500);
055                                        fleet.setLocation(loc.x, loc.y);
056                                }
057                                
058                                float speed = Misc.getSpeedForBurnLevel(8);
059                                float dist = Misc.getDistance(fleet.getLocation(), target.getLocation());
060                                float seconds = dist / speed;
061                                float days = seconds / Global.getSector().getClock().getSecondsPerDay();
062                                days += 5f + 5f * (float) Math.random();
063                                fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, target, days, "investigating");
064                                return;
065                        } else {
066                                if (justSpawned) {
067                                        Vector2f loc = Misc.getPointAtRadius(new Vector2f(), 8000);
068                                        fleet.setLocation(loc.x, loc.y);
069                                }
070                                
071                                float days = 5f + 5f * (float) Math.random();
072                                fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, null, days, "exploring");
073                        }
074                } else {
075                        super.addLocalAssignment(segment, justSpawned);
076                }
077        }
078
079        
080        @Override
081        public void advance(float amount) {
082                super.advance(amount);
083                
084                if (pirate) {
085                        float days = Global.getSector().getClock().convertToDays(amount);
086                        piracyCheck.advance(days);
087                        if (piracyCheck.intervalElapsed()) {
088                                doPiracyCheck();
089                        }
090                }
091        }
092        
093        protected void doPiracyCheck() {
094                if (fleet.getBattle() != null) return;
095                
096                
097                boolean isCurrentlyPirate = fleet.getFaction().getId().equals(Factions.PIRATES);
098                
099                if (fleet.isTransponderOn() && !isCurrentlyPirate) {
100                        return;
101                }
102                
103                if (isCurrentlyPirate) {
104                        List<CampaignFleetAPI> visible = Misc.getVisibleFleets(fleet, false);
105                        if (visible.isEmpty()) {
106                                fleet.setFaction(Factions.INDEPENDENT, true);
107                                Misc.clearTarget(fleet, true);
108                        }
109                        return;
110                }
111                
112                List<CampaignFleetAPI> visible = Misc.getVisibleFleets(fleet, false);
113                if (visible.size() == 1) {
114                        int weakerCount = 0;
115                        for (CampaignFleetAPI other : visible) {
116                                if (fleet.getAI() != null && 
117                                                Global.getSector().getFaction(Factions.PIRATES).isHostileTo(other.getFaction())) {
118                                        EncounterOption option = fleet.getAI().pickEncounterOption(null, other, true);
119                                        if (option == EncounterOption.ENGAGE || option == EncounterOption.HOLD) {
120                                                float dist = Misc.getDistance(fleet.getLocation(), other.getLocation());
121                                                VisibilityLevel level = other.getVisibilityLevelTo(fleet);
122                                                boolean seesComp = level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS ||
123                                                                                   level == VisibilityLevel.COMPOSITION_DETAILS;
124                                                if (dist < 800f && seesComp) {
125                                                        weakerCount++;
126                                                }
127                                        }
128                                }
129                        }
130                
131                        if (weakerCount == 1) {
132                                fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PIRATE, true);
133                                fleet.setNoFactionInName(true);
134                                fleet.setFaction(Factions.PIRATES, true);
135                        }
136                }
137                
138        }
139        
140
141
142        
143        
144}
145
146
147
148
149
150
151
152
153
154