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

namespace RJW_Menstruation
{
    public class Hediff_MultiplePregnancy : Hediff_BasePregnancy
    {
        public override void DiscoverPregnancy()
        {
            PregnancyThought();
            base.DiscoverPregnancy();
        }

        protected void PregnancyThought()
        {
            if (!is_discovered && xxx.is_human(pawn))
            {
                if (!pawn.Has(Quirk.Breeder) && pawn.relations?.DirectRelations?.Find(x => x.def.Equals(PawnRelationDefOf.Spouse) || x.def.Equals(PawnRelationDefOf.Fiance)) == null)
                {
                    if (pawn.Has(Quirk.ImpregnationFetish) || pawn.relations?.DirectRelations?.Find(x => x.def.Equals(PawnRelationDefOf.Lover)) != null)
                    {
                        pawn.needs.mood.thoughts.memories.TryGainMemory(VariousDefOf.UnwantedPregnancyMild);
                    }
                    else
                    {
                        pawn.needs.mood.thoughts.memories.TryGainMemory(VariousDefOf.UnwantedPregnancy);
                    }
                }

            }
        }

        public override void GiveBirth()
        {

            if (babies.NullOrEmpty())
            {
                ModLog.Warning(" no babies (debug?) " + this.GetType().Name);
                if (father == null)
                {
                    father = Trytogetfather(ref pawn);
                }
                Initialize(pawn, father);
            }

            List<Pawn> siblings = new List<Pawn>();
            foreach (Pawn baby in babies)
            {
                if (xxx.is_animal(baby))
                {
                    BestialBirth(baby, siblings);
                }
                else
                {
                    HumanlikeBirth(baby, siblings);
                }

            }

            pawn.health.RemoveHediff(this);
        }

        public string GetBabyInfo()
        {
            string res = "";
            if (!babies.NullOrEmpty())
            {
                var babiesdistinct = babies.Distinct(new RaceComparer());
                int iteration = 0;
                foreach (Pawn baby in babiesdistinct)
                {
                    int num = babies.Where(x => x.def.Equals(baby.def)).Count();
                    if (iteration > 0) res += ", ";
                    res += num + " " + baby.def.label;
                    iteration++;
                }
                res += " " + Translations.Dialog_WombInfo02;
                return res;
            }
            return "Null";
        }

        public string GetFatherInfo()
        {
            string res = Translations.Dialog_WombInfo03 + ": ";
            if (!babies.NullOrEmpty())
            {
                var babiesdistinct = babies.Distinct(new FatherComparer(pawn));
                int iteration = 0;
                foreach (Pawn baby in babiesdistinct)
                {
                    if (iteration > 0) res += ", ";
                    res += Utility.GetFather(baby, pawn)?.LabelShort ?? "Unknown";
                    iteration++;
                }
                return res;
            }
            return "Null";
        }

        private void HumanlikeBirth(Pawn baby, List<Pawn> siblings)
        {
            Pawn mother = pawn; Pawn father = Utility.GetFather(baby, pawn);
            //backup melanin, LastName for when baby reset by other mod on spawn/backstorychange
            //var skin_whiteness = baby.story.melanin;
            //var last_name = baby.story.birthLastName;

            PawnUtility.TrySpawnHatchedOrBornPawn(baby, mother);

            var sex_need = mother.needs?.TryGetNeed<Need_Sex>();
            if (mother.Faction != null && !(mother.Faction?.IsPlayer ?? false) && sex_need != null)
            {
                sex_need.CurLevel = 1.0f;
            }
            if (mother.Faction != null)
            {
                if (mother.Faction != baby.Faction)
                    baby.SetFaction(mother.Faction);
            }
            if (mother.IsPrisonerOfColony)
            {
                baby.guest.CapturedBy(Faction.OfPlayer);
            }

            foreach (Pawn sibling in siblings)
            {
                baby.relations.AddDirectRelation(PawnRelationDefOf.Sibling, sibling);
            }
            siblings.Add(baby);

            PostBirth(mother, father, baby);
        }

        private void BestialBirth(Pawn baby, List<Pawn> siblings)
        {
            Pawn mother = pawn; Pawn father = Utility.GetFather(baby, pawn);
            //backup melanin, LastName for when baby reset by other mod on spawn/backstorychange
            //var skin_whiteness = baby.story.melanin;
            //var last_name = baby.story.birthLastName;

            PawnUtility.TrySpawnHatchedOrBornPawn(baby, mother);

            Need_Sex sex_need = mother.needs?.TryGetNeed<Need_Sex>();
            if (mother.Faction != null && !(mother.Faction?.IsPlayer ?? false) && sex_need != null)
            {
                sex_need.CurLevel = 1.0f;
            }
            if (mother.Faction != null)
            {
                if (mother.Faction != baby.Faction)
                    baby.SetFaction(mother.Faction);
            }

            foreach (Pawn sibling in siblings)
            {
                baby.relations.AddDirectRelation(PawnRelationDefOf.Sibling, sibling);
            }
            siblings.Add(baby);
            train(baby, mother, father);

            PostBirth(mother, father, baby);

            //restore melanin, LastName for when baby reset by other mod on spawn/backstorychange
            //baby.story.melanin = skin_whiteness;
            //baby.story.birthLastName = last_name;
        }

        protected override void GenerateBabies()
        {
            AddNewBaby(pawn, father);
        }

        protected void train(Pawn baby, Pawn mother, Pawn father)
        {
            bool _;
            if (!xxx.is_human(baby) && baby.Faction == Faction.OfPlayer)
            {
                if (xxx.is_human(mother) && baby.Faction == Faction.OfPlayer && baby.training.CanAssignToTrain(TrainableDefOf.Obedience, out _).Accepted)
                {
                    baby.training.Train(TrainableDefOf.Obedience, mother);
                }
                if (xxx.is_human(mother) && baby.Faction == Faction.OfPlayer && baby.training.CanAssignToTrain(TrainableDefOf.Tameness, out _).Accepted)
                {
                    baby.training.Train(TrainableDefOf.Tameness, mother);
                }
            }
        }

        public bool AddNewBaby(Pawn mother, Pawn father)
        {
            float melanin;
            string lastname;
            if (xxx.is_human(mother))
            {
                if (xxx.is_human(father))
                {
                    melanin = (mother.story?.melanin ?? 0f + father.story?.melanin ?? 0f) / 2;
                    lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
                }
                else
                {
                    melanin = mother.story?.melanin ?? 0f;
                    lastname = NameTriple.FromString(mother.Name.ToStringFull).Last;
                }

            }
            else
            {
                if (xxx.is_human(father))
                {
                    melanin = father.story?.melanin ?? 0f;
                    lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
                }
                else
                {
                    melanin = Rand.Range(0, 1.0f);
                    lastname = NameTriple.FromString(mother.Name.ToStringFull).Last;
                }
            }

            PawnGenerationRequest request = new PawnGenerationRequest(
                newborn: true,
                allowDowned: true,
                faction: mother.IsPrisoner ? null : mother.Faction,
                canGeneratePawnRelations: false,
                forceGenerateNewPawn: true,
                colonistRelationChanceFactor: 0,
                allowFood: false,
                allowAddictions: false,
                relationWithExtraPawnChanceFactor: 0,
                fixedMelanin: melanin,
                fixedLastName: lastname,
                kind: BabyPawnKindDecider(mother, father)
                );

            int division = 1;
            HairDef firsthair = null;
            Color firsthaircolor = Color.white;
            BodyTypeDef firstbody = null;
            CrownType firstcrown = CrownType.Undefined;
            string firstheadpath = null;
            string firstHARcrown = null;
            while (Rand.Chance(Configurations.EnzygoticTwinsChance) && division < Configurations.MaxEnzygoticTwins) division++;
            for (int i = 0; i < division; i++)
            {
                Pawn baby = GenerateBaby(request, mother, father);
                if (division > 1)
                {
                    if (i == 0 && baby.story != null)
                    {
                        firsthair = baby.story.hairDef;
                        firsthaircolor = baby.story.hairColor;
                        request.FixedGender = baby.gender;
                        firstbody = baby.story.bodyType;
                        firstcrown = baby.story.crownType;
                        firstheadpath = (string)baby.story.GetMemberValue("headGraphicPath");
                        if (firstheadpath == null)
                        {
                            baby.story.SetMemberValue("headGraphicPath", GraphicDatabaseHeadRecords.GetHeadRandom(baby.gender, baby.story.SkinColor, baby.story.crownType).GraphicPath);
                            firstheadpath = (string)baby.story.GetMemberValue("headGraphicPath");
                        }
                        if (Configurations.HARActivated && baby.IsHAR())
                        {
                            firstHARcrown = baby.GetHARCrown();
                        }

                    }
                    else
                    {
                        if (baby.story != null)
                        {
                            baby.story.hairDef = firsthair;
                            baby.story.hairColor = firsthaircolor;
                            baby.story.bodyType = firstbody;
                            baby.story.crownType = firstcrown;
                            baby.story.SetMemberValue("headGraphicPath", firstheadpath);

                            if (Configurations.HARActivated && baby.IsHAR())
                            {
                                baby.SetHARCrown(firstHARcrown);
                            }
                        }
                    }
                }

                if (baby != null) babies.Add(baby);
            }

            return true;

        }

