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

namespace RJW_Menstruation
{
    public class Dialog_HybridCustom : Window
    {
        private static Vector2 scroll;
        private const float windowMargin = 20f;
        static private List<FloatMenuOption> raceList = new List<FloatMenuOption>();
        static private List<HybridInformations> removeList = new List<HybridInformations>();

        public Dialog_HybridCustom()
        {
            BuildRaceList();
        }

        public void BuildRaceList()
        {
            raceList.Clear();
            if (!VariousDefOf.AllRaces.NullOrEmpty())
                foreach(ThingDef def in VariousDefOf.AllRaces)
                {
                    if (def.race != null)
                    {
                        if (Configurations.IsOverrideExist(def)) continue;
                        else
                        {
                            raceList.Add(new FloatMenuOption(def.label, delegate { AddHybridOverride(def); } ));
                        }
                    }
                }
            raceList.SortBy(x => x.Label);
        }

        public void AddHybridOverride(ThingDef def)
        {
            FloatMenuOption option = raceList.FirstOrDefault(x => x.Label.Equals(def?.label));
            if (option != null)
            {
                raceList.Remove(option);
                if (Configurations.HybridOverride.NullOrEmpty())
                {
                    Configurations.HybridOverride = new List<HybridInformations>();
                }
                Configurations.HybridOverride.Add(new HybridInformations(def));
                Configurations.HybridOverride.SortBy(x => x.GetDef?.label ?? "Undefined");
            }

        }

        public override Vector2 InitialSize
        {
            get
            {
                float width = 480f;
                float height = 640f;
                return new Vector2(width, height);
            }
        }

        public override void DoWindowContents(Rect inRect)
        {
            soundClose = SoundDefOf.CommsWindow_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);

            DoMainContents(mainRect);

            if (Widgets.CloseButtonFor(closeRect))
            {
                Close();
            }
        }

        public override void PostClose()
        {
            base.PostClose();
            if (!removeList.NullOrEmpty())
            {
                foreach (HybridInformations extension in removeList)
                {
                    Configurations.HybridOverride.Remove(extension);
                }
                raceList.SortBy(x => x.Label);
            }
            removeList.Clear();
        }

        protected void DoMainContents(Rect inRect)
        {
            Rect buttonRect = new Rect(inRect.xMax - 120, 0, 100, 30);
            Rect titleRect = new Rect(inRect.x, 0, 200, 30);
            Widgets.Label(titleRect, Translations.CustomHybrid_List_Title);
            Widgets.DrawLineHorizontal(titleRect.x, titleRect.yMax + 12f, inRect.width);
            if (Widgets.ButtonText(buttonRect, "Add"))
            {
                if (!raceList.NullOrEmpty()) Find.WindowStack.Add(new FloatMenu(raceList));
            }
            if (!removeList.NullOrEmpty())
            {
                buttonRect.x -= 100;
                if (Widgets.ButtonText(buttonRect, "Undo"))
                {
                    var element = removeList.Last();
                    Configurations.HybridOverride.Add(element);
                    Configurations.HybridOverride.SortBy(x => x.GetDef?.label ?? "Undefined");
                    removeList.Remove(element);
                }

                foreach (HybridInformations extension in removeList)
                {
                    Configurations.HybridOverride.Remove(extension);
                }
                raceList.SortBy(x => x.Label);
            }

            Rect outRect = new Rect(inRect.x, inRect.y + 30f, inRect.width, inRect.height - 30f);
            Rect mainRect = new Rect(inRect.x, inRect.y + 30f, inRect.width - 30f, Math.Max(24f*Configurations.HybridOverride?.Count() ?? 1,10f));
            Listing_Standard listmain = new Listing_Standard();

            listmain.BeginScrollView(outRect, ref scroll, ref mainRect);
            listmain.Begin(mainRect);
            int i = 0;
            if (!Configurations.HybridOverride.NullOrEmpty())
                foreach(HybridInformations extension in Configurations.HybridOverride)
                {
                    if (extension.GetDef != null) DoRow(listmain.GetRect(24f),extension, i++);
                }
            listmain.EndScrollView(ref mainRect);
            listmain.End();

        }

