예제 #1
0
        /// <summary>Gets the entries for the given pawn</summary>
        /// <param name="pawn">The pawn.</param>
        /// <param name="source"></param>
        /// <returns></returns>
        public override IEnumerable <MutationEntry> GetEntries(Pawn pawn, Hediff source)
        {
            var totemAspect = pawn.GetAspectTracker()?.Aspects?.OfType <BondedAspect>()?.FirstOrDefault();

            if (totemAspect == null)
            {
                return(Enumerable.Empty <MutationEntry>());
            }

            var fRelation = totemAspect.FirstValidRelation;

            if (fRelation == null)
            {
                return(Enumerable.Empty <MutationEntry>());
            }

            var mDef = MorphUtilities.TryGetBestMorphOfAnimal(fRelation.otherPawn.def);

            if (mDef == null)
            {
                return(Enumerable.Empty <MutationEntry>());
            }

            if (!_entriesCache.TryGetValue(mDef, out var lst))
            {
                lst = mDef.AllAssociatedMutations.Select(CreateEntry).ToList();
                _entriesCache[mDef] = lst;
            }

            return(lst);
        }
예제 #2
0
        private void TryAddMutationsToPawn([NotNull] Pawn original, [CanBeNull] Hediff requestCause,
                                           [NotNull] PawnKindDef requestOutputDef)
        {
            MorphDef mDef = null;

            if (requestCause != null) //first check the cause
            {
                foreach (MorphDef morphDef in MorphDef.AllDefs)
                {
                    if (morphDef.fullTransformation == requestCause.def || morphDef.partialTransformation == requestCause.def)
                    {
                        mDef = morphDef;
                        goto applyMutations; //ugly, but it's the easiest solution
                    }
                }
            }

            mDef = MorphUtilities.TryGetBestMorphOfAnimal(requestOutputDef.race);

            if (mDef == null)
            {
                DebugLogUtils.LogMsg(LogLevel.Messages, $"could not apply mutations to {original} with cause {requestCause?.def?.defName ?? "NULL"} and target {requestOutputDef.defName}");
                return;
            }


applyMutations:
            MutationUtilities.AddAllMorphMutations(original, mDef);
        }
            static void MutagenicNuzzle(Pawn nuzzler, Pawn nuzzlee)
            {
                if (nuzzlee == null || nuzzler == null)
                {
                    return;
                }

                var asT = nuzzler.GetAspectTracker();

                var mutInfused = asT?.GetAspect(AspectDefOf.MutagenInfused);

                if (mutInfused?.StageIndex != 0)
                {
                    return;
                }

                HediffDef hediffToAdd = null;

                if (nuzzler.IsChimera())
                {
                    hediffToAdd = MorphTransformationDefOf.FullRandomTF;
                }
                var bestMorph = MorphUtilities.TryGetBestMorphOfAnimal(nuzzler.def);

                if (bestMorph != null)
                {
                    hediffToAdd = bestMorph.partialTransformation;
                }

                if (hediffToAdd != null)
                {
                    var health = nuzzlee.health;
                    health?.AddHediff(hediffToAdd);
                }
            }