コード例 #1
0
        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));
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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));
            }
        }