Starsector API
Loading...
Searching...
No Matches
NGCAddStandardStartingScript.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.rulecmd;
2
3import java.util.List;
4import java.util.Map;
5import java.util.Random;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.Script;
9import com.fs.starfarer.api.campaign.CampaignFleetAPI;
10import com.fs.starfarer.api.campaign.CargoAPI;
11import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
12import com.fs.starfarer.api.campaign.FleetInflater;
13import com.fs.starfarer.api.campaign.InteractionDialogAPI;
14import com.fs.starfarer.api.campaign.PersistentUIDataAPI.AbilitySlotAPI;
15import com.fs.starfarer.api.campaign.PersistentUIDataAPI.AbilitySlotsAPI;
16import com.fs.starfarer.api.campaign.PlanetAPI;
17import com.fs.starfarer.api.campaign.StarSystemAPI;
18import com.fs.starfarer.api.campaign.rules.MemKeys;
19import com.fs.starfarer.api.campaign.rules.MemoryAPI;
20import com.fs.starfarer.api.characters.CharacterCreationData;
21import com.fs.starfarer.api.characters.PersonAPI;
22import com.fs.starfarer.api.combat.ShipVariantAPI;
23import com.fs.starfarer.api.fleet.FleetMemberAPI;
24import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflaterParams;
25import com.fs.starfarer.api.impl.campaign.ids.Commodities;
26import com.fs.starfarer.api.impl.campaign.ids.Factions;
27import com.fs.starfarer.api.impl.campaign.ids.HullMods;
28import com.fs.starfarer.api.impl.campaign.ids.Personalities;
29import com.fs.starfarer.api.impl.campaign.ids.Ranks;
30import com.fs.starfarer.api.impl.campaign.ids.Skills;
31import com.fs.starfarer.api.impl.campaign.tutorial.CampaignTutorialScript;
32import com.fs.starfarer.api.impl.campaign.tutorial.SpacerObligation;
33import com.fs.starfarer.api.impl.campaign.tutorial.TutorialMissionIntel;
34import com.fs.starfarer.api.loading.VariantSource;
35import com.fs.starfarer.api.util.Misc;
36import com.fs.starfarer.api.util.Misc.Token;
37import com.fs.starfarer.api.util.WeightedRandomPicker;
38
45
46 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
47 if (dialog == null) return false;
48
49 CharacterCreationData data = (CharacterCreationData) memoryMap.get(MemKeys.LOCAL).get("$characterData");
50 final MemoryAPI memory = memoryMap.get(MemKeys.LOCAL);
51 data.addScriptBeforeTimePass(new Script() {
52 public void run() {
53 boolean explorer = memory.getBoolean("$ngcExplorerSelected");
54 boolean merc = memory.getBoolean("$ngcMercSelected");
55 boolean random = memory.getBoolean("$ngcRandomSelected");
56 boolean spacer = memory.getBoolean("$ngcSpacerSelected");
57 if (explorer || merc || random) {
58 //PirateBaseManager.getInstance().setExtraDays(400f);
59 Global.getSector().getMemoryWithoutUpdate().set("$fastStart", true);
60 if (explorer) {
61 Global.getSector().getMemoryWithoutUpdate().set("$fastStartExplorer", true);
62 }
63 if (merc) {
64 Global.getSector().getMemoryWithoutUpdate().set("$fastStartMerc", true);
65 }
66 if (random) {
67 Global.getSector().getMemoryWithoutUpdate().set("$fastStartRandom", true);
68 }
69 }
70 if (spacer) {
71 Global.getSector().getMemoryWithoutUpdate().set("$spacerStart", true);
72 }
73
74 boolean skipTutorial = memory.getBoolean("$ngcSkipTutorial");
75 if (!skipTutorial) {
76 Global.getSector().getMemoryWithoutUpdate().set(CampaignTutorialScript.USE_TUTORIAL_RESPAWN, true);
77 }
78 }
79 });
80
81 data.addScript(new Script() {
82 public void run() {
83 CampaignFleetAPI fleet = Global.getSector().getPlayerFleet();
84 // add crew, supplies, and fuel
85 int crew = 0;
86 int supplies = 0;
87 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
88 crew += Math.ceil(member.getMinCrew() + (member.getMaxCrew() - member.getMinCrew()) * 0.5f);
89 supplies += member.getDeploymentCostSupplies() * 4f;
90 }
91
92 CargoAPI cargo = fleet.getCargo();
93 cargo.initPartialsIfNeeded();
94
95 cargo.addCrew(crew);
96 cargo.addSupplies(10);
97 cargo.addCommodity(Commodities.HEAVY_MACHINERY, 10);
98 cargo.addFuel(cargo.getMaxFuel() * 0.5f);
99
100
101 boolean addOfficer = memory.getBoolean("$ngcAddOfficer");
102 boolean skipTutorial = memory.getBoolean("$ngcSkipTutorial");
103 boolean explorer = memory.getBoolean("$ngcExplorerSelected");
104 boolean merc = memory.getBoolean("$ngcMercSelected");
105 boolean random = memory.getBoolean("$ngcRandomSelected");
106 boolean spacer = memory.getBoolean("$ngcSpacerSelected");
107
108 if (explorer) {
109 cargo.addCommodity(Commodities.HEAVY_MACHINERY, 50);
110 cargo.addSupplies(150);
111 cargo.removeFuel(cargo.getMaxFuel() * 0.2f);
112 adjustStartingHulls(fleet);
113 } else if (merc) {
114 cargo.addSupplies(100);
115 cargo.removeFuel(cargo.getMaxFuel() * 0.2f);
116 adjustStartingHulls(fleet);
117 } else if (spacer) {
118 adjustStartingHulls(fleet);
119 } else if (random){
120 addOfficer = genRandomStart(fleet);
121 }
122
123 fleet.getFleetData().ensureHasFlagship();
124
125 if (addOfficer) {
126 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
127 if (!member.isFlagship()) {
128 //PersonAPI officer = OfficerManagerEvent.createOfficer(Global.getSector().getPlayerFaction(), 1, true, SkillPickPreference.NON_CARRIER);
129 PersonAPI officer = Global.getSector().getPlayerFaction().createRandomPerson(new Random());
130 officer.getStats().setSkillLevel(Skills.HELMSMANSHIP, 1);
131 //officer.getStats().setSkillLevel(Skills.IMPACT_MITIGATION, 1);
132 //officer.getStats().setSkillLevel(Skills.DAMAGE_CONTROL, 1);
133 officer.setRankId(Ranks.SPACE_LIEUTENANT);
134 officer.setPostId(Ranks.POST_OFFICER);
135 officer.setPersonality(Personalities.STEADY);
136 officer.getStats().refreshCharacterStatsEffects();
137
138 member.setCaptain(officer);
139 fleet.getFleetData().addOfficer(officer);
140 break;
141 }
142 }
143 }
144
145 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
146 float max = member.getRepairTracker().getMaxCR();
147 member.getRepairTracker().setCR(max);
148 }
149 fleet.getFleetData().setSyncNeeded();
150
151 if (skipTutorial) {
152 StarSystemAPI system = Global.getSector().getStarSystem("galatia");
153 PlanetAPI ancyra = (PlanetAPI) system.getEntityById("ancyra");
154 PersonAPI mainContact = TutorialMissionIntel.createMainContact(ancyra);
155 PersonAPI jangalaContact = TutorialMissionIntel.getJangalaContact();
156
157 TutorialMissionIntel.endGalatiaPortionOfMission(!spacer, false);
158
159 if (spacer) {
160 new SpacerObligation();
161 }
162
163 mainContact.getRelToPlayer().setRel(0.2f);
164 jangalaContact.getRelToPlayer().setRel(0.1f);
165 Global.getSector().getFaction(Factions.HEGEMONY).getRelToPlayer().setRel(0.15f);
166
167 if (spacer) {
168 cargo.clear();
169 cargo.addCrew(2);
170 cargo.addSupplies(15);
171 cargo.addFuel(cargo.getMaxFuel() * 1f);
172 } else {
173 float freeCargo = cargo.getSpaceLeft();
174 float addMachinery = Math.min(freeCargo, 15);
175 if (random) {
176 float r = (float) Math.random();
177 addMachinery = Math.min(freeCargo, 5 + 20 * r);
178 }
179 if (addMachinery > 0) {
180 cargo.addCommodity(Commodities.HEAVY_MACHINERY, addMachinery);
181 freeCargo -= addMachinery;
182 }
183 float addSupplies = Math.min(freeCargo, 70);
184 if (random) {
185 supplies = 0;
186 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
187 crew += Math.ceil(member.getMinCrew() + (member.getMaxCrew() - member.getMinCrew()) * 0.5f);
188 supplies += member.getDeploymentCostSupplies() * 4f;
189 }
190 float r = (float) Math.random();
191 cargo.removeSupplies(cargo.getSupplies());
192
193 freeCargo = cargo.getSpaceLeft();
194 addSupplies = Math.min(freeCargo, supplies + 20f + 20f * r);
195 }
196 if (addSupplies > 0) {
197 cargo.addSupplies(addSupplies);
198 freeCargo -= addSupplies;
199 }
200
201 float addFuel = Math.min(cargo.getFreeFuelSpace() - 10f, 70);
202 if (random) {
203 float r = (float) Math.random();
204 cargo.removeFuel(cargo.getFuel());
205 addFuel = Math.min(cargo.getFreeFuelSpace(), cargo.getMaxFuel() * (0.25f + 0.25f * r));
206 }
207 if (addFuel > 0) {
208 cargo.addFuel(addFuel);
209 }
210
211
212 float addCrew = Math.min(cargo.getFreeCrewSpace() - 10f, 100f);
213// addCrew = Math.max(addCrew, fleet.getFleetData().getMinCrew() - cargo.getCrew() + 10);
214// float addCrew = Math.min(cargo.getFreeCrewSpace() - 10f,
215// Math.max(0, (int)((fleet.getFleetData().getMinCrew() - cargo.getCrew()) * 1.25f)));
216 if (addCrew > 0) {
217 cargo.addCrew((int)addCrew);
218 }
219
220 if (!random) {
221 cargo.getCredits().add(30000);
222 }
223 }
224
225 } else {
226 if (random) {
227 float addCrew = Math.min(cargo.getFreeCrewSpace() - 10f, 10f);
228 if (addCrew > 0) {
229 cargo.addCrew((int)addCrew);
230 }
231 }
232
233 fleet.clearAbilities();
234 AbilitySlotsAPI slots = Global.getSector().getUIData().getAbilitySlotsAPI();
235 for (int i = 0; i < 5; i++) {
236 slots.setCurrBarIndex(i);
237 for (int j = 0; j < 10; j++) {
238 AbilitySlotAPI slot = slots.getCurrSlotsCopy().get(j);
239 slot.setAbilityId(null);
240 }
241 }
242
243
244 fleet.clearFloatingText();
245 fleet.setTransponderOn(false);
246
247
248 StarSystemAPI system = Global.getSector().getStarSystem("galatia");
249 system.addScript(new CampaignTutorialScript(system));
250 }
251 }
252
253 });
254 return true;
255 }
256
257 public static boolean genRandomStart(CampaignFleetAPI fleet) {
258 Random random = new Random();
259
260 fleet.getFleetData().clear();
261
262 WeightedRandomPicker<String> picker = new WeightedRandomPicker<String>(random);
263 picker.add("shrike_Attack");
264 picker.add("mule_Standard");
265 picker.add("hammerhead_Balanced");
266 picker.add("enforcer_Balanced", 0.5f);
267 picker.add("enforcer_Assault", 0.5f);
268 picker.add("drover_Starting", 1f);
269
270 float qMod = 0f;
271
272 float r = random.nextFloat();
273 int num = 1;
274 boolean addedLarge = false;
275 if (r > 0.5f) {
276 num = 2;
277 qMod -= 0.1f;
278 addedLarge = true;
279 }
280 for (int i = 0; i < num; i++) {
281 fleet.getFleetData().addFleetMember(picker.pickAndRemove());
282 }
283
284 picker.clear();
285 picker.add("lasher_Standard");
286 picker.add("centurion_Assault");
287 picker.add("wolf_Assault", 0.5f);
288 picker.add("wolf_CS", 0.5f);
289 picker.add("wayfarer_Standard");
290 picker.add("hound_hegemony_Standard", 0.5f);
291 picker.add("hound_Standard", 0.5f);
292 picker.add("cerberus_Standard");
293 picker.add("kite_hegemony_Interceptor", 0.5f);
294 picker.add("kite_pirates_Raider", 0.5f);
295 picker.add("gremlin_Strike");
296 picker.add("condor_Attack");
297
298 num = 1;
299 r = random.nextFloat();
300 int extra = (int) (r / 0.34f);
301 if (addedLarge) extra = Math.min(extra, 1);
302 num += extra;
303 qMod -= 0.07f * extra;
304 for (int i = 0; i < num; i++) {
305 fleet.getFleetData().addFleetMember(picker.pickAndRemove());
306 }
307
308 picker.clear();
309 picker.add("tarsus_Standard");
310 picker.add("buffalo_Standard");
311 picker.add("crig_Standard");
312 picker.add("mudskipper_Standard");
313 fleet.getFleetData().addFleetMember(picker.pickAndRemove());
314
315 r = random.nextFloat();
316 if (r > 0.75f) {
317 fleet.getFleetData().addFleetMember("phaeton_Standard");
318 } else if (r > 0.33f) {
319 fleet.getFleetData().addFleetMember("dram_Light");
320 }
321
322
323 DefaultFleetInflaterParams p = new DefaultFleetInflaterParams();
324 p.quality = 0.8f + qMod;
325 p.mode = ShipPickMode.PRIORITY_THEN_ALL;
326 p.persistent = false;
327 p.seed = random.nextLong();
328 p.timestamp = null;
329
330 FleetInflater inflater = Misc.getInflater(fleet, p);
331
332 fleet.setFaction(Factions.INDEPENDENT);
333 inflater.inflate(fleet);
334 fleet.setInflater(null);
335 fleet.setFaction(Factions.PLAYER);
336
337 fleet.getCargo().addCrew((int)fleet.getFleetData().getMinCrew() - fleet.getCargo().getCrew());
338
339 fleet.getCargo().getCredits().set((int)(5000f + 20000f * random.nextFloat()));
340
341 fleet.getFleetData().syncIfNeeded();
342 fleet.getCargo().sort();
343 fleet.getFlagship().setCaptain(Global.getSector().getCharacterData().getPerson());
344 fleet.getFlagship().updateStats();
345
346 return random.nextFloat() > 0.5f;
347 }
348
349
350 public static void adjustStartingHulls(CampaignFleetAPI fleet) {
351 boolean addDmods = true;
352
353 //addDmods = false;
354
355 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
356 ShipVariantAPI v = member.getVariant().clone();
357 v.setSource(VariantSource.REFIT);
358 v.setHullVariantId(Misc.genUID());
359 member.setVariant(v, false, false);
360
361 String h = member.getHullId();
362
363 if (addDmods) {
364 if (h.equals("hammerhead")) {
365 v.addPermaMod(HullMods.COMP_HULL);
366 } else if (h.equals("drover")) {
367 v.addPermaMod(HullMods.FAULTY_GRID);
368 } else if (h.equals("centurion")) {
369 v.addPermaMod(HullMods.COMP_ARMOR);
370 } else if (h.equals("lasher")) {
371 v.addPermaMod(HullMods.FRAGILE_SUBSYSTEMS);
372 }
373
374 else if (h.equals("dram")) {
375 v.addPermaMod(HullMods.FRAGILE_SUBSYSTEMS);
376 }
377
378 else if (h.equals("apogee")) {
379 //v.addPermaMod(HullMods.FRAGILE_SUBSYSTEMS);
380 } else if (h.equals("condor")) {
381 v.addPermaMod(HullMods.COMP_ARMOR);
382 } else if (h.equals("wayfarer")) {
383 v.addPermaMod(HullMods.FRAGILE_SUBSYSTEMS);
384 } else if (h.equals("shepherd")) {
385 v.addPermaMod(HullMods.FAULTY_GRID);
386 }
387
388 else if (h.equals("kite_original")) {
389 v.addPermaMod(HullMods.COMP_ARMOR);
390 v.addPermaMod(HullMods.FAULTY_GRID);
391 }
392 }
393 }
394
395 fleet.getFleetData().setSyncNeeded();
396 }
397
398
399
400}
401
402
403
404
405
406
static SectorAPI getSector()
Definition Global.java:59
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)