private static PilotDef GenerateSkillessCrew(StarSystem starSystem, string callsign, out int crewSize, out int crewSkill)
        {
            // Determine crew size and skill
            crewSize  = GaussianHelper.RandomCrewSize(0, 0);
            crewSkill = GaussianHelper.RandomCrewSkill(0, 0);
            Mod.Log.Debug?.Write($" - random crewSize: {crewSize}  crewSkill: {crewSkill}");

            PilotDef pilotDef = new PilotDef(new HumanDescriptionDef(), 1, 1, 1, 1, 1, 1, lethalInjury: false, 1, "", new List <string>(), AIPersonality.Undefined, 0, 0, 0);

            return(GenerateCrew(starSystem, callsign, pilotDef));
        }
        private static PilotDef GenerateSkilledCrew(StarSystem starSystem, bool isMechWarrior)
        {
            string callsign = RandomUnusedCallsign();

            CrewTagModifier planetModifiers = starSystem.GetPlanetSkillDistModifier();
            float           planetMod       = isMechWarrior ? planetModifiers.MechWarriors : planetModifiers.VehicleCrews;
            int             skillIdx        = GaussianHelper.RandomCrewSkill(planetMod, 0);

            Mod.Log.Debug?.Write($" - generated skillIdx: {skillIdx} using planetModifier: {planetMod}");

            // Divide skill points by 4 to generate a median for each skill
            float totalSkillPoints = isMechWarrior ?
                                     Mod.Config.HiringHall.MechWarriors.SkillToExpertiseThresholds[skillIdx] :
                                     Mod.Config.HiringHall.VehicleCrews.SkillToExpertiseThresholds[skillIdx];

            // Normalize to the basic 10/10/10/10 max if we pull the highest index
            if (totalSkillPoints > 40)
            {
                totalSkillPoints = 40;
            }
            float medianSkillPoints = totalSkillPoints / 4;
            // Reduce the median by -2 to allow for random add below
            float adjustedMedian = (float)Math.Max(0, medianSkillPoints - 2);

            Mod.Log.Debug?.Write($" - skillPoints =>  total: {totalSkillPoints} median: {medianSkillPoints}  adjusted: {adjustedMedian}");

            // Each skill can vary +2.0 from adjusted, then rounded to an integer.
            int piloting = (int)Math.Round(adjustedMedian + (Mod.Random.NextDouble() * 2));
            int gunnery  = (int)Math.Round(adjustedMedian + (Mod.Random.NextDouble() * 2));
            int guts     = (int)Math.Round(adjustedMedian + (Mod.Random.NextDouble() * 2));
            int tactics  = (int)Math.Round(adjustedMedian + (Mod.Random.NextDouble() * 2));

            Mod.Log.Debug?.Write($" - skills =>  piloting: {piloting}  gunnery: {gunnery}  guts: {guts}  tactics: {tactics}");

            // TODO: randomize health +/- 1?
            int health = 3;

            PilotDef pilotDef = new PilotDef(new HumanDescriptionDef(), gunnery, piloting, guts, tactics, injuries: 0, health,
                                             lethalInjury: false, morale: 1, voice: "", new List <string>(), AIPersonality.Undefined, 0, 0, 0);
            PilotDef generatedDef = GenerateCrew(starSystem, callsign, pilotDef);

            // Add the necessary tags here *in addition* to in CrewDetails to support Abilifier (it needs the tag before
            //   the call to SetPilotAbilities)
            if (!isMechWarrior)
            {
                generatedDef.PilotTags.Add(ModTags.Tag_CU_NoMech_Crew);
                generatedDef.PilotTags.Add(ModTags.Tag_CU_Vehicle_Crew);
            }
            else
            {
                // TODO: Are there any mechwarrior tags?
            }


            // Abilities must be set AFTER the pilotDef is created, to allow Abilifier a chance to hook into them
            // TODO: Randomize ability selections
            GenerateAbilityDefs(generatedDef, new Dictionary <string, int>()
            {
                { ModConsts.Skill_Gunnery, gunnery },
                { ModConsts.Skill_Guts, guts },
                { ModConsts.Skill_Piloting, piloting },
                { ModConsts.Skill_Tactics, tactics },
            },
                                isMechWarrior ? Mod.Config.HiringHall.MechWarriors : Mod.Config.HiringHall.VehicleCrews
                                );

            generatedDef.ForceRefreshAbilityDefs();

            return(generatedDef);
        }