public override void TryExecute() { if (pawn.gender == Gender.Female) { pawn.gender = Gender.Male; } else { pawn.gender = Gender.Female; } pawn.story.hairColor = PawnHairColors.RandomHairColor(pawn.story.SkinColor, pawn.ageTracker.AgeBiologicalYears); pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(pawn, FactionDefOf.PlayerColony); if (pawn.story.adulthood != null) { pawn.story.bodyType = pawn.story.adulthood.BodyTypeFor(pawn.gender); } else if (Rand.Value < 0.5f) { pawn.story.bodyType = BodyTypeDefOf.Thin; } else { pawn.story.bodyType = ((pawn.gender != Gender.Female) ? BodyTypeDefOf.Male : BodyTypeDefOf.Female); } viewer.TakeViewerCoins(storeIncident.cost); viewer.CalculateNewKarma(storeIncident.karmaType, storeIncident.cost); VariablesHelpers.SendPurchaseMessage($"@{viewer.username} has just swapped genders to " + pawn.gender.GetLabel() + ".", separateChannel); string text = $"{viewer.username} has just swapped genders to " + pawn.gender.GetLabel() + "."; Current.Game.letterStack.ReceiveLetter("GenderSwap", text, LetterDefOf.PositiveEvent, pawn); }
private static void FixHair(Pawn pawn) { int tries = 100; while (!pawn.story.hairDef.hairTags.Any(h => h == "Rural" || h == "Urban") || pawn.story.hairDef.hairGender != HairGender.Female) { pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(pawn, FactionDef.Named("Spacer")); tries--; if (tries <= 0) { Log.Error("Couldn't get backstory."); break; } } }
// ReSharper disable once UnusedParameter.Local public GameComponent_FacialStuff(Game game) { // Kill the damn beards - xml patching not reliable enough. for (int i = 0; i < DefDatabase <HairDef> .AllDefsListForReading.Count; i++) { HairDef hairDef = DefDatabase <HairDef> .AllDefsListForReading[i]; CheckReplaceHairTexPath(hairDef); if (Controller.settings.UseCaching) { string name = Path.GetFileNameWithoutExtension(hairDef.texPath); CutHairDB.ExportHairCut(hairDef, name); } } // Fix for VHE hair on existing pawns. foreach (Pawn pawn in PawnsFinder.AllMaps.FindAll(x => x.kindDef?.RaceProps != null && x.kindDef.RaceProps.Humanlike == true).Where(pawn => pawn.story?.hairDef != null && pawn.story.hairDef.IsBeardNotHair())) { PawnHairChooser.RandomHairDefFor(pawn, pawn.Faction.def); } this.WeaponCompsNew(); // todo: use BodyDef instead, target for kickstarting? this.AnimalPawnCompsBodyDefImport(); this.AnimalPawnCompsImportFromAnimationTargetDefs(); Controller.SetMainButtons(); // BuildWalkCycles(); // foreach (BodyAnimDef def in DefDatabase<BodyAnimDef>.AllDefsListForReading) // { // if (def.walkCycles.Count == 0) // { // var length = Enum.GetNames(typeof(LocomotionUrgency)).Length; // for (int index = 0; index < length; index++) // { // WalkCycleDef cycleDef = new WalkCycleDef(); // cycleDef.defName = def.defName + "_cycle"; // def.walkCycles.Add(index, cycleDef); // } // } // } }
public void RerollAndUpdateTexture() { _pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(_pawn, null); _pawn.story.hairColor = Color.white; FaceVariantIndex = _pawn.SetFaceBodyAddonRandomly(); if (FaceVariantIndex < 0) { Log.Error("Something wrong since face variant index is not valid."); FaceVariantIndex = 0; _pawn.SetFaceBodyAddonVariant(0); } _pawn.Drawer.renderer.graphics.ResolveAllGraphics(); PortraitsCache.SetDirty(_pawn); Texture = null; Texture = PortraitsCache.Get(_pawn, new Vector2(92f, 128f)); }
private void TransformPawn(bool changeDef = true, bool keep = false) { //sets position, faction and map IntVec3 intv = Pawn.Position; Faction faction = Pawn.Faction; Map map = Pawn.Map; RegionListersUpdater.DeregisterInRegions(Pawn, map); //Change Race to Props.raceDef if (changeDef && alienRace != null && alienRace != Pawn.def) { Pawn.def = alienRace; long ageB = Pawn.ageTracker.AgeBiologicalTicks; long ageC = Pawn.ageTracker.AgeChronologicalTicks; Pawn.ageTracker = new Pawn_AgeTracker(Pawn); Pawn.ageTracker.AgeBiologicalTicks = ageB; Pawn.ageTracker.AgeChronologicalTicks = ageC; if (!Pawn.RaceProps.hasGenders) { Pawn.gender = Gender.None; } if (Props.removeHair) { // Pawn.story.hairDef = DefDatabase<HairDef>.GetNamed("Shaved", true); Pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(Pawn, noHairFaction); // Pawn.Drawer.renderer.graphics.hairGraphic; } else { if (Props.colourHairTwo || Props.colourHair) { if (compAlien != null) { ColorChannelGenerator Alienhair = alienRace.alienRace.generalSettings.alienPartGenerator.colorChannels.Find(x => x.name == "hair"); AlienPartGenerator.ExposableValueTuple <UnityEngine.Color, UnityEngine.Color> hair; if (compAlien.ColorChannels.TryGetValue("hair", out hair)) { if (Props.colourHair && Alienhair?.first != null) { hair.first = Alienhair.first.NewRandomizedColor(); } if (Props.colourHairTwo && Alienhair?.second != null) { hair.second = Alienhair.second.NewRandomizedColor(); } compAlien.ColorChannels.SetOrAdd("hair", hair); } Pawn.Notify_ColorChanged(); } } } //Change BodyType to Props.bodyTypeDef if (Props.changeBody) { if (Props.bodyTypeDef != null) { ChangeBodyType(Pawn, Props.bodyTypeDef); } else { ChangeBodyType(Pawn, alienRace.alienRace.generalSettings.alienPartGenerator.alienbodytypes[Rand.Range(0, alienRace.alienRace.generalSettings.alienPartGenerator.alienbodytypes.Count)]); } } } //Remove Disallowed Traits int maxTraits; if (MoreTraitSlotsUtil.TryGetMaxTraitSlots(out int max)) { maxTraits = max; } else { maxTraits = 4; } if (!Props.traitsToRemove.NullOrEmpty()) { if (Pawn.story.traits.allTraits.Any(x => Props.traitsToRemove.Any(y => y.def == x.def))) { foreach (ExtendedTraitEntry item in Props.traitsToRemove) { if (Pawn.story.traits.HasTrait(item.def)) { Rand.PushState(); if (Rand.Chance(item.Chance)) { Pawn.story.traits.allTraits.Remove(Pawn.story.traits.allTraits.Find(x => x.def == item.def)); } Rand.PopState(); } } } } if (!Props.traitsToAdd.NullOrEmpty()) { if (Props.traitsToAdd.Any(x => !Pawn.story.traits.HasTrait(x.def))) { foreach (ExtendedTraitEntry item in Props.traitsToAdd) { if (!Pawn.story.traits.HasTrait(item.def)) { Rand.PushState(); if (Rand.Chance(item.Chance)) { bool replace = false; int countTraits = Pawn.story.traits.allTraits.Count; if (countTraits >= maxTraits) { replace = true; } // Log.Message(string.Format("i have {0} of a max of {1} traits", countTraits, maxTraits)); Trait replacedTrait = Pawn.story.traits.allTraits.Where(x => Props.traitsToAdd.Any(y => y.def != x.def)).RandomElement(); if (replace) { Pawn.story.traits.allTraits.Remove(replacedTrait); } Pawn.story.traits.allTraits.Add(new Trait(item.def, item.degree)); } Rand.PopState(); } } } } RegionListersUpdater.RegisterInRegions(Pawn, map); map.mapPawns.UpdateRegistryForPawn(Pawn); //decache graphics Pawn.Drawer.renderer.graphics.ResolveAllGraphics(); Find.ColonistBar.drawer.Notify_RecachedEntries(); //save the pawn Pawn.ExposeData(); if (Pawn.Faction != faction) { Pawn.SetFaction(faction); } // pawn.Position = intv; }
private void TransformPawn(bool changeDef = true, bool keep = false) { //sets position, faction and map IntVec3 intv = parent.pawn.Position; Faction faction = parent.pawn.Faction; Map map = parent.pawn.Map; RegionListersUpdater.DeregisterInRegions(parent.pawn, map); //Change Race to Props.raceDef var thingDef = Props.raceDef ?? null; if (changeDef && thingDef != null && thingDef != parent.pawn.def) { parent.pawn.def = thingDef; long ageB = Pawn.ageTracker.AgeBiologicalTicks; long ageC = Pawn.ageTracker.AgeChronologicalTicks; Pawn.ageTracker = new Pawn_AgeTracker(Pawn); Pawn.ageTracker.AgeBiologicalTicks = ageB; Pawn.ageTracker.AgeChronologicalTicks = ageC; AlienRace.ThingDef_AlienRace alienRace = (AlienRace.ThingDef_AlienRace)thingDef; AlienRace.AlienPartGenerator.AlienComp alien = parent.pawn.TryGetComp <AlienRace.AlienPartGenerator.AlienComp>(); if (Props.colourSkinTwo || Props.colourSkin) { if (Props.colourSkin) { if (alien != null) { alien.skinColor = alienRace.alienRace.generalSettings.alienPartGenerator.SkinColor(parent.pawn); } } if (Props.colourSkinTwo) { if (alien != null) { alien.skinColorSecond = alienRace.alienRace.generalSettings.alienPartGenerator.SkinColor(parent.pawn, false); } } parent.pawn.Notify_ColorChanged(); } if (Props.removeHair) { parent.pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(Pawn, noHairFaction); } else { if (Props.colourHairTwo || Props.colourHair) { if (Props.colourHair) { if (alien != null) { Pawn.story.hairColor = alienRace.alienRace.generalSettings.alienPartGenerator.alienhaircolorgen.NewRandomizedColor();; } } if (Props.colourHairTwo) { if (alien != null) { alien.hairColorSecond = alienRace.alienRace.generalSettings.alienPartGenerator.alienhaircolorgen.NewRandomizedColor(); } } parent.pawn.Notify_ColorChanged(); } } string head = alienRace.alienRace.graphicPaths.GetCurrentGraphicPath(Pawn.ageTracker.CurLifeStageRace.def).head; Traverse.Create(Pawn.story).Field("headGraphicPath").SetValue(alienRace.alienRace.generalSettings.alienPartGenerator.RandomAlienHead(head, Pawn)); } //Remove Disallowed Traits int maxTraits; if (MoreTraitSlotsUtil.TryGetMaxTraitSlots(out int max)) { maxTraits = max; } else { maxTraits = 4; } if (parent.pawn.story.traits.allTraits.Any(x => Props.traitsToRemove.Any(y => y.def == x.def))) { foreach (ExtendedTraitEntry item in Props.traitsToRemove) { if (parent.pawn.story.traits.HasTrait(item.def)) { Rand.PushState(); if (Rand.Chance(item.Chance)) { parent.pawn.story.traits.allTraits.Remove(parent.pawn.story.traits.allTraits.Find(x => x.def == item.def)); } Rand.PopState(); } } } if (Props.traitsToAdd.Any(x => !parent.pawn.story.traits.HasTrait(x.def))) { foreach (ExtendedTraitEntry item in Props.traitsToAdd) { if (!parent.pawn.story.traits.HasTrait(item.def)) { Rand.PushState(); if (Rand.Chance(item.Chance)) { bool replace = false; int countTraits = parent.pawn.story.traits.allTraits.Count; if (countTraits >= maxTraits) { replace = true; } // Log.Message(string.Format("i have {0} of a max of {1} traits", countTraits, maxTraits)); Trait replacedTrait = parent.pawn.story.traits.allTraits.Where(x => Props.traitsToAdd.Any(y => y.def != x.def)).RandomElement(); if (replace) { parent.pawn.story.traits.allTraits.Remove(replacedTrait); } parent.pawn.story.traits.allTraits.Add(new Trait(item.def, item.degree)); } Rand.PopState(); } } } RegionListersUpdater.RegisterInRegions(parent.pawn, map); map.mapPawns.UpdateRegistryForPawn(parent.pawn); //Change BodyType to Props.bodyTypeDef if (!Pawn.RaceProps.hasGenders) { Pawn.gender = Gender.None; } if (Props.bodyTypeDef != null) { ChangeBodyType(parent.pawn, Props.bodyTypeDef); } //decache graphics parent.pawn.Drawer.renderer.graphics.ResolveAllGraphics(); Find.ColonistBar.drawer.Notify_RecachedEntries(); //save the pawn parent.pawn.ExposeData(); if (parent.pawn.Faction != faction) { parent.pawn.SetFaction(faction); } // pawn.Position = intv; }
//Patch for Caravan/Worldmap death //TBF //Patch death messages //TBF //Change Appearance, Traits and memories of pawns static void Regenerate(Pawn __instance) { // Health State Changes ---------------------------------------------------------------------------------------------------------- //Resurrect the __instance ResurrectionUtility.Resurrect(__instance); //Remove all bad hediffs foreach (Hediff h in __instance.health.hediffSet.GetHediffs <Hediff>()) { if (h.def.isBad) { __instance.health.RemoveHediff(h); } } //Add resurrection sickness __instance.health.AddHediff(HediffDef.Named("ResurrectionSickness")); //Remove current RegenHediff and add the next BodyPartRecord heart = __instance.health.hediffSet.GetNotMissingParts().First(bpr => bpr.def == BodyPartDefOf.Heart); HediffDef Regen1Def = HediffDef.Named("Regeneration01"); HediffDef Regen2Def = HediffDef.Named("Regeneration02"); HediffDef Regen3Def = HediffDef.Named("Regeneration03"); HediffDef Regen4Def = HediffDef.Named("Regeneration04"); HediffDef Regen5Def = HediffDef.Named("Regeneration05"); HediffDef Regen6Def = HediffDef.Named("Regeneration06"); HediffDef Regen7Def = HediffDef.Named("Regeneration07"); HediffDef Regen8Def = HediffDef.Named("Regeneration08"); HediffDef Regen9Def = HediffDef.Named("Regeneration09"); HediffDef Regen10Def = HediffDef.Named("Regeneration10"); HediffDef Regen11Def = HediffDef.Named("Regeneration11"); HediffDef Regen12Def = HediffDef.Named("Regeneration12"); HediffDef Regen13Def = HediffDef.Named("Regeneration13"); if (__instance.health.hediffSet.HasHediff(Regen1Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen1Def)); __instance.health.AddHediff(Regen2Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen2Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen2Def)); __instance.health.AddHediff(Regen3Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen3Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen3Def)); __instance.health.AddHediff(Regen4Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen4Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen4Def)); __instance.health.AddHediff(Regen5Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen5Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen5Def)); __instance.health.AddHediff(Regen6Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen6Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen6Def)); __instance.health.AddHediff(Regen7Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen7Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen7Def)); __instance.health.AddHediff(Regen8Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen8Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen8Def)); __instance.health.AddHediff(Regen9Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen9Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen9Def)); __instance.health.AddHediff(Regen10Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen10Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen10Def)); __instance.health.AddHediff(Regen11Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen11Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen11Def)); __instance.health.AddHediff(Regen12Def, heart); } else if (__instance.health.hediffSet.HasHediff(Regen12Def)) { __instance.health.RemoveHediff(__instance.health.hediffSet.GetFirstHediffOfDef(Regen12Def)); __instance.health.AddHediff(Regen13Def, heart); } // Visual Changes ---------------------------------------------------------------------------------------------------------- //Gender __instance.gender = GenderSwap(__instance.gender); //Skintone __instance.story.melanin = 0.01f * Rand.Range(10, 200); //Head var graphicPath = GraphicDatabaseHeadRecords.GetHeadRandom(__instance.gender, __instance.story.SkinColor, __instance.story.crownType).GraphicPath; Traverse.Create(__instance.story).Field("headGraphicPath").SetValue(graphicPath); //Hair __instance.story.hairDef = PawnHairChooser.RandomHairDefFor(__instance, FactionDefOf.PlayerColony); __instance.story.hairColor = HairColor(); //Body __instance.story.bodyType = BodySwap(__instance.gender); //Redraw the __instance to trigger the above affects __instance.Drawer.renderer.graphics.nakedGraphic = null; // Bio Changes ---------------------------------------------------------------------------------------------------------- //randomise traits __instance.story.traits.allTraits.Clear(); int i = 0; int rInt = Rand.RangeInclusive(1, 3); while (i < rInt) { TraitDef random = DefDatabase <TraitDef> .GetRandom(); Trait trait = new Trait(random, PawnGenerator.RandomTraitDegree(random), false); __instance.story.traits.GainTrait(trait); Trait trait2 = new Trait(random, PawnGenerator.RandomTraitDegree(random), false); __instance.story.traits.GainTrait(trait2); i++; } //Add Memory __instance.needs.mood.thoughts.memories.TryGainMemory(RegenerationThoughtDefs.RecentlyRegenerated, null); //Add debuff thought to all related colonists foreach (Pawn p in __instance.relations.RelatedPawns) { //Log.Warning("related to: " + p.Name); try { if (!p.health.Dead) { p.needs.mood.thoughts.memories.TryGainMemory(RegenerationThoughtDefs.KnownColonistRegeneratedSocial, __instance); p.needs.mood.thoughts.memories.TryGainMemory(RegenerationThoughtDefs.KnownColonistRegenerated); } } catch { Log.Warning("Couldn't add social debuff to " + p.Name); } } // Visual effects ------------------------------------------------------------------------------------------------------- //Glow effect (ugly approach, look at cleaning this up) MoteMaker.ThrowAirPuffUp(__instance.DrawPos, __instance.Map); MoteMaker.ThrowFireGlow(__instance.Position, __instance.Map, 3f); MoteMaker.ThrowFireGlow(__instance.Position, __instance.Map, 3f); MoteMaker.ThrowFireGlow(__instance.Position, __instance.Map, 3f); MoteMaker.ThrowFireGlow(__instance.Position, __instance.Map, 3f); MoteMaker.ThrowFireGlow(__instance.Position, __instance.Map, 3f); }
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); }
public static Pawn MakePawnFromGenomeSequence(GenomeSequence genomeSequence, Thing creator) { //int adultAge = (int)genome.pawnKindDef.RaceProps.lifeStageAges.Last().minAge; QEEMod.TryLog("Generating pawn..."); PawnGenerationRequest request = new PawnGenerationRequest( genomeSequence.pawnKindDef, faction: creator.Faction, forceGenerateNewPawn: true, canGeneratePawnRelations: false, fixedGender: genomeSequence.gender, fixedBiologicalAge: 0, fixedChronologicalAge: 0, allowFood: false); Pawn pawn = PawnGenerator.GeneratePawn(request); //No pregenerated equipment. pawn?.equipment?.DestroyAllEquipment(); pawn?.apparel?.DestroyAll(); pawn?.inventory?.DestroyAll(); //No pregenerated hediffs. pawn.health.hediffSet.Clear(); //Add Hediff marking them as a clone. QEEMod.TryLog("Adding hediffs to generated pawn"); pawn.health.AddHediff(QEHediffDefOf.QE_CloneStatus); if (genomeSequence.hediffInfos != null && genomeSequence.hediffInfos.Count > 0) { //add hediffs to pawn from defs in HediffInfo class foreach (HediffInfo h in genomeSequence.hediffInfos) { pawn.health.AddHediff(h.def, h.part); } } //Set everything else. if (pawn.story is Pawn_StoryTracker storyTracker) { QEEMod.TryLog("Setting Pawn_StoryTracker attributes for generated pawn..."); storyTracker.bodyType = genomeSequence.bodyType; //sanity check to remove possibility of an Undefined crownType if (genomeSequence.crownType == CrownType.Undefined) { storyTracker.crownType = CrownType.Average; } else { storyTracker.crownType = genomeSequence.crownType; } storyTracker.hairColor = genomeSequence.hairColor; storyTracker.hairDef = genomeSequence.hair ?? PawnHairChooser.RandomHairDefFor(pawn, pawn.Faction.def); storyTracker.melanin = genomeSequence.skinMelanin; //headGraphicPath is private, so we need Harmony to set its value if (genomeSequence.headGraphicPath != null) { QEEMod.TryLog("Setting headGraphicPath for generated pawn"); AccessTools.Field(typeof(Pawn_StoryTracker), "headGraphicPath").SetValue(storyTracker, genomeSequence.headGraphicPath); } else { //could use this code to make a random head, instead of the static graphic paths. //AccessTools.Field(typeof(Pawn_StoryTracker), "headGraphicPath").SetValue(storyTracker, //GraphicDatabaseHeadRecords.GetHeadRandom(genomeSequence.gender, PawnSkinColors.GetSkinColor(genomeSequence.skinMelanin), genomeSequence.crownType).GraphicPath); QEEMod.TryLog("No headGraphicPath in genome template, setting to default head"); string path = genomeSequence.gender == Gender.Male ? "Things/Pawn/Humanlike/Heads/Male/Male_Average_Normal" : "Things/Pawn/Humanlike/Heads/Female/Female_Narrow_Normal"; AccessTools.Field(typeof(Pawn_StoryTracker), "headGraphicPath").SetValue(storyTracker, path); } storyTracker.traits.allTraits.Clear(); QEEMod.TryLog("Setting traits for generated pawn"); foreach (ExposedTraitEntry trait in genomeSequence.traits) { //storyTracker.traits.GainTrait(new Trait(trait.def, trait.degree)); storyTracker.traits.allTraits.Add(new Trait(trait.def, trait.degree)); if (pawn.workSettings != null) { pawn.workSettings.Notify_DisabledWorkTypesChanged(); } if (pawn.skills != null) { pawn.skills.Notify_SkillDisablesChanged(); } if (!pawn.Dead && pawn.RaceProps.Humanlike) { pawn.needs.mood.thoughts.situational.Notify_SituationalThoughtsDirty(); } } QEEMod.TryLog("Setting backstory for generated pawn"); //Give random vatgrown backstory. storyTracker.childhood = DefDatabase <BackstoryDef> .GetNamed("Backstory_ColonyVatgrown").GetFromDatabase(); storyTracker.adulthood = null; } if (pawn.skills is Pawn_SkillTracker skillsTracker) { foreach (SkillRecord skill in skillsTracker.skills) { skill.Level = 0; skill.passion = Passion.None; skill.Notify_SkillDisablesChanged(); } List <SkillRecord> skillPassions = new List <SkillRecord>(); int skillsPicked = 0; int iterations = 0; //Pick 4 random skills to give minor passions to. while (skillsPicked < 4 && iterations < 1000) { SkillRecord randomSkill = skillsTracker.skills.RandomElement(); if (!skillPassions.Contains(randomSkill)) { skillPassions.Add(randomSkill); randomSkill.passion = Passion.Minor; skillsPicked++; } iterations++; } skillsPicked = 0; iterations = 0; //Pick 2 random skills to give major passions to. while (skillsPicked < 2 && iterations < 1000) { SkillRecord randomSkill = skillsTracker.skills.RandomElement(); if (!skillPassions.Contains(randomSkill)) { skillPassions.Add(randomSkill); randomSkill.passion = Passion.Major; skillsPicked++; } iterations++; } } if (pawn.workSettings is Pawn_WorkSettings workSettings) { workSettings.EnableAndInitialize(); } //Alien Races compatibility. if (CompatibilityTracker.AlienRacesActive) { AlienRaceCompat.SetFieldsToAlienComp(pawn, genomeSequence); } PortraitsCache.SetDirty(pawn); PortraitsCache.PortraitsCacheUpdate(); return(pawn); }
public static Zombie GeneratePawn() { var zombie = (Zombie)ThingMaker.MakeThing(ZombieDefOf.Zombie.race, null); zombie.gender = Rand.Bool ? Gender.Male : Gender.Female; zombie.kindDef = ZombieDefOf.Zombie; zombie.SetFactionDirect(FactionUtility.DefaultFactionFrom(ZombieDefOf.Zombies)); PawnComponentsUtility.CreateInitialComponents(zombie); zombie.health.hediffSet.Clear(); zombie.ageTracker.AgeBiologicalTicks = ((long)(Rand.Range(0, 0x9c4 + 1) * 3600000f)) + Rand.Range(0, 0x36ee80); zombie.ageTracker.AgeChronologicalTicks = zombie.ageTracker.AgeBiologicalTicks; zombie.ageTracker.BirthAbsTicks = GenTicks.TicksAbs - zombie.ageTracker.AgeBiologicalTicks; var idx = zombie.ageTracker.CurLifeStageIndex; // trigger calculations zombie.needs.SetInitialLevels(); zombie.needs.mood = new Need_Mood(zombie); var name = PawnNameDatabaseSolid.GetListForGender((zombie.gender == Gender.Female) ? GenderPossibility.Female : GenderPossibility.Male).RandomElement(); var n1 = name.First.Replace('s', 'z').Replace('S', 'Z'); var n2 = name.Last.Replace('s', 'z').Replace('S', 'Z'); var n3 = name.Nick.Replace('s', 'z').Replace('S', 'Z'); zombie.Name = new NameTriple(n1, n3, n2); // faster: use MinimalBackstory() zombie.story.childhood = BackstoryDatabase.allBackstories .Where(kvp => kvp.Value.slot == BackstorySlot.Childhood) .RandomElement().Value; if (zombie.ageTracker.AgeBiologicalYearsFloat >= 20f) { zombie.story.adulthood = BackstoryDatabase.allBackstories .Where(kvp => kvp.Value.slot == BackstorySlot.Adulthood) .RandomElement().Value; } zombie.story.melanin = 0.01f * Rand.Range(10, 91); zombie.story.crownType = Rand.Bool ? CrownType.Average : CrownType.Narrow; zombie.story.hairColor = HairColor(); zombie.story.hairDef = PawnHairChooser.RandomHairDefFor(zombie, ZombieDefOf.Zombies); zombie.story.bodyType = (zombie.gender == Gender.Female) ? BodyType.Female : BodyType.Male; if (zombie.story.bodyType == BodyType.Male) { switch (Rand.Range(1, 6)) { case 1: zombie.story.bodyType = BodyType.Thin; break; case 2: zombie.story.bodyType = BodyType.Fat; break; case 3: zombie.story.bodyType = BodyType.Hulk; break; } } if (ZombieSettings.Values.useCustomTextures) { AssignNewCustomGraphics(zombie); } zombie.Drawer.leaner = new ZombieLeaner(zombie); Traverse.Create(zombie.pather).Field("destination").SetValue(IntVec3.Invalid); return(zombie); }
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 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.5) { 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 = (CrownType)((Rand.Value < 0.5) ? 1 : 2); 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."; return(null); } if (!request.AllowDowned && pawn.Downed) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated downed pawn."; return(null); } if (request.MustBeCapableOfViolence) { if (pawn.story != null && pawn.story.WorkTagIsDisabled(WorkTags.Violent)) { goto IL_02b0; } if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)) { goto IL_02b0; } } if (!ignoreScenarioRequirements && request.Context == PawnGenerationContext.PlayerStarter && !Find.Scenario.AllowPlayerStartingPawn(pawn)) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn doesn't meet scenario requirements."; return(null); } if (request.Validator != null && !request.Validator(pawn)) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn didn't pass validator check."; return(null); } for (int i = 0; i < PawnGenerator.pawnsBeingGenerated.Count - 1; i++) { if (PawnGenerator.pawnsBeingGenerated[i].PawnsGeneratedInTheMeantime == null) { PawnGenerator.pawnsBeingGenerated[i] = new PawnGenerationStatus(PawnGenerator.pawnsBeingGenerated[i].Pawn, new List <Pawn>()); } PawnGenerator.pawnsBeingGenerated[i].PawnsGeneratedInTheMeantime.Add(pawn); } return(pawn); IL_02b0: PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn incapable of violence."; return(null); } finally { PawnGenerator.pawnsBeingGenerated.RemoveLast(); } }
private static Pawn TryGenerateNewPawnInternal(ref PawnGenerationRequest request, out string error, bool ignoreScenarioRequirements, bool ignoreValidator) { 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) { FactionDef def; Faction faction; if (request.Faction != null) { def = request.Faction.def; } else if (Find.FactionManager.TryGetRandomNonColonyHumanlikeFaction(out faction, false, true, TechLevel.Undefined)) { def = faction.def; } else { def = Faction.OfAncients.def; } 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, def); pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(pawn, def); PawnGenerator.GenerateTraits(pawn, request); PawnGenerator.GenerateBodyType(pawn); PawnGenerator.GenerateSkills(pawn); } if (pawn.RaceProps.Animal && request.Faction != null && request.Faction.IsPlayer) { pawn.training.SetWantedRecursive(TrainableDefOf.Tameness, true); pawn.training.Train(TrainableDefOf.Tameness, null, true); } PawnGenerator.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)) { 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.RaceProps.ToolUser && !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 != null && !Find.Scenario.AllowPlayerStartingPawn(pawn, false, request)) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn doesn't meet scenario requirements."; result = null; } else if (!ignoreValidator && request.ValidatorPreGear != null && !request.ValidatorPreGear(pawn)) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn didn't pass validator check (pre-gear)."; result = null; } else { if (!request.Newborn) { PawnGenerator.GenerateGearFor(pawn, request); } if (!ignoreValidator && request.ValidatorPostGear != null && !request.ValidatorPostGear(pawn)) { PawnGenerator.DiscardGeneratedPawn(pawn); error = "Generated pawn didn't pass validator check (post-gear)."; 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(); } }
public static Pawn Copy(Pawn sourcePawn, PawnKindDef kindDef, Faction faction, bool forceBodyVisual = false, bool forceApparel = false, bool forceWeapon = false) { Pawn pawn = (Pawn)ThingMaker.MakeThing(kindDef.race, null); pawn.kindDef = kindDef; pawn.SetFactionDirect(faction); pawn.pather = new Pawn_PathFollower(pawn); pawn.ageTracker = new Pawn_AgeTracker(pawn); pawn.health = new Pawn_HealthTracker(pawn); pawn.jobs = new Pawn_JobTracker(pawn); pawn.mindState = new Pawn_MindState(pawn); pawn.filth = new Pawn_FilthTracker(pawn); pawn.needs = new Pawn_NeedsTracker(pawn); pawn.stances = new Pawn_StanceTracker(pawn); pawn.InitUnsavedUniversalComponents(); if (pawn.RaceProps.ToolUser) { pawn.equipment = new Pawn_EquipmentTracker(pawn); pawn.carrier = new Pawn_CarryTracker(pawn); pawn.apparel = new Pawn_ApparelTracker(pawn); pawn.inventory = new Pawn_InventoryTracker(pawn); } if (pawn.RaceProps.Humanlike) { pawn.ownership = new Pawn_Ownership(pawn); pawn.skills = new Pawn_SkillTracker(pawn); pawn.talker = new Pawn_TalkTracker(pawn); pawn.story = new Pawn_StoryTracker(pawn); pawn.workSettings = new Pawn_WorkSettings(pawn); } if (pawn.RaceProps.intelligence <= Intelligence.ToolUser) { pawn.caller = new Pawn_CallTracker(pawn); } PawnUtility.AddAndRemoveComponentsAsAppropriate(pawn); if (pawn.RaceProps.hasGenders) { if ((sourcePawn != null) && (sourcePawn.RaceProps.hasGenders) && (sourcePawn.gender != Gender.None)) { pawn.gender = sourcePawn.gender; } else { if (Rand.Value < 0.5f) { pawn.gender = Gender.Male; } else { pawn.gender = Gender.Female; } } } else { pawn.gender = Gender.None; } AbilityEffect_Revive.GenerateRandomAge_Coping(pawn, sourcePawn); AbilityEffect_Revive.GenerateInitialHediffs_Coping(pawn, sourcePawn); if (pawn.RaceProps.Humanlike) { if ((sourcePawn != null) && (forceBodyVisual)) { pawn.story.skinColor = sourcePawn.story.skinColor; pawn.story.crownType = sourcePawn.story.crownType; pawn.story.headGraphicPath = sourcePawn.story.headGraphicPath; pawn.story.hairColor = sourcePawn.story.hairColor; AbilityEffect_Revive.GiveAppropriateBioTo_Coping(pawn, sourcePawn); pawn.story.hairDef = sourcePawn.story.hairDef; AbilityEffect_Revive.GiveRandomTraitsTo_Coping(pawn, sourcePawn); pawn.story.GenerateSkillsFromBackstory(); } else { pawn.story.skinColor = PawnSkinColors.RandomSkinColor(); pawn.story.crownType = ((Rand.Value >= 0.5f) ? CrownType.Narrow : CrownType.Average); pawn.story.headGraphicPath = GraphicDatabaseHeadRecords.GetHeadRandom(pawn.gender, pawn.story.skinColor, pawn.story.crownType).GraphicPath; pawn.story.hairColor = PawnHairColors.RandomHairColor(pawn.story.skinColor, pawn.ageTracker.AgeBiologicalYears); PawnBioGenerator.GiveAppropriateBioTo(pawn, faction.def); pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(pawn, faction.def); AbilityEffect_Revive.GiveRandomTraitsTo(pawn); pawn.story.GenerateSkillsFromBackstory(); } } AbilityEffect_Revive.GenerateStartingApparelFor_Coping(pawn, sourcePawn, forceApparel); AbilityEffect_Revive.TryGenerateWeaponFor_Coping(pawn, sourcePawn, forceWeapon); AbilityEffect_Revive.GenerateInventoryFor_Coping(pawn, sourcePawn); PawnUtility.AddAndRemoveComponentsAsAppropriate(pawn); return(pawn); }
public static Zombie GeneratePawn(ZombieType overwriteType) { var thing = ThingMaker.MakeThing(ZombieDefOf.Zombie.race, null); var zombie = thing as Zombie; if (zombie == null) { Log.Error("ThingMaker.MakeThing(ZombieDefOf.Zombie.race, null) unexpectedly returned " + thing); return(null); } var bodyType = PrepareZombieType(zombie, overwriteType); zombie.kindDef = ZombieDefOf.Zombie; zombie.SetFactionDirect(FactionUtility.DefaultFactionFrom(ZombieDefOf.Zombies)); PawnComponentsUtility.CreateInitialComponents(zombie); zombie.health.hediffSet.Clear(); var ageInYears = (long)Rand.Range(14, 130); zombie.ageTracker.AgeBiologicalTicks = (ageInYears * 3600000); zombie.ageTracker.AgeChronologicalTicks = zombie.ageTracker.AgeBiologicalTicks; zombie.ageTracker.BirthAbsTicks = GenTicks.TicksAbs - zombie.ageTracker.AgeBiologicalTicks; var idx = zombie.ageTracker.CurLifeStageIndex; // trigger calculations zombie.needs.SetInitialLevels(); zombie.needs.mood = new Need_Mood(zombie); var name = PawnNameDatabaseSolid.GetListForGender((zombie.gender == Gender.Female) ? GenderPossibility.Female : GenderPossibility.Male).RandomElement(); var n1 = name.First.Replace('s', 'z').Replace('S', 'Z'); var n2 = name.Last.Replace('s', 'z').Replace('S', 'Z'); var n3 = name.Nick.Replace('s', 'z').Replace('S', 'Z'); zombie.Name = new NameTriple(n1, n3, n2); zombie.story.childhood = BackstoryDatabase.allBackstories .Where(kvp => kvp.Value.slot == BackstorySlot.Childhood) .RandomElement().Value; if (zombie.ageTracker.AgeBiologicalYearsFloat >= 20f) { zombie.story.adulthood = BackstoryDatabase.allBackstories .Where(kvp => kvp.Value.slot == BackstorySlot.Adulthood) .RandomElement().Value; } zombie.story.melanin = 0.01f * Rand.Range(10, 91); zombie.story.bodyType = bodyType; zombie.story.crownType = Rand.Bool ? CrownType.Average : CrownType.Narrow; zombie.story.hairColor = HairColor(); zombie.story.hairDef = PawnHairChooser.RandomHairDefFor(zombie, ZombieDefOf.Zombies); if (ZombieSettings.Values.useCustomTextures) { var it = AssignNewGraphics(zombie); while (it.MoveNext()) { ; } } zombie.Drawer.leaner = new ZombieLeaner(zombie); if (zombie.pather == null) { zombie.pather = new Pawn_PathFollower(zombie); } GetterSetters.destinationByRef(zombie.pather) = IntVec3.Invalid; return(zombie); }
public static IEnumerator SpawnZombieIterativ(IntVec3 cell, Map map, ZombieType zombieType, Action <Zombie> callback) { ZombiesSpawning++; var thing = ThingMaker.MakeThing(ZombieDefOf.Zombie.race, null); yield return(null); var zombie = thing as Zombie; var bodyType = PrepareZombieType(zombie, zombieType); zombie.kindDef = ZombieDefOf.Zombie; zombie.SetFactionDirect(FactionUtility.DefaultFactionFrom(ZombieDefOf.Zombies)); yield return(null); PawnComponentsUtility.CreateInitialComponents(zombie); yield return(null); zombie.health.hediffSet.Clear(); var ageInYears = (long)Rand.Range(14, 130); zombie.ageTracker.AgeBiologicalTicks = (ageInYears * 3600000); zombie.ageTracker.AgeChronologicalTicks = zombie.ageTracker.AgeBiologicalTicks; zombie.ageTracker.BirthAbsTicks = GenTicks.TicksAbs - zombie.ageTracker.AgeBiologicalTicks; var idx = zombie.ageTracker.CurLifeStageIndex; // trigger calculations yield return(null); zombie.needs.SetInitialLevels(); yield return(null); zombie.needs.mood = new Need_Mood(zombie); yield return(null); var name = PawnNameDatabaseSolid.GetListForGender((zombie.gender == Gender.Female) ? GenderPossibility.Female : GenderPossibility.Male).RandomElement(); yield return(null); var n1 = name.First.Replace('s', 'z').Replace('S', 'Z'); var n2 = name.Last.Replace('s', 'z').Replace('S', 'Z'); var n3 = name.Nick.Replace('s', 'z').Replace('S', 'Z'); zombie.Name = new NameTriple(n1, n3, n2); yield return(null); zombie.story.childhood = BackstoryDatabase.allBackstories .Where(kvp => kvp.Value.slot == BackstorySlot.Childhood) .RandomElement().Value; yield return(null); if (zombie.ageTracker.AgeBiologicalYearsFloat >= 20f) { zombie.story.adulthood = BackstoryDatabase.allBackstories .Where(kvp => kvp.Value.slot == BackstorySlot.Adulthood) .RandomElement().Value; } yield return(null); zombie.story.melanin = 0.01f * Rand.Range(10, 91); zombie.story.bodyType = bodyType; zombie.story.crownType = Rand.Bool ? CrownType.Average : CrownType.Narrow; zombie.story.hairColor = HairColor(); zombie.story.hairDef = PawnHairChooser.RandomHairDefFor(zombie, ZombieDefOf.Zombies); yield return(null); var it = AssignNewGraphics(zombie); while (it.MoveNext()) { yield return(null); } zombie.Drawer.leaner = new ZombieLeaner(zombie); if (zombie.pather == null) { zombie.pather = new Pawn_PathFollower(zombie); } GetterSetters.destinationByRef(zombie.pather) = IntVec3.Invalid; yield return(null); if (zombie.IsTanky == false) { var it2 = GenerateStartingApparelFor(zombie); while (it2.MoveNext()) { yield return(null); } } if (zombie.IsSuicideBomber) { zombie.lastBombTick = Find.TickManager.TicksAbs + Rand.Range(0, (int)zombie.bombTickingInterval); } GenPlace.TryPlaceThing(zombie, cell, map, ThingPlaceMode.Direct); yield return(null); if (callback != null) { callback(zombie); } ZombiesSpawning--; switch (Find.TickManager.CurTimeSpeed) { case TimeSpeed.Paused: break; case TimeSpeed.Normal: yield return(new WaitForSeconds(0.1f)); break; case TimeSpeed.Fast: yield return(new WaitForSeconds(0.25f)); break; case TimeSpeed.Superfast: yield return(new WaitForSeconds(0.5f)); break; case TimeSpeed.Ultrafast: yield return(new WaitForSeconds(1f)); break; } }