Starsector API
Loading...
Searching...
No Matches
TransmitterTrapSpecial.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special;
2
3import org.lwjgl.util.vector.Vector2f;
4
5import com.fs.starfarer.api.Global;
6import com.fs.starfarer.api.campaign.CampaignFleetAPI;
7import com.fs.starfarer.api.campaign.FleetAssignment;
8import com.fs.starfarer.api.campaign.InteractionDialogAPI;
9import com.fs.starfarer.api.campaign.PlanetAPI;
10import com.fs.starfarer.api.campaign.SectorEntityToken;
11import com.fs.starfarer.api.campaign.ai.FleetAIFlags;
12import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
13import com.fs.starfarer.api.fleet.FleetMemberAPI;
14import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
15import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
16import com.fs.starfarer.api.impl.campaign.ids.Factions;
17import com.fs.starfarer.api.impl.campaign.ids.HullMods;
18import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
19import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantSeededFleetManager;
20import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageSpecialInteraction.SalvageSpecialData;
21import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageSpecialInteraction.SalvageSpecialPlugin;
22import com.fs.starfarer.api.util.Misc;
23
25
26
27 public static class TransmitterTrapSpecialData implements SalvageSpecialData {
28 public float prob = 0.5f;
29
30 public String fleetId;
31
32 public String nearbyFleetFaction = null;
33 public Boolean useClosestFleetInRange = null;
34 public Boolean useAllFleetsInRange = null;
35
36 public FleetParamsV3 params;
37
38 public float minRange = 2500;
39 public float maxRange = 5000;
40
41 public TransmitterTrapSpecialData() {
42 }
43
44 public TransmitterTrapSpecialData(FleetParamsV3 params) {
45 this.params = params;
46 }
47
48 public TransmitterTrapSpecialData(float prob, FleetParamsV3 params) {
49 this.prob = prob;
50 this.params = params;
51 }
52
53 public SalvageSpecialPlugin createSpecialPlugin() {
54 return new TransmitterTrapSpecial();
55 }
56 }
57
58 private TransmitterTrapSpecialData data;
59
61 }
62
63
64 @Override
65 public void init(InteractionDialogAPI dialog, Object specialData) {
66 super.init(dialog, specialData);
67
68 data = (TransmitterTrapSpecialData) specialData;
69
70 initEntityLocation();
71 }
72
73 private void initEntityLocation() {
74
75 if (random.nextFloat() > data.prob) {
76
77 if (random.nextFloat() > 0.5f) {
78 addText("Your salvage crews discover a transmitter set to send a signal when " +
79 "tripped by an alarm system, but it doesn't appear to be functional. " +
80 "Closer examination indicates it was probably set many cycles ago.");
81 } else {
82 addText("Your salvage crews discover a transmitter set to send a signal when " +
83 "tripped by an alarm system. The alarm went off as intended, but the transmitter " +
84 "was fried by a power surge before it could do its job.");
85 }
86
87 setDone(true);
89 setShowAgain(false);
90 return;
91 }
92
93 if (entity instanceof PlanetAPI) {
94 addText("As your salvage crews begin their work, a transmitter hidden somewhere planetside " +
95 "sends out an encrypted, broadwave signal. Whatever destination it's meant for, " +
96 "it has to be nearby.");
97 } else {
98 addText("As your salvage crews begin their work, a transmitter inside the $shortName " +
99 "sends out an encrypted, broadwave signal. Whatever destination it's meant for, " +
100 "it has to be nearby.");
101 }
102
104
105 setDone(true);
106 setEndWithContinue(true);
107 setShowAgain(false);
108 }
109
110
111 public void transmitterActivated() {
112 if (data == null) return;
113 if (entity == null) return;
114
115 if (data.fleetId != null) {
116 SectorEntityToken found = Global.getSector().getEntityById(data.fleetId);
117 if (found instanceof CampaignFleetAPI) {
118 CampaignFleetAPI fleet = (CampaignFleetAPI) found;
119 FleetMemberAPI flagship = fleet.getFlagship();
120 boolean makeAggressive = false;
121 if (flagship != null) {
122 makeAggressive = flagship.getVariant().hasHullMod(HullMods.AUTOMATED);
123 }
124 makeFleetInterceptPlayer(fleet, makeAggressive, true, 30f);
125 }
126 return;
127 }
128
129 if (data.useAllFleetsInRange != null && data.useAllFleetsInRange) {
130 boolean foundSomeFleets = false;
131 for (CampaignFleetAPI fleet : entity.getContainingLocation().getFleets()) {
132 if (data.nearbyFleetFaction != null &&
133 !data.nearbyFleetFaction.equals(fleet.getFaction().getId())) {
134 continue;
135 }
136
137 if (fleet.isStationMode()) continue;
138
139 if (fleet.getMemoryWithoutUpdate().is(MemFlags.MEMORY_KEY_TRADE_FLEET, true)) continue;
140
141 float dist = Misc.getDistance(fleet.getLocation(), entity.getLocation());
142 if (dist < data.maxRange) {
143 FleetMemberAPI flagship = fleet.getFlagship();
144 boolean makeAggressive = false;
145 if (flagship != null) {
146 makeAggressive = flagship.getVariant().hasHullMod(HullMods.AUTOMATED);
147 }
148 makeFleetInterceptPlayer(fleet, makeAggressive, true, 30f);
149 foundSomeFleets = true;
150 }
151 }
152 if (foundSomeFleets) return;
153 }
154
155 if (data.useClosestFleetInRange != null && data.useClosestFleetInRange) {
156 CampaignFleetAPI closest = null;
157 float minDist = Float.MAX_VALUE;
158 for (CampaignFleetAPI fleet : entity.getContainingLocation().getFleets()) {
159 if (data.nearbyFleetFaction != null &&
160 !data.nearbyFleetFaction.equals(fleet.getFaction().getId())) {
161 continue;
162 }
163
164 if (fleet.isStationMode()) continue;
165
166 if (fleet.getMemoryWithoutUpdate().is(MemFlags.MEMORY_KEY_TRADE_FLEET, true)) continue;
167
168 float dist = Misc.getDistance(fleet.getLocation(), entity.getLocation());
169 if (dist < data.maxRange && dist < minDist) {
170 closest = fleet;
171 minDist = dist;
172 }
173 }
174 if (closest != null) {
175 FleetMemberAPI flagship = closest.getFlagship();
176 boolean makeAggressive = false;
177 if (flagship != null) {
178 makeAggressive = flagship.getVariant().hasHullMod(HullMods.AUTOMATED);
179 }
180 makeFleetInterceptPlayer(closest, makeAggressive, true, 30f);
181 return;
182 }
183 }
184
185 if (data.params != null) {
186 CampaignFleetAPI fleet = FleetFactoryV3.createFleet(data.params);
187 if (fleet == null || fleet.isEmpty()) return;
188
189 if (Factions.REMNANTS.equals(fleet.getFaction().getId())) {
190 RemnantSeededFleetManager.initRemnantFleetProperties(null, fleet, false);
191 } else {
192 fleet.setTransponderOn(false);
193 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PIRATE, true);
194 Misc.makeNoRepImpact(fleet, "tTrap");
195 }
196
197 float range = data.minRange + random.nextFloat() * (data.maxRange - data.minRange);
198 Vector2f loc = Misc.getPointAtRadius(entity.getLocation(), range);
199
200 entity.getContainingLocation().addEntity(fleet);
201 fleet.setLocation(loc.x, loc.y);
202
203 FleetMemberAPI flagship = fleet.getFlagship();
204 boolean makeAggressive = false;
205 if (flagship != null) {
206 makeAggressive = flagship.getVariant().hasHullMod(HullMods.AUTOMATED);
207 }
208 makeFleetInterceptPlayer(fleet, makeAggressive, true, 30f);
209
210
211// SectorEntityToken despawnLoc = entity.getContainingLocation().createToken(20000, 0);
212// fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, despawnLoc, 10000f);
213 Misc.giveStandardReturnToSourceAssignments(fleet, false);
214 return;
215 }
216 }
217
218
219
220
221 public static void makeFleetInterceptPlayer(CampaignFleetAPI fleet, boolean makeAggressive, boolean makeLowRepImpact, float interceptDays) {
222 makeFleetInterceptPlayer(fleet, makeAggressive, makeLowRepImpact, true, interceptDays);
223 }
224 public static void makeFleetInterceptPlayer(CampaignFleetAPI fleet, boolean makeAggressive, boolean makeLowRepImpact, boolean makeHostile, float interceptDays) {
225 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
226
227 if (fleet.getAI() == null) {
228 fleet.setAI(Global.getFactory().createFleetAI(fleet));
229 fleet.setLocation(fleet.getLocation().x, fleet.getLocation().y);
230 }
231
232 if (makeAggressive) {
233 float expire = fleet.getMemoryWithoutUpdate().getExpire(MemFlags.MEMORY_KEY_MAKE_AGGRESSIVE);
234 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_MAKE_AGGRESSIVE, true, Math.max(expire, interceptDays));
235 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_MAKE_AGGRESSIVE_ONE_BATTLE_ONLY, true, Math.max(expire, interceptDays));
236 }
237
238 if (makeHostile) {
239 fleet.getMemoryWithoutUpdate().unset(MemFlags.MEMORY_KEY_MAKE_ALLOW_DISENGAGE);
240 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_MAKE_HOSTILE, true, interceptDays);
241 }
242 fleet.getMemoryWithoutUpdate().set(FleetAIFlags.PLACE_TO_LOOK_FOR_TARGET, new Vector2f(playerFleet.getLocation()), interceptDays);
243
244 if (makeLowRepImpact) {
245 Misc.makeLowRepImpact(fleet, "ttSpecial");
246 }
247
248 if (fleet.getAI() instanceof ModularFleetAIAPI) {
249 ((ModularFleetAIAPI)fleet.getAI()).getTacticalModule().setTarget(playerFleet);
250 }
251
252 fleet.addAssignmentAtStart(FleetAssignment.INTERCEPT, playerFleet, interceptDays, null);
253 }
254
255
256 @Override
257 public void optionSelected(String optionText, Object optionData) {
258 super.optionSelected(optionText, optionData);
259 }
260
261
262 public static void main(String[] args) {
263 Boolean b = null;//new Boolean(true);
264 System.out.println(b == true);
265 }
266}
267
268
269
270
271
272
static FactoryAPI getFactory()
Definition Global.java:35
static SectorAPI getSector()
Definition Global.java:59
static void makeFleetInterceptPlayer(CampaignFleetAPI fleet, boolean makeAggressive, boolean makeLowRepImpact, float interceptDays)
static void makeFleetInterceptPlayer(CampaignFleetAPI fleet, boolean makeAggressive, boolean makeLowRepImpact, boolean makeHostile, float interceptDays)
CampaignFleetAIAPI createFleetAI(CampaignFleetAPI fleet)