1package com.fs.starfarer.api.impl.campaign.procgen;
4import java.util.ArrayList;
5import java.util.LinkedHashSet;
8import java.util.Random;
11import com.fs.starfarer.api.Global;
12import com.fs.starfarer.api.campaign.BaseCustomProductionPickerDelegateImpl;
13import com.fs.starfarer.api.campaign.CampaignFleetAPI;
14import com.fs.starfarer.api.campaign.CargoAPI;
15import com.fs.starfarer.api.campaign.FactionAPI;
16import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
17import com.fs.starfarer.api.campaign.FactionProductionAPI;
18import com.fs.starfarer.api.campaign.FactionProductionAPI.ItemInProductionAPI;
19import com.fs.starfarer.api.campaign.FactionProductionAPI.ProductionItemType;
20import com.fs.starfarer.api.campaign.FleetInflater;
21import com.fs.starfarer.api.campaign.InteractionDialogAPI;
22import com.fs.starfarer.api.campaign.InteractionDialogPlugin;
23import com.fs.starfarer.api.campaign.OptionPanelAPI;
24import com.fs.starfarer.api.campaign.TextPanelAPI;
25import com.fs.starfarer.api.campaign.VisualPanelAPI;
26import com.fs.starfarer.api.campaign.econ.MarketAPI;
27import com.fs.starfarer.api.campaign.rules.MemoryAPI;
28import com.fs.starfarer.api.characters.MutableCharacterStatsAPI.SkillLevelAPI;
29import com.fs.starfarer.api.characters.OfficerDataAPI;
30import com.fs.starfarer.api.characters.PersonAPI;
31import com.fs.starfarer.api.combat.EngagementResultAPI;
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.AIHints;
36import com.fs.starfarer.api.fleet.FleetMemberAPI;
37import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflaterParams;
38import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
39import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
40import com.fs.starfarer.api.impl.campaign.ids.Factions;
41import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
42import com.fs.starfarer.api.impl.campaign.ids.Tags;
43import com.fs.starfarer.api.loading.FighterWingSpecAPI;
44import com.fs.starfarer.api.loading.HullModSpecAPI;
45import com.fs.starfarer.api.loading.WeaponSpecAPI;
46import com.fs.starfarer.api.plugins.OfficerLevelupPlugin;
47import com.fs.starfarer.api.util.Misc;
51 protected static enum FleetQuality {
59 protected static enum OptionId {
62 ADD_UNSELECTED_OFFICERS,
72 QUALITY_2_SMODS_OMEGA,
74 QUALITY_3_SMODS_OMEGA,
82 ADD_OFFICERS_NO_SKILLS,
92 public static class FleetGenData {
94 public FleetQuality quality;
95 public boolean smodsOnAllShips =
true;
96 public boolean allowOmega =
false;
98 public boolean addOfficers =
false;
99 public boolean keepOfficerPointsFree =
false;
100 public boolean append =
false;
103 public FleetGenData() {
115 protected FleetGenData
data =
new FleetGenData();
118 protected Set<String>
ships =
new LinkedHashSet<String>();
119 protected Set<String>
fighters =
new LinkedHashSet<String>();
120 protected Set<String>
weapons =
new LinkedHashSet<String>();
123 protected Set<String>
hullmods =
new LinkedHashSet<String>();
155 if (optionData ==
null)
return;
157 OptionId option = (OptionId) optionData;
172 case ADD_UNSELECTED_OFFICERS:
175 case OFFICERS_GO_BACK:
178 case OFFICER_LEVEL_5:
181 case OFFICER_LEVEL_6:
184 case OFFICER_LEVEL_7:
187 case QUALITY_MAX_DMODS:
188 data.quality = FleetQuality.MAX_DMODS;
191 case QUALITY_NO_DMODS:
192 data.quality = FleetQuality.NO_DMODS;
195 case QUALITY_1_SMODS:
196 data.quality = FleetQuality.ONE_SMOD;
199 case QUALITY_2_SMODS:
200 data.quality = FleetQuality.TWO_SMODS;
203 case QUALITY_2_SMODS_OMEGA:
204 data.quality = FleetQuality.TWO_SMODS;
205 data.allowOmega =
true;
208 case QUALITY_3_SMODS:
209 data.quality = FleetQuality.THREE_SMODS;
212 case QUALITY_3_SMODS_OMEGA:
213 data.quality = FleetQuality.THREE_SMODS;
214 data.allowOmega =
true;
218 data.addOfficers =
false;
222 data.addOfficers =
true;
225 case ADD_OFFICERS_NO_SKILLS:
226 data.addOfficers =
true;
227 data.keepOfficerPointsFree =
true;
258 float minDist = Float.MAX_VALUE;
261 if (curr.isHidden())
continue;
262 if (playerOnly && !curr.isPlayerOwned())
continue;
265 boolean nearer = dist < minDist;
266 if (dist == minDist && dist == 0 && nearest !=
null) {
281 System.out.println(str);
286 textPanel.
addPara(
"Ship variants will be randomly picked from those available for a given hull.");
287 textPanel.
addPara(
"Selected weapons and fighters will be added to your cargo.");
291 options.
addOption(
"Add officers with unselected skills", OptionId.ADD_UNSELECTED_OFFICERS);
296 textPanel.
addPara(
"Select option to instantly add an officer of that level with all unspent skills. The officer "
297 +
"level will be 1 higher than selected and they will not have an initial skill.");
312 options.
addOption(
"Average of 2 s-mods; allow some Omega weapons to be mounted", OptionId.QUALITY_2_SMODS_OMEGA);
314 options.
addOption(
"Average of 3 s-mods; allow some Omega weapons to be mounted", OptionId.QUALITY_3_SMODS_OMEGA);
319 textPanel.
addPara(
"The total number of officers and their level and elite skills will be based on your character's skills.");
321 options.
addOption(
"Add officers (number / level / elite skills based on your character's skills)", OptionId.ADD_OFFICERS);
330 options.
addOption(
"Replace current fleet with new ships", OptionId.CREATE_REPLACE);
351 public Set<String> getAvailableFighters() {
355 public Set<String> getAvailableShipHulls() {
359 public Set<String> getAvailableWeapons() {
363 public float getCostMult() {
367 public float getMaximumValue() {
370 public boolean withQuantityLimits() {
376 data.prod = production;
391 if (
data.quality == FleetQuality.MAX_DMODS) {
399 p.mode = ShipPickMode.PRIORITY_THEN_ALL;
400 p.persistent =
false;
401 p.seed = random.nextLong();
406 if (
data.quality == FleetQuality.ONE_SMOD) {
408 }
else if (
data.quality == FleetQuality.TWO_SMODS) {
410 }
else if (
data.quality == FleetQuality.THREE_SMODS) {
415 ships.setInflater(inflater);
418 int count = pick.getQuantity();
420 if (pick.getType() == ProductionItemType.SHIP) {
422 if (variants.isEmpty()) {
423 variants.add(pick.getSpecId() +
"_Hull");
426 for (
int i = 0; i < count; i++) {
427 int index = random.nextInt(variants.size());
428 ships.getFleetData().addFleetMember(variants.get(index));
430 }
else if (pick.getType() == ProductionItemType.FIGHTER) {
432 }
else if (pick.getType() == ProductionItemType.WEAPON) {
435 prod.
removeItem(pick.getType(), pick.getSpecId(), count);
439 List<String> addedWeapons =
new ArrayList<String>();
440 List<String> addedFighters =
new ArrayList<String>();
441 List<String> addedHullmods =
new ArrayList<String>();
443 if (
data.allowOmega) {
455 addedWeapons.add(
id);
461 addedFighters.add(
id);
467 addedHullmods.add(
id);
472 ships.inflateIfNeeded();
474 for (String
id : addedWeapons) {
477 for (String
id : addedFighters) {
480 for (String
id : addedHullmods) {
486 if (
data.addOfficers) {
499 if (
data.addOfficers) {
505 fp.maxOfficersToAdd = add;
517 if (neededCrew > 0) {
527 float max = member.getRepairTracker().getMaxCR();
528 member.getRepairTracker().setCR(max);
538 if (spec.isDefaultDHull())
continue;
539 if (spec.getHullSize() == HullSize.FIGHTER)
continue;
540 if (!spec.hasHullName())
continue;
541 if (spec.getHints().contains(ShipTypeHints.STATION))
continue;
544 if (
"shuttlepod".equals(spec.getHullId()))
continue;
545 ships.add(spec.getHullId());
550 if (spec.getAIHints().contains(AIHints.SYSTEM))
continue;
554 weapons.add(spec.getWeaponId());
587 textPanel.
addPara(
"Added level " + (level + 1) +
" officer with NO initial skill and 4 elite skills max.");
589 textPanel.
addPara(
"Added level " + (level + 1) +
" officer with NO initial skill.");
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
static void addCommanderAndOfficersV2(CampaignFleetAPI fleet, FleetParamsV3 params, Random random)
static final String PLAYER
static final String OFFICER_SKILL_PICKS_PER_LEVEL
static final String OFFICER_MAX_LEVEL
static final String OFFICER_MAX_ELITE_SKILLS
Set< String > unrestrictedWeapons
void selectAppendOrReplace()
MarketAPI getNearestMarket(boolean playerOnly)
Map< String, MemoryAPI > getMemoryMap()
void addNoSkillOfficer(int level)
void init(InteractionDialogAPI dialog)
void selectOfficerLevel()
static final Color HIGHLIGHT_COLOR
void optionSelected(String text, Object optionData)
void showBlueprintPicker()
OptionId lastOptionMousedOver
void advance(float amount)
Set< String > unrestrictedFighters
CampaignFleetAPI playerFleet
void showOfficerSelector()
void backFromEngagement(EngagementResultAPI result)
void optionMousedOver(String optionText, Object optionData)
InteractionDialogAPI dialog
void selectShipsAndWeapons()
static int getMaxOfficers(CampaignFleetAPI fleet)
static float getDistanceLY(SectorEntityToken from, SectorEntityToken to)
static FleetInflater getInflater(CampaignFleetAPI fleet, Object params)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
CargoAPI createCargo(boolean unlimitedStacks)
CampaignFleetAPI createEmptyFleet(String factionId, String name, boolean aiMode)
OfficerDataAPI createOfficerData(PersonAPI person)
ListMap< String > getHullIdToVariantListMap()
Object getPlugin(String id)
List< WeaponSpecAPI > getAllWeaponSpecs()
List< HullModSpecAPI > getAllHullModSpecs()
WeaponSpecAPI getWeaponSpec(String weaponId)
List< ShipHullSpecAPI > getAllShipHullSpecs()
List< FighterWingSpecAPI > getAllFighterWingSpecs()
Color getColor(String id)
FleetDataAPI getFleetData()
void addWeapons(String id, int count)
void addCrew(int quantity)
void addAll(CargoAPI other)
void addSupplies(float quantity)
void addFuel(float quantity)
void addFighters(String id, int count)
boolean knowsWeapon(String weaponId)
void addKnownFighter(String wingId, boolean setTimestamp)
FactionProductionAPI getProduction()
void addKnownWeapon(String weaponId, boolean setTimestamp)
boolean knowsFighter(String wingId)
void removeKnownHullMod(String modId)
void removeKnownFighter(String wingId)
void removeKnownWeapon(String weaponId)
boolean knowsHullMod(String modId)
PersonAPI createRandomPerson()
void addKnownHullMod(String modId)
List< ItemInProductionAPI > getCurrent()
FactionProductionAPI clone()
void removeItem(ProductionItemType type, String specId, int count)
void removeOfficer(PersonAPI person)
void addOfficer(PersonAPI person)
List< OfficerDataAPI > getOfficersCopy()
void addFleetMember(FleetMemberAPI member)
List< FleetMemberAPI > getMembersListCopy()
void showCustomProductionPicker(CustomProductionPickerDelegate delegate)
TextPanelAPI getTextPanel()
VisualPanelAPI getVisualPanel()
void addOptionSelectedText(Object optionId)
void setOptionOnEscape(String text, Object optionId)
OptionPanelAPI getOptionPanel()
void addOption(String text, Object data)
CampaignFleetAPI getPlayerFleet()
FactionAPI getPlayerFaction()
PersonAPI getPlayerPerson()
LabelAPI addPara(String text)
void appendToLastParagraph(String text)
void setVisualFade(float in, float out)
List< MarketAPI > getMarketsCopy()
SectorEntityToken getPrimaryEntity()
void set(String key, Object value)
List< SkillLevelAPI > getSkillsCopy()
void setSkillLevel(String id, float level)
MutableCharacterStatsAPI getStats()
MemoryAPI getMemoryWithoutUpdate()
boolean hasTag(String tag)
long getXPForLevel(int level)