mirror of
				https://gitgud.io/lutepickle/rjw_menstruation.git
				synced 2024-08-14 22:46:52 +00:00 
			
		
		
		
	Alter updateTraits to properly handle zygotic twin inheritance for differing number of natural traits
This commit is contained in:
		
							parent
							
								
									26b49379b1
								
							
						
					
					
						commit
						052b7661e4
					
				
					 2 changed files with 47 additions and 29 deletions
				
			
		
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -614,41 +614,59 @@ namespace RJW_Menstruation
 | 
				
			||||||
        /// Copy from RJW
 | 
					        /// Copy from RJW
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="pawn"></param>
 | 
					        /// <param name="pawn"></param>
 | 
				
			||||||
        /// <param name="parenttraits"></param>
 | 
					        /// <param name="parentTraits"></param>
 | 
				
			||||||
        /// 
 | 
					        /// 
 | 
				
			||||||
        public void updateTraits(Pawn pawn, List<Trait> parenttraits)
 | 
					        public void updateTraits(Pawn pawn, List<Trait> parentTraits)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (pawn?.story?.traits == null) return;
 | 
					            if (pawn?.story?.traits == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            List<Trait> traitlist = new List<Trait>(pawn.story.traits.allTraits);
 | 
					            int traitLimit = pawn.story.traits.allTraits.Count;
 | 
				
			||||||
            if (!parenttraits.NullOrEmpty()) traitlist.AddRange(parenttraits);
 | 
					 | 
				
			||||||
            else return;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //Personal pool
 | 
				
			||||||
 | 
					            List<Trait> personalTraitPool = new List<Trait>(pawn.story.traits.allTraits);
 | 
				
			||||||
 | 
					            //Parents
 | 
				
			||||||
 | 
					            List<Trait> parentTraitPool = new List<Trait>(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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var forcedTraits = traitlist
 | 
					            //Game suggested traits.
 | 
				
			||||||
 | 
					            var forcedTraits = personalTraitPool
 | 
				
			||||||
                .Where(x => x.ScenForced)
 | 
					                .Where(x => x.ScenForced)
 | 
				
			||||||
                .Distinct(new TraitComparer(ignoreDegree: true));
 | 
					                .Distinct(new TraitComparer(ignoreDegree: true)); // result can be a mess, because game allows this mess to be created in scenario editor
 | 
				
			||||||
 | 
					 | 
				
			||||||
            List<Trait> res = new List<Trait>();
 | 
					 | 
				
			||||||
            res.AddRange(forcedTraits);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            List<Trait> selectedTraits = new List<Trait>();
 | 
				
			||||||
            var comparer = new TraitComparer(); // trait comparision implementation, because without game compares traits *by reference*, makeing them all unique.
 | 
					            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)
 | 
					            selectedTraits.AddRange(forcedTraits); // enforcing scenario forced traits
 | 
				
			||||||
 | 
					            for (int i = 0; i < numberInherited; i++)   // add parent traits first
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                // Has to be the only use of Rand in the function for the push/pop trick to work right
 | 
					                int index = Rand.Range(0, parentTraitPool.Count);
 | 
				
			||||||
                int index = Rand.Range(0, traitlist.Count); // getting trait and removing from the pull
 | 
					                Trait trait = parentTraitPool[index];
 | 
				
			||||||
                var trait = traitlist[index];
 | 
					                parentTraitPool.RemoveAt(index);
 | 
				
			||||||
                traitlist.RemoveAt(index);
 | 
					                if (!selectedTraits.Any(x => comparer.Equals(x, trait) ||
 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (!res.Any(x => comparer.Equals(x, trait) ||  // skipping traits conflicting with already added
 | 
					 | 
				
			||||||
                                             x.def.ConflictsWith(trait)))
 | 
					                                             x.def.ConflictsWith(trait)))
 | 
				
			||||||
 | 
					                    selectedTraits.Add(new Trait(trait.def, trait.Degree, false));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            while (selectedTraits.Count < traitLimit && personalTraitPool.Count > 0)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                    res.Add(new Trait(trait.def, trait.Degree, false));
 | 
					                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;
 | 
				
			||||||
            pawn.story.traits.allTraits = res;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue