/// <summary> /// Transfers all transferable aspects from the original pawn to animal they turned into. /// </summary> /// <param name="pawn1">The original.</param> /// <param name="pawn2">The animal.</param> public static void TransferAspects([NotNull] Pawn pawn1, [NotNull] Pawn pawn2) { AspectTracker oTracker = pawn1.GetAspectTracker(); AspectTracker animalTracker = pawn2.GetAspectTracker(); if (oTracker == null) { return; } if (animalTracker == null) { Log.Warning($"animal {pawn2.Name},{pawn2.def.defName} does not have an aspect tracker"); return; } foreach (Aspect aspect in oTracker) { if (aspect.def.transferToAnimal) { int stageIndex = aspect.StageIndex; animalTracker.Add(aspect.def, stageIndex); } } }
private void RecalculateMorphCount(MorphTracker tracker) { MorphDef myMorph = parent.def.GetMorphOfRace(); AspectTracker aspectTracker = Pawn.GetAspectTracker(); if (aspectTracker == null) { return; } MorphGroupDef group = myMorph?.group; AspectDef aspectDef = group?.aspectDef; if (aspectDef == null) { return; } Aspect aspect = aspectTracker.GetAspect(aspectDef); if (aspect == null) //if the hediff is missing for some reason add it again { aspect = aspectDef.CreateInstance(); aspectTracker.Add(aspect); } aspect.StageIndex = tracker.GetGroupCount(group) - 1; }
/// <summary> /// Transfers the aspects to the given meld. /// </summary> /// <param name="originalPawns">The original pawns.</param> /// <param name="mergedPawn">The merged pawn.</param> private static void TransferAspects([NotNull] IEnumerable <Pawn> originalPawns, [NotNull] Pawn mergedPawn) { AspectTracker mAT = mergedPawn.GetAspectTracker(); if (mAT == null) { return; } var aspectDefs = new List <AspectDef>(); foreach (Pawn originalPawn in originalPawns) { AspectTracker at = originalPawn?.GetAspectTracker(); if (at == null) { continue; } foreach (Aspect aspect in at.Aspects) { if (aspect.def.transferToAnimal && !aspectDefs.Contains(aspect.def)) { aspectDefs.Add(aspect.def); } } } foreach (AspectDef aspectDef in aspectDefs) { mAT.Add(aspectDef); } }
/// <summary> /// Transfers all transferable aspects from pawn1 to pawn2 /// </summary> /// <param name="pawn1">The source pawn.</param> /// <param name="pawn2">The destination pawn.</param> public static void TransferAspects([NotNull] Pawn pawn1, [NotNull] Pawn pawn2) { AspectTracker originalTracker = pawn1.GetAspectTracker(); AspectTracker animalTracker = pawn2.GetAspectTracker(); if (originalTracker == null) { return; } if (animalTracker == null) { Log.Warning($"pawn {pawn2.Name},{pawn2.def.defName} does not have an aspect tracker"); return; } foreach (Aspect aspect in originalTracker) { if (animalTracker.Contains(aspect.def, aspect.StageIndex)) { aspect.PostTransfer(animalTracker.GetAspect(aspect.def)); continue; } if (aspect.def.transferToAnimal) { int stageIndex = aspect.StageIndex; Aspect aAspect = animalTracker.GetAspect(aspect.def); if (aAspect != null) { aAspect.StageIndex = stageIndex; //set the stage but do not re add it aspect.PostTransfer(aAspect); } else { Aspect newAspect = aspect.def.CreateInstance(); animalTracker.Add(newAspect, stageIndex); //add it if the animal does not have the aspect aspect.PostTransfer(newAspect); } } } }
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)); } }
private void MorphCountChanged(MorphTracker sender, MorphDef morph) { MorphDef myMorph = parent.def.GetMorphOfRace(); if (myMorph?.group == null) { return; } if (myMorph.group != morph?.group) { return; } var pawn = (Pawn)parent; AspectTracker aspectTracker = pawn.GetAspectTracker(); if (aspectTracker == null) { return; } AspectDef aspectDef = morph?.group?.aspectDef; if (aspectDef == null) { return; } Aspect aspect = aspectTracker.GetAspect(aspectDef); if (aspect == null) //if the aspect is missing for some reason add it again { aspect = aspectDef.CreateInstance(); aspectTracker.Add(aspect); } var comp = pawn.Map?.GetComponent <MorphTracker>(); aspect.StageIndex = (comp?.GetGroupCount(morph.group) ?? 0) - 1; //stage should always be equal to the number of morphs in the group active in the same map }