Starsector API
Loading...
Searching...
No Matches
GAProbePackage.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.missions.academy;
2
3import java.awt.Color;
4import java.util.List;
5import java.util.Map;
6
7import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
8import com.fs.starfarer.api.campaign.InteractionDialogAPI;
9import com.fs.starfarer.api.campaign.SectorEntityToken;
10import com.fs.starfarer.api.campaign.StarSystemAPI;
11import com.fs.starfarer.api.campaign.econ.MarketAPI;
12import com.fs.starfarer.api.campaign.rules.MemoryAPI;
13import com.fs.starfarer.api.impl.campaign.ids.Entities;
14import com.fs.starfarer.api.impl.campaign.ids.Factions;
15import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
16import com.fs.starfarer.api.impl.campaign.ids.Tags;
17import com.fs.starfarer.api.impl.campaign.ids.Terrain;
18import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
19import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special.BreadcrumbSpecial;
20import com.fs.starfarer.api.ui.TooltipMakerAPI;
21import com.fs.starfarer.api.util.Misc;
22import com.fs.starfarer.api.util.Misc.Token;
23
24public class GAProbePackage extends GABaseMission {
25
26 public static float MISSION_DAYS = 120f;
27 public static float PROB_PATHERS = 0.5f;
28 public static float PROB_NOT_ASTEROIDS = 0.5f;
29
30 public static float PROB_IT_BLEW_UP = 0.33f;
31 public static float PROB_MISSING = 0.5f;
32 public static float PROB_SCAVENGER = 0.5f;
33
34
35 public static enum Stage {
36 GO_TO_PROBE,
37 FIND_SCAVENGER,
38 RETURN_TO_ACADEMY,
39 COMPLETED,
40 FAILED,
41 }
42
43 public static enum Variation {
44 BASIC,
45 SCAVENGER,
46 IT_BLEW_UP,
47 PACKAGE_MISSING,
48 }
49
50 protected StarSystemAPI system;
51 protected Variation variation;
52 protected CampaignTerrainAPI object;
53 protected SectorEntityToken probe;
54 protected int hazardPay;
55
56 @Override
57 protected boolean create(MarketAPI createdAt, boolean barEvent) {
58 // if this mission type was already accepted by the player, abort
59 if (!setGlobalReference("$gaProbe_ref")) {
60 return false;
61 }
62
63 //genRandom = Misc.random;
64
66
67 requireSystemTags(ReqMode.NOT_ANY, Tags.THEME_UNSAFE, Tags.THEME_CORE);
68 requireTerrainType(ReqMode.ANY, Terrain.ASTEROID_BELT, Terrain.ASTEROID_FIELD,
69 Terrain.MAGNETIC_FIELD, Terrain.NEBULA, Terrain.RING);
70 if (rollProbability(PROB_NOT_ASTEROIDS)) {
71 preferTerrainType(ReqMode.NOT_ANY, Terrain.ASTEROID_BELT, Terrain.ASTEROID_FIELD);
72 }
73
74 // important to put these last - requirements that come earlier have higher priority
75 preferSystemNotPulsar();
76 preferSystemNotBlackHole();
77 preferSystemUnexplored();
78 preferTerrainInDirectionOfOtherMissions();
79
80 //setGenRandom(new Random(99923667662341234L));
81 object = pickTerrain();
82
83 if (object == null) {
84 return false;
85 }
86
87 system = object.getStarSystem();
88
89 // PROB_IT_BLEW_UP = 1f;
90 // PROB_PATHERS = 1f;
91
92 if (rollProbability(PROB_IT_BLEW_UP)) {
93 variation = Variation.IT_BLEW_UP;
94 } else if (rollProbability(PROB_MISSING)) {
95 variation = Variation.PACKAGE_MISSING;
96 } else if (rollProbability(PROB_SCAVENGER)) {
97 variation = Variation.SCAVENGER;
98 } else {
99 variation = Variation.BASIC;
100 }
101 //variation = Variation.SCAVENGER;
102 //variation = Variation.BASIC;
103 //variation = Variation.IT_BLEW_UP;
104 //variation = Variation.PACKAGE_MISSING;
105
106 setStartingStage(Stage.GO_TO_PROBE);
107 addSuccessStages(Stage.COMPLETED);
108 addFailureStages(Stage.FAILED);
109
110 probe = spawnEntity(Entities.GENERIC_PROBE, new LocData(object));
111 if (probe == null) return false;
112
113 probe.setId("gaProbe_probe");
114 makeImportant(probe, "$gaProbe_probe", Stage.GO_TO_PROBE);
115 makeImportant(getPerson(), "$gaProbe_returnHere", Stage.RETURN_TO_ACADEMY);
116
117 connectWithGlobalFlag(Stage.GO_TO_PROBE, Stage.FIND_SCAVENGER, "$gaProbe_scavengerTookIt");
118 setStageOnGlobalFlag(Stage.RETURN_TO_ACADEMY, "$gaProbe_canReturn");
119 connectWithGlobalFlag(Stage.RETURN_TO_ACADEMY, Stage.COMPLETED, "$gaProbe_finished");
120
121 if (WITH_TIME_LIMIT) {
122 setTimeLimit(Stage.FAILED, MISSION_DAYS, system, Stage.RETURN_TO_ACADEMY);
123 }
124 //setCreditReward(30000, 40000);
125 setCreditReward(CreditReward.AVERAGE);
127 if (variation == Variation.IT_BLEW_UP) {
128 hazardPay = getCreditsReward() / 2;
129 spawnDebrisField(DEBRIS_SMALL, DEBRIS_DENSE, new LocData(probe, false));
130 spawnShipGraveyard(Factions.LUDDIC_PATH, 3, 5, new LocData(probe, false));
131
132 if (rollProbability(PROB_PATHERS)) {
133 beginWithinHyperspaceRangeTrigger(object, 1f, false, Stage.GO_TO_PROBE);
134 triggerCreateFleet(FleetSize.TINY, FleetQuality.VERY_LOW, Factions.LUDDIC_PATH, FleetTypes.PATROL_SMALL, object);
135 triggerSetFleetSizeFraction(0.03f);
136 triggerMakeNonHostile();
137 triggerMakeLowRepImpact();
138 triggerFleetNoJump();
139 triggerFleetPatherNoDefaultTithe();
140 triggerSetFleetMissionRef("$gaProbe_ref");
141 triggerFleetSetPatrolActionText("waiting"); // a bit dark, maybe?
142 triggerOrderFleetPatrol(probe);
143 triggerOrderFleetInterceptPlayer();
144 triggerPickLocationAroundEntity(probe, 1000f);
145 triggerSpawnFleetAtPickedLocation("$gaProbe_patherPermanentFlag", null);
146 triggerFleetMakeImportant("$gaProbe_patherMissionInProgress", Stage.GO_TO_PROBE);
147 endTrigger();
148 }
149 }
150
151 if (variation == Variation.SCAVENGER) {
152 beginWithinHyperspaceRangeTrigger(object, 1f, false, Stage.GO_TO_PROBE);
153 triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.LOWER, Factions.SCAVENGERS, FleetTypes.SCAVENGER_MEDIUM, system);
154 triggerAutoAdjustFleetStrengthMajor();
155 triggerSetFleetFaction(Factions.INDEPENDENT);
156
157 triggerMakeLowRepImpact();
158 triggerFleetSetAvoidPlayerSlowly();
159 triggerMakeFleetIgnoredByOtherFleets();
160
161 triggerPickLocationAtClosestToEntityJumpPoint(system, probe);
162 triggerSetEntityToPickedJumpPoint();
163 triggerPickLocationAroundEntity(5000);
164
165 // so the flag is there prior to the FIND_SCAVENGER stage
166 triggerSpawnFleetAtPickedLocation("$gaProbe_scavenger", null);
167
168 triggerFleetSetTravelActionText("exploring system");
169 triggerFleetSetPatrolActionText("preparing to leave system");
170 triggerOrderFleetPatrolEntity(false);
171
172 triggerFleetMakeImportant("$gaProbe_scavenger", Stage.FIND_SCAVENGER);
173 triggerFleetAddDefeatTrigger("gaProbeScavengerDefeated");
174 endTrigger();
175 }
176
177 setMapMarkerNameColorBasedOnStar(system);
178
179 return true;
180 }
181
182 @Override
183 protected boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
184 if (action.equals("updateReward")) {
185 setCreditReward(getCreditsReward() + hazardPay);
186 return true;
187 }
188 return false;
189 }
190
191
192 protected void updateInteractionDataImpl() {
193 set("$gaProbe_department", department);
194 if (getCurrentStage() != null) {
195 set("$gaProbe_stage", ((Enum)getCurrentStage()).name());
196 }
197 set("$gaProbe_celestialObjectNameWithType", getObjectNameWithType());
198 set("$gaProbe_starName", system.getNameWithNoType());
199 set("$gaProbe_systemName", system.getNameWithLowercaseTypeShort());
200 set("$gaProbe_dist", getDistanceLY(object));
201 set("$gaProbe_reward", Misc.getWithDGS(getCreditsReward()));
202 set("$gaProbe_hazardPay", Misc.getWithDGS(hazardPay));
203 set("$gaProbe_variation", variation);
204 }
205
206 @Override
207 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
208 float opad = 10f;
209 Color h = Misc.getHighlightColor();
210 if (currentStage == Stage.GO_TO_PROBE) {
211 if (probe != null) {
212 String loc = BreadcrumbSpecial.getLocatedString(probe, true);
213 info.addPara("Recover an instrument package from a probe " + loc + ".", opad);
214 } else {
215 info.addPara("Recover an instrument package from a probe in the " +
216 system.getNameWithLowercaseTypeShort() + ".", opad);
217 }
218 } else if (currentStage == Stage.FIND_SCAVENGER) {
219 info.addPara("Go to the nearest jump-point and retrieve the instrument package " +
220 " from scavengers before they leave the system.", opad);
221 } else if (currentStage == Stage.RETURN_TO_ACADEMY) {
222 info.addPara("Return the instrument package to the Galatia Academy and talk to " +
223 getPerson().getNameString() + " to receive your reward.", opad);
224 }
225 }
226
227 @Override
228 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
229 Color h = Misc.getHighlightColor();
230 if (currentStage == Stage.GO_TO_PROBE) {
231 if (system.isCurrentLocation()) {
232 info.addPara("Recover the instrument package from the probe", tc, pad);
233 } else {
234 info.addPara(getGoToSystemTextShort(system), tc, pad);
235 }
236 return true;
237 } else if (currentStage == Stage.FIND_SCAVENGER) {
238 info.addPara("Recover the instrument package from scavengers at one of the jump-points",
239 tc, pad);
240 } else if (currentStage == Stage.RETURN_TO_ACADEMY) {
241 info.addPara("Return to the Galatia Academy and talk to " + getPerson().getNameString(), tc, pad);
242 return true;
243 }
244 return false;
245 }
246
247
248 protected String getObjectNameWithType() {
249 if (hasSpecialName(object)) {
250 return getTerrainTypeAOrAn(object) + " " + getTerrainType(object) + " called " + getTerrainName(object);
251 } else {
252 return getTerrainTypeAOrAn(object) + " " + getTerrainType(object);
253 }
254 }
255
256 @Override
257 public String getBaseName() {
258 return "Recover Instrument Package";
259 }
260
261}
262
263
boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
boolean create(MarketAPI createdAt, boolean barEvent)
boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad)
void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height)