1package com.fs.starfarer.api.impl.campaign.missions;
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
6import java.util.LinkedHashMap;
7import java.util.LinkedHashSet;
14import org.lwjgl.util.vector.Vector2f;
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;
92 public static Map<PersonImportance, Float>
DEALER_MULT =
new LinkedHashMap<PersonImportance, Float>();
108 public static enum Stage {
115 protected Set<String>
ships =
new LinkedHashSet<String>();
116 protected Set<String>
weapons =
new LinkedHashSet<String>();
117 protected Set<String>
fighters =
new LinkedHashSet<String>();
131 boolean allowArmsDealer =
true;
133 boolean allowMilitary = allowTrader && createdAt !=
null &&
Misc.
isMilitary(createdAt);
136 allowMilitary =
false;
139 allowMilitary =
false;
150 List<String> posts =
new ArrayList<String>();
162 }
else if (allowTrader) {
172 if (post ==
null && allowArmsDealer) {
178 if (post ==
null)
return false;
196 if (person ==
null)
return false;
203 if (
market ==
null)
return false;
217 if (capMult > 1) capMult = 1f;
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;
274 Set<HullSize> hullSizes =
new LinkedHashSet<HullSize>();
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);
292 wSizes.add(WeaponSize.SMALL);
299 wSizePicker.
remove(WeaponSize.LARGE);
302 hullSizes.add(HullSize.FRIGATE);
314 hullSizes.add(HullSize.FRIGATE);
315 hullSizes.add(HullSize.DESTROYER);
326 hullSizes.add(HullSize.FRIGATE);
327 hullSizes.add(HullSize.DESTROYER);
328 hullSizes.add(HullSize.CRUISER);
334 wSizes.add(WeaponSize.SMALL);
335 wSizes.add(WeaponSize.MEDIUM);
336 wSizes.add(WeaponSize.LARGE);
338 hullSizes.add(HullSize.FRIGATE);
339 hullSizes.add(HullSize.DESTROYER);
340 hullSizes.add(HullSize.CRUISER);
341 hullSizes.add(HullSize.CAPITAL_SHIP);
343 wTypes.add(WeaponType.BALLISTIC);
344 wTypes.add(WeaponType.ENERGY);
345 wTypes.add(WeaponType.MISSILE);
363 if (spec.getHints().contains(ShipTypeHints.HIDE_IN_CODEX))
continue;
364 if (spec.getHints().contains(ShipTypeHints.UNBOARDABLE))
continue;
365 if (spec.isDefaultDHull())
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;
373 picker.
add(spec.getHullId(), 10f);
379 for (
int i = 0; i < num && !picker.
isEmpty(); i++) {
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;
398 picker.
add(spec.getWeaponId(), 10f);
404 for (
int i = 0; i < num && !picker.
isEmpty(); i++) {
418 if (
fighters.contains(spec.getId()))
continue;
422 picker.
add(spec.getId(), 10f);
428 for (
int i = 0; i < num && !picker.
isEmpty(); i++) {
465 set(
"$cpc_costPercent", (int)Math.round(
costMult * 100f) +
"%");
490 int d = (int) Math.round(
elapsed);
501 info.
addPara(
"This order will not be completed because %s" +
502 " has decivilized.", opad,
505 info.
addPara(
"You've learned that this order will not be completed.", opad);
526 return "Custom Production Order";
541 float p = ContactIntel.DEFAULT_POTENTIAL_CONTACT_PROB * f;
547 data.probability = p;
564 super.setCurrentStage(next, dialog, memoryMap);
568 if (plugin ==
null)
return;
580 if (person ==
null || person.
getMarket() ==
null)
return;
595 "information regarding the arms dealer",
"it",
596 "information concerning the activities of known arms dealer, " + person.
getNameString(),
598 false, ComplicationRepImpact.FULL,
611 final List<Token> params,
612 final Map<String, MemoryAPI> memoryMap) {
613 if (
"pickPlayerBP".equals(action)) {
616 public float getCostMult() {
620 public float getMaximumValue() {
626 FireBest.
fire(
null, dialog, memoryMap,
"CPCBlueprintsPicked");
631 if (
"pickContactBP".equals(action)) {
634 public Set<String> getAvailableFighters() {
638 public Set<String> getAvailableShipHulls() {
642 public Set<String> getAvailableWeapons() {
646 public float getCostMult() {
650 public float getMaximumValue() {
656 FireBest.
fire(
null, dialog, memoryMap,
"CPCBlueprintsPicked");
662 return super.callAction(action, ruleId, dialog, params, memoryMap);
668 data =
new ProductionData();
681 p.mode = ShipPickMode.PRIORITY_THEN_ALL;
682 p.persistent =
false;
687 ships.setInflater(inflater);
690 int count = item.getQuantity();
692 if (item.getType() == ProductionItemType.SHIP) {
693 for (
int i = 0; i < count; i++) {
694 ships.getFleetData().addFleetMember(item.getSpecId() +
"_Hull");
696 }
else if (item.getType() == ProductionItemType.FIGHTER) {
698 }
else if (item.getType() == ProductionItemType.WEAPON) {
704 ships.inflateIfNeeded();
708 member.getVariant().clear();
715 if (
data ==
null)
return;
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);
731 for (String key : keys) {
743 info.
addPara(
"Ship weapons and fighters:", opad);
750 counts.
add(member.getVariant().getHullSpec().getHullName() +
" " + member.getVariant().getDesignation());
753 info.
addPara(
"Ship hulls:", opad);
797 return picker.
pick();
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
static float getShipQuality(MarketAPI market, String factionId)
static final String SHIPS
static final String DECIVILIZED
static final String PIRATES
static final String PLAYER
static final String INDEPENDENT
static final String PATROL_LARGE
static final String TAG_DEALER
static final String TAG_NO_DEALER
static String POST_SUPPLY_OFFICER
static String POST_PORTMASTER
static String GROUND_MAJOR
static String POST_STATION_COMMANDER
static String POST_TRADER
static String POST_ARMS_DEALER
static String POST_INVESTOR
static String POST_COMMODITIES_AGENT
static String POST_ADMINISTRATOR
static String SPACE_ADMIRAL
static String GROUND_CAPTAIN
static String POST_SENIOR_EXECUTIVE
static String SPACE_CAPTAIN
static String POST_BASE_COMMANDER
static String SPACE_COMMANDER
static String GROUND_COLONEL
static String POST_MERCHANT
static String POST_EXECUTIVE
void addDays(TooltipMakerAPI info, String after, float days)
void addDeleteButton(TooltipMakerAPI info, float width)
float getDaysSinceStart()
static PirateBaseManager getInstance()
static float DEALER_FIXED_COST_INCREASE
void acceptImpl(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
static float PROB_MILITARY_BAR
boolean callAction(final String action, final String ruleId, final InteractionDialogAPI dialog, final List< Token > params, final Map< String, MemoryAPI > memoryMap)
void addMilitaryBlueprints()
boolean create(MarketAPI createdAt, boolean barEvent)
static int BAR_CAPACITY_BONUS_MAX
static float MIN_CAPACITY
String getMissionTypeNoun()
static Map< PersonImportance, Float > DEALER_MULT
static float MAX_PROD_CAPACITY_MULT
static float MILITARY_CAP_MULT
SectorEntityToken getMapLocation(SectorMapAPI map)
PersonImportance pickArmsDealerImportance()
boolean addNextStepText(TooltipMakerAPI info, Color tc, float pad)
static float TRADE_MAX_COST_INCREASE
void convertProdToCargo(FactionProductionAPI prod)
void addArmsDealerBlueprints()
void showCargoContents(TooltipMakerAPI info, float width, float height)
static float MAX_CAPACITY
static float ARMS_DEALER_PROB_PATROL_AFTER
static float DEALER_MAX_CAPACITY
static int BAR_CAPACITY_BONUS_MIN
void updateInteractionDataImpl()
static float DEALER_MIN_CAPACITY
static float PROB_ARMS_DEALER_BAR
static float PROB_ARMS_DEALER_IS_CONTACT
static float MAX_PROD_CAPACITY_AT_SHIP_UNITS
static float MILITARY_MAX_COST_DECREASE
void addDescriptionForCurrentStage(TooltipMakerAPI info, float width, float height)
void setCurrentStage(Object next, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
static float PROB_INDEPENDENT_BAR
static float DEALER_VARIABLE_COST_INCREASE
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 triggerSetStandardAggroInterceptFlags()
static String TRIGGER_REP_LOSS_HIGH
void setLocationCoreOnly(boolean allowInsidePopulatedSystems, String requireLargestMarketNotHostileToFaction)
void triggerSetAdjustStrengthBasedOnQuality(boolean randomize, float quality)
float getRewardMultFraction()
List< PotentialContactData > potentialContactsOnMissionSuccess
boolean rollProbability(float p)
void adjustRep(TextPanelAPI textPanel, HubMissionResult result, RepActions action)
int genRoundNumber(int min, int max)
boolean setPersonMissionRef(PersonAPI person, String key)
PersonImportance pickImportance()
void setGiverPost(String giverPost)
MarketAPI getMarket(String id)
static int getRoundNumber(float num)
void setSuccessStage(Object id)
void setGiverRank(String giverRank)
void setGiverImportance(PersonImportance giverImportance)
void setFailureStage(Object id)
void setGiverTags(String ... giverTags)
void findOrCreateGiver(MarketAPI market, boolean addToCommDirectory, boolean cleanUpOnMissionOverIfWasNewPerson)
PersonImportance pickHighImportance()
void setGiverFaction(String factionId)
String pickOne(List< String > options)
float getElapsedInCurrentStage()
void setStartingStage(Object startingStage)
void setGiverIsPotentialContactOnSuccess()
void addPotentialContacts(InteractionDialogAPI dialog)
void setStageOnMarketDecivilized(Object to, MarketAPI market)
String getDayOrDays(float days)
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)
void setPlayerPaidToUnlock(boolean playerPaidToUnlock)
void add(K key, int quantity)
static Color getTextColor()
static String getWithDGS(float num)
static FleetInflater getInflater(CampaignFleetAPI fleet, Object params)
static boolean hasOrbitalStation(MarketAPI market)
static boolean isDecentralized(FactionAPI faction)
static Color getGrayColor()
static Color getHighlightColor()
static SubmarketPlugin getStorage(MarketAPI market)
static boolean isPirateFaction(FactionAPI faction)
static boolean isMilitary(MarketAPI market)
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)
void addAll(CargoAPI other)
MutableValue getCredits()
List< CargoStackAPI > getStacksCopy()
FleetDataAPI getMothballedShips()
void addFighters(String id, int count)
FactionProductionAPI getProduction()
Set< String > getKnownFighters()
Set< String > getKnownWeapons()
Set< String > getKnownShips()
int getTotalCurrentCost()
List< ItemInProductionAPI > getCurrent()
ItemInProductionAPI createSampleItem(ProductionItemType type, String specId, int quantity)
FactionProductionAPI clone()
void addFleetMember(FleetMemberAPI member)
List< FleetMemberAPI > getMembersListCopy()
void showCustomProductionPicker(CustomProductionPickerDelegate delegate)
TextPanelAPI getTextPanel()
CampaignFleetAPI getPlayerFleet()
FactionAPI getPlayerFaction()
PersonAPI getPlayerPerson()
CommodityOnMarketAPI getCommodityData(String commodityId)
boolean hasCondition(String id)
SectorEntityToken getPrimaryEntity()
boolean hasTag(String tag)
PersonImportance getImportance()
boolean hasTag(String tag)
boolean isDHullOldMethod()
boolean hasTag(String tag)
boolean hasTag(String tag)
void setHighlight(int start, int end)
void setHighlightColors(Color ... colors)