        public Pawn GenerateBaby(PawnGenerationRequest request, Pawn mother, Pawn father)
        {

            Pawn baby = PawnGenerator.GeneratePawn(request);
            if (baby != null)
            {
                if (xxx.is_human(baby))
                {
                    List<Trait> traitpool = new List<Trait>();
                    baby.SetMother(mother);
                    if (mother != father)
                    {
                        if (father.gender != Gender.Female) baby.SetFather(father);
                        else
                        {
                            baby.relations.AddDirectRelation(PawnRelationDefOf.Parent, father);
                        }
                    }

                    if (xxx.has_traits(pawn) && pawn.RaceProps.Humanlike)
                    {
                        foreach (Trait momtrait in pawn.story.traits.allTraits)
                        {
                            if (!RJWPregnancySettings.trait_filtering_enabled || !non_genetic_traits.Contains(momtrait.def.defName))
                                traitpool.Add(momtrait);
                        }
                    }
                    if (father != null && xxx.has_traits(father) && father.RaceProps.Humanlike)
                    {
                        foreach (Trait poptrait in father.story.traits.allTraits)
                        {
                            if (!RJWPregnancySettings.trait_filtering_enabled || !non_genetic_traits.Contains(poptrait.def.defName))
                                traitpool.Add(poptrait);
                        }
                    }
                    updateTraits(baby, traitpool);

                }
                else if (baby.relations != null)
                {
                    baby.relations.AddDirectRelation(VariousDefOf.Relation_birthgiver, mother);
                    mother.relations.AddDirectRelation(VariousDefOf.Relation_spawn, baby);
                    if (mother != father)
                    {
                        baby.relations.AddDirectRelation(VariousDefOf.Relation_birthgiver, father);
                        father.relations.AddDirectRelation(VariousDefOf.Relation_spawn, baby);
                    }
                }
            }
            return baby;
        }

        /// <summary>
        /// Decide pawnkind from mother and father <para/>
        /// Come from RJW
        /// </summary>
        /// <param name="mother"></param>
        /// <param name="father"></param>
        /// <returns></returns>
        public PawnKindDef BabyPawnKindDecider(Pawn mother, Pawn father)
        {
            PawnKindDef spawn_kind_def = mother.kindDef;

            int flag = 0;
            if (xxx.is_human(mother)) flag += 2;
            if (xxx.is_human(father)) flag += 1;
            //Mother - Father = Flag
            //Human  - Human  =  3
            //Human  - Animal =  2
            //Animal - Human  =  1
            //Animal - Animal =  0

            switch (flag)
            {
                case 3:
                    if (!Rand.Chance(RJWPregnancySettings.humanlike_DNA_from_mother)) spawn_kind_def = father.kindDef;
                    break;
                case 2:
                    if (RJWPregnancySettings.bestiality_DNA_inheritance == 0f) spawn_kind_def = father.kindDef;
                    else if (!Rand.Chance(RJWPregnancySettings.bestial_DNA_from_mother)) spawn_kind_def = father.kindDef;
                    break;
                case 1:
                    if (RJWPregnancySettings.bestiality_DNA_inheritance == 1f) spawn_kind_def = father.kindDef;
                    else if (!Rand.Chance(RJWPregnancySettings.bestial_DNA_from_mother)) spawn_kind_def = father.kindDef;
                    break;
                case 0:
                    if (!Rand.Chance(RJWPregnancySettings.bestial_DNA_from_mother)) spawn_kind_def = father.kindDef;
                    break;
            }

            bool IsAndroidmother = AndroidsCompatibility.IsAndroid(mother);
            bool IsAndroidfather = AndroidsCompatibility.IsAndroid(father);
            if (IsAndroidmother && !IsAndroidfather)
            {
                spawn_kind_def = father.kindDef;
            }
            else if (!IsAndroidmother && IsAndroidfather)
            {
                spawn_kind_def = mother.kindDef;
            }

            string MotherRaceName = "";
            string FatherRaceName = "";
            MotherRaceName = mother.kindDef?.race?.defName;
            PawnKindDef tmp = spawn_kind_def;
            if (father != null)
                FatherRaceName = father.kindDef?.race?.defName;

            if (FatherRaceName != "" && Configurations.UseHybridExtention)
            {
                spawn_kind_def = GetHybrid(father, mother);
                //Log.Message("pawnkind: " + spawn_kind_def?.defName);
            }

            if (MotherRaceName != FatherRaceName && FatherRaceName != "")
            {
                if (!Configurations.UseHybridExtention || spawn_kind_def == null)
                {
                    spawn_kind_def = tmp;
                    var groups = DefDatabase<RaceGroupDef>.AllDefs.Where(x => !(x.hybridRaceParents.NullOrEmpty() || x.hybridChildKindDef.NullOrEmpty()));

                    //ModLog.Message(" found custom RaceGroupDefs " + groups.Count());
                    foreach (var t in groups)
                    {
                        if ((t.hybridRaceParents.Contains(MotherRaceName) && t.hybridRaceParents.Contains(FatherRaceName))
                            || (t.hybridRaceParents.Contains("Any") && (t.hybridRaceParents.Contains(MotherRaceName) || t.hybridRaceParents.Contains(FatherRaceName))))
                        {
                            //ModLog.Message(" has hybridRaceParents");
                            if (t.hybridChildKindDef.Contains("MotherKindDef"))
                                spawn_kind_def = mother.kindDef;
                            else if (t.hybridChildKindDef.Contains("FatherKindDef") && father != null)
                                spawn_kind_def = father.kindDef;
                            else
                            {
                                //ModLog.Message(" trying hybridChildKindDef " + t.defName);
                                var child_kind_def_list = new List<PawnKindDef>();
                                child_kind_def_list.AddRange(DefDatabase<PawnKindDef>.AllDefs.Where(x => t.hybridChildKindDef.Contains(x.defName)));

                                //ModLog.Message(" found custom hybridChildKindDefs " + t.hybridChildKindDef.Count);
                                if (!child_kind_def_list.NullOrEmpty())
                                    spawn_kind_def = child_kind_def_list.RandomElement();
                            }
                        }
                    }
                }

            }
            else if (!Configurations.UseHybridExtention || spawn_kind_def == null)
            {
                spawn_kind_def = mother.RaceProps?.AnyPawnKind ?? mother.kindDef;
            }

            if (spawn_kind_def.defName.Contains("Nymph"))
            {
                //child is nymph, try to find other PawnKindDef
                var spawn_kind_def_list = new List<PawnKindDef>();
                spawn_kind_def_list.AddRange(DefDatabase<PawnKindDef>.AllDefs.Where(x => x.race == spawn_kind_def.race && !x.defName.Contains("Nymph")));
                //no other PawnKindDef found try mother
                if (spawn_kind_def_list.NullOrEmpty())
                    spawn_kind_def_list.AddRange(DefDatabase<PawnKindDef>.AllDefs.Where(x => x.race == mother.kindDef.race && !x.defName.Contains("Nymph")));
                //no other PawnKindDef found try father
                if (spawn_kind_def_list.NullOrEmpty() && father != null)
                    spawn_kind_def_list.AddRange(DefDatabase<PawnKindDef>.AllDefs.Where(x => x.race == father.kindDef.race && !x.defName.Contains("Nymph")));
                //no other PawnKindDef found fallback to generic colonist
                if (spawn_kind_def_list.NullOrEmpty())
                    spawn_kind_def = PawnKindDefOf.Colonist;

                if (!spawn_kind_def_list.NullOrEmpty()) spawn_kind_def = spawn_kind_def_list.RandomElement();
            }

            return spawn_kind_def;

        }