        protected void DoRow(Rect rect, HybridInformations extension, int index)
        {
            Rect buttonRect = new Rect(rect.xMax - 90f, rect.y, 80f, rect.height);
            Widgets.Label(rect, extension.GetDef?.label ?? "Undefined");
            if (Widgets.ButtonText(buttonRect, "Delete"))
            {
                removeList.Add(extension);
                //raceList.Add(new FloatMenuOption(extension.GetDef.label, delegate { AddHybridOverride(extension.GetDef); }));
            }
            buttonRect.x -= 80f;
            if (Widgets.ButtonText(buttonRect, "Edit"))
            {
                Dialog_EditHybrid.OpenWindow(extension);
            }

            Widgets.DrawHighlightIfMouseover(rect);
        }

        public static void ToggleWindow()
        {
            Dialog_HybridCustom window = (Dialog_HybridCustom)Find.WindowStack.Windows.FirstOrDefault(x => x.GetType().Equals(typeof(Dialog_HybridCustom)));
            if (window != null)
            {
                Find.WindowStack.TryRemove(typeof(Dialog_HybridCustom), true);
            }
            else
            {
                SoundDefOf.CommsWindow_Open.PlayOneShotOnCamera();
                Find.WindowStack.Add(new Dialog_HybridCustom());
            }

        }

    }

    public class Dialog_EditHybrid : Window
    {
        private const float windowMargin = 20f;
        private const float rowH = 24f;
        private HybridInformations info;
        private Vector2 scroll;
        protected List<FloatMenuOption> raceList = new List<FloatMenuOption>();
        protected List<HybridExtensionExposable> removeList = new List<HybridExtensionExposable>();
        protected float totalWeight = 0;

        public Dialog_EditHybrid(HybridInformations info)
        {
            this.info = info;
            BuildRaceList();
        }

        public override Vector2 InitialSize
        {
            get
            {
                float width = 840f;
                float height = 640f;
                return new Vector2(width, height);
            }
        }

        public override void DoWindowContents(Rect inRect)
        {
            soundClose = SoundDefOf.CommsWindow_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);

            DoMainContents(mainRect);

            if (Widgets.CloseButtonFor(closeRect))
            {
                Close();
            }
        }

        public static void OpenWindow(HybridInformations info)
        {
            Dialog_EditHybrid window = (Dialog_EditHybrid)Find.WindowStack.Windows.FirstOrDefault(x => x.GetType().Equals(typeof(Dialog_EditHybrid)));
            if (window != null)
            {
                if (window.info != info)
                {
                    SoundDefOf.TabOpen.PlayOneShotOnCamera();
                    window.ChangeExtension(info);
                }
            }
            else
            {
                SoundDefOf.TabClose.PlayOneShotOnCamera();
                Find.WindowStack.Add(new Dialog_EditHybrid(info));
            }

        }

        protected void ChangeExtension(HybridInformations info)
        {
            this.info = info;
            BuildRaceList();
        }

        protected void BuildRaceList()
        {
            raceList.Clear();
            if (!VariousDefOf.AllRaces.NullOrEmpty())
                foreach (ThingDef def in VariousDefOf.AllRaces)
                {
                    if (def.race != null)
                    {
                        if (info.hybridExtension.Exists(x => x.defName == def.defName)) continue;
                        else
                        {
                            raceList.Add(new FloatMenuOption(def.label, delegate { AddHybridInfo(def); }));
                        }
                    }
                }
            raceList.SortBy(x => x.Label);
        }

        protected void AddHybridInfo(ThingDef def)
        {
            FloatMenuOption option = raceList.FirstOrDefault(x => x.Label == def.label);
            if (option != null)
            {
                raceList.Remove(option);
            }
            info.hybridExtension.Add(new HybridExtensionExposable(def));
        }

        protected void DoMainContents(Rect inRect)
        {
            Rect labelRect = new Rect(inRect.xMin, inRect.yMin, 300, 24);
            Rect buttonRect = new Rect(inRect.xMax - 120, 0, 100, 30);

            Widgets.Label(labelRect, Translations.CustomHybrid_Title(info.GetDef?.label ?? "Undefined"));
            Widgets.DrawLineHorizontal(inRect.x, labelRect.yMax, inRect.width);
            if (Widgets.ButtonText(buttonRect, "Add"))
            {
                if (!raceList.NullOrEmpty()) Find.WindowStack.Add(new FloatMenu(raceList));
            }
            if (!removeList.EnumerableNullOrEmpty())
            {
                buttonRect.x -= 100;
                if (Widgets.ButtonText(buttonRect, "Undo"))
                {
                    var element = removeList.Last();
                    info.hybridExtension.Add(element);
                    removeList.Remove(element);
                }

                foreach (HybridExtensionExposable element in removeList)
                {
                    info.hybridExtension.Remove(element);
                }
            }

            float additionalHeight = 0f;
            if (!info.hybridExtension.NullOrEmpty()) foreach(HybridExtensionExposable e in info.hybridExtension)
                {
                    additionalHeight += (e.hybridInfo?.Count() ?? 1) * rowH;
                }

            Rect outRect = new Rect(inRect.x, inRect.y + 30f, inRect.width, inRect.height - 30f);
            Rect mainRect = new Rect(inRect.x, inRect.y + 30f, inRect.width - 30f, rowH * (info.hybridExtension?.Count() ?? 1) + additionalHeight);
            Listing_Standard listmain = new Listing_Standard();

            listmain.BeginScrollView(outRect, ref scroll, ref mainRect);
            listmain.Begin(mainRect);

            if (!info.hybridExtension.NullOrEmpty())
            {
                foreach (HybridExtensionExposable extension in info.hybridExtension)
                {
                    DoRow(listmain.GetRect(rowH + rowH * (extension.hybridInfo?.Count() ?? 1)), extension);
                }

            }

            listmain.EndScrollView(ref mainRect);
            listmain.End();
        }

        protected void DoRow(Rect rect, HybridExtensionExposable extension)
        {
            Rect mainRect = new Rect(rect.x, rect.y, rect.width, rowH);
            Rect subRect = new Rect(rect.x, rect.y + rowH, rect.width, rect.height - rowH);
            Rect buttonRect = new Rect(rect.xMax - 90f, rect.y, 80f, rowH);
            Widgets.Label(mainRect, extension.GetDef?.label ?? "Undefined");

            if (Widgets.ButtonText(buttonRect, "Delete"))
            {
                removeList.Add(extension);
            }
            buttonRect.x -= 80f;
            if (Widgets.ButtonText(buttonRect, "Add"))
            {
                List<FloatMenuOption> list = new List<FloatMenuOption>();
                if (!VariousDefOf.AllRaces.NullOrEmpty()) foreach(ThingDef def in VariousDefOf.AllRaces)
                    {
                        if (def.race != null)
                        {
                            if (extension.hybridInfo.ContainsKey(def.defName)) continue;
                            else
                            {
                                list.Add(new FloatMenuOption(def.label, delegate { extension.hybridInfo.Add(def.defName, 1.0f); }));
                            }
                        }
                    }
                if (!list.NullOrEmpty())
                {
                    list.SortBy(x => x.Label);
                    Find.WindowStack.Add(new FloatMenu(list));
                }

            }
            buttonRect.x -= 80f;

            Listing_Standard sublist = new Listing_Standard();
            sublist.Begin(subRect);

            List<string> removeelements = new List<string>();
            if (!extension.hybridInfo.EnumerableNullOrEmpty())
            {
                totalWeight = 0;
                foreach(KeyValuePair<string,float> element in extension.hybridInfo)
                {
                    totalWeight += element.Value;
                }

                List<string> keys = new List<string>(extension.hybridInfo.Keys);
                foreach (string key in keys)
                {
                    DoSubRow(sublist.GetRect(rowH), key, extension, removeelements);
                }
            }
            if(!removeelements.NullOrEmpty()) foreach(string key in removeelements)
                {
                    extension.hybridInfo.Remove(key);
                }

            sublist.End();
            Widgets.DrawHighlightIfMouseover(rect);

        }

        protected void DoSubRow(Rect rect, string key, HybridExtensionExposable extension , List<string> removeelements)
        {
            bool isPawnKind = false;
            int value = (int)extension.hybridInfo.TryGetValue(key);
            string valuestr = value.ToString();
            string label = null;
            label = DefDatabase<ThingDef>.GetNamedSilentFail(key)?.label;
            if (label == null)
            {
                label = DefDatabase<PawnKindDef>.GetNamedSilentFail(key)?.label ?? "Undefined";
                isPawnKind = true;
            }
            Rect buttonRect = new Rect(rect.xMax - 90f, rect.y, 80f, rect.height);
            if (Widgets.ButtonText(buttonRect, "Delete"))
            {
                removeelements.Add(key);
            }
            buttonRect.x -= 80f;
            if (!isPawnKind)
            {
                if (Widgets.ButtonText(buttonRect, "PawnKind"))
                {
                    List<FloatMenuOption> list = new List<FloatMenuOption>();
                    if (!VariousDefOf.AllKinds.NullOrEmpty()) foreach (PawnKindDef def in VariousDefOf.AllKinds)
                        {
                            if (def.race.defName == key)
                            {
                                if (extension.hybridInfo.ContainsKey(def.defName)) continue;
                                else
                                {
                                    list.Add(new FloatMenuOption(def.label, delegate { extension.hybridInfo.Add(def.defName, 1.0f); }));
                                }
                            }
                        }
                    if (!list.NullOrEmpty()) Find.WindowStack.Add(new FloatMenu(list));
                    else SoundDefOf.ClickReject.PlayOneShotOnCamera();
                }
                buttonRect.x -= 80f;
            }
            else
            {
                Widgets.Label(buttonRect, "  PawnKind");
                buttonRect.x -= 80f;
            }
            label += ": " + key;
            Widgets.Label(rect, " - " + label);
            Widgets.TextFieldNumeric(buttonRect, ref value, ref valuestr,0,9999999);
            extension.hybridInfo.SetOrAdd(key, value);
            buttonRect.x -= 80f;
            Widgets.Label(buttonRect, String.Format("{0,0:P2}", value / totalWeight));
            Widgets.DrawHighlightIfMouseover(rect);
            TooltipHandler.TipRegion(rect, Translations.CustomHybrid_Tooltip(info.GetDef?.label ?? "Undefined", extension.GetDef?.label ?? "Undefined", label, String.Format("{0,0:0.########%}", value/totalWeight)));
        }

    }

}


