code:
using RimWorld;
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Verse;
using Verse.Sound;

namespace RJW_Menstruation
{
    public class Dialog_WombStatus : Window
    {
        public Pawn pawn;
        private HediffComp_Menstruation comp;
        private const float windowMargin = 20f;
        private const float pawnRectWidth = 150f;
        private const float pawnRectHeight = 150f;
        private const float wombRectHeight = 300f;
        private const float wombRectWidth = 300f;
        private const float fontheight = 30;
        private const float genitalRectWidth = 102;
        private const float genitalRectHeight = 140;
        private const float breastRectWidth = 102;
        private const float breastRectHeight = 100;

        private static bool naked = false;

        private Texture2D womb;
        private Texture2D cum;
        private Texture2D vagina;
        private Texture2D anal;
        private Color cumcolor;

        private static GUIStyle fontstylecenter = null;
        private static GUIStyle fontstyleright = null;
        private static GUIStyle fontstyleleft = null;
        private static GUIStyle boxstyle = null;
        private static GUIStyle buttonstyle = null;

        public Pawn Pawn
        {
            get
            {
                return pawn;
            }
        }
        public HediffComp_Menstruation Comp
        {
            get
            {
                return comp;
            }
        }

        public override Vector2 InitialSize
        {
            get
            {
                float width = 450f + 2 * windowMargin;
                float height = 780f + 2 * windowMargin;
                if (!Configurations.DrawWombStatus) height -= wombRectHeight;
                if (!Configurations.DrawVaginaStatus || pawn.IsAnimal()) width -= 150f;
                return new Vector2(width, height);
            }
        }

        public Dialog_WombStatus(Pawn pawn, HediffComp_Menstruation comp)
        {
            this.pawn = pawn;
            this.comp = comp;
        }

        public void ChangePawn(Pawn pawn, HediffComp_Menstruation comp)
        {

            if (this.pawn.IsAnimal() && !pawn.IsAnimal()) windowRect.width += 150f;
            else if (!this.pawn.IsAnimal() && pawn.IsAnimal()) windowRect.width -= 150f;
            this.pawn = pawn;
            this.comp = comp;
        }

        public static void ToggleWindow(Pawn pawn, HediffComp_Menstruation comp)
        {
            Dialog_WombStatus window = (Dialog_WombStatus)Find.WindowStack.Windows.FirstOrDefault(x => x.GetType().Equals(typeof(Dialog_WombStatus)));
            if (window != null)
            {
                List<Pawn> pawns = Find.Selector.SelectedPawns.FindAll(x => x.ShouldShowWombGizmo());
                if (Input.GetKey(VariousDefOf.OpenStatusWindowKey.MainKey) && !pawns.NullOrEmpty() && pawns.Count > 1)
                {
                    int index = pawns.IndexOf(window.pawn);
                    SoundDefOf.TabOpen.PlayOneShotOnCamera();
                    Pawn newpawn = pawns[(index + 1) % pawns.Count];
                    window.ChangePawn(newpawn, newpawn.GetFirstMenstruationComp());
                }
                else if (window.pawn != pawn)
                {
                    SoundDefOf.TabOpen.PlayOneShotOnCamera();
                    window.ChangePawn(pawn, comp);
                }
                else Find.WindowStack.TryRemove(typeof(Dialog_WombStatus), true);
            }
            else
            {
                SoundDefOf.InfoCard_Open.PlayOneShotOnCamera();
                Find.WindowStack.Add(new Dialog_WombStatus(pawn, comp));
            }

        }

        public override void DoWindowContents(Rect inRect)
        {
            soundClose = SoundDefOf.InfoCard_Close;
            //closeOnClickedOutside = true;
            absorbInputAroundWindow = false;
            forcePause = false;
            preventCameraMotion = false;
            draggable = true;
            //resizeable = true;

            if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.Escape))
            {
                Event.current.Use();
            }

            Rect windowRect = inRect.ContractedBy(windowMargin);
            Rect mainRect = new Rect(windowRect.x, windowRect.y, windowRect.width, windowRect.height);
            Rect closeRect = new Rect(windowRect.xMax, 0f, 20f, 20f);
            MainContents(mainRect);
            if (Widgets.CloseButtonFor(closeRect))
            {
                Close();
            }
            closeRect.x -= 20f;

        }

        public override void PreOpen()
        {
            base.PreOpen();
            if (fontstylecenter == null) fontstylecenter = new GUIStyle() { alignment = TextAnchor.MiddleCenter };
            if (fontstyleright == null) fontstyleright = new GUIStyle() { alignment = TextAnchor.MiddleRight };
            if (fontstyleleft == null) fontstyleleft = new GUIStyle() { alignment = TextAnchor.MiddleLeft };
            if (boxstyle == null) boxstyle = new GUIStyle(GUI.skin.textArea);
            if (buttonstyle == null) buttonstyle = new GUIStyle(GUI.skin.button);
        }

        private void MainContents(Rect mainRect)
        {

            boxstyle.hover = boxstyle.normal;
            boxstyle.onHover = boxstyle.normal;
            boxstyle.onNormal = boxstyle.normal;

            buttonstyle.onHover = buttonstyle.onNormal;
            buttonstyle.hover = buttonstyle.normal;
            boxstyle.border.left = 4; boxstyle.border.right = 4; boxstyle.border.bottom = 4; boxstyle.border.top = 4;

            fontstyleleft.normal.textColor = Color.white;

            float preginfoheight = 0f;
            Hediff hediff = comp.Pregnancy;
            if (hediff != null && Utility.ShowFetusImage(hediff))
            {
                womb = comp.GetPregnancyIcon(hediff);
                if (hediff is Hediff_MultiplePregnancy m)
                {
                    if (m.GestationProgress < 0.2f) cum = comp.GetCumIcon();
                    else cum = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
                    Pawn fetus = comp.GetFetus();
                    if (fetus != null && Utility.ShowFetusInfo())
                    {
                        string feinfo = PregnancyCommon.GetBabyInfo(m.babies);
                        string fainfo = PregnancyCommon.GetFatherInfo(m.babies, m.pawn, m.is_parent_known) + "  ";
                        if (feinfo.Length + fainfo.Length > 45)
                        {
                            preginfoheight = fontheight + 2;
                            buttonstyle.alignment = TextAnchor.UpperLeft;
                            fontstyleright.alignment = TextAnchor.LowerRight;
                        }
                        else
                        {
                            preginfoheight = fontheight;
                            buttonstyle.alignment = TextAnchor.MiddleLeft;

                        }
                        Rect preginfo = new Rect(0f, mainRect.yMax - wombRectHeight - 2, wombRectWidth, preginfoheight);
                        fontstyleright.normal.textColor = Color.white;
                        GUI.Box(preginfo, feinfo, buttonstyle);
                        GUI.Label(preginfo, fainfo, fontstyleright);
                    }

                }
                else if (hediff is Hediff_BasePregnancy b)
                {
                    if (b.GestationProgress < 0.2f) cum = comp.GetCumIcon();
                    else cum = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
                    Pawn fetus = comp.GetFetus();
                    if (fetus != null && Utility.ShowFetusInfo())
                    {
                        preginfoheight = fontheight;
                        Rect preginfo = new Rect(0f, mainRect.yMax - wombRectHeight - 2, wombRectWidth, preginfoheight);
                        fontstyleright.normal.textColor = Color.white;
                        fontstyleright.alignment = TextAnchor.MiddleRight;
                        buttonstyle.alignment = TextAnchor.MiddleLeft;

                        string father;

                        if (!b.is_parent_known && Configurations.InfoDetail != Configurations.DetailLevel.All)
                            father = Translations.Dialog_FatherUnknown;
                        else
                            father = b.father.LabelShort;

                        GUI.Box(preginfo, b.babies.Count + " " + fetus.def.label + " " + Translations.Dialog_WombInfo02, buttonstyle);
                        GUI.Label(preginfo, Translations.Dialog_WombInfo03 + ": " + father + "  ", fontstyleright);
                    }
                }
                else if (hediff is HediffWithParents p)
                {
                    if (p is Hediff_Pregnant hp && hp.Severity < 0.2f) cum = comp.GetCumIcon();
                    else cum = ContentFinder<Texture2D>.Get("Womb/Empty", true);
                    HediffComp_PregeneratedBabies babiescomp = p.TryGetComp<HediffComp_PregeneratedBabies>();
                    if (Utility.ShowFetusInfo())
                    {
                        string feinfo = PregnancyCommon.GetBabyInfo(babiescomp?.babies);
                        string fainfo = PregnancyCommon.GetFatherInfo(babiescomp?.babies, babiescomp.Pawn, true) + "  ";    // Keep all parents known, for now

                        if (feinfo == "Null") feinfo = "1 " + (p.Mother ?? pawn).def.label + " " + Translations.Dialog_WombInfo02;
                        if (fainfo == "Null  ")
                        {
                            string father = p.Father?.LabelShort ?? Translations.Dialog_FatherUnknown;
                            fainfo = Translations.Dialog_WombInfo03 + ": " + father + "  ";
                        }

                        if (feinfo.Length + fainfo.Length > 45)
                        {
                            preginfoheight = fontheight + 2;
                            buttonstyle.alignment = TextAnchor.UpperLeft;
                            fontstyleright.alignment = TextAnchor.LowerRight;
                        }
                        else
                        {
                            preginfoheight = fontheight;
                            buttonstyle.alignment = TextAnchor.MiddleLeft;

                        }

                        Rect preginfo = new Rect(0f, mainRect.yMax - wombRectHeight - 2, wombRectWidth, preginfoheight);
                        fontstyleright.normal.textColor = Color.white;
                        GUI.Box(preginfo, feinfo, buttonstyle);
                        GUI.Label(preginfo, fainfo, fontstyleright);
                    }
                }
                else cum = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
            }
            else
            {
                womb = comp.GetWombIcon();
                cum = comp.GetCumIcon();
            }

            Rect pawnRect = new Rect(0, 0, pawnRectWidth, pawnRectHeight);
            Widgets.DrawTextureFitted(pawnRect, PortraitsCache.Get(pawn, pawnRect.size, Rot4.South, default, 1, true, true, false, !naked), 1.0f);
            if (Widgets.ButtonInvisible(pawnRect))
            {
                naked = !naked;
            }
            Rect pawnLabelRect = new Rect(0, pawnRectHeight, pawnRectWidth, fontheight - 10);
            Rect pawnLabel2Rect = new Rect(0, pawnRectHeight + fontheight - 10, pawnRectWidth, fontheight - 10);
            fontstylecenter.normal.textColor = pawn.DrawColor;
            GUI.Label(pawnLabelRect, pawn.Name?.ToStringFull ?? pawn.Label, fontstylecenter);
            if (pawn.story != null) GUI.Label(pawnLabel2Rect, pawn.ageTracker.AgeBiologicalYears + ", " + pawn.story.Title, fontstylecenter);
            GUI.color = Color.white;

            float wombrecth = 0;
            if (Configurations.DrawWombStatus)
            {
                wombrecth = wombRectHeight;
                cumcolor = comp.GetCumMixtureColor;
                Rect wombRect = new Rect(0f, mainRect.yMax - wombRectHeight + preginfoheight, wombRectWidth, wombRectWidth * 0.9f);
                DrawWomb(wombRect);

                if (Configurations.DrawEggOverlay)
                {
                    comp.DrawEggOverlay(wombRect, true);
                }

            }

            Rect wombInfoRect = new Rect(0f, mainRect.yMax - wombrecth - fontheight - 2, wombRectWidth, fontheight - 4f);
            Rect progressRect = new Rect(wombInfoRect.x, wombInfoRect.yMax, wombRectWidth, 4f);
            buttonstyle.normal.textColor = Color.white;
            //boxstyle.normal.background = Texture2D.whiteTexture;
            buttonstyle.alignment = TextAnchor.MiddleLeft;
            GUI.backgroundColor = new Color(0.24f, 0.29f, 0.35f, 1);
            GUI.Box(wombInfoRect, Translations.Dialog_WombInfo01 + ": " + comp.GetCurStageLabel, buttonstyle);
            Widgets.FillableBar(progressRect, comp.StageProgress, comp.GetStageTexture);
            GUI.color = Color.white;
            TooltipHandler.TipRegion(wombInfoRect, comp.GetCurStageDesc);

            fontstyleright.normal.textColor = Color.red;
            fontstyleright.alignment = TextAnchor.MiddleRight;
            //if (comp.GetFertilization) GUI.Label(wombInfoRect, Translations.Dialog_WombInfo05 + "  ", fontstyleright);
            //else if (comp.GetEggFertilizing) GUI.Label(wombInfoRect, Translations.Dialog_WombInfo06 + "  ", fontstyleright);
            //else if (comp.GetEgg) GUI.Label(wombInfoRect, Translations.Dialog_WombInfo07 + "  ", fontstyleright);
            GUI.Label(wombInfoRect, comp.GetFertilizingInfo + "  ", fontstyleright);

            //Widgets.Label(wombInfoRect,Translations.Dialog_WombInfo01 + ": " + comp.GetCurStageLabel);

            Rect cumlistTitle, cumlistRect;
            if (Configurations.DrawVaginaStatus && !pawn.IsAnimal())
            {
                Rect genitalRect = new Rect(pawnRectWidth + 24, pawnRectHeight + 2 * fontheight, genitalRectWidth, genitalRectHeight + fontheight * 2);
                Rect breastRect = new Rect(pawnRectWidth + 24, 40f, breastRectWidth, breastRectHeight + fontheight);
                DrawVagina(genitalRect, comp);
                DrawBreast(breastRect);
                cumlistTitle = new Rect(wombRectWidth + 4f, 0, 150f, fontheight);
                cumlistRect = new Rect(wombRectWidth + 4f, fontheight, 150f, mainRect.yMax - fontheight + preginfoheight + 3);
            }
            else
            {
                cumlistTitle = new Rect(pawnRectWidth, 0, 150f, fontheight);
                cumlistRect = new Rect(pawnRectWidth, fontheight, 150f, mainRect.yMax - wombRectHeight - fontheight);
            }

            Rect infoRect = new Rect(0, pawnRectHeight + 2 * fontheight, pawnRectWidth, pawnRect.yMax + 2 * fontheight - wombInfoRect.y);
            DrawInfos(infoRect);

            GUI.Label(cumlistTitle, Translations.Dialog_WombInfo04);
            DrawCumlist(cumlistRect);

        }

        private void DrawCumlist(Rect rect)
        {
            Listing_Standard cumlist = new Listing_Standard
            {
                maxOneColumn = true,
                ColumnWidth = wombRectWidth - pawnRectWidth
            };
            cumlist.Begin(rect);
            Listing_Standard cumlistsection = cumlist.BeginSection(rect.height - fontheight - 12f);
            foreach (string s in comp.GetCumsInfo)
            {
                cumlistsection.Label(s);
            }
            cumlist.EndSection(cumlistsection);
            cumlist.End();
        }

        private void DrawWomb(Rect rect)
        {
            GUI.color = new Color(1.00f, 0.47f, 0.47f, 1);
            GUI.Box(rect, "", boxstyle);
            //GUI.color = Color.white;
            //Widgets.DrawTextureFitted(wombRect, womb,1.0f);
            //GUI.color = cumcolor;
            //Widgets.DrawTextureFitted(wombRect, cum,1.0f);
            GUI.DrawTexture(rect, womb, ScaleMode.ScaleToFit, true, 0, Color.white, 0, 0);
            GUI.DrawTexture(rect, cum, ScaleMode.ScaleToFit, true, 0, cumcolor, 0, 0);

            GUI.color = Color.white;

        }

        private void DrawVagina(Rect rect, HediffComp_Menstruation comp)
        {
            Rect genitalIconRect = new Rect(rect.x, rect.y + fontheight, genitalRectWidth, genitalRectHeight);
            Rect genitalVaginaLabelRect = new Rect(rect.x, rect.y + 10f, genitalRectWidth, fontheight);
            Rect genitalAnusLabelRect = new Rect(rect.x, rect.y + fontheight + genitalRectHeight, genitalRectWidth, fontheight);

            vagina = pawn.GetGenitalIcon(comp);
            anal = pawn.GetAnalIcon();
            GUI.color = new Color(1.00f, 0.47f, 0.47f, 1);
            GUI.Box(rect, "", boxstyle);
            GUI.color = Utility.SafeSkinColor(pawn);
            //Widgets.DrawTextureFitted(genitalIconRect, anal, 1.0f);
            //Widgets.DrawTextureFitted(genitalIconRect, vagina, 1.0f);
            GUI.DrawTexture(genitalIconRect, anal, ScaleMode.ScaleToFit);
            GUI.DrawTexture(genitalIconRect, vagina, ScaleMode.ScaleToFit);

            GUI.color = Color.white;
            GUI.Label(genitalVaginaLabelRect, pawn.GetVaginaLabel(), fontstylecenter);
            GUI.Label(genitalAnusLabelRect, pawn.GetAnusLabel(), fontstylecenter);
        }

        private void DrawBreast(Rect rect)
        {
            Rect BreastIconRect = new Rect(rect.x, rect.y + fontheight, breastRectWidth, breastRectHeight);
            Rect BreastLabelRect = new Rect(rect.x, rect.y, breastRectWidth, fontheight);
            Rect MilkGaugeRect = new Rect(rect.x, rect.yMax, breastRectWidth, 20f);

            GUI.color = new Color(1.00f, 0.47f, 0.47f, 1);
            GUI.Box(rect, "", boxstyle);

            pawn.DrawBreastIcon(BreastIconRect);

            GUI.color = Color.white;
            GUI.Label(BreastLabelRect, pawn.GetBreastLabel(), fontstylecenter);

            pawn.DrawMilkBars(MilkGaugeRect);

        }

        private void DrawInfos(Rect rect)
        {
            Rect lineRect = new Rect(rect.x, rect.y, rect.width, 20f);
            float statvalue;
            const float height = 24f;
            statvalue = pawn.GetStatValue(xxx.sex_drive_stat);
            FillableBarLabeled(lineRect, "  " + xxx.sex_drive_stat.LabelCap.CapitalizeFirst() + " " + statvalue.ToStringPercent(), statvalue / 2, TextureCache.OvulatoryTexture, Texture2D.blackTexture, xxx.sex_drive_stat.description);
            lineRect.y += height;

            statvalue = pawn.GetStatValue(xxx.vulnerability_stat);
            FillableBarLabeled(lineRect, "  " + xxx.vulnerability_stat.LabelCap.CapitalizeFirst() + " " + statvalue.ToStringPercent(), statvalue / 2, TextureCache.BleedingTexture, Texture2D.blackTexture, xxx.vulnerability_stat.description);
            lineRect.y += height;

            statvalue = pawn.records.GetValue(xxx.CountOfBirthHuman);
            FillableBarLabeled(lineRect, "  " + xxx.CountOfBirthHuman.LabelCap.CapitalizeFirst() + " " + statvalue, statvalue / 10, TextureCache.FollicularTexture, Texture2D.blackTexture, xxx.CountOfBirthHuman.description);
            lineRect.y += height;

            statvalue = pawn.records.GetValue(xxx.CountOfBirthAnimal);
            FillableBarLabeled(lineRect, "  " + xxx.CountOfBirthAnimal.LabelCap.CapitalizeFirst() + " " + statvalue, statvalue / 20, TextureCache.AnimalTexture, Texture2D.blackTexture, xxx.CountOfBirthAnimal.description);
            lineRect.y += height;

            statvalue = pawn.records.GetValue(xxx.CountOfBirthEgg);
            FillableBarLabeled(lineRect, "  " + xxx.CountOfBirthEgg.LabelCap.CapitalizeFirst() + " " + statvalue, statvalue / 100, TextureCache.RecoverTexture, Texture2D.blackTexture, xxx.CountOfBirthEgg.description);
            lineRect.y += height * 3;

            if (ModsConfig.BiotechActive && xxx.is_human(pawn))
            {
                statvalue = comp.OvulationChance;
                FillableBarLabeled(lineRect, "  " + Translations.OvulationChanceLabel(statvalue.ToStringPercent()), statvalue, TextureCache.LutealTexture, Texture2D.blackTexture, Translations.OvulationChanceDesc);
            }
            lineRect.y += height;

            statvalue = Configurations.ImplantationChance * comp.ImplantChance;
            float fertchance = comp.GetFertilityChance();
            FillableBarLabeled(lineRect, "  " + xxx.reproduction.LabelCap.CapitalizeFirst() + " " + statvalue.ToStringPercent(), statvalue, TextureCache.LutealTexture, Texture2D.blackTexture, Translations.FertilityDesc(string.Format("{0:0.##}", fertchance * 100)));
            Rect overlayRect = new Rect(lineRect.x, lineRect.y, lineRect.width * Math.Min(1.0f, fertchance), lineRect.height);
            GUI.DrawTexture(overlayRect, TextureCache.FertChanceTex);
            lineRect.y += height;
        }

        private void FillableBarLabeled(Rect rect, string label, float fillPercent, Texture2D filltexture, Texture2D bgtexture, string tooltip = null)
        {
            Widgets.FillableBar(rect, Math.Min(fillPercent, 1.0f), filltexture, bgtexture, true);
            GUI.Label(rect, label, fontstyleleft);
            Widgets.DrawHighlightIfMouseover(rect);
            if (tooltip != null) TooltipHandler.TipRegion(rect, tooltip);
        }

    }
}