        public PawnKindDef GetHybrid(Pawn first, Pawn second)
        {
            PawnKindDef res = null;
            Pawn opposite = second;
            HybridInformations info = null;

            if (!Configurations.HybridOverride.NullOrEmpty())
            {
                info = Configurations.HybridOverride.FirstOrDefault(x => x.defName == first.def?.defName && (x.hybridExtension?.Exists(y => y.defName == second.def?.defName) ?? false));
                if (info == null)
                {
                    info = Configurations.HybridOverride.FirstOrDefault(x => x.defName == second.def?.defName && (x.hybridExtension?.Exists(y => y.defName == first.def?.defName) ?? false));
                    opposite = first;
                }
            }

            if (info != null)
            {
                res = info.GetHybridWith(opposite.def.defName) ?? null;
            }
            if (res != null) return res;

            PawnDNAModExtension dna;
            dna = first.def.GetModExtension<PawnDNAModExtension>();
            if (dna != null)
            {
                res = dna.GetHybridWith(second.def.defName) ?? null;
            }
            else
            {
                dna = second.def.GetModExtension<PawnDNAModExtension>();
                if (dna != null)
                {
                    res = dna.GetHybridWith(first.def.defName) ?? null;
                }
            }
            return res;
        }

        /// <summary>
        /// Copy from RJW
        /// </summary>
        /// <param name="pawn"></param>
        /// <param name="parenttraits"></param>
        public void updateTraits(Pawn pawn, List<Trait> parenttraits)
        {
            if (pawn?.story?.traits == null) return;

            List<Trait> traitlist = new List<Trait>(pawn.story.traits.allTraits);
            if (!parenttraits.NullOrEmpty()) traitlist.AddRange(parenttraits);
            else return;

            var forcedTraits = traitlist
                .Where(x => x.ScenForced)
                .Distinct(new TraitComparer(ignoreDegree: true));

            List<Trait> res = new List<Trait>();
            res.AddRange(forcedTraits);

            var comparer = new TraitComparer(); // trait comparision implementation, because without game compares traits *by reference*, makeing them all unique.

            while (res.Count < traitlist.Count && traitlist.Count > 0)
            {
                int index = Rand.Range(0, traitlist.Count); // getting trait and removing from the pull
                var trait = traitlist[index];
                traitlist.RemoveAt(index);

                if (!res.Any(x => comparer.Equals(x, trait) ||  // skipping traits conflicting with already added
                                             x.def.ConflictsWith(trait)))
                {
                    res.Add(new Trait(trait.def, trait.Degree, false));
                }
            }

            pawn.story.traits.allTraits = res;
        }

    }

    /// <summary>
    /// Copy from RJW
    /// </summary>
    public class TraitComparer : IEqualityComparer<Trait>
    {
        bool ignoreForced;
        bool ignoreDegree;

        public TraitComparer(bool ignoreDegree = false, bool ignoreForced = true)
        {
            this.ignoreDegree = ignoreDegree;
            this.ignoreForced = ignoreForced;
        }

        public bool Equals(Trait x, Trait y)
        {
            return
                x.def == y.def &&
                (ignoreDegree || (x.Degree == y.Degree)) &&
                (ignoreForced || (x.ScenForced == y.ScenForced));
        }

        public int GetHashCode(Trait obj)
        {
            return
                (obj.def.GetHashCode() << 5) +
                (ignoreDegree ? 0 : obj.Degree) +
                ((ignoreForced || obj.ScenForced) ? 0 : 0x10);
        }
    }

    public class RaceComparer : IEqualityComparer<Pawn>
    {
        public bool Equals(Pawn x, Pawn y)
        {
            return x.def.Equals(y.def);
        }

        public int GetHashCode(Pawn obj)
        {
            return obj.def.GetHashCode();
        }
    }

    public class FatherComparer : IEqualityComparer<Pawn>
    {
        Pawn mother;

        public FatherComparer(Pawn mother)
        {
            this.mother = mother;
        }

        public bool Equals(Pawn x, Pawn y)
        {
            if (Utility.GetFather(x, mother) == null && Utility.GetFather(y, mother) == null) return true;
            return Utility.GetFather(x, mother)?.Label.Equals(Utility.GetFather(y, mother)?.Label) ?? false;
        }

        public int GetHashCode(Pawn obj)
        {
            return obj.def.GetHashCode();
        }
    }

}


code:
using System.Collections.Generic;
using RimWorld;
using Verse;
using Verse.AI;

namespace RJW_Menstruation
{
    public class JobDriver_VaginaWashing : JobDriver
    {
        const int excretingTime = 300;//ticks - 120 = 2 real seconds, 3 in-game minutes

        public override bool TryMakePreToilReservations(bool errorOnFailed)
        {
            return pawn.Reserve(pawn, job, 1, -1, null, errorOnFailed);
        }

        protected override IEnumerable<Toil> MakeNewToils()
        {

            HediffComp_Menstruation Comp = pawn.GetMenstruationComp();
            this.FailOn(delegate
            {
                return !(Comp.TotalCumPercent > 0.001);
            });
            Toil excreting = Toils_General.Wait(excretingTime, TargetIndex.None);//duration of

            excreting.WithProgressBarToilDelay(TargetIndex.A);
            yield return excreting;
            yield return new Toil()
            {
                initAction = delegate ()
                {
                    Comp.CumOut(null, 0.5f);
                    if (Comp.TotalCumPercent > 0.001) JumpToToil(excreting);
                }
            };
            //yield return excreting;
            yield break;
        }
    }

    public class JobDriver_MilkSelf : JobDriver
    {
        protected float progress = 0;
        protected float MilkingTime
        {
            get
            {
                return 250f * Fullness + 50f;
            }
        }
        protected virtual float Fullness
        {
            get
            {
                return comp?.Fullness ?? 0;
            }
        }

        private CompMilkable comp;

        public override bool TryMakePreToilReservations(bool errorOnFailed)
        {
            return pawn.Reserve(pawn, job, 1, -1, null, errorOnFailed);
        }

        protected virtual void PreMakeNewToils()
        {
            comp = pawn.GetComp<CompMilkable>();
        }

        protected override IEnumerable<Toil> MakeNewToils()
        {
            PreMakeNewToils();
            this.FailOnDespawnedNullOrForbidden(TargetIndex.A);
            this.FailOnNotCasualInterruptible(TargetIndex.A);
            Toil milking = new Toil();
            milking.initAction = delegate ()
            {
                pawn.pather.StopDead();
            };
            milking.tickAction = MilkingTick;
            milking.AddFinishAction(Finish);
            milking.defaultCompleteMode = ToilCompleteMode.Never;
            milking.WithProgressBar(TargetIndex.A, () => progress / MilkingTime);
            yield return milking;
            yield break;
        }

        protected void MilkingTick()
        {
            progress += pawn.GetStatValue(StatDefOf.AnimalGatherSpeed);
            if (progress > MilkingTime)
            {
                Gathered();
                pawn.jobs.EndCurrentJob(JobCondition.Succeeded);
            }
            PostTickAction();
        }

        protected virtual void Gathered()
        {
            pawn.GetComp<CompMilkable>().Gathered(pawn);
        }

        protected virtual void Finish()
        {
            if(pawn.CurJobDef == JobDefOf.Wait_MaintainPosture)
            {
                pawn.jobs.EndCurrentJob(JobCondition.InterruptForced);
            }
        }

        protected virtual void PostTickAction()
        {
        }

    }

}

license: unknown


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