code:
using System;
using RimWorld;
using rjw;
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 Texture2D womb;
        private Texture2D cum;
        private Texture2D vagina;
        private Texture2D anal;
        private Color cumcolor;

        private GUIStyle fontstylecenter = new GUIStyle() { alignment = TextAnchor.MiddleCenter };
        private GUIStyle fontstyleright = new GUIStyle() { alignment = TextAnchor.MiddleRight };
        private GUIStyle fontstyleleft = new GUIStyle() { alignment = TextAnchor.MiddleLeft };
        private GUIStyle boxstyle = new GUIStyle(GUI.skin.textArea);
        private GUIStyle buttonstyle = new GUIStyle(GUI.skin.button);

        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)
            {
                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;

        }

        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;
            bool pregnant = pawn.IsPregnant();
            Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
            if (pregnant && Utility.ShowFetusImage((Hediff_BasePregnancy)hediff))
            {
                womb = comp.GetPregnancyIcon(hediff);
                if (hediff is Hediff_MultiplePregnancy)
                {
                    Hediff_MultiplePregnancy h = (Hediff_MultiplePregnancy)hediff;
                    if (h.GestationProgress < 0.2f) cum = comp.GetCumIcon();
                    else cum = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
                    Pawn fetus = pawn.GetFetus();
                    if (fetus != null && Utility.ShowFetusInfo())
                    {
                        string feinfo = h.GetBabyInfo();
                        string fainfo = h.GetFatherInfo() + "  ";
                        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)
                {
                    Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
                    if (h.GestationProgress < 0.2f) cum = comp.GetCumIcon();
                    else cum = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
                    Pawn fetus = pawn.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;

                        GUI.Box(preginfo, h.babies.Count + " " + fetus.def.label + " " + Translations.Dialog_WombInfo02, buttonstyle);
                        GUI.Label(preginfo, Translations.Dialog_WombInfo03 + ": " + h.father.LabelShort + "  ", 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), 1.0f);
            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, fontstylecenter);
            if (pawn.story != null) GUI.Label(pawnLabel2Rect, 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);
                }

            }

            Rect wombInfoRect = new Rect(0f, mainRect.yMax - wombrecth - fontheight - 2, wombRectWidth, fontheight);

            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);
            GUI.color = Color.white;

            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);
                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_NewTemp(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)
        {
            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();
            anal = pawn.GetAnalIcon();
            GUI.color = new Color(1.00f, 0.47f, 0.47f, 1);
            GUI.Box(rect, "", boxstyle);
            GUI.color = pawn.story.SkinColor;
            //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.slaaneshTexture,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.khorneTexture,Texture2D.blackTexture, xxx.vulnerability_stat.description);
            lineRect.y += height;

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

            statvalue = pawn.records.GetValue(xxx.CountOfBirthHuman);
            FillableBarLabeled(lineRect, "  " + xxx.CountOfBirthHuman.LabelCap.CapitalizeFirst() + " " + statvalue, statvalue / 10, TextureCache.humanTexture, 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.nurgleTexture, Texture2D.blackTexture, xxx.CountOfBirthEgg.description);
            lineRect.y += height;

            statvalue = pawn.records.GetValue(xxx.CountOfWhore);
            if (statvalue > 0)
            {
                FillableBarLabeled(lineRect, "  " + xxx.CountOfWhore.LabelCap.CapitalizeFirst() + " " + statvalue, statvalue / 50, TextureCache.slaaneshTexture, Texture2D.blackTexture, xxx.CountOfWhore.description);
                statvalue = pawn.records.GetValue(xxx.EarnedMoneyByWhore);
                lineRect.y += height;
                FillableBarLabeled(lineRect, "  " + VariousDefOf.RJW_EarnedMoneyByWhore.label.CapitalizeFirst() + " " + statvalue, statvalue / 10000, TextureCache.ghalmarazTexture, Texture2D.blackTexture);

                lineRect.y += height;
            }
            else
            {
                lineRect.y += height;
                lineRect.y += height;
            }

            statvalue = Configurations.ImplantationChance * comp.Props.baseImplantationChanceFactor * comp.ImplantFactor;
            FillableBarLabeled(lineRect, "  " + xxx.reproduction.LabelCap.CapitalizeFirst() + " " + statvalue.ToStringPercent(), statvalue, TextureCache.fertilityTexture, Texture2D.blackTexture, Translations.FertilityDesc);
            Rect overayRect = new Rect(lineRect.x, lineRect.y, lineRect.width * Math.Min(1.0f, comp.GetFertilityChance()), lineRect.height);
            GUI.DrawTexture(overayRect, 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);
        }

    }
}