code:
using UnityEngine;
using Verse;

namespace RJW_Menstruation
{
    public class Gizmo_Womb : Command_Action
    {
        public Texture2D icon_overlay;
        public Color cumcolor;
        public HediffComp_Menstruation comp;

        public const float progressbarHeight = 2f;

        public override void DrawIcon(Rect rect, Material buttonMat, GizmoRenderParms parms)
        {
            Texture badTex = icon;
            Texture2D overlay = icon_overlay;
            Color color = cumcolor;

            if (badTex == null)
            {
                badTex = BaseContent.BadTex;
            }
            if (overlay == null)
            {
                overlay = BaseContent.BadTex;
            }
            if (color == null) color = Color.white;
            rect.position += new Vector2(iconOffset.x * rect.size.x, iconOffset.y * rect.size.y);
            GUI.color = IconDrawColor;
            Widgets.DrawTextureFitted(rect, badTex, this.iconDrawScale * 0.85f, this.iconProportions, this.iconTexCoords, this.iconAngle, buttonMat);
            GUI.color = color;
            Widgets.DrawTextureFitted(rect, overlay, iconDrawScale * 0.85f, iconProportions, iconTexCoords, iconAngle, buttonMat);
            GUI.color = Color.white;
            if (Configurations.DrawEggOverlay) comp.DrawEggOverlay(rect, false);
            Rect progressRect = new Rect(rect.x + 2f, rect.y, rect.width - 4f, progressbarHeight);
            Widgets.FillableBar(progressRect, comp.StageProgress, comp.GetStageTexture);

        }

        public override bool GroupsWith(Gizmo other)
        {
            if (other is Gizmo_Womb womb && womb.comp != this.comp) return false;
            else return base.GroupsWith(other);
        }

    }
}

license: unknown


code:
using RimWorld;
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Verse;
using Verse.Sound;

namespace RJW_Menstruation
{
    public static class Colors
    {
        public static Color blood = new Color(0.78f, 0, 0);
        //public static Color nippleblack = new Color(0.215f, 0.078f, 0); // 81,20,0
        public static ColorInt white = new ColorInt(255, 255, 255, 255);

        public static Color CMYKLerp(Color a, Color b, float t)
        {
            RGBtoCMYK(a, out float ac, out float am, out float ay, out float ak);
            RGBtoCMYK(b, out float bc, out float bm, out float by, out float bk);

            return CMYKtoRGB(Mathf.Lerp(ac, bc, t), Mathf.Lerp(am, bm, t), Mathf.Lerp(ay, by, t), Mathf.Lerp(ak, bk, t));
        }

        public static void RGBtoCMYK(Color rgb, out float c, out float m, out float y, out float k)
        {
            k = 1 - Math.Max(rgb.r, Math.Max(rgb.g, rgb.b));
            c = (1 - rgb.r - k) / (1 - k);
            m = (1 - rgb.g - k) / (1 - k);
            y = (1 - rgb.b - k) / (1 - k);

        }

        public static Color CMYKtoRGB(float c, float m, float y, float k)
        {
            return new Color((1 - c) * (1 - k), (1 - m) * (1 - k), (1 - y) * (1 - k));
        }

    }

    public static class Utility
    {
        public static PawnKindDef GetRacesPawnKind(Pawn pawn)
        {
            if (pawn == null) return null;
            if (pawn.kindDef?.race == pawn.def) return pawn.kindDef;
            return VariousDefOf.AllKinds.Find(kind => kind.race == pawn.def && kind.defName.Contains("Colonist")) ??
                VariousDefOf.AllKinds.Find(kind => kind.race == pawn.def) ??
                pawn.RaceProps?.AnyPawnKind ??
                pawn.kindDef;
        }

