From a9beb00a65026c749c5af52b6feedcf3c84f9082 Mon Sep 17 00:00:00 2001 From: ADHD_Coder Date: Mon, 17 Nov 2025 13:38:11 -0800 Subject: [PATCH 1/2] Ugly fix for Double Pen issue. --- .../HediffComps/HediffComp_Menstruation.cs | 64 ++++++++++++ .../RJW_Menstruation/Patch/RJW_Patch.cs | 99 ++++++++++++++++--- 2 files changed, 148 insertions(+), 15 deletions(-) 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 f8e807b..f173260 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 @@ -940,6 +940,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/RJW_Patch.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs index b1577ec..64df433 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; } } From d8b98ca05ed89d1adb0955a6a42e49816ba7ec75 Mon Sep 17 00:00:00 2001 From: lutepickle <28810-lutepickle@users.noreply.gitgud.io> Date: Mon, 8 Jun 2026 09:29:12 -0700 Subject: [PATCH 2/2] Fix patch to RJW tab with 6.1.4 --- .../Assemblies/Animal Genetics.dll | Bin 5632 -> 5632 bytes 1.6/Assemblies/RJW_Menstruation.dll | Bin 220160 -> 220160 bytes 1.6/Humanoid Alien Races/Assemblies/HAR.dll | Bin 5120 -> 5120 bytes 1.6/Patches/RJW_PawnTableDefs.xml | 6 ------ 1.6/Quirks/Assemblies/Quirks.dll | Bin 7680 -> 7680 bytes .../Assemblies/VECore.dll | Bin 5120 -> 5120 bytes .../HediffComps/HediffComp_Menstruation.cs | 8 ++++---- About/Manifest.xml | 2 +- changelogs.txt | 3 +++ 9 files changed, 8 insertions(+), 11 deletions(-) diff --git a/1.6/Animal Genetics/Assemblies/Animal Genetics.dll b/1.6/Animal Genetics/Assemblies/Animal Genetics.dll index 359163132e6fe3261eacd1c2eac05c7b14e737a0..e28598fd4b4facdbb2112795ddd9febb3b2bb98d 100644 GIT binary patch delta 68 zcmV-K0K5NyEPyPKhy+?BfTFRCoCy%EXy<|BA5Kn=m^MWk|3m|`I12az1fj5RNg{QHMoCy%{69iV*KU_?q!V$I!+9X)BI12az1S!^Tijy=A aG!W6R8OJhLLq@4kI*E*CWWTd`4TuQBDI0hI diff --git a/1.6/Assemblies/RJW_Menstruation.dll b/1.6/Assemblies/RJW_Menstruation.dll index 2dcbb04e4333a4baa21c4bbcb224395b3592c9be..86b237632be7015b90fcf5744aeecea8ebfd5468 100644 GIT binary patch delta 241 zcmZqJ!P~HdcR~k??UKZ<#-7$5#;rX})3{l-sd^S~SL0zi^hx04<-@xRwk+{!oocOc zOsLd!`;UK2H~cxxOilEREKLoKrwf=ft4;s!$83Ql=HSnqfW!qWIq%QxfG%bifT9ho zZfO9s7m_-lQR>s>1DVZ{#K7uW1DTx=V%skSGW#&H*!etsGF>5<*+k%t?v|Qe0ilk| S)LBne#!Wr9JtdfV4hH}WHcDy$ delta 241 zcmZqJ!P~HdcR~kCVCKywjXkYBj9Yt{rg5`GtNtn5uExW3=#v1G#l3mcj{12vNN1GV zB=rh!|M8FMhCipNnX#U+fr**HbOCc_wdw!;m@SaR9Q>IRkhowa=lz)-(8cTmP_%*7 zEe&AyLQ)4bN`1O~AhS7=7+76vAhQ!fZ2N^kW*1k*>>+>=BL aG!V@u%iZ@%NkyCub7=XY+i;0Ry>1Oaw&q?1Go aG!P^joX9N6>`A(lIKs)KH@dTk3wQ_&r5+mq diff --git a/1.6/Patches/RJW_PawnTableDefs.xml b/1.6/Patches/RJW_PawnTableDefs.xml index 3548ef3..edbc555 100644 --- a/1.6/Patches/RJW_PawnTableDefs.xml +++ b/1.6/Patches/RJW_PawnTableDefs.xml @@ -2,12 +2,6 @@ -
  • - /Defs/PawnTableDef[defName="RJW_PawnTable_Humanlikes"]/columns/li[text()="Pregnant"] - -
  • RJWMenstruation_Womb
  • - -
  • /Defs/PawnTableDef[defName="RJW_PawnTable_Colonists"]/columns/li[text()="Pregnant"] diff --git a/1.6/Quirks/Assemblies/Quirks.dll b/1.6/Quirks/Assemblies/Quirks.dll index 7f771af716e564632b1174b92df1e431c73b495e..91a4a19b19d85db5ac759d79ad10d7da71b70235 100644 GIT binary patch delta 78 zcmV-U0I~moJb*lqhynZ3~&dTGa8ow 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 188608b..afca25e 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 @@ -126,7 +126,7 @@ namespace RJW_Menstruation protected int? opcache = null; protected float antisperm = 0.0f; // RJW pregnancy, or Biotech pregnancy/labor/laborpushing - protected Hediff pregnancy = null; + protected Hediff pregnancy = null; // Remove, instead reference per-genital pregnancy list protected int eggLifeSpanTicks = GenDate.DaysToTicks(2); protected EstrusLevel estrusLevel = EstrusLevel.Visible; @@ -313,7 +313,7 @@ namespace RJW_Menstruation { StatDefOf.Fertility.Worker.ClearCacheForThing(Pawn); // No effect for now, but a future RW update might add caching for this calculatingOvulationChance = true; - ovulationChance *= PawnCapacityUtility.CalculateCapacityLevel(Pawn.health.hediffSet, xxx.reproduction); + ovulationChance *= PawnCapacityUtility.CalculateCapacityLevel(Pawn.health.hediffSet, xxx.reproduction); // Add genital fertility } finally { @@ -1481,7 +1481,7 @@ namespace RJW_Menstruation try { if (Configurations.Debug) Log.Message($"Implanting fertilized egg of {Pawn} into {parent}, father {egg.fertilizer}"); - if (pregnancy == null) + if (pregnancy == null) // Support pregnancy list, maybe split off into function { Configurations.PregnancyType usePregnancy = xxx.is_human(Pawn) ? Configurations.PregnancySource : Configurations.PregnancyType.MultiplePregnancy; switch (usePregnancy) @@ -1499,7 +1499,7 @@ namespace RJW_Menstruation case Configurations.PregnancyType.MultiplePregnancy: if (Configurations.Debug) Log.Message($"Creating new menstruation pregnancy"); - pregnancy = Hediff_BasePregnancy.Create(Pawn, egg.fertilizer); + pregnancy = Hediff_BasePregnancy.Create(Pawn, egg.fertilizer); // Add fertility comp of mother pregnant = true; deadeggs.Add(egg); break; diff --git a/About/Manifest.xml b/About/Manifest.xml index a0e5926..bef173d 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@ RJW Menstruation - 1.6.2.3 + 1.6.2.4 diff --git a/changelogs.txt b/changelogs.txt index fcd64af..7316879 100644 --- a/changelogs.txt +++ b/changelogs.txt @@ -1,3 +1,6 @@ +Version 1.6.2.4 + - Fix error on startup and missing womb status in RJW tab with RJW 6.1.4. + Version 1.6.2.3 - Fix multiple breasts not appearing in the menstruation UI. - Status of wombs now appears in RJW main tab, contributed by GhostClinic.