Starsector API
Loading...
Searching...
No Matches
SurplusShipHull.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.missions;
2
3import java.util.ArrayList;
4import java.util.List;
5import java.util.Map;
6import java.util.Random;
7
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.FactionAPI;
10import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
11import com.fs.starfarer.api.campaign.FactionAPI.ShipPickParams;
12import com.fs.starfarer.api.campaign.InteractionDialogAPI;
13import com.fs.starfarer.api.campaign.PersonImportance;
14import com.fs.starfarer.api.campaign.econ.MarketAPI;
15import com.fs.starfarer.api.campaign.rules.MemoryAPI;
16import com.fs.starfarer.api.characters.PersonAPI;
17import com.fs.starfarer.api.combat.ShipVariantAPI;
18import com.fs.starfarer.api.fleet.FleetMemberAPI;
19import com.fs.starfarer.api.fleet.FleetMemberType;
20import com.fs.starfarer.api.fleet.ShipRolePick;
21import com.fs.starfarer.api.impl.campaign.DModManager;
22import com.fs.starfarer.api.impl.campaign.econ.impl.ShipQuality;
23import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflater;
24import com.fs.starfarer.api.impl.campaign.ids.Factions;
25import com.fs.starfarer.api.impl.campaign.ids.Ranks;
26import com.fs.starfarer.api.impl.campaign.ids.ShipRoles;
27import com.fs.starfarer.api.impl.campaign.ids.Tags;
28import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseManager;
29import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithBarEvent;
30import com.fs.starfarer.api.util.Misc;
31import com.fs.starfarer.api.util.Misc.Token;
32import com.fs.starfarer.api.util.WeightedRandomPicker;
33
35
36 public static float BASE_PRICE_MULT = 0.5f;
37
39 protected int price;
40
41 @Override
42 protected boolean create(MarketAPI createdAt, boolean barEvent) {
43 if (barEvent) {
44 List<String> posts = new ArrayList<String>();
45 posts.add(Ranks.POST_SUPPLY_OFFICER);
46 if (Misc.isMilitary(createdAt)) {
47 posts.add(Ranks.POST_BASE_COMMANDER);
48 }
49 if (Misc.hasOrbitalStation(createdAt)) {
51 }
52
53 String post = pickOne(posts);
54 setGiverPost(post);
55 if (post.equals(Ranks.POST_SUPPLY_OFFICER)) {
58 } else if (post.equals(Ranks.POST_BASE_COMMANDER)) {
61 } else if (post.equals(Ranks.POST_STATION_COMMANDER)) {
64 }
65 if (Factions.PIRATES.equals(createdAt.getFaction().getId())) {
68 } else {
70 }
71 findOrCreateGiver(createdAt, false, false);
72 }
73
74 PersonAPI person = getPerson();
75 if (person == null) return false;
76 MarketAPI market = person.getMarket();
77 if (market == null) return false;
78
79 if (market.isPlayerOwned()) return false;
80 if (!Misc.isMilitary(market) && market.getSize() < 7) return false;
81
82 if (!setPersonMissionRef(person, "$sShip_ref")) {
83 return false;
84 }
85
86 if (barEvent) {
88 }
89
90 //genRandom = Misc.random;
91
92
93 ShipPickParams params = new ShipPickParams(ShipPickMode.PRIORITY_THEN_ALL);
94 String role = pickRole(getQuality(), person.getFaction(), person.getImportance(), genRandom);
95
96 ShipVariantAPI variant = null;
97 for (int i = 0; i < 10; i++) {
98 List<ShipRolePick> picks = market.getFaction().pickShip(role, params, null, genRandom);
99 if (picks.isEmpty()) return false;
100 String variantId = picks.get(0).variantId;
101 variant = Global.getSettings().getVariant(variantId);
102 variant = Global.getSettings().getVariant(variant.getHullSpec().getHullId() + "_Hull").clone();
103 if (variant.getHullSpec().hasTag(Tags.NO_SELL)) {
104 variant = null;
105 continue;
106 }
107 break;
108 }
109 if (variant == null) return false;
110
113
114 float quality = ShipQuality.getShipQuality(market, person.getFaction().getId());
116 int addDmods = DefaultFleetInflater.getNumDModsToAdd(variant, averageDmods, genRandom);
117 if (addDmods > 0) {
118 DModManager.setDHull(variant);
119 DModManager.addDMods(member, true, addDmods, genRandom);
120 }
123
124 if (BASE_PRICE_MULT == 1f) {
125 price = (int) Math.round(variant.getHullSpec().getBaseValue());
126 } else {
128 }
129
132
133 return true;
134 }
135
136 protected void updateInteractionDataImpl() {
137 // this is weird - in the accept() method, the mission is aborted, which unsets
138 // $sShip_ref. So: we use $sShip_ref2 in the ContactPostAccept rule
139 // and $sShip_ref2 has an expiration of 0, so it'll get unset on its own later.
140 set("$sShip_ref2", this);
141
142 set("$sShip_barEvent", isBarEvent());
143 set("$sShip_hullSize", member.getHullSpec().getDesignation().toLowerCase());
144 set("$sShip_hullClass", member.getHullSpec().getHullNameWithDashClass());
145 set("$sShip_price", Misc.getWithDGS(price));
146 set("$sShip_manOrWoman", getPerson().getManOrWoman());
147 set("$sShip_rank", getPerson().getRank().toLowerCase());
148 set("$sShip_rankAOrAn", getPerson().getRankArticle());
149 set("$sShip_hisOrHer", getPerson().getHisOrHer());
150 set("$sShip_member", member);
151 }
152
153 @Override
154 protected boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List<Token> params,
155 Map<String, MemoryAPI> memoryMap) {
156 if ("showShip".equals(action)) {
158 return true;
159 } else if ("showPerson".equals(action)) {
160 dialog.getVisualPanel().showPersonInfo(getPerson(), true);
161 return true;
162 }
163 return false;
164 }
165
166 @Override
167 public String getBaseName() {
168 return "Surplus Ship Hull"; // not used I don't think
169 }
170
171 @Override
172 public void accept(InteractionDialogAPI dialog, Map<String, MemoryAPI> memoryMap) {
173 // it's just an transaction immediate transaction handled in rules.csv
174 // no intel item etc
175
176 currentStage = new Object(); // so that the abort() assumes the mission was successful
177 abort();
178 }
179
180 public static String pickRole(float quality, FactionAPI faction, PersonImportance imp, Random random) {
182
183 float cycles = PirateBaseManager.getInstance().getDaysSinceStart() / 365f;
184
185 if (imp == PersonImportance.VERY_HIGH && cycles < 3) imp = PersonImportance.HIGH;
186 if (imp == PersonImportance.HIGH && cycles < 1) imp = PersonImportance.MEDIUM;
187
188 if (quality < 0.5f && imp.ordinal() > PersonImportance.MEDIUM.ordinal()) {
190 }
191
192 float w = faction.getDoctrine().getWarships() - 1f;
193 float c = faction.getDoctrine().getCarriers() - 1f;
194 float p = faction.getDoctrine().getPhaseShips() - 1f;
195 if (w + c + p < 1) w = 1;
196
197 switch (imp) {
198 case VERY_LOW:
199 picker.add(ShipRoles.COMBAT_SMALL, w);
200 picker.add(ShipRoles.COMBAT_MEDIUM, w/2f);
201 picker.add(ShipRoles.CARRIER_SMALL, c);
202 picker.add(ShipRoles.PHASE_SMALL, p);
203 break;
204 case LOW:
205 picker.add(ShipRoles.COMBAT_SMALL, w/2f);
206 picker.add(ShipRoles.COMBAT_MEDIUM, w);
207 picker.add(ShipRoles.CARRIER_SMALL, c);
208 picker.add(ShipRoles.PHASE_SMALL, p);
209 break;
210 case MEDIUM:
211 picker.add(ShipRoles.COMBAT_MEDIUM, w/2f);
212 picker.add(ShipRoles.COMBAT_LARGE, w);
213 picker.add(ShipRoles.CARRIER_SMALL, c/2f);
214 picker.add(ShipRoles.CARRIER_MEDIUM, c);
215 picker.add(ShipRoles.PHASE_SMALL, p/2f);
216 picker.add(ShipRoles.PHASE_MEDIUM, p);
217 break;
218 case HIGH:
219 picker.add(ShipRoles.COMBAT_MEDIUM, w/4f);
220 picker.add(ShipRoles.COMBAT_LARGE, w);
221 picker.add(ShipRoles.COMBAT_CAPITAL, w/2f);
222 picker.add(ShipRoles.CARRIER_MEDIUM, c);
223 picker.add(ShipRoles.CARRIER_LARGE, c/2f);
224 picker.add(ShipRoles.PHASE_MEDIUM, p);
225 picker.add(ShipRoles.PHASE_LARGE, p/2f);
226 break;
227 case VERY_HIGH:
228 picker.add(ShipRoles.COMBAT_MEDIUM, w/4f);
229 picker.add(ShipRoles.COMBAT_LARGE, w/2f);
230 picker.add(ShipRoles.COMBAT_CAPITAL, w);
231 picker.add(ShipRoles.CARRIER_MEDIUM, c/2f);
232 picker.add(ShipRoles.CARRIER_LARGE, c);
233 picker.add(ShipRoles.PHASE_MEDIUM, p/2f);
234 picker.add(ShipRoles.PHASE_LARGE, p);
235 picker.add(ShipRoles.PHASE_CAPITAL, p/2f);
236 break;
237 }
238 return picker.pick();
239 }
240
241}
242
static SettingsAPI getSettings()
Definition Global.java:57
static FactoryAPI getFactory()
Definition Global.java:41
static void addDMods(FleetMemberData data, boolean own, CampaignFleetAPI recoverer, Random random)
static boolean setDHull(ShipVariantAPI variant)
static float getShipQuality(MarketAPI market, String factionId)
static int getNumDModsToAdd(ShipVariantAPI variant, float averageDMods, Random random)
void accept(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
boolean create(MarketAPI createdAt, boolean barEvent)
static String pickRole(float quality, FactionAPI faction, PersonImportance imp, Random random)
boolean callAction(String action, String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
void findOrCreateGiver(MarketAPI market, boolean addToCommDirectory, boolean cleanUpOnMissionOverIfWasNewPerson)
void assignShipName(FleetMemberAPI member, String factionId)
static String getWithDGS(float num)
Definition Misc.java:1381
static boolean hasOrbitalStation(MarketAPI market)
Definition Misc.java:5059
static boolean isMilitary(MarketAPI market)
Definition Misc.java:5045
FleetMemberAPI createFleetMember(FleetMemberType type, String variantOrWingId)
ShipVariantAPI getVariant(String variantId)
List< ShipRolePick > pickShip(String role, ShipPickParams params)
void showFleetMemberInfo(FleetMemberAPI member)