        public static float GetCumVolume(this Pawn pawn)
        {
            List<Hediff> hediffs = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn));
            if (hediffs.NullOrEmpty()) return 0;
            else return pawn.GetCumVolume(hediffs);
        }

        public static float GetCumVolume(this Pawn pawn, List<Hediff> hediffs)
        {
            CompHediffBodyPart part = (((hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("penis")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>()) ??
                (hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorf")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>())) ??
                (hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>())) ??
                (hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("tentacle")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>());
            return pawn.GetCumVolume(part);
        }

        public static float GetCumVolume(this Pawn pawn, CompHediffBodyPart part)
        {
            float res;

            try
            {
                res = VariationRange(part.FluidAmmount * part.FluidModifier * pawn.BodySize / pawn.RaceProps.baseBodySize, 0.2f);
            }
            catch (NullReferenceException)
            {
                res = 0.0f;
            }
            if (pawn.IsMessy()) res *= Rand.Range(4.0f, 8.0f);

            return res;
        }

        public static HediffComp_Breast GetBreastComp(this Pawn pawn)
        {
            return pawn.health.hediffSet.hediffs.FirstOrDefault((Hediff h) => VariousDefOf.AllBreasts.Contains(h.def))?.TryGetComp<HediffComp_Breast>();
        }

        public static HediffComp_Breast GetBreastComp(this Hediff hediff)
        {
            if (hediff is Hediff_PartBaseNatural)
            {
                return hediff.TryGetComp<HediffComp_Breast>();
            }
            return null;
        }

        public static List<ThingComp> GetMilkComps(this Pawn pawn)
        {
            List<ThingComp> milkcomp = pawn.AllComps.FindAll(x => x is CompMilkable || x.GetType().ToString().ToLower().Contains("milkable"));
            return milkcomp;
        }

        public static bool HasMenstruationComp(this Pawn pawn)
        {
            return pawn.GetMenstruationComps().Any();
        }

        public static bool HasMenstruationComp(this Hediff hediff)
        {
            if ((hediff is Hediff_PartBaseNatural || hediff is Hediff_PartBaseArtifical) && hediff.TryGetComp<HediffComp_Menstruation>() != null)
                return true;
            else return false;
        }

        public static bool IsRJWPregnant(this Pawn pawn)
        {
            return pawn.health.hediffSet.GetFirstHediff<Hediff_BasePregnancy>() != null;
        }

        public static bool IsBiotechPregnant(this Pawn pawn)
        {
            if (!ModsConfig.BiotechActive) return false;
            foreach (HediffDef def in pawn.health.hediffSet.hediffs.Select(hediff => hediff.def))
            {
                if (def == HediffDefOf.PregnantHuman || def == HediffDefOf.PregnancyLabor || def == HediffDefOf.PregnancyLaborPushing)
                    return true;
            }
            return false;
        }

        public static float GetFarthestPregnancyProgress(this Pawn pawn)
        {
            if (ModsConfig.BiotechActive)
            {
                foreach (Hediff hediff in pawn.health.hediffSet.hediffs)
                {
                    if (hediff.def == HediffDefOf.PregnancyLabor || hediff.def == HediffDefOf.PregnancyLaborPushing)
                        return 1.0f;
                    if (hediff.def == HediffDefOf.PregnantHuman)
                        return hediff.Severity;
                }
            }
            List<Hediff_BasePregnancy> pregnancies = new List<Hediff_BasePregnancy>();
            pawn.health.hediffSet.GetHediffs(ref pregnancies);
            return pregnancies.MaxByWithFallback(hediff => hediff.GestationProgress)?.GestationProgress ?? 0;
        }

        public static float GetPregnancyProgress(this HediffComp_Menstruation comp)
        {
            if (comp.Pregnancy == null) return 0;
            else return comp.StageProgress;
        }

        public static Pawn GetFetus(this HediffComp_Menstruation comp)
        {
            if (comp.Pregnancy == null) return null;
            if (comp.Pregnancy is Hediff_BasePregnancy rjw_preg)
            {
                if (!rjw_preg.babies.NullOrEmpty()) return rjw_preg.babies.First();
                else
                {
                    Log.Error("Baby not exist: baby was not created or removed. Remove pregnancy.");
                    rjw_preg.Miscarry();
                    return null;
                }
            }
            HediffComp_PregeneratedBabies babiescomp = comp.Pregnancy.TryGetComp<HediffComp_PregeneratedBabies>();
            return babiescomp?.babies?.FirstOrDefault();
        }

        public static void DrawBreastIcon(this Pawn pawn, Rect rect)
        {
            Hediff hediff = pawn.health.hediffSet.hediffs.FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def));
            Texture2D breast, nipple, areola;
            if (hediff != null)
            {
                HediffComp_Breast comp = hediff.TryGetComp<HediffComp_Breast>();
                string icon;
                if (comp != null) icon = comp.Props?.BreastTex ?? "Breasts/Breast_Breast";
                else
                {
                    breast = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00", false);
                    nipple = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00_Nipple00", false);
                    areola = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00_Areola00", false);

                    GUI.color = SafeSkinColor(pawn);
                    GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
                    GUI.color = Color.white;
                    GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
                    GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
                    return;
                }

                if (hediff.Severity < 0.20f) icon += "_Breast00";
                else if (hediff.Severity < 0.40f) icon += "_Breast01";
                else if (hediff.Severity < 0.60f) icon += "_Breast02";
                else if (hediff.Severity < 0.80f) icon += "_Breast03";
                else if (hediff.Severity < 1.00f) icon += "_Breast04";
                else icon += "_Breast05";

                string nippleicon, areolaicon;
                float nipplesize, areolasize;
                nipplesize = comp.NippleSize;
                areolasize = comp.AreolaSize;

                nippleicon = icon + "_Nipple0" + GetNippleIndex(nipplesize);
                areolaicon = icon + "_Areola0" + GetAreolaIndex(areolasize);

                breast = ContentFinder<Texture2D>.Get(icon, false);
                areola = ContentFinder<Texture2D>.Get(areolaicon, false);
                nipple = ContentFinder<Texture2D>.Get(nippleicon, false);
                GUI.color = SafeSkinColor(pawn);
                GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);

                GUI.color = comp.NippleColor;

                GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);

                GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);

                if (Configurations.Debug) TooltipHandler.TipRegion(rect, comp.DebugInfo());

            }
            else
            {
                breast = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00", false);
                nipple = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00_Nipple00", false);
                areola = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00_Areola00", false);

                GUI.color = SafeSkinColor(pawn);
                GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
                GUI.color = Color.white;
                GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
                GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
            }

        }

        public static int GetNippleIndex(float nipplesize)
        {
            if (nipplesize < 0.25f) return 0;
            else if (nipplesize < 0.50f) return 1;
            else if (nipplesize < 0.75f) return 2;
            else return 3;
        }

        public static int GetAreolaIndex(float nipplesize)
        {
            if (nipplesize < 0.15f) return 0;
            else if (nipplesize < 0.30f) return 1;
            else if (nipplesize < 0.45f) return 2;
            else if (nipplesize < 0.70f) return 3;
            else return 4;
        }

        public static void DrawMilkBars(this Pawn pawn, Rect rect)
        {
            //List<ThingComp> milkcomp = pawn.AllComps.FindAll(x => x is CompMilkable || x.GetType().ToString().ToLower().Contains("milkable"));
            ThingComp milkcomp = null;
            float res = 0;
            if (VariousDefOf.Hediff_Heavy_Lactating_Permanent != null)
            {
                if (pawn.health.hediffSet.HasHediff(VariousDefOf.Hediff_Heavy_Lactating_Permanent)) milkcomp = pawn.AllComps.FirstOrDefault(x => x.GetType().ToString().ToLower().Contains("hypermilkable"));
                else milkcomp = pawn.AllComps.FirstOrDefault(x => x.GetType().ToString().ToLower().Contains("milkable"));
            }
            else
            {
                milkcomp = pawn.GetComp<CompMilkable>();
            }

            if (milkcomp == null) return;
            if (milkcomp is CompMilkable milkable)
            {
                bool active = (bool)milkcomp.GetPropertyValue("Active");
                if (active)
                {
                    CompMilkable m = milkable;
                    res = Math.Max(m.Fullness, res);
                    Widgets.FillableBar(rect, Math.Min(res, 1.0f), TextureCache.MilkTexture, Texture2D.blackTexture, true);
                    DrawMilkBottle(rect, pawn, VariousDefOf.Job_LactateSelf, m.Fullness);
                }
            }
            else
            {
                bool active = (bool)milkcomp.GetPropertyValue("Active");
                if (active)
                {
                    float fullness = (float)milkcomp.GetMemberValue("fullness");
                    res = Math.Max(fullness, res);
                    Widgets.FillableBar(rect, Math.Min(res, 1.0f), TextureCache.MilkTexture, Texture2D.blackTexture, true);
                    DrawMilkBottle(rect, pawn, VariousDefOf.Job_LactateSelf_MC, fullness);
                }
            }
        }

        public static void DrawMilkBottle(Rect rect, Pawn pawn, JobDef milkjob, float fullness)
        {
            Texture2D texture;
            Rect buttonrect = new Rect(rect.x, rect.y, rect.height, rect.height);
            if (fullness <= 0.0f) return;

            if (fullness < 0.3f) texture = ContentFinder<Texture2D>.Get("Milk/Milkbottle_Small", false);
            else if (fullness < 0.7f) texture = ContentFinder<Texture2D>.Get("Milk/Milkbottle_Medium", false);
            else texture = ContentFinder<Texture2D>.Get("Milk/Milkbottle_Large", false);
            GUIContent icon = new GUIContent(texture);
            GUIStyle style = GUIStyle.none;
            style.normal.background = texture;
            string tooltip = Translations.Button_MilkTooltip;

            TooltipHandler.TipRegion(buttonrect, tooltip);
            if (GUI.Button(buttonrect, icon, style))
            {
                if (fullness < 0.1f
                    || !pawn.IsColonistPlayerControlled
                    || pawn.Downed) SoundDefOf.ClickReject.PlayOneShotOnCamera();
                else
                {
                    SoundDefOf.Click.PlayOneShotOnCamera();
                    pawn.jobs.TryTakeOrderedJob(new Verse.AI.Job(milkjob, pawn));
                }
            }
            Widgets.DrawHighlightIfMouseover(buttonrect);
        }

        public static string GetVaginaLabel(this Pawn pawn)
        {
            Hediff hediff = pawn.health.hediffSet.hediffs.Find(h => VariousDefOf.AllVaginas.Contains(h.def));
            return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")" + "\n" + xxx.CountOfSex.LabelCap.CapitalizeFirst() + ": " + pawn.records.GetAsInt(xxx.CountOfSex);
        }
        public static string GetAnusLabel(this Pawn pawn)
        {
            Hediff hediff = pawn.health.hediffSet.hediffs.FirstOrDefault(h => VariousDefOf.AllAnuses.Contains(h.def)) ??
                Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault(h => h.def.defName.ToLower().Contains("anus"));
            if (hediff != null) return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")";
            else return "";
        }
        public static string GetBreastLabel(this Pawn pawn)
        {
            Hediff hediff = pawn.health.hediffSet.hediffs.FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def));
            if (hediff != null) return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")";
            else return "";
        }

        public static bool ShowFetusImage(this Hediff hediff)
        {
            if (Configurations.InfoDetail == Configurations.DetailLevel.All) return true;
            else if (Configurations.InfoDetail == Configurations.DetailLevel.Hide) return false;
            else if (hediff.Visible) return true;
            else return false;
        }

        public static bool ShowFetusInfo()
        {
            if (Configurations.InfoDetail == Configurations.DetailLevel.All || Configurations.InfoDetail == Configurations.DetailLevel.OnReveal) return true;
            else return false;
        }

        public static bool ShowStatus(this Pawn pawn)
        {
            if (pawn.Faction != null && Configurations.ShowFlag != Configurations.PawnFlags.None)
            {
                if (pawn.Faction.IsPlayer)
                {
                    if ((Configurations.ShowFlag & Configurations.PawnFlags.Colonist) != 0) return true;
                }
                else if (pawn.IsPrisonerOfColony)
                {
                    if ((Configurations.ShowFlag & Configurations.PawnFlags.Prisoner) != 0) return true;
                }
                else if (pawn.Faction.PlayerRelationKind == FactionRelationKind.Ally)
                {
                    if ((Configurations.ShowFlag & Configurations.PawnFlags.Ally) != 0) return true;
                }
                else if (pawn.Faction.PlayerRelationKind == FactionRelationKind.Hostile)
                {
                    if ((Configurations.ShowFlag & Configurations.PawnFlags.Hostile) != 0) return true;
                }
                else if ((Configurations.ShowFlag & Configurations.PawnFlags.Neutral) != 0) return true;
                else return false;
            }
            else if ((Configurations.ShowFlag & Configurations.PawnFlags.Neutral) != 0) return true;

            return false;
        }

        public static Pawn GetFather(Pawn pawn, Pawn mother)
        {
            Pawn res = pawn.GetFather();
            if (res != null) return res;
            else res = pawn.relations?.GetFirstDirectRelationPawn(PawnRelationDefOf.Parent, x => x != mother);
            return res;
        }

        public static float RandGaussianLike(float min, float max, int iterations = 3)
        {
            float res = 0;
            for (int i = 0; i < iterations; i++)
            {
                res += Rand.Value;
            }
            res /= iterations;

            return res * (max - min) + min;

        }

        public static float LerpMultiple(this float a, float b, float t, float num)
        {
            float tmult = Mathf.Pow(1 - t, num);
            return tmult * a + (1 - tmult) * b;
        }

        public static float VariationRange(this float num, float variant)
        {
            return num * Rand.Range(1.0f - variant, 1.0f + variant);
        }

        public static bool ShouldShowWombGizmo(this Pawn pawn)
        {
            if (!Configurations.EnableWombIcon) return false;
            if (pawn.Drafted && !Configurations.EnableDraftedIcon) return false;
            if (!pawn.ShouldCycle()) return false;
            return true;
        }

        // Apparently with some mods, even doing pawn.story?.SkinColor can throw a null reference, so we're stuck doing this
        public static Color SafeSkinColor(Pawn pawn)
        {
            try
            {
                return pawn.story?.SkinColor ?? Color.white;
            }
            catch (NullReferenceException)
            {
                return Color.white;
            }
            catch (InvalidOperationException)   // And sometimes it can try to pull the value of a Nullable without checking, too
            {
                return Color.white;
            }
        }
    }
}


code:
using RimWorld;
using rjw;
using System.Collections.Generic;
using System.Linq;
using Verse;

namespace RJW_Menstruation
{
    public static class VariousDefOf
    {

        public static readonly ThingDef CumFilth = DefDatabase<ThingDef>.GetNamed("FilthCum");
        public static readonly ThingDef GirlCumFilth = DefDatabase<ThingDef>.GetNamed("FilthGirlCum");
        public static readonly ThingDef Tampon = DefDatabase<ThingDef>.GetNamed("Absorber_Tampon");
        public static readonly ThingDef Tampon_Dirty = DefDatabase<ThingDef>.GetNamed("Absorber_Tampon_Dirty");
        public static readonly ThingDef FilthMixture = DefDatabase<ThingDef>.GetNamed("FilthMixture");
        public static readonly ThingDef Scyther = DefDatabase<ThingDef>.GetNamed("Mech_Scyther");
        public static readonly HediffDef RJW_IUD = DefDatabase<HediffDef>.GetNamed("RJW_IUD");
        public static readonly HediffDef Hediff_MenstrualCramp = DefDatabase<HediffDef>.GetNamed("Hediff_MenstrualCramp");
        public static readonly HediffDef Hediff_Estrus = DefDatabase<HediffDef>.GetNamed("Hediff_Estrus");
        public static readonly HediffDef Hediff_Estrus_Concealed = DefDatabase<HediffDef>.GetNamed("Hediff_Estrus_Concealed");
        public static readonly HediffDef Hediff_AffectedByPheromones = DefDatabase<HediffDef>.GetNamed("Hediff_AffectedByPheromones");
        public static readonly HediffDef Hediff_ASA = DefDatabase<HediffDef>.GetNamed("Hediff_ASA");
        public static readonly StatDef MaxAbsorbable = DefDatabase<StatDef>.GetNamed("MaxAbsorbable");
        public static readonly NeedDef SexNeed = DefDatabase<NeedDef>.GetNamed("Sex");
        public static readonly JobDef VaginaWashing = DefDatabase<JobDef>.GetNamed("VaginaWashing");
        public static readonly JobDef Job_LactateSelf = DefDatabase<JobDef>.GetNamed("LactateSelf");
        public static readonly ThoughtDef LeakingFluids = DefDatabase<ThoughtDef>.GetNamed("LeakingFluids");
        public static readonly ThoughtDef CameInsideF = DefDatabase<ThoughtDef>.GetNamed("CameInsideF");
        public static readonly ThoughtDef CameInsideFLowFert = DefDatabase<ThoughtDef>.GetNamed("CameInsideFLowFert");
        public static readonly ThoughtDef CameInsideFFetish = DefDatabase<ThoughtDef>.GetNamed("CameInsideFFetish");
        public static readonly ThoughtDef CameInsideFFetishSafe = DefDatabase<ThoughtDef>.GetNamed("CameInsideFFetishSafe");
        public static readonly ThoughtDef HaterCameInsideFSafe = DefDatabase<ThoughtDef>.GetNamed("HaterCameInsideFSafe");
        public static readonly ThoughtDef HaterCameInsideF = DefDatabase<ThoughtDef>.GetNamed("HaterCameInsideF");
        public static readonly ThoughtDef HaterCameInsideFEstrus = DefDatabase<ThoughtDef>.GetNamed("HaterCameInsideFEstrus");
        public static readonly ThoughtDef CameInsideM = DefDatabase<ThoughtDef>.GetNamed("CameInsideM");
        public static readonly ThoughtDef HaterCameInsideM = DefDatabase<ThoughtDef>.GetNamed("HaterCameInsideM");
        public static readonly ThoughtDef UnwantedPregnancy = DefDatabase<ThoughtDef>.GetNamed("UnwantedPregnancy");
        public static readonly ThoughtDef UnwantedPregnancyMild = DefDatabase<ThoughtDef>.GetNamed("UnwantedPregnancyMild");
        public static readonly ThoughtDef TookContraceptivePill = DefDatabase<ThoughtDef>.GetNamed("TookContraceptivePill");
        public static readonly ThoughtDef HateTookContraceptivePill = DefDatabase<ThoughtDef>.GetNamed("HateTookContraceptivePill");
        public static readonly ThoughtDef EggRestorationReceived = DefDatabase<ThoughtDef>.GetNamed("EggRestorationReceived");
        public static readonly CompProperties_Menstruation HumanVaginaCompProperties = Genital_Helper.average_vagina.CompProps<CompProperties_Menstruation>();
        public static readonly KeyBindingDef OpenStatusWindowKey = DefDatabase<KeyBindingDef>.GetNamed("OpenStatusWindow");
        public static readonly RecordDef AmountofCreampied = DefDatabase<RecordDef>.GetNamed("AmountofCreampied");
        public static readonly RecordDef AmountofFertilizedEggs = DefDatabase<RecordDef>.GetNamed("AmountofFertilizedEggs");
        public static readonly TaleDef TaleCameInside = DefDatabase<TaleDef>.GetNamed("CameInside");

        private static List<ThingDef> allraces = null;
        private static List<PawnKindDef> allkinds = null;
        private static HashSet<HediffDef> allvaginas = null;
        private static HashSet<HediffDef> allanuses = null;
        private static HashSet<HediffDef> allbreasts = null;
        private static HashSet<GeneDef> egglayergenes = null;

        public static List<ThingDef> AllRaces
        {
            get
            {
                if (allraces != null) return allraces;
                allraces = DefDatabase<ThingDef>.AllDefsListForReading.Where(thingdef => thingdef.race?.IsFlesh ?? false).ToList();

                return allraces;
            }
        }
        public static List<PawnKindDef> AllKinds
        {
            get
            {
                if (allkinds != null) return allkinds;
                allkinds = DefDatabase<PawnKindDef>.AllDefsListForReading.Where(pawnkinddef => pawnkinddef.race != null).ToList();

                return allkinds;
            }
        }
        public static HashSet<HediffDef> AllVaginas
        {
            get
            {
                if (allvaginas != null) return allvaginas;
                allvaginas = new HashSet<HediffDef>();

                foreach(HediffDef hediffDef in DefDatabase<HediffDef>.AllDefsListForReading)
                {
                    if (hediffDef.comps.NullOrEmpty()) continue;
                    foreach (HediffCompProperties comp in hediffDef.comps)
                    {
                        if (comp.compClass == typeof(HediffComp_Menstruation) || (comp.compClass?.IsSubclassOf(typeof(HediffComp_Menstruation)) ?? false))
                        {
                            allvaginas.Add(hediffDef);
                            break;
                        }
                    }
                }

                return allvaginas;
            }
        }
        public static HashSet<HediffDef> AllAnuses
        {
            get
            {
                if (allanuses != null) return allanuses;
                allanuses = new HashSet<HediffDef>();

                foreach (HediffDef hediffDef in DefDatabase<HediffDef>.AllDefsListForReading)
                {
                    if (hediffDef.comps.NullOrEmpty()) continue;
                    foreach (HediffCompProperties comp in hediffDef.comps)
                    {
                        if (comp.compClass == typeof(HediffComp_Anus) || (comp.compClass?.IsSubclassOf(typeof(HediffComp_Anus)) ?? false))
                        {
                            allanuses.Add(hediffDef);
                            break;
                        }
                    }
                }

                return allanuses;
            }
        }
        public static HashSet<HediffDef> AllBreasts
        {
            get
            {
                if (allbreasts != null) return allbreasts;
                allbreasts = new HashSet<HediffDef>();

                foreach(HediffDef hediffDef in DefDatabase<HediffDef>.AllDefsListForReading)
                {
                    if (hediffDef.comps.NullOrEmpty()) continue;
                    foreach(HediffCompProperties comp in hediffDef.comps)
                    {
                        if (comp.compClass == typeof(HediffComp_Breast) || (comp.compClass?.IsSubclassOf(typeof(HediffComp_Breast)) ?? false))
                        {
                            allbreasts.Add(hediffDef);
                            break;
                        }
                    }
                }

                return allbreasts;
            }
        }
        public static HashSet<GeneDef> EggLayerGenes
        {
            get
            {
                if (egglayergenes != null) return egglayergenes;
                egglayergenes = DefDatabase<GeneDef>.AllDefsListForReading.Where(geneDef => geneDef.GetModExtension<MenstruationModExtension>()?.disableCycle ?? false).ToHashSet();

                return egglayergenes;
            }
        }

        // Defs from Milkable Colonists
        public static readonly HediffDef Hediff_Lactating_Drug = DefDatabase<HediffDef>.GetNamedSilentFail("Lactating_Drug");
        public static readonly HediffDef Hediff_Lactating_Natural = DefDatabase<HediffDef>.GetNamedSilentFail("Lactating_Natural");
        public static readonly HediffDef Hediff_Lactating_Permanent = DefDatabase<HediffDef>.GetNamedSilentFail("Lactating_Permanent");
        public static readonly HediffDef Hediff_Heavy_Lactating_Permanent = DefDatabase<HediffDef>.GetNamedSilentFail("Heavy_Lactating_Permanent");
        public static readonly JobDef Job_LactateSelf_MC = DefDatabase<JobDef>.GetNamedSilentFail("LactateSelf_MC");

        // Defs from Sexperience Ideology
        public static readonly PreceptDef Pregnancy_Elevated = DefDatabase<PreceptDef>.GetNamedSilentFail("Pregnancy_Elevated");
        public static readonly PreceptDef Pregnancy_Holy = DefDatabase<PreceptDef>.GetNamedSilentFail("Pregnancy_Holy");
        public static readonly PreceptDef Pregnancy_Required = DefDatabase<PreceptDef>.GetNamedSilentFail("Pregnancy_Required");
        // Related thoughts
        public static readonly ThoughtDef CameInsideMIdeo = DefDatabase<ThoughtDef>.GetNamed("CameInsideMIdeo");
        public static readonly ThoughtDef CameInsideFIdeo = DefDatabase<ThoughtDef>.GetNamed("CameInsideFIdeo");
        public static readonly ThoughtDef HaterCameInsideFIdeo = DefDatabase<ThoughtDef>.GetNamed("HaterCameInsideFIdeo");
        public static readonly ThoughtDef HateTookContraceptivePillIdeo = DefDatabase<ThoughtDef>.GetNamed("HateTookContraceptivePillIdeo");
    }

}


code:
<?xml version="1.0" encoding="utf-8"?>
<packages />


code:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
    </startup>
</configuration>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<ThingDef ParentName="MakeableDrugPillBase">
		<defName>OvaryRegenerationPill</defName>
		Ovary regeneration pill
		<description>Recovers the ovaries' health, restoring some quantity of eggs.
Less effective on ovaries with few eggs remaining.
Cannot recover menopause.</description>
		<graphicData>
			<texPath>Things/Item/ORPill</texPath>
			<graphicClass>Graphic_StackCount</graphicClass>
		</graphicData>
		<rotatable>false</rotatable>
		<statBases>
			<WorkToMake>2400</WorkToMake>
			<MarketValue>160</MarketValue>
			<Mass>0.05</Mass>
		</statBases>
		<techLevel>Industrial</techLevel>
		<ingestible>
			<drugCategory>Medical</drugCategory>
			<outcomeDoers>

					<effectOffset>0.3</effectOffset>

			</outcomeDoers>
		</ingestible>
		<recipeMaker>
			<researchPrerequisite>DrugProduction</researchPrerequisite>
			<recipeUsers>

