diff --git a/1.6/Animal Genetics/Assemblies/Animal Genetics.dll b/1.6/Animal Genetics/Assemblies/Animal Genetics.dll index e28598f..463a17b 100644 Binary files a/1.6/Animal Genetics/Assemblies/Animal Genetics.dll and b/1.6/Animal Genetics/Assemblies/Animal Genetics.dll differ diff --git a/1.6/Assemblies/RJW_Menstruation.dll b/1.6/Assemblies/RJW_Menstruation.dll index 86b2376..74eb664 100644 Binary files a/1.6/Assemblies/RJW_Menstruation.dll and b/1.6/Assemblies/RJW_Menstruation.dll differ diff --git a/1.6/Humanoid Alien Races/Assemblies/HAR.dll b/1.6/Humanoid Alien Races/Assemblies/HAR.dll index 611da42..6dca0c8 100644 Binary files a/1.6/Humanoid Alien Races/Assemblies/HAR.dll and b/1.6/Humanoid Alien Races/Assemblies/HAR.dll differ diff --git a/1.6/Quirks/Assemblies/Quirks.dll b/1.6/Quirks/Assemblies/Quirks.dll index 91a4a19..0d767b3 100644 Binary files a/1.6/Quirks/Assemblies/Quirks.dll and b/1.6/Quirks/Assemblies/Quirks.dll differ diff --git a/1.6/Vanilla Expanded Core/Assemblies/VECore.dll b/1.6/Vanilla Expanded Core/Assemblies/VECore.dll index f47a501..4447a27 100644 Binary files a/1.6/Vanilla Expanded Core/Assemblies/VECore.dll and b/1.6/Vanilla Expanded Core/Assemblies/VECore.dll differ diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs index 4f40be0..c2b5218 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs @@ -966,6 +966,70 @@ namespace RJW_Menstruation } } + /// + /// Inject pawn's cum into womb + /// + /// + /// + /// + /// + public void CumIn(Hediff penis, float volume = -1.0f, float fertility = -1.0f, bool precum = false) + { + if(!Genital_Helper.is_penis(penis)) return; + HediffComp_SexPart comp = penis.TryGetComp(); + if (volume < 0) volume = Utility.GetCumVolume(penis.pawn, penis.TryGetComp()); + if (volume <= 0 || float.IsNaN(volume) || float.IsInfinity(volume)) + { + if (!precum) Log.Warning($"{penis.pawn}, {penis} trying to cum inside of {Pawn} with {volume} fluid"); + return; + } + + if (fertility < 0) fertility = (Genital_Helper.is_fertile_penis(penis) && !penis.pawn.SterileGenes()) ? penis.pawn.health.capacities.GetLevel(xxx.reproduction) : 0.0f; + + + if (!precum && Rand.Chance(PulloutChance(penis.pawn, fertility))) return; + if (Pawn.HasIUD()) fertility /= 100f; + float cumd = TotalCumPercent; + float tmp = TotalCum + volume; + if (tmp > CumCapacity) + { + float cumoutrate = 1 - (CumCapacity / tmp); + bool merged = false; + if (!cums.NullOrEmpty()) foreach (Cum cum in cums) + { + if (cum.pawn?.Equals(penis.pawn) ?? false) + { + cum.MergeWithCum(volume, fertility); + merged = true; + } + cum.DismishForce(cumoutrate); + } + if (!merged) cums.Add(new Cum(penis.pawn, volume * (1 - cumoutrate), fertility)); + } + else + { + + bool merged = false; + if (!cums.NullOrEmpty()) foreach (Cum cum in cums) + { + if (cum.pawn?.Equals(penis.pawn) ?? false) + { + cum.MergeWithCum(volume, fertility); + merged = true; + } + } + if (!merged) cums.Add(new Cum(penis.pawn, volume, fertility)); + } + cumd = TotalCumPercent - cumd; + + if (!precum) + { + Pawn.records.AddTo(VariousDefOf.AmountofCreampied, volume); + AfterCumIn(penis.pawn); + AfterFluidIn(cumd); + } + } + /// /// Inject pawn's fluid into womb /// diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs index 7ff4746..bac6bdc 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs @@ -1,10 +1,12 @@ using HarmonyLib; using RimWorld; +using rjw; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Reflection.Emit; +using UnityEngine; using Verse; namespace RJW_Menstruation @@ -50,6 +52,14 @@ namespace RJW_Menstruation { HediffComp_Menstruation comp = __instance.GetMenstruationCompFromPregnancy(); if (comp == null) return; + if (Configurations.EnableBirthVaginaMorph) + { + HediffComp_SexPart vaginaComp = comp.parent?.TryGetComp(); + if (vaginaComp == null) return; + float morph = Mathf.Max(LifeStageDefOf.HumanlikeBaby.bodySizeFactor - Mathf.Pow(vaginaComp.Size, 2), 0f); + vaginaComp.baseSize += morph * Configurations.VaginaMorphPower; + vaginaComp.UpdateSeverity(); + } comp.Pregnancy = null; } } diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs index fa25f4c..bf7bde2 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs @@ -1,5 +1,6 @@ using HarmonyLib; using RimWorld; +using RimWorld.Planet; using rjw; using rjw.Modules.Interactions; using System; @@ -29,12 +30,14 @@ namespace RJW_Menstruation HediffComp_Menstruation comp = mother.GetRandomMenstruationComp(true); if (comp == null) return true; - + if (Genital_Helper.has_penis_fertile(father, pawnparts) && PregnancyHelper.CanImpregnate(father, mother, sextype)) { if (MenstruationUtility.UsingCondom(father, mother)) return false; // Probably unnecessary + MenstruationImpregnate(father, mother, props); PregnancyHelper.DoImpregnate(father, mother); + return false; } else if (Genital_Helper.has_ovipositorM(father, pawnparts)) @@ -70,20 +73,88 @@ namespace RJW_Menstruation { SexInteraction interaction = props.interaction; - if (!interaction.HasInteractionTag(SexInteractionTag.Fertilization)) - return false; - - if (!props.isReceiver) + foreach ((var penetrator, var orifice) in props.resolved.Penetrations) { - return - interaction.Extension.initiatorRequirement.genitalTags.Contains(GenitalTag.CanPenetrate) && - interaction.Extension.recipientRequirement.genitalFamilies.Contains(GenitalFamily.Vagina); + if (penetrator.Owner == props.pawn && orifice.Owner == props.partner && penetrator.HasGenitalTag(GenitalTag.CanFertilize) && orifice.HasGenitalTag(GenitalTag.CanBeFertilized)) return true; } - else + return false; + } + + public static void MenstruationImpregnate(Pawn father, Pawn mother, SexProps props) + { + if (!mother.ShouldCycle()) return; + if (props.sexType == xxx.rjwSextype.Vaginal) { - return - interaction.Extension.initiatorRequirement.genitalFamilies.Contains(GenitalFamily.Vagina) && - interaction.Extension.recipientRequirement.genitalTags.Contains(GenitalTag.CanPenetrate); + HediffComp_Menstruation comp = mother.GetRandomMenstruationComp(true); + if (comp == null) + { + return; + } + else if (AndroidsCompatibility.IsAndroid(father) && !AndroidsCompatibility.AndroidPenisFertility(father)) + { + comp.CumIn(father, father.GetCumVolume(), 0); + return; + } + else comp.CumIn(father, father.GetCumVolume(), father.SterileGenes() ? 0.0f : father.health.capacities.GetLevel(xxx.reproduction)); + } + else if (props.sexType == xxx.rjwSextype.DoublePenetration) + { + List comps = mother.GetMenstruationComps().ToList(); + List penises = father.GetGenitalsList().Where(h => h.def is HediffDef_SexPart && Genital_Helper.is_penis(h)).ToList(); + if (comps.NullOrEmpty() || penises.NullOrEmpty()) + { + return; + } + else if (AndroidsCompatibility.IsAndroid(father) && !AndroidsCompatibility.AndroidPenisFertility(father)) + { + List randComps = comps.OrderByDescending(x => UnityEngine.Random.value).ToList(); + List randPenises = penises.OrderByDescending(x => UnityEngine.Random.value).ToList(); + if (comps.Count() > 1 && penises.Count() > 1) + { + randComps.ElementAt(0).CumIn(randPenises.ElementAt(0), fertility: 0); + randComps.ElementAt(1).CumIn(randPenises.ElementAt(1), fertility: 0); + } + else if (penises.Count > 1) + { + randComps.ElementAt(0).CumIn(randPenises.ElementAt(0), fertility: 0); + } + else + { + comps.ElementAt(0).CumIn(father, father.GetCumVolume(), 0); + return; + } + return; + } + else + { + List dangerComps = comps.OrderByDescending(x => x.IsDangerDay).ThenBy(x => UnityEngine.Random.value).ToList(); + if (RJWSettings.DevMode) + { + foreach (HediffComp_Menstruation comp in dangerComps) + { + Log.Message("MenstruationComps: " + comp.parent.Label + " , State: " + comp.GetCurStageLabel + " IsDangerDay = " + comp.IsDangerDay); + } + } + List productivePenises = penises.Where(x=>Genital_Helper.is_fertile_penis(x)).OrderByDescending(x => x.TryGetComp().FluidAmount).ToList(); + if (RJWSettings.DevMode) + { + foreach (Hediff penis in productivePenises) + { + Log.Message("Penis : " + penis.Label + " , Fluid amount: " + penis.TryGetComp().FluidAmount); + } + } + + if (comps.Count() > 1 && penises.Count() > 1) + { + dangerComps.ElementAt(0).CumIn(productivePenises.ElementAt(0)); + dangerComps.ElementAt(1).CumIn(productivePenises.ElementAt(1)); + } + else if (penises.Count > 1) + { + dangerComps.ElementAt(0).CumIn(productivePenises.ElementAt(0)); + } + else dangerComps.ElementAt(0).CumIn(father, father.GetCumVolume(), father.SterileGenes() ? 0.0f : father.health.capacities.GetLevel(xxx.reproduction)); + } } } } @@ -104,11 +175,9 @@ namespace RJW_Menstruation } else if (AndroidsCompatibility.IsAndroid(father) && !AndroidsCompatibility.AndroidPenisFertility(father)) { - comp.CumIn(father, father.GetCumVolume(), 0); return false; } - else comp.CumIn(father, father.GetCumVolume(), father.SterileGenes() ? 0.0f : father.health.capacities.GetLevel(xxx.reproduction)); - return false; + else return false; } } diff --git a/changelogs.txt b/changelogs.txt index 1beebcf..e404f99 100644 --- a/changelogs.txt +++ b/changelogs.txt @@ -1,4 +1,5 @@ Version 1.6.2.5 + - The vagina morph after birth setting will now apply to Biotech pregnancies. Version 1.6.2.4 - Fix error on startup and missing womb status in RJW tab with RJW 6.1.4.