001package com.fs.starfarer.api.impl.campaign.rulecmd;
002
003import java.util.List;
004import java.util.Map;
005import java.util.Random;
006
007import com.fs.starfarer.api.Global;
008import com.fs.starfarer.api.Script;
009import com.fs.starfarer.api.campaign.CampaignFleetAPI;
010import com.fs.starfarer.api.campaign.CargoAPI;
011import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
012import com.fs.starfarer.api.campaign.FleetInflater;
013import com.fs.starfarer.api.campaign.InteractionDialogAPI;
014import com.fs.starfarer.api.campaign.PersistentUIDataAPI.AbilitySlotAPI;
015import com.fs.starfarer.api.campaign.PersistentUIDataAPI.AbilitySlotsAPI;
016import com.fs.starfarer.api.campaign.PlanetAPI;
017import com.fs.starfarer.api.campaign.StarSystemAPI;
018import com.fs.starfarer.api.campaign.rules.MemKeys;
019import com.fs.starfarer.api.campaign.rules.MemoryAPI;
020import com.fs.starfarer.api.characters.CharacterCreationData;
021import com.fs.starfarer.api.characters.PersonAPI;
022import com.fs.starfarer.api.combat.ShipVariantAPI;
023import com.fs.starfarer.api.fleet.FleetMemberAPI;
024import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflaterParams;
025import com.fs.starfarer.api.impl.campaign.ids.Commodities;
026import com.fs.starfarer.api.impl.campaign.ids.Factions;
027import com.fs.starfarer.api.impl.campaign.ids.HullMods;
028import com.fs.starfarer.api.impl.campaign.ids.Personalities;
029import com.fs.starfarer.api.impl.campaign.ids.Ranks;
030import com.fs.starfarer.api.impl.campaign.ids.Skills;
031import com.fs.starfarer.api.impl.campaign.tutorial.CampaignTutorialScript;
032import com.fs.starfarer.api.impl.campaign.tutorial.SpacerObligation;
033import com.fs.starfarer.api.impl.campaign.tutorial.TutorialMissionIntel;
034import com.fs.starfarer.api.loading.VariantSource;
035import com.fs.starfarer.api.util.Misc;
036import com.fs.starfarer.api.util.Misc.Token;
037import com.fs.starfarer.api.util.WeightedRandomPicker;
038
039/**
040 *      $ngcAddOfficer
041 *      $ngcSkipTutorial
042 *
043 */
044public class NGCAddStandardStartingScript extends BaseCommandPlugin {
045
046        public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
047                if (dialog == null) return false;
048                
049                CharacterCreationData data = (CharacterCreationData) memoryMap.get(MemKeys.LOCAL).get("$characterData");
050                final MemoryAPI memory = memoryMap.get(MemKeys.LOCAL);
051                data.addScriptBeforeTimePass(new Script() {
052                        public void run() {
053                                boolean explorer = memory.getBoolean("$ngcExplorerSelected");
054                                boolean merc = memory.getBoolean("$ngcMercSelected");
055                                boolean random = memory.getBoolean("$ngcRandomSelected");
056                                boolean spacer = memory.getBoolean("$ngcSpacerSelected");
057                                if (explorer || merc || random) {
058                                        //PirateBaseManager.getInstance().setExtraDays(400f);
059                                        Global.getSector().getMemoryWithoutUpdate().set("$fastStart", true);
060                                        if (explorer) {
061                                                Global.getSector().getMemoryWithoutUpdate().set("$fastStartExplorer", true);
062                                        }
063                                        if (merc) {
064                                                Global.getSector().getMemoryWithoutUpdate().set("$fastStartMerc", true);
065                                        }
066                                        if (random) {
067                                                Global.getSector().getMemoryWithoutUpdate().set("$fastStartRandom", true);
068                                        }
069                                }
070                                if (spacer) {
071                                        Global.getSector().getMemoryWithoutUpdate().set("$spacerStart", true);
072                                }
073                                
074                                boolean skipTutorial = memory.getBoolean("$ngcSkipTutorial");
075                                if (!skipTutorial) {
076                                        Global.getSector().getMemoryWithoutUpdate().set(CampaignTutorialScript.USE_TUTORIAL_RESPAWN, true);
077                                }
078                        }
079                });
080                
081                data.addScript(new Script() {
082                        public void run() {
083                                CampaignFleetAPI fleet = Global.getSector().getPlayerFleet();
084                                // add crew, supplies, and fuel
085                                int crew = 0;
086                                int supplies = 0;
087                                for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
088                                        crew += Math.ceil(member.getMinCrew() + (member.getMaxCrew() - member.getMinCrew()) * 0.5f);
089                                        supplies += member.getDeploymentCostSupplies() * 4f;
090                                }
091                                
092                                CargoAPI cargo = fleet.getCargo();
093                                cargo.initPartialsIfNeeded();
094                                
095                                cargo.addCrew(crew);
096                                cargo.addSupplies(10);
097                                cargo.addCommodity(Commodities.HEAVY_MACHINERY, 10);
098                                cargo.addFuel(cargo.getMaxFuel() * 0.5f);
099                                
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