DrugLab

			</recipeUsers>
		</recipeMaker>
		<costList>
			<MedicineHerbal>10</MedicineHerbal>
			<Neutroamine>4</Neutroamine>
			<InsectJelly>8</InsectJelly>
		</costList>
		<comps>

			<addictiveness>0</addictiveness>
			<listOrder>1000</listOrder>
				<overdoseSeverityOffset>
					<min>0.08</min>
					<max>0.14</max>
				</overdoseSeverityOffset>

		</comps>
	</ThingDef>

	<ThingDef ParentName="MakeableDrugPillBase">
		<defName>SuperovulationInducingAgent</defName>
		Superovulation inducing agent
		<description>Induce superovulation, causing the next ovulation to produce 1-4 extra eggs.

May hasten the onset of menopause.</description>
		<graphicData>
			<texPath>Things/Item/SIA</texPath>
			<graphicClass>Graphic_StackCount</graphicClass>
		</graphicData>
		<rotatable>false</rotatable>
		<statBases>
			<WorkToMake>2400</WorkToMake>
			<MarketValue>140</MarketValue>
			<Mass>0.05</Mass>
		</statBases>
		<techLevel>Industrial</techLevel>
		<ingestible>
			<drugCategory>Medical</drugCategory>
			<outcomeDoers>

			</outcomeDoers>
		</ingestible>
		<recipeMaker>
			<researchPrerequisite>DrugProduction</researchPrerequisite>
			<recipeUsers>

DrugLab

			</recipeUsers>
		</recipeMaker>
		<costList>
			<MedicineHerbal>12</MedicineHerbal>
			<Neutroamine>6</Neutroamine>
		</costList>
		<comps>

			<addictiveness>0</addictiveness>
			<listOrder>1000</listOrder>
				<overdoseSeverityOffset>
					<min>0.08</min>
					<max>0.14</max>
				</overdoseSeverityOffset>

		</comps>
	</ThingDef>

	<ThingDef ParentName="MakeableDrugPillBase">
		<defName>PainReliever</defName>
		Pain reliever
		<description>Relieves menstrual pain for 24 hours.

Also effective on other sources of pain.</description>
		<graphicData>
			<texPath>Things/Item/PainReliever</texPath>
			<graphicClass>Graphic_StackCount</graphicClass>
		</graphicData>
		<rotatable>false</rotatable>
		<statBases>
			<WorkToMake>1000</WorkToMake>
			<MarketValue>12</MarketValue>
			<Mass>0.01</Mass>
		</statBases>
		<techLevel>Industrial</techLevel>
		<ingestible>
			<drugCategory>Medical</drugCategory>
			<outcomeDoers>

					<hediffDef>Hediff_PainReliever</hediffDef>
					<severity>1.0</severity>

			</outcomeDoers>
		</ingestible>
		<recipeMaker>
			<researchPrerequisite>DrugProduction</researchPrerequisite>
			<recipeUsers>

DrugLab

			</recipeUsers>
		</recipeMaker>
		<costList>
			<MedicineHerbal>1</MedicineHerbal>
		</costList>
		<comps>

			<addictiveness>0</addictiveness>
			<listOrder>1000</listOrder>
				<overdoseSeverityOffset>
					<min>0.08</min>
					<max>0.14</max>
				</overdoseSeverityOffset>

		</comps>
	</ThingDef>

	<ThingDef ParentName="MakeableDrugPillBase">
		<defName>Cyclosporine</defName>
		cyclosporine
		<description>An immunosuppressant.
Can cure antisperm antibody, but reduces the body's ability to fight off infection and disease for 24 hours.</description>
		<graphicData>
			<texPath>Things/Item/Cyclosporine</texPath>
			<graphicClass>Graphic_StackCount</graphicClass>
		</graphicData>
		<rotatable>false</rotatable>
		<statBases>
			<WorkToMake>1000</WorkToMake>
			<MarketValue>12</MarketValue>
			<Mass>0.01</Mass>
		</statBases>
		<techLevel>Industrial</techLevel>
		<ingestible>
			<drugCategory>Medical</drugCategory>
			<outcomeDoers>

					<hediffDef>Hediff_Cyclosporine</hediffDef>
					<severity>1.0</severity>

					<hediffDef>Hediff_ASA</hediffDef>
					<severity>-0.20</severity>

			</outcomeDoers>
		</ingestible>
		<recipeMaker>
			<researchPrerequisite>DrugProduction</researchPrerequisite>
			<recipeUsers>

DrugLab

			</recipeUsers>
		</recipeMaker>
		<costList>
			<MedicineHerbal>1</MedicineHerbal>
		</costList>
		<comps>

			<addictiveness>0</addictiveness>
			<listOrder>1000</listOrder>
				<overdoseSeverityOffset>
					<min>0.08</min>
					<max>0.14</max>
				</overdoseSeverityOffset>

		</comps>
	</ThingDef>

</Defs>


code:
<?xml version="1.0" encoding="utf-8"?>
<Defs>

	<GeneCategoryDef>
		<defName>Menstruation</defName>
		menstruation
		<displayPriorityInXenotype>402</displayPriorityInXenotype>
	</GeneCategoryDef>

	<GeneDef Name="Menstruation_EggLifetime" Abstract="True">
		<displayCategory>Menstruation</displayCategory>
    <iconPath>UI/Genes/Placeholder</iconPath>
    <exclusionTags>

Menstruation_EggLifetime

		</exclusionTags>
	</GeneDef>

	<GeneDef ParentName="Menstruation_EggLifetime">
		<defName>Menstruation_ShortEggLifetime</defName>
		short egg lifetime
		<description>Unfertilized eggs with this gene last three-quarters as long.</description>
		<iconPath>UI/Genes/ShortEggLifetime</iconPath>
		<biostatMet>1</biostatMet>
		<displayOrderInCategory>10</displayOrderInCategory>
    <modExtensions>

        <eggLifeTimeFactor>0.75</eggLifeTimeFactor>

    </modExtensions>
	</GeneDef>

	<GeneDef ParentName="Menstruation_EggLifetime">
		<defName>Menstruation_DoubleEggLifetime</defName>
		double egg lifetime
		<description>Unfertilized eggs with this gene last twice as long.</description>
		<iconPath>UI/Genes/DoubleEggLifetime</iconPath>
		<biostatMet>-1</biostatMet>
		<displayOrderInCategory>12</displayOrderInCategory>
    <modExtensions>

        <eggLifeTimeFactor>2.0</eggLifeTimeFactor>

    </modExtensions>
	</GeneDef>

	<GeneDef ParentName="Menstruation_EggLifetime">
		<defName>Menstruation_QuadEggLifetime</defName>
		quadrule egg lifetime
		<description>Eggs with this gene last four times as long.</description>
		<iconPath>UI/Genes/QuadEggLifetime</iconPath>
		<biostatMet>-2</biostatMet>
		<biostatCpx>1</biostatCpx>
		<displayOrderInCategory>16</displayOrderInCategory>
    <modExtensions>

        <eggLifeTimeFactor>4.0</eggLifeTimeFactor>

    </modExtensions>
	</GeneDef>

	<GeneDef Name="Menstruation_Estrus" Abstract="True">
		<displayCategory>Menstruation</displayCategory>
    <iconPath>UI/Genes/Placeholder</iconPath>
    <exclusionTags>

Menstruation_Estrus

		</exclusionTags>
	</GeneDef>

	<GeneDef ParentName="Menstruation_Estrus">
		<defName>Menstruation_NeverEstrus</defName>
		never estrus
		<description>Carriers of this gene will never go into estrus.</description>
		<iconPath>UI/Genes/NeverEstrus</iconPath>
		<biostatMet>1</biostatMet>
		<displayOrderInCategory>20</displayOrderInCategory>
    <modExtensions>

        <neverEstrus>true</neverEstrus>

    </modExtensions>
	</GeneDef>

	<GeneDef ParentName="Menstruation_Estrus">
		<defName>Menstruation_FullEstrus</defName>
		full estrus
		<description>Carriers of this gene will enter full estrus every menstrual cycle, regardless of vagina type.</description>
		<iconPath>UI/Genes/FullEstrus</iconPath>
		<biostatMet>-1</biostatMet>
		<biostatCpx>1</biostatCpx>
		<displayOrderInCategory>25</displayOrderInCategory>
    <modExtensions>

        <alwaysEstrus>true</alwaysEstrus>

    </modExtensions>
	</GeneDef>

	<GeneDef Name="Menstruation_Ovulation" Abstract="True">
		<displayCategory>Menstruation</displayCategory>
    <iconPath>UI/Genes/Placeholder</iconPath>
    <exclusionTags>

Menstruation_Ovulation

		</exclusionTags>
	</GeneDef>

	<GeneDef ParentName="Menstruation_Ovulation">
		<defName>Menstruation_DoubleOvulation</defName>
		double ovulation
		<description>Carriers of this gene will ovulate twice as many eggs.</description>
		<iconPath>UI/Genes/DoubleOvulation</iconPath>
		<biostatMet>-1</biostatMet>
		<displayOrderInCategory>30</displayOrderInCategory>
    <modExtensions>

        <ovulationFactor>2</ovulationFactor>

    </modExtensions>
	</GeneDef>

	<GeneDef ParentName="Menstruation_Ovulation">
		<defName>Menstruation_QuadOvulation</defName>
		quadruple ovulation
		<description>Carriers of this gene will ovulate four times as many eggs.</description>
		<iconPath>UI/Genes/QuadOvulation</iconPath>
		<biostatMet>-1</biostatMet>
		<displayOrderInCategory>35</displayOrderInCategory>
    <modExtensions>

        <ovulationFactor>4</ovulationFactor>

    </modExtensions>
	</GeneDef>

	<GeneDef>
		<defName>Menstruation_NoBleeding</defName>
		no bleeding
		<displayCategory>Menstruation</displayCategory>
		<description>Carriers of this gene will not bleed at the end of their cycle.</description>
		<iconPath>UI/Genes/NoBleeding</iconPath>
		<biostatMet>-1</biostatMet>
		<displayOrderInCategory>40</displayOrderInCategory>
    <modExtensions>

        <noBleeding>true</noBleeding>

    </modExtensions>
	</GeneDef>

</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<HediffDef>
		<hediffClass>HediffWithComps</hediffClass>
		<defName>Hediff_ASA</defName>
		Antisperm antibody
		<labelNoun>antisperm antibody</labelNoun>
		<description>Antisperm antibody.
Increases death rate of sperm.</description>
		<labelNounPretty>{0} has an antisperm antibody</labelNounPretty>
		<defaultLabelColor>(0.8,0.1,0.1)</defaultLabelColor>
		<isBad>false</isBad>
		<tendable>false</tendable>
		<makesSickThought>false</makesSickThought>
		<makesAlert>true</makesAlert>
		<maxSeverity>1</maxSeverity>
		<initialSeverity>0.1</initialSeverity>
		<injuryProps>
			<canMerge>true</canMerge>
		</injuryProps>
		<stages>

				<becomeVisible>false</becomeVisible>

				<minSeverity>0.40</minSeverity>
				<becomeVisible>true</becomeVisible>

		</stages>
		<comps>
		</comps>
	</HediffDef>

	<HediffDef>
		<hediffClass>HediffWithComps</hediffClass>
		<defName>Hediff_ForceFertile</defName>
		Fertile
		<labelNoun>fertile</labelNoun>
		<description>fertile</description>
		<labelNounPretty>{0} is fertile</labelNounPretty>
		<defaultLabelColor>(0.3,0.3,0.8)</defaultLabelColor>
		<isBad>false</isBad>
		<tendable>false</tendable>
		<makesSickThought>false</makesSickThought>
		<makesAlert>true</makesAlert>
		<maxSeverity>3</maxSeverity>
		<initialSeverity>0.1</initialSeverity>
		<injuryProps>
			<canMerge>true</canMerge>
		</injuryProps>
		<stages>

				<becomeVisible>false</becomeVisible>
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<offset>0.05</offset>

				</capMods>

				<minSeverity>0.20</minSeverity>
				<becomeVisible>false</becomeVisible>
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<offset>0.25</offset>

				</capMods>

				<minSeverity>0.40</minSeverity>
				<becomeVisible>true</becomeVisible>
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<offset>0.50</offset>

				</capMods>

				<minSeverity>0.60</minSeverity>
				<becomeVisible>true</becomeVisible>
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<offset>0.75</offset>

				</capMods>

				<minSeverity>0.80</minSeverity>
				<becomeVisible>true</becomeVisible>
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<offset>1.00</offset>

				</capMods>

		</stages>
		<comps>

				<severityPerDay>-1.0</severityPerDay>
				<showHoursToRecover>true</showHoursToRecover>

		</comps>
	</HediffDef>

