001package com.fs.starfarer.api.impl.campaign.velfield;
002
003import java.util.Iterator;
004import java.util.List;
005
006import org.lwjgl.util.vector.Vector2f;
007
008import com.fs.starfarer.api.Global;
009import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
010import com.fs.starfarer.api.campaign.CoreUITabId;
011import com.fs.starfarer.api.campaign.econ.MarketAPI;
012import com.fs.starfarer.api.campaign.listeners.CoreUITabListener;
013import com.fs.starfarer.api.impl.campaign.ids.Stats;
014import com.fs.starfarer.api.impl.campaign.intel.events.ht.HyperspaceTopographyEventIntel;
015import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamManager.CustomStreamRevealer;
016import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2.SlipstreamSegment;
017import com.fs.starfarer.api.util.CollisionGridUtil;
018import com.fs.starfarer.api.util.Misc;
019
020public class SlipstreamVisibilityManager implements CoreUITabListener {
021        
022//      public static String KEY = "$svm_ref";
023//      
024//      protected transient CollisionGridUtil grid;
025//      protected IntervalUtil interval = new IntervalUtil(1f, 2f);
026//      protected Random random = new Random();
027//      
028//      public static SlipstreamVisibilityManager get() {
029//              return (SlipstreamVisibilityManager) Global.getSector().getMemoryWithoutUpdate().get(KEY);
030//      }
031//      
032//      public SlipstreamVisibilityManager() {
033//              Global.getSector().getMemoryWithoutUpdate().set(KEY, this);
034//      }
035//      
036//      protected Object readResolve() {
037//              return this;
038//      }
039        
040        public void reportAboutToOpenCoreTab(CoreUITabId tab, Object param) {
041                if (tab == CoreUITabId.MAP) {
042                        
043                        HyperspaceTopographyEventIntel intel = HyperspaceTopographyEventIntel.get();
044                        if (intel != null) {
045                                intel.updateMarketDetectionRanges();
046                        }
047                        //System.out.println("OPENING MAP");
048                        //for (int i = 0; i < 100; i++) {
049                                updateSlipstreamVisibility(null, 0f);
050                        //}
051                }
052        }
053        
054        public static void updateSlipstreamVisibility(Vector2f extraPoint, float extraRangeLY) {
055                float sw = Global.getSettings().getFloat("sectorWidth");
056                float sh = Global.getSettings().getFloat("sectorHeight");
057                float minCellSize = 12000f;
058                float cellSize = Math.max(minCellSize, sw * 0.05f);
059                
060                CollisionGridUtil grid = new CollisionGridUtil(-sw/2f, sw/2f, -sh/2f, sh/2f, cellSize);
061                
062                for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
063                        if (market.isHidden()) continue;
064                        if (market.getContainingLocation() == null) continue;
065                        if (!market.isPlayerOwned()) continue;
066                        
067                        float range = market.getStats().getDynamic().getMod(Stats.SLIPSTREAM_REVEAL_RANGE_LY_MOD).computeEffective(0f);
068                        range *= Misc.getUnitsPerLightYear();
069                        if (range <= 0) continue;
070                        
071//                      Industry spaceport = market.getIndustry(Industries.SPACEPORT);
072//                      if (spaceport == null || !spaceport.isFunctional()) continue;
073                        
074                        Vector2f loc = market.getLocationInHyperspace();
075                        CustomStreamRevealer revealer = new CustomStreamRevealer(loc, range);
076                        grid.addObject(revealer, loc, range * 2f, range * 2f);
077                }
078                
079                if (extraPoint != null && extraRangeLY > 0) {
080                        float range = extraRangeLY * Misc.getUnitsPerLightYear();
081                        CustomStreamRevealer revealer = new CustomStreamRevealer(extraPoint, range);
082                        grid.addObject(revealer, extraPoint, range * 2f, range * 2f);
083                }
084                
085                //System.out.println("BEGIN");
086                float maxDist = 0f;
087                List<CampaignTerrainAPI> terrainList = Global.getSector().getHyperspace().getTerrainCopy();
088                for (CampaignTerrainAPI terrain : terrainList) {
089                        if (terrain.getPlugin() instanceof SlipstreamTerrainPlugin2) {
090                                //System.out.println("Processing: " + terrain.getId());
091                                SlipstreamTerrainPlugin2 stream = (SlipstreamTerrainPlugin2) terrain.getPlugin();
092                                if (stream.isDynamic()) continue;
093                                
094                                for (SlipstreamSegment curr : stream.getSegments()) {
095                                        if (curr.discovered) continue;
096                                        Iterator<Object> iter = grid.getCheckIterator(curr.loc, curr.width / 2f, curr.width / 2f);
097                                        //Iterator<Object> iter = grid.getCheckIterator(curr.loc, 100f, 100f);
098                                        while (iter.hasNext()) {
099                                                Object obj = iter.next();
100                                                if (obj instanceof CustomStreamRevealer) {
101                                                        CustomStreamRevealer rev = (CustomStreamRevealer) obj;
102                                                        Vector2f loc = rev.loc;
103                                                        float radius = rev.radius;
104                                                        
105                                                        float dist = Misc.getDistance(loc, curr.loc);
106                                                        if (dist > maxDist) {
107                                                                maxDist = dist;
108//                                                              if (dist >= 32500) {
109//                                                                      System.out.println("Rev loc: " + rev.loc);
110//                                                                      //grid.getCheckIterator(curr.loc, 100f, 100f);
111//                                                              }
112                                                        }
113                                                        if (dist < radius) {
114                                                                curr.discovered = true;
115                                                                break;
116                                                        }
117                                                }
118                                        }
119                                }
120                                //break;
121                        }
122                }
123        }       
124        
125        
126}