001package com.fs.starfarer.api.impl.campaign.procgen.themes;
002
003import java.util.Random;
004
005import org.lwjgl.util.vector.Vector2f;
006
007import com.fs.starfarer.api.EveryFrameScript;
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.util.Misc;
014
015public class RemnantAssignmentAI implements EveryFrameScript {
016
017        protected StarSystemAPI homeSystem;
018        protected CampaignFleetAPI fleet;
019        protected SectorEntityToken source;
020        
021        
022        public RemnantAssignmentAI(CampaignFleetAPI fleet, StarSystemAPI homeSystem, SectorEntityToken source) {
023                this.fleet = fleet;
024                this.homeSystem = homeSystem;
025                this.source = source;
026                
027                giveInitialAssignments();
028        }
029        
030        protected void giveInitialAssignments() {
031                boolean playerInSameLocation = fleet.getContainingLocation() == Global.getSector().getCurrentLocation();
032                
033                // launch from source if player is in-system, or sometimes
034                if ((playerInSameLocation || (float) Math.random() < 0.1f) && source != null) {
035                        fleet.setLocation(source.getLocation().x, source.getLocation().y);
036                        fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, source, 3f + (float) Math.random() * 2f);
037                } else {
038                        // start at random location
039                        SectorEntityToken target = RemnantSeededFleetManager.pickEntityToGuard(new Random(), homeSystem, fleet);
040                        if (target != null) {
041                                Vector2f loc = Misc.getPointAtRadius(target.getLocation(), target.getRadius() + 100f);
042                                fleet.setLocation(loc.x, loc.y);
043                        } else {
044                                Vector2f loc = Misc.getPointAtRadius(new Vector2f(), 5000f);
045                                fleet.setLocation(loc.x, loc.y);
046                        }
047                        pickNext();
048                }
049        }
050        
051        protected void pickNext() {
052                boolean standDown = source != null && (float) Math.random() < 0.2f;
053                if (!standDown) {
054                        SectorEntityToken target = RemnantSeededFleetManager.pickEntityToGuard(new Random(), homeSystem, fleet);
055                        if (target != null) {
056                                float speed = Misc.getSpeedForBurnLevel(8);
057                                float dist = Misc.getDistance(fleet.getLocation(), target.getLocation());
058                                float seconds = dist / speed;
059                                float days = seconds / Global.getSector().getClock().getSecondsPerDay();
060                                days += 5f + 5f * (float) Math.random();
061                                fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, target, days, "patrolling");
062                                return;
063                        } else {
064                                float days = 5f + 5f * (float) Math.random();
065                                fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, null, days, "patrolling");
066                        }
067                }
068                
069                if (source != null) {
070                        float dist = Misc.getDistance(fleet.getLocation(), source.getLocation());
071                        if (dist > 1000) {
072                                fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, source, 3f, "returning from patrol");
073                        } else {
074                                fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, source, 3f + (float) Math.random() * 2f, "standing down");
075                                fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, source, 5f);
076                        }
077                }
078                
079        }
080
081        public void advance(float amount) {
082                if (fleet.getCurrentAssignment() == null) {
083                        pickNext();
084                }
085        }
086
087        
088        
089        public boolean isDone() {
090                return false;
091        }
092
093        public boolean runWhilePaused() {
094                return false;
095        }
096        
097        
098
099}
100
101
102
103
104
105
106
107
108
109