001package com.fs.starfarer.api.impl.campaign.ghosts;
002
003import org.lwjgl.util.vector.Vector2f;
004
005import com.fs.starfarer.api.Global;
006import com.fs.starfarer.api.fleet.FleetMemberAPI;
007import com.fs.starfarer.api.impl.campaign.ghosts.types.NoGhostCreator;
008import com.fs.starfarer.api.impl.campaign.ghosts.types.ZigguratGhost;
009import com.fs.starfarer.api.util.Misc;
010
011public class GhostFrequencies {
012        public static String ZIGGURAT = "ziggurat";
013
014        public static float getNoGhostFrequency(SensorGhostManager manager) {
015                if (manager.isSpawnTriggeredBySensorBurst()) return 0f;
016                
017                float total = 0f;
018                for (SensorGhostCreator c : SensorGhostManager.CREATORS) {
019                        if (!(c instanceof NoGhostCreator)) {
020                                float f = c.getFrequency(manager);
021                                //System.out.println(c.getClass().getSimpleName() + ": " + f);
022                                total += f; 
023                        }
024                }
025                float mult = 0.5f + getCoreFactor() * 5f;
026                return Math.max(10f, total) * mult;
027                //return 10f;
028        }
029        public static float getAbyssalDrifterFrequency(SensorGhostManager manager) {
030                return 30;
031        }
032        public static float getChargerFrequency(SensorGhostManager manager) {
033                return 10f * getNotInCoreFactor() * getSBFactor(manager, 1f, 2f);
034        }
035        public static float getEncounterTricksterFrequency(SensorGhostManager manager) {
036                return 10f * getNotInCoreFactor() * (0.5f + 0.5f * getFringeFactor()) * getSBFactor(manager, 1f, 2f);
037        }
038        public static float getEchoFrequency(SensorGhostManager manager) {
039                return 5f * getSBFactor(manager, 1f, 5f);
040        }
041        public static float getGuideFrequency(SensorGhostManager manager) {
042                return 10f * getNotInCoreFactor() * getSBFactor(manager, 1f, 2f);
043        }
044        public static float getLeviathanCalfFrequency(SensorGhostManager manager) {
045                return 5f * (getNotInCoreFactor() + getFringeFactor()) * getSBFactor(manager, 1f, 0f);
046        }
047        public static float getLeviathanFrequency(SensorGhostManager manager) {
048                return 5f * (getNotInCoreFactor() + getFringeFactor()) * getSBFactor(manager, 1f, 0f);
049        }
050        public static float getMinnowFrequency(SensorGhostManager manager) {
051                return 10f * getNotInCoreFactor() * (0.5f + 0.5f * getFringeFactor()) * getSBFactor(manager, 1f, 0f);
052        }
053        public static float getRacerFrequency(SensorGhostManager manager) {
054                return 10f * getNotInCoreFactor();
055        }
056        public static float getRemnantFrequency(SensorGhostManager manager) {
057                return 1f * getFringeFactor();
058        }
059        public static float getRemoraFrequency(SensorGhostManager manager) {
060                return 10f * getNotInCoreFactor() * (0.25f + 0.75f * getFringeFactor()) * getSBFactor(manager, 1f, 4f);
061        }
062        public static float getShipFrequency(SensorGhostManager manager) {
063                return 2f * getFringeFactor();
064        }
065        public static float getStormcallerFrequency(SensorGhostManager manager) {
066                return 5f * getNotInCoreFactor() * (0.5f + 0.5f * getFringeFactor()) * getSBFactor(manager, 1f, 0f);
067        }
068        public static float getStormTricksterFrequency(SensorGhostManager manager) {
069                return 5f * getNotInCoreFactor() * (0.25f + 0.75f * getFringeFactor()) * getSBFactor(manager, 1f, 2f);
070        }
071        public static float getZigguratFrequency(SensorGhostManager manager) {
072                if (manager.hasGhostOfClass(ZigguratGhost.class)) {
073                        return 0f;
074                }
075                String id = ZIGGURAT;
076                boolean found = false;
077                for (FleetMemberAPI member : Global.getSector().getPlayerFleet().getFleetData().getMembersListCopy()) {
078                        if (member.getHullSpec().getBaseHullId().equals(id)) {
079                                found = true;
080                                break;
081                        }
082                }
083                if (!found) return 0f;
084                return 10000f;
085        }
086        
087        
088        
089        
090        public static float getFringeFactor() {
091                Vector2f loc = Global.getSector().getPlayerFleet().getLocationInHyperspace();
092                float sw = Global.getSettings().getFloat("sectorWidth");
093                float sh = Global.getSettings().getFloat("sectorHeight");
094                float f = 0.8f;
095                float a = sw * 0.5f * f;
096                float b = sh * 0.5f * f;
097                float x = loc.x;
098                float y = loc.y;
099                
100                float test = (x * x) / (a * a) + (y * y)/ (b * b);
101                //System.out.println("Test: " + test);
102                float result = 0f;
103                if (test >= 1f) {
104                        result = 1f;
105                } else if (test <= 0.75f) {
106                        result = 0f;
107                } else {
108                        result = (test - 0.75f) / 0.25f;
109                }
110                return result;
111        }
112        
113        public static float getSBFactor(SensorGhostManager manager, float factorIfNoBurst, float factorIfBurst) {
114                if (manager.isSpawnTriggeredBySensorBurst()) return factorIfBurst;
115                return factorIfNoBurst;
116        }
117        
118        public static boolean isInsideCore() {
119                return getCoreFactor() >= 1f;
120        }
121        
122        public static float getNotInFringeFactor() {
123                return 1f - getFringeFactor();
124        }
125        
126        public static float getNotInCoreFactor() {
127                return 1f - getCoreFactor();
128        }
129        public static float getCoreFactor() {
130                Vector2f loc = Global.getSector().getPlayerFleet().getLocationInHyperspace();
131                
132                Vector2f min = Misc.getCoreMin();
133                Vector2f max = Misc.getCoreMax();
134                Vector2f center = Misc.getCoreCenter();
135                
136                float f = 1.4f;
137                float a = (max.x - min.x) * 0.5f * f;
138                float b = (max.y - min.y) * 0.5f * f;
139                float x = loc.x - center.x;
140                float y = loc.y - center.y;
141                
142                float test = (x * x) / (a * a) + (y * y)/ (b * b);
143                //System.out.println("Test: " + test);
144                float result = 0f;
145                if (test >= 1f) {
146                        result = 0f;
147                } else if (test <= 0.75f) {
148                        result = 1f;
149                } else {
150                        result = 1f - (test - 0.75f) / 0.25f;
151                }
152                return result;
153        }
154        
155}
156
157
158
159
160
161
162
163
164
165