diff --git a/Common/Assemblies/Rjw-Genes.dll b/Common/Assemblies/Rjw-Genes.dll index 5e1c60b..bd8049f 100644 Binary files a/Common/Assemblies/Rjw-Genes.dll and b/Common/Assemblies/Rjw-Genes.dll differ diff --git a/Common/Defs/Genes/GeneDefs_Breeding.xml b/Common/Defs/Genes/GeneDefs_Breeding.xml index 7779b7f..fa65c52 100644 --- a/Common/Defs/Genes/GeneDefs_Breeding.xml +++ b/Common/Defs/Genes/GeneDefs_Breeding.xml @@ -15,7 +15,7 @@ rjw_genes_insectincubator Pawns with this gene are able to hold more insect eggs. - World/WorldObjects/Expanding/Mechanoids + Genes/Icons/More_Egg_Space 52 rjw_genes_breeding @@ -24,7 +24,7 @@ rjw_genes_insectbreeder Pawns with this gene are able to fertilize eggs with any fertile penis. - Genes/Icons/More_Egg_Space + World/WorldObjects/Expanding/Insects 53 rjw_genes_breeding diff --git a/Source/Genes/Breeding/Patch_EggFertilization.cs b/Source/Genes/Breeding/Patch_EggFertilization.cs new file mode 100644 index 0000000..46ec598 --- /dev/null +++ b/Source/Genes/Breeding/Patch_EggFertilization.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using HarmonyLib; +using Verse; +using rjw; + +namespace RJW_Genes +{ + /// + /// This Class patches the AfterSexUtility to also fertilize eggs if Pawn A has "InsectBreeder" and Pawn B has Insect Eggs. + /// Patched Class is https://gitgud.io/Ed86/rjw/-/blob/master/1.4/Source/Common/Helpers/SexUtility.cs + /// + /// Normal Egg-Pregnancy logic is in https://gitgud.io/Ed86/rjw/-/blob/master/1.4/Source/Modules/Pregnancy/Pregnancy_Helper.cs + /// + [HarmonyPatch(typeof(SexUtility), "Aftersex")] + static class PatchEggFertilizationHelper + { + [HarmonyTranspiler] + public static void Postfix(SexProps props) + { + // Only Fertilize on vaginal / anal sex + if (!(props.sexType == xxx.rjwSextype.Vaginal || props.sexType == xxx.rjwSextype.Anal)) + { + return; + } + + + if (canDoEggFertilization(props.pawn, props.partner)) + { + // Pawn has gene and Partner has eggs + if (props.pawn.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder) && !getEggsforPawn(props.partner).NullOrEmpty()) + { + Pawn eggHolder = props.partner; + Pawn impregnator = props.pawn; + + foreach (Hediff_InsectEgg egg in getEggsforPawn(eggHolder)) + { + if (!egg.fertilized) + egg.Fertilize(impregnator); + } + } + + // Partner has gene and Pawn has eggs + if (props.partner.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder) && !getEggsforPawn(props.pawn).NullOrEmpty()) + { + Pawn eggHolder = props.pawn; + Pawn impregnator = props.partner; + + foreach (Hediff_InsectEgg egg in getEggsforPawn(eggHolder)) + { + if (!egg.fertilized) + egg.Fertilize(impregnator); + } + } + + + } + } + + + private static Boolean canDoEggFertilization(Pawn a, Pawn b) + { + + // No Partner / Other Errors + if (a != null || b != null) + return false; + // None of the pawns has the relevant gene + if (!a.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder) && !b.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder)) + return false; + // None of the pawns has eggs + if (getEggsforPawn(a).NullOrEmpty() && getEggsforPawn(b).NullOrEmpty()) + return false; + + // A has gene and B has eggs + if (a.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder) && !getEggsforPawn(b).NullOrEmpty()) + { + return true; + } + // B has gene and A has eggs + if (b.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder) && !getEggsforPawn(a).NullOrEmpty()) + { + return true; + } + // Any other case: Do nothing + return false; + } + + private static List getEggsforPawn(Pawn pawn) + { + List eggs = new List(); + pawn.health.hediffSet.GetHediffs(ref eggs); + foreach (var egg in eggs) + egg.Fertilize(pawn); + + return eggs; + } + } +} diff --git a/Source/Genes/Genitalia/GenitaliaUtility.cs b/Source/Genes/Genitalia/GenitaliaUtility.cs index e11f06f..4dc289a 100644 --- a/Source/Genes/Genitalia/GenitaliaUtility.cs +++ b/Source/Genes/Genitalia/GenitaliaUtility.cs @@ -23,16 +23,17 @@ namespace RJW_Genes if (!gene.Overridden) return gene.def; } - - return GeneDefOf.rjw_genes_human_genitalia; + return null; } public static HediffDef GetPenisForGene(GeneDef gene) { + if (gene == null) + return Genital_Helper.average_penis; + switch (gene.defName) { - case "rjw_genes_human_genitalia": return Genital_Helper.average_penis; case "rjw_genes_equine_genitalia": return Genital_Helper.equine_penis; case "rjw_genes_canine_genitalia": return Genital_Helper.canine_penis; case "rjw_genes_feline_genitalia": return Genital_Helper.feline_penis; @@ -48,9 +49,11 @@ namespace RJW_Genes public static HediffDef GetVaginaForGene(GeneDef gene) { + if (gene == null) + return Genital_Helper.average_vagina; + switch (gene.defName) { - case "rjw_genes_human_genitalia": return Genital_Helper.average_vagina; case "rjw_genes_equine_genitalia": return Genital_Helper.equine_vagina; case "rjw_genes_canine_genitalia": return Genital_Helper.canine_vagina; case "rjw_genes_feline_genitalia": return Genital_Helper.feline_vagina; @@ -65,10 +68,11 @@ namespace RJW_Genes public static HediffDef GetAnusForGene(GeneDef gene) { + if (gene == null) + return Genital_Helper.average_anus; switch (gene.defName) { //TODO: Do I want the default to be generic or average for feline,equine and canine? - case "rjw_genes_human_genitalia": return Genital_Helper.average_anus; case "rjw_genes_equine_genitalia": return Genital_Helper.average_anus; case "rjw_genes_canine_genitalia": return Genital_Helper.average_anus; case "rjw_genes_feline_genitalia": return Genital_Helper.average_anus; @@ -83,10 +87,12 @@ namespace RJW_Genes public static HediffDef GetBreastsForGene(GeneDef gene) { + if (gene == null) + return Genital_Helper.average_breasts; + switch (gene.defName) { //TODO: Do I want the default to be generic or average? - case "rjw_genes_human_genitalia": return Genital_Helper.average_breasts; case "rjw_genes_equine_genitalia": return Genital_Helper.average_breasts; case "rjw_genes_canine_genitalia": return Genital_Helper.average_breasts; case "rjw_genes_feline_genitalia": return Genital_Helper.average_breasts; diff --git a/Source/Rjw-Genes.csproj b/Source/Rjw-Genes.csproj index 4f0beb0..94d2403 100644 --- a/Source/Rjw-Genes.csproj +++ b/Source/Rjw-Genes.csproj @@ -70,11 +70,12 @@ - + + @@ -99,10 +100,6 @@ - - - - @@ -116,7 +113,6 @@ -