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