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