Starsector API
Loading...
Searching...
No Matches
CustomProductionContract.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.missions;
2
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
6import java.util.LinkedHashMap;
7import java.util.LinkedHashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11
12import java.awt.Color;
13
14import org.lwjgl.util.vector.Vector2f;
15
16import com.fs.starfarer.api.Global;
17import com.fs.starfarer.api.campaign.BaseCustomProductionPickerDelegateImpl;
18import com.fs.starfarer.api.campaign.CampaignFleetAPI;
19import com.fs.starfarer.api.campaign.CargoAPI;
20import com.fs.starfarer.api.campaign.FactionAPI;
21import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
22import com.fs.starfarer.api.campaign.FactionProductionAPI;
23import com.fs.starfarer.api.campaign.FactionProductionAPI.ItemInProductionAPI;
24import com.fs.starfarer.api.campaign.FactionProductionAPI.ProductionItemType;
25import com.fs.starfarer.api.campaign.FleetInflater;
26import com.fs.starfarer.api.campaign.InteractionDialogAPI;
27import com.fs.starfarer.api.campaign.PersonImportance;
28import com.fs.starfarer.api.campaign.SectorEntityToken;
29import com.fs.starfarer.api.campaign.econ.MarketAPI;
30import com.fs.starfarer.api.campaign.rules.MemoryAPI;
31import com.fs.starfarer.api.characters.PersonAPI;
32import com.fs.starfarer.api.combat.ShipAPI.HullSize;
33import com.fs.starfarer.api.combat.ShipHullSpecAPI;
34import com.fs.starfarer.api.combat.ShipHullSpecAPI.ShipTypeHints;
35import com.fs.starfarer.api.combat.WeaponAPI;
36import com.fs.starfarer.api.combat.WeaponAPI.AIHints;
37import com.fs.starfarer.api.combat.WeaponAPI.WeaponSize;
38import com.fs.starfarer.api.combat.WeaponAPI.WeaponType;
39import com.fs.starfarer.api.fleet.FleetMemberAPI;
40import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepActions;
41import com.fs.starfarer.api.impl.campaign.econ.impl.ShipQuality;
42import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflaterParams;
43import com.fs.starfarer.api.impl.campaign.ids.Commodities;
44import com.fs.starfarer.api.impl.campaign.ids.Conditions;
45import com.fs.starfarer.api.impl.campaign.ids.Factions;
46import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
47import com.fs.starfarer.api.impl.campaign.ids.Items;
48import com.fs.starfarer.api.impl.campaign.ids.Ranks;
49import com.fs.starfarer.api.impl.campaign.ids.Tags;
50import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseManager;
51import com.fs.starfarer.api.impl.campaign.intel.contacts.ContactIntel;
52import com.fs.starfarer.api.impl.campaign.intel.misc.ProductionReportIntel.ProductionData;
53import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
54import com.fs.starfarer.api.impl.campaign.rulecmd.AddRemoveCommodity;
55import com.fs.starfarer.api.impl.campaign.rulecmd.FireBest;
56import com.fs.starfarer.api.impl.campaign.submarkets.StoragePlugin;
57import com.fs.starfarer.api.loading.FighterWingSpecAPI;
58import com.fs.starfarer.api.loading.VariantSource;
59import com.fs.starfarer.api.loading.WeaponSpecAPI;
60import com.fs.starfarer.api.ui.Alignment;
61import com.fs.starfarer.api.ui.LabelAPI;
62import com.fs.starfarer.api.ui.SectorMapAPI;
63import com.fs.starfarer.api.ui.TooltipMakerAPI;
64import com.fs.starfarer.api.util.CountingMap;
65import com.fs.starfarer.api.util.Misc;
66import com.fs.starfarer.api.util.Misc.Token;
67import com.fs.starfarer.api.util.WeightedRandomPicker;
68
70
71 public static float ARMS_DEALER_PROB_PATROL_AFTER = 0.5f;
72
73 public static float PROD_DAYS = 60f;
74
75 public static float PROB_ARMS_DEALER_BAR = 0.25f;
76 public static float PROB_MILITARY_BAR = 0.33f;
77 public static float PROB_INDEPENDENT_BAR = 0.5f;
78
79 public static float PROB_ARMS_DEALER_IS_CONTACT = 0.05f;
80
81 public static float MIN_CAPACITY = 100000;
82 public static float MAX_CAPACITY = 500000;
83 public static int BAR_CAPACITY_BONUS_MIN = 50000;
84 public static int BAR_CAPACITY_BONUS_MAX = 150000;
85
86
87 public static float MAX_PROD_CAPACITY_AT_SHIP_UNITS = 10;
88 public static float MAX_PROD_CAPACITY_MULT = 0.25f;
89
90 public static float DEALER_MIN_CAPACITY = 1000000;
91 public static float DEALER_MAX_CAPACITY = 2000000;
92 public static Map<PersonImportance, Float> DEALER_MULT = new LinkedHashMap<PersonImportance, Float>();
93 static {
99 }
100
101 public static float MILITARY_CAP_MULT = 0.6f;
102
103 public static float MILITARY_MAX_COST_DECREASE = 0.3f;
104 public static float TRADE_MAX_COST_INCREASE = 0.3f;
105 public static float DEALER_FIXED_COST_INCREASE = 0.5f;
106 public static float DEALER_VARIABLE_COST_INCREASE = 0.5f;
107
108 public static enum Stage {
109 WAITING,
110 DELIVERED,
111 COMPLETED, // unused, left in for save compat
112 FAILED,
113 }
114
115 protected Set<String> ships = new LinkedHashSet<String>();
116 protected Set<String> weapons = new LinkedHashSet<String>();
117 protected Set<String> fighters = new LinkedHashSet<String>();
118
119 protected boolean armsDealer = false;
120 protected int maxCapacity;
121 protected float costMult;
122 protected ProductionData data;
123 protected int cost;
125 protected MarketAPI market;
126
127 @Override
128 protected boolean create(MarketAPI createdAt, boolean barEvent) {
129 //genRandom = Misc.random;
130
131 boolean allowArmsDealer = true; // anywhere is fine
132 boolean allowTrader = createdAt != null && createdAt.getCommodityData(Commodities.SHIPS).getMaxSupply() > 0;
133 boolean allowMilitary = allowTrader && createdAt != null && Misc.isMilitary(createdAt);
134 if (createdAt.isPlayerOwned()) {
135 allowTrader = false;
136 allowMilitary = false;
137 }
138 if (Factions.PIRATES.equals(createdAt.getFaction().getId())) {
139 allowMilitary = false;
140 }
141
142 if (barEvent) {
143 String post = null;
144 if (rollProbability(PROB_ARMS_DEALER_BAR) && allowArmsDealer) {
146 post = Ranks.POST_ARMS_DEALER;
149 } else if (rollProbability(PROB_MILITARY_BAR) && allowMilitary) {
150 List<String> posts = new ArrayList<String>();
151 posts.add(Ranks.POST_SUPPLY_OFFICER);
152 if (Misc.isMilitary(createdAt)) {
153 posts.add(Ranks.POST_BASE_COMMANDER);
154 }
155 if (Misc.hasOrbitalStation(createdAt)) {
156 posts.add(Ranks.POST_STATION_COMMANDER);
157 }
158 post = pickOne(posts);
162 } else if (allowTrader) {
170 }
171 }
172 if (post == null && allowArmsDealer) {
174 post = Ranks.POST_ARMS_DEALER;
177 }
178 if (post == null) return false;
179
180 setGiverPost(post);
181 if (post.equals(Ranks.POST_SENIOR_EXECUTIVE) ||
182 post.equals(Ranks.POST_BASE_COMMANDER) ||
183 post.equals(Ranks.POST_ADMINISTRATOR)) {
185 } else if (post.equals(Ranks.POST_ARMS_DEALER)) {
187 } else {
189
190 }
191 findOrCreateGiver(createdAt, false, false);
193 }
194
195 PersonAPI person = getPerson();
196 if (person == null) return false;
197
198 if (!setPersonMissionRef(person, "$cpc_ref")) {
199 return false;
200 }
201
203 if (market == null) return false;
204 if (Misc.getStorage(market) == null) return false;
205
206 faction = person.getFaction();
207
208// armsDealer = Ranks.POST_ARMS_DEALER.equals(person.getPostId());
209// if (!armsDealer) allowArmsDealer = false;
211
213 if (barEvent) {
215 }
217 if (capMult > 1) capMult = 1f;
218 if (capMult < MAX_PROD_CAPACITY_MULT) capMult = MAX_PROD_CAPACITY_MULT;
219 maxCapacity *= capMult;
220 if (person.hasTag(Tags.CONTACT_MILITARY) && allowMilitary) {
222 }
224
225 if (armsDealer && allowArmsDealer) { // don't care about ship production, since it's just acquisition from wherever
227 float mult = DEALER_MULT.get(imp);
230 }
231
232 if (armsDealer && allowArmsDealer) {
235 if (ships.isEmpty() && weapons.isEmpty() && fighters.isEmpty()) return false;
236 } else if (person.hasTag(Tags.CONTACT_MILITARY) && allowMilitary) {
239 if (ships.isEmpty() && weapons.isEmpty() && fighters.isEmpty()) return false;
240 } else if (person.hasTag(Tags.CONTACT_TRADE) && allowTrader) {
242 } else {
243 return false;
244 }
245
246 setStartingStage(Stage.WAITING);
247 setSuccessStage(Stage.DELIVERED);
248 setFailureStage(Stage.FAILED);
249 setNoAbandon();
250
251 connectWithDaysElapsed(Stage.WAITING, Stage.DELIVERED, PROD_DAYS);
252 //connectWithDaysElapsed(Stage.WAITING, Stage.DELIVERED, 1f);
253 setStageOnMarketDecivilized(Stage.FAILED, market);
254
255 return true;
256 }
257
258
259 protected void addArmsDealerBlueprints() {
260 boolean [] add = new boolean[3];
261 add[genRandom.nextInt(add.length)] = true;
262 add[genRandom.nextInt(add.length)] = true;
263 add[genRandom.nextInt(add.length)] = true;
264
266 if (imp == PersonImportance.VERY_HIGH) {
267 add[0] = true;
268 add[1] = true;
269 add[2] = true;
270 }
271
272 Set<WeaponType> wTypes = new LinkedHashSet<WeaponAPI.WeaponType>();
273 Set<WeaponSize> wSizes = new LinkedHashSet<WeaponAPI.WeaponSize>();
274 Set<HullSize> hullSizes = new LinkedHashSet<HullSize>();
275
277 wTypePicker.add(WeaponType.BALLISTIC);
278 wTypePicker.add(WeaponType.ENERGY);
279 wTypePicker.add(WeaponType.MISSILE);
281 wSizePicker.add(WeaponSize.SMALL);
282 wSizePicker.add(WeaponSize.MEDIUM);
283 wSizePicker.add(WeaponSize.LARGE);
284
285 int nWeapons = 0;
286 int nShips = 0;
287 int nFighters = 0;
288
289 switch (imp) {
290 case VERY_LOW:
291 add[1] = true;
292 wSizes.add(WeaponSize.SMALL);
293 wTypes.add(wTypePicker.pickAndRemove());
294 nWeapons = 5 + genRandom.nextInt(6);
295 nFighters = 1 + genRandom.nextInt(3);
296 break;
297 case LOW:
298 add[1] = true;
299 wSizePicker.remove(WeaponSize.LARGE);
300 wSizes.add(wSizePicker.pickAndRemove());
301 wTypes.add(wTypePicker.pickAndRemove());
302 hullSizes.add(HullSize.FRIGATE);
303 nWeapons = 10 + genRandom.nextInt(6);
304 nShips = 5 + genRandom.nextInt(3);
305 nFighters = 3 + genRandom.nextInt(3);
306 break;
307// case LOW:
308// case VERY_LOW:
309 case MEDIUM:
310 add[1] = true;
311 wSizes.add(wSizePicker.pickAndRemove());
312 wSizes.add(wSizePicker.pickAndRemove());
313 wTypes.add(wTypePicker.pickAndRemove());
314 hullSizes.add(HullSize.FRIGATE);
315 hullSizes.add(HullSize.DESTROYER);
316 nWeapons = 20 + genRandom.nextInt(6);
317 nShips = 10 + genRandom.nextInt(3);
318 nFighters = 5 + genRandom.nextInt(3);
319 break;
320 case HIGH:
321 add[1] = true;
322 wSizes.add(wSizePicker.pickAndRemove());
323 wSizes.add(wSizePicker.pickAndRemove());
324 wTypes.add(wTypePicker.pickAndRemove());
325 wTypes.add(wTypePicker.pickAndRemove());
326 hullSizes.add(HullSize.FRIGATE);
327 hullSizes.add(HullSize.DESTROYER);
328 hullSizes.add(HullSize.CRUISER);
329 nWeapons = 20 + genRandom.nextInt(6);
330 nShips = 10 + genRandom.nextInt(3);
331 nFighters = 7 + genRandom.nextInt(3);
332 break;
333 case VERY_HIGH:
334 wSizes.add(WeaponSize.SMALL);
335 wSizes.add(WeaponSize.MEDIUM);
336 wSizes.add(WeaponSize.LARGE);
337
338 hullSizes.add(HullSize.FRIGATE);
339 hullSizes.add(HullSize.DESTROYER);
340 hullSizes.add(HullSize.CRUISER);
341 hullSizes.add(HullSize.CAPITAL_SHIP);
342
343 wTypes.add(WeaponType.BALLISTIC);
344 wTypes.add(WeaponType.ENERGY);
345 wTypes.add(WeaponType.MISSILE);
346 nWeapons = 1000;
347 nShips = 1000;
348 nFighters = 1000;
349 break;
350 }
351
352
354 prod.clear();
355
356 if (add[0]) {
359 //if (!spec.hasTag(Items.TAG_RARE_BP) && !spec.hasTag(Items.TAG_DEALER)) continue;
360 if (spec.hasTag(Items.TAG_NO_DEALER)) continue;
361 if (spec.hasTag(Tags.NO_SELL) && !spec.hasTag(Items.TAG_DEALER)) continue;
362 if (spec.hasTag(Tags.RESTRICTED)) continue;
363 if (spec.getHints().contains(ShipTypeHints.HIDE_IN_CODEX)) continue;
364 if (spec.getHints().contains(ShipTypeHints.UNBOARDABLE)) continue;
365 if (spec.isDefaultDHull()) continue; // || spec.isDHull()) continue;
366 if (spec.isDHullOldMethod()) continue;
367 if ("shuttlepod".equals(spec.getHullId())) continue;
368 if (ships.contains(spec.getHullId())) continue;
369 if (!hullSizes.contains(spec.getHullSize())) continue;
370 float cost = prod.createSampleItem(ProductionItemType.SHIP, spec.getHullId(), 1).getBaseCost();
371 cost = (int)Math.round(cost * costMult);
372 if (cost > maxCapacity) continue;
373 picker.add(spec.getHullId(), 10f);
374 }
375// int num = 2 + (int)Math.round(genRandom.nextInt(5) * getQuality());
376// num += imp.ordinal() * 2;
377// if (imp == PersonImportance.VERY_HIGH) num = 1000;
378 int num = nShips;
379 for (int i = 0; i < num && !picker.isEmpty(); i++) {
380 ships.add(picker.pickAndRemove());
381 }
382 }
383
384 if (add[1]) {
387 //if (!spec.hasTag(Items.TAG_RARE_BP) && !spec.hasTag(Items.TAG_DEALER)) continue;
388 if (spec.hasTag(Items.TAG_NO_DEALER)) continue;
389 if (spec.hasTag(Tags.NO_SELL) && !spec.hasTag(Items.TAG_DEALER)) continue;
390 if (spec.hasTag(Tags.RESTRICTED)) continue;
391 if (spec.getAIHints().contains(AIHints.SYSTEM)) continue;
392 if (weapons.contains(spec.getWeaponId())) continue;
393 if (!wTypes.contains(spec.getType())) continue;
394 if (!wSizes.contains(spec.getSize())) continue;
395 float cost = prod.createSampleItem(ProductionItemType.WEAPON, spec.getWeaponId(), 1).getBaseCost();
396 cost = (int)Math.round(cost * costMult);
397 if (cost > maxCapacity) continue;
398 picker.add(spec.getWeaponId(), 10f);
399 }
400// int num = 3 + (int)Math.round(genRandom.nextInt(7) * getQuality());
401// num += imp.ordinal() * 2;
402// if (imp == PersonImportance.VERY_HIGH) num = 1000;
403 int num = nWeapons;
404 for (int i = 0; i < num && !picker.isEmpty(); i++) {
405 weapons.add(picker.pickAndRemove());
406 }
407 }
408
409 if (add[2]) {
412 //if (!spec.hasTag(Items.TAG_RARE_BP) && !spec.hasTag(Items.TAG_DEALER)) continue;
413// if (spec.hasTag(Tags.NO_DROP)) continue;
414// if (spec.hasTag(Tags.NO_SELL)) continue;
415 if (spec.hasTag(Items.TAG_NO_DEALER)) continue;
416 if (spec.hasTag(Tags.NO_SELL) && !spec.hasTag(Items.TAG_DEALER)) continue;
417 if (spec.hasTag(Tags.RESTRICTED)) continue;
418 if (fighters.contains(spec.getId())) continue;
419 float cost = prod.createSampleItem(ProductionItemType.FIGHTER, spec.getId(), 1).getBaseCost();
420 cost = (int)Math.round(cost * costMult);
421 if (cost > maxCapacity) continue;
422 picker.add(spec.getId(), 10f);
423 }
424// int num = 1 + (int)Math.round(genRandom.nextInt(3) * getQuality());
425// num += imp.ordinal() * 2;
426// if (imp == PersonImportance.VERY_HIGH) num = 1000;
427 int num = nFighters;
428 for (int i = 0; i < num && !picker.isEmpty(); i++) {
429 fighters.add(picker.pickAndRemove());
430 }
431 }
432 }
433
434 protected void addMilitaryBlueprints() {
435 for (String id : faction.getKnownShips()) {
437 if (spec.hasTag(Tags.NO_SELL)) continue;
438 if (spec.isDHullOldMethod()) continue;
439 //if (spec.isDHull()) continue;
440 ships.add(id);
441 }
442 for (String id : faction.getKnownWeapons()) {
444 if (spec.hasTag(Tags.NO_DROP)) continue;
445 if (spec.hasTag(Tags.NO_SELL)) continue;
446 weapons.add(id);
447 }
448 for (String id : faction.getKnownFighters()) {
450 if (spec.hasTag(Tags.NO_DROP)) continue;
451 if (spec.hasTag(Tags.NO_SELL)) continue;
452 fighters.add(id);
453 }
454 }
455
456
457 protected void updateInteractionDataImpl() {
458 set("$cpc_military", getPerson().hasTag(Tags.CONTACT_MILITARY));
459 set("$cpc_trade", getPerson().hasTag(Tags.CONTACT_TRADE));
460 set("$cpc_armsDealer", armsDealer);
461
462 set("$cpc_barEvent", isBarEvent());
463 set("$cpc_manOrWoman", getPerson().getManOrWoman());
464 set("$cpc_maxCapacity", Misc.getWithDGS(maxCapacity));
465 set("$cpc_costPercent", (int)Math.round(costMult * 100f) + "%");
466 set("$cpc_days", "" + (int) PROD_DAYS);
467 }
468
469 @Override
470 public void addDescriptionForCurrentStage(TooltipMakerAPI info, float width, float height) {
471 float opad = 10f;
472 Color h = Misc.getHighlightColor();
473 if (currentStage == Stage.WAITING) {
475 int d = (int) Math.round(PROD_DAYS - elapsed);
476 PersonAPI person = getPerson();
477
478 LabelAPI label = info.addPara("The order will be delivered to storage " + market.getOnOrAt() + " " + market.getName() +
479 " in %s " + getDayOrDays(d) + ".", opad,
480 Misc.getHighlightColor(), "" + d);
481 label.setHighlight(market.getName(), "" + d);
483
484 //intel.createSmallDescription(info, width, height);
485 showCargoContents(info, width, height);
486
487
488 } else if (currentStage == Stage.DELIVERED) {
490 int d = (int) Math.round(elapsed);
491 LabelAPI label = info.addPara("The order was delivered to storage " + market.getOnOrAt() + " " + market.getName() +
492 " %s " + getDayOrDays(d) + " ago.", opad,
493 Misc.getHighlightColor(), "" + d);
494 label.setHighlight(market.getName(), "" + d);
496
497 showCargoContents(info, width, height);
498 addDeleteButton(info, width);
499 } else if (currentStage == Stage.FAILED) {
501 info.addPara("This order will not be completed because %s" +
502 " has decivilized.", opad,
504 } else {
505 info.addPara("You've learned that this order will not be completed.", opad);
506 }
507 }
508 }
509
510 @Override
511 public boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad) {
512 Color h = Misc.getHighlightColor();
513 if (currentStage == Stage.WAITING) {
515 addDays(info, "until delivery", PROD_DAYS - elapsed, tc, pad);
516 return true;
517 } else if (currentStage == Stage.DELIVERED) {
518 info.addPara("Delivered to %s", pad, tc, market.getFaction().getBaseUIColor(), market.getName());
519 return true;
520 }
521 return false;
522 }
523
524 @Override
525 public String getBaseName() {
526 return "Custom Production Order";
527 }
528
529 protected String getMissionTypeNoun() {
530 return "contract";
531 }
532
533 @Override
537
538 @Override
539 public void acceptImpl(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
540 float f = (float) cost / (float) maxCapacity;
541 float p = ContactIntel.DEFAULT_POTENTIAL_CONTACT_PROB * f;
542 if (armsDealer) {
544 }
546 for (PotentialContactData data : potentialContactsOnMissionSuccess) {
547 data.probability = p;
548 }
549 }
550
553 adjustRep(dialog.getTextPanel(), null, RepActions.MISSION_SUCCESS);
554 addPotentialContacts(dialog);
555
556 ships = null;
557 fighters = null;
558 weapons = null;
559 }
560
561
562 @Override
563 public void setCurrentStage(Object next, InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
564 super.setCurrentStage(next, dialog, memoryMap);
565
566 if (currentStage == Stage.DELIVERED) {
568 if (plugin == null) return;
569 plugin.setPlayerPaidToUnlock(true);
570
571 CargoAPI cargo = plugin.getCargo();
572 for (CargoAPI curr : data.data.values()) {
573 cargo.addAll(curr, true);
574 }
575
576 //endSuccess(dialog, memoryMap);
577
579 PersonAPI person = getPerson();
580 if (person == null || person.getMarket() == null) return;
581 String patrolFaction = person.getMarket().getFactionId();
582 if (patrolFaction.equals(person.getFaction().getId()) ||
585 patrolFaction.equals(Factions.PLAYER)) {
586 return;
587 }
588
590 e.setDelayMedium();
591 e.setLocationCoreOnly(true, patrolFaction);
592 e.beginCreate();
593 e.triggerCreateFleet(FleetSize.LARGE, FleetQuality.DEFAULT, patrolFaction, FleetTypes.PATROL_LARGE, new Vector2f());
594 e.setFleetWantsThing(patrolFaction,
595 "information regarding the arms dealer", "it",
596 "information concerning the activities of known arms dealer, " + person.getNameString(),
597 getRoundNumber(cost / 2),
598 false, ComplicationRepImpact.FULL,
603 e.endCreate();
604 }
605 }
606 }
607
608
609 @Override
610 protected boolean callAction(final String action, final String ruleId, final InteractionDialogAPI dialog,
611 final List<Token> params,
612 final Map<String, MemoryAPI> memoryMap) {
613 if ("pickPlayerBP".equals(action)) {
615 @Override
616 public float getCostMult() {
617 return costMult;
618 }
619 @Override
620 public float getMaximumValue() {
621 return maxCapacity;
622 }
623 @Override
624 public void notifyProductionSelected(FactionProductionAPI production) {
625 convertProdToCargo(production);
626 FireBest.fire(null, dialog, memoryMap, "CPCBlueprintsPicked");
627 }
628 });
629 return true;
630 }
631 if ("pickContactBP".equals(action)) {
633 @Override
634 public Set<String> getAvailableFighters() {
635 return fighters;
636 }
637 @Override
638 public Set<String> getAvailableShipHulls() {
639 return ships;
640 }
641 @Override
642 public Set<String> getAvailableWeapons() {
643 return weapons;
644 }
645 @Override
646 public float getCostMult() {
647 return costMult;
648 }
649 @Override
650 public float getMaximumValue() {
651 return maxCapacity;
652 }
653 @Override
654 public void notifyProductionSelected(FactionProductionAPI production) {
655 convertProdToCargo(production);
656 FireBest.fire(null, dialog, memoryMap, "CPCBlueprintsPicked");
657 }
658 });
659 return true;
660 }
661
662 return super.callAction(action, ruleId, dialog, params, memoryMap);
663 }
664
665
667 cost = prod.getTotalCurrentCost();
668 data = new ProductionData();
669 CargoAPI cargo = data.getCargo("Order manifest");
670
672 if (armsDealer) {
673 quality = Math.max(quality, 1.5f); // high enough (with some margin, at that) for no d-mods
674 }
675
677 ships.setCommander(Global.getSector().getPlayerPerson());
678 ships.getFleetData().setShipNameRandom(genRandom);
680 p.quality = quality;
681 p.mode = ShipPickMode.PRIORITY_THEN_ALL;
682 p.persistent = false;
683 p.seed = genRandom.nextLong();
684 p.timestamp = null;
685
686 FleetInflater inflater = Misc.getInflater(ships, p);
687 ships.setInflater(inflater);
688
689 for (ItemInProductionAPI item : prod.getCurrent()) {
690 int count = item.getQuantity();
691
692 if (item.getType() == ProductionItemType.SHIP) {
693 for (int i = 0; i < count; i++) {
694 ships.getFleetData().addFleetMember(item.getSpecId() + "_Hull");
695 }
696 } else if (item.getType() == ProductionItemType.FIGHTER) {
697 cargo.addFighters(item.getSpecId(), count);
698 } else if (item.getType() == ProductionItemType.WEAPON) {
699 cargo.addWeapons(item.getSpecId(), count);
700 }
701 }
702
703 // so that it adds d-mods
704 ships.inflateIfNeeded();
705 for (FleetMemberAPI member : ships.getFleetData().getMembersListCopy()) {
706 // it should be due to the inflateIfNeeded() call, this is just a safety check
707 if (member.getVariant().getSource() == VariantSource.REFIT) {
708 member.getVariant().clear();
709 }
710 cargo.getMothballedShips().addFleetMember(member);
711 }
712 }
713
714 public void showCargoContents(TooltipMakerAPI info, float width, float height) {
715 if (data == null) return;
716
717 Color h = Misc.getHighlightColor();
718 Color g = Misc.getGrayColor();
719 Color tc = Misc.getTextColor();
720 float pad = 3f;
721 float small = 3f;
722 float opad = 10f;
723
724 List<String> keys = new ArrayList<String>(data.data.keySet());
725 Collections.sort(keys, new Comparator<String>() {
726 public int compare(String o1, String o2) {
727 return o1.compareTo(o2);
728 }
729 });
730
731 for (String key : keys) {
732 CargoAPI cargo = data.data.get(key);
733 if (cargo.isEmpty() &&
734 ((cargo.getMothballedShips() == null ||
735 cargo.getMothballedShips().getMembersListCopy().isEmpty()))) {
736 continue;
737 }
738
740 Alignment.MID, opad);
741
742 if (!cargo.getStacksCopy().isEmpty()) {
743 info.addPara("Ship weapons and fighters:", opad);
744 info.showCargo(cargo, 20, true, opad);
745 }
746
747 if (!cargo.getMothballedShips().getMembersListCopy().isEmpty()) {
749 for (FleetMemberAPI member : cargo.getMothballedShips().getMembersListCopy()) {
750 counts.add(member.getVariant().getHullSpec().getHullName() + " " + member.getVariant().getDesignation());
751 }
752
753 info.addPara("Ship hulls:", opad);
754 info.showShips(cargo.getMothballedShips().getMembersListCopy(), 20, true,
755 getCurrentStage() == Stage.WAITING, opad);
756 }
757 }
758 }
759
762
763// picker.add(PersonImportance.VERY_LOW, 10f);
764// picker.add(PersonImportance.LOW, 10f);
765 picker.add(PersonImportance.MEDIUM, 10f);
766
767// int credits = (int) Global.getSector().getPlayerFleet().getCargo().getCredits().get();
768// if (credits >= 200000) {
769// picker.add(PersonImportance.MEDIUM, 10f);
770// }
771// if (credits >= 1000000) {
772// picker.add(PersonImportance.HIGH, 10f);
773// }
774// if (credits >= 200000) {
775// picker.add(PersonImportance.VERY_HIGH, 10f);
776// }
777
778 float cycles = PirateBaseManager.getInstance().getDaysSinceStart() / 365f;
779 if (cycles > 1f) {
780// picker.remove(PersonImportance.VERY_LOW);
781// picker.add(PersonImportance.MEDIUM, 20f);
782 picker.add(PersonImportance.HIGH, 5f);
783 }
784 if (cycles > 3f) {
785// picker.remove(PersonImportance.LOW);
786// picker.add(PersonImportance.HIGH, 10f);
788 picker.add(PersonImportance.VERY_HIGH, 5f);
789 }
790 if (cycles > 5f) {
791 //picker.add(PersonImportance.VERY_HIGH, 10f);
792 // always very high importance past a certain point, since the goal is to allow easier procurement
793 // of almost any "generally available" hull
795 }
796
797 return picker.pick();
798 }
799
800}
801
802
803
804
805
806
807
808
809
810
811
static SettingsAPI getSettings()
Definition Global.java:57
static FactoryAPI getFactory()
Definition Global.java:41
static SectorAPI getSector()
Definition Global.java:65
static float getShipQuality(MarketAPI market, String factionId)
void addDays(TooltipMakerAPI info, String after, float days)
void addDeleteButton(TooltipMakerAPI info, float width)
void acceptImpl(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
boolean callAction(final String action, final String ruleId, final InteractionDialogAPI dialog, final List< Token > params, final Map< String, MemoryAPI > memoryMap)
void showCargoContents(TooltipMakerAPI info, float width, float height)
void addDescriptionForCurrentStage(TooltipMakerAPI info, float width, float height)
void setCurrentStage(Object next, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
void setFleetWantsThing(String originalFactionId, String thing, String thingItOrThey, String thingDesc, int paymentOffered, boolean aggressiveIfDeclined, ComplicationRepImpact repImpact, String failTrigger, PersonAPI personForRepLoss)
void triggerCreateFleet(FleetSize size, FleetQuality quality, String factionId, String type, SectorEntityToken roughlyWhere)
void setLocationCoreOnly(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
void adjustRep(TextPanelAPI textPanel, HubMissionResult result, RepActions action)
void findOrCreateGiver(MarketAPI market, boolean addToCommDirectory, boolean cleanUpOnMissionOverIfWasNewPerson)
void connectWithDaysElapsed(Object from, Object to, float days)
static void addCreditsLossText(int credits, TextPanelAPI text)
static boolean fire(String ruleId, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap, String params)
Definition FireBest.java:56
void add(K key, int quantity)
static Color getTextColor()
Definition Misc.java:839
static String getWithDGS(float num)
Definition Misc.java:1381
static FleetInflater getInflater(CampaignFleetAPI fleet, Object params)
Definition Misc.java:4246
static boolean hasOrbitalStation(MarketAPI market)
Definition Misc.java:5059
static boolean isDecentralized(FactionAPI faction)
Definition Misc.java:5801
static Color getGrayColor()
Definition Misc.java:826
static Color getHighlightColor()
Definition Misc.java:792
static SubmarketPlugin getStorage(MarketAPI market)
Definition Misc.java:4295
static boolean isPirateFaction(FactionAPI faction)
Definition Misc.java:6150
static boolean isMilitary(MarketAPI market)
Definition Misc.java:5045
CampaignFleetAPI createEmptyFleet(String factionId, String name, boolean aiMode)
ShipHullSpecAPI getHullSpec(String hullId)
List< WeaponSpecAPI > getAllWeaponSpecs()
FighterWingSpecAPI getFighterWingSpec(String wingId)
WeaponSpecAPI getWeaponSpec(String weaponId)
List< ShipHullSpecAPI > getAllShipHullSpecs()
List< FighterWingSpecAPI > getAllFighterWingSpecs()
void addWeapons(String id, int count)
List< CargoStackAPI > getStacksCopy()
void addFighters(String id, int count)
FactionProductionAPI getProduction()
ItemInProductionAPI createSampleItem(ProductionItemType type, String specId, int quantity)
void addFleetMember(FleetMemberAPI member)
List< FleetMemberAPI > getMembersListCopy()
void showCustomProductionPicker(CustomProductionPickerDelegate delegate)
CommodityOnMarketAPI getCommodityData(String commodityId)
void setHighlight(int start, int end)
void setHighlightColors(Color ... colors)
void showShips(List< FleetMemberAPI > ships, int max, boolean sort, float pad)
LabelAPI addPara(String format, float pad, Color hl, String... highlights)
LabelAPI addSectionHeading(String str, Alignment align, float pad)
void showCargo(CargoAPI cargo, int max, boolean sort, float pad)