private static Pawn DoGenerateNewNakedPawn(ref PawnGenerationRequest request, out string error, bool ignoreScenarioRequirements) { error = null; Pawn pawn = (Pawn)ThingMaker.MakeThing(request.KindDef.race, null); AlienPawnGenerator.pawnsBeingGenerated.Add(new AlienPawnGenerator.PawnGenerationStatus(pawn, null)); Pawn result; try { pawn.kindDef = request.KindDef; pawn.SetFactionDirect(request.Faction); PawnComponentsUtility.CreateInitialComponents(pawn); if (request.FixedGender.HasValue) { pawn.gender = request.FixedGender.Value; } else if (pawn.RaceProps.hasGenders) { if (Rand.Value < 0.5f) { pawn.gender = Gender.Male; } else { pawn.gender = Gender.Female; } } else { pawn.gender = Gender.None; } AlienPawnGenerator.GenerateRandomAge(pawn, request); pawn.needs.SetInitialLevels(); if (!request.Newborn && request.CanGeneratePawnRelations) { AlienPawnGenerator.GeneratePawnRelations(pawn, ref request); } if (pawn.RaceProps.Humanlike) { pawn.story.skinWhiteness = ((!request.FixedSkinWhiteness.HasValue) ? PawnSkinColors.RandomSkinWhiteness() : request.FixedSkinWhiteness.Value); pawn.story.crownType = ((Rand.Value >= 0.5f) ? CrownType.Narrow : CrownType.Average); pawn.story.hairColor = PawnHairColors.RandomHairColor(pawn.story.SkinColor, pawn.ageTracker.AgeBiologicalYears); PawnBioGenerator.GiveAppropriateBioTo(pawn, request.FixedLastName); pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(pawn, request.Faction.def); AlienPawnGenerator.GiveRandomTraits(pawn, request.AllowGay); pawn.story.GenerateSkillsFromBackstory(); } if (pawn.workSettings != null && request.Faction.IsPlayer) { pawn.workSettings.EnableAndInitialize(); } if (request.Faction != null && pawn.RaceProps.Animal) { pawn.GenerateNecessaryName(); } if (!request.AllowDead && (pawn.Dead || pawn.Destroyed)) { AlienPawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated dead pawn."; result = null; } else if (!request.AllowDowned && pawn.Downed) { AlienPawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated downed pawn."; result = null; } else if (request.MustBeCapableOfViolence && pawn.story != null && pawn.story.WorkTagIsDisabled(WorkTags.Violent)) { AlienPawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn incapable of violence."; result = null; } else if (!ignoreScenarioRequirements && request.Context == PawnGenerationContext.PlayerStarter && !Find.Scenario.AllowPlayerStartingPawn(pawn)) { AlienPawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn doesn't meet scenario requirements."; result = null; } else if (request.Validator != null && !request.Validator(pawn)) { AlienPawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn didn't pass validator check."; result = null; } else { for (int i = 0; i < AlienPawnGenerator.pawnsBeingGenerated.Count - 1; i++) { if (AlienPawnGenerator.pawnsBeingGenerated[i].PawnsGeneratedInTheMeantime == null) { AlienPawnGenerator.pawnsBeingGenerated[i] = new AlienPawnGenerator.PawnGenerationStatus(AlienPawnGenerator.pawnsBeingGenerated[i].Pawn, new List <Pawn>()); } AlienPawnGenerator.pawnsBeingGenerated[i].PawnsGeneratedInTheMeantime.Add(pawn); } result = pawn; } } finally { AlienPawnGenerator.pawnsBeingGenerated.RemoveLast <AlienPawnGenerator.PawnGenerationStatus>(); } return(result); }