namespace RJW_Menstruation
{
    [HarmonyPatch(typeof(Pawn), "GetGizmos")]
    public class Pawn_GetGizmos
    {
        public static void Postfix(ref IEnumerable<Gizmo> __result, Pawn __instance)
        {
            List<Gizmo> gizmoList = __result.ToList();

            if (!__instance.ShowStatus())
            {
                return;
            }

            if (Configurations.EnableWombIcon && __instance.gender == Gender.Female)
            {
                if (!__instance.IsAnimal())
                {
                    AddWombGizmos(__instance, ref gizmoList);
                }
                else if (Configurations.EnableAnimalCycle)
                {
                    AddWombGizmos(__instance, ref gizmoList);
                }
            }

            __result = gizmoList;
        }

        private static void AddWombGizmos(Pawn __instance, ref List<Gizmo> gizmoList)
        {
            HediffComp_Menstruation comp = __instance.GetMenstruationComp();
            if (comp != null) gizmoList.Add(CreateGizmo_WombStatus(__instance, comp));

        }

        private static Gizmo CreateGizmo_WombStatus(Pawn pawn, HediffComp_Menstruation comp)
        {
            Texture2D icon, icon_overay;
            string description = "";
            if (Configurations.Debug) description += comp.curStage + ": " + comp.curStageHrs + "\n" + "fertcums: " + comp.TotalFertCum + "\n" + "ovarypower: " + comp.ovarypower + "\n" + "eggs: " + comp.GetNumofEggs + "\n";
            else description += comp.GetCurStageLabel + "\n";
            if (pawn.IsPregnant())
            {
                Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
                if (Utility.ShowFetusImage((Hediff_BasePregnancy)hediff))
                {
                    icon = comp.GetPregnancyIcon(hediff);
                    if (hediff is Hediff_BasePregnancy)
                    {
                        Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
                        if (h.GestationProgress < 0.2f) icon_overay = comp.GetCumIcon();
                        else icon_overay = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
                    }
                    else icon_overay = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
                }
                else
                {
                    icon = comp.GetWombIcon();
                    icon_overay = comp.GetCumIcon();
                }
            }
            else
            {
                Hediff hediff = pawn.health.hediffSet.GetHediffs<Hediff_InsectEgg>().FirstOrDefault();
                if (hediff != null)
                {
                    icon = ContentFinder<Texture2D>.Get(("Womb/Womb_Egged"), true);
                    icon_overay = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
                }
                else
                {
                    icon = comp.GetWombIcon();
                    icon_overay = comp.GetCumIcon();
                }
            }
            foreach (string s in comp.GetCumsInfo) description += s + "\n";

            Color c = comp.GetCumMixtureColor;

            Gizmo gizmo = new Gizmo_Womb
            {
                defaultLabel = pawn.LabelShort,
                defaultDesc = description,
                icon = icon,
                icon_overay = icon_overay,
                shrinkable = Configurations.AllowShrinkIcon,
                cumcolor = c,
                comp = comp,
                order = 100,
                hotKey = VariousDefOf.OpenStatusWindowKey,
                action = delegate
                {
                    Dialog_WombStatus.ToggleWindow(pawn, comp);
                }
            };

            return gizmo;
        }
    }

}


code:
using HarmonyLib;
using System.Reflection;
using Verse;

namespace RJW_Menstruation
{
    [StaticConstructorOnStartup]
    internal static class First
    {
        static First()
        {
            var har = new Harmony("RJW_Menstruation");
            har.PatchAll(Assembly.GetExecutingAssembly());
        }
    }

}


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

namespace RJW_Menstruation
{

    [HarmonyPatch(typeof(Pawn), "SpawnSetup")]
    public class Pawn_Patch
    {
        public static void Postfix(Map map, bool respawningAfterLoad, Pawn __instance)
        {
            //Log.Message("Initialize on spawnsetup");
            HediffComp_Menstruation comp = __instance.GetMenstruationComp();
            if (comp != null)
            {
                HugsLibController.Instance.TickDelayScheduler.TryUnscheduleCallback(comp.actionref);
                comp.Initialize();
            }
            HediffComp_Breast bcomp = __instance.GetBreastComp();
            if (bcomp != null)
            {
                HugsLibController.Instance.TickDelayScheduler.TryUnscheduleCallback(bcomp.action);
                bcomp.Initialize();
            }

        }
    }

    [HarmonyPatch(typeof(FloatMenuMakerMap), "AddHumanlikeOrders")]
    public class HumanlikeOrder_Patch
    {
        public static void Postfix(Vector3 clickPos, Pawn pawn, List<FloatMenuOption> opts)
        {
            var selftargets = GenUI.TargetsAt_NewTemp(clickPos, TargetingParameters.ForSelf(pawn));

            foreach (LocalTargetInfo t in selftargets)
            {
                if (pawn.HasMenstruationComp()) opts.AddDistinct(MakeSelfMenu(pawn, t));
                break;
            }

        }

        public static FloatMenuOption MakeSelfMenu(Pawn pawn, LocalTargetInfo target)
        {
            FloatMenuOption option = FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(Translations.FloatMenu_CleanSelf, delegate ()
                 {
                     pawn.jobs.TryTakeOrderedJob_NewTemp(new Verse.AI.Job(VariousDefOf.VaginaWashing, null, null, target.Cell));
                 }, MenuOptionPriority.Low), pawn, target);

            return option;
        }

    }

    //[HarmonyPatch(typeof(HealthCardUtility), "DrawHediffListing")]
    //public class DrawHediffListing_Patch
    //{
    //    public const float buttonWidth = 80f;
    //    public const float buttonHeight = 20f;
    //
    //    public static void Postfix(Rect rect, Pawn pawn, bool showBloodLoss)
    //    {
    //        if (Configurations.EnableButtonInHT && pawn.HasMenstruationComp())
    //        {
    //            Rect buttonrect = new Rect(rect.xMax - buttonWidth, rect.yMax - buttonHeight, buttonWidth, buttonHeight);
    //            if (Widgets.ButtonText(buttonrect, "Status"))
    //            {
    //                Dialog_WombStatus.ToggleWindow(pawn,pawn.GetMenstruationComp());
    //            }
    //        }
    //
    //
    //    }
    //}

    [HarmonyPatch(typeof(HealthCardUtility), "DrawHediffRow")]
    public class DrawHediffRow_Patch
    {
        public const float buttonWidth = 50f;
        public const float buttonHeight = 20f;

        public static void Prefix(Rect rect, Pawn pawn, IEnumerable<Hediff> diffs, ref float curY)
        {
            if (Configurations.EnableButtonInHT && pawn.ShowStatus())
            {
                HediffComp_Menstruation comp = diffs.First().GetMenstruationComp();
                if (comp != null)
                {
                    Rect buttonrect = new Rect((rect.xMax) / 2 - 5f, curY + 2f, buttonWidth, buttonHeight);
                    if (Widgets.ButtonText(buttonrect, Translations.Button_HealthTab))
                    {
                        Dialog_WombStatus.ToggleWindow(pawn, comp);
                    }
                }
            }

        }

    }

    //Merged to RJW
    //[HarmonyPatch(typeof(PawnColumnWorker_Pregnant), "GetIconFor")]
    //public class PawnColumnWorker_Patch_Icon
    //{
    //    public static void Postfix(Pawn pawn, ref Texture2D __result)
    //    {
    //        if (pawn.IsVisiblyPregnant()) __result = ContentFinder<Texture2D>.Get("UI/Icons/Animal/Pregnant", true);
    //    }
    //
    //}
    //
    //[HarmonyPatch(typeof(PawnColumnWorker_Pregnant), "GetTooltipText")]
    //public class PawnColumnWorker_Patch_Tooltip
    //{
    //    public static bool Prefix(Pawn pawn, ref string __result)
    //    {
    //        float gestationProgress = PregnancyHelper.GetPregnancy(pawn).Severity;
    //        int num = (int)(pawn.RaceProps.gestationPeriodDays * 60000f);
    //        int numTicks = (int)(gestationProgress * (float)num);
    //        __result = "PregnantIconDesc".Translate(numTicks.ToStringTicksToDays("F0"), num.ToStringTicksToDays("F0"));
    //        return false;
    //    }
    //
    //}
    //
    //[HarmonyPatch(typeof(TransferableUIUtility), "DoExtraAnimalIcons")]
    //public class TransferableUIUtility_Patch_Icon
    //{
    //    //private static readonly Texture2D PregnantIcon = ContentFinder<Texture2D>.Get("UI/Icons/Animal/Pregnant", true);
    //
    //
    //
    //    public static void Postfix(Transferable trad, Rect rect, ref float curX, Texture2D ___PregnantIcon)
    //    {
    //        Pawn pawn = trad.AnyThing as Pawn;
    //        if (pawn?.health?.hediffSet != null && pawn.IsVisiblyPregnant())
    //        {
    //            Rect rect3 = new Rect(curX - 24f, (rect.height - 24f) / 2f, 24f, 24f);
    //            curX -= 24f;
    //            if (Mouse.IsOver(rect3))
    //            {
    //                TooltipHandler.TipRegion(rect3, PawnColumnWorker_Pregnant.GetTooltipText(pawn));
    //            }
    //            GUI.DrawTexture(rect3, ___PregnantIcon);
    //        }
    //    }
    //}

}


