public static Pawn GeneratePawn(PawnGenerationRequest request) { Log.Message("Alien Pawn generated."); request.EnsureNonNullFaction(); Pawn pawn = null; if (!request.Newborn && !request.ForceGenerateNewPawn && Rand.Value < AlienPawnGenerator.ChanceToRedressAnyWorldPawn()) { IEnumerable <Pawn> enumerable = Find.WorldPawns.GetPawnsBySituation(WorldPawnSituation.Free); if (request.KindDef.factionLeader) { enumerable = enumerable.Concat(Find.WorldPawns.GetPawnsBySituation(WorldPawnSituation.FactionLeader)); } enumerable = from x in enumerable where AlienPawnGenerator.IsValidCandidateToRedress(x, request) select x; if (enumerable.TryRandomElementByWeight((Pawn x) => AlienPawnGenerator.WorldPawnSelectionWeight(x), out pawn)) { Verse.PawnGenerator.RedressPawn(pawn, request); Find.WorldPawns.RemovePawn(pawn); } } if (pawn == null) { pawn = AlienPawnGenerator.GenerateNewNakedPawn(ref request); if (pawn == null) { return(null); } if (!request.Newborn) { AlienPawnGenerator.GenerateGearFor(pawn, request); } } if (Find.Scenario != null) { Find.Scenario.Notify_PawnGenerated(pawn, request.Context); } if (pawn.kindDef.race.ToString().Contains("Alien_")) { AlienPawn alienpawn = new AlienPawn(); return(alienpawn); } else { return(pawn); } }
public static Pawn GeneratePawn(PawnGenerationRequest request) { request.EnsureNonNullFaction(); Pawn pawn = null; if (!request.Newborn && !request.ForceGenerateNewPawn) { /*****Logging*****/ //Log.Message("(!request.Newborn && !request.ForceGenerateNewPawn) true"); /*****Logging*****/ if (request.Inhabitant && request.Tile != -1) { Settlement settlement = Find.WorldObjects.WorldObjectAt <Settlement>(request.Tile); if (settlement != null && settlement.previouslyGeneratedInhabitants.Any <Pawn>()) { IEnumerable <Pawn> validCandidatesToRedress = GetValidCandidatesToRedress(request); if ((from x in validCandidatesToRedress where settlement.previouslyGeneratedInhabitants.Contains(x) select x).TryRandomElementByWeight((Pawn x) => WorldPawnSelectionWeight(x), out pawn)) { RedressPawn(pawn, request); Find.WorldPawns.RemovePawn(pawn); } } } if (pawn == null && Rand.Value < ChanceToRedressAnyWorldPawn()) { IEnumerable <Pawn> validCandidatesToRedress2 = GetValidCandidatesToRedress(request); if (validCandidatesToRedress2.TryRandomElementByWeight((Pawn x) => WorldPawnSelectionWeight(x), out pawn)) { RedressPawn(pawn, request); Find.WorldPawns.RemovePawn(pawn); } } } // Starting Pawns if (pawn == null) { /*****Logging*****/ //Log.Message("(pawn == null) true"); /*****Logging*****/ pawn = GenerateNewNakedPawn(ref request); if (pawn == null) { return(null); } if (!request.Newborn) { GenerateGearFor(pawn, request); } if (request.Inhabitant && request.Tile != -1) { Settlement settlement2 = Find.WorldObjects.WorldObjectAt <Settlement>(request.Tile); if (settlement2 != null) { settlement2.previouslyGeneratedInhabitants.Add(pawn); } } } if (Find.Scenario != null) { Find.Scenario.Notify_PawnGenerated(pawn, request.Context); } return(pawn); }
//public static AIPawn GeneratePawn(PawnKindDef kindDef, Faction faction, Map map, Gender gender = Gender.Female, int tries = 0) public static AIPawn GenerateAIPawn(ref PawnGenerationRequest request, Map map, int tries = 0) { BackstoryHelper.AddNewBackstoriesToDatabase(); // First add the new backstories to the database //Log.Error("0"); AIPawn pawnAI = (AIPawn)ThingMaker.MakeThing(request.KindDef.race, null); //Log.Error("1"); GetXMLData(pawnAI); request.EnsureNonNullFaction(); pawnAI.kindDef = request.KindDef; pawnAI.SetFactionDirect(request.Faction); PawnComponentsUtility.CreateInitialComponents(pawnAI); //Log.Error("2"); // Needs to be set because of not flesh user pawnAI.relations = new Pawn_RelationsTracker(pawnAI); pawnAI.guest = new Pawn_GuestTracker(pawnAI); if (request.FixedGender.HasValue) { pawnAI.gender = request.FixedGender.Value; } else if (pawnAI.RaceProps.hasGenders) { if (Rand.Value < 0.5f) { pawnAI.gender = Gender.Male; } else { pawnAI.gender = Gender.Female; } } else { pawnAI.gender = Gender.Female; } SetBirthday(pawnAI); pawnAI.needs.SetInitialLevels(); //Log.Error("3"); AIPawnGenerator.GenerateInitialHediffs(pawnAI); if (pawnAI.RaceProps.Humanlike) { pawnAI.story.melanin = 0.1f; pawnAI.story.crownType = CrownType.Average; pawnAI.story.hairColor = PawnHairColors.RandomHairColor(pawnAI.story.SkinColor, pawnAI.ageTracker.AgeBiologicalYears); pawnAI.story.childhood = GetBackstory(); //pawnAI.story.adulthood = GetBackstory(); string headGraphicPath = GraphicDatabaseHeadRecords.GetHeadRandom(pawnAI.gender, pawnAI.story.SkinColor, pawnAI.story.crownType).GraphicPath; // With this Reflection you can access a private variable! Here: The private string "headGraphicPath" is set System.Reflection.FieldInfo fi = typeof(Pawn_StoryTracker).GetField("headGraphicPath", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); fi.SetValue(pawnAI.story, headGraphicPath); pawnAI.story.hairDef = GetHair(); pawnAI.story.bodyType = ((pawnAI.gender != Gender.Female) ? BodyType.Male : BodyType.Female); MakeSkillsFromBackstory(pawnAI); GiveTraitsTo(pawnAI); if (pawnAI.workSettings != null && (request.Faction == Faction.OfPlayer)) { pawnAI.workSettings.EnableAndInitialize(); } } if (pawnAI.RaceProps.ToolUser) { GenerateBaseApparel(pawnAI); } pawnAI.Name = GetName(pawnAI.def, map); //Log.Error("4"); //PawnGenerationRequest request = new PawnGenerationRequest(pawnAI.kindDef , Faction.OfPlayer, PawnGenerationContext.All, true, true, false,false, false, false, 0, false, false, false,null, 0,0, pawnAI.gender, null, null); //PawnInventoryGenerator.GenerateInventoryFor(pawnAI, request); if (!pawnAI.Dead) { return(pawnAI); } if (tries < 10) { return(GenerateAIPawn(ref request, map, tries + 1)); } return(null); }