Exemple #1
0
        static void Postfix(SGSystemViewPopulator __instance, List <LocalizableText> ___SystemDescriptionFields)
        {
            Mod.Log.Debug?.Write("Updating system description with scarcity");

            StarSystem     selectedSystem = ModState.SimGameState.Starmap.CurSelected.System;
            PlanetScarcity scarcity       = selectedSystem.GetScarcityForPlanet();

            StringBuilder sb = new StringBuilder(selectedSystem.Def.Description.Details);

            sb.Append("\n");

            if (scarcity.MechWarriors.Upper > 0)
            {
                Mod.Log.Debug?.Write($"  MechWarriors lowerBound: {scarcity.MechWarriors.Lower}  upperBound: {scarcity.MechWarriors.Upper}");
                string mechWarriorsBoundsText = new Text(Mod.LocalizedText.PlanetStrings[ModText.PT_MW_BOUNDS],
                                                         new object[] { scarcity.MechWarriors.Lower, scarcity.MechWarriors.Upper }).ToString();
                sb.Append("\n");
                sb.Append(mechWarriorsBoundsText);
            }

            if (Mod.Config.HiringHall.VehicleCrews.Enabled && scarcity.Vehicles.Lower > 0)
            {
                Mod.Log.Debug?.Write($"  Vehicles lowerBound: {scarcity.Vehicles.Lower}  upperBound: {scarcity.Vehicles.Upper}");
                string vehicleCrewBoundsText = new Text(Mod.LocalizedText.PlanetStrings[ModText.PT_VEHICLE_BOUNDS],
                                                        new object[] { scarcity.Vehicles.Lower, scarcity.Vehicles.Upper }).ToString();
                sb.Append("\n");
                sb.Append(vehicleCrewBoundsText);
            }

            if (Mod.Config.HiringHall.AerospaceWings.Enabled && scarcity.Aerospace.Lower > 0)
            {
                Mod.Log.Debug?.Write($"  Aerospace lowerBound: {scarcity.Aerospace.Lower}  upperBound: {scarcity.Aerospace.Upper}");
                string mechTechBoundsText = new Text(Mod.LocalizedText.PlanetStrings[ModText.PT_AERO_BOUNDS],
                                                     new object[] { scarcity.Aerospace.Lower, scarcity.Aerospace.Upper }).ToString();
                sb.Append("\n");
                sb.Append(mechTechBoundsText);
            }

            if (Mod.Config.HiringHall.MechTechCrews.Enabled && scarcity.MechTechs.Lower > 0)
            {
                Mod.Log.Debug?.Write($"  MechTechs lowerBound: {scarcity.MechTechs.Lower}  upperBound: {scarcity.MechTechs.Upper}");
                string mechTechBoundsText = new Text(Mod.LocalizedText.PlanetStrings[ModText.PT_MECH_TECH_BOUNDS],
                                                     new object[] { scarcity.MechTechs.Lower, scarcity.MechTechs.Upper }).ToString();
                sb.Append("\n");
                sb.Append(mechTechBoundsText);
            }

            if (Mod.Config.HiringHall.MedTechCrews.Enabled && scarcity.MedTechs.Lower > 0)
            {
                Mod.Log.Debug?.Write($"  MedTechs lowerBound: {scarcity.MedTechs.Lower}  upperBound: {scarcity.MedTechs.Upper}");
                string medTechBoundsText = new Text(Mod.LocalizedText.PlanetStrings[ModText.PT_MED_TECH_BOUNDS],
                                                    new object[] { scarcity.MedTechs.Lower, scarcity.MedTechs.Upper }).ToString();
                sb.Append("\n");
                sb.Append(medTechBoundsText);
            }

            __instance.SetField(___SystemDescriptionFields, sb.ToString());
        }