license: unknown


code:
using UnityEngine;
using Verse;

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

        protected override void DrawIcon(Rect rect, Material buttonMat = null)
        {
            Texture2D badTex = icon;
            Texture2D overay = icon_overay;
            Color color = cumcolor;

            if (badTex == null)
            {
                badTex = BaseContent.BadTex;
            }
            if (overay == null)
            {
                overay = 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, overay, iconDrawScale * 0.85f, iconProportions, iconTexCoords, iconAngle, buttonMat);
            GUI.color = Color.white;
            if (Configurations.DrawEggOverlay) comp.DrawEggOverlay(rect);

        }

    }
}


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

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 System.Random random = new System.Random(Environment.TickCount);

        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>();
            if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorf")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
            if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
            if (part == null) part = 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 = part.FluidAmmount * part.FluidModifier * pawn.BodySize / pawn.RaceProps.baseBodySize * Rand.Range(0.8f, 1.2f) * RJWSettings.cum_on_body_amount_adjust * 0.3f;
            }
            catch (NullReferenceException)
            {
                res = 0.0f;
            }
            if (pawn.Has(Quirk.Messy)) res *= Rand.Range(4.0f, 8.0f);

            return res;
        }

        public static HediffComp_Breast GetBreastComp(this Pawn pawn)
        {
            var hedifflist = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_breastsBPR(pawn))?.FindAll((Hediff h) => h is Hediff_PartBaseNatural || h is Hediff_PartBaseArtifical);
            HediffComp_Breast result;
            if (hedifflist.NullOrEmpty()) return null;
            else
            {
                foreach(Hediff h in hedifflist)
                {
                    result = h.TryGetComp<HediffComp_Breast>();
                    if (result != null) return result;
                }
            }
            return null;
        }

        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)
        {
            var hedifflist = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.FindAll((Hediff h) => h.def.defName.ToLower().Contains("vagina"));
            HediffComp_Menstruation result;
            if (hedifflist.NullOrEmpty()) return false;
            else
            {
                foreach (Hediff h in hedifflist)
                {
                    result = h.TryGetComp<HediffComp_Menstruation>();
                    if (result != null) return true;
                }
            }
            return false;
        }

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

        public static float GetPregnancyProgress(this Pawn pawn)
        {
            Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
            if (hediff is Hediff_BasePregnancy)
            {
                Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
                return h.GestationProgress;
            }
            return -1;
        }

        public static Pawn GetFetus(this Pawn pawn)
        {
            Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
            if (hediff is Hediff_BasePregnancy)
            {
                Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
                if (!h.babies.NullOrEmpty()) return h.babies.First();
                else
                {
                    Log.Error("Baby not exist: baby was not created or removed. Remove pregnancy.");
                    pawn.health.RemoveHediff(hediff);
                    return null;
                }
            }

            return null;
        }

        public static Texture2D GetGenitalIcon(this Pawn pawn)
        {
            var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.Find((Hediff h) => h.def.defName.ToLower().Contains("vagina"));
            if (hediff == null) return ContentFinder<Texture2D>.Get("Genitals/Vagina00", true);
            HediffComp_Menstruation comp = hediff.GetMenstruationComp();
            string icon;
            if (comp != null) icon = comp.vagTex;
            else icon = "Genitals/Vagina";

            if (hediff.Severity < 0.20f) icon += "00";        //micro
            else if (hediff.Severity < 0.30f) icon += "01";   //tight
            else if (hediff.Severity < 0.40f) icon += "02";   //tight
            else if (hediff.Severity < 0.47f) icon += "03";   //average
            else if (hediff.Severity < 0.53f) icon += "04";   //average
            else if (hediff.Severity < 0.60f) icon += "05";   //average
            else if (hediff.Severity < 0.70f) icon += "06";   //accomodating
            else if (hediff.Severity < 0.80f) icon += "07";   //accomodating
            else if (hediff.Severity < 0.87f) icon += "08";   //cavernous
            else if (hediff.Severity < 0.94f) icon += "09";   //cavernous
            else if (hediff.Severity < 1.01f) icon += "10";   //cavernous
            else icon += "11";                                //abyssal

            return ContentFinder<Texture2D>.Get((icon), true);
        }

        public static Texture2D GetAnalIcon(this Pawn pawn)
        {
            var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault((Hediff h) => h.def.defName.ToLower().Contains("anus"));
            if (hediff != null)
            {
                CompProperties_Anus Props = (CompProperties_Anus)hediff.TryGetComp<HediffComp_Anus>()?.props;
                string icon;
                if (Props != null) icon = Props.analTex ?? "Genitals/Anal";
                else icon = "Genitals/Anal";
                if (hediff.Severity < 0.20f) icon += "00";        //micro
                else if (hediff.Severity < 0.40f) icon += "01";   //tight
                else if (hediff.Severity < 0.60f) icon += "02";   //average
                else if (hediff.Severity < 0.80f) icon += "03";   //accomodating
                else if (hediff.Severity < 1.01f) icon += "04";   //cavernous
                else icon += "05";                                //abyssal

                return ContentFinder<Texture2D>.Get((icon), true);
            }
            else
            {
                return ContentFinder<Texture2D>.Get(("Genitals/Anal00"), true);
            }
        }

        public static void DrawBreastIcon(this Pawn pawn, Rect rect)
        {
            var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_breastsBPR(pawn)).FirstOrDefault((Hediff h) => h.def.defName.ToLower().Contains("breast"));
            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 icon = "Breasts/Breast_Breast";
                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;

                nippleicon = icon + "_Nipple0" + GetNippleIndex(comp.NippleSize);
                areolaicon = icon + "_Areola0" + GetAreolaIndex(comp.AreolaSize);

                breast = ContentFinder<Texture2D>.Get(icon, false);
                areola = ContentFinder<Texture2D>.Get(areolaicon, false);
                nipple = ContentFinder<Texture2D>.Get(nippleicon, false);
                GUI.color = pawn.story.SkinColor;
                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 = pawn.story.SkinColor;
                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)
            {
                if (milkcomp is CompMilkable)
                {
                    bool active = (bool)milkcomp.GetPropertyValue("Active");
                    if (active)
                    {
                        CompMilkable m = (CompMilkable)milkcomp;
                        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)
            {
                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_NewTemp(new Verse.AI.Job(milkjob, pawn));
                    }
                }
                Widgets.DrawHighlightIfMouseover(buttonrect);
            }
        }

        public static string GetVaginaLabel(this Pawn pawn)
        {
            var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn)).Find((Hediff h) => h.def.defName.ToLower().Contains("vagina"));
            return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")" + "\n" + xxx.CountOfSex.LabelCap.CapitalizeFirst() + ": " + pawn.records.GetAsInt(xxx.CountOfSex);
        }
        public static string GetAnusLabel(this Pawn pawn)
        {
            var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault((Hediff 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)
        {
            var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_breastsBPR(pawn)).FirstOrDefault((Hediff h) => h.def.defName.ToLower().Contains("breast"));
            if (hediff != null) return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")";
            else return "";
        }

        public static bool ShowFetusImage(this Hediff_BasePregnancy 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(VariousDefOf.Relation_birthgiver, x => !x.Equals(mother)) ?? null;
                return res;
            }
        }

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

            return (float)res*(max-min) + min;

        }

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

    }
}


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

