mirror of
				https://github.com/vegapnk/RJW-Genes.git
				synced 2024-08-15 00:23:31 +00:00 
			
		
		
		
	Custom Xenotypes should work now with Hivelogic
This commit is contained in:
		
							parent
							
								
									57bb1950e4
								
							
						
					
					
						commit
						0aefb45d9b
					
				
					 7 changed files with 171 additions and 42 deletions
				
			
		| 
						 | 
				
			
			@ -15,6 +15,7 @@
 | 
			
		|||
- New attempt at fixing condom consumption for Fertilin, adressing #41 & #48 provided by Infi
 | 
			
		||||
- Copy of Infis patch for eating cum from sexperience, #41 and #48
 | 
			
		||||
- Updated some Icons to have better backgrounds (thanks @WasmachenDennSachenSo #53)
 | 
			
		||||
- Custom Queen- and Drone-Xenotypes should work now. 
 | 
			
		||||
 | 
			
		||||
*Notes*: 
 | 
			
		||||
The pawns that are gender fluid can get pregnant. 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										28
									
								
								Source/Common/Either.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								Source/Common/Either.cs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace RJW_Genes
 | 
			
		||||
{
 | 
			
		||||
    public class Either<TL, TR>
 | 
			
		||||
    {
 | 
			
		||||
        public readonly TL left;
 | 
			
		||||
        public readonly TR right;
 | 
			
		||||
        public readonly bool isLeft;
 | 
			
		||||
 | 
			
		||||
        public Either(TL left)
 | 
			
		||||
        {
 | 
			
		||||
            this.left = left;
 | 
			
		||||
            this.isLeft = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Either(TR right)
 | 
			
		||||
        {
 | 
			
		||||
            this.right = right;
 | 
			
		||||
            this.isLeft = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -30,9 +30,9 @@ namespace RJW_Genes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="pawn">The pawn born, that maybe becomes a hive-xenotype.</param>
 | 
			
		||||
        /// <param name="hasDroneParent">whether there was a drone parent involved</param>
 | 
			
		||||
        public static void ManageHiveBirth(Pawn pawn, bool hasDroneParent = false, XenotypeDef fallbackQueenDef = null, XenotypeDef fallbackDroneDef = null)
 | 
			
		||||
        public static void ManageHiveBirth(Pawn pawn, bool hasDroneParent = false, Either<XenotypeDef, CustomXenotype> fallbackQueenDef = null, Either<XenotypeDef, CustomXenotype> fallbackDroneDef = null)
 | 
			
		||||
        {
 | 
			
		||||
            XenotypeDef queenDef = TryFindParentQueenXenotype(pawn);
 | 
			
		||||
            Either<XenotypeDef,CustomXenotype> queenDef = TryFindParentQueenXenotype(pawn);
 | 
			
		||||
            if (queenDef == null) queenDef = fallbackQueenDef;
 | 
			
		||||
            HiveOffspringChanceDef hiveOffspringChanceDef = HiveUtility.LookupHiveInheritanceChances(queenDef);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -49,17 +49,15 @@ namespace RJW_Genes
 | 
			
		|||
                // Case 2.a: New Queen born
 | 
			
		||||
                if (roll < hiveOffspringChanceDef.queenChance)
 | 
			
		||||
                {
 | 
			
		||||
                    pawn.genes.SetXenotype(queenDef);
 | 
			
		||||
                    if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawn} born as a new queen with xenotype {queenDef.defName} ({hiveOffspringChanceDef.queenChance * 100}% chance,rolled {roll})");
 | 
			
		||||
                    MakeQueenBornLetter(pawn);
 | 
			
		||||
                    MakeQueen(pawn, queenDef);
 | 
			
		||||
                    if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"Queen Chance: {hiveOffspringChanceDef.queenChance * 100}% chance,rolled { roll}");
 | 
			
		||||
                }
 | 
			
		||||
                // Case 2.b: New Drone born
 | 
			
		||||
                else if (roll < hiveOffspringChanceDef.droneChance + hiveOffspringChanceDef.queenChance)
 | 
			
		||||
                {
 | 
			
		||||
                    XenotypeDef droneDef = TryFindParentDroneXenotype(pawn);
 | 
			
		||||
                    if (droneDef == null) droneDef = fallbackDroneDef;
 | 
			
		||||
                    pawn.genes.SetXenotype(droneDef);
 | 
			
		||||
                    if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawn} born as a new drone with xenotype {droneDef.defName} ({(hiveOffspringChanceDef.droneChance + hiveOffspringChanceDef.queenChance) * 100}% chance,rolled {roll}))");
 | 
			
		||||
                    var droneDef = TryFindParentDroneXenotype(pawn); 
 | 
			
		||||
                    MakeDrone(pawn,droneDef);
 | 
			
		||||
                    if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"Drone Chance ({(hiveOffspringChanceDef.droneChance + hiveOffspringChanceDef.queenChance) * 100}% chance,rolled {roll}))");
 | 
			
		||||
                }
 | 
			
		||||
                // Case 2.c: Worker
 | 
			
		||||
                else
 | 
			
		||||
| 
						 | 
				
			
			@ -70,6 +68,52 @@ namespace RJW_Genes
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static void MakeQueen(Pawn pawnToBeQueen, Either<XenotypeDef,CustomXenotype> queenDef) {
 | 
			
		||||
            if (queenDef == null && pawnToBeQueen == null)
 | 
			
		||||
                return;
 | 
			
		||||
            if (queenDef.isLeft) {
 | 
			
		||||
                var xenotype = queenDef.left;
 | 
			
		||||
                pawnToBeQueen.genes.SetXenotype(xenotype);
 | 
			
		||||
                if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawnToBeQueen} born as a new queen with Xenotype {xenotype.defName}");
 | 
			
		||||
            } else {
 | 
			
		||||
                var customXenotype = queenDef.right;
 | 
			
		||||
 | 
			
		||||
                foreach (var gene in customXenotype.genes)
 | 
			
		||||
                    pawnToBeQueen.genes.AddGene(gene, true);
 | 
			
		||||
 | 
			
		||||
                pawnToBeQueen.genes.xenotypeName = customXenotype.name;
 | 
			
		||||
                pawnToBeQueen.genes.iconDef = customXenotype.iconDef;
 | 
			
		||||
 | 
			
		||||
                if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawnToBeQueen} born as a new queen with custom Xenotype {customXenotype.name}");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            MakeQueenBornLetter(pawnToBeQueen);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        private static void MakeDrone(Pawn pawnToBeDrone, Either<XenotypeDef, CustomXenotype> droneDef)
 | 
			
		||||
        {
 | 
			
		||||
            if (droneDef == null && pawnToBeDrone == null)
 | 
			
		||||
                return;
 | 
			
		||||
            if (droneDef.isLeft)
 | 
			
		||||
            {
 | 
			
		||||
                var xenotype = droneDef.left;
 | 
			
		||||
                pawnToBeDrone.genes.SetXenotype(xenotype);
 | 
			
		||||
                if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawnToBeDrone} born as a new drone with Xenotype {xenotype.defName}");
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                var customXenotype = droneDef.right;
 | 
			
		||||
 | 
			
		||||
                foreach (var gene in customXenotype.genes)
 | 
			
		||||
                    pawnToBeDrone.genes.AddGene(gene, true);
 | 
			
		||||
 | 
			
		||||
                pawnToBeDrone.genes.xenotypeName = customXenotype.name;
 | 
			
		||||
                pawnToBeDrone.genes.iconDef = customXenotype.iconDef;
 | 
			
		||||
 | 
			
		||||
                if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawnToBeDrone} born as a new drone with custom Xenotype {customXenotype.name}");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Turns a given pawn into a worker, by looking up the relevant genes as per queen.
 | 
			
		||||
| 
						 | 
				
			
			@ -79,14 +123,19 @@ namespace RJW_Genes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="pawnTobeWorker">The pawn for which the genes are added.</param>
 | 
			
		||||
        /// <param name="queenDef">The xenotype of the queen, used for lookup.</param>
 | 
			
		||||
        private static void MakeWorker(Pawn pawnTobeWorker, XenotypeDef queenDef)
 | 
			
		||||
        private static void MakeWorker(Pawn pawnTobeWorker, Either<XenotypeDef, CustomXenotype> queenDef)
 | 
			
		||||
        {
 | 
			
		||||
            if (pawnTobeWorker == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            var mappings = HiveUtility.GetQueenWorkerMappings();
 | 
			
		||||
            String queenDefName = HiveUtility.GetXenotypeDefName(queenDef);
 | 
			
		||||
            if (queenDef == null || mappings.NullOrEmpty())
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            var genes = mappings.TryGetValue(queenDef, HiveUtility.LookupDefaultWorkerGenes());
 | 
			
		||||
            var genes = mappings.TryGetValue(queenDefName, HiveUtility.LookupDefaultWorkerGenes());
 | 
			
		||||
            if (genes == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            foreach (var gene in genes)
 | 
			
		||||
                pawnTobeWorker.genes.AddGene(gene, false);
 | 
			
		||||
| 
						 | 
				
			
			@ -101,7 +150,7 @@ namespace RJW_Genes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="pawn">The pawn for whichs parent the xenotypes is looked up.</param>
 | 
			
		||||
        /// <returns>The Drone-Xenotype of a parent or null. If both are drones, mothers are preferred.</returns>
 | 
			
		||||
        public static XenotypeDef TryFindParentDroneXenotype(Pawn pawn)
 | 
			
		||||
        public static Either<XenotypeDef,CustomXenotype> TryFindParentDroneXenotype(Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
            if (pawn == null)
 | 
			
		||||
                return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -109,7 +158,7 @@ namespace RJW_Genes
 | 
			
		|||
            List<DirectPawnRelation> parentRelations = pawn.relations.DirectRelations.FindAll(rel => rel.def.Equals(PawnRelationDefOf.Parent));
 | 
			
		||||
            foreach (DirectPawnRelation parent in parentRelations)
 | 
			
		||||
            {
 | 
			
		||||
                XenotypeDef xenotype = HiveUtility.TryGetDroneXenotype(parent.otherPawn);
 | 
			
		||||
                var xenotype = HiveUtility.TryGetDroneXenotype(parent.otherPawn);
 | 
			
		||||
                if (xenotype != null) return xenotype;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -121,9 +170,8 @@ namespace RJW_Genes
 | 
			
		|||
            if (bornQueen == null) return;
 | 
			
		||||
 | 
			
		||||
            var letter= LetterMaker.MakeLetter(
 | 
			
		||||
                "New Queen", "A new Queen was born! Make sure to adress inheritance before the new queen reaches adolesence.", LetterDefOf.NeutralEvent, bornQueen
 | 
			
		||||
                "New Queen", "A new Queen was born! Make sure to adress succession before the new queen reaches adolesence.", LetterDefOf.NeutralEvent, bornQueen
 | 
			
		||||
                );
 | 
			
		||||
            //letter.Start();
 | 
			
		||||
            Find.LetterStack.ReceiveLetter(letter); 
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -134,7 +182,7 @@ namespace RJW_Genes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="pawn">The pawn for whichs parent the xenotypes is looked up.</param>
 | 
			
		||||
        /// <returns>The Queen-Xenotype of a parent or null. If both are queens, mothers are preferred.</returns>
 | 
			
		||||
        public static XenotypeDef TryFindParentQueenXenotype(Pawn pawn)
 | 
			
		||||
        public static Either<XenotypeDef,CustomXenotype> TryFindParentQueenXenotype(Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
            if (pawn == null)
 | 
			
		||||
                return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -142,7 +190,7 @@ namespace RJW_Genes
 | 
			
		|||
            List<DirectPawnRelation> parentRelations = pawn.relations.DirectRelations.FindAll(rel => rel.def.Equals(PawnRelationDefOf.Parent));
 | 
			
		||||
            foreach (var parent in parentRelations)
 | 
			
		||||
            {
 | 
			
		||||
                XenotypeDef xenotype = HiveUtility.TryGetQueenXenotype(parent.otherPawn);
 | 
			
		||||
                var xenotype = HiveUtility.TryGetQueenXenotype(parent.otherPawn);
 | 
			
		||||
                if (xenotype != null) return xenotype;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -74,7 +74,7 @@ namespace RJW_Genes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="pawn"></param>
 | 
			
		||||
        /// <returns>A xenotype with a queen gene, or null.</returns>
 | 
			
		||||
        public static XenotypeDef TryGetQueenXenotype(Pawn pawn)
 | 
			
		||||
        public static Either<XenotypeDef,CustomXenotype> TryGetQueenXenotype(Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
            if (pawn == null)
 | 
			
		||||
                return null; 
 | 
			
		||||
| 
						 | 
				
			
			@ -84,8 +84,15 @@ namespace RJW_Genes
 | 
			
		|||
                var potentialXenotype = pawn.genes.Xenotype;
 | 
			
		||||
                if (potentialXenotype != null && potentialXenotype.genes.Contains(GeneDefOf.rjw_genes_queen))
 | 
			
		||||
                {
 | 
			
		||||
                    return potentialXenotype;
 | 
			
		||||
                    return new Either<XenotypeDef,CustomXenotype>(potentialXenotype);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                var potentialCustomXenotype = pawn.genes.CustomXenotype;
 | 
			
		||||
                if (potentialCustomXenotype != null && potentialCustomXenotype.genes.Contains(GeneDefOf.rjw_genes_queen))
 | 
			
		||||
                {
 | 
			
		||||
                    return new Either<XenotypeDef, CustomXenotype>(potentialCustomXenotype);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +105,7 @@ namespace RJW_Genes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="pawn"></param>
 | 
			
		||||
        /// <returns>A xenotype with a drone gene, or null.</returns>
 | 
			
		||||
        public static XenotypeDef TryGetDroneXenotype(Pawn pawn)
 | 
			
		||||
        public static Either<XenotypeDef,CustomXenotype> TryGetDroneXenotype(Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
            if (pawn == null)
 | 
			
		||||
                return null;
 | 
			
		||||
| 
						 | 
				
			
			@ -108,7 +115,13 @@ namespace RJW_Genes
 | 
			
		|||
                var potentialXenotype = pawn.genes.Xenotype;
 | 
			
		||||
                if (potentialXenotype != null && potentialXenotype.genes.Contains(GeneDefOf.rjw_genes_drone))
 | 
			
		||||
                {
 | 
			
		||||
                    return potentialXenotype;
 | 
			
		||||
                    return new Either<XenotypeDef,CustomXenotype>(potentialXenotype);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                var potentialCustomXenotype = pawn.genes.CustomXenotype;
 | 
			
		||||
                if (potentialCustomXenotype != null && potentialCustomXenotype.genes.Contains(GeneDefOf.rjw_genes_drone))
 | 
			
		||||
                {
 | 
			
		||||
                    return new Either<XenotypeDef, CustomXenotype>(potentialCustomXenotype);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -122,23 +135,35 @@ namespace RJW_Genes
 | 
			
		|||
        /// Prints a bigger piece of information when debug printing is enabled. 
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <returns>A mapping which Queen-Xenotypes should produce which worker genes.</returns>
 | 
			
		||||
 | 
			
		||||
        public static Dictionary<XenotypeDef,List<GeneDef>> GetQueenWorkerMappings()
 | 
			
		||||
        public static Dictionary<String,List<GeneDef>> GetQueenWorkerMappings()
 | 
			
		||||
        {
 | 
			
		||||
            Dictionary<XenotypeDef,List<GeneDef>> dict = new Dictionary<XenotypeDef, List<GeneDef>>();
 | 
			
		||||
            IEnumerable<QueenWorkerMappingDef> mappingDefs = DefDatabase<QueenWorkerMappingDef>.AllDefs;
 | 
			
		||||
 | 
			
		||||
            Dictionary<string, List<GeneDef>> results = new Dictionary<string, List<GeneDef>>();
 | 
			
		||||
 | 
			
		||||
            // Dev-Note: I first a nice lambda here, but I used nesting in favour of logging.
 | 
			
		||||
            foreach (QueenWorkerMappingDef mappingDef in mappingDefs)
 | 
			
		||||
            {
 | 
			
		||||
               
 | 
			
		||||
                // Option A) This is the default worker genes, expected, just ignore.
 | 
			
		||||
                if (mappingDef.defName == "rjw_genes_default_worker_genes")
 | 
			
		||||
                {
 | 
			
		||||
                    // Do nothing, there is no lookup but this entry is fine and should not log a warning. 
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                // Option B) The Xenotype is a "static" Xenotype, from a mod or something.
 | 
			
		||||
                XenotypeDef queenDef = DefDatabase<XenotypeDef>.GetNamed(mappingDef.queenXenotype);
 | 
			
		||||
                string defName = null;
 | 
			
		||||
                if (queenDef != null)
 | 
			
		||||
                {
 | 
			
		||||
                    defName = queenDef.defName;
 | 
			
		||||
                }
 | 
			
		||||
                else if (Current.Game != null && Current.Game.customXenotypeDatabase != null)
 | 
			
		||||
                {
 | 
			
		||||
                    // Option C) The Xenotype is a Custom Xenotype, created by the player
 | 
			
		||||
                    CustomXenotype customQueenDef = Current.Game.customXenotypeDatabase.customXenotypes.Find(f => f.name == mappingDef.defName);
 | 
			
		||||
                    defName = customQueenDef?.name;
 | 
			
		||||
                }
 | 
			
		||||
                if (defName != null)
 | 
			
		||||
                {
 | 
			
		||||
                    List<GeneDef> workerGenes = new List<GeneDef>();
 | 
			
		||||
                    foreach (string geneName in mappingDef.workerGenes)
 | 
			
		||||
| 
						 | 
				
			
			@ -149,15 +174,17 @@ namespace RJW_Genes
 | 
			
		|||
                        else if(RJW_Genes_Settings.rjw_genes_detailed_debug)
 | 
			
		||||
                            ModLog.Warning($"Could not look up Gene {geneName} for {mappingDef.queenXenotype}.");
 | 
			
		||||
                    }
 | 
			
		||||
                    dict.Add(queenDef, workerGenes);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    if (RJW_Genes_Settings.rjw_genes_detailed_debug) 
 | 
			
		||||
                        ModLog.Warning($"Did not find a matching xenotype for {mappingDef.queenXenotype}! Defaulting to rjw_genes_default_worker_genes.");
 | 
			
		||||
                }
 | 
			
		||||
                    results.Add(defName, workerGenes);
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            return dict;
 | 
			
		||||
                // Option D) Fallback, unknown
 | 
			
		||||
                if (RJW_Genes_Settings.rjw_genes_detailed_debug) 
 | 
			
		||||
                    ModLog.Warning($"Did not find a matching xenotype for {mappingDef.queenXenotype}! Defaulting to rjw_genes_default_worker_genes.");
 | 
			
		||||
                
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return results;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -203,6 +230,16 @@ namespace RJW_Genes
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public static String GetXenotypeDefName(Either<XenotypeDef, CustomXenotype> def)
 | 
			
		||||
        {
 | 
			
		||||
            if (def == null)
 | 
			
		||||
                return null;
 | 
			
		||||
            else if (def.isLeft)
 | 
			
		||||
                return def.left.defName;
 | 
			
		||||
            else
 | 
			
		||||
                return def.right.name;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static HiveOffspringChanceDef LookupDefaultHiveInheritanceChances()
 | 
			
		||||
        {
 | 
			
		||||
            IEnumerable<HiveOffspringChanceDef> offspringChanceDefs = DefDatabase<HiveOffspringChanceDef>.AllDefs;
 | 
			
		||||
| 
						 | 
				
			
			@ -217,11 +254,16 @@ namespace RJW_Genes
 | 
			
		|||
            return defaultChance;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static HiveOffspringChanceDef LookupHiveInheritanceChances(XenotypeDef queenDef)
 | 
			
		||||
        public static HiveOffspringChanceDef LookupHiveInheritanceChances(Either<XenotypeDef, CustomXenotype> queenDef)
 | 
			
		||||
        {
 | 
			
		||||
            if (queenDef == null)
 | 
			
		||||
                return LookupDefaultHiveInheritanceChances();
 | 
			
		||||
 | 
			
		||||
            String queenDefName = queenDef.isLeft ? queenDef.left.defName : queenDef.right.name;
 | 
			
		||||
 | 
			
		||||
            IEnumerable<HiveOffspringChanceDef> offspringChanceDefs = DefDatabase<HiveOffspringChanceDef>.AllDefs;
 | 
			
		||||
 | 
			
		||||
            return offspringChanceDefs.FirstOrFallback(t => t.queenXenotype == queenDef.defName, LookupDefaultHiveInheritanceChances());
 | 
			
		||||
            return offspringChanceDefs.FirstOrFallback(t => t.queenXenotype == queenDefName, LookupDefaultHiveInheritanceChances());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,8 +34,8 @@ namespace RJW_Genes
 | 
			
		|||
 | 
			
		||||
            Pawn pawn = (Pawn)__result;
 | 
			
		||||
 | 
			
		||||
            XenotypeDef queenDef = HiveBirthLogic.TryFindParentQueenXenotype(pawn) ?? TryFindParentQueenXenotypeFromEgg(__instance);
 | 
			
		||||
            XenotypeDef droneDef = HiveBirthLogic.TryFindParentDroneXenotype(pawn) ?? TryFindParentDroneXenotypeFromEgg(__instance);
 | 
			
		||||
            Either<XenotypeDef,CustomXenotype> queenDef = HiveBirthLogic.TryFindParentQueenXenotype(pawn) ?? TryFindParentQueenXenotypeFromEgg(__instance);
 | 
			
		||||
            Either<XenotypeDef, CustomXenotype> droneDef = HiveBirthLogic.TryFindParentDroneXenotype(pawn) ?? TryFindParentDroneXenotypeFromEgg(__instance);
 | 
			
		||||
 | 
			
		||||
            bool hasQueenParent = queenDef != null;
 | 
			
		||||
            bool hasDroneParent = droneDef != null;
 | 
			
		||||
| 
						 | 
				
			
			@ -47,6 +47,15 @@ namespace RJW_Genes
 | 
			
		|||
            } else
 | 
			
		||||
            {
 | 
			
		||||
                if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"Ignoring Postfix Hediff_InsectEgg::ProcessHumanLikeInsectEgg - No Queen Parent - No Action.");
 | 
			
		||||
 | 
			
		||||
                // Extra Debug for #56
 | 
			
		||||
                if (RJW_Genes_Settings.rjw_genes_detailed_debug)
 | 
			
		||||
                {
 | 
			
		||||
                    ModLog.Message($"Implanter was: ({__instance.implanter.genes.xenotypeName}|{__instance.implanter.genes.Xenotype}), Fertilizer was: ({__instance.father.genes.xenotypeName}|{__instance.father.genes.Xenotype})");
 | 
			
		||||
                    ModLog.Message($"Implanter Xenotype From helper: {HiveUtility.TryGetQueenXenotype(__instance.implanter)} and has Queen {__instance.implanter.genes.HasGene(GeneDefOf.rjw_genes_queen)}");
 | 
			
		||||
                    ModLog.Message($"Father Xenotype From helper: {HiveUtility.TryGetDroneXenotype(__instance.implanter)} and has Drone {__instance.father.genes.HasGene(GeneDefOf.rjw_genes_drone)}");
 | 
			
		||||
                    CustomXenotype custom = __instance.implanter.genes.CustomXenotype;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -59,9 +68,9 @@ namespace RJW_Genes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="egg">An Egg for which queens are looked up for</param>
 | 
			
		||||
        /// <returns>The relevant xenotypedef of a queen, or null.</returns>
 | 
			
		||||
        public static XenotypeDef TryFindParentQueenXenotypeFromEgg(Hediff_InsectEgg egg)
 | 
			
		||||
        public static Either<XenotypeDef, CustomXenotype> TryFindParentQueenXenotypeFromEgg(Hediff_InsectEgg egg)
 | 
			
		||||
        {
 | 
			
		||||
            XenotypeDef queenDef = null;
 | 
			
		||||
            Either<XenotypeDef, CustomXenotype> queenDef = null;
 | 
			
		||||
            if (egg == null)
 | 
			
		||||
                return null;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -85,9 +94,9 @@ namespace RJW_Genes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="egg">An Egg for which drones are looked up for</param>
 | 
			
		||||
        /// <returns>The relevant xenotypedef of a drone, or null.</returns>
 | 
			
		||||
        public static XenotypeDef TryFindParentDroneXenotypeFromEgg(Hediff_InsectEgg egg)
 | 
			
		||||
        public static Either<XenotypeDef, CustomXenotype> TryFindParentDroneXenotypeFromEgg(Hediff_InsectEgg egg)
 | 
			
		||||
        {
 | 
			
		||||
            XenotypeDef droneDef = null;
 | 
			
		||||
            Either<XenotypeDef, CustomXenotype> droneDef = null;
 | 
			
		||||
            if (egg == null)
 | 
			
		||||
                return null;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
using System.Collections.Generic;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using Verse;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -14,9 +15,8 @@ namespace RJW_Genes
 | 
			
		|||
            {
 | 
			
		||||
                ModLog.Message($"{HiveUtility.getQueenXenotypes().EnumerableCount()} Queen-Xenotypes ({string.Join(",", HiveUtility.getQueenXenotypes().Select(t => t.defName))})");
 | 
			
		||||
                ModLog.Message($"{HiveUtility.getDroneXenotypes().EnumerableCount()} Drone-Xenotypes ({string.Join(",", HiveUtility.getDroneXenotypes().Select(t => t.defName))})");
 | 
			
		||||
                ModLog.Message($"Found {HiveUtility.GetQueenWorkerMappings().Count} Queen-Worker Mappings  ({string.Join(",", HiveUtility.GetQueenWorkerMappings().Keys.Select(t => t.defName))} + Default) ");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                ModLog.Message($"Found {HiveUtility.GetQueenWorkerMappings().Count} Queen-Worker Mappings  ({string.Join(",", HiveUtility.GetQueenWorkerMappings().Keys.Select(t => t))} + Default) ");
 | 
			
		||||
                IEnumerable<HiveOffspringChanceDef> offspringChanceDefs = DefDatabase<HiveOffspringChanceDef>.AllDefs;
 | 
			
		||||
                IEnumerable<HiveOffspringChanceDef> faultOffspringDefs = offspringChanceDefs.Where(t => t.queenChance + t.workerChance + t.workerChance > 1.02 || t.queenChance + t.workerChance + t.workerChance < 0.98 );
 | 
			
		||||
                ModLog.Message($"Found {offspringChanceDefs.Count()} OffspringChanceDefs, of which {faultOffspringDefs.Count()} had faulty chances ({string.Join(",", faultOffspringDefs.Select(t => t.defName))})");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,6 +41,7 @@
 | 
			
		|||
    <Compile Include="Animal_Inheritance\Defs\BestialityGeneInheritanceDef.cs" />
 | 
			
		||||
    <Compile Include="Common\Defs\DistanceExtension.cs" />
 | 
			
		||||
    <Compile Include="Common\Defs\ModExtensionHelper.cs" />
 | 
			
		||||
    <Compile Include="Common\Either.cs" />
 | 
			
		||||
    <Compile Include="Common\ModLog.cs" />
 | 
			
		||||
    <Compile Include="Common\Defs\TickIntervalExtension.cs" />
 | 
			
		||||
    <Compile Include="GeneDefOf.cs" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue