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 {
51 public String getTimeoutKey() {
52 return "$" + name() +
"_timeout";
58 public static WeightedRandomPicker<AbyssalDireHintType>
DIRE_HINT_TYPES =
new WeightedRandomPicker<AbyssalDireHintType>();
74 WeightedRandomPicker<AbyssalDireHintType> picker =
new WeightedRandomPicker<AbyssalDireHintType>(data.random);
77 UniqueEncounterData ueData = SharedData.getData().getUniqueEncounterData();
78 WeightedRandomPicker<GhostShipType> ghostShipPicker =
new WeightedRandomPicker<GhostShipType>(data.random);
79 for (GhostShipType type : EnumSet.allOf(GhostShipType.class)) {
80 if (ueData.wasInteractedWith(type.name())) {
83 if (
Global.
getSector().getMemoryWithoutUpdate().contains(type.getTimeoutKey())) {
86 ghostShipPicker.add(type);
89 if (ghostShipPicker.isEmpty()) {
90 picker.remove(AbyssalDireHintType.GHOST_SHIP);
94 picker.add(AbyssalDireHintType.GHOST_SHIP, 1000000000f);
99 AbyssalDireHintType type = picker.pickAndRemove();
105 if (type == AbyssalDireHintType.BLACK_HOLE_READINGS) {
107 }
else if (type == AbyssalDireHintType.GAS_GIANT_TURBULENCE) {
109 }
else if (type == AbyssalDireHintType.MINING_OP) {
111 }
else if (type == AbyssalDireHintType.GHOST_SHIP) {
112 GhostShipType ghostType = ghostShipPicker.pickAndRemove();
113 if (ghostType !=
null) {
117 }
while (!picker.isEmpty() && !done);
122 PlanetAPI blackHole =
null;
123 for (PlanetAPI planet : system.getPlanets()) {
124 if (planet.isBlackHole()) {
129 if (blackHole ==
null)
return false;
131 blackHole.getMemoryWithoutUpdate().set(
"$abyssalBlackHoleReadings",
true);
137 WeightedRandomPicker<PlanetAPI> picker =
new WeightedRandomPicker<PlanetAPI>(data.random);
138 for (PlanetAPI planet : system.getPlanets()) {
139 if (planet.isGasGiant()) {
143 PlanetAPI giant = picker.pick();
144 if (giant ==
null)
return false;
146 giant.getMemoryWithoutUpdate().set(
"$abyssalGasGiantTurbulence",
true);
152 WeightedRandomPicker<PlanetAPI> picker =
new WeightedRandomPicker<PlanetAPI>(data.random);
153 for (PlanetAPI planet : system.getPlanets()) {
154 if (planet.isGasGiant())
continue;
155 if (planet.isStar())
continue;
158 PlanetAPI giant = picker.pick();
159 if (giant ==
null)
return false;
161 giant.getMemoryWithoutUpdate().set(
"$abyssalPlanetoidMiningOp",
true);
167 WeightedRandomPicker<PlanetAPI> picker =
new WeightedRandomPicker<PlanetAPI>(data.random);
168 for (PlanetAPI planet : system.getPlanets()) {
171 PlanetAPI planet = picker.pick();
172 if (planet ==
null)
return false;
177 type = GhostShipType.GS_AI_CORES;
178 type = GhostShipType.GS_TRI_TACHYON;
179 type = GhostShipType.GS_ADVENTURERS;
180 type = GhostShipType.GS_OPIS;
181 type = GhostShipType.GS_PIRATES;
184 if (type == GhostShipType.GS_AI_CORES) {
185 String variantId =
pickVariant(Factions.INDEPENDENT, ShipRoles.COMBAT_LARGE, data.random);
186 if (variantId ==
null)
return false;
189 }
else if (type == GhostShipType.GS_TRI_TACHYON) {
190 addShipAroundPlanet(planet,
"apogee_Balanced", ShipCondition.GOOD, type.name(), data.random);
191 }
else if (type == GhostShipType.GS_ADVENTURERS) {
192 String variantId =
pickVariant(Factions.MERCENARY, ShipRoles.COMBAT_MEDIUM, data.random);
193 if (variantId ==
null)
return false;
195 }
else if (type == GhostShipType.GS_OPIS) {
196 addShipAroundPlanet(planet,
"starliner_Standard", ShipCondition.GOOD, type.name(), data.random);
197 }
else if (type == GhostShipType.GS_PIRATES) {
198 String variantId =
pickVariant(Factions.PIRATES, ShipRoles.COMBAT_LARGE, data.random);
199 if (variantId ==
null)
return false;
203 Global.
getSector().getMemoryWithoutUpdate().set(type.getTimeoutKey(),
true, 90f);
209 String gsType, Random random) {
210 PerShipData psd =
new PerShipData(variantId, condition, 0f);
211 DerelictShipData params =
new DerelictShipData(psd,
true);
213 CustomCampaignEntityAPI ship = (CustomCampaignEntityAPI) BaseThemeGenerator.addSalvageEntity(
214 random, planet.getContainingLocation(), Entities.WRECK, Factions.NEUTRAL, params);
218 ship.setDiscoverable(
true);
219 float orbitRadius = 200f + random.nextFloat() * 100f;
220 float orbitDays = orbitRadius / (10f + random.nextFloat() * 5f);
221 ship.setCircularOrbit(planet, random.nextFloat() * 360f, orbitRadius, orbitDays);
223 ship.setLocation(planet.getLocation().x, planet.getLocation().y);
224 ship.getVelocity().set(planet.getVelocity());
226 ship.getMemoryWithoutUpdate().set(
"$gsType", gsType);
229 public String
pickVariant(String factionId, String shipRole, Random random) {
230 ShipPickParams params =
new ShipPickParams(ShipPickMode.ALL);
231 List<ShipRolePick> picks =
Global.
getSector().getFaction(factionId).pickShip(shipRole, params,
null, random);
232 if (picks ==
null || picks.isEmpty())
return null;
233 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, Random random)
boolean addGhostShip(StarSystemAPI system, GhostShipType type, EncounterPoint point, AbyssalEPData data)