예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
 /// <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}");
             }
         }
     }
 }
예제 #4
0
        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);
            });
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        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);
            }
        }
예제 #7
0
        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}");
                }
            }
        }
예제 #8
0
        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);
        }
예제 #9
0
        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
                    }
                }
            }
        }
예제 #10
0
        //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++;
                    }
                }
            }
        }
예제 #11
0
        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++;
                    }
                }
            }
        }
예제 #12
0
        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);
                }
            }
        }