</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<HediffDef Name="Hediff_MenstrualCramp">
		<hediffClass>HediffWithComps</hediffClass>
		<defName>Hediff_MenstrualCramp</defName>
		In period
		<labelNoun>in period</labelNoun>
		<description>Bleeding from the vagina at the end of the menstrual cycle.
Often painful.</description>
		<defaultLabelColor>(0.70,0.00,0.00)</defaultLabelColor>
		<isBad>true</isBad>
		<tendable>false</tendable>
		<makesSickThought>false</makesSickThought>
		<makesAlert>false</makesAlert>
		<maxSeverity>1</maxSeverity>
		<initialSeverity>0.1</initialSeverity>
		<injuryProps>
			<canMerge>true</canMerge>
		</injuryProps>
		<stages>

				unpleasant
				<statFactors>
					<SexFrequency>0.50</SexFrequency>
					<SexSatisfaction>0.95</SexSatisfaction>
				</statFactors>
				<painOffset>0.005</painOffset>

				<minSeverity>0.2</minSeverity>
				annoying
				<statFactors>
					<SexFrequency>0.40</SexFrequency>
					<SexSatisfaction>0.95</SexSatisfaction>
				</statFactors>
				<painOffset>0.01</painOffset>

				<minSeverity>0.4</minSeverity>
				aching
				<statFactors>
					<SexFrequency>0.20</SexFrequency>
					<SexSatisfaction>0.95</SexSatisfaction>
				</statFactors>
				<painOffset>0.10</painOffset>

				<minSeverity>0.6</minSeverity>
				painful
				<statFactors>
					<SexFrequency>0.0</SexFrequency>
					<SexSatisfaction>0.95</SexSatisfaction>
				</statFactors>
				<painOffset>0.20</painOffset>

		</stages>
		<comps>

				<severityPerDay>-0.1</severityPerDay>

		</comps>
	</HediffDef>

	<HediffDef Name="Hediff_Estrus">
		<hediffClass>RJW_Menstruation.Hediff_Estrus</hediffClass>
		<defName>Hediff_Estrus</defName>
		Estrus
		<labelNoun>estrus</labelNoun>
		<description>A condition caused by a womb entering the most fertile phase of its menstrual cycle. Sexual arousal and desire increase dramatically as the body yearns to become pregnant.
Increased chance of vaginal sex occurring and potentially lower standards in mate selection.</description>
		<defaultLabelColor>(1.00,0.60,0.75)</defaultLabelColor>
		<isBad>false</isBad>
		<tendable>false</tendable>
		<makesSickThought>false</makesSickThought>
		<makesAlert>false</makesAlert>
		<maxSeverity>10000</maxSeverity>
		<initialSeverity>1.0</initialSeverity>
		<injuryProps>
			<canMerge>true</canMerge>
		</injuryProps>
		<stages>

				<statFactors>
					<SexFrequency>5.0</SexFrequency>
					<SexSatisfaction>1.5</SexSatisfaction>
				</statFactors>

		</stages>
    <comps>

        <daysToMaxSeverity>0.25</daysToMaxSeverity>
        <range>6</range>

    </comps>
	</HediffDef>

	<HediffDef Name="Hediff_Estrus_Concealed">
		<hediffClass>RJW_Menstruation.Hediff_Estrus</hediffClass>
		<defName>Hediff_Estrus_Concealed</defName>
		Estrus (concealed)
		<labelNoun>estrus</labelNoun>
		<description>A condition caused by a womb its most fertile phase of the menstrual cycle. Sexual arousal and desire increase slightly.
Slightly increased chance of vaginal sex.</description>
		<defaultLabelColor>(1.00,0.60,0.75)</defaultLabelColor>
		<isBad>false</isBad>
		<tendable>false</tendable>
		<makesSickThought>false</makesSickThought>
		<makesAlert>false</makesAlert>
		<maxSeverity>10000</maxSeverity>
		<initialSeverity>1.0</initialSeverity>
		<injuryProps>
			<canMerge>true</canMerge>
		</injuryProps>
		<stages>

				<becomeVisible>false</becomeVisible>
				<statFactors>
					<SexFrequency>1.10</SexFrequency>
					<SexSatisfaction>1.05</SexSatisfaction>
				</statFactors>

		</stages>
	</HediffDef>

  <HediffDef Name="Hediff_AffectedByPheromones">
    <hediffClass>HediffWithComps</hediffClass>
    <defName>Hediff_AffectedByPheromones</defName>
    Affected by pheromones
    <description>A condition caused by being around someone in estrus. Sex drive and satisfaction is increased by the scent of heat.</description>
    <defaultLabelColor>(1.00,0.60,0.75)</defaultLabelColor>
    <isBad>false</isBad>
    <tendable>false</tendable>
    <makesSickThought>false</makesSickThought>
    <makesAlert>false</makesAlert>
    <maxSeverity>1.0</maxSeverity>
    <injuryProps>
      <canMerge>true</canMerge>
    </injuryProps>
    <stages>

        weak
        <statFactors>
          <SexFrequency>1.1</SexFrequency>
        </statFactors>

        <minSeverity>0.4</minSeverity>
        moderate
        <statFactors>
          <SexFrequency>1.4</SexFrequency>
          <SexSatisfaction>1.1</SexSatisfaction>
        </statFactors>

        <minSeverity>0.8</minSeverity>
        strong
        <statFactors>
          <SexFrequency>2.0</SexFrequency>
          <SexSatisfaction>1.2</SexSatisfaction>
        </statFactors>

    </stages>
    <comps>

        <severityPerDay>-1.0</severityPerDay>

    </comps>
  </HediffDef>

	<HediffDef Name="Hediff_PainReliever">
		<hediffClass>HediffWithComps</hediffClass>
		<defName>Hediff_PainReliever</defName>
		Pain reliever
		<description>A mild reprieve from menstrual (and other) sources of pain.</description>
		<defaultLabelColor>(0.75,0.75,1.0)</defaultLabelColor>
		<isBad>false</isBad>
		<tendable>false</tendable>
		<makesSickThought>false</makesSickThought>
		<makesAlert>false</makesAlert>
		<maxSeverity>5</maxSeverity>
		<initialSeverity>1.0</initialSeverity>
		<stages>

				<painOffset>-0.1</painOffset>

		</stages>
		<comps>

				<severityPerDay>-1.0</severityPerDay>

		</comps>
	</HediffDef>

	<HediffDef>
		<hediffClass>HediffWithComps</hediffClass>
		<defName>Hediff_Cyclosporine</defName>
		Cyclosporine
		<description>Under the effect of an immunosuppressant, hampering the body's ability to fight off infection and disease.</description>
		<defaultLabelColor>(0.75,0.75,1.0)</defaultLabelColor>
		<isBad>false</isBad>
		<tendable>false</tendable>
		<makesSickThought>false</makesSickThought>
		<makesAlert>false</makesAlert>
		<maxSeverity>10</maxSeverity>
		<initialSeverity>1.0</initialSeverity>
		<stages>

				<statOffsets>
					<ImmunityGainSpeed>-0.25</ImmunityGainSpeed>
				</statOffsets>

		</stages>
		<comps>

				<severityPerDay>-1.0</severityPerDay>

		</comps>
	</HediffDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<JobDef Name="VaginaWashing">
		<defName>VaginaWashing</defName>
		<driverClass>RJW_Menstruation.JobDriver_VaginaWashing</driverClass>
		<reportString>washing vagina</reportString>
		<casualInterruptible>true</casualInterruptible>
	</JobDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<JobDef>
		<defName>LactateSelf</defName>
		<driverClass>RJW_Menstruation.JobDriver_MilkSelf</driverClass>
		<reportString>lactating self</reportString>
		<allowOpportunisticPrefix>true</allowOpportunisticPrefix>
	</JobDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
  <KeyBindingDef ParentName="GameKeyBinding">
    <defName>OpenStatusWindow</defName>
    <label>Menstruation: open status window</label>
    <defaultKeyCodeA>Q</defaultKeyCodeA>
  </KeyBindingDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
  <RecipeDef Abstract="True" Name="BaseBreastSurgery">
    <effectWorking>Surgery</effectWorking>
    <soundWorking>Recipe_Surgery</soundWorking>
    <workSpeedStat>MedicalOperationSpeed</workSpeedStat>
    <workSkill>Medicine</workSkill>
    <workSkillLearnFactor>0.2</workSkillLearnFactor>
    <workAmount>400</workAmount>
    <anesthetize>false</anesthetize>
    <recipeUsers>

Human

    </recipeUsers>
    <surgerySuccessChanceFactor>100</surgerySuccessChanceFactor>
    <ingredients>

        <filter>
          <categories>

Medicine

          </categories>
        </filter>
        <count>1</count>

    </ingredients>
    <fixedIngredientFilter>
      <categories>

Medicine

      </categories>
    </fixedIngredientFilter>
  </RecipeDef>

  <RecipeDef ParentName="BaseBreastSurgery">
    <defName>Surgery_ExpandAreola</defName>
    expand areolae
    <description>Expand the areolae.</description>
    <workerClass>RJW_Menstruation.Recipe_ExpandAreola</workerClass>
    <jobString>expanding areolae</jobString>
  </RecipeDef>

  <RecipeDef ParentName="BaseBreastSurgery">
    <defName>Surgery_ContractAreola</defName>
    contract areolae
    <description>Contract the areolae.</description>
    <workerClass>RJW_Menstruation.Recipe_ContractAreola</workerClass>
    <jobString>contracting areolae</jobString>
  </RecipeDef>

  <RecipeDef ParentName="BaseBreastSurgery">
    <defName>Surgery_ExpandNipple</defName>
    Expand nipple
    <description>Expand the nipples.</description>
    <workerClass>RJW_Menstruation.Recipe_ExpandNipple</workerClass>
    <jobString>expanding nipples</jobString>
  </RecipeDef>

  <RecipeDef ParentName="BaseBreastSurgery">
    <defName>Surgery_ContractNipple</defName>
    Contract nipples
    <description>Contract the nipples.</description>
    <workerClass>RJW_Menstruation.Recipe_ContractNipple</workerClass>
    <jobString>contracting nipples</jobString>
  </RecipeDef>

  <RecipeDef ParentName="BaseBreastSurgery">
    <defName>Surgery_DarkenNipple</defName>
    Darken nipples
    <description>Darken the nipples.</description>
    <workerClass>RJW_Menstruation.Recipe_DarkenNipple</workerClass>
    <jobString>darkening nipples</jobString>
  </RecipeDef>

  <RecipeDef ParentName="BaseBreastSurgery">
    <defName>Surgery_LightenNipple</defName>
    Lighten nipples
    <description>Lighten the nipples.</description>
    <workerClass>RJW_Menstruation.Recipe_LightenNipple</workerClass>
    <jobString>lightening nipples</jobString>
  </RecipeDef>

</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<RecordDef>
		<defName>AmountofCreampied</defName>
		creampied
		<description>The milliliters of cum that's been ejaculated into my womb.</description>
		<type>Float</type>
	</RecordDef>

	<RecordDef>
		<defName>AmountofFertilizedEggs</defName>
		fertilized eggs
		<description>The number of my eggs that sperm has fertilized.</description>
		<type>Int</type>
	</RecordDef>

</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>

  <StatDef>
    <defName>MaxAbsorbable</defName>
    Absorbable
    <description>Maximum amount of fluid that this item can absorb.</description>
    <category>Apparel</category>
    <minValue>0</minValue>
    <toStringStyle>FloatOne</toStringStyle>
    <formatString>{0} ml</formatString>
    <showIfUndefined>false</showIfUndefined>
    <displayPriorityInCategory>60</displayPriorityInCategory>
    <parts>

        <factorAwful>0.5</factorAwful>
        <factorPoor>0.8</factorPoor>
        <factorNormal>1</factorNormal>
        <factorGood>1.2</factorGood>
        <factorExcellent>1.4</factorExcellent>
        <factorMasterwork>2.0</factorMasterwork>
        <factorLegendary>5.0</factorLegendary>

    </parts>
  </StatDef>

</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<TaleDef>
		<defName>CameInside</defName>
		came inside
		<taleClass>Tale_DoublePawn</taleClass>
		<type>Volatile</type>
		<firstPawnSymbol>FUCKER</firstPawnSymbol>
		<secondPawnSymbol>FUCKED</secondPawnSymbol>
		<baseInterest>1.5</baseInterest>
		<rulePack>
			<rulesStrings>

tale_noun->[FUCKER_nameDef] coming inside of [FUCKED_nameDef]

image->[FUCKER_nameFull]'s penis deep inside of [FUCKED_nameFull]'s vagina [circumstance_group]

image->[FUCKER_nameFull]'s penis vanishing into [FUCKED_nameFull]'s vagina [circumstance_group]

