Starsector API
Loading...
Searching...
No Matches
AbyssalRogueStellarObjectDireHintsEPEC.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.enc;
2
3import java.util.EnumSet;
4import java.util.List;
5import java.util.Random;
6
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;
27
29
30 public static enum AbyssalDireHintType {
31 MINING_OP,
32 GAS_GIANT_TURBULENCE,
33 BLACK_HOLE_READINGS,
34 GHOST_SHIP,
35 }
36
44 public static enum GhostShipType {
45 GS_AI_CORES,
46 GS_TRI_TACHYON,
47 GS_ADVENTURERS,
48 GS_OPIS,
49 GS_PIRATES;
50
51 public String getTimeoutKey() {
52 return "$" + name() + "_timeout";
53 }
54 }
55
56
57
58 public static WeightedRandomPicker<AbyssalDireHintType> DIRE_HINT_TYPES = new WeightedRandomPicker<AbyssalDireHintType>();
59 static {
60 DIRE_HINT_TYPES.add(AbyssalDireHintType.MINING_OP, 10f);
61 DIRE_HINT_TYPES.add(AbyssalDireHintType.GAS_GIANT_TURBULENCE, 10f);
62 DIRE_HINT_TYPES.add(AbyssalDireHintType.BLACK_HOLE_READINGS, 10f);
63 DIRE_HINT_TYPES.add(AbyssalDireHintType.GHOST_SHIP, 10f);
64 }
65
66
70
71
72 @Override
73 protected void addSpecials(StarSystemAPI system, EncounterManager manager, EncounterPoint point, AbyssalEPData data) {
74 WeightedRandomPicker<AbyssalDireHintType> picker = new WeightedRandomPicker<AbyssalDireHintType>(data.random);
75 picker.addAll(DIRE_HINT_TYPES);
76
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())) {
81 continue;
82 }
83 if (Global.getSector().getMemoryWithoutUpdate().contains(type.getTimeoutKey())) {
84 continue;
85 }
86 ghostShipPicker.add(type);
87 }
88
89 if (ghostShipPicker.isEmpty()) {
90 picker.remove(AbyssalDireHintType.GHOST_SHIP);
91 }
92
94 picker.add(AbyssalDireHintType.GHOST_SHIP, 1000000000f);
95 }
96
97 boolean done = false;
98 do {
99 AbyssalDireHintType type = picker.pickAndRemove();
100
101// type = AbyssalDireHintType.MINING_OP;
102// type = AbyssalDireHintType.GAS_GIANT_TURBULENCE;
103// type = AbyssalDireHintType.BLACK_HOLE_READINGS;
104
105 if (type == AbyssalDireHintType.BLACK_HOLE_READINGS) {
106 done = addBlackHoleReadings(system, point, data);
107 } else if (type == AbyssalDireHintType.GAS_GIANT_TURBULENCE) {
108 done = addGasGiantTurbulence(system, point, data);
109 } else if (type == AbyssalDireHintType.MINING_OP) {
110 done = addMiningOp(system, point, data);
111 } else if (type == AbyssalDireHintType.GHOST_SHIP) {
112 GhostShipType ghostType = ghostShipPicker.pickAndRemove();
113 if (ghostType != null) {
114 done = addGhostShip(system, ghostType, point, data);
115 }
116 }
117 } while (!picker.isEmpty() && !done);
118 }
119
120
121 protected boolean addBlackHoleReadings(StarSystemAPI system, EncounterPoint point, AbyssalEPData data) {
122 PlanetAPI blackHole = null;
123 for (PlanetAPI planet : system.getPlanets()) {
124 if (planet.isBlackHole()) {
125 blackHole = planet;
126 break;
127 }
128 }
129 if (blackHole == null) return false;
130
131 blackHole.getMemoryWithoutUpdate().set("$abyssalBlackHoleReadings", true);
132
133 return true;
134 }
135
136 protected boolean addGasGiantTurbulence(StarSystemAPI system, EncounterPoint point, AbyssalEPData data) {
137 WeightedRandomPicker<PlanetAPI> picker = new WeightedRandomPicker<PlanetAPI>(data.random);
138 for (PlanetAPI planet : system.getPlanets()) {
139 if (planet.isGasGiant()) {
140 picker.add(planet);
141 }
142 }
143 PlanetAPI giant = picker.pick();
144 if (giant == null) return false;
145
146 giant.getMemoryWithoutUpdate().set("$abyssalGasGiantTurbulence", true);
147
148 return true;
149 }
150
151 protected boolean addMiningOp(StarSystemAPI system, EncounterPoint point, AbyssalEPData data) {
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;
156 picker.add(planet);
157 }
158 PlanetAPI giant = picker.pick();
159 if (giant == null) return false;
160
161 giant.getMemoryWithoutUpdate().set("$abyssalPlanetoidMiningOp", true);
162
163 return true;
164 }
165
166 protected boolean addGhostShip(StarSystemAPI system, GhostShipType type, EncounterPoint point, AbyssalEPData data) {
167 WeightedRandomPicker<PlanetAPI> picker = new WeightedRandomPicker<PlanetAPI>(data.random);
168 for (PlanetAPI planet : system.getPlanets()) {
169 picker.add(planet);
170 }
171 PlanetAPI planet = picker.pick();
172 if (planet == null) return false;
173
174
175 //ship.getMemoryWithoutUpdate().set("$fromGhost", true);
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;
182 }
183
184 if (type == GhostShipType.GS_AI_CORES) {
185 String variantId = pickVariant(Factions.INDEPENDENT, ShipRoles.COMBAT_LARGE, data.random);
186 if (variantId == null) return false;
187
188 addShipAroundPlanet(planet, variantId, ShipCondition.GOOD, type.name(), data.random);
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;
194 addShipAroundPlanet(planet, variantId, ShipCondition.GOOD, type.name(), data.random);
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;
200 addShipAroundPlanet(planet, variantId, ShipCondition.BATTERED, type.name(), data.random);
201 }
202
203 Global.getSector().getMemoryWithoutUpdate().set(type.getTimeoutKey(), true, 90f);
204
205 return true;
206 }
207
208 public void addShipAroundPlanet(SectorEntityToken planet, String variantId, ShipCondition condition,
209 String gsType, Random random) {
210 PerShipData psd = new PerShipData(variantId, condition, 0f);
211 DerelictShipData params = new DerelictShipData(psd, true);
212
213 CustomCampaignEntityAPI ship = (CustomCampaignEntityAPI) BaseThemeGenerator.addSalvageEntity(
214 random, planet.getContainingLocation(), Entities.WRECK, Factions.NEUTRAL, params);
215 //SalvageSpecialAssigner.assignSpecials(ship, false, data.random);
216 //ship.addTag(Tags.EXPIRES);
217
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);
222
223 ship.setLocation(planet.getLocation().x, planet.getLocation().y);
224 ship.getVelocity().set(planet.getVelocity());
225
226 ship.getMemoryWithoutUpdate().set("$gsType", gsType);
227 }
228
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;
234
235 }
236}
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
static SectorAPI getSector()
Definition Global.java:59
static float getAbyssalRogueStellarObjectDireHintsFrequency(EncounterManager manager, EncounterPoint point)
boolean addMiningOp(StarSystemAPI system, EncounterPoint point, AbyssalEPData data)
boolean addGasGiantTurbulence(StarSystemAPI system, EncounterPoint point, AbyssalEPData data)
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)