code:
using HarmonyLib;
using rjw;
using Verse;

namespace RJW_Menstruation
{

    [HarmonyPatch(typeof(PregnancyHelper), "impregnate")]
    public static class impregnate_Patch
    {
        public static bool Prefix(Pawn pawn, Pawn partner, xxx.rjwSextype sextype = xxx.rjwSextype.None)
        {
            if (sextype == xxx.rjwSextype.Vaginal)
            {
                var pawnpartBPR = Genital_Helper.get_genitalsBPR(pawn);
                var maleparts = Genital_Helper.get_PartsHediffList(pawn, pawnpartBPR);
                var partnerpartBPR = Genital_Helper.get_genitalsBPR(partner);
                var femaleparts = Genital_Helper.get_PartsHediffList(partner, partnerpartBPR);

                Pawn female = null, male = null;

                if (Genital_Helper.has_vagina(partner, femaleparts))
                {
                    female = partner;
                    male = pawn;
                }
                else if (Genital_Helper.has_vagina(pawn, maleparts))
                {
                    female = pawn;
                    femaleparts = maleparts;
                    male = partner;
                    maleparts = Genital_Helper.get_PartsHediffList(partner, partnerpartBPR);
                }
                else return true;

                if (female.IsAnimal() && !Configurations.EnableAnimalCycle) return true;
                HediffComp_Menstruation comp = female.GetMenstruationComp();
                if (comp != null)
                {
                    if (Genital_Helper.has_penis_fertile(male, maleparts) && PregnancyHelper.CanImpregnate(male, female, sextype))
                    {
                        PregnancyHelper.Doimpregnate(male, female);
                        return false;
                    }
                    else if (Genital_Helper.has_ovipositorM(male, maleparts))
                    {
                        comp.CumIn(male, Rand.Range(0.5f,3.0f) * RJWSettings.cum_on_body_amount_adjust * male.BodySize, 1.0f);
                    }
                    else comp.CumIn(male, male.GetCumVolume(maleparts), 0);
                }

                //if (Genital_Helper.has_vagina(partner, partnerparts))
                //{
                //    if (partner.IsAnimal() && !Configurations.EnableAnimalCycle) return true;
                //    HediffComp_Menstruation comp = Utility.GetMenstruationComp(partner);
                //    if (comp != null)
                //    {
                //        if (Genital_Helper.has_penis_fertile(pawn, pawnparts) && PregnancyHelper.CanImpregnate(pawn, partner, sextype))
                //        {
                //            PregnancyHelper.Doimpregnate(pawn, partner);
                //            return false;
                //        }
                //        else comp.CumIn(pawn, pawn.GetCumVolume(), 0);
                //    }
                //}
                //else if (Genital_Helper.has_vagina(pawn, pawnparts))
                //{
                //    if (pawn.IsAnimal() && !Configurations.EnableAnimalCycle) return true;
                //    HediffComp_Menstruation comp = Utility.GetMenstruationComp(pawn);
                //    if (comp != null)
                //    {
                //        if (Genital_Helper.has_penis_fertile(partner, partnerparts) && PregnancyHelper.CanImpregnate(partner, pawn, sextype))
                //        {
                //            PregnancyHelper.Doimpregnate(partner, pawn);
                //            return false;
                //        }
                //        else comp.CumIn(partner, partner.GetCumVolume(), 0);
                //    }
                //}
            }
            return true;

        }
    }

    [HarmonyPatch(typeof(PregnancyHelper), "Doimpregnate")]
    public static class Doimpregnate_Patch
    {
        public static bool Prefix(Pawn pawn, Pawn partner) // partner has vagina
        {
            if (partner.IsAnimal() && !Configurations.EnableAnimalCycle) return true;
            HediffComp_Menstruation comp = partner.GetMenstruationComp();
            if (comp != null)
            {
                if (AndroidsCompatibility.IsAndroid(pawn) && !AndroidsCompatibility.AndroidPenisFertility(pawn))
                {
                    comp.CumIn(pawn, pawn.GetCumVolume(), 0);
                    return false;
                }
                else comp.CumIn(pawn, pawn.GetCumVolume(), pawn.health.capacities.GetLevel(xxx.reproduction));
                return false;
            }
            ModLog.Message("used original rjw method: Comp missing");
            return true;
        }
    }

}


code:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{EED2F3B9-8C20-4194-919E-8D151B29F70B}</ProjectGuid>
    <OutputType>Library</OutputType>
    <RootNamespace>RJW_Menstruation</RootNamespace>
    <AssemblyName>RJW_Menstruation</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <Deterministic>true</Deterministic>
    <PublishUrl>게시\</PublishUrl>
    <Install>true</Install>
    <InstallFrom>Disk</InstallFrom>
    <UpdateEnabled>false</UpdateEnabled>
    <UpdateMode>Foreground</UpdateMode>
    <UpdateInterval>7</UpdateInterval>
    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
    <UpdatePeriodically>false</UpdatePeriodically>
    <UpdateRequired>false</UpdateRequired>
    <MapFileExtensions>true</MapFileExtensions>
    <ApplicationRevision>0</ApplicationRevision>
    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
    <IsWebBootstrapper>false</IsWebBootstrapper>
    <UseApplicationTrust>false</UseApplicationTrust>
    <BootstrapperEnabled>true</BootstrapperEnabled>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>..\..\..\Assemblies\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <Prefer32Bit>false</Prefer32Bit>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>..\..\..\Assemblies\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup>
    <StartupObject />
  </PropertyGroup>
  <ItemGroup>
    <None Include="App.config" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Configurations.cs" />
    <Compile Include="Cum.cs" />
    <Compile Include="HediffComps\MenstruationUtility.cs" />
    <Compile Include="Recipe_Surgery.cs" />
    <Compile Include="UI\Dialog_HybridCustom.cs" />
    <Compile Include="UI\Dialog_WombStatus.cs" />
    <Compile Include="DrugOutcomDoers.cs" />
    <Compile Include="FilthMaker_Colored.cs" />
    <Compile Include="HARCompatibility.cs" />
    <Compile Include="HediffComps\HediffComp_Breast.cs" />
    <Compile Include="HediffComps\HediffComp_InducedOvaulator.cs" />
    <Compile Include="Hediff_MultiplePregnancy.cs" />
    <Compile Include="JobDrivers.cs" />
    <Compile Include="Patch\GetGizmos.cs" />
    <Compile Include="UI\Gizmo_Womb.cs" />
    <Compile Include="Patch\Harmony.cs" />
    <Compile Include="HediffComps\HediffComp_Menstruation.cs" />
    <Compile Include="Patch\Pawn_Patch.cs" />
    <Compile Include="Patch\RJW_Patch.cs" />
    <Compile Include="Reflect.cs" />
    <Compile Include="TextureCache.cs" />
    <Compile Include="Things.cs" />
    <Compile Include="Translations.cs" />
    <Compile Include="Utility.cs" />
    <Compile Include="VariousDefOf.cs" />
  </ItemGroup>
  <ItemGroup>
    <Reference Include="0Harmony">
      <HintPath>D:\잉어\Lib\Harmony.2.0.4.0\net472\0Harmony.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="Assembly-CSharp">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="HugsLib">
      <HintPath>..\..\..\..\..\..\..\workshop\content\294100\818773962\v1.2\Assemblies\HugsLib.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="RJW">
      <HintPath>..\..\..\..\RJW\1.2\Assemblies\RJW.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="System.Xml" />
    <Reference Include="Unity.TextMeshPro">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\Unity.TextMeshPro.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.AccessibilityModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.AccessibilityModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.AIModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.AIModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.AndroidJNIModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.AndroidJNIModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.AnimationModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.AnimationModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.ARModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.ARModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.AssetBundleModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.AssetBundleModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.AudioModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.AudioModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.ClothModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.ClothModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.ClusterInputModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.ClusterInputModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.ClusterRendererModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.ClusterRendererModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.CoreModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.CrashReportingModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.CrashReportingModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.DirectorModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.DirectorModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.DSPGraphModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.DSPGraphModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.FileSystemHttpModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.FileSystemHttpModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.GameCenterModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.GameCenterModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.GridModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.GridModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.HotReloadModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.HotReloadModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.ImageConversionModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.ImageConversionModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.IMGUIModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.IMGUIModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.InputLegacyModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.InputLegacyModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.InputModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.InputModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.JSONSerializeModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.JSONSerializeModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.LocalizationModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.LocalizationModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.ParticleSystemModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.ParticleSystemModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.PerformanceReportingModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.PerformanceReportingModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.Physics2DModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.Physics2DModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.PhysicsModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.PhysicsModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.ProfilerModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.ProfilerModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.ScreenCaptureModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.ScreenCaptureModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.SharedInternalsModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.SharedInternalsModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.SpriteMaskModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.SpriteMaskModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.SpriteShapeModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.SpriteShapeModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.StreamingModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.StreamingModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.SubstanceModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.SubstanceModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.TerrainModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.TerrainModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.TerrainPhysicsModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.TerrainPhysicsModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.TextCoreModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.TextCoreModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.TextRenderingModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.TextRenderingModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.TilemapModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.TilemapModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.TLSModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.TLSModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UI">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UI.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UIElementsModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UIElementsModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UIModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UIModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UmbraModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UmbraModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UNETModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UNETModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UnityAnalyticsModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityAnalyticsModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UnityConnectModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityConnectModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UnityTestProtocolModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityTestProtocolModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UnityWebRequestAssetBundleModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UnityWebRequestAudioModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UnityWebRequestModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityWebRequestModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UnityWebRequestTextureModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.UnityWebRequestWWWModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.VehiclesModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.VehiclesModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.VFXModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.VFXModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.VideoModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.VideoModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.VRModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.VRModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.WindModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.WindModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.XRModule">
      <HintPath>..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.XRModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <BootstrapperPackage Include=".NETFramework,Version=v4.7.2">
      <Visible>False</Visible>
      <ProductName>Microsoft .NET Framework 4.7.2%28x86 및 x64%29</ProductName>
      <Install>true</Install>
    </BootstrapperPackage>
    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
      <Visible>False</Visible>
      <ProductName>.NET Framework 3.5 SP1</ProductName>
      <Install>false</Install>
    </BootstrapperPackage>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>


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

namespace RJW_Menstruation
{
    public class Recipe_BreastSurgery : Recipe_Surgery
    {
        public override IEnumerable<BodyPartRecord> GetPartsToApplyOn(Pawn pawn, RecipeDef recipe)
        {

            if (pawn.gender != Gender.Female)
            {
                yield break;
            }

            BodyPartRecord part = Genital_Helper.get_breastsBPR(pawn);
            if (part != null)
            {

                if (pawn.GetBreastComp() != null) yield return part;
            }
        }

        public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List<Thing> ingredients, Bill bill)
        {
            HediffComp_Breast breast = pawn.GetBreastComp();
            if (billDoer != null && breast != null)
            {
                TaleRecorder.RecordTale(TaleDefOf.DidSurgery, new object[]
                {
                    billDoer,
                    pawn
                });
                SurgeryResult(breast);
            }
        }

        protected virtual void SurgeryResult(HediffComp_Breast breast)
        {
        }
    }

    public class Recipe_ExpandAreola : Recipe_BreastSurgery
    {
        protected override void SurgeryResult(HediffComp_Breast breast)
        {
            breast.AdjustAreolaSizeImmidiately(0.1f);
        }
    }

    public class Recipe_ContractAreola : Recipe_BreastSurgery
    {
        protected override void SurgeryResult(HediffComp_Breast breast)
        {
            breast.AdjustAreolaSizeImmidiately(-0.1f);
        }
    }

    public class Recipe_ExpandNipple : Recipe_BreastSurgery
    {
        protected override void SurgeryResult(HediffComp_Breast breast)
        {
            breast.AdjustNippleSizeImmidiately(0.1f);
        }
    }

    public class Recipe_ContractNipple : Recipe_BreastSurgery
    {
        protected override void SurgeryResult(HediffComp_Breast breast)
        {
            breast.AdjustNippleSizeImmidiately(-0.1f);
        }
    }
}


code:
using System;
using System.Reflection;

namespace RJW_Menstruation
{
    public static class Reflector
    {
        public static object GetMemberValue(this Type type, string name)
        {
            BindingFlags flags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
            FieldInfo fieldInfo = type?.GetField(name, flags);
            return fieldInfo?.GetValue(null);
        }

        public static object GetMemberValue(this object obj, string name)
        {
            BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
            FieldInfo fieldInfo = obj?.GetType().GetField(name, flags);
            return fieldInfo?.GetValue(obj);
        }

        public static object GetPropertyValue(this Type type, string name)
        {
            BindingFlags flags = BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
            PropertyInfo propertyInfo = type?.GetProperty(name,flags);
            return propertyInfo?.GetValue(null);
        }

        public static object GetPropertyValue(this object obj, string name)
        {
            BindingFlags flags = BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
            PropertyInfo propertyInfo = obj?.GetType().GetProperty(name,flags);
            return propertyInfo?.GetValue(obj);
        }

        public static void SetMemberValue(this Type type, string name, object value)
        {
            BindingFlags flags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
            FieldInfo fieldInfo = type?.GetField(name, flags);
            if (fieldInfo != null)
            {
                fieldInfo.SetValue(null, value);
            }
        }

        public static void SetMemberValue(this object obj, string name, object value)
        {
            BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
            FieldInfo fieldInfo = obj?.GetType().GetField(name, flags);
            if (fieldInfo != null)
            {
                fieldInfo.SetValue(obj, value);
            }
        }

    }
}


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

namespace RJW_Menstruation
{
    [StaticConstructorOnStartup]
    public static class TextureCache
    {

        public static Texture2D milkTexture
        {
            get
            {
                if (milktexturecache == null) milktexturecache = SolidColorMaterials.NewSolidColorTexture(0.992f, 1.0f, 0.960f, 1.0f);
                return milktexturecache;
            }
        }
        public static Texture2D slaaneshTexture
        {
            get
            {
                if (slaaneshtexturecache == null) slaaneshtexturecache = SolidColorMaterials.NewSolidColorTexture(0.686f, 0.062f, 0.698f, 1.0f);
                return slaaneshtexturecache;
            }
        }
        public static Texture2D khorneTexture
        {
            get
            {
                if (khornetexturecache == null) khornetexturecache = SolidColorMaterials.NewSolidColorTexture(0.415f, 0.0f, 0.003f, 1.0f);
                return khornetexturecache;
            }
        }
        public static Texture2D tzeentchTexture
        {
            get
            {
                if (tzeentchtexturecache == null) tzeentchtexturecache = SolidColorMaterials.NewSolidColorTexture(0.082f, 0.453f, 0.6f, 1.0f);
                return tzeentchtexturecache;
            }
        }
        public static Texture2D nurgleTexture
        {
            get
            {
                if (nurgletexturecache == null) nurgletexturecache = SolidColorMaterials.NewSolidColorTexture(0.6f, 0.83f, 0.35f, 1.0f);
                return nurgletexturecache;
            }
        }
        public static Texture2D humanTexture
        {
            get
            {
                if (humantexturecache == null) humantexturecache = SolidColorMaterials.NewSolidColorTexture(0.878f, 0.674f, 0.411f, 1.0f);
                return humantexturecache;
            }
        }
        public static Texture2D animalTexture
        {
            get
            {
                if (animaltexturecache == null) animaltexturecache = SolidColorMaterials.NewSolidColorTexture(0.411f, 0.521f, 0.878f, 1.0f);
                return animaltexturecache;
            }
        }
        public static Texture2D fertilityTexture
        {
            get
            {
                if (fertilitytexturecache == null) fertilitytexturecache = SolidColorMaterials.NewSolidColorTexture(0.843f, 0.474f, 0.6f, 1.0f);
                return fertilitytexturecache;
            }
        }
        public static Texture2D ghalmarazTexture
        {
            get
            {
                if (ghalmaraztexturecache == null) ghalmaraztexturecache = SolidColorMaterials.NewSolidColorTexture(0.7f, 0.7f, 0.0f, 1.0f);
                return ghalmaraztexturecache;
            }
        }