namespace RJW_Menstruation
{
    public static class VariousDefOf
    {

        public static readonly ThingDef CumFilth = DefDatabase<ThingDef>.GetNamed("FilthCum");
        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 HediffDef RJW_IUD = DefDatabase<HediffDef>.GetNamed("RJW_IUD");
        public static readonly HediffDef Hediff_MenstrualCramp = DefDatabase<HediffDef>.GetNamed("Hediff_MenstrualCramp");
        public static readonly HediffDef Hediff_Climacteric = DefDatabase<HediffDef>.GetNamed("Hediff_Climacteric");
        public static readonly HediffDef Hediff_Menopause = DefDatabase<HediffDef>.GetNamed("Hediff_Menopause");
        public static readonly HediffDef Hediff_Estrus = DefDatabase<HediffDef>.GetNamed("Hediff_Estrus");
        public static readonly HediffDef Hediff_Estrus_Consealed = DefDatabase<HediffDef>.GetNamed("Hediff_Estrus_Consealed");
        public static readonly StatDef MaxAbsorbable = DefDatabase<StatDef>.GetNamed("MaxAbsorbable");
        public static readonly PawnRelationDef Relation_birthgiver = DefDatabase<PawnRelationDef>.AllDefs.FirstOrDefault(d => d.defName == "RJW_Sire");
        public static readonly PawnRelationDef Relation_spawn = DefDatabase<PawnRelationDef>.AllDefs.FirstOrDefault(d => d.defName == "RJW_Pup");
        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 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 TookContraptivePill = DefDatabase<ThoughtDef>.GetNamed("TookContraptivePill");
        public static readonly ThoughtDef HateTookContraptivePill = DefDatabase<ThoughtDef>.GetNamed("HateTookContraptivePill");
        public static readonly HediffDef_PartBase Vagina = DefDatabase<HediffDef_PartBase>.GetNamed("Vagina");
        public static readonly CompProperties_Menstruation VaginaCompProperties = (CompProperties_Menstruation)Vagina.comps.FirstOrDefault(x => x is CompProperties_Menstruation);
        public static readonly KeyBindingDef OpenStatusWindowKey = DefDatabase<KeyBindingDef>.GetNamed("OpenStatusWindow");
        public static readonly PawnColumnDef RJW_EarnedMoneyByWhore = DefDatabase<PawnColumnDef>.GetNamed("RJW_EarnedMoneyByWhore");
        public static readonly RecordDef AmountofCreampied = DefDatabase<RecordDef>.GetNamed("AmountofCreampied");
        public static readonly RecordDef AmountofFertilizedEggs = DefDatabase<RecordDef>.GetNamed("AmountofFertilizedEggs");

