public static void TouchColonistPersonalityDueToHope(Pawn pawn, MoodTraitChangeDirection type) { // determine if is colonist (contains trait) TraitSet pawnTraits = pawn.story?.traits; if (pawnTraits == null) { return; } // is colonist (contains traits) /* * Rules: * If promote, change the degree by +1, else by -1 * If change to 0 and will have too few traits (<= 1), then idk, it be the colonists' problem */ int naturalMoodTraitDegree = pawnTraits.DegreeOfTrait(TraitDefOf.NaturalMood); if (naturalMoodTraitDegree == 2 && type == MoodTraitChangeDirection.UPWARD) { return; } if (naturalMoodTraitDegree == -2 && type == MoodTraitChangeDirection.DOWNWARD) { return; } int targetMoodTraitDegree; if (type == MoodTraitChangeDirection.UPWARD) { targetMoodTraitDegree = naturalMoodTraitDegree + 1; } else { targetMoodTraitDegree = naturalMoodTraitDegree - 1; } if (targetMoodTraitDegree == 0) { pawnTraits.allTraits.RemoveAll((trait) => !trait.ScenForced && trait.def == TraitDefOf.NaturalMood); } else { // degree changes if (naturalMoodTraitDegree != 0) { // need to remove then add anyway pawnTraits.allTraits.RemoveAll((trait) => !trait.ScenForced && trait.def == TraitDefOf.NaturalMood); } // adding new trait pawnTraits.GainTrait(new Trait(TraitDefOf.NaturalMood, targetMoodTraitDegree)); } }
void AddOutlook(MutationOutlook mOutlook) { TraitSet st = Pawn.story?.traits; AspectTracker at = Pawn.GetAspectTracker(); if (st == null) { return; } if (at == null) { return; } switch (mOutlook) { case MutationOutlook.Neutral: return; case MutationOutlook.Furry: st.GainTrait(new Trait(PMTraitDefOf.MutationAffinity, 0, true)); break; case MutationOutlook.BodyPurist: st.GainTrait(new Trait(TraitDefOf.BodyPurist, 0, true)); break; case MutationOutlook.PrimalWish: at.Add(AspectDefOf.PrimalWish); break; default: throw new ArgumentOutOfRangeException(nameof(mOutlook), mOutlook, null); } }
private static void TransferTraits([NotNull] IEnumerable <Pawn> originalPawns, [NotNull] Pawn mergedPawn) { TraitSet mTraits = mergedPawn.story?.traits; if (mTraits == null) { return; } var traits = new List <TraitDef>(); foreach (Pawn originalPawn in originalPawns) { List <Trait> pTraits = originalPawn.story?.traits?.allTraits; if (pTraits == null) { continue; } foreach (Trait pTrait in pTraits) { if (traits.Contains(pTrait.def) || !FormerHumanUtilities.MutationTraits.Contains(pTrait.def)) { continue; } traits.Add(pTrait.def); } } //check for split mind if (traits.Contains(PMTraitDefOf.MutationAffinity) && traits.Contains(TraitDefOf.BodyPurist)) { traits.Remove(PMTraitDefOf.MutationAffinity); traits.Remove(TraitDefOf.BodyPurist); AspectTracker at = mergedPawn.GetAspectTracker(); at?.Add(AspectDefOf.SplitMind); } foreach (TraitDef traitDef in traits) { mTraits.GainTrait(new Trait(traitDef, 0, true)); } }