001package com.fs.starfarer.api.impl.campaign.fleets;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import com.fs.starfarer.api.EveryFrameScript;
007import com.fs.starfarer.api.Global;
008import com.fs.starfarer.api.campaign.BattleAPI;
009import com.fs.starfarer.api.campaign.CampaignFleetAPI;
010import com.fs.starfarer.api.campaign.StarSystemAPI;
011import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
012import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
013import com.fs.starfarer.api.util.Misc;
014
015public abstract class SeededFleetManager implements FleetEventListener, EveryFrameScript{
016
017        public static float DESPAWN_PAD_LY = 1f;
018        
019        public static class SeededFleet {
020                public long seed;
021                public int points;
022                public CampaignFleetAPI fleet;
023        }
024        
025        protected List<SeededFleet> fleets = new ArrayList<SeededFleet>();
026        protected float inflateRangeLY = 5f;
027        protected StarSystemAPI system;
028        
029        public static boolean DEBUG = false;
030        
031        public SeededFleetManager(StarSystemAPI system, float inflateRangeLY) {
032                this.system = system;
033                this.inflateRangeLY = inflateRangeLY;
034        }
035        
036        public void addSeed(long seed) {
037                SeededFleet f = new SeededFleet();
038                f.seed = seed;
039                fleets.add(f);
040        }
041        
042        public float getInflateRangeLY() {
043                return inflateRangeLY;
044        }
045
046        public StarSystemAPI getSystem() {
047                return system;
048        }
049
050        protected abstract CampaignFleetAPI spawnFleet(long seed);
051
052        public void advance(float amount) {
053                CampaignFleetAPI player = Global.getSector().getPlayerFleet();
054                
055                float distFromSystem = Misc.getDistanceLY(player.getLocationInHyperspace(), system.getLocation());
056                if (distFromSystem < inflateRangeLY) {
057                        float index = 0f;
058                        for (SeededFleet curr : fleets) {
059                                float threshold = inflateRangeLY * (0.9f + 0.1f / fleets.size() * (index + 1f));
060                                if (distFromSystem < threshold) {
061                                        if (curr.fleet == null) {
062                                                curr.fleet = spawnFleet(curr.seed);
063                                                if (curr.fleet != null) {
064                                                        if (DEBUG) {
065                                                                System.out.println("Created " + curr.fleet.getName() + " (seed: " + curr.seed + ")");
066                                                                //System.out.println("  Portrait: " + curr.fleet.getCommander().getPortraitSprite());
067                                                        }
068                                                        curr.fleet.addEventListener(this);
069                                                        curr.points = curr.fleet.getFleetPoints();
070                                                }
071                                        }
072                                }
073                                index++;
074                        }
075                }
076                
077                for (SeededFleet curr : fleets) {
078                        if (curr.fleet != null) {
079                                float dist = Misc.getDistanceLY(player.getLocationInHyperspace(), curr.fleet.getLocationInHyperspace());
080                                if (dist > inflateRangeLY + DESPAWN_PAD_LY && curr.points == curr.fleet.getFleetPoints()) {
081                                        if (DEBUG) System.out.println("Despawned " + curr.fleet.getName() + " (seed: " + curr.seed + ")");
082                                        curr.fleet.despawn(FleetDespawnReason.PLAYER_FAR_AWAY, null);
083                                        curr.fleet = null;
084                                        curr.points = 0;
085                                }
086                        }
087                }
088        }
089
090        
091        
092        public boolean isDone() {
093                return fleets.isEmpty();
094        }
095
096        public boolean runWhilePaused() {
097                //return false;
098                return Global.getSettings().isDevMode();
099        }
100
101        
102        public void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param) {
103                if (reason == FleetDespawnReason.PLAYER_FAR_AWAY) return;
104                
105                for (SeededFleet curr : fleets) {
106                        if (curr.fleet != null && curr.fleet == fleet) {
107                                fleets.remove(curr);
108                                if (DEBUG) System.out.println("Removed " + curr.fleet.getName() + " (seed: " + curr.seed + "), remaiing: " + fleets.size());
109                                break;
110                        }
111                }
112        }
113        
114        public void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle) {
115                
116        }
117}
118
119
120
121