        private static List<ThingDef> allraces = null;
        private static List<PawnKindDef> allkinds = null;

        public static List<ThingDef> AllRaces
        {
            get
            {
                if (allraces == null)
                {

                    List<ThingDef> allThings = DefDatabase<ThingDef>.AllDefsListForReading;
                    allraces = allThings.FindAll(x => x.race != null && x.race.IsFlesh);
                }
                return allraces;
            }
        }
        public static List<PawnKindDef> AllKinds
        {
            get
            {
                if (allkinds == null)
                {
                    List<PawnKindDef> allKinds = DefDatabase<PawnKindDef>.AllDefsListForReading;
                    allkinds = allKinds.FindAll(x => x.race != null);
                }
                return allkinds;
            }
        }

        // 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");

    }
}


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


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

<Defs>
<!-- Obsoleted
  <RJW_Menstruation.DNADef>
    <defName>Human</defName>
    <label>human fetus</label>
	<fetusTexPath>Fetus/Fetus_Default</fetusTexPath>
	<cumThickness>0.2</cumThickness>
-->

</Defs>


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>
	<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_Menopause">
		<hediffClass>HediffWithComps</hediffClass>
		<defName>Hediff_Menopause</defName>
		Menopause
		<labelNoun>menopause</labelNoun>
		<description>A condition caused by exhaustion of the ovaries' eggs. The womb can no longer produce children.</description>
		<labelNounPretty>{0} has entered menopause</labelNounPretty>
		<defaultLabelColor>(0.70,0.70,0.00)</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>

				Obsolete

		</stages>
		<comps>

				<disappearsAfterTicks>0</disappearsAfterTicks>

		</comps>
	</HediffDef>

	<HediffDef Name="Hediff_Climacteric">
		<hediffClass>HediffWithComps</hediffClass>
		<defName>Hediff_Climacteric</defName>
		Climacteric
		<labelNoun>climacteric</labelNoun>
		<description>Ovulation has become irregular as the ovaries approach exhaustion. Menopause will soon occur.</description>
		<defaultLabelColor>(0.70,0.70,0.00)</defaultLabelColor>
		<isBad>false</isBad>
		<tendable>false</tendable>
		<makesSickThought>false</makesSickThought>
		<makesAlert>false</makesAlert>
		<maxSeverity>1</maxSeverity>
		<initialSeverity>0.1</initialSeverity>
		<injuryProps>
			<canMerge>true</canMerge>
		</injuryProps>
		<stages>

				Obsolete

		</stages>
		<comps>

				<disappearsAfterTicks>0</disappearsAfterTicks>

		</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>
	</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_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>
    </apparel>
    <modExtensions>

        <leakAfterDirty>false</leakAfterDirty>
        <effectsAfterDirty>true</effectsAfterDirty>
        <minHourstoDirtyEffect>10</minHourstoDirtyEffect>
        <dirtyDef>Absorber_Tampon_Dirty</dirtyDef>

    </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>

        <leakAfterDirty>false</leakAfterDirty>
        <effectsAfterDirty>true</effectsAfterDirty>
        <minHourstoDirtyEffect>8</minHourstoDirtyEffect>
        <dirtyDef>Absorber_Tampon_Dirty</dirtyDef>

    </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>
    </apparel>
    <modExtensions>

        <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>

        <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>
	</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>
	</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>
	</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>-2</baseMoodEffect>
				<baseOpinionOffset>-5</baseOpinionOffset>

		</stages>
	</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>
	</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>
	</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>
	</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>
	</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>

</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>