        public static readonly Texture2D FertChanceTex = SolidColorMaterials.NewSolidColorTexture(new Color(1f, 1f, 1f, 0.4f));

        private static Texture2D milktexturecache = null;
        private static Texture2D slaaneshtexturecache = null;
        private static Texture2D khornetexturecache = null;
        private static Texture2D tzeentchtexturecache = null;
        private static Texture2D nurgletexturecache = null;
        private static Texture2D humantexturecache = null;
        private static Texture2D animaltexturecache = null;
        private static Texture2D fertilitytexturecache = null;
        private static Texture2D ghalmaraztexturecache = null;

    }
}


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

namespace RJW_Menstruation
{
    public class PawnDNAModExtension : DefModExtension
    {
        public string fetusTexPath;
        public ColorInt cumColor;
        public Color CumColor => cumColor.ToColor;
        public float cumThickness = 0f;
        public List<HybridExtension> hybridExtension;

        public HybridExtension GetHybridExtension(string race)
        {
            if (hybridExtension.NullOrEmpty()) return null;
            else
            {
                return hybridExtension.Find(x => x.thingDef.defName.Equals(race));
            }
        }

        public PawnKindDef GetHybridWith(string race)
        {
            return GetHybridExtension(race)?.ChooseOne() ?? null;
        }
    }

    public class HybridExtension
    {

        public Dictionary<string, float> hybridInfo = new Dictionary<string, float>();
        public ThingDef thingDef;

        public HybridExtension() { }

        public PawnKindDef ChooseOne()
        {

            if (hybridInfo.EnumerableNullOrEmpty()) return null;
            PawnKindDef res = null;
            do
            {
                string key = hybridInfo.RandomElementByWeight(x => x.Value).Key;
                res = DefDatabase<PawnKindDef>.GetNamedSilentFail(key);
                if (res == null) res = DefDatabase<ThingDef>.GetNamedSilentFail(key).race.AnyPawnKind;

                if (res == null) hybridInfo.Remove(key);
            } while (res == null && !hybridInfo.EnumerableNullOrEmpty());

            return res;
        }

        public void LoadDataFromXmlCustom(XmlNode xmlRoot)
        {
            DirectXmlCrossRefLoader.RegisterObjectWantsCrossRef(this, "thingDef", xmlRoot.Name);
            XmlNodeList childNodes = xmlRoot.ChildNodes;

            if (childNodes.Count >= 1) foreach (XmlNode node in childNodes)
                {
                    #if DEBUG
                    Log.Message(xmlRoot.Name + "HybridInfo: " + node.Name + " " + node.InnerText);
                    #endif
                    hybridInfo.Add(node.Name, ParseHelper.FromString<float>(node.InnerText));
                }

        }

    }

    public class HybridInformations : IExposable
    {
        public List<HybridExtensionExposable> hybridExtension = new List<HybridExtensionExposable>();

        private ThingDef thingDef;
        private string thingDefName;

        public string defName
        {
            get
            {
                return thingDefName;
            }
        }
        public bool IsNull
        {
            get
            {
                return thingDefName?.Length < 1;
            }
        }
        public ThingDef GetDef
        {
            get
            {
                if (thingDef != null) return thingDef;
                else
                {
                    thingDef = DefDatabase<ThingDef>.GetNamedSilentFail(thingDefName);
                    return thingDef;
                }
            }
        }

        public HybridInformations() { }

        public HybridInformations(ThingDef def)
        {
            thingDef = def;
            thingDefName = def.defName;
        }

        public HybridExtensionExposable GetHybridExtension(string race)
        {
            if (hybridExtension.NullOrEmpty()) return null;
            else
            {
                return hybridExtension.Find(x => x.GetDef.defName?.Equals(race) ?? false);
            }
        }

        public PawnKindDef GetHybridWith(string race)
        {
            return GetHybridExtension(race)?.ChooseOne() ?? null;
        }

        public void ExposeData()
        {
            Scribe_Values.Look(ref thingDefName, "thingDefName");
            Scribe_Collections.Look(ref hybridExtension, "hybridExtension", LookMode.Deep, new object[0]);
        }

    }

    public class HybridExtensionExposable : HybridExtension, IExposable
    {
        private string thingDefName;

        public string defName
        {
            get
            {
                return thingDefName;
            }
        }
        public bool IsNull
        {
            get
            {
                return thingDefName?.Length < 1;
            }
        }
        public ThingDef GetDef
        {
            get
            {
                if (thingDef != null) return thingDef;
                else
                {
                    thingDef = DefDatabase<ThingDef>.GetNamedSilentFail(thingDefName);
                    return thingDef;
                }
            }
        }

        public HybridExtensionExposable() { }

        public HybridExtensionExposable(ThingDef def)
        {
            thingDef = def;
            thingDefName = def.defName;
            hybridInfo = new Dictionary<string, float>();
        }

        public void ExposeData()
        {
            Scribe_Values.Look(ref thingDefName, "thingDefName");
            Scribe_Collections.Look(ref hybridInfo, "hybridInfo", LookMode.Value, LookMode.Value);

        }
    }

    public class AbsorberModExtension : DefModExtension
    {
        public bool leakAfterDirty = false;
        public bool effectsAfterDirty = false;
        public ThingDef dirtyDef = null;
        public int minHourstoDirtyEffect = 0;
    }

    public class Absorber : Apparel
    {

        public float absorbedfluids = 0;
        public bool dirty = false;
        public int wearhours = 0;
        public virtual bool LeakAfterDirty => def.GetModExtension<AbsorberModExtension>().leakAfterDirty;
        public virtual bool EffectAfterDirty => def.GetModExtension<AbsorberModExtension>().effectsAfterDirty;
        public virtual ThingDef DirtyDef => def.GetModExtension<AbsorberModExtension>().dirtyDef;
        public virtual int MinHrstoDirtyEffect => def.GetModExtension<AbsorberModExtension>().minHourstoDirtyEffect;

        public Color fluidColor = Color.white;

        public virtual void DirtyEffect() { }

        public virtual void WearEffect()
        {
            absorbedfluids += 0.1f;
            wearhours++;
        }

        public override Color DrawColorTwo => fluidColor;

        public override void ExposeData()
        {
            base.ExposeData();
            Scribe_Values.Look(ref absorbedfluids, "absorbedfluids", absorbedfluids, true);
            Scribe_Values.Look(ref dirty, "dirty", dirty, true);
            Scribe_Values.Look(ref wearhours, "wearhours", wearhours, true);
            Scribe_Values.Look(ref fluidColor, "fluidColor", fluidColor, true);
        }

    }

    public class Absorber_Tampon : Absorber
    {

        public override void WearEffect()
        {
            wearhours++;
            absorbedfluids += 0.5f;
        }

        public override void DirtyEffect()
        {
            if (wearhours > MinHrstoDirtyEffect && Rand.Chance(0.01f))
            {
                Wearer.health.AddHediff(HediffDefOf.WoundInfection, Genital_Helper.get_genitalsBPR(Wearer));
            }
        }

    }

    public class Filth_Colored : Filth
    {

        private Color color = Color.white;