image->[FUCKED_nameFull]'s vagina being filled by [FUCKER_nameFull]'s penis [circumstance_group]

image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [cirsumstance_group]

circumstance_phrase->while [FUCKER_nameDef] grits [FUCKER_possessive] teeth

circumstance_phrase->while [FUCKER_nameDef] wears a triumphant smirk

circumstance_phrase->as [FUCKED_nameDef] shudders in ecstasy

circumstance_phrase->as [FUCKER_nameDef] shoots [FUCKER_possessive] load into [FUCKED_nameDef]

circumstance_phrase->while [FUCKED_nameDef] looks into [FUCKER_nameDef]'s eyes with a smile

desc_sentence->[FUCKER_nameDef]'s cum oozes out of [FUCKED_nameDef]'s vagina and drips onto the floor.

desc_sentence->[FUCKER_nameDef]'s sperm races into [FUCKED_nameDef]'s womb and enters [FUCKED_possessive] egg.

desc_sentence->[FUCKER_nameDef]'s cum shoots into [FUCKED_nameDef]'s womb.

desc_sentence->[FUCKED_nameDef]'s womb is filled with cum.

desc_sentence->Sweat runs down [FUCKER_nameDef]'s face.

desc_sentence->[FUCKED_nameDef] is panting heavily.

			</rulesStrings>
		</rulePack>
	</TaleDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
  <ApparelLayerDef>
    <defName>Absorber</defName>
    <label>genital</label>
    <drawOrder>500</drawOrder>
  </ApparelLayerDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>

  <ThingDef ParentName="ApparelNoQualityBase">
    <defName>Absorber_Tampon</defName>
    tampon
    <description>A tampon for absorbing fluids from a vagina.
May cause an infection if worn for too long.</description>
    <thingClass>RJW_Menstruation.Absorber_Tampon</thingClass>
    <graphicData>
      <texPath>Things/Item/Tampon</texPath>
      <graphicClass>Graphic_Single</graphicClass>
    </graphicData>
    <tickerType>Never</tickerType>
    <smeltable>false</smeltable>
    <tradeability>Sellable</tradeability>
    <statBases>
      <MaxHitPoints>20</MaxHitPoints>
      <Mass>0.01</Mass>
      <WorkToMake>1000</WorkToMake>
      <Flammability>1.0</Flammability>
      <EquipDelay>2</EquipDelay>
      <MaxAbsorbable>10</MaxAbsorbable>
    </statBases>
    <costStuffCount>5</costStuffCount>
    <stuffCategories>

Fabric

    </stuffCategories>
    <recipeMaker>
      <unfinishedThingDef>UnfinishedApparel</unfinishedThingDef>
      <researchPrerequisite>ComplexClothing</researchPrerequisite>
      <workSpeedStat>GeneralLaborSpeed</workSpeedStat>
      <workSkill>Crafting</workSkill>
      <effectWorking>Tailor</effectWorking>
      <soundWorking>Recipe_Tailor</soundWorking>
      <recipeUsers>

ElectricTailoringBench

HandTailoringBench

      </recipeUsers>
      <useIngredientsForColor>true</useIngredientsForColor>
      <skillRequirements>
        <Crafting>4</Crafting>
      </skillRequirements>
    </recipeMaker>
    <thingCategories>

ApparelUtility

    </thingCategories>
    <apparel>
      <careIfWornByCorpse>true</careIfWornByCorpse>
      <countsAsClothingForNudity>false</countsAsClothingForNudity>
      <careIfDamaged>false</careIfDamaged>
      <wearPerDay>0</wearPerDay>
      <gender>Female</gender>
      <bodyPartGroups>

GenitalsBPG

      </bodyPartGroups>
      <layers>

Absorber

      </layers>
      <tags>

Absorber

      </tags>
      <defaultOutfitTags>

Worker

Soldier

Nudist

Slave

      </defaultOutfitTags>
    </apparel>
    <modExtensions>

        <passiveAbsorptionPerHour>0.2</passiveAbsorptionPerHour>
        <leakAfterDirty>false</leakAfterDirty>
        <effectsAfterDirty>true</effectsAfterDirty>
        <minHourstoDirtyEffect>10</minHourstoDirtyEffect>
        <dirtyDef>Absorber_Tampon_Dirty</dirtyDef>
        <dirtyEffectMTBHrs>100.0</dirtyEffectMTBHrs>

    </modExtensions>
  </ThingDef>

  <ThingDef ParentName="ApparelNoQualityBase">
    <defName>Absorber_Tampon_Dirty</defName>
    dirty tampon
    <description>A wet used tampon.
May cause infection if left in.</description>
    <thingClass>RJW_Menstruation.Absorber_Tampon</thingClass>
    <graphicData>
      <texPath>Things/Item/Tampon</texPath>
      <graphicClass>Graphic_Single</graphicClass>
    </graphicData>
    <tickerType>Never</tickerType>
    <smeltable>false</smeltable>
    <tradeability>None</tradeability>
    <statBases>
      <MaxHitPoints>20</MaxHitPoints>
      <Mass>0.05</Mass>
      <MarketValue>0</MarketValue>
      <WorkToMake>1000</WorkToMake>
      <Flammability>0.2</Flammability>
      <EquipDelay>2</EquipDelay>
      <MaxAbsorbable>10</MaxAbsorbable>
      <Cleanliness>-5</Cleanliness>
    </statBases>
    <stuffCategories>

Fabric

    </stuffCategories>
    <thingCategories>

ApparelUtility

    </thingCategories>
    <apparel>
      <careIfWornByCorpse>true</careIfWornByCorpse>
      <countsAsClothingForNudity>false</countsAsClothingForNudity>
      <careIfDamaged>false</careIfDamaged>
      <wearPerDay>0</wearPerDay>
      <gender>Female</gender>
      <bodyPartGroups>

GenitalsBPG

      </bodyPartGroups>
      <layers>

Absorber

      </layers>
      <tags>

Absorber

      </tags>
    </apparel>
    <modExtensions>

        <passiveAbsorptionPerHour>0.2</passiveAbsorptionPerHour>
        <leakAfterDirty>false</leakAfterDirty>
        <effectsAfterDirty>true</effectsAfterDirty>
        <minHourstoDirtyEffect>8</minHourstoDirtyEffect>
        <dirtyDef>Absorber_Tampon_Dirty</dirtyDef>
        <dirtyEffectMTBHrs>100.0</dirtyEffectMTBHrs>

    </modExtensions>
  </ThingDef>

  <ThingDef ParentName="ApparelNoQualityBase">
    <defName>Absorber_Pad</defName>
    sanitary pad
    <description>A pad for absorbing fluids from a vagina.</description>
    <thingClass>RJW_Menstruation.Absorber</thingClass>
    <graphicData>
      <texPath>Things/Item/Pad</texPath>
      <graphicClass>Graphic_Single</graphicClass>
    </graphicData>
    <tickerType>Never</tickerType>
    <smeltable>false</smeltable>
    <tradeability>Sellable</tradeability>
    <statBases>
      <MaxHitPoints>40</MaxHitPoints>
      <Mass>0.02</Mass>
      <WorkToMake>1000</WorkToMake>
      <Flammability>1.0</Flammability>
      <EquipDelay>4</EquipDelay>
      <MaxAbsorbable>25</MaxAbsorbable>
      <StuffEffectMultiplierArmor>0.02</StuffEffectMultiplierArmor>
      <StuffEffectMultiplierInsulation_Cold>0.02</StuffEffectMultiplierInsulation_Cold>
      <StuffEffectMultiplierInsulation_Heat>0.05</StuffEffectMultiplierInsulation_Heat>
      <ArmorRating_Sharp>0.01</ArmorRating_Sharp>
      <ArmorRating_Blunt>0.04</ArmorRating_Blunt>
      <ArmorRating_Heat>0.05</ArmorRating_Heat>
      <Insulation_Cold>1</Insulation_Cold>
      <Insulation_Heat>-1</Insulation_Heat>
    </statBases>
    <costStuffCount>10</costStuffCount>
    <stuffCategories>

Fabric

    </stuffCategories>
    <recipeMaker>
      <unfinishedThingDef>UnfinishedApparel</unfinishedThingDef>
      <workSpeedStat>GeneralLaborSpeed</workSpeedStat>
      <workSkill>Crafting</workSkill>
      <effectWorking>Tailor</effectWorking>
      <soundWorking>Recipe_Tailor</soundWorking>
      <recipeUsers>

ElectricTailoringBench

HandTailoringBench

      </recipeUsers>
      <useIngredientsForColor>true</useIngredientsForColor>
      <skillRequirements>
        <Crafting>4</Crafting>
      </skillRequirements>
    </recipeMaker>
    <thingCategories>

ApparelUtility

    </thingCategories>
    <apparel>
      <careIfWornByCorpse>true</careIfWornByCorpse>
      <countsAsClothingForNudity>true</countsAsClothingForNudity>
      <careIfDamaged>false</careIfDamaged>
      <wearPerDay>0</wearPerDay>
      <gender>Female</gender>
      <bodyPartGroups>

GenitalsBPG

      </bodyPartGroups>
      <layers>

Absorber

      </layers>
      <tags>

Absorber

      </tags>
      <defaultOutfitTags>

Worker

Soldier

Slave

      </defaultOutfitTags>
    </apparel>
    <modExtensions>

        <passiveAbsorptionPerHour>0.04</passiveAbsorptionPerHour>
        <leakAfterDirty>true</leakAfterDirty>
        <effectsAfterDirty>false</effectsAfterDirty>
        <dirtyDef>Absorber_Pad_Dirty</dirtyDef>

    </modExtensions>
  </ThingDef>

  <ThingDef ParentName="ApparelNoQualityBase">
    <defName>Absorber_Pad_Dirty</defName>
    wet sanitary pad
    <description>A wet used pad.</description>
    <thingClass>RJW_Menstruation.Absorber</thingClass>
    <graphicData>
      <texPath>Things/Item/Pad</texPath>
      <graphicClass>Graphic_Single</graphicClass>
    </graphicData>
    <tickerType>Never</tickerType>
    <smeltable>false</smeltable>
    <tradeability>None</tradeability>
    <statBases>
      <MaxHitPoints>40</MaxHitPoints>
      <Mass>0.10</Mass>
      <MarketValue>0</MarketValue>
      <WorkToMake>1000</WorkToMake>
      <Flammability>0.2</Flammability>
      <EquipDelay>4</EquipDelay>
      <MaxAbsorbable>25</MaxAbsorbable>
      <Cleanliness>-5</Cleanliness>
      <StuffEffectMultiplierArmor>0.02</StuffEffectMultiplierArmor>
      <StuffEffectMultiplierInsulation_Cold>0.02</StuffEffectMultiplierInsulation_Cold>
      <StuffEffectMultiplierInsulation_Heat>0.05</StuffEffectMultiplierInsulation_Heat>
      <ArmorRating_Sharp>0.01</ArmorRating_Sharp>
      <ArmorRating_Blunt>0.04</ArmorRating_Blunt>
      <ArmorRating_Heat>0.1</ArmorRating_Heat>
      <Insulation_Cold>-4</Insulation_Cold>
      <Insulation_Heat>2</Insulation_Heat>
    </statBases>
    <stuffCategories>

Fabric

    </stuffCategories>
    <thingCategories>

ApparelUtility

    </thingCategories>
    <apparel>
      <careIfWornByCorpse>true</careIfWornByCorpse>
      <countsAsClothingForNudity>true</countsAsClothingForNudity>
      <careIfDamaged>false</careIfDamaged>
      <wearPerDay>0</wearPerDay>
      <gender>Female</gender>
      <bodyPartGroups>

GenitalsBPG

      </bodyPartGroups>
      <layers>

Absorber

      </layers>
      <tags>

Absorber

      </tags>
    </apparel>
    <modExtensions>

        <passiveAbsorptionPerHour>0.04</passiveAbsorptionPerHour>
        <leakAfterDirty>true</leakAfterDirty>
        <effectsAfterDirty>false</effectsAfterDirty>
        <dirtyDef>Absorber_Pad_Dirty</dirtyDef>

    </modExtensions>
  </ThingDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<ThingDef ParentName="BaseFilth">
		<defName>FilthMixture</defName>
		<label>mixture</label>
		<thingClass>RJW_Menstruation.Filth_Colored</thingClass>
		<statBases>
			<Beauty>-30</Beauty>
			<Cleanliness>-10</Cleanliness>
		</statBases>
		<graphicData>
			<graphicClass>Graphic_Random</graphicClass>
			<texPath>Things/Filth/PoolSoft</texPath>
			<color>(255, 255, 255, 180)</color>
		</graphicData>
		<filth>
			<rainWashes>true</rainWashes>
			<cleaningWorkToReduceThickness>40</cleaningWorkToReduceThickness>
			<canFilthAttach>true</canFilthAttach>
		</filth>
	</ThingDef>

