Starsector API
Loading...
Searching...
No Matches
ProcurementMission.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.missions;
2
3import java.awt.Color;
4import java.util.Map;
5
6import org.lwjgl.util.vector.Vector2f;
7
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.InteractionDialogAPI;
10import com.fs.starfarer.api.campaign.PersonImportance;
11import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
12import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
13import com.fs.starfarer.api.campaign.econ.MarketAPI;
14import com.fs.starfarer.api.campaign.rules.MemoryAPI;
15import com.fs.starfarer.api.characters.PersonAPI;
16import com.fs.starfarer.api.impl.campaign.ids.Commodities;
17import com.fs.starfarer.api.impl.campaign.ids.Factions;
18import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
19import com.fs.starfarer.api.impl.campaign.ids.Ranks;
20import com.fs.starfarer.api.impl.campaign.ids.Tags;
21import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
22import com.fs.starfarer.api.impl.campaign.missions.hub.ReqMode;
23import com.fs.starfarer.api.ui.TooltipMakerAPI;
24import com.fs.starfarer.api.util.Misc;
25
27
28 public static float PROB_COMPLICATIONS = 0.5f;
29
30 public static float MISSION_DAYS = 60f;
31
32 public static float MIN_BASE_VALUE = 10000;
33 public static float MAX_BASE_VALUE = 100000;
34 public static float BASE_PRICE_MULT = 1.5f;
35
36 public static float PROB_REMOTE = 0.5f;
37
38 public static float PROB_BAR_UNDERWORLD = 0.25f;
39 public static float PROB_ILLEGAL_IF_UNDERWORLD = 0.5f;
40 public static float ILLEGAL_QUANTITY_MULT = 0.5f;
41
42
43 public static enum Stage {
44 TALK_TO_PERSON,
45 COMPLETED,
46 FAILED,
47 }
48 public static enum Variation {
49 LOCAL,
50 REMOTE,
51 }
52
53 protected String commodityId;
54 protected int quantity;
55 protected int pricePerUnit;
56
57 protected Variation variation;
60
61
62 @Override
63 protected boolean create(MarketAPI createdAt, boolean barEvent) {
64 //genRandom = Misc.random;
65 if (barEvent) {
73 } else {
79 setGiverPost(post);
80 if (post.equals(Ranks.POST_SENIOR_EXECUTIVE)) {
82 } else {
84 }
86 }
87 findOrCreateGiver(createdAt, false, false);
88 }
89
90
91 PersonAPI person = getPerson();
92 if (person == null) return false;
93 MarketAPI market = person.getMarket();
94 if (market == null) return false;
95
96 if (!setPersonMissionRef(person, "$proCom_ref")) {
97 return false;
98 }
99
100 if (barEvent) {
102 }
103
104 PersonImportance importance = person.getImportance();
105 boolean canOfferRemote = importance.ordinal() >= PersonImportance.MEDIUM.ordinal();
106 boolean preferExpensive = getQuality() >= PersonImportance.HIGH.getValue();
107 variation = Variation.LOCAL;
108 if (canOfferRemote && rollProbability(PROB_REMOTE)) {
109 variation = Variation.REMOTE;
110 }
112 variation = Variation.REMOTE;
113 }
114
115 CommodityOnMarketAPI com = null;
116 if (variation == Variation.LOCAL) {
117 requireMarketIs(market);
121 } else {
124 }
127 if (preferExpensive) {
129 }
130 com = pickCommodity();
131 }
132
133 if (com == null && canOfferRemote) {
134 variation = Variation.REMOTE;
135 }
136
137 if (variation == Variation.REMOTE) {
139 requireMarketIs("jangala");
140 } else {
141 requireMarketIsNot(market);
142 }
149 } else {
153 }
156 if (preferExpensive) {
158 }
159 com = pickCommodity();
160 }
161
162 if (com == null) return false;
163
165
166 commodityId = com.getId();
167
170 if (com.isIllegal()) {
172 }
173
174 if (quantity < 10) quantity = 10;
175 pricePerUnit = (int) (com.getMarket().getSupplyPrice(com.getId(), quantity, true) / (float) quantity *
178 if (pricePerUnit < 2) pricePerUnit = 2;
179
180
181 if (variation == Variation.REMOTE) {
182 if (com.isIllegal()) {
184 } else {
186 }
187 } else {
188 deliveryContact = person;
189 }
191 //setPersonIsPotentialContactOnSuccess(deliveryContact);
192
193 if (deliveryContact == null ||
194 (variation == Variation.REMOTE && !setPersonMissionRef(deliveryContact, "$proCom_ref"))) {
195 return false;
196 }
198 makeImportant(deliveryContact, "$proCom_needsCommodity", Stage.TALK_TO_PERSON);
199
200 setStartingStage(Stage.TALK_TO_PERSON);
201 setSuccessStage(Stage.COMPLETED);
202 setFailureStage(Stage.FAILED);
203
204 setStageOnMemoryFlag(Stage.COMPLETED, deliveryContact, "$proCom_completed");
205 setTimeLimit(Stage.FAILED, MISSION_DAYS, null);
206
207
208 if (getQuality() < 0.5f) {
210 } else {
212 }
214
215 return true;
216 }
217
218 protected void updateInteractionDataImpl() {
219 set("$proCom_barEvent", isBarEvent());
220
221 set("$proCom_commodityId", commodityId);
222 set("$proCom_underworld", getPerson().hasTag(Tags.CONTACT_UNDERWORLD));
223 set("$proCom_playerHasEnough", playerHasEnough(commodityId, quantity));
224 set("$proCom_commodityName", getSpec().getLowerCaseName());
225 set("$proCom_quantity", Misc.getWithDGS(quantity));
226 set("$proCom_pricePerUnit", Misc.getDGSCredits(pricePerUnit));
227 set("$proCom_totalPrice", Misc.getDGSCredits(pricePerUnit * quantity));
228 set("$proCom_variation", variation);
229 set("$proCom_manOrWoman", getPerson().getManOrWoman());
230 //set("$proCom_heOrShe", getPerson().getHeOrShe());
231 //set("$proCom_HeOrShe", getPerson().getHeOrShe().substring(0, 1).toUpperCase() + getPerson().getHeOrShe().substring(1));
232
233
234 if (variation == Variation.REMOTE) {
235 set("$proCom_personName", deliveryContact.getNameString());
236 set("$proCom_personPost", deliveryContact.getPost().toLowerCase());
237 set("$proCom_PersonPost", Misc.ucFirst(deliveryContact.getPost()));
238 set("$proCom_marketName", deliveryMarket.getName());
239 set("$proCom_marketOnOrAt", deliveryMarket.getOnOrAt());
240 set("$proCom_dist", getDistanceLY(deliveryMarket));
241 }
242 }
243
244 @Override
245 public void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height) {
246 float opad = 10f;
247 Color h = Misc.getHighlightColor();
248 if (currentStage == Stage.TALK_TO_PERSON) {
250 text.addPara("Deliver %s units of " + getSpec().getLowerCaseName() + " to " + deliveryContact.getNameString() + " " +
251 deliveryMarket.getOnOrAt() + " " + deliveryMarket.getName() + ". You will be paid %s per unit, or " +
252 "%s total.", 0f, h,
256 info.addImageWithText(opad);
258 info.addPara("You have enough " + getSpec().getLowerCaseName() + " in your cargo holds to complete " +
259 "the delivery.", opad);
260 } else {
261 info.addPara("You do not have enough " + getSpec().getLowerCaseName() + " in your cargo holds to complete " +
262 "the delivery.", opad);
263 }
264 }
265 }
266
267// need to mention that need to acquire the item
268// check whether player has enough and chance desc/bullet point depending?
269
270 @Override
271 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
272 Color h = Misc.getHighlightColor();
273 if (currentStage == Stage.TALK_TO_PERSON) {
275 info.addPara("Go to " + deliveryMarket.getName() + " and contact " + deliveryContact.getNameString() + " to arrange delivery", tc, pad);
276 } else {
277 String name = getSpec().getLowerCaseName();
278 info.addPara("Acquire %s units of " + name, pad, tc, h, "" + (int) quantity);
279 }
280 return true;
281 }
282 return false;
283 }
284
285 @Override
286 public String getBaseName() {
287 return getSpec().getName() + " Procurement";
288 }
289
290 @Override
291 public void accept(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
292 super.accept(dialog, memoryMap);
293
294 if (variation == Variation.REMOTE && rollProbability(PROB_COMPLICATIONS)) {
296 e.setDelay(10f);
299 e.beginCreate();
300 e.triggerCreateFleet(FleetSize.MEDIUM, FleetQuality.DEFAULT, Factions.PIRATES, FleetTypes.PATROL_MEDIUM, new Vector2f());
304 e.triggerSetFleetMemoryValue("$proCom_commodityName", getSpec().getLowerCaseName());
305 e.triggerSetFleetGenericHailPermanent("PROCOMPirateHail");
306 e.endCreate();
307 }
308 }
309
310
311
312 protected transient CommoditySpecAPI spec;
314 if (spec == null) {
316 }
317 return spec;
318 }
319}
320
static SettingsAPI getSettings()
Definition Global.java:57
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, SectorEntityToken roughlyWhere)
void setLocationCoreOnly(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad)
void addDescriptionForNonEndStage(TooltipMakerAPI info, float width, float height)
void accept(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
boolean create(MarketAPI createdAt, boolean barEvent)
void setTimeLimit(Object failStage, float days, StarSystemAPI noLimitWhileInSystem, Object ... noLimitAfterStages)
static boolean playerHasEnough(String comId, int quantity)
PersonAPI findOrCreateTrader(String factionId, MarketAPI market, boolean cleanUpOnMissionOverIfWasNewPerson)
void makeImportant(PersonAPI person, String flag, Enum ... stages)
void setStageOnMemoryFlag(Object to, HasMemory withMemory, String flag)
PersonAPI findOrCreateCriminal(MarketAPI market, boolean cleanUpOnMissionOverIfWasNewPerson)
void findOrCreateGiver(MarketAPI market, boolean addToCommDirectory, boolean cleanUpOnMissionOverIfWasNewPerson)
void ensurePersonIsInCommDirectory(MarketAPI market, PersonAPI person)
static String getDGSCredits(float num)
Definition Misc.java:1390
static String getWithDGS(float num)
Definition Misc.java:1381
static String ucFirst(String str)
Definition Misc.java:559
static Color getHighlightColor()
Definition Misc.java:792
CommoditySpecAPI getCommoditySpec(String commodityId)
float getSupplyPrice(String commodityId, double quantity, boolean isPlayerPrice)
LabelAPI addPara(String format, float pad, Color hl, String... highlights)
TooltipMakerAPI beginImageWithText(String spriteName, float imageHeight)
UIPanelAPI addImageWithText(float pad)