        public override void ExposeData()
        {
            base.ExposeData();
            Scribe_Values.Look(ref color, "color", color, true);
        }

        public override Color DrawColor
        {
            get
            {
                if (color != Color.white)
                {
                    return color;
                }
                if (Stuff != null)
                {
                    return def.GetColorForStuff(Stuff);
                }
                if (def.graphicData != null)
                {
                    return def.graphicData.color;
                }
                return color;
            }
            set
            {
                color = value;
            }
        }

    }

}


code:
using Verse;

namespace RJW_Menstruation
{
    public static class Translations
    {
        public static readonly string Mod_Title = "Mod_Title".Translate();
        public static readonly string Info_noCum = "Info_noCum".Translate();
        public static readonly string Menstrual_Blood = "Menstrual_Blood".Translate();
        public static readonly string Stage_Follicular = "Stage_Follicular".Translate();
        public static readonly string Stage_Ovulatory = "Stage_Ovulatory".Translate();
        public static readonly string Stage_Luteal = "Stage_Luteal".Translate();
        public static readonly string Stage_Bleeding = "Stage_Bleeding".Translate();
        public static readonly string Stage_Fertilized = "Stage_Fertilized".Translate();
        public static readonly string Stage_Pregnant = "Stage_Pregnant".Translate();
        public static readonly string Stage_Recover = "Stage_Recover".Translate();
        public static readonly string Stage_None = "Stage_None".Translate();
        public static readonly string Stage_Climacteric = "Stage_Climacteric".Translate();
        public static readonly string Stage_Anestrus = "Stage_Anestrus".Translate();
        public static readonly string Button_HealthTab = "Button_HealthTab".Translate();
        public static readonly string Button_MilkTooltip = "Button_MilkTooltip".Translate();

        public static readonly string Dialog_WombInfo01 = "Dialog_WombInfo01".Translate();
        public static readonly string Dialog_WombInfo02 = "Dialog_WombInfo02".Translate();
        public static readonly string Dialog_WombInfo03 = "Dialog_WombInfo03".Translate();
        public static readonly string Dialog_WombInfo04 = "Dialog_WombInfo04".Translate();
        public static readonly string Dialog_WombInfo05 = "Dialog_WombInfo05".Translate();
        public static readonly string Dialog_WombInfo06 = "Dialog_WombInfo06".Translate();
        public static readonly string Dialog_WombInfo07 = "Dialog_WombInfo07".Translate();
        public static readonly string Dialog_WombInfo08 = "Dialog_WombInfo08".Translate();
        public static readonly string Dialog_WombInfo09 = "Dialog_WombInfo09".Translate();
        public static readonly string Dialog_WombInfo10 = "Dialog_WombInfo10".Translate();

        public static readonly string Option1_Label_1 = "Option1_Label_1".Translate();
        public static readonly string Option1_Label_2 = "Option1_Label_2".Translate();
        public static readonly string Option2_Label = "Option2_Label".Translate();
        public static readonly string Option2_Desc = "Option2_Desc".Translate();
        public static readonly string Option3_Label = "Option3_Label".Translate();
        public static readonly string Option3_Desc = "Option3_Desc".Translate();
        public static readonly string Option4_Label = "Option4_Label".Translate();
        public static readonly string Option4_Desc = "Option4_Desc".Translate();
        public static readonly string Option5_Label = "Option5_Label".Translate();
        public static readonly string Option5_Desc = "Option5_Desc".Translate();
        public static readonly string Option6_Label = "Option6_Label".Translate();
        public static readonly string Option6_Desc = "Option6_Desc".Translate();
        public static readonly string Option7_Label = "Option7_Label".Translate();
        public static readonly string Option7_Desc = "Option7_Desc".Translate();
        public static readonly string Option8_Label = "Option8_Label".Translate();
        public static readonly string Option8_Desc = "Option8_Desc".Translate();
        public static readonly string Option9_Label = "Option9_Label".Translate();
        public static readonly string Option9_Desc = "Option9_Desc".Translate();
        public static readonly string Option10_Label = "Option10_Label".Translate();
        public static readonly string Option10_Desc = "Option10_Desc".Translate();
        public static readonly string Option11_Label = "Option11_Label".Translate();
        public static readonly string Option11_Desc_1 = "Option11_Desc_1".Translate();
        public static readonly string Option11_Desc_2 = "Option11_Desc_2".Translate();
        public static readonly string Option11_Desc_3 = "Option11_Desc_3".Translate();
        public static readonly string Option11_Desc_4 = "Option11_Desc_4".Translate();
        public static readonly string Option12_Label = "Option12_Label".Translate();
        public static readonly string Option12_Desc = "Option12_Desc".Translate();
        public static readonly string Option13_Label = "Option13_Label".Translate();
        public static readonly string Option13_Desc = "Option13_Desc".Translate();
        public static readonly string Option14_Label = "Option14_Label".Translate();
        public static readonly string Option14_Desc = "Option14_Desc".Translate();
        public static readonly string Option15_Label = "Option15_Label".Translate();
        public static readonly string Option15_Desc = "Option15_Desc".Translate();
        public static readonly string Option16_Label = "Option16_Label".Translate();
        public static readonly string Option16_Desc = "Option16_Desc".Translate();
        public static readonly string Option17_Label = "Option17_Label".Translate();
        public static readonly string Option17_Desc = "Option17_Desc".Translate();
        public static readonly string Option18_Label = "Option18_Label".Translate();
        public static readonly string Option18_Desc = "Option18_Desc".Translate();
        public static readonly string Option19_Label_1 = "Option19_Label_1".Translate();
        public static readonly string Option19_Label_2 = "Option19_Label_2".Translate();
        public static readonly string Option19_Desc = "Option19_Desc".Translate();
        public static readonly string Option20_Label_1 = "Option20_Label_1".Translate();
        public static readonly string Option20_Label_2 = "Option20_Label_2".Translate();
        public static readonly string Option20_Label_3 = "Option20_Label_3".Translate();
        public static readonly string Option20_Label_4 = "Option20_Label_4".Translate();
        public static readonly string Option20_Label_5 = "Option20_Label_5".Translate();
        public static readonly string Option21_Label = "Option21_Label".Translate();
        public static readonly string Option21_Desc = "Option21_Desc".Translate();
        public static readonly string Option22_Label = "Option22_Label".Translate();
        public static readonly string Option22_Desc = "Option22_Desc".Translate();
        public static readonly string Option23_Label = "Option23_Label".Translate();
        public static readonly string Option23_Label_1 = "Option23_Label_1".Translate();
        public static readonly string Option23_Label_2 = "Option23_Label_2".Translate();
        public static readonly string Option24_Label = "Option24_Label".Translate();
        public static readonly string Option24_Desc  = "Option24_Desc".Translate();
        public static readonly string Option25_Label = "Option25_Label".Translate();
        public static readonly string Option25_Desc  = "Option25_Desc".Translate();
        public static readonly string Option26_Label = "Option26_Label".Translate();
        public static readonly string Option26_Desc  = "Option26_Desc".Translate();
        public static readonly string Option27_Label = "Option27_Label".Translate();
        public static readonly string Option27_Desc  = "Option27_Desc".Translate();
        public static readonly string Option28_Label = "Option28_Label".Translate();
        public static readonly string Option28_Tooltip = "Option28_Tooltip".Translate();
        public static readonly string Option29_Label = "Option29_Label".Translate();
        public static readonly string Option29_Desc  = "Option29_Desc".Translate();

        public static readonly string EstimatedCumLifespan = "EstimatedCumLifespan".Translate();
        public static readonly string FertilityDesc = "FertilityDesc".Translate();

        public static readonly string FloatMenu_CleanSelf = "FloatMenu_CleanSelf".Translate();

        public static readonly string CustomHybrid_List_Title = "CustomHybrid_List_Title".Translate();
        static public string CustomHybrid_Title(string label) { return TranslatorFormattedStringExtensions.Translate("CustomHybrid_Title", label); }
        static public string CustomHybrid_Tooltip(string label, string breedee, string baby, string chance) { return TranslatorFormattedStringExtensions.Translate("CustomHybrid_Tooltip", label, breedee, baby, chance); }
    }
}