Starsector API
Loading...
Searching...
No Matches
ThreatFIDConfig.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat.threat;
2
3import java.util.ArrayList;
4import java.util.List;
5import java.util.Random;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CampaignFleetAPI;
9import com.fs.starfarer.api.campaign.CargoAPI;
10import com.fs.starfarer.api.campaign.CargoStackAPI;
11import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.DataForEncounterSide;
12import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.FleetMemberData;
13import com.fs.starfarer.api.campaign.InteractionDialogAPI;
14import com.fs.starfarer.api.combat.BattleCreationContext;
15import com.fs.starfarer.api.combat.ShipVariantAPI;
16import com.fs.starfarer.api.fleet.FleetMemberAPI;
17import com.fs.starfarer.api.impl.campaign.DebugFlags;
18import com.fs.starfarer.api.impl.campaign.FleetEncounterContext;
19import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl.BaseFIDDelegate;
20import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl.FIDConfig;
21import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl.FIDConfigGen;
22import com.fs.starfarer.api.impl.campaign.ids.Tags;
23import com.fs.starfarer.api.impl.combat.threat.ConstructionSwarmSystemScript.SwarmConstructableVariant;
24import com.fs.starfarer.api.loading.HullModSpecAPI;
25import com.fs.starfarer.api.util.Misc;
26import com.fs.starfarer.api.util.WeightedRandomPicker;
27
28public class ThreatFIDConfig implements FIDConfigGen {
29 public FIDConfig createConfig() {
30 FIDConfig config = new FIDConfig();
31
32 config.alwaysAttackVsAttack = true;
33 //config.alwaysPursue = true;
34 config.alwaysHarry = true;
35 config.showTransponderStatus = false;
36 //config.showEngageText = false;
37 config.lootCredits = false;
38
39
40 config.delegate = new BaseFIDDelegate() {
41 public void postPlayerSalvageGeneration(InteractionDialogAPI dialog, FleetEncounterContext context, CargoAPI salvage) {
42 if (!(dialog.getInteractionTarget() instanceof CampaignFleetAPI)) return;
43
44 float mult = context.computePlayerContribFraction();
45 float p = Global.getSettings().getFloat("salvageHullmodProb");
46 float pItem = Global.getSettings().getFloat("salvageHullmodRequiredItemProb");
47
49
50 DataForEncounterSide data = context.getDataFor(fleet);
51 List<FleetMemberAPI> losses = new ArrayList<FleetMemberAPI>();
52 for (FleetMemberData fmd : data.getOwnCasualties()) {
53 losses.add(fmd.getMember());
54 }
55
56 Random random = Misc.getRandom(Misc.getSalvageSeed(fleet), 7);
57 //random = new Random();
58
59 for (FleetMemberAPI member : losses) {
60 if (member.getHullSpec().hasTag(Tags.THREAT_FABRICATOR)) {
61 int rolls = 0;
62 switch (member.getHullSpec().getHullSize()) {
63 case CAPITAL_SHIP: rolls = 30; break;
64 case CRUISER: rolls = 18; break;
65 case DESTROYER: rolls = 12; break;
66 case FRIGATE: rolls = 6; break;
67 }
68
70 for (SwarmConstructableVariant curr : ConstructionSwarmSystemScript.CONSTRUCTABLE) {
71 picker.add(curr, curr.dp);
72 }
73
74 for (int i = 0; i < rolls; i++) {
75 SwarmConstructableVariant pick = picker.pick();
76 ShipVariantAPI variant = Global.getSettings().getVariant(pick.variantId);
77
78 for (String id : variant.getHullMods()) {
79 if (!variant.getHullSpec().isBuiltInMod(id)) {
80 if (random.nextFloat() < pItem && random.nextFloat() < mult) {
83 if (item != null) {
84 boolean addToLoot = true;
86 addToLoot = false;
87 } else if (item.getResourceIfResource() != null && item.getResourceIfResource().hasTag(Tags.NO_DROP)) {
88 addToLoot = false;
89 } else if (item.getFighterWingSpecIfWing() != null && item.getFighterWingSpecIfWing().hasTag(Tags.NO_DROP)) {
90 addToLoot = false;
91 } else if (item.getWeaponSpecIfWeapon() != null && item.getWeaponSpecIfWeapon().hasTag(Tags.NO_DROP)) {
92 addToLoot = false;
93 }
94 if (addToLoot) {
95 salvage.addItems(item.getType(), item.getData(), 1);
96 }
97 }
98 }
99 }
100
101 //if (random.nextFloat() > mult) continue;
102 if (random.nextFloat() < p && random.nextFloat() < mult) {
104 boolean known = Global.getSector().getPlayerFaction().knowsHullMod(id);
105 if (DebugFlags.ALLOW_KNOWN_HULLMOD_DROPS) known = false;
106 if (known || spec.isHidden() || spec.isHiddenEverywhere()) continue;
107 //if (spec.isAlwaysUnlocked()) continue;
108 if (spec.hasTag(Tags.HULLMOD_NO_DROP)) continue;
109
110 salvage.addHullmods(id, 1);
111 }
112 }
113 }
114 }
115 }
116 }
117
118 public void battleContextCreated(InteractionDialogAPI dialog, BattleCreationContext bcc) {
119 bcc.aiRetreatAllowed = false;
120 bcc.fightToTheLast = true;
121
122 if (bcc.getOtherFleet() != null) {
124 if (curr.getHullSpec().hasTag(Tags.THREAT_FABRICATOR)) {
125 bcc.forceObjectivesOnMap = true;
126 break;
127 }
128 }
129 }
130
131 Global.getSector().getPlayerMemoryWithoutUpdate().set("$encounteredThreat", true);
132 Global.getSector().getPlayerMemoryWithoutUpdate().set("$encounteredWeird", true);
133 //bcc.enemyDeployAll = true;
134 }
135 };
136 return config;
137 }
138}
139
140
141
142
143
static SettingsAPI getSettings()
Definition Global.java:57
static SectorAPI getSector()
Definition Global.java:65
DataForEncounterSide getDataFor(CampaignFleetAPI participantOrCombined)
static Random getRandom(long seed, int level)
Definition Misc.java:2973
static long getSalvageSeed(SectorEntityToken entity)
Definition Misc.java:4129
ShipVariantAPI getVariant(String variantId)
HullModSpecAPI getHullModSpec(String modId)
List< FleetMemberAPI > getMembersWithFightersCopy()
void addHullmods(String id, int count)
void addItems(CargoAPI.CargoItemType itemType, Object data, float quantity)
SpecialItemSpecAPI getSpecialItemSpecIfSpecial()
void set(String key, Object value)