Starsector API
Loading...
Searching...
No Matches
BlueprintIntel.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.missions;
2
3import java.util.Map;
4
5import java.awt.Color;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CargoAPI;
9import com.fs.starfarer.api.campaign.CargoStackAPI;
10import com.fs.starfarer.api.campaign.InteractionDialogAPI;
11import com.fs.starfarer.api.campaign.SectorEntityToken;
12import com.fs.starfarer.api.campaign.SpecialItemData;
13import com.fs.starfarer.api.campaign.StarSystemAPI;
14import com.fs.starfarer.api.campaign.econ.MarketAPI;
15import com.fs.starfarer.api.campaign.listeners.CargoGainedListener;
16import com.fs.starfarer.api.campaign.listeners.ShowLootListener;
17import com.fs.starfarer.api.campaign.rules.MemoryAPI;
18import com.fs.starfarer.api.characters.PersonAPI;
19import com.fs.starfarer.api.combat.ShipAPI.HullSize;
20import com.fs.starfarer.api.combat.ShipHullSpecAPI;
21import com.fs.starfarer.api.combat.WeaponAPI.WeaponSize;
22import com.fs.starfarer.api.impl.campaign.ids.Factions;
23import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
24import com.fs.starfarer.api.impl.campaign.ids.Items;
25import com.fs.starfarer.api.impl.campaign.ids.Ranks;
26import com.fs.starfarer.api.impl.campaign.ids.Tags;
27import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
28import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
29import com.fs.starfarer.api.loading.FighterWingSpecAPI;
30import com.fs.starfarer.api.loading.WeaponSpecAPI;
31import com.fs.starfarer.api.ui.SectorMapAPI;
32import com.fs.starfarer.api.ui.TooltipMakerAPI;
33import com.fs.starfarer.api.util.Misc;
34import com.fs.starfarer.api.util.WeightedRandomPicker;
35
37
38 public static float PROB_PATHER = 0.5f;
39 public static float PROB_MERC = 0.5f;
40
41 public static float PROB_TRY_TO_FIND_RUINS = 0.5f;
42 public static float FREQ_WEAPON = 10f;
43 public static float FREQ_FIGHTER = 10f;
44 public static float FREQ_SHIP = 10f;
45
46 public static enum Stage {
47 GET_ITEM,
48 COMPLETED,
49 }
50
52
54 protected int price;
56
57 protected float getQualityMultForTier(int tier) {
58 float q = getQuality();
59 float qWeight = 1f;
60 if (tier <= 0) qWeight = 0;
61 else if (tier == 1) qWeight = 1f;
62 else if (tier == 2) qWeight = 2f;
63 else if (tier >= 3) qWeight = 4f;
64
65 return (1f - qWeight) + qWeight * (1f + q);
66 }
67
68 protected void pickItem() {
69
71 typePicker.add(Items.FIGHTER_BP, FREQ_FIGHTER);
72 typePicker.add(Items.WEAPON_BP, FREQ_WEAPON);
73 typePicker.add(Items.SHIP_BP, FREQ_SHIP);
74
75 while (item == null && !typePicker.isEmpty()) {
76 String type = typePicker.pick();
77
78 if (type.equals(Items.FIGHTER_BP)) {
81 if (!spec.hasTag(Items.TAG_RARE_BP)) continue;
82 if (spec.hasTag(Tags.NO_DROP)) continue;
83 if (Global.getSector().getPlayerFaction().knowsFighter(spec.getId())) continue;
84 float w = spec.getRarity() * getQualityMultForTier(spec.getTier());
85 picker.add(spec, w);
86 }
87 FighterWingSpecAPI pick = picker.pick();
88 if (pick != null) {
89 item = new SpecialItemData(type, pick.getId());
90 price = (int) pick.getBaseValue();
91 } else {
92 typePicker.remove(type);
93 }
94 } else if (type.equals(Items.WEAPON_BP)) {
97 if (!spec.hasTag(Items.TAG_RARE_BP)) continue;
98 if (spec.hasTag(Tags.NO_DROP)) continue;
99 if (Global.getSector().getPlayerFaction().knowsWeapon(spec.getWeaponId())) continue;
100 float w = spec.getRarity() * getQualityMultForTier(spec.getTier());;
101 picker.add(spec, w);
102 }
103 WeaponSpecAPI pick = picker.pick();
104 if (pick != null) {
105 item = new SpecialItemData(type, pick.getWeaponId());
106 price = (int) pick.getBaseValue();
107 } else {
108 typePicker.remove(type);
109 }
110 } else if (type.equals(Items.SHIP_BP)) {
113 if (!spec.hasTag(Items.TAG_RARE_BP)) continue;
114 if (spec.hasTag(Tags.NO_DROP)) continue;
115 if (Global.getSector().getPlayerFaction().knowsShip(spec.getHullId())) continue;
116 float w = spec.getRarity() * getQualityMultForTier(spec.getFleetPoints() / 6);;
117 picker.add(spec, w);
118 }
119 ShipHullSpecAPI pick = picker.pick();
120 if (pick != null) {
121 item = new SpecialItemData(type, pick.getHullId());
122 price = (int) pick.getBaseValue();
123 } else {
124 typePicker.remove(type);
125 }
126 } else {
127 // ???
128 break;
129 }
130 }
131
132 if (price != 0) {
133 price = getRoundNumber(price * (1.5f + (1f - getRewardMultFraction())));
134 }
135 }
136
137 protected String getItemNameLowercaseItem() {
138 String item = getItemName();
139 item = item.replaceFirst(" Item", " item");
140 item = item.replaceFirst(" Blueprint", " blueprint");
141 return item;
142 }
143 protected String getItemName() {
144 if (item == null) return "an Invalid Item";
145
146 String name = "Invalid Item";
147 if (item.getId().equals(Items.FIGHTER_BP)) {
149 name = spec.getWingName() + " Blueprint";
150 } else if (item.getId().equals(Items.WEAPON_BP)) {
152 name = spec.getWeaponName() + " Blueprint";
153 } else if (item.getId().equals(Items.SHIP_BP)) {
155 name = spec.getHullName() + " Blueprint";
156 }
157 return Misc.getAOrAnFor(name) + " " + name;
158 }
159
160 protected boolean isVeryValuable() {
161 if (item.getId().equals(Items.FIGHTER_BP)) {
162 //FighterWingSpecAPI spec = Global.getSettings().getFighterWingSpec(item.getData());
163 return false;
164 } else if (item.getId().equals(Items.WEAPON_BP)) {
166 return spec.getSize() == WeaponSize.LARGE;
167 } else if (item.getId().equals(Items.SHIP_BP)) {
169 return spec.getHullSize().ordinal() >= HullSize.DESTROYER.ordinal();
170 }
171 return false;
172 }
173
174
175 @Override
176 protected boolean create(MarketAPI createdAt, boolean barEvent) {
177 //genRandom = Misc.random;
178
179 if (barEvent) {
186 findOrCreateGiver(createdAt, false, false);
187 }
188
189 PersonAPI person = getPerson();
190 if (person == null) return false;
191
192 pickItem();
193 if (item == null) return false;
194
195
196 if (!setPersonMissionRef(person, "$sitm_ref")) {
197 return false;
198 }
199
200 if (barEvent) {
202 }
203
207
208 entity = null;
215 entity = pickPlanet();
216 }
217
218 if (entity == null) {
222 entity = pickEntity();
223 }
224
225 if (entity == null) {
226 return false;
227 }
228
230 if (system == null) return false;
231
232 setStartingStage(Stage.GET_ITEM);
233 setSuccessStage(Stage.COMPLETED);
234
236
237 boolean veryValuable = isVeryValuable();
238
239 int numScav = genRandom.nextInt(3);
240 if (veryValuable) numScav += 2;
241
242 for (int i = 0; i < numScav; i++) {
243 beginWithinHyperspaceRangeTrigger(system, 3f, false, Stage.GET_ITEM);
244 triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, Factions.SCAVENGERS, FleetTypes.SCAVENGER_MEDIUM, system);
247
249
250 triggerSpawnFleetNear(system.getCenter(), null, "$sitm_ref");
251 triggerFleetSetTravelActionText("exploring system");
252 triggerFleetSetPatrolActionText("scanning local volume");
254 triggerFleetSetWarnAttack("SITMScavWarning", "SITMScavAttack", Stage.GET_ITEM);
255 endTrigger();
256 }
257
258
259 if (veryValuable && rollProbability(PROB_MERC)) {
260 beginWithinHyperspaceRangeTrigger(system, 3f, false, Stage.GET_ITEM);
261 triggerCreateFleet(FleetSize.VERY_LARGE, FleetQuality.VERY_HIGH, Factions.MERCENARY, FleetTypes.PATROL_LARGE, system);
263 triggerSetFleetOfficers(OfficerNum.MORE, OfficerQuality.HIGHER);
268 triggerSpawnFleetNear(system.getCenter(), null, "$sitm_ref");
270 triggerFleetSetWarnAttack("SITMMercWarning", "SITMMercAttack", Stage.GET_ITEM);
271 endTrigger();
272 }
273
274 return true;
275 }
276
277
279 for (CargoStackAPI stack : loot.getStacksCopy()) {
280 if (item.equals(stack.getData())) {
282 setCurrentStage(Stage.COMPLETED, dialog, dialog.getPlugin().getMemoryMap());
283 break;
284 }
285 }
286 }
287
291
292 @Override
293 public void acceptImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
294 super.acceptImpl(dialog, memoryMap);
297 }
298
299 @Override
300 protected void notifyEnding() {
301 super.notifyEnding();
302
304
305 if (!rollProbability(PROB_PATHER)) return;
306
307 PersonAPI person = getPerson();
308 if (person == null || person.getMarket() == null) return;
309 String patrolFaction = person.getMarket().getFactionId();
310 if (patrolFaction.equals(person.getFaction().getId()) ||
312 return;
313 }
314
316 e.setDelayNone();
319 e.beginCreate();
320 e.triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, Factions.LUDDIC_PATH, FleetTypes.PATROL_LARGE, system);
323 e.triggerSetFleetGenericHailPermanent("SITMPatherHail");
325 e.endCreate();
326 }
327
328
329 protected void updateInteractionDataImpl() {
330 set("$sitm_barEvent", isBarEvent());
331 set("$sitm_manOrWoman", getPerson().getManOrWoman());
332 set("$sitm_heOrShe", getPerson().getHeOrShe());
333
334 set("$sitm_price", Misc.getWithDGS(price));
335
336 set("$sitm_aOrAnItem", getItemNameLowercaseItem());
337 set("$sitm_item", getWithoutArticle(getItemNameLowercaseItem()));
338
339 set("$sitm_personName", getPerson().getNameString());
340 set("$sitm_systemName", system.getNameWithLowercaseTypeShort());
341 set("$sitm_dist", getDistanceLY(system));
342 }
343
344 @Override
345 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
346 float opad = 10f;
347 Color h = Misc.getHighlightColor();
348 if (currentStage == Stage.GET_ITEM) {
349 info.addPara("There is " + getItemNameLowercaseItem() +
350 " to be found somewhere in the " + system.getNameWithLowercaseTypeShort() + ".", opad);
351 }
352 }
353
354 @Override
355 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
356 Color h = Misc.getHighlightColor();
357 if (currentStage == Stage.GET_ITEM) {
358 info.addPara("There is " + getItemNameLowercaseItem() + " in the " +
360 return true;
361 }
362 return false;
363 }
364
365 @Override
366 public String getBaseName() {
367 return Misc.ucFirst(getWithoutArticle(getItemName())) + " Intel";
368 }
369
370 protected String getMissionTypeNoun() {
371 return "intel";
372 }
373
374 protected String getMissionCompletionVerb() {
375 return "acted on";
376 }
377
378 @Override
382
383
384}
385
386
387
388
389
390
static SettingsAPI getSettings()
Definition Global.java:57
static SectorAPI getSector()
Definition Global.java:65
boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad)
void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height)
void reportSpecialCargoGainedFromRecoveredDerelict(CargoAPI loot, InteractionDialogAPI dialog)
void reportAboutToShowLootToPlayer(CargoAPI loot, InteractionDialogAPI dialog)
boolean create(MarketAPI createdAt, boolean barEvent)
void acceptImpl(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
void setLocationAnywhere(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, SectorEntityToken roughlyWhere)
SectorEntityToken getMapLocationFor(SectorEntityToken entity)
void setCurrentStage(Object next, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
void findOrCreateGiver(MarketAPI market, boolean addToCommDirectory, boolean cleanUpOnMissionOverIfWasNewPerson)
void addSpecialItemDropOnlyUseInAcceptImplNotUndoneOnAbort(SectorEntityToken entity, SpecialItemData data)
void beginWithinHyperspaceRangeTrigger(SectorEntityToken entity, float rangeLY, boolean requirePlayerInHyperspace, Object ... stages)
void triggerSpawnFleetNear(final SectorEntityToken entity, final String flag, final String refKey)
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, StarSystemAPI roughlyWhere)
void triggerFleetSetWarnAttack(String warnCommsTrigger, String attackCommsTrigger, Object ... stages)
static String getWithDGS(float num)
Definition Misc.java:1381
static String ucFirst(String str)
Definition Misc.java:559
static String getAOrAnFor(String word)
Definition Misc.java:6160
static Color getHighlightColor()
Definition Misc.java:792
static boolean isPirateFaction(FactionAPI faction)
Definition Misc.java:6150
ShipHullSpecAPI getHullSpec(String hullId)
List< WeaponSpecAPI > getAllWeaponSpecs()
FighterWingSpecAPI getFighterWingSpec(String wingId)
WeaponSpecAPI getWeaponSpec(String weaponId)
List< ShipHullSpecAPI > getAllShipHullSpecs()
List< FighterWingSpecAPI > getAllFighterWingSpecs()
List< CargoStackAPI > getStacksCopy()
boolean knowsWeapon(String weaponId)
ListenerManagerAPI getListenerManager()
LabelAPI addPara(String format, float pad, Color hl, String... highlights)