1package com.fs.starfarer.api.impl.campaign.intel.events.ht;
3import java.util.LinkedHashSet;
5import com.fs.starfarer.api.EveryFrameScript;
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.CampaignFleetAPI;
8import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
9import com.fs.starfarer.api.campaign.PlanetAPI;
10import com.fs.starfarer.api.campaign.SectorEntityToken;
11import com.fs.starfarer.api.campaign.StarSystemAPI;
12import com.fs.starfarer.api.characters.AbilityPlugin;
13import com.fs.starfarer.api.impl.campaign.ids.Abilities;
14import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
15import com.fs.starfarer.api.impl.campaign.ids.Tags;
16import com.fs.starfarer.api.impl.campaign.ids.Terrain;
17import com.fs.starfarer.api.impl.campaign.terrain.PulsarBeamTerrainPlugin;
18import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaTerrainPlugin;
19import com.fs.starfarer.api.util.IntervalUtil;
20import com.fs.starfarer.api.util.Misc;
36 protected LinkedHashSet<String>
scanned =
new LinkedHashSet<String>();
40 scanned =
new LinkedHashSet<String>();
66 if (pf !=
null && pf.isInHyperspace()) {
67 float burn = pf.getCurrBurnLevel();
83 }
else if (burn > 30) {
86 f = (burn - 30) / 10f;
87 }
else if (burn > 20) {
90 f = (burn - 20) / 10f;
93 add = min + (max - min) * f;
101 if (pf.getMemoryWithoutUpdate().getBoolean(MemFlags.NO_HIGH_BURN_TOPOGRAPHY_READINGS)) {
113 int points = chunk * mult;
124 if (pf ==
null)
return;
125 AbilityPlugin sb = pf.getAbility(Abilities.SENSOR_BURST);
126 if (sb ==
null)
return;
128 if (sb.isUsable() || sb.getLevel() <= 0) {
132 if (
canCheckSB && !pf.isInHyperspace() && sb.isInProgress() && sb.getLevel() > 0.9f &&
133 !pf.getContainingLocation().hasTag(Tags.NO_TOPOGRAPHY_SCANS)) {
134 for (SectorEntityToken entity : pf.getContainingLocation().getAllEntities()) {
140 for (CampaignTerrainAPI terrain : pf.getContainingLocation().getTerrainCopy()) {
151 if (!(entity instanceof PlanetAPI))
return;
153 PlanetAPI planet = (PlanetAPI) entity;
154 if (!planet.getSpec().isBlackHole())
return;
157 float dist = Misc.getDistance(pf.getLocation(), entity.getLocation());
159 StarCoronaTerrainPlugin eventHorizon = Misc.getCoronaFor(planet);
160 if (eventHorizon ==
null)
return;
162 String id1 = planet.getId() +
"_1";
163 String id2 = planet.getId() +
"_2";
165 float closeRange = planet.getRadius() + 300f;
167 if (dist < closeRange) {
169 addMessage(
"Black hole already scanned at short range");
175 }
else if (eventHorizon.containsEntity(pf)) {
177 addMessage(
"Black hole already scanned at long range");
187 if (!(entity instanceof PlanetAPI))
return;
189 PlanetAPI planet = (PlanetAPI) entity;
190 if (!planet.isGasGiant())
return;
192 StarCoronaTerrainPlugin ionStorm = Misc.getCoronaFor(planet);
193 if (ionStorm ==
null)
return;
197 String
id = ionStorm.getEntity().getId();
199 if (ionStorm.containsEntity(pf)) {
211 if (terrain.getPlugin() ==
null)
return;
212 if (!Terrain.MAGNETIC_FIELD.equals(terrain.getType()))
return;
216 String
id = terrain.getId();
218 if (terrain.getPlugin().containsEntity(pf)) {
230 if (!(entity instanceof PlanetAPI))
return;
232 PlanetAPI planet = (PlanetAPI) entity;
233 if (!planet.isGasGiant())
return;
236 String
id = planet.getId();
238 float dist = Misc.getDistance(pf.getLocation(), entity.getLocation());
239 boolean inRange = dist < 500f + planet.getRadius();
253 StarSystemAPI system = pf.getStarSystem();
254 if (system ==
null)
return;
258 switch (system.getType()) {
260 type =
"Center of binary system";
264 type =
"Center of starless nebula";
267 case TRINARY_1CLOSE_1FAR:
268 type =
"Center of binary system";
272 type =
"Center of trinary system";
277 for (PlanetAPI curr : system.getPlanets()) {
278 if (!curr.isStar())
continue;
279 float dist = Misc.getDistance(curr.getLocation(), pf.getLocation());
280 if (dist < 2000 + curr.getRadius()) {
285 type =
"Stellar conflux";
294 if (type ==
null)
return;
296 String
id =
"systemtypescan_" + system.getId();
297 float range = pf.getLocation().length();
301 addMessage(
"Center of star system already scanned");
304 new HTScanFactor(type +
" scanned (" + system.getBaseName() +
")", points),
null);
311 if (!(entity instanceof PlanetAPI))
return;
313 PlanetAPI planet = (PlanetAPI) entity;
314 if (!planet.getSpec().isPulsar())
return;
318 StarCoronaTerrainPlugin corona = Misc.getCoronaFor(planet);
319 if (corona ==
null)
return;
321 PulsarBeamTerrainPlugin pulsar = Misc.getPulsarFor(planet);
322 if (pulsar ==
null)
return;
324 String id1 = planet.getId() +
"_1";
325 String id2 = planet.getId() +
"_2";
327 if (corona.containsEntity(pf)) {
337 if (pulsar.containsEntity(pf)) {
350 Global.
getSector().getCampaignUI().getMessageDisplay().addMessage(text +
", no new topographic data acquired", Misc.getNegativeHighlightColor());
static SectorAPI getSector()
void checkIonStorm(SectorEntityToken entity)
void checkHighBurn(float days)
void checkPulsar(SectorEntityToken entity)
void checkMagneticField(CampaignTerrainAPI terrain)
void checkBlackHole(SectorEntityToken entity)
void addMessage(String text)
void advance(float amount)
void checkGasGiant(SectorEntityToken entity)
LinkedHashSet< String > scanned
float daysSinceAtHighBurn
static int SCAN_BLACK_HOLE_LONG_RANGE
static int MAX_BURN_FOR_POINT_GAIN
static int PER_DAY_AT_BURN_50
static int SCAN_GAS_GIANT
static int PER_DAY_AT_BURN_20
static int BURN_POINT_CHUNK_SIZE
static int SCAN_PULSAR_BEAM
static int SCAN_MAGNETIC_FIELD
static int SCAN_ION_STORM
static int SCAN_BLACK_HOLE_SHORT_RANGE
static int PER_DAY_AT_BURN_40
static int SCAN_NEUTRON_STAR
static int PER_DAY_AT_BURN_30
static void addFactorCreateIfNecessary(EventFactor factor, InteractionDialogAPI dialog)