1package com.fs.starfarer.api.impl.campaign.enc;
3import java.util.EnumSet;
5import java.util.Random;
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
9import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
10import com.fs.starfarer.api.campaign.FactionAPI.ShipPickParams;
11import com.fs.starfarer.api.campaign.PlanetAPI;
12import com.fs.starfarer.api.campaign.SectorEntityToken;
13import com.fs.starfarer.api.campaign.StarSystemAPI;
14import com.fs.starfarer.api.fleet.ShipRolePick;
15import com.fs.starfarer.api.impl.campaign.DebugFlags;
16import com.fs.starfarer.api.impl.campaign.DerelictShipEntityPlugin.DerelictShipData;
17import com.fs.starfarer.api.impl.campaign.ids.Entities;
18import com.fs.starfarer.api.impl.campaign.ids.Factions;
19import com.fs.starfarer.api.impl.campaign.ids.ShipRoles;
20import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator;
21import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.ShipRecoverySpecial.PerShipData;
22import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.ShipRecoverySpecial.ShipCondition;
23import com.fs.starfarer.api.impl.campaign.shared.SharedData;
24import com.fs.starfarer.api.impl.campaign.shared.SharedData.UniqueEncounterData;
25import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceAbyssPluginImpl.AbyssalEPData;
26import com.fs.starfarer.api.util.WeightedRandomPicker;
30 public static enum AbyssalDireHintType {
44 public static enum GhostShipType {
55 public String getTimeoutKey() {
56 return "$" + name() +
"_timeout";
83 for (GhostShipType type : EnumSet.allOf(GhostShipType.class)) {
84 if (ueData.wasInteractedWith(type.name())) {
90 ghostShipPicker.
add(type);
93 if (ghostShipPicker.
isEmpty()) {
94 picker.
remove(AbyssalDireHintType.GHOST_SHIP);
98 picker.
add(AbyssalDireHintType.GHOST_SHIP, 1000000000f);
101 boolean done =
false;
109 if (type == AbyssalDireHintType.BLACK_HOLE_READINGS) {
111 }
else if (type == AbyssalDireHintType.GAS_GIANT_TURBULENCE) {
113 }
else if (type == AbyssalDireHintType.MINING_OP) {
115 }
else if (type == AbyssalDireHintType.GHOST_SHIP) {
117 if (ghostType !=
null) {
121 }
while (!picker.
isEmpty() && !done);
128 if (planet.isBlackHole()) {
133 if (blackHole ==
null)
return false;
143 if (planet.isGasGiant()) {
148 if (giant ==
null)
return false;
158 if (planet.isGasGiant())
continue;
159 if (planet.isStar())
continue;
163 if (giant ==
null)
return false;
176 if (planet ==
null)
return false;
181 type = GhostShipType.GS_AI_CORES;
182 type = GhostShipType.GS_TRI_TACHYON;
183 type = GhostShipType.GS_ADVENTURERS;
184 type = GhostShipType.GS_OPIS;
185 type = GhostShipType.GS_PIRATES;
186 type = GhostShipType.GS_ZGR_MERC;
187 type = GhostShipType.GS_ACADEMY;
188 type = GhostShipType.GS_VAMBRACE;
192 if (type == GhostShipType.GS_AI_CORES) {
194 if (variantId ==
null)
return false;
196 }
else if (type == GhostShipType.GS_TRI_TACHYON) {
197 addShipAroundPlanet(planet,
"apogee_Balanced", ShipCondition.GOOD, type.name(), data.random);
198 }
else if (type == GhostShipType.GS_ADVENTURERS) {
200 if (variantId ==
null)
return false;
202 }
else if (type == GhostShipType.GS_OPIS) {
203 addShipAroundPlanet(planet,
"starliner_Standard", ShipCondition.GOOD, type.name(), data.random);
204 }
else if (type == GhostShipType.GS_PIRATES) {
206 if (variantId ==
null)
return false;
208 }
else if (type == GhostShipType.GS_ACADEMY) {
209 addShipAroundPlanet(planet,
"apogee_Balanced", ShipCondition.BATTERED, type.name(),
"GAS Itzamna", data.random);
210 }
else if (type == GhostShipType.GS_ZGR_MERC) {
212 if (variantId ==
null)
return false;
214 }
else if (type == GhostShipType.GS_VAMBRACE) {
217 float orbitRadius = planet.
getRadius() + data.random.nextFloat() * 100f;
218 float orbitDays = orbitRadius / (10f + data.random.nextFloat() * 5f);
219 vambrace.
setCircularOrbit(planet, data.random.nextFloat() * 360f, orbitRadius, orbitDays);
231 String gsType, Random random) {
235 String gsType, String shipName, Random random) {
236 PerShipData psd =
new PerShipData(variantId, condition, 0f);
237 if (shipName !=
null) {
238 psd.shipName = shipName;
239 psd.nameAlwaysKnown =
true;
241 DerelictShipData params =
new DerelictShipData(psd,
true);
249 float orbitRadius = planet.
getRadius() + 200f + random.nextFloat() * 100f;
250 float orbitDays = orbitRadius / (10f + random.nextFloat() * 5f);
251 ship.
setCircularOrbit(planet, random.nextFloat() * 360f, orbitRadius, orbitDays);
259 public String
pickVariant(String factionId, String shipRole, Random random) {
260 ShipPickParams params =
new ShipPickParams(ShipPickMode.ALL);
262 if (picks ==
null || picks.isEmpty())
return null;
263 return picks.get(0).variantId;
static SectorAPI getSector()
static boolean ABYSSAL_GHOST_SHIPS_DEBUG
static float getAbyssalRogueStellarObjectDireHintsFrequency(EncounterManager manager, EncounterPoint point)
boolean addMiningOp(StarSystemAPI system, EncounterPoint point, AbyssalEPData data)
static WeightedRandomPicker< AbyssalDireHintType > DIRE_HINT_TYPES
String pickVariant(String factionId, String shipRole, Random random)
boolean addGasGiantTurbulence(StarSystemAPI system, EncounterPoint point, AbyssalEPData data)
float getFrequencyForPoint(EncounterManager manager, EncounterPoint point)
boolean addBlackHoleReadings(StarSystemAPI system, EncounterPoint point, AbyssalEPData data)
void addSpecials(StarSystemAPI system, EncounterManager manager, EncounterPoint point, AbyssalEPData data)
void addShipAroundPlanet(SectorEntityToken planet, String variantId, ShipCondition condition, String gsType, String shipName, Random random)
void addShipAroundPlanet(SectorEntityToken planet, String variantId, ShipCondition condition, String gsType, Random random)
boolean addGhostShip(StarSystemAPI system, GhostShipType type, EncounterPoint point, AbyssalEPData data)
static final String WRECK
static final String NEUTRAL
static final String MERCENARY
static final String PIRATES
static final String INDEPENDENT
static final String COMBAT_LARGE
static final String COMBAT_MEDIUM
static SectorEntityToken addSalvageEntity(LocationAPI location, String id, String faction)
UniqueEncounterData getUniqueEncounterData()
static SharedData getData()
void addAll(Collection< T > items)
List< ShipRolePick > pickShip(String role, ShipPickParams params)
List< PlanetAPI > getPlanets()
CustomCampaignEntityAPI addCustomEntity(String id, String name, String type, String factionId)
FactionAPI getFaction(String factionId)
MemoryAPI getMemoryWithoutUpdate()
LocationAPI getContainingLocation()
void setCircularOrbit(SectorEntityToken focus, float angle, float orbitRadius, float orbitDays)
void setDiscoverable(Boolean discoverable)
void setLocation(float x, float y)
MemoryAPI getMemoryWithoutUpdate()
boolean contains(String key)
void set(String key, Object value)