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()); }
// 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); }