diff --git a/1.3/Assemblies/RJW_Menstruation.dll b/1.3/Assemblies/RJW_Menstruation.dll
index 3b7e238..5466b63 100644
Binary files a/1.3/Assemblies/RJW_Menstruation.dll and b/1.3/Assemblies/RJW_Menstruation.dll differ
diff --git a/1.3/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs b/1.3/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs
index d031d0a..2375bc1 100644
--- a/1.3/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs
+++ b/1.3/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs
@@ -614,41 +614,59 @@ namespace RJW_Menstruation
/// Copy from RJW
///
///
- ///
+ ///
///
- public void updateTraits(Pawn pawn, List parenttraits)
+ public void updateTraits(Pawn pawn, List parentTraits)
{
- if (pawn?.story?.traits == null) return;
-
- List traitlist = new List(pawn.story.traits.allTraits);
- if (!parenttraits.NullOrEmpty()) traitlist.AddRange(parenttraits);
- else return;
-
-
- var forcedTraits = traitlist
- .Where(x => x.ScenForced)
- .Distinct(new TraitComparer(ignoreDegree: true));
-
- List res = new List();
- res.AddRange(forcedTraits);
-
- var comparer = new TraitComparer(); // trait comparision implementation, because without game compares traits *by reference*, makeing them all unique.
- while (res.Count < traitlist.Count && traitlist.Count > 0)
+ if (pawn?.story?.traits == null)
{
- // Has to be the only use of Rand in the function for the push/pop trick to work right
- int index = Rand.Range(0, traitlist.Count); // getting trait and removing from the pull
- var trait = traitlist[index];
- traitlist.RemoveAt(index);
-
- if (!res.Any(x => comparer.Equals(x, trait) || // skipping traits conflicting with already added
- x.def.ConflictsWith(trait)))
- {
- res.Add(new Trait(trait.def, trait.Degree, false));
- }
+ return;
}
+ int traitLimit = pawn.story.traits.allTraits.Count;
- pawn.story.traits.allTraits = res;
+ //Personal pool
+ List personalTraitPool = new List(pawn.story.traits.allTraits);
+ //Parents
+ List parentTraitPool = new List(parentTraits);
+ parentTraitPool.RemoveAll(x => x.ScenForced);
+ int numberInherited;
+ if (parentTraitPool != null)
+ numberInherited = System.Math.Min(parentTraitPool.Count(), Rand.RangeInclusive(0,2)); // Not 3; give a better chance for a natural trait to appear
+ else
+ numberInherited = 0;
+
+ //Game suggested traits.
+ var forcedTraits = personalTraitPool
+ .Where(x => x.ScenForced)
+ .Distinct(new TraitComparer(ignoreDegree: true)); // result can be a mess, because game allows this mess to be created in scenario editor
+
+ List selectedTraits = new List();
+ var comparer = new TraitComparer(); // trait comparision implementation, because without game compares traits *by reference*, makeing them all unique.
+ selectedTraits.AddRange(forcedTraits); // enforcing scenario forced traits
+ for (int i = 0; i < numberInherited; i++) // add parent traits first
+ {
+ int index = Rand.Range(0, parentTraitPool.Count);
+ Trait trait = parentTraitPool[index];
+ parentTraitPool.RemoveAt(index);
+ if (!selectedTraits.Any(x => comparer.Equals(x, trait) ||
+ x.def.ConflictsWith(trait)))
+ selectedTraits.Add(new Trait(trait.def, trait.Degree, false));
+ }
+
+ while (selectedTraits.Count < traitLimit && personalTraitPool.Count > 0)
+ {
+ int index = Rand.Range(0, personalTraitPool.Count); // getting trait and removing from the pull
+ var trait = personalTraitPool[index];
+ personalTraitPool.RemoveAt(index);
+
+ if (!selectedTraits.Any(x => comparer.Equals(x, trait) || // skipping traits conflicting with already added
+ x.def.ConflictsWith(trait)))
+ selectedTraits.Add(new Trait(trait.def, trait.Degree, false));
+
+ }
+
+ pawn.story.traits.allTraits = selectedTraits;
}