public static void Postfix(SimGameState __instance) { if (RngStart.Settings.NumberRandomRonin + RngStart.Settings.NumberProceduralPilots + RngStart.Settings.NumberRoninFromList > 0) { while (__instance.PilotRoster.Count > 0) { __instance.PilotRoster.RemoveAt(0); } List <PilotDef> list = new List <PilotDef>(); if (RngStart.Settings.StartingRonin != null) { var RoninRandomizer = new List <string>(); RoninRandomizer.AddRange(GetRandomSubList(RngStart.Settings.StartingRonin, RngStart.Settings.NumberRoninFromList)); foreach (var roninID in RoninRandomizer) { var pilotDef = __instance.DataManager.PilotDefs.Get(roninID); // add directly to roster, don't want to get duplicate ronin from random ronin if (pilotDef != null) { __instance.AddPilotToRoster(pilotDef, true); } } } if (RngStart.Settings.NumberRandomRonin > 0) { List <PilotDef> list2 = new List <PilotDef>(__instance.RoninPilots); for (int m = list2.Count - 1; m >= 0; m--) { for (int n = 0; n < __instance.PilotRoster.Count; n++) { if (list2[m].Description.Id == __instance.PilotRoster[n].Description.Id) { list2.RemoveAt(m); break; } } } list2.RNGShuffle <PilotDef>(); for (int i = 0; i < RngStart.Settings.NumberRandomRonin; i++) { list.Add(list2[i]); } } if (RngStart.Settings.NumberProceduralPilots > 0) { List <PilotDef> list3; List <PilotDef> collection = __instance.PilotGenerator.GeneratePilots(RngStart.Settings.NumberProceduralPilots, 1, 0f, out list3); list.AddRange(collection); } foreach (PilotDef def in list) { __instance.AddPilotToRoster(def, true); } } }
/// <summary> /// Add n randomly selected Ronin pilots from the given list to the roster /// </summary> /// <param name="simGame"></param> /// <param name="pilots">Whitelist of Ronin</param> /// <param name="n">How many to select</param> /// <returns>the number of pilots it was short by</returns> public static int AddRoninFromList(SimGameState simGame, List <String> pilots, int n) { List <string> _pilots = new List <string>(pilots); while (n > 0 && _pilots.Count > 0) { int i = _pilots.GetRandomIndex(); var pilot = simGame.DataManager.PilotDefs.Get(_pilots[i]); if (pilot != null) { if (simGame.AddPilotToRoster(pilot, true, true)) { --n; pilot.SetDayOfHire(simGame.DaysPassed); Logger.Log($"\tAdded ronin from list: {pilot.Description.Id}"); } else { Logger.LogError($"\tFailed to add Ronin from list: {pilot.Description.Id}"); } } else { Logger.LogError($"\tSkipping ronin from list, does not exist: {_pilots[i]}"); } _pilots.RemoveAt(i); } if (n > 0) { Logger.LogError($"\tList of ronin pilots was short by: {n}"); } return(n); }
/// <summary> /// Add n randomly generated pilots to the roster /// </summary> /// <param name="simGame"></param> /// <param name="n">How many pilots</param> public static void AddProceduralPilots(SimGameState simGame, int n) { while (n > 0) { var pilots = simGame.PilotGenerator.GeneratePilots(n, Main.Settings.PilotPlanetDifficulty, 0f, out _); foreach (var pilot in pilots) { if (!simGame.CanPilotBeCareerModeStarter(pilot)) { Logger.Log($"\tProcedural pilot unsuitable for starting roster: {pilot.Description.Id}"); continue; } if (simGame.AddPilotToRoster(pilot, false, true)) { --n; pilot.SetDayOfHire(simGame.DaysPassed); Logger.Log($"\tAdded procedural pilot: {pilot.Description.Id}"); } else { Logger.Log($"\tFailed to add procedural pilot: {pilot.Description.Id}"); } } } }
public static void AddRoninsToRoster(this SimGameState sim) { settings.addRoninMercs.Do(roninId => { if (settings.allowMultipleRoninCopies) { sim.UsedRoninIDs.Remove(roninId); } else if (sim.UsedRoninIDs.Contains(roninId)) { mod.Logger.Log("Not adding pilot " + roninId + " to roster, as pilot was already hired"); return; } mod.Logger.Log("Adding pilot " + roninId + " to roster"); sim.AddPilotToRoster(roninId); }); }
/// <summary> /// Add n randomly selected Ronin pilots to the roster /// </summary> /// <param name="simGame"></param> /// <param name="pilots">Whitelist of Ronin</param> /// <param name="n">How many to select</param> /// <returns>the number of pilots it was short by (should always be 0)</returns> public static int AddRandomRonin(SimGameState simGame, int n) { if (n <= 0) { return(n); } // make sure to remove the starting ronin list from the possible random pilots! yay linq var randomRonin = simGame.RoninPilots .Where(x => !Main.Settings.StartingRonin.Contains(x.Description.Id)) .ToList(); // shuffle it randomRonin.Shuffle(); foreach (var pilot in randomRonin) { // when we've added enough pilots, break out of the loop if (n <= 0) { break; } // try to add a pilot if (simGame.AddPilotToRoster(pilot, true, true)) { --n; pilot.SetDayOfHire(simGame.DaysPassed); Logger.Log($"\tAdded random Ronin: {pilot.Description.Id}"); } else { Logger.Log($"\tFailed to add random Ronin: {pilot.Description.Id}"); } } if (n > 0) { Logger.Log($"\tFailed to add enough random Ronin, needed another: {n}"); } return(n); }
public static void AddRandomMercsToRoster(this SimGameState sim) { if (settings.addRandomMercsCount <= 0) { return; } List <PilotDef> roninPilotDefs; var pilotDefs = sim.PilotGenerator.GeneratePilots( settings.addRandomMercsCount * 2, settings.randomMercQuality, settings.roninChance, out roninPilotDefs); var all = pilotDefs.Union(roninPilotDefs).ToList(); all.Shuffle(); foreach (var pd in all.Take(settings.addRandomMercsCount)) { mod.Logger.Log("Adding pilot " + pd.Description.Id + " to roster"); sim.AddPilotToRoster(pd); } }
private static void RandomizePilots(SimGameState simGame) { Main.HBSLog.Log("Randomizing pilots, removing old pilots"); // clear roster while (simGame.PilotRoster.Count > 0) { simGame.PilotRoster.RemoveAt(0); } // starting ronin that are always present if (Main.Settings.StartingRonin != null && Main.Settings.StartingRonin.Count > 0) { foreach (var pilotID in Main.Settings.StartingRonin) { if (!simGame.DataManager.PilotDefs.Exists(pilotID)) { Main.HBSLog.LogWarning($"\tMISSING StartingRonin {pilotID}!"); continue; } var pilotDef = simGame.DataManager.PilotDefs.Get(pilotID); if (Main.Settings.RerollRoninStats) { ReplacePilotStats(pilotDef, simGame.PilotGenerator.GeneratePilots(1, Main.Settings.PilotPlanetDifficulty, 0, out _)[0]); } simGame.AddPilotToRoster(pilotDef, true); Main.HBSLog.Log($"\tAdding StartingRonin {pilotDef.Description.Id}"); } } // random ronin if (Main.Settings.NumberRandomRonin > 0) { // make sure to remove the starting ronin list from the possible random pilots! yay linq var randomRonin = GetRandomSubList( simGame.RoninPilots.Where(x => !Main.Settings.StartingRonin.Contains(x.Description.Id)) .ToList(), Main.Settings.NumberRandomRonin); foreach (var pilotDef in randomRonin) { if (Main.Settings.RerollRoninStats) { ReplacePilotStats(pilotDef, simGame.PilotGenerator.GeneratePilots(1, Main.Settings.PilotPlanetDifficulty, 0, out _)[0]); } simGame.AddPilotToRoster(pilotDef, true); Main.HBSLog.Log($"\tAdding random Ronin {pilotDef.Description.Id}"); } } // random procedural pilots if (Main.Settings.NumberProceduralPilots > 0) { var randomProcedural = simGame.PilotGenerator.GeneratePilots(Main.Settings.NumberProceduralPilots, Main.Settings.PilotPlanetDifficulty, 0, out _); foreach (var pilotDef in randomProcedural) { simGame.AddPilotToRoster(pilotDef, true); Main.HBSLog.Log($"\tAdding random procedural pilot {pilotDef.Description.Id}"); } } }
public static void Postfix(SimGameState __instance) { if (RngStart.Settings.NumberRandomRonin + RngStart.Settings.NumberProceduralPilots + RngStart.Settings.NumberRoninFromList > 0) { while (__instance.PilotRoster.Count > 0) { __instance.PilotRoster.RemoveAt(0); } List <PilotDef> list = new List <PilotDef>(); if (RngStart.Settings.StartingRonin != null) { var RoninRandomizer = new List <string>(); RoninRandomizer.AddRange(GetRandomSubList(RngStart.Settings.StartingRonin, RngStart.Settings.NumberRoninFromList)); foreach (var roninID in RoninRandomizer) { var pilotDef = __instance.DataManager.PilotDefs.Get(roninID); // add directly to roster, don't want to get duplicate ronin from random ronin if (pilotDef != null) { __instance.AddPilotToRoster(pilotDef, true); } } } if (RngStart.Settings.NumberRandomRonin > 0) { List <PilotDef> list2 = new List <PilotDef>(__instance.RoninPilots); for (int m = list2.Count - 1; m >= 0; m--) { for (int n = 0; n < __instance.PilotRoster.Count; n++) { if (list2[m].Description.Id == __instance.PilotRoster[n].Description.Id) { list2.RemoveAt(m); break; } } } list2.RNGShuffle <PilotDef>(); for (int i = 0; i < RngStart.Settings.NumberRandomRonin; i++) { list.Add(list2[i]); } } if (RngStart.Settings.NumberProceduralPilots > 0) { List <PilotDef> list3; List <PilotDef> collection = __instance.PilotGenerator.GeneratePilots(RngStart.Settings.NumberProceduralPilots, 1, 0f, out list3); list.AddRange(collection); } foreach (PilotDef def in list) { __instance.AddPilotToRoster(def, true); } } //Logger.Debug($"Starting lance creation {RngStart.Settings.MinimumStartingWeight} - {RngStart.Settings.MaximumStartingWeight} tons"); // mechs if (!RngStart.Settings.TagRandomLance) { var AncestralMechDef = new MechDef(__instance.DataManager.MechDefs.Get(__instance.ActiveMechs[0].Description.Id), __instance.GenerateSimGameUID()); bool RemoveAncestralMech = RngStart.Settings.RemoveAncestralMech; if (AncestralMechDef.Description.Id == "mechdef_centurion_TARGETDUMMY") { RemoveAncestralMech = true; } var lance = new List <MechDef>(); float currentLanceWeight = 0; var baySlot = 1; // clear the initial lance for (var i = 1; i < 6; i++) { __instance.ActiveMechs.Remove(i); } // memoize dictionary of tonnages since we may be looping a lot //Logger.Debug($"Memoizing"); var mechTonnages = new Dictionary <string, float>(); foreach (var kvp in __instance.DataManager.ChassisDefs) { if (kvp.Key.Contains("DUMMY") && !kvp.Key.Contains("CUSTOM")) { // just in case someone calls their mech DUMMY continue; } if (kvp.Key.Contains("CUSTOM") || kvp.Key.Contains("DUMMY")) { continue; } if (RngStart.Settings.MaximumMechWeight != 100) { if (kvp.Value.Tonnage > RngStart.Settings.LegacyMaxMechWeight || kvp.Value.Tonnage < RngStart.Settings.LegacyMinMechWeight) { continue; } } // passed checks, add to Dictionary mechTonnages.Add(kvp.Key, kvp.Value.Tonnage); } bool firstrun = true; for (int xloop = 0; xloop < RngStart.Settings.Loops; xloop++) { int LanceCounter = 1; if (!RngStart.Settings.NotRandomMode) { // remove ancestral mech if specified if (RemoveAncestralMech && firstrun) { //Logger.Debug($"Lance Size(Legacy1): {lance.Count}"); __instance.ActiveMechs.Remove(0); //Logger.Debug($"Lance Size(Legacy2): {lance.Count}"); } while (currentLanceWeight < RngStart.Settings.LegacyMinStartingWeight || currentLanceWeight > RngStart.Settings.LegacyMaxStartingWeight) { if (!firstrun) { for (var i = baySlot; i < 6; i++) { __instance.ActiveMechs.Remove(i); } currentLanceWeight = 0; } if (RemoveAncestralMech == true) { baySlot = 0; } else { currentLanceWeight = AncestralMechDef.Chassis.Tonnage; baySlot = 1; } //It's not a BUG, it's a FEATURE. LanceCounter++; if (LanceCounter > RngStart.Settings.SpiderLoops) { MechDef mechDefSpider = new MechDef(__instance.DataManager.MechDefs.Get("mechdef_spider_SDR-5V"), __instance.GenerateSimGameUID(), true); lance.Add(mechDefSpider); // worry about sorting later for (int j = baySlot; j < 6; j++) { __instance.AddMech(j, mechDefSpider, true, true, false, null); } break; } var legacyLance = new List <string>(); for (int i = 0; i < RngStart.Settings.startTypes.Count; i++) { foreach (var planet in RngStart.Settings.startTypeOptions[i]) { if (planet == __instance.Constants.Story.StartingTargetSystem) { if (RngStart.Settings.startTypes[i] == "InnerSphere") { legacyLance.AddRange(GetRandomSubList(RngStart.Settings.innerAssaultMechsPossible, RngStart.Settings.innerNumberAssaultMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.innerHeavyMechsPossible, RngStart.Settings.innerNumberHeavyMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.innerMediumMechsPossible, RngStart.Settings.innerNumberMediumMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.innerLightMechsPossible, RngStart.Settings.innerNumberLightMechs)); } if (RngStart.Settings.startTypes[i] == "Periphery") { legacyLance.AddRange(GetRandomSubList(RngStart.Settings.periAssaultMechsPossible, RngStart.Settings.periNumberAssaultMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.periHeavyMechsPossible, RngStart.Settings.periNumberHeavyMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.periMediumMechsPossible, RngStart.Settings.periNumberMediumMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.periLightMechsPossible, RngStart.Settings.periNumberLightMechs)); } if (RngStart.Settings.startTypes[i] == "DeepPeriphery") { legacyLance.AddRange(GetRandomSubList(RngStart.Settings.deepAssaultMechsPossible, RngStart.Settings.deepNumberAssaultMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.deepHeavyMechsPossible, RngStart.Settings.deepNumberHeavyMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.deepMediumMechsPossible, RngStart.Settings.deepNumberMediumMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.deepLightMechsPossible, RngStart.Settings.deepNumberLightMechs)); } if (RngStart.Settings.startTypes[i] == "Clan") { legacyLance.AddRange(GetRandomSubList(RngStart.Settings.clanAssaultMechsPossible, RngStart.Settings.clanNumberAssaultMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.clanHeavyMechsPossible, RngStart.Settings.clanNumberHeavyMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.clanMediumMechsPossible, RngStart.Settings.clanNumberMediumMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.clanLightMechsPossible, RngStart.Settings.clanNumberLightMechs)); } if (RngStart.Settings.startTypes[i] == "Pirates") { legacyLance.AddRange(GetRandomSubList(RngStart.Settings.pirateAssaultMechsPossible, RngStart.Settings.pirateNumberAssaultMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.pirateHeavyMechsPossible, RngStart.Settings.pirateNumberHeavyMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.pirateMediumMechsPossible, RngStart.Settings.pirateNumberMediumMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.pirateLightMechsPossible, RngStart.Settings.pirateNumberLightMechs)); } } } } // check to see if we're on the last mechbay and if we have more mechs to add // if so, store the mech at index 5 before next iteration. for (int j = 0; j < legacyLance.Count; j++) { Logger.Debug($"Build Lance"); MechDef mechDef2 = new MechDef(__instance.DataManager.MechDefs.Get(legacyLance[j]), __instance.GenerateSimGameUID(), true); __instance.AddMech(baySlot, mechDef2, true, true, false, null); if (baySlot == 5 && j + 1 < legacyLance.Count) { __instance.UnreadyMech(5, mechDef2); } else { baySlot++; } currentLanceWeight += (int)mechDef2.Chassis.Tonnage; } firstrun = false; if (currentLanceWeight >= RngStart.Settings.MinimumStartingWeight && currentLanceWeight <= RngStart.Settings.MaximumStartingWeight) { Logger.Debug($"Classic Mode"); for (int y = 0; y < __instance.ActiveMechs.Count(); y++) { Logger.Debug($"Mech {y}: {__instance.ActiveMechs[y].Description.Id}"); } } else { Logger.Debug($"Illegal Lance"); Logger.Debug($"Weight: {currentLanceWeight}"); } } } else // G new mode { //Logger.Debug($"New mode"); // cap the lance tonnage int minLanceSize = RngStart.Settings.MinimumLanceSize; float maxWeight = RngStart.Settings.MaximumStartingWeight; float maxLanceSize = 6; //bool firstTargetRun = true; currentLanceWeight = 0; if (RemoveAncestralMech == true) { baySlot = 0; if (RngStart.Settings.IgnoreAncestralMech) { maxLanceSize = RngStart.Settings.MaximumLanceSize + 1; minLanceSize = minLanceSize + 1; } } else if ((!RemoveAncestralMech && RngStart.Settings.IgnoreAncestralMech)) { lance.Add(AncestralMechDef); maxLanceSize = RngStart.Settings.MaximumLanceSize + 1; } else { baySlot = 1; lance.Add(AncestralMechDef); currentLanceWeight += AncestralMechDef.Chassis.Tonnage; Logger.Debug($"Weight w/Ancestral: {currentLanceWeight}"); } bool dupe = false; bool excluded = false; bool blacklisted = false; bool TargetDummy = false; while (minLanceSize > lance.Count || currentLanceWeight < RngStart.Settings.MinimumStartingWeight) { #region Def listing loops //Logger.Debug($"In while loop"); //foreach (var mech in __instance.DataManager.MechDefs) //{ // Logger.Debug($"K:{mech.Key} V:{mech.Value}"); //} //foreach (var chasis in __instance.DataManager.ChassisDefs) //{ // Logger.Debug($"K:{chasis.Key}"); //} #endregion // build lance collection from dictionary for speed var randomMech = mechTonnages.ElementAt(rng.Next(0, mechTonnages.Count)); var mechString = randomMech.Key.Replace("chassisdef", "mechdef"); // getting chassisdefs so renaming the key to match mechdefs Id //var mechDef = new MechDef(__instance.DataManager.MechDefs.Get(mechString), __instance.GenerateSimGameUID()); var mechDef = new MechDef(__instance.DataManager.MechDefs.Get(mechString), __instance.GenerateSimGameUID()); //It's not a BUG, it's a FEATURE. if (LanceCounter > RngStart.Settings.SpiderLoops) { MechDef mechDefSpider = new MechDef(__instance.DataManager.MechDefs.Get("mechdef_spider_SDR-5V"), __instance.GenerateSimGameUID(), true); lance.Add(mechDefSpider); // worry about sorting later for (int j = baySlot; j < 6; j++) { __instance.AddMech(j, mechDefSpider, true, true, false, null); } break; } /*for (int i = 0; i < mechDef.MechTags.Count; i++) * { * Logger.Debug($"MechTags: {mechDef.MechTags[i]}"); * }*/ if (mechDef.MechTags.Contains("BLACKLISTED")) { blacklisted = true; Logger.Debug($"Blacklisted! {mechDef.Name}"); } if (!RngStart.Settings.AllowDuplicateChassis) { foreach (var mech in lance) { if (mech.Name == mechDef.Name) { dupe = true; Logger.Debug($"SAME SAME! {mech.Name}\t\t{mechDef.Name}"); } } } // does the mech fit into the lance? if (TargetDummy) { TargetDummy = false; } else { //currentLanceWeight = currentLanceWeight + mechDef.Chassis.Tonnage; } if (!blacklisted && !dupe && !excluded) { Logger.Debug($"Lance Count-1: {lance.Count}"); lance.Add(mechDef); currentLanceWeight += mechDef.Chassis.Tonnage; Logger.Debug($"Lance Count-2: {lance.Count}"); Logger.Debug($"Adding mech {mechString} {mechDef.Chassis.Tonnage} tons"); } else { blacklisted = false; dupe = false; excluded = false; } Logger.Debug($"Lance Counter: {LanceCounter}"); LanceCounter++; //if (currentLanceWeight > RngStart.Settings.MinimumStartingWeight + mechDef.Chassis.Tonnage) //Logger.Debug($"Minimum lance tonnage met: done"); //Logger.Debug($"current: {currentLanceWeight} tons. " + // $"tonnage remaining: {RngStart.Settings.MaximumStartingWeight - currentLanceWeight}. " + // $"before lower limit hit: {Math.Max(0, RngStart.Settings.MinimumStartingWeight - currentLanceWeight)}"); // invalid lance, reset if (lance.Count >= maxLanceSize && currentLanceWeight < RngStart.Settings.MinimumStartingWeight) { Logger.Debug($"Weight: {currentLanceWeight}"); Logger.Debug($"Lance Count-1: {lance.Count}"); var lightest = lance[0]; for (int i = 0; i < lance.Count; i++) { if (lightest.Chassis.Tonnage > lance[i].Chassis.Tonnage) { Logger.Debug($"Mech: {lance[i].Name}"); Logger.Debug($"Weight: {lance[i].Chassis.Tonnage}"); lightest = lance[i]; } } lance.Remove(lightest); currentLanceWeight -= lightest.Chassis.Tonnage; } if (lance.Count < minLanceSize && currentLanceWeight > RngStart.Settings.MaximumStartingWeight) { Logger.Debug($"Weight: {currentLanceWeight}"); Logger.Debug($"Lance Count-1: {lance.Count}"); var heaviest = lance[0]; for (int i = 0; i < lance.Count; i++) { if (heaviest.Chassis.Tonnage < lance[i].Chassis.Tonnage) { Logger.Debug($"Mech: {lance[i].Name}"); Logger.Debug($"Weight: {lance[i].Chassis.Tonnage}"); heaviest = lance[i]; } } lance.Remove(heaviest); currentLanceWeight -= heaviest.Chassis.Tonnage; } } Logger.Debug($"New mode"); Logger.Debug($"Starting lance instantiation"); float tonnagechecker = 0; for (int x = 0; x < lance.Count; x++) { Logger.Debug($"x is {x} and lance[x] is {lance[x].Name}"); __instance.AddMech(x, lance[x], true, true, false); tonnagechecker = tonnagechecker + lance[x].Chassis.Tonnage; } Logger.Debug($"{tonnagechecker}"); float Maxtonnagedifference = tonnagechecker - RngStart.Settings.MaximumStartingWeight; float Mintonnagedifference = tonnagechecker - RngStart.Settings.MinimumStartingWeight; Logger.Debug($"Over tonnage Maximum amount: {Maxtonnagedifference}"); Logger.Debug($"Over tonnage Minimum amount: {Mintonnagedifference}"); lance.Clear(); // valid lance created } } } else { //Find Starting Mech and if Starting Mech is used var AncestralMechDef = new MechDef(__instance.DataManager.MechDefs.Get(__instance.ActiveMechs[0].Description.Id), __instance.GenerateSimGameUID()); bool RemoveAncestralMech = RngStart.Settings.RemoveAncestralMech; if (AncestralMechDef.Description.Id == "mechdef_centurion_TARGETDUMMY") { RemoveAncestralMech = true; } var lance = new List <MechDef>(); float currentLanceWeight = 0; var baySlot = 1; // clear the initial lance for (var i = 1; i < 6; i++) { __instance.ActiveMechs.Remove(i); } // memoize dictionary of tonnages since we may be looping a lot //Logger.Debug($"Memoizing"); var mechTonnages = new Dictionary <string, float>(); foreach (var kvp in __instance.DataManager.ChassisDefs) { if (kvp.Key.Contains("DUMMY") && !kvp.Key.Contains("CUSTOM")) { // just in case someone calls their mech DUMMY continue; } if (kvp.Key.Contains("CUSTOM") || kvp.Key.Contains("DUMMY")) { continue; } if (RngStart.Settings.MaximumMechWeight != 100) { //AccessTools.Method(typeof(SimGameState), "SetReputation").Invoke(__instance, new object[] { Values to give }); if (kvp.Value.Tonnage > RngStart.Settings.MaximumMechWeight || kvp.Value.Tonnage < RngStart.Settings.MinimumMechWeight) { continue; } } // passed checks, add to Dictionary mechTonnages.Add(kvp.Key, kvp.Value.Tonnage); } Logger.Debug($"TagRandom Mode"); // cap the lance tonnage int minLanceSize = RngStart.Settings.MinimumLanceSize; float maxWeight = RngStart.Settings.MaximumStartingWeight; float maxLanceSize = 6; //bool firstTargetRun = true; currentLanceWeight = 0; if (RemoveAncestralMech == true) { baySlot = 0; if (RngStart.Settings.IgnoreAncestralMech) { maxLanceSize = RngStart.Settings.MaximumLanceSize + 1; minLanceSize = minLanceSize + 1; } } else if ((!RemoveAncestralMech && RngStart.Settings.IgnoreAncestralMech)) { lance.Add(AncestralMechDef); maxLanceSize = RngStart.Settings.MaximumLanceSize + 1; } else { baySlot = 1; lance.Add(AncestralMechDef); currentLanceWeight += AncestralMechDef.Chassis.Tonnage; Logger.Debug($"Weight w/Ancestral: {currentLanceWeight}"); } /* * // build lance collection from dictionary for speed * var randomMech = mechTonnages.ElementAt(rng.Next(0, mechTonnages.Count)); * var mechString = randomMech.Key.Replace("chassisdef", "mechdef"); * // getting chassisdefs so renaming the key to match mechdefs Id * //var mechDef = new MechDef(__instance.DataManager.MechDefs.Get(mechString), __instance.GenerateSimGameUID()); * var mechDef = new MechDef(__instance.DataManager.MechDefs.Get(mechString), __instance.GenerateSimGameUID()); */ /*for (int j = 0; j < mechTonnages.Count; j++) * { * var currentMech = mechTonnages.ElementAt(j); * var currentMechString = currentMech.Key.Replace("chassisdef", "mechdef"); * var currentMechDef = new MechDef(__instance.DataManager.MechDefs.Get(currentMechString), __instance.GenerateSimGameUID()); * * Logger.Debug($"Mech ID: {currentMechDef.Description.Id}"); * for (int k = 0; k < currentMechDef.MechTags.Count; k++) * { * Logger.Debug($"Tag-{k}: {currentMechDef.MechTags[k]}"); * } * * }*/ bool bNoTag = false; bool bDupe = false; bool bExcluded = false; bool bBlacklisted = false; while (minLanceSize > lance.Count || currentLanceWeight < RngStart.Settings.MinimumStartingWeight) { Logger.Debug($"Begin Mech Finder Loop"); // build lance collection from dictionary for speed var randomMech = mechTonnages.ElementAt(rng.Next(0, mechTonnages.Count)); var mechString = randomMech.Key.Replace("chassisdef", "mechdef"); // getting chassisdefs so renaming the key to match mechdefs Id //var mechDef = new MechDef(__instance.DataManager.MechDefs.Get(mechString), __instance.GenerateSimGameUID()); var mechDef = new MechDef(__instance.DataManager.MechDefs.Get(mechString), __instance.GenerateSimGameUID()); foreach (var mechID in RngStart.Settings.ExcludedMechs) { if (mechID == mechDef.Description.Id) { bExcluded = true; Logger.Debug($"Excluded! {mechDef.Description.Id}"); } } if (mechDef.MechTags.Contains("BLACKLISTED")) { bBlacklisted = true; Logger.Debug($"Blacklisted! {mechDef.Name}"); } if (!RngStart.Settings.AllowDuplicateChassis) { foreach (var mech in lance) { if (mech.Name == mechDef.Name) { bDupe = true; Logger.Debug($"SAME SAME! {mech.Name}\t\t{mechDef.Name}"); } } } if (!bBlacklisted && !bDupe && !bExcluded) { Logger.Debug($"Starting Planet: {__instance.Constants.Story.StartingTargetSystem}"); for (int iStart = 0; iStart < RngStart.Settings.startSystemList.Count; iStart++) { if (__instance.Constants.Story.StartingTargetSystem == RngStart.Settings.startSystemList[iStart]) { for (int iTag = 0; iTag < mechDef.MechTags.Count; iTag++) { foreach (var mechTag in RngStart.Settings.AllowedTags[iStart]) { if (mechTag == mechDef.MechTags[iTag]) { Logger.Debug($"INCLUDED!"); Logger.Debug($"Included Tag: {mechDef.MechTags[iTag]}"); Logger.Debug($"Included Mech:{mechDef.Description.Id}"); bNoTag = false; goto endTagCheck; } else { bNoTag = true; } } Logger.Debug($" "); Logger.Debug($"{RngStart.Settings.startSystemList[iStart]} Start!"); Logger.Debug($"Invalid Tag!"); Logger.Debug($"Mech Tag: {mechDef.MechTags[iTag]}"); Logger.Debug($" "); } endTagCheck: if (!bNoTag) { Logger.Debug($"Lance Count-1: {lance.Count}"); lance.Add(mechDef); currentLanceWeight += mechDef.Chassis.Tonnage; Logger.Debug($"Lance Count-2: {lance.Count}"); Logger.Debug($"Adding mech {mechString} {mechDef.Chassis.Tonnage} tons"); } else { bBlacklisted = false; bDupe = false; bExcluded = false; bNoTag = false; } } } } else { bBlacklisted = false; bDupe = false; bExcluded = false; bNoTag = false; } if (lance.Count >= maxLanceSize && currentLanceWeight < RngStart.Settings.MinimumStartingWeight) { Logger.Debug($"Under-Weight: {currentLanceWeight}"); Logger.Debug($"Lance Count: {lance.Count}"); var lightest = lance[1]; for (int i = 1; i < lance.Count; i++) { if (lightest.Chassis.Tonnage > lance[i].Chassis.Tonnage) { Logger.Debug($"Mech: {lance[i].Name}"); Logger.Debug($"Weight: {lance[i].Chassis.Tonnage}"); lightest = lance[i]; } } lance.Remove(lightest); currentLanceWeight -= lightest.Chassis.Tonnage; } if (lance.Count < minLanceSize && currentLanceWeight > RngStart.Settings.MaximumStartingWeight) { Logger.Debug($"Over-Weight: {currentLanceWeight}"); Logger.Debug($"Lance Count-1: {lance.Count}"); var heaviest = lance[1]; for (int i = 1; i < lance.Count; i++) { if (heaviest.Chassis.Tonnage < lance[i].Chassis.Tonnage) { Logger.Debug($"Mech: {lance[i].Name}"); Logger.Debug($"Weight: {lance[i].Chassis.Tonnage}"); heaviest = lance[i]; } } lance.Remove(heaviest); currentLanceWeight -= heaviest.Chassis.Tonnage; } } float tonnagechecker = 0; for (int x = 0; x < lance.Count; x++) { Logger.Debug($"x is {x} and lance[x] is {lance[x].Name}"); __instance.AddMech(x, lance[x], true, true, false); tonnagechecker = tonnagechecker + lance[x].Chassis.Tonnage; } Logger.Debug($"{tonnagechecker}"); float Maxtonnagedifference = tonnagechecker - RngStart.Settings.MaximumStartingWeight; float Mintonnagedifference = tonnagechecker - RngStart.Settings.MinimumStartingWeight; Logger.Debug($"Over tonnage Maximum amount: {Maxtonnagedifference}"); Logger.Debug($"Over tonnage Minimum amount: {Mintonnagedifference}"); lance.Clear(); } //Cheats.MyMethod(__instance); }
public static void Postfix(SimGameState __instance) { if (RngStart.Settings.NumberRandomRonin + RngStart.Settings.NumberProceduralPilots + RngStart.Settings.NumberRoninFromList > 0) { while (__instance.PilotRoster.Count > 0) { __instance.PilotRoster.RemoveAt(0); } List <PilotDef> list = new List <PilotDef>(); if (RngStart.Settings.StartingRonin != null) { var RoninRandomizer = new List <string>(); RoninRandomizer.AddRange(GetRandomSubList(RngStart.Settings.StartingRonin, RngStart.Settings.NumberRoninFromList)); foreach (var roninID in RoninRandomizer) { var pilotDef = __instance.DataManager.PilotDefs.Get(roninID); // add directly to roster, don't want to get duplicate ronin from random ronin if (pilotDef != null) { __instance.AddPilotToRoster(pilotDef, true); } } } if (RngStart.Settings.NumberRandomRonin > 0) { List <PilotDef> list2 = new List <PilotDef>(__instance.RoninPilots); for (int m = list2.Count - 1; m >= 0; m--) { for (int n = 0; n < __instance.PilotRoster.Count; n++) { if (list2[m].Description.Id == __instance.PilotRoster[n].Description.Id) { list2.RemoveAt(m); break; } } } list2.RNGShuffle <PilotDef>(); for (int i = 0; i < RngStart.Settings.NumberRandomRonin; i++) { list.Add(list2[i]); } } if (RngStart.Settings.NumberProceduralPilots > 0) { List <PilotDef> list3; List <PilotDef> collection = __instance.PilotGenerator.GeneratePilots(RngStart.Settings.NumberProceduralPilots, 1, 0f, out list3); list.AddRange(collection); } foreach (PilotDef def in list) { __instance.AddPilotToRoster(def, true); } } //Logger.Debug($"Starting lance creation {RngStart.Settings.MinimumStartingWeight} - {RngStart.Settings.MaximumStartingWeight} tons"); // mechs if (RngStart.Settings.UseRandomMechs) { var AncestralMechDef = new MechDef(__instance.DataManager.MechDefs.Get(__instance.ActiveMechs[0].Description.Id), __instance.GenerateSimGameUID()); bool RemoveAncestralMech = RngStart.Settings.RemoveAncestralMech; if (AncestralMechDef.Description.Id == "mechdef_centurion_TARGETDUMMY") { RemoveAncestralMech = true; } var lance = new List <MechDef>(); float currentLanceWeight = 0; var baySlot = 1; // clear the initial lance for (var i = 1; i < 6; i++) { __instance.ActiveMechs.Remove(i); } // memoize dictionary of tonnages since we may be looping a lot //Logger.Debug($"Memoizing"); var mechTonnages = new Dictionary <string, float>(); foreach (var kvp in __instance.DataManager.ChassisDefs) { if (kvp.Key.Contains("DUMMY") && !kvp.Key.Contains("CUSTOM")) { // just in case someone calls their mech DUMMY continue; } if (kvp.Key.Contains("CUSTOM") || kvp.Key.Contains("DUMMY")) { continue; } if (RngStart.Settings.MaximumMechWeight != 100) { if (kvp.Value.Tonnage > RngStart.Settings.MaximumMechWeight || kvp.Value.Tonnage < 20) { continue; } } // passed checks, add to Dictionary mechTonnages.Add(kvp.Key, kvp.Value.Tonnage); } bool firstrun = true; for (int xloop = 0; xloop < RngStart.Settings.Loops; xloop++) { int LanceCounter = 1; if (!RngStart.Settings.FullRandomMode) { // remove ancestral mech if specified if (RemoveAncestralMech && firstrun) { __instance.ActiveMechs.Remove(0); } currentLanceWeight = 0; while (currentLanceWeight < RngStart.Settings.MinimumStartingWeight || currentLanceWeight > RngStart.Settings.MaximumStartingWeight) { if (RemoveAncestralMech == true) { currentLanceWeight = 0; baySlot = 0; } else { currentLanceWeight = AncestralMechDef.Chassis.Tonnage; baySlot = 1; } if (!firstrun) { for (var i = baySlot; i < 6; i++) { __instance.ActiveMechs.Remove(i); } } //It's not a BUG, it's a FEATURE. LanceCounter++; if (LanceCounter > RngStart.Settings.SpiderLoops) { MechDef mechDefSpider = new MechDef(__instance.DataManager.MechDefs.Get("mechdef_spider_SDR-5V"), __instance.GenerateSimGameUID(), true); lance.Add(mechDefSpider); // worry about sorting later for (int j = baySlot; j < 6; j++) { __instance.AddMech(j, mechDefSpider, true, true, false, null); } break; } var legacyLance = new List <string>(); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.AssaultMechsPossible, RngStart.Settings.NumberAssaultMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.HeavyMechsPossible, RngStart.Settings.NumberHeavyMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.MediumMechsPossible, RngStart.Settings.NumberMediumMechs)); legacyLance.AddRange(GetRandomSubList(RngStart.Settings.LightMechsPossible, RngStart.Settings.NumberLightMechs)); // check to see if we're on the last mechbay and if we have more mechs to add // if so, store the mech at index 5 before next iteration. for (int j = 0; j < legacyLance.Count; j++) { Logger.Debug($"Build Lance"); MechDef mechDef2 = new MechDef(__instance.DataManager.MechDefs.Get(legacyLance[j]), __instance.GenerateSimGameUID(), true); __instance.AddMech(baySlot, mechDef2, true, true, false, null); if (baySlot == 5 && j + 1 < legacyLance.Count) { __instance.UnreadyMech(5, mechDef2); } else { baySlot++; } currentLanceWeight += (int)mechDef2.Chassis.Tonnage; } firstrun = false; if (currentLanceWeight >= RngStart.Settings.MinimumStartingWeight && currentLanceWeight <= RngStart.Settings.MaximumStartingWeight) { Logger.Debug($"Classic Mode"); for (int y = 0; y < __instance.ActiveMechs.Count(); y++) { Logger.Debug($"{__instance.ActiveMechs[y].Description.Id}"); } } else { Logger.Debug($"Illegal Lance"); } } } else // G new mode { //Logger.Debug($"New mode"); // cap the lance tonnage int minLanceSize = RngStart.Settings.MinimumLanceSize; float maxWeight = RngStart.Settings.MaximumStartingWeight; float maxLanceSize = 6; bool firstTargetRun = false; __instance.ActiveMechs.Remove(0); if (RemoveAncestralMech == true) { baySlot = 0; currentLanceWeight = 0; if (AncestralMechDef.Description.Id == "mechdef_centurion_TARGETDUMMY" && RngStart.Settings.IgnoreAncestralMech == true) { maxLanceSize = RngStart.Settings.MaximumLanceSize + 1; firstTargetRun = true; minLanceSize = minLanceSize + 1; } } else if ((!RemoveAncestralMech && RngStart.Settings.IgnoreAncestralMech)) { lance.Add(AncestralMechDef); currentLanceWeight = 0; maxLanceSize = RngStart.Settings.MaximumLanceSize + 1; } else { baySlot = 1; lance.Add(AncestralMechDef); currentLanceWeight = AncestralMechDef.Chassis.Tonnage; } bool dupe = false; bool excluded = false; bool blacklisted = false; bool TargetDummy = false; while (minLanceSize > lance.Count || currentLanceWeight < RngStart.Settings.MinimumStartingWeight) { #region Def listing loops //Logger.Debug($"In while loop"); //foreach (var mech in __instance.DataManager.MechDefs) //{ // Logger.Debug($"K:{mech.Key} V:{mech.Value}"); //} //foreach (var chasis in __instance.DataManager.ChassisDefs) //{ // Logger.Debug($"K:{chasis.Key}"); //} #endregion // build lance collection from dictionary for speed var randomMech = mechTonnages.ElementAt(rng.Next(0, mechTonnages.Count)); var mechString = randomMech.Key.Replace("chassisdef", "mechdef"); // getting chassisdefs so renaming the key to match mechdefs Id //var mechDef = new MechDef(__instance.DataManager.MechDefs.Get(mechString), __instance.GenerateSimGameUID()); var mechDef = new MechDef(__instance.DataManager.MechDefs.Get(mechString), __instance.GenerateSimGameUID()); //It's not a BUG, it's a FEATURE. if (LanceCounter > RngStart.Settings.SpiderLoops) { MechDef mechDefSpider = new MechDef(__instance.DataManager.MechDefs.Get("mechdef_spider_SDR-5V"), __instance.GenerateSimGameUID(), true); lance.Add(mechDefSpider); // worry about sorting later for (int j = baySlot; j < 6; j++) { __instance.AddMech(j, mechDefSpider, true, true, false, null); } break; } if (mechDef.MechTags.Contains("BLACKLISTED")) { currentLanceWeight = 0; blacklisted = true; //Logger.Debug($"Blacklisted! {mechDef.Name}"); } //Logger.Debug($"TestMech {mechDef.Name}"); foreach (var mechID in RngStart.Settings.ExcludedMechs) { if (mechID == mechDef.Description.Id) { currentLanceWeight = 0; excluded = true; //Logger.Debug($"Excluded! {mechDef.Name}"); } } if (!RngStart.Settings.AllowDuplicateChassis) { foreach (var mech in lance) { if (mech.Name == mechDef.Name) { currentLanceWeight = 0; dupe = true; //Logger.Debug($"SAME SAME! {mech.Name}\t\t{mechDef.Name}"); } } } // does the mech fit into the lance? if (TargetDummy) { TargetDummy = false; } else { currentLanceWeight = currentLanceWeight + mechDef.Chassis.Tonnage; } if (RngStart.Settings.MaximumStartingWeight >= currentLanceWeight) { lance.Add(mechDef); //Logger.Debug($"Adding mech {mechString} {mechDef.Chassis.Tonnage} tons"); //if (currentLanceWeight > RngStart.Settings.MinimumStartingWeight + mechDef.Chassis.Tonnage) //Logger.Debug($"Minimum lance tonnage met: done"); //Logger.Debug($"current: {currentLanceWeight} tons. " + // $"tonnage remaining: {RngStart.Settings.MaximumStartingWeight - currentLanceWeight}. " + // $"before lower limit hit: {Math.Max(0, RngStart.Settings.MinimumStartingWeight - currentLanceWeight)}"); } // invalid lance, reset if (currentLanceWeight > RngStart.Settings.MaximumStartingWeight || lance.Count > maxLanceSize || dupe || blacklisted || excluded || firstTargetRun) { //Logger.Debug($"Clearing invalid lance"); currentLanceWeight = 0; lance.Clear(); dupe = false; blacklisted = false; excluded = false; firstTargetRun = false; LanceCounter++; if (RemoveAncestralMech == true) { baySlot = 0; currentLanceWeight = 0; maxLanceSize = RngStart.Settings.MaximumLanceSize; if (AncestralMechDef.Description.Id == "mechdef_centurion_TARGETDUMMY" && RngStart.Settings.IgnoreAncestralMech == true) { maxLanceSize = RngStart.Settings.MaximumLanceSize + 1; TargetDummy = true; } } else if (!RemoveAncestralMech && RngStart.Settings.IgnoreAncestralMech) { maxLanceSize = RngStart.Settings.MaximumLanceSize + 1; currentLanceWeight = 0; lance.Add(AncestralMechDef); baySlot = 1; } else { maxLanceSize = RngStart.Settings.MaximumLanceSize; currentLanceWeight = AncestralMechDef.Chassis.Tonnage; lance.Add(AncestralMechDef); baySlot = 1; } continue; } //Logger.Debug($"Done a loop"); } Logger.Debug($"New mode"); Logger.Debug($"Starting lance instantiation"); float tonnagechecker = 0; for (int x = 0; x < lance.Count; x++) { Logger.Debug($"x is {x} and lance[x] is {lance[x].Name}"); __instance.AddMech(x, lance[x], true, true, false); tonnagechecker = tonnagechecker + lance[x].Chassis.Tonnage; } Logger.Debug($"{tonnagechecker}"); float Maxtonnagedifference = tonnagechecker - RngStart.Settings.MaximumStartingWeight; float Mintonnagedifference = tonnagechecker - RngStart.Settings.MinimumStartingWeight; Logger.Debug($"Over tonnage Maximum amount: {Maxtonnagedifference}"); Logger.Debug($"Over tonnage Minimum amount: {Mintonnagedifference}"); lance.Clear(); // valid lance created } } } }
//Code for randomizing starting pilots public static void RandomizeRonin(SimGameState sim) { while (sim.PilotRoster.Count > 0) { sim.PilotRoster.RemoveAt(0); } List <PilotDef> list = new List <PilotDef>(); if (RngStart.Settings.StartingRonin != null) { var RoninRandomizer = new List <string>(); RoninRandomizer.AddRange(GetRandomSubList(RngStart.Settings.StartingRonin, RngStart.Settings.NumberRoninFromList)); foreach (var roninID in RoninRandomizer) { var pilotDef = sim.DataManager.PilotDefs.Get(roninID); // add directly to roster, don't want to get duplicate ronin from random ronin if (pilotDef != null) { sim.AddPilotToRoster(pilotDef, true, true); } } } if (RngStart.Settings.NumberRandomRonin > 0) { List <PilotDef> list2 = new List <PilotDef>(sim.RoninPilots); for (int m = list2.Count - 1; m >= 0; m--) { for (int n = 0; n < sim.PilotRoster.Count; n++) { if (list2[m].Description.Id == sim.PilotRoster[n].Description.Id) { list2.RemoveAt(m); break; } } } list2.RNGShuffle <PilotDef>(); for (int i = 0; i < RngStart.Settings.NumberRandomRonin; i++) { list.Add(list2[i]); } } if (RngStart.Settings.NumberProceduralPilots > 0) { List <PilotDef> list3 = new List <PilotDef>(); int f = 0; while (f < RngStart.Settings.NumberProceduralPilots) { PilotDef pilotDef = sim.PilotGenerator.GeneratePilots(1, 1, 0f, out list3)[0]; if (sim.CanPilotBeCareerModeStarter(pilotDef)) { pilotDef.SetDayOfHire(sim.DaysPassed); sim.AddPilotToRoster(pilotDef, false, true); f++; } } } }
public static void Postfix(SimGameState __instance) { if (RngStart.Settings.NumberRandomRonin + RngStart.Settings.NumberProceduralPilots > 0) { // clear roster while (__instance.PilotRoster.Count > 0) { __instance.PilotRoster.RemoveAt(0); } // pilotgenerator seems to give me the same exact results for ronin // every time, and can push out duplicates, which is odd? // just do our own thing var pilots = new List <PilotDef>(); // add our guarenteed starting ronin foreach (var roninID in RngStart.Settings.StartingRonin) { var pilotDef = __instance.DataManager.PilotDefs.Get(roninID); // add directly to roster, don't want to get duplicate ronin from random ronin if (pilotDef != null) { __instance.AddPilotToRoster(pilotDef, true); } } pilots.AddRange(GetRandomSubList(__instance.RoninPilots, RngStart.Settings.NumberRandomRonin)); // pilot generator works fine for non-ronin =/ if (RngStart.Settings.NumberProceduralPilots > 0) { pilots.AddRange(__instance.PilotGenerator.GeneratePilots(RngStart.Settings.NumberProceduralPilots, 1, 0, out _)); } // actually add the pilots to the SimGameState foreach (var pilotDef in pilots) { __instance.AddPilotToRoster(pilotDef, true); } } // mechs if (RngStart.Settings.NumberLightMechs + RngStart.Settings.NumberMediumMechs + RngStart.Settings.NumberHeavyMechs + RngStart.Settings.NumberAssaultMechs > 0) { var baySlot = 1; var mechIds = new List <string>(); // clear the initial lance for (var i = 1; i < __instance.Constants.Story.StartingLance.Length + 1; i++) { __instance.ActiveMechs.Remove(i); } // remove ancestral mech if specified if (RngStart.Settings.RemoveAncestralMech) { __instance.ActiveMechs.Remove(0); baySlot = 0; } // add the random mechs to mechIds mechIds.AddRange(GetRandomSubList(RngStart.Settings.AssaultMechsPossible, RngStart.Settings.NumberAssaultMechs)); mechIds.AddRange(GetRandomSubList(RngStart.Settings.HeavyMechsPossible, RngStart.Settings.NumberHeavyMechs)); mechIds.AddRange(GetRandomSubList(RngStart.Settings.MediumMechsPossible, RngStart.Settings.NumberMediumMechs)); mechIds.AddRange(GetRandomSubList(RngStart.Settings.LightMechsPossible, RngStart.Settings.NumberLightMechs)); // actually add the mechs to the game for (var i = 0; i < mechIds.Count; i++) { var mechDef = new MechDef(__instance.DataManager.MechDefs.Get(mechIds[i]), __instance.GenerateSimGameUID()); __instance.AddMech(baySlot, mechDef, true, true, false); // check to see if we're on the last mechbay and if we have more mechs to add // if so, store the mech at index 5 before next iteration. if (baySlot == 5 && i + 1 < mechIds.Count) { __instance.UnreadyMech(5, mechDef); } else { baySlot++; } } } }
public static void Add(string param) { SimGameState simGameState = SceneSingletonBehavior <UnityGameInstance> .Instance.Game.Simulation; if (param == "help") { string help = ""; help += "• This command will add ronin pilots to your roster"; help += Environment.NewLine; help += "• Params: the id or the callsign of the desired ronin"; help += Environment.NewLine; help += "• Example: '/ronin pilot_backer_Eck'"; help += Environment.NewLine; help += "• Example: '/ronin Eck'"; PopupHelper.Info(help); return; } int pilotsToAddCount = simGameState.GetMaxMechWarriors() - simGameState.PilotRoster.Count; if (pilotsToAddCount <= 0) { string message = $"No space left in roster."; Logger.Debug($"[Cheater_Ronin_Add] {message}"); PopupHelper.Info(message); return; } if (param == "All" || param == "all") { for (int i = 0; i < pilotsToAddCount; i++) { PilotDef pilotDef = simGameState.GetUnusedRonin(); simGameState.AddPilotToRoster(pilotDef, true, true); string message = $"Added {pilotDef.Description.Callsign} to roster."; Logger.Debug($"[Cheater_Ronin_Add] {message}"); PopupHelper.Info(message); } } else { // Allow to add by id or callsign (ie: "/ronin pilot_backer_Eck" or "/ronin Eck") PilotDef pilotDef = simGameState.DataManager.PilotDefs.FirstOrDefault(kvp => kvp.Key == param || kvp.Value.Description.Callsign == param || kvp.Value.Description.Callsign?.ToLower() == param).Value; if (pilotDef != null) //if (simGameState.DataManager.PilotDefs.TryGet(param, out PilotDef pilotDef)) { List <string> ___usedRoninIDs = (List <string>)AccessTools.Field(typeof(SimGameState), "usedRoninIDs").GetValue(simGameState); if (!___usedRoninIDs.Contains(pilotDef.Description.Id) && simGameState.IsRoninWhitelisted(pilotDef)) { simGameState.AddPilotToRoster(pilotDef, true, true); string message = $"Added {pilotDef.Description.Callsign} to roster."; Logger.Debug($"[Cheater_Ronin_Add] {message}"); PopupHelper.Info(message); } else { string message = $"{pilotDef.Description.Callsign} is blacklisted or already part of your roster."; Logger.Debug($"[Cheater_Ronin_Add] {message}"); PopupHelper.Info(message); } } else { string message = $"Couldn't find ronin with id or callsign: {param}"; Logger.Debug($"[Cheater_Ronin_Add] {message}"); PopupHelper.Info(message); } } }