</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<ThoughtDef>
		<defName>LeakingFluids</defName>
		<thoughtClass>Thought_Memory</thoughtClass>
		<durationDays>0.05</durationDays>
		<stackLimit>1</stackLimit>
		<stackedEffectMultiplier>0.4</stackedEffectMultiplier>
		<stages>

				dripping fluids
				<description>Can't I get something to absorb this?</description>
				<baseMoodEffect>-2</baseMoodEffect>

		</stages>
	</ThoughtDef>

	<ThoughtDef>
		<defName>HaterCameInsideM</defName>
		<thoughtClass>Thought_MemorySocial</thoughtClass>
		<durationDays>1.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.4</stackedEffectMultiplier>
		<stages>

				came inside of {0}
				<description>I came inside of my rival!</description>
				<baseMoodEffect>5</baseMoodEffect>
				<baseOpinionOffset>1</baseOpinionOffset>

		</stages>
    <replaceThoughts>

CameInsideMIdeo

CameInsideM

    </replaceThoughts>
	</ThoughtDef>

	<ThoughtDef>
		<defName>CameInsideM</defName>
		<thoughtClass>Thought_MemorySocial</thoughtClass>
		<durationDays>1.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.4</stackedEffectMultiplier>
		<stages>

				came inside of {0}
				<description>That felt so good.</description>
				<baseMoodEffect>2</baseMoodEffect>
				<baseOpinionOffset>1</baseOpinionOffset>

		</stages>
	</ThoughtDef>

	<ThoughtDef>
		<defName>CameInsideFFetish</defName>
		<thoughtClass>Thought_MemorySocial</thoughtClass>
		<durationDays>3.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
		<stages>

				{0} came inside
				<description>I hope I get pregnant.</description>
				<baseMoodEffect>10</baseMoodEffect>
				<baseOpinionOffset>5</baseOpinionOffset>

		</stages>
    <replaceThoughts>

CameInsideFIdeo

    </replaceThoughts>
	</ThoughtDef>

	<ThoughtDef>
		<defName>HaterCameInsideF</defName>
		<thoughtClass>Thought_MemorySocial</thoughtClass>
		<durationDays>7.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
		<stages>

				{0} came inside
				<description>I don't want to be pregnant with his baby!</description>
				<baseMoodEffect>-5</baseMoodEffect>
				<baseOpinionOffset>-10</baseOpinionOffset>

		</stages>
    <replaceThoughts>

HaterCameInsideFEstrus

CameInsideF

HaterCameInsideFSafe

CameInsideFLowFert

CameInsideFFetishSafe

HaterCameInsideFIdeo

CameInsideFFetish

CameInsideFIdeo

    </replaceThoughts>
	</ThoughtDef>

	<ThoughtDef>
		<defName>HaterCameInsideFEstrus</defName>
		<thoughtClass>Thought_MemorySocial</thoughtClass>
		<durationDays>7.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
		<stages>

				{0} came inside
				<description>What was I thinking, letting him do that?</description>
				<baseMoodEffect>-3</baseMoodEffect>
				<baseOpinionOffset>-5</baseOpinionOffset>

		</stages>
    <replaceThoughts>

CameInsideF

HaterCameInsideFSafe

CameInsideFLowFert

CameInsideFFetishSafe

HaterCameInsideFIdeo

CameInsideFFetish

CameInsideFIdeo

    </replaceThoughts>
	</ThoughtDef>

	<ThoughtDef>
		<defName>CameInsideFLowFert</defName>
		<thoughtClass>Thought_MemorySocial</thoughtClass>
		<durationDays>3.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
		<stages>

				{0} came inside
				<description>I'm worried I might get pregnant.
The chance is low, but...</description>
				<baseMoodEffect>-1</baseMoodEffect>

		</stages>
    <replaceThoughts>

CameInsideFFetishSafe

HaterCameInsideFIdeo

CameInsideFFetish

CameInsideFIdeo

    </replaceThoughts>
	</ThoughtDef>

	<ThoughtDef>
		<defName>CameInsideF</defName>
		<thoughtClass>Thought_MemorySocial</thoughtClass>
		<durationDays>7.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
		<stages>

				{0} came inside
				<description>I'm worried I might get pregnant.</description>
				<baseMoodEffect>-3</baseMoodEffect>
				<baseOpinionOffset>-2</baseOpinionOffset>

		</stages>
    <replaceThoughts>

HaterCameInsideFSafe

CameInsideFLowFert

CameInsideFFetishSafe

HaterCameInsideFIdeo

CameInsideFFetish

CameInsideFIdeo

    </replaceThoughts>
	</ThoughtDef>

	<ThoughtDef>
		<defName>CameInsideFFetishSafe</defName>
		<thoughtClass>Thought_MemorySocial</thoughtClass>
		<durationDays>3.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
		<stages>

				{0} came inside
				<description>I don't think I'll get pregnant, but it's fun to fantasize.</description>
				<baseMoodEffect>3</baseMoodEffect>
				<baseOpinionOffset>1</baseOpinionOffset>

		</stages>
    <replaceThoughts>

HaterCameInsideFIdeo

CameInsideFFetish

CameInsideFIdeo

    </replaceThoughts>
	</ThoughtDef>

	<ThoughtDef>
		<defName>HaterCameInsideFSafe</defName>
		<thoughtClass>Thought_MemorySocial</thoughtClass>
		<durationDays>3.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
		<stages>

				{0} came inside
				<description>I probably won't get pregnant, but I still don't like it.</description>
				<baseMoodEffect>-2</baseMoodEffect>
				<baseOpinionOffset>-5</baseOpinionOffset>

		</stages>
    <replaceThoughts>

CameInsideFLowFert

CameInsideFFetishSafe

HaterCameInsideFIdeo

CameInsideFFetish

CameInsideFIdeo

    </replaceThoughts>
	</ThoughtDef>

	<ThoughtDef>
		<defName>UnwantedPregnancy</defName>
		<thoughtClass>Thought_Memory</thoughtClass>
		<durationDays>14.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stages>

				unwanted pregnancy
				<description>How will I take care of a baby? What am I going to do?</description>
				<baseMoodEffect>-10</baseMoodEffect>

		</stages>
	</ThoughtDef>

	<ThoughtDef>
		<defName>UnwantedPregnancyMild</defName>
		<thoughtClass>Thought_Memory</thoughtClass>
		<durationDays>14.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stages>

				unwanted pregnancy
				<description>I'm having a baby. I hope I can manage.</description>
				<baseMoodEffect>-3</baseMoodEffect>

		</stages>
	</ThoughtDef>

	<ThoughtDef>
		<defName>TookContraceptivePill</defName>
		<thoughtClass>Thought_Memory</thoughtClass>
		<durationDays>7.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stages>

				took contraceptive pill
				<description>Everything will be okay now.</description>
				<baseMoodEffect>1</baseMoodEffect>

		</stages>
	</ThoughtDef>

	<ThoughtDef>
		<defName>HateTookContraceptivePill</defName>
		<thoughtClass>Thought_Memory</thoughtClass>
		<durationDays>7.0</durationDays>
		<stackLimit>5</stackLimit>
		<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
		<stages>

				took contraceptive pill
				<description>I want to get pregnant.</description>
				<baseMoodEffect>-3</baseMoodEffect>

		</stages>
	</ThoughtDef>

	<ThoughtDef>
		<defName>EggRestorationReceived</defName>
		<thoughtClass>Thought_Memory</thoughtClass>
		<durationDays>4</durationDays>
		<stackLimit>1</stackLimit>
		<stages>

				egg restoration received
				<description>I can breed for a little longer now.</description>
				<baseMoodEffect>2</baseMoodEffect>

		</stages>
	</ThoughtDef>

  <ThoughtDef>
    <defName>CameInsideMIdeo</defName>
    <thoughtClass>Thought_MemorySocial</thoughtClass>
    <durationDays>1.0</durationDays>
    <stackLimit>5</stackLimit>
    <stackedEffectMultiplier>0.4</stackedEffectMultiplier>
    <stages>

        came inside of {0}
        <description>It is my duty to make her pregnant.</description>
        <baseMoodEffect>3</baseMoodEffect>
        <baseOpinionOffset>2</baseOpinionOffset>

    </stages>
    <replaceThoughts>

CameInsideM

    </replaceThoughts>
  </ThoughtDef>

  <ThoughtDef>
    <defName>CameInsideFIdeo</defName>
    <thoughtClass>Thought_MemorySocial</thoughtClass>
    <durationDays>3.0</durationDays>
    <stackLimit>5</stackLimit>
    <stackedEffectMultiplier>0.1</stackedEffectMultiplier>
    <stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
    <stages>

        {0} came inside
        <description>I hope this makes me pregnant like I should be.</description>
        <baseMoodEffect>15</baseMoodEffect>
        <baseOpinionOffset>10</baseOpinionOffset>

    </stages>
  </ThoughtDef>

  <ThoughtDef>
    <defName>HaterCameInsideFIdeo</defName>
    <thoughtClass>Thought_MemorySocial</thoughtClass>
    <durationDays>3.0</durationDays>
    <stackLimit>5</stackLimit>
    <stackedEffectMultiplier>0.1</stackedEffectMultiplier>
    <stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
    <stages>

        {0} came inside
        <description>I know I should become pregnant, but does it have to be his?</description>
        <baseMoodEffect>5</baseMoodEffect>
        <baseOpinionOffset>2</baseOpinionOffset>

    </stages>
    <replaceThoughts>

CameInsideFFetish

CameInsideFIdeo

    </replaceThoughts>
  </ThoughtDef>

  <ThoughtDef>
    <defName>HateTookContraceptivePillIdeo</defName>
    <thoughtClass>Thought_Memory</thoughtClass>
    <durationDays>7.0</durationDays>
    <stackLimit>5</stackLimit>
    <stackedEffectMultiplier>0.1</stackedEffectMultiplier>
    <stages>

        took contraceptive pill
        <description>My beliefs demand I become pregnant.</description>
        <baseMoodEffect>-5</baseMoodEffect>

    </stages>
  </ThoughtDef>

</Defs>


code:
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
  <Absorber.label>生殖器</Absorber.label>
</LanguageData>


code:
<?xml version="1.0" encoding="utf-8"?>

<LanguageData>
  <Hediff_MenstrualCramp.label>中枢性疼痛</Hediff_MenstrualCramp.label>
  <Hediff_MenstrualCramp.description>经期中</Hediff_MenstrualCramp.description>
  <Hediff_MenstrualCramp.stages.0.label>不快</Hediff_MenstrualCramp.stages.0.label>
  <Hediff_MenstrualCramp.stages.1.label>恼人</Hediff_MenstrualCramp.stages.1.label>
  <Hediff_MenstrualCramp.stages.2.label>疼痛</Hediff_MenstrualCramp.stages.2.label>
  <Hediff_MenstrualCramp.stages.3.label>痛苦</Hediff_MenstrualCramp.stages.3.label>

</LanguageData>


code:
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
  <VaginaWashing.reportString>清洗阴道</VaginaWashing.reportString>

</LanguageData>


code:
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
  <MaxAbsorbable.label>可吸收量</MaxAbsorbable.label>
  <MaxAbsorbable.description>最大可吸收的液体量</MaxAbsorbable.description>

</LanguageData>


code:
<?xml version="1.0" encoding="UTF-8"?>

<LanguageData>

<Absorber_Tampon.label>卫生棉条</Absorber_Tampon.label>

<Absorber_Tampon.description>从阴道吸收液体的卫生棉条</Absorber_Tampon.description>

<Absorber_Tampon_Dirty.label>湿的卫生棉条</Absorber_Tampon_Dirty.label>

<Absorber_Tampon_Dirty.description>使用过的湿卫生棉条</Absorber_Tampon_Dirty.description>

<Absorber_Pad.label>卫生棉</Absorber_Pad.label>

<Absorber_Pad.description>从阴道吸收液体的卫生棉</Absorber_Pad.description>

<Absorber_Pad_Dirty.label>湿的卫生棉</Absorber_Pad_Dirty.label>

<Absorber_Pad_Dirty.description>使用过的湿卫生棉</Absorber_Pad_Dirty.description>

<OvaryRegenerationPill.label>卵巢再生药物</OvaryRegenerationPill.label>

<OvaryRegenerationPill.description>使卵巢再生以增加可排卵的卵子
卵子消耗量越大，效果越差
不能缓解更年期症状</OvaryRegenerationPill.description>

<SuperovulationInducingAgent.label>排卵药</SuperovulationInducingAgent.label>

<SuperovulationInducingAgent.description>诱导排卵的药物
可导致更年期提前</SuperovulationInducingAgent.description>

<FilthMixture.label>混合物</FilthMixture.label>

</LanguageData>