internal void GrowUpTo(int stage, bool generated) { grown_to = stage; accelerated_factor = ChildrenUtility.Setting_Accelerated_Factor(grown_to); // Update the Colonist Bar PortraitsCache.SetDirty(pawn); LongEventHandler.ExecuteWhenFinished(delegate { pawn.Drawer.renderer.graphics.ResolveAllGraphics(); }); // At the toddler stage. Now we can move and talk. if (stage == 1) { Severity = Math.Max(0.5f, Severity); //pawn.needs.food. } // Re-enable skills that were locked out from toddlers if (stage == 2) { if (!generated && ChildrenUtility.IsHumanlikeChild(pawn)) { pawn.story.childhood = BackstoryDatabase.allBackstories["CustomBackstory_Rimchild"]; } if (!generated && !ChildrenUtility.IsHumanlikeChild(pawn)) { ChildrenUtility.GiveBackstory(ref pawn); } // Remove the hidden hediff stopping pawns from manipulating if (pawn.health.hediffSet.HasHediff(HediffDef.Named("NoManipulationFlag"))) { pawn.health.hediffSet.hediffs.Remove(pawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("NoManipulationFlag"))); } Severity = Math.Max(0.75f, Severity); } // The child has grown to a teenager so we no longer need this effect if (stage == 3) { if (!generated && pawn.story.childhood.title == "Child") { pawn.story.childhood = BackstoryDatabase.allBackstories ["CustomBackstory_Rimchild"]; } // Gain traits from life experiences if (pawn.story.traits.allTraits.Count < 3) { List <Trait> life_traitpool = new List <Trait>(); // Try get cannibalism if (pawn.needs.mood.thoughts.memories.Memories.Find(x => x.def == ThoughtDefOf.AteHumanlikeMeatAsIngredient) != null) { life_traitpool.Add(new Trait(TraitDefOf.Cannibal, 0, false)); } // Try to get bloodlust if (pawn.records.GetValue(RecordDefOf.KillsHumanlikes) > 0 || pawn.records.GetValue(RecordDefOf.AnimalsSlaughtered) >= 2) { life_traitpool.Add(new Trait(TraitDefOf.Bloodlust, 0, false)); } // Try to get shooting accuracy if (pawn.records.GetValue(RecordDefOf.ShotsFired) > 100) { life_traitpool.Add(new Trait(TraitDef.Named("ShootingAccuracy"), 1, false)); } else if (pawn.records.GetValue(RecordDefOf.ShotsFired) > 100 && (int)pawn.records.GetValue(RecordDefOf.PawnsDowned) == 0) { life_traitpool.Add(new Trait(TraitDef.Named("ShootingAccuracy"), -1, false)); } // Try to get brawler else if (pawn.records.GetValue(RecordDefOf.ShotsFired) < 15 && pawn.records.GetValue(RecordDefOf.PawnsDowned) > 1) { life_traitpool.Add(new Trait(TraitDefOf.Brawler, 0, false)); } // Try to get Dislikes Men/Women int male_rivals = 0; int female_rivals = 0; foreach (Pawn colinist in Find.AnyPlayerHomeMap.mapPawns.AllPawnsSpawned) { if (pawn.relations.OpinionOf(colinist) <= -20) { if (colinist.gender == Gender.Male) { male_rivals++; } else { female_rivals++; } } } // Find which gender we hate if (male_rivals > 3 || female_rivals > 3) { if (male_rivals > female_rivals) { life_traitpool.Add(new Trait(TraitDefOf.DislikesMen, 0, false)); } else if (female_rivals > male_rivals) { life_traitpool.Add(new Trait(TraitDefOf.DislikesWomen, 0, false)); } } // Pyromaniac never put out any fires. Seems kinda stupid /*if ((int)pawn.records.GetValue (RecordDefOf.FiresExtinguished) == 0) { * life_traitpool.Add (new Trait (TraitDefOf.Pyromaniac, 0, false)); * }*/ // Neurotic if (pawn.records.GetValue(RecordDefOf.TimesInMentalState) > 6) { life_traitpool.Add(new Trait(TraitDef.Named("Neurotic"), 2, false)); } else if (pawn.records.GetValue(RecordDefOf.TimesInMentalState) > 3) { life_traitpool.Add(new Trait(TraitDef.Named("Neurotic"), 1, false)); } // Girls can turn gay during puberty if (pawn.gender == Gender.Female && Rand.Value <= 0.08f && pawn.story.traits.allTraits.Count <= 3) { pawn.story.traits.GainTrait(new Trait(TraitDefOf.Gay, 0, true)); } // Now let's try to add some life experience traits if (life_traitpool.Count > 0) { int i = 3; while (pawn.story.traits.allTraits.Count < 3 && i > 0) { Trait newtrait = life_traitpool.RandomElement(); if (pawn.story.traits.HasTrait(newtrait.def) == false) { pawn.story.traits.GainTrait(newtrait); } i--; } } } pawn.health.RemoveHediff(this); } }