private Thing CreateAnimal(EquipmentDatabaseEntry entry) { ThingDef def = entry.def; PawnKindDef kindDef = (from td in DefDatabase <PawnKindDef> .AllDefs where td.race == def select td).FirstOrDefault(); if (kindDef != null) { Pawn pawn = PawnGenerator.GeneratePawn(kindDef, Faction.OfPlayer); pawn.gender = entry.gender; if (pawn.Name == null || pawn.Name.Numerical) { pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full, null); } if (kindDef.RaceProps.petness > 0) { Pawn bondedColonist = Find.GameInitData.startingPawns.RandomElement <Pawn>(); bondedColonist.relations.AddDirectRelation(PawnRelationDefOf.Bond, pawn); } return(pawn); } else { return(null); } }
protected override void PostSuccessfulApply(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill) { pawn.health.AddHediff(WTH_DefOf.WTH_BackupBattery, pawn.TryGetReactor()); pawn.SetFaction(Faction.OfPlayer); if (pawn.relations == null) { pawn.relations = new Pawn_RelationsTracker(pawn); } if (pawn.story == null) { pawn.story = new Pawn_StoryTracker(pawn); } if (pawn.ownership == null) { pawn.ownership = new Pawn_Ownership(pawn); } ExtendedPawnData pawnData = Base.Instance.GetExtendedDataStorage().GetExtendedDataFor(pawn); Utilities.InitWorkTypesAndSkills(pawn, pawnData); pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full); Find.LetterStack.ReceiveLetter("WTH_Letter_Success_Label".Translate(), "WTH_Letter_Success_Label_Description".Translate(new object[] { billDoer.Name.ToStringShort, pawn.Name }), LetterDefOf.PositiveEvent, pawn); billDoer.jobs.jobQueue.EnqueueFirst(new Job(WTH_DefOf.WTH_ClearHackingTable, pawn, pawn.CurrentBed()) { count = 1 }); LessonAutoActivator.TeachOpportunity(WTH_DefOf.WTH_Power, OpportunityType.Important); LessonAutoActivator.TeachOpportunity(WTH_DefOf.WTH_Maintenance, OpportunityType.Important); LessonAutoActivator.TeachOpportunity(WTH_DefOf.WTH_Concept_MechanoidParts, OpportunityType.Important); }
public override IEnumerable<Thing> PlayerStartingThings() { List<Thing> result = new List<Thing>(); if (animalKindDef == null) { return result; } for (int i=0; i<count; i++) { Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequestWrapper() { FixedGender = gender, Faction = Faction.OfPlayer, KindDef = animalKindDef, Context = PawnGenerationContext.NonPlayer }.Request); if (pawn.Name == null || pawn.Name.Numerical) { pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full, null); } if (Rand.Value < bondToRandomPlayerPawnChance) { Pawn bonded = Find.GameInitData.startingAndOptionalPawns.RandomElement<Pawn>(); if (!bonded.story.traits.HasTrait(TraitDefOf.Psychopath)) { bonded.relations.AddDirectRelation(PawnRelationDefOf.Bond, pawn); } } result.Add(pawn); } return result; }
private static void NameUnnamedMechs(Thing newThing) { if (newThing is Pawn pawn && pawn.IsHacked() && (pawn.Name == null || !pawn.Name.IsValid)) { pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full); } }
protected override void RunInt() { Slate slate = QuestGen.slate; PawnGenerationRequest request = new PawnGenerationRequest(kindDef.GetValue(slate), faction.GetValue(slate), PawnGenerationContext.NonPlayer, -1, forceGenerateNewPawn: false, newborn: false, allowDead: false, allowDowned: false, canGeneratePawnRelations: true, allowAddictions: allowAddictions.GetValue(slate) ?? true, forcedTraits: forcedTraits.GetValue(slate), biocodeWeaponChance: biocodeWeaponChance.GetValue(slate), mustBeCapableOfViolence: mustBeCapableOfViolence.GetValue(slate), colonistRelationChanceFactor: 1f, forceAddFreeWarmLayerIfNeeded: false, allowGay: true, allowFood: true, inhabitant: false, certainlyBeenInCryptosleep: false, forceRedressWorldPawnIfFormerColonist: false, worldPawnFactionDoesntMatter: false, extraPawnForExtraRelationChance: extraPawnForExtraRelationChance.GetValue(slate), relationWithExtraPawnChanceFactor: relationWithExtraPawnChanceFactor.GetValue(slate)); request.BiocodeApparelChance = biocodeApparelChance.GetValue(slate); Pawn pawn = PawnGenerator.GeneratePawn(request); if (ensureNonNumericName.GetValue(slate) && (pawn.Name == null || pawn.Name.Numerical)) { pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn); } if (storeAs.GetValue(slate) != null) { QuestGen.slate.Set(storeAs.GetValue(slate), pawn); } if (addToList.GetValue(slate) != null) { QuestGenUtility.AddToOrMakeList(QuestGen.slate, addToList.GetValue(slate), pawn); } if (addToLists.GetValue(slate) != null) { foreach (string item in addToLists.GetValue(slate)) { QuestGenUtility.AddToOrMakeList(QuestGen.slate, item, pawn); } } QuestGen.AddToGeneratedPawns(pawn); if (!pawn.IsWorldPawn()) { Find.WorldPawns.PassToWorld(pawn); } }
protected override void PostSuccessfulApply(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill) { pawn.health.AddHediff(WTH_DefOf.WTH_BackupBattery, pawn.TryGetReactor()); pawn.SetFaction(Faction.OfPlayer); if (pawn.relations == null) { pawn.relations = new Pawn_RelationsTracker(pawn); } /* * if (pawn.jobs.curDriver != null) * { * pawn.jobs.posture = PawnPosture.LayingOnGroundNormal; * } */ if (pawn.story == null) { pawn.story = new Pawn_StoryTracker(pawn); } pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full); Find.LetterStack.ReceiveLetter("WTH_Letter_Success_Label".Translate(), "WTH_Letter_Success_Label_Description".Translate(new object[] { billDoer.Name.ToStringShort, pawn.Name }), LetterDefOf.PositiveEvent, pawn); billDoer.jobs.jobQueue.EnqueueFirst(new Job(WTH_DefOf.WTH_ClearHackingTable, pawn, pawn.CurrentBed()) { count = 1 }); LessonAutoActivator.TeachOpportunity(WTH_DefOf.WTH_Power, OpportunityType.Important); LessonAutoActivator.TeachOpportunity(WTH_DefOf.WTH_Maintenance, OpportunityType.Important); }
static bool Prefix(ref Pawn __result, Quest quest, PawnKindDef kindDef, Faction faction, bool allowAddictions = true, IEnumerable <TraitDef> forcedTraits = null, float biocodeWeaponChance = 0f, bool mustBeCapableOfViolence = true, Pawn extraPawnForExtraRelationChance = null, float relationWithExtraPawnChanceFactor = 0f, float biocodeApparelChance = 0f, bool ensureNonNumericName = false, bool forceGenerateNewPawn = false) { if (faction == FactionColonies.getPlayerColonyFaction()) { List <PawnKindDef> list = new List <PawnKindDef>(); foreach (ThingDef def in Find.World.GetComponent <FactionFC>().raceFilter.AllowedThingDefs) { list.Add(def.race.AnyPawnKind); } Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(list.RandomElement(), faction, PawnGenerationContext.NonPlayer, -1, forceGenerateNewPawn, false, false, false, true, mustBeCapableOfViolence, 1f, false, true, true, allowAddictions, false, false, false, false, biocodeWeaponChance, extraPawnForExtraRelationChance, relationWithExtraPawnChanceFactor, null, null, forcedTraits, null, null, null, null, null, null, null, null, null) { BiocodeApparelChance = biocodeApparelChance }); if (ensureNonNumericName && (pawn.Name == null || pawn.Name.Numerical)) { pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full, null); } QuestGen.AddToGeneratedPawns(pawn); if (!pawn.IsWorldPawn()) { Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide); } __result = pawn; return(false); } else { return(true); } }
// Original method copy pasted from decompiled code public static Name GeneratePawnName(Pawn pawn, NameStyle style = NameStyle.Full, string forcedLastName = null) { if (style == NameStyle.Full) { RulePackDef nameGenerator = pawn.RaceProps.GetNameGenerator(pawn.gender); if (nameGenerator != null) { string name = NameGenerator.GenerateName(nameGenerator, (string x) => !new NameSingle(x, false).UsedThisGame, false); return(new NameSingle(name, false)); } if (pawn.Faction != null && pawn.Faction.def.pawnNameMaker != null) { string rawName = NameGenerator.GenerateName(pawn.Faction.def.pawnNameMaker, delegate(string x) { NameTriple nameTriple4 = NameTriple.FromString(x); nameTriple4.ResolveMissingPieces(forcedLastName); return(!nameTriple4.UsedThisGame); }, false); NameTriple nameTriple = NameTriple.FromString(rawName); nameTriple.CapitalizeNick(); nameTriple.ResolveMissingPieces(forcedLastName); return(nameTriple); } if (pawn.RaceProps.nameCategory != PawnNameCategory.NoName) { if (Rand.Value < 0.5) { NameTriple nameTriple2 = PawnBioAndNameGenerator.TryGetRandomUnusedSolidName(pawn.gender, forcedLastName); if (nameTriple2 != null) { return(nameTriple2); } } return((Name)GeneratePawnName_Shuffled.Invoke(null, new object[] { pawn, forcedLastName })); } Log.Error("No name making method for " + pawn); NameTriple nameTriple3 = NameTriple.FromString(pawn.def.label); nameTriple3.ResolveMissingPieces(null); return(nameTriple3); } else { if (style == NameStyle.Numeric) { int num = 1; string text; while (true) { text = pawn.KindLabel + " " + num.ToString(); if (!NameUseChecker.NameSingleIsUsed(text)) { break; } num++; } return(new NameSingle(text, true)); } throw new InvalidOperationException(); } }
public void RandomizeName() { Pawn sourcePawn = randomizer.GenerateSameKindAndGenderOfPawn(state.CurrentPawn); Name name = PawnBioAndNameGenerator.GeneratePawnName(sourcePawn, NameStyle.Full, null); NameTriple nameTriple = name as NameTriple; state.CurrentPawn.Name = nameTriple; }
public static void GiveBackstory(ref Pawn pawn) { FactionDef faction = pawn.Faction.def; Name Namebefore = pawn.Name; string LastName = pawn.Name.ToStringShort; PawnBioAndNameGenerator.GiveAppropriateBioAndNameTo(pawn, LastName, faction); pawn.Name = Namebefore; }
private static void GiveShuffledBioTo(Pawn pawn, FactionDef factionType, string requiredLastName, List <BackstoryCategoryFilter> backstoryCategories) { AM_PawnBioAndNameGenerator_GiveShuffledBioTo_AdultAge_Patch.FillBackstorySlotShuffled(pawn, BackstorySlot.Childhood, ref pawn.story.childhood, pawn.story.adulthood, backstoryCategories, factionType); if (pawn.ageTracker.AgeBiologicalYearsFloat >= pawn.RaceProps.lifeStageAges.First(x => x.def.reproductive).minAge) { AM_PawnBioAndNameGenerator_GiveShuffledBioTo_AdultAge_Patch.FillBackstorySlotShuffled(pawn, BackstorySlot.Adulthood, ref pawn.story.adulthood, pawn.story.childhood, backstoryCategories, factionType); } pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full, requiredLastName); }
public void RandomizeName(CustomPawn customPawn) { Pawn pawn = GenerateSameKindOfPawn(customPawn); pawn.gender = customPawn.Gender; Name name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full, null); NameTriple nameTriple = name as NameTriple; customPawn.Name = nameTriple; }
public static bool Prefix_GiveShuffledBioTo_Orkoid(Pawn pawn, FactionDef factionType, string requiredLastName, ref List <BackstoryCategoryFilter> backstoryCategories) { if (pawn == null) { return(true); } if (!pawn.RaceProps.Humanlike) { return(true); } if (pawn.ageTracker == null || pawn.health == null || pawn.story == null || pawn.RaceProps.FleshType != OGOrkThingDefOf.OG_Flesh_Orkoid) { return(true); } bool ext = pawn.kindDef.HasModExtension <BackstoryExtension>(); if (ext) { BackstoryCategoryFilter backstoryCategoryFilter = backstoryCategories.RandomElementByWeight((BackstoryCategoryFilter c) => c.commonality); backstoryCategories.Clear(); backstoryCategories.Add(backstoryCategoryFilter); // Log.Message(pawn.LabelShortCap + " BackstoryExtension using "+ backstoryCategoryFilter.categories.ToCommaList()); } else { // Log.Message(pawn.LabelShortCap + " No BackstoryExtension"); } if (pawn.health.hediffSet.hediffs.Any(x => x.def.defName.Contains("TM_") && (x.def.defName.Contains("Undead") || x.def.defName.Contains("Lich")))) { return(true); } if ((pawn.ageTracker.AgeBiologicalYears < 20 && (pawn.def.defName.StartsWith("OG_") || pawn.kindDef.defName.StartsWith("OG_"))) || ext) { // Log.Message(string.Format("AdMech mod pawn: {0} {1} {2}",pawn.NameShortColored, pawn.kindDef, pawn.def.modContentPack.PackageIdPlayerFacing)); bool act = pawn.RaceProps.lifeStageAges.Any(x => x.def.reproductive); if (act) { if (pawn.ageTracker.AgeBiologicalYears > pawn.RaceProps.lifeStageAges.First(x => x.def.reproductive).minAge) { FillBackstorySlotShuffled(pawn, BackstorySlot.Childhood, ref pawn.story.childhood, pawn.story.adulthood, backstoryCategories, factionType); if (pawn.ageTracker.AgeBiologicalYearsFloat >= pawn.RaceProps.lifeStageAges.First(x => x.def.reproductive).minAge) { FillBackstorySlotShuffled(pawn, BackstorySlot.Adulthood, ref pawn.story.adulthood, pawn.story.childhood, backstoryCategories, factionType); } pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full, requiredLastName); return(false); } } } return(true); }
public static void GiveShuffledBioTo_AdultAge_Postfix(Pawn pawn, FactionDef factionType, string requiredLastName, List <string> backstoryCategories) { // MethodInfo dynMethod = typeof(PawnBioAndNameGenerator).GetMethod("FillBackstorySlotShuffled", BindingFlags.NonPublic | BindingFlags.Instance); pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full, requiredLastName); AM_PawnBioAndNameGenerator_GiveShuffledBioTo_AdultAge_Patch.FillBackstorySlotShuffled(pawn, BackstorySlot.Childhood, ref pawn.story.childhood, backstoryCategories, factionType); // dynMethod.Invoke(typeof(PawnBioAndNameGenerator), new object[] { pawn, BackstorySlot.Childhood, pawn.story.childhood, backstoryCategories, factionType }); if (pawn.RaceProps.lifeStageAges.First(x => x.def.reproductive) != null) { // Log.Message(string.Format("Pawn: {0}, Comes of age at: {1}, Adult: {2}", pawn.LabelShortCap, pawn.RaceProps.lifeStageAges.First(x => x.def.reproductive).minAge, pawn.ageTracker.AgeBiologicalYearsFloat)); if (pawn.ageTracker.AgeBiologicalYearsFloat >= pawn.RaceProps.lifeStageAges.First(x => x.def.reproductive).minAge) { // Log.Message(string.Format("Adult")); AM_PawnBioAndNameGenerator_GiveShuffledBioTo_AdultAge_Patch.FillBackstorySlotShuffled(pawn, BackstorySlot.Adulthood, ref pawn.story.adulthood, backstoryCategories, factionType); // dynMethod.Invoke(typeof(PawnBioAndNameGenerator), new object[] { pawn, BackstorySlot.Adulthood, pawn.story.adulthood, backstoryCategories, factionType }); } } }
public static Pawn GeneratePawn(this Quest quest, PawnKindDef kindDef, Faction faction, bool allowAddictions = true, IEnumerable <TraitDef> forcedTraits = null, float biocodeWeaponChance = 0f, bool mustBeCapableOfViolence = true, Pawn extraPawnForExtraRelationChance = null, float relationWithExtraPawnChanceFactor = 0f, float biocodeApparelChance = 0f, bool ensureNonNumericName = false, bool forceGenerateNewPawn = false) { bool allowAddictions2 = allowAddictions; bool mustBeCapableOfViolence2 = mustBeCapableOfViolence; PawnGenerationRequest request = new PawnGenerationRequest(kindDef, faction, PawnGenerationContext.NonPlayer, -1, forceGenerateNewPawn, newborn: false, allowDead: false, allowDowned: false, canGeneratePawnRelations: true, mustBeCapableOfViolence2, 1f, forceAddFreeWarmLayerIfNeeded: false, allowGay: true, allowFood: true, allowAddictions2, inhabitant: false, certainlyBeenInCryptosleep: false, forceRedressWorldPawnIfFormerColonist: false, worldPawnFactionDoesntMatter: false, biocodeWeaponChance, extraPawnForExtraRelationChance, relationWithExtraPawnChanceFactor, null, null, forcedTraits); request.BiocodeApparelChance = biocodeApparelChance; Pawn pawn = PawnGenerator.GeneratePawn(request); if (ensureNonNumericName && (pawn.Name == null || pawn.Name.Numerical)) { pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn); } QuestGen.AddToGeneratedPawns(pawn); if (!pawn.IsWorldPawn()) { Find.WorldPawns.PassToWorld(pawn); } return(pawn); }
// Token: 0x06002241 RID: 8769 RVA: 0x00101EB8 File Offset: 0x001002B8 public override IEnumerable <Thing> PlayerStartingThings() { for (int i = 0; i < this.count; i++) { PawnKindDef kind; if (this.animalKind != null) { kind = this.animalKind; } else { kind = this.RandomPets().RandomElementByWeight((PawnKindDef td) => td.RaceProps.petness); } Pawn animal = PawnGenerator.GeneratePawn(kind, Faction.OfPlayer); if (animal.Name == null || animal.Name.Numerical) { animal.Name = PawnBioAndNameGenerator.GeneratePawnName(animal, NameStyle.Full, null); } Rand.PushState(); if (Rand.Value < this.bondToRandomPlayerPawnChance && animal.training.CanAssignToTrain(TrainableDefOf.Obedience).Accepted) { Pawn pawn = (from p in Find.GameInitData.startingAndOptionalPawns.Take(Find.GameInitData.startingPawnCount) where TrainableUtility.CanBeMaster(p, animal, false) && !p.story.traits.HasTrait(TraitDefOf.Psychopath) select p).RandomElementWithFallback(null); if (pawn != null) { animal.training.Train(TrainableDefOf.Obedience, null, true); animal.training.SetWantedRecursive(TrainableDefOf.Obedience, true); pawn.relations.AddDirectRelation(PawnRelationDefOf.Bond, animal); animal.playerSettings.Master = pawn; } } Rand.PopState(); if (gender != Gender.None) { animal.gender = gender; } yield return(animal); } yield break; }
private void CheckChangePawnKindName() { NameSingle nameSingle = this.pawn.Name as NameSingle; if (nameSingle != null && nameSingle.Numerical) { string kindLabel = this.pawn.KindLabel; if (!(nameSingle.NameWithoutNumber == kindLabel)) { int number = nameSingle.Number; string text = this.pawn.KindLabel + " " + number; if (!NameUseChecker.NameSingleIsUsed(text)) { this.pawn.Name = new NameSingle(text, true); } else { this.pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(this.pawn, NameStyle.Numeric, null); } } } }
private static void Postfix(ref Pawn __result, ref PawnGenerationRequest request) { RaceAddonComp racomp = null; if (__result.def is RaceAddonThingDef thingDef) { // get backstorydef SimpleBackstoryDef simpleBackstoryDef = null; foreach (var backstory in __result.story.AllBackstories) { if (DefDatabase <SimpleBackstoryDef> .AllDefsListForReading.Find(x => x.defName == backstory.identifier) is var def && def != null) { simpleBackstoryDef = def; } } // make default setting racomp = __result.GetComp <RaceAddonComp>(); float maleChance = (simpleBackstoryDef != null && simpleBackstoryDef.maleChance >= 0) ? simpleBackstoryDef.maleChance : thingDef.raceAddonSettings.basicSetting.maleChance; __result.gender = GetGender(maleChance, request.FixedGender); var gender = __result.gender; __result.Name = PawnBioAndNameGenerator.GeneratePawnName(__result, NameStyle.Full, request.FixedLastName); racomp.drawSize = RaceAddonTools.GetPawnDrawSize(__result, thingDef); var drawSize = thingDef.raceAddonSettings.graphicSetting.drawSize[racomp.drawSize]; AppearanceDef appearanceDef = null; var list = (simpleBackstoryDef != null && simpleBackstoryDef.raceAppearances != null) ? simpleBackstoryDef.raceAppearances : thingDef.raceAddonSettings.graphicSetting.raceAppearances; if (drawSize.apparanceOverwrite.FindAll(x => x.gender == Gender.None || x.gender == gender) is var list2 && list2.Count > 0) { appearanceDef = list2.RandomElementByWeight(x => x.weight).appearanceDef; } else if (list.FindAll(x => x.gender == Gender.None || x.gender == gender) is var list3 && list3.Count > 0) { appearanceDef = list3.RandomElementByWeight(x => x.weight).appearanceDef; }
private void CheckChangePawnKindName() { NameSingle nameSingle = pawn.Name as NameSingle; if (nameSingle == null || !nameSingle.Numerical) { return; } string kindLabel = pawn.KindLabel; if (!(nameSingle.NameWithoutNumber == kindLabel)) { int number = nameSingle.Number; string text = pawn.KindLabel + " " + number; if (!NameUseChecker.NameSingleIsUsed(text)) { pawn.Name = new NameSingle(text, numerical: true); } else { pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Numeric); } } }
public static bool RaceAddonGenerator(Pawn pawn, ref PawnGenerationRequest request) { if (pawn.def is RaceAddonThingDef thingDef) { FactionDef factionDef; if (request.Faction != null) { factionDef = request.Faction.def; } else if (Find.FactionManager.TryGetRandomNonColonyHumanlikeFaction_NewTemp(out Faction faction, false, true, TechLevel.Undefined)) { factionDef = faction.def; } else { factionDef = Faction.OfAncients.def; } // Race Addon Comp var racomp = pawn.GetComp <RaceAddonComp>(); // Backstory /* * if (request.Newborn && factionDef == Find.FactionManager.OfPlayer.def && thingDef.raceAddonSettings.ageSettings[0].ageBackstory != null) * { * pawn.story.childhood = thingDef.raceAddonSettings.ageSettings[0].ageBackstory.Backstory; * } */ GiveAppropriateBioAndNameTo.cachedNewborn = request.Newborn; PawnBioAndNameGenerator.GiveAppropriateBioAndNameTo(pawn, request.FixedLastName, factionDef); GiveAppropriateBioAndNameTo.cachedNewborn = false; SimpleBackstoryDef backstoryDef = null; foreach (var backstory in pawn.story.AllBackstories) { backstoryDef = backstory.GetDef(); if (backstoryDef != null) { // set age bool flag1 = false; bool flag2 = false; if (backstoryDef.bioAgeRange.Average >= 0) { request.FixedBiologicalAge = backstoryDef.bioAgeRange.RandomInRange; flag1 = true; } if (backstoryDef.chronoAgeRange.Average >= 0) { request.FixedChronologicalAge = flag1 ? request.FixedBiologicalAge + backstoryDef.chronoAgeRange.RandomInRange : pawn.ageTracker.AgeBiologicalYearsFloat + backstoryDef.chronoAgeRange.RandomInRange; flag2 = true; } if (flag1 || flag2) { AccessTools.Method(typeof(PawnGenerator), "GenerateRandomAge").Invoke(null, new object[] { pawn, request }); } // set gender if (backstoryDef.maleChance >= 0f) { pawn.gender = Rand.Chance(backstoryDef.maleChance) ? Gender.Male : Gender.Female; request.FixedGender = pawn.gender; } else { pawn.gender = Rand.Chance(thingDef.raceAddonSettings.basicSetting.maleChance) ? Gender.Male : Gender.Female; request.FixedGender = pawn.gender; } } } // Fix Name pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn, NameStyle.Full, request.FixedLastName); // Choose AppearanceDef AppearanceDef appearanceDef = null; if (backstoryDef?.appearances?.GetAppearanceDef(pawn) is var def && def != null) { appearanceDef = def; }
public static void Die(this Pawn me, StringBuilder message) { me.Name = PawnBioAndNameGenerator.GeneratePawnName(me); message.Append("Your pawn has been released. Someone else's problem now."); }
public static void Postfix(ref Pawn pawn, ref PawnGenerationRequest request) { if (pawn != null) { if (pawn.Faction != null && pawn.RaceProps.Humanlike) { if (pawn.story.childhood == null) { pawn.story.childhood = BackstoryDatabase.RandomBackstory(BackstorySlot.Childhood); PawnBioAndNameGenerator.GiveAppropriateBioAndNameTo(pawn, request.FixedLastName, pawn.Faction.def); if (pawn.story.adulthood == null) { pawn.story.adulthood = BackstoryDatabase.RandomBackstory(BackstorySlot.Adulthood); PawnBioAndNameGenerator.GiveAppropriateBioAndNameTo(pawn, request.FixedLastName, pawn.Faction.def); } // log.message(string.Format("reroll {0} : {1}({2}) : {3} : {4} : {5}", pawn.NameShortColored, pawn.KindLabel, pawn.kindDef.defName, pawn.story.childhood, pawn.story.adulthood, pawn.Faction)); } if (pawn.Faction.def.HasModExtension <FactionDefExtension>()) { if (pawn.Faction.def.GetModExtensionFast <FactionDefExtension>() is FactionDefExtension Forced && Forced != null) { if (pawn.RaceProps.Humanlike) { foreach (FactionTraitEntry item in Forced.ForcedTraits) { // log.message(string.Format("{0} : {1}", pawn.NameShortColored, item.def.LabelCap)); if (!pawn.story.traits.HasTrait(item.def)) { int maxTraits; if (MoreTraitSlotsUtil.TryGetMaxTraitSlots(out int max)) { maxTraits = max; } else { maxTraits = 4; } Rand.PushState(); bool act = Rand.Chance(item.Chance); Rand.PopState(); if (act) { if (pawn.story.traits.allTraits.Count >= maxTraits) { if (!item.replaceiffull) { return; } pawn.story.traits.allTraits.Remove(pawn.story.traits.allTraits.RandomElement()); } Trait trait = new Trait(item.def, item.degree); pawn.story.traits.GainTrait(trait); } } } } foreach (HediffGiverSetDef item in Forced.hediffGivers) { foreach (var hdg in item.hediffGivers.Where(x => x is HediffGiver_StartWithHediff)) { HediffGiver_StartWithHediff hediffGiver_StartWith = (HediffGiver_StartWithHediff)hdg; if (pawn.health.hediffSet.GetNotMissingParts().Any(x => hediffGiver_StartWith.partsToAffect.Contains(x.def))) { hediffGiver_StartWith.GiveHediff(pawn); } } } } } } } }
public static bool Reroll(Pawn pawn) { if (PawnFilter.RerollAlgorithm == PawnFilter.RerollAlgorithmOptions.Normal || randomRerollCounter == 0) { return(CheckPawnIsSatisfied(pawn)); } PawnGenerationRequest request = new PawnGenerationRequest( Faction.OfPlayer.def.basicMemberKind, Faction.OfPlayer, PawnGenerationContext.PlayerStarter, forceGenerateNewPawn: true, mustBeCapableOfViolence: TutorSystem.TutorialMode, colonistRelationChanceFactor: 20f); if (!CheckGenderIsSatisfied(pawn)) { randomRerollCounter++; return(false); } while (randomRerollCounter < PawnFilter.RerollLimit) { randomRerollCounter++; pawn.ageTracker = new Pawn_AgeTracker(pawn); randomAgeMethodInfo.Invoke(null, new object[] { pawn, request }); if (!CheckAgeIsSatisfied(pawn)) { continue; } pawn.story.traits = new TraitSet(pawn); pawn.skills = new Pawn_SkillTracker(pawn); PawnBioAndNameGenerator.GiveAppropriateBioAndNameTo(pawn, pawn.story.birthLastName, request.Faction.def, request.ForceNoBackstory); randomTraitMethodInfo.Invoke(null, new object[] { pawn, request }); randomSkillMethodInfo.Invoke(null, new object[] { pawn }); if (!CheckSkillsIsSatisfied(pawn) || !CheckTraitsIsSatisfied(pawn)) { continue; } for (int i = 0; i < 100; i++) { pawn.health.Reset(); try { // internally, this method only adds custom Scenario health (as of rimworld v1.3) Find.Scenario.Notify_NewPawnGenerating(pawn, request.Context); randomHealthMethodInfo.Invoke(null, new object[] { pawn, request }); if (!(pawn.Dead || pawn.Destroyed || pawn.Downed)) { //pawn.health.Reset(); continue; } } catch (Exception) { Find.WorldPawns.RemoveAndDiscardPawnViaGC(pawn); return(false); } } if (!CheckHealthIsSatisfied(pawn)) { continue; } pawn.workSettings.EnableAndInitialize(); if (!CheckWorkIsSatisfied(pawn)) { continue; } // Handle custom scenario Find.Scenario.Notify_PawnGenerated(pawn, request.Context, true); if (!CheckPawnIsSatisfied(pawn)) { continue; } // Generate Misc randomBodyTypeMethodInfo.Invoke(null, new object[] { pawn, request }); GeneratePawnStyle(pawn); return(true); } if (RandomRerollCounter() >= PawnFilter.RerollLimit) { return(true); } return(false); }
private static Pawn TryGenerateNewPawnInternal(ref PawnGenerationRequest request, out string error, bool ignoreScenarioRequirements, bool ignoreValidator) { error = null; Pawn pawn = (Pawn)ThingMaker.MakeThing(request.KindDef.race); pawnsBeingGenerated.Add(new PawnGenerationStatus(pawn, null)); 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; } GenerateRandomAge(pawn, request); pawn.needs.SetInitialLevels(); if (!request.Newborn && request.CanGeneratePawnRelations) { GeneratePawnRelations(pawn, ref request); } if (pawn.RaceProps.Humanlike) { Faction faction; FactionDef factionType = (request.Faction != null) ? request.Faction.def : ((!Find.FactionManager.TryGetRandomNonColonyHumanlikeFaction(out faction, tryMedievalOrBetter: false, allowDefeated: true)) ? Faction.OfAncients.def : faction.def); pawn.story.melanin = ((!request.FixedMelanin.HasValue) ? PawnSkinColors.RandomMelanin(request.Faction) : request.FixedMelanin.Value); pawn.story.crownType = ((Rand.Value < 0.5f) ? CrownType.Average : CrownType.Narrow); pawn.story.hairColor = PawnHairColors.RandomHairColor(pawn.story.SkinColor, pawn.ageTracker.AgeBiologicalYears); PawnBioAndNameGenerator.GiveAppropriateBioAndNameTo(pawn, request.FixedLastName, factionType); pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(pawn, factionType); GenerateTraits(pawn, request); GenerateBodyType(pawn); GenerateSkills(pawn); } if (pawn.RaceProps.Animal && request.Faction != null && request.Faction.IsPlayer) { pawn.training.SetWantedRecursive(TrainableDefOf.Tameness, checkOn: true); pawn.training.Train(TrainableDefOf.Tameness, null, complete: true); } GenerateInitialHediffs(pawn, request); if (pawn.workSettings != null && request.Faction != null && request.Faction.IsPlayer) { pawn.workSettings.EnableAndInitialize(); } if (request.Faction != null && pawn.RaceProps.Animal) { pawn.GenerateNecessaryName(); } if (Find.Scenario != null) { Find.Scenario.Notify_NewPawnGenerating(pawn, request.Context); } if (!request.AllowDead && (pawn.Dead || pawn.Destroyed)) { DiscardGeneratedPawn(pawn); error = "Generated dead pawn."; return(null); } if (!request.AllowDowned && pawn.Downed) { DiscardGeneratedPawn(pawn); error = "Generated downed pawn."; return(null); } if (request.MustBeCapableOfViolence && ((pawn.story != null && pawn.story.WorkTagIsDisabled(WorkTags.Violent)) || (pawn.RaceProps.ToolUser && !pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)))) { DiscardGeneratedPawn(pawn); error = "Generated pawn incapable of violence."; return(null); } if (!ignoreScenarioRequirements && request.Context == PawnGenerationContext.PlayerStarter && Find.Scenario != null && !Find.Scenario.AllowPlayerStartingPawn(pawn, tryingToRedress: false, request)) { DiscardGeneratedPawn(pawn); error = "Generated pawn doesn't meet scenario requirements."; return(null); } if (!ignoreValidator && request.ValidatorPreGear != null && !request.ValidatorPreGear(pawn)) { DiscardGeneratedPawn(pawn); error = "Generated pawn didn't pass validator check (pre-gear)."; return(null); } if (!request.Newborn) { GenerateGearFor(pawn, request); } if (!ignoreValidator && request.ValidatorPostGear != null && !request.ValidatorPostGear(pawn)) { DiscardGeneratedPawn(pawn); error = "Generated pawn didn't pass validator check (post-gear)."; return(null); } for (int i = 0; i < pawnsBeingGenerated.Count - 1; i++) { if (pawnsBeingGenerated[i].PawnsGeneratedInTheMeantime == null) { pawnsBeingGenerated[i] = new PawnGenerationStatus(pawnsBeingGenerated[i].Pawn, new List <Pawn>()); } pawnsBeingGenerated[i].PawnsGeneratedInTheMeantime.Add(pawn); } return(pawn); } finally { pawnsBeingGenerated.RemoveLast(); } }
private static Pawn TryGenerateNewNakedPawn(ref PawnGenerationRequest request, out string error, bool ignoreScenarioRequirements) { error = null; Pawn pawn = (Pawn)ThingMaker.MakeThing(request.KindDef.race, null); PawnGenerator.pawnsBeingGenerated.Add(new PawnGenerator.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; } PawnGenerator.GenerateRandomAge(pawn, request); pawn.needs.SetInitialLevels(); if (!request.Newborn && request.CanGeneratePawnRelations) { PawnGenerator.GeneratePawnRelations(pawn, ref request); } if (pawn.RaceProps.Humanlike) { pawn.story.melanin = ((!request.FixedMelanin.HasValue) ? PawnSkinColors.RandomMelanin(request.Faction) : request.FixedMelanin.Value); pawn.story.crownType = ((Rand.Value >= 0.5f) ? CrownType.Narrow : CrownType.Average); pawn.story.hairColor = PawnHairColors.RandomHairColor(pawn.story.SkinColor, pawn.ageTracker.AgeBiologicalYears); PawnBioAndNameGenerator.GiveAppropriateBioAndNameTo(pawn, request.FixedLastName); pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(pawn, request.Faction.def); PawnGenerator.GenerateTraits(pawn, request); PawnGenerator.GenerateBodyType(pawn); PawnGenerator.GenerateSkills(pawn); } PawnGenerator.GenerateInitialHediffs(pawn, request); 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)) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated dead pawn."; result = null; } else if (!request.AllowDowned && pawn.Downed) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated downed pawn."; result = null; } else if (request.MustBeCapableOfViolence && ((pawn.story != null && pawn.story.WorkTagIsDisabled(WorkTags.Violent)) || !pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn incapable of violence."; result = null; } else if (!ignoreScenarioRequirements && request.Context == PawnGenerationContext.PlayerStarter && !Find.Scenario.AllowPlayerStartingPawn(pawn)) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn doesn't meet scenario requirements."; result = null; } else if (request.Validator != null && !request.Validator(pawn)) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn didn't pass validator check."; result = null; } else { for (int i = 0; i < PawnGenerator.pawnsBeingGenerated.Count - 1; i++) { if (PawnGenerator.pawnsBeingGenerated[i].PawnsGeneratedInTheMeantime == null) { PawnGenerator.pawnsBeingGenerated[i] = new PawnGenerator.PawnGenerationStatus(PawnGenerator.pawnsBeingGenerated[i].Pawn, new List <Pawn>()); } PawnGenerator.pawnsBeingGenerated[i].PawnsGeneratedInTheMeantime.Add(pawn); } result = pawn; } } finally { PawnGenerator.pawnsBeingGenerated.RemoveLast <PawnGenerator.PawnGenerationStatus>(); } return(result); }
private static Pawn TryGenerateNewPawnInternal(ref PawnGenerationRequest request, out string error, bool ignoreScenarioRequirements, bool ignoreValidator) { error = null; Pawn pawn = (Pawn)ThingMaker.MakeThing(request.KindDef.race); pawnsBeingGenerated.Add(new PawnGenerationStatus(pawn, null)); 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; } GenerateRandomAge(pawn, request); pawn.needs.SetInitialLevels(); if (!request.Newborn && request.CanGeneratePawnRelations) { GeneratePawnRelations(pawn, ref request); } if (pawn.RaceProps.Humanlike) { Faction faction; FactionDef factionType = ((request.Faction != null) ? request.Faction.def : ((!Find.FactionManager.TryGetRandomNonColonyHumanlikeFaction_NewTemp(out faction, tryMedievalOrBetter: false, allowDefeated: true)) ? Faction.OfAncients.def : faction.def)); pawn.story.melanin = (request.FixedMelanin.HasValue ? request.FixedMelanin.Value : PawnSkinColors.RandomMelanin(request.Faction)); pawn.story.crownType = ((Rand.Value < 0.5f) ? CrownType.Average : CrownType.Narrow); pawn.story.hairColor = PawnHairColors.RandomHairColor(pawn.story.SkinColor, pawn.ageTracker.AgeBiologicalYears); PawnBioAndNameGenerator.GiveAppropriateBioAndNameTo(pawn, request.FixedLastName, factionType); if (pawn.story != null) { if (request.FixedBirthName != null) { pawn.story.birthLastName = request.FixedBirthName; } else if (pawn.Name is NameTriple) { pawn.story.birthLastName = ((NameTriple)pawn.Name).Last; } } pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(pawn, factionType); GenerateTraits(pawn, request); GenerateBodyType_NewTemp(pawn, request); GenerateSkills(pawn); } if (pawn.RaceProps.Animal && request.Faction != null && request.Faction.IsPlayer) { pawn.training.SetWantedRecursive(TrainableDefOf.Tameness, checkOn: true); pawn.training.Train(TrainableDefOf.Tameness, null, complete: true); } GenerateInitialHediffs(pawn, request); if (!request.ForbidAnyTitle) { RoyalTitleDef royalTitleDef = request.FixedTitle; if (royalTitleDef == null) { if (request.KindDef.titleRequired != null) { royalTitleDef = request.KindDef.titleRequired; } else if (!request.KindDef.titleSelectOne.NullOrEmpty() && Rand.Chance(request.KindDef.royalTitleChance)) { royalTitleDef = request.KindDef.titleSelectOne.RandomElementByWeight((RoyalTitleDef t) => t.commonality); } } if (request.KindDef.minTitleRequired != null && (royalTitleDef == null || royalTitleDef.seniority < request.KindDef.minTitleRequired.seniority)) { royalTitleDef = request.KindDef.minTitleRequired; } if (royalTitleDef != null) { Faction faction2 = ((request.Faction != null && request.Faction.def.HasRoyalTitles) ? request.Faction : Find.FactionManager.RandomRoyalFaction()); pawn.royalty.SetTitle(faction2, royalTitleDef, grantRewards: false); if (request.Faction != null && !request.Faction.IsPlayer) { PurchasePermits(pawn, faction2); } int amount = 0; if (royalTitleDef.GetNextTitle(faction2) != null) { amount = Rand.Range(0, royalTitleDef.GetNextTitle(faction2).favorCost - 1); } pawn.royalty.SetFavor_NewTemp(faction2, amount); if (royalTitleDef.maxPsylinkLevel > 0) { Hediff_ImplantWithLevel hediff_ImplantWithLevel = HediffMaker.MakeHediff(HediffDefOf.PsychicAmplifier, pawn, pawn.health.hediffSet.GetBrain()) as Hediff_ImplantWithLevel; pawn.health.AddHediff(hediff_ImplantWithLevel); hediff_ImplantWithLevel.SetLevelTo(royalTitleDef.maxPsylinkLevel); } } } if (pawn.royalty != null) { pawn.royalty.allowRoomRequirements = request.KindDef.allowRoyalRoomRequirements; pawn.royalty.allowApparelRequirements = request.KindDef.allowRoyalApparelRequirements; } if (pawn.workSettings != null && request.Faction != null && request.Faction.IsPlayer) { pawn.workSettings.EnableAndInitialize(); } if (request.Faction != null && pawn.RaceProps.Animal) { pawn.GenerateNecessaryName(); } if (Find.Scenario != null) { Find.Scenario.Notify_NewPawnGenerating(pawn, request.Context); } if (!request.AllowDead && (pawn.Dead || pawn.Destroyed)) { DiscardGeneratedPawn(pawn); error = "Generated dead pawn."; return(null); } if (!request.AllowDowned && pawn.Downed) { DiscardGeneratedPawn(pawn); error = "Generated downed pawn."; return(null); } if (request.MustBeCapableOfViolence && ((pawn.story != null && pawn.WorkTagIsDisabled(WorkTags.Violent)) || (pawn.RaceProps.ToolUser && !pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)))) { DiscardGeneratedPawn(pawn); error = "Generated pawn incapable of violence."; return(null); } if (request.KindDef != null && !request.KindDef.skills.NullOrEmpty()) { List <SkillRange> skills = request.KindDef.skills; for (int i = 0; i < skills.Count; i++) { if (pawn.skills.GetSkill(skills[i].Skill).TotallyDisabled) { error = "Generated pawn incapable of required skill: " + skills[i].Skill.defName; return(null); } } } if (request.KindDef.requiredWorkTags != 0 && (pawn.CombinedDisabledWorkTags & request.KindDef.requiredWorkTags) != 0) { DiscardGeneratedPawn(pawn); error = "Generated pawn with disabled requiredWorkTags."; return(null); } if (!ignoreScenarioRequirements && request.Context == PawnGenerationContext.PlayerStarter && Find.Scenario != null && !Find.Scenario.AllowPlayerStartingPawn(pawn, tryingToRedress: false, request)) { DiscardGeneratedPawn(pawn); error = "Generated pawn doesn't meet scenario requirements."; return(null); } if (!ignoreValidator && request.ValidatorPreGear != null && !request.ValidatorPreGear(pawn)) { DiscardGeneratedPawn(pawn); error = "Generated pawn didn't pass validator check (pre-gear)."; return(null); } if (!request.Newborn) { GenerateGearFor(pawn, request); } if (!ignoreValidator && request.ValidatorPostGear != null && !request.ValidatorPostGear(pawn)) { DiscardGeneratedPawn(pawn); error = "Generated pawn didn't pass validator check (post-gear)."; return(null); } for (int j = 0; j < pawnsBeingGenerated.Count - 1; j++) { if (pawnsBeingGenerated[j].PawnsGeneratedInTheMeantime == null) { pawnsBeingGenerated[j] = new PawnGenerationStatus(pawnsBeingGenerated[j].Pawn, new List <Pawn>()); } pawnsBeingGenerated[j].PawnsGeneratedInTheMeantime.Add(pawn); } return(pawn); } finally { pawnsBeingGenerated.RemoveLast(); } }