Exemple #2
0
        // TODO: Manipulate # of pilots by planet tags
        // TODO: Manipulate # of ronin by planet tags
        // TODO: Check for Allow flags by each type
        static bool Prefix(StarSystem __instance, int count)
        {
            int systemDiff = __instance.Def.GetDifficulty(SimGameState.SimGameType.CAREER);

            Mod.Log.Info?.Write($"Generating pilots for system: {__instance.Name} with difficulty: {systemDiff}");

            PlanetScarcity scarcity = __instance.GetScarcityForPlanet();

            int aerospace = scarcity.Aerospace.Upper > 0 ?
                            Math.Max(0, Mod.Random.Next(scarcity.Aerospace.Lower, scarcity.Aerospace.Upper)) : 0;
            int mechTechs = scarcity.MechTechs.Upper > 0 ?
                            Math.Max(0, Mod.Random.Next(scarcity.MechTechs.Lower, scarcity.MechTechs.Upper)) : 0;
            int mechWarriors = scarcity.MechWarriors.Upper > 0 ?
                               Math.Max(0, Mod.Random.Next(scarcity.MechWarriors.Lower, scarcity.MechWarriors.Upper)) : 0;
            int medTechs = scarcity.MedTechs.Upper > 0 ?
                           Math.Max(0, Mod.Random.Next(scarcity.MedTechs.Lower, scarcity.MedTechs.Upper)) : 0;
            int vehicleCrews = scarcity.Vehicles.Upper > 0 ?
                               Math.Max(0, Mod.Random.Next(scarcity.Vehicles.Lower, scarcity.Vehicles.Upper)) : 0;

            Mod.Log.Debug?.Write($"Generated mechwarriors: {mechWarriors}  vehicleCrews: {vehicleCrews}  " +
                                 $"mechTechs: {mechTechs}  medTechs: {medTechs}  aerospace: {aerospace}");

            // Generate pilots and crews
            if (mechWarriors > 0)
            {
                __instance.AvailablePilots.Clear();

                if (Mod.Config.DebugCommands)
                {
                    for (int i = 0; i < 8; i++)
                    {
                        PilotDef unusedRonin = ModState.SimGameState.GetUnusedRonin();

                        if (!ModState.SimGameState.UsedRoninIDs.Contains(unusedRonin.Description.Id))
                        {
                            Mod.Log.Debug?.Write($"Added ronin: {unusedRonin.Description.DisplayName} to available pilots.");

                            PilotDef upgradedDef = CrewGenerator.UpgradeRonin(__instance, unusedRonin);
                            __instance.AvailablePilots.Add(upgradedDef);
                        }
                        else
                        {
                            Mod.Log.Debug?.Write($"Ronin: {unusedRonin.Description.DisplayName} already in use, skipping.");
                        }
                    }
                }

                // Ronin DO NOT count against the system limits. Just add them, if the roll passes.
                double roninRoll = Mod.Random.NextDouble();
                if (roninRoll <= Mod.Config.HiringHall.RoninChance)
                {
                    Mod.Log.Debug?.Write($"Ronin roll of {roninRoll} <= roninChance: {Mod.Config.HiringHall.RoninChance}. Adding one Ronin to hiring hall.");
                    PilotDef unusedRonin = ModState.SimGameState.GetUnusedRonin();

                    if (!ModState.SimGameState.UsedRoninIDs.Contains(unusedRonin.Description.Id))
                    {
                        Mod.Log.Debug?.Write($"Added ronin: {unusedRonin.Description.DisplayName} to available pilots.");

                        PilotDef upgradedDef = CrewGenerator.UpgradeRonin(__instance, unusedRonin);
                        __instance.AvailablePilots.Add(upgradedDef);
                    }
                    else
                    {
                        Mod.Log.Debug?.Write($"Ronin: {unusedRonin.Description.DisplayName} already in use, skipping.");
                    }
                }

                for (int i = 0; i < mechWarriors; i++)
                {
                    PilotDef pDef = CrewGenerator.GenerateMechWarrior(__instance);
                    __instance.AvailablePilots.Add(pDef);
                }
            }

            if (Mod.Config.HiringHall.AerospaceWings.Enabled)
            {
                for (int i = 0; i < aerospace; i++)
                {
                    PilotDef pDef = CrewGenerator.GenerateAerospaceCrew(__instance);
                    __instance.AvailablePilots.Add(pDef);
                }
            }

            if (Mod.Config.HiringHall.MechTechCrews.Enabled)
            {
                for (int i = 0; i < mechTechs; i++)
                {
                    PilotDef pDef = CrewGenerator.GenerateMechTechCrew(__instance);
                    __instance.AvailablePilots.Add(pDef);
                }
            }

            if (Mod.Config.HiringHall.MedTechCrews.Enabled)
            {
                for (int i = 0; i < medTechs; i++)
                {
                    PilotDef pDef = CrewGenerator.GenerateMedTechCrew(__instance);
                    __instance.AvailablePilots.Add(pDef);
                }
            }

            if (Mod.Config.HiringHall.VehicleCrews.Enabled)
            {
                for (int i = 0; i < vehicleCrews; i++)
                {
                    PilotDef pDef = CrewGenerator.GenerateVehicleCrew(__instance);
                    __instance.AvailablePilots.Add(pDef);
                }
            }
            return(false);
        }
        public static PlanetScarcity GetScarcityForPlanet(this StarSystem currentSystem)
        {
            float aerospaceUpperBound    = Mod.Config.HiringHall.Scarcity.Defaults.Aerospace;
            float mechTechsUpperBound    = Mod.Config.HiringHall.Scarcity.Defaults.MechTechs;
            float mechWarriorsUpperBound = Mod.Config.HiringHall.Scarcity.Defaults.MechWarriors;
            float medTechsUpperBound     = Mod.Config.HiringHall.Scarcity.Defaults.MedTechs;
            float vehicleCrewsUpperBound = Mod.Config.HiringHall.Scarcity.Defaults.VehicleCrews;

            foreach (string tag in currentSystem.Tags)
            {
                Mod.Config.HiringHall.Scarcity.PlanetTagModifiers.TryGetValue(tag, out CrewTagModifier modifier);
                if (modifier != null)
                {
                    Mod.Log.Debug?.Write($"  tag: {tag} has scarcity =>  " +
                                         $"aerospace: {modifier.Aerospace}  mechTechs: {modifier.MechTechs}  mechwarriors: {modifier.MechWarriors}  medTechs: {modifier.MedTechs}  vehicleCrews: {modifier.VehicleCrews}");
                    aerospaceUpperBound    += modifier.Aerospace;
                    mechWarriorsUpperBound += modifier.MechWarriors;
                    mechTechsUpperBound    += modifier.MechTechs;
                    medTechsUpperBound     += modifier.MedTechs;
                    vehicleCrewsUpperBound += modifier.VehicleCrews;
                }
            }

            // Ceiling everything
            aerospaceUpperBound    = (float)Math.Ceiling(aerospaceUpperBound);
            mechTechsUpperBound    = (float)Math.Ceiling(mechTechsUpperBound);
            mechWarriorsUpperBound = (float)Math.Ceiling(mechWarriorsUpperBound);
            medTechsUpperBound     = (float)Math.Ceiling(medTechsUpperBound);
            vehicleCrewsUpperBound = (float)Math.Ceiling(vehicleCrewsUpperBound);

            PlanetScarcity pilotScarcity = new PlanetScarcity();

            if (aerospaceUpperBound > 0)
            {
                int aerospaceLowerBound = (int)Math.Max(0, aerospaceUpperBound / 2);
                pilotScarcity.Aerospace = (aerospaceLowerBound, (int)aerospaceUpperBound);
            }

            if (mechTechsUpperBound > 0)
            {
                int mechTechLowerBound = (int)Math.Max(0, mechTechsUpperBound / 2);
                pilotScarcity.MechTechs = (mechTechLowerBound, (int)mechTechsUpperBound);
            }

            if (mechWarriorsUpperBound > 0)
            {
                int mechWarriorsLowerBound = (int)Math.Max(0, mechWarriorsUpperBound / 2);
                pilotScarcity.MechWarriors = (mechWarriorsLowerBound, (int)mechWarriorsUpperBound);
            }

            if (medTechsUpperBound > 0)
            {
                int medTechsLowerBound = (int)Math.Max(0, medTechsUpperBound / 2);
                pilotScarcity.MedTechs = (medTechsLowerBound, (int)medTechsUpperBound);
            }

            if (vehicleCrewsUpperBound > 0)
            {
                int vehicleCrewsLowerBound = (int)Math.Max(0, vehicleCrewsUpperBound / 2);
                pilotScarcity.Vehicles = (vehicleCrewsLowerBound, (int)vehicleCrewsUpperBound);
            }

            Mod.Log.Debug?.Write($"Planet: {currentSystem.Name} has final bounds:");
            Mod.Log.Debug?.Write($"  mechwarriors:  {pilotScarcity.MechWarriors.Lower} to {pilotScarcity.MechWarriors.Upper}");
            Mod.Log.Debug?.Write($"  vehicles:      {pilotScarcity.Vehicles.Lower} to {pilotScarcity.Vehicles.Upper}");
            Mod.Log.Debug?.Write($"  aerospace:     {pilotScarcity.Aerospace.Lower} to {pilotScarcity.Aerospace.Upper}");
            Mod.Log.Debug?.Write($"  mechTechs:     {pilotScarcity.MechTechs.Lower} to {pilotScarcity.MechTechs.Upper}");
            Mod.Log.Debug?.Write($"  medTechs:      {pilotScarcity.MedTechs.Lower} to {pilotScarcity.MedTechs.Upper}");

            return(pilotScarcity);
        }