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