mirror of
				https://gitgud.io/lutepickle/rjw_menstruation.git
				synced 2024-08-14 22:46:52 +00:00 
			
		
		
		
	Support for multiple concurrent pregnancies
This commit is contained in:
		
							parent
							
								
									768f000c5d
								
							
						
					
					
						commit
						c0043d2936
					
				
					 11 changed files with 136 additions and 74 deletions
				
			
		
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -199,13 +199,16 @@ namespace RJW_Menstruation
 | 
			
		|||
            {
 | 
			
		||||
                foreach (Pawn child in parent.pawn.relations.Children)
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
                    bool isFetus;
 | 
			
		||||
                    if (PregnancyHelper.GetPregnancy(parent.pawn) is Hediff_BasePregnancy preg)
 | 
			
		||||
                    bool isFetus = false;
 | 
			
		||||
                    foreach (Hediff_BasePregnancy preg in parent.pawn.health.hediffSet.GetHediffs<Hediff_BasePregnancy>())
 | 
			
		||||
                    {
 | 
			
		||||
                        isFetus = preg.babies.Contains(child);
 | 
			
		||||
                        if (preg.babies.Contains(child))
 | 
			
		||||
                        {
 | 
			
		||||
                            isFetus = true;
 | 
			
		||||
                            break;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else isFetus = false;
 | 
			
		||||
 | 
			
		||||
                    if (
 | 
			
		||||
                        parent.pawn.ageTracker.BirthAbsTicks - child.ageTracker.BirthAbsTicks > ageOfLastBirth &&
 | 
			
		||||
                        !isFetus &&
 | 
			
		||||
| 
						 | 
				
			
			@ -276,7 +279,7 @@ namespace RJW_Menstruation
 | 
			
		|||
            // Scenario B: Pregnant, grow in the second half of first trimester
 | 
			
		||||
            else if (parent.pawn.IsPregnant())
 | 
			
		||||
            {
 | 
			
		||||
                float pregnancySize = Mathf.InverseLerp(BREAST_GROWTH_START, BREAST_GROWTH_END, parent.pawn.GetPregnancyProgress()) * MAX_BREAST_INCREMENT;
 | 
			
		||||
                float pregnancySize = Mathf.InverseLerp(BREAST_GROWTH_START, BREAST_GROWTH_END, parent.pawn.GetFarthestPregnancyProgress()) * MAX_BREAST_INCREMENT;
 | 
			
		||||
                if (breastSizeIncreased > pregnancySize)
 | 
			
		||||
                {
 | 
			
		||||
                    debugGrowthStatus = "Shrinking due to being oversize for pregnancy";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -119,6 +119,9 @@ namespace RJW_Menstruation
 | 
			
		|||
        protected HediffComp_Breast breastcache = null;
 | 
			
		||||
        protected float antisperm = 0.0f;
 | 
			
		||||
        protected float? originvagsize = null;
 | 
			
		||||
        protected Hediff_BasePregnancy pregnancy = null;
 | 
			
		||||
 | 
			
		||||
        public Hediff_BasePregnancy Pregnancy { get => pregnancy; set => pregnancy = value; }
 | 
			
		||||
 | 
			
		||||
        public int OvaryPowerThreshold
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -173,7 +176,7 @@ namespace RJW_Menstruation
 | 
			
		|||
            get
 | 
			
		||||
            {
 | 
			
		||||
                float res = Props.maxCumCapacity * parent.pawn.BodySize;
 | 
			
		||||
                if (curStage != Stage.Pregnant || (parent.pawn.GetRJWPregnancy()?.Severity ?? 0f) < 0.175f) res *= 500f;
 | 
			
		||||
                if (curStage != Stage.Pregnant || (pregnancy?.Severity ?? 0f) < 0.175f) res *= 500f;
 | 
			
		||||
                return res;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -236,7 +239,7 @@ namespace RJW_Menstruation
 | 
			
		|||
            {
 | 
			
		||||
                if (curStage == Stage.Pregnant)
 | 
			
		||||
                {
 | 
			
		||||
                    if (Configurations.InfoDetail == Configurations.DetailLevel.All || (PregnancyHelper.GetPregnancy(parent.pawn)?.Visible ?? false))
 | 
			
		||||
                    if (Configurations.InfoDetail == Configurations.DetailLevel.All || (pregnancy?.Visible ?? false))
 | 
			
		||||
                        return Stage.Pregnant;
 | 
			
		||||
                    else
 | 
			
		||||
                        return Stage.Luteal;
 | 
			
		||||
| 
						 | 
				
			
			@ -520,6 +523,7 @@ namespace RJW_Menstruation
 | 
			
		|||
            Scribe_Values.Look(ref estrusflag, "estrusflag", estrusflag, true);
 | 
			
		||||
            Scribe_Values.Look(ref originvagsize, "originvagsize", originvagsize, true);
 | 
			
		||||
            Scribe_Values.Look(ref DoCleanWomb, "DoCleanWomb", DoCleanWomb, true);
 | 
			
		||||
            Scribe_References.Look(ref pregnancy, "pregnancy");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -544,6 +548,7 @@ namespace RJW_Menstruation
 | 
			
		|||
        {
 | 
			
		||||
            HugsLibController.Instance.TickDelayScheduler.TryUnscheduleCallback(actionref);
 | 
			
		||||
            Log.Message(parent.pawn.Label + " tick scheduler removed");
 | 
			
		||||
            pregnancy?.Miscarry();
 | 
			
		||||
            base.CompPostPostRemoved();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -895,18 +900,13 @@ namespace RJW_Menstruation
 | 
			
		|||
 | 
			
		||||
            InitOvary();
 | 
			
		||||
 | 
			
		||||
            Hediff_BasePregnancy pregnancy = parent.pawn.GetRJWPregnancy();
 | 
			
		||||
            if (pregnancy != null)
 | 
			
		||||
            if (pregnancy == null &&    // If there's no pregnancy registered in this womb...
 | 
			
		||||
                PregnancyHelper.GetPregnancy(parent.pawn) is Hediff_BasePregnancy preg &&   // ...but the pawn is pregnant...
 | 
			
		||||
                preg.GetMenstruationComp() == null)   // ...and another womb doesn't have it, then pick it up
 | 
			
		||||
            {
 | 
			
		||||
                Hediff hediff = PregnancyHelper.GetPregnancy(parent.pawn);
 | 
			
		||||
                if (hediff != null)
 | 
			
		||||
                {
 | 
			
		||||
                    if (hediff is Hediff_BasePregnancy preg)
 | 
			
		||||
                    {
 | 
			
		||||
                        currentIntervalHours = (int)(preg.GestationHours());
 | 
			
		||||
                        curStage = Stage.Pregnant;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                currentIntervalHours = (int)preg.GestationHours();
 | 
			
		||||
                curStage = Stage.Pregnant;
 | 
			
		||||
                pregnancy = preg;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (parent.pawn.IsAnimal())
 | 
			
		||||
| 
						 | 
				
			
			@ -1116,9 +1116,18 @@ namespace RJW_Menstruation
 | 
			
		|||
                    deadeggs.Add(egg);
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                else if (parent.pawn.health.hediffSet.GetHediffs<Hediff_InsectEgg>().Any())
 | 
			
		||||
                {
 | 
			
		||||
                    deadeggs.Add(egg);
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                else if (pregnancy is Hediff_MechanoidPregnancy)
 | 
			
		||||
                {
 | 
			
		||||
                    deadeggs.Add(egg);
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                else if (Rand.Range(0.0f, 1.0f) <= Configurations.ImplantationChance * ImplantFactor * InterspeciesImplantFactor(egg.fertilizer))
 | 
			
		||||
                {
 | 
			
		||||
                    Hediff_BasePregnancy pregnancy = parent.pawn.GetRJWPregnancy();
 | 
			
		||||
                    if (pregnancy != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (Configurations.UseMultiplePregnancy && Configurations.EnableHeteroOvularTwins)
 | 
			
		||||
| 
						 | 
				
			
			@ -1143,17 +1152,16 @@ namespace RJW_Menstruation
 | 
			
		|||
                        if (!Configurations.UseMultiplePregnancy)
 | 
			
		||||
                        {
 | 
			
		||||
                            PregnancyHelper.PregnancyDecider(parent.pawn, egg.fertilizer);
 | 
			
		||||
                            Hediff_BasePregnancy hediff = (Hediff_BasePregnancy)PregnancyHelper.GetPregnancy(parent.pawn);
 | 
			
		||||
                            currentIntervalHours = (int)hediff?.GestationHours();
 | 
			
		||||
                            // I hate having to do this, but it gets the newest pregnancy
 | 
			
		||||
                            pregnancy = parent.pawn.health.hediffSet.GetHediffs<Hediff_BasePregnancy>().MaxBy(hediff => hediff.loadID);
 | 
			
		||||
                            currentIntervalHours = (int)pregnancy?.GestationHours();
 | 
			
		||||
                            pregnant = true;
 | 
			
		||||
                            break;
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            Hediff_BasePregnancy.Create<Hediff_MultiplePregnancy>(parent.pawn, egg.fertilizer);
 | 
			
		||||
                            Hediff_BasePregnancy hediff = (Hediff_BasePregnancy)PregnancyHelper.GetPregnancy(parent.pawn);
 | 
			
		||||
                            currentIntervalHours = (int)hediff?.GestationHours();
 | 
			
		||||
 | 
			
		||||
                            pregnancy = Hediff_BasePregnancy.Create<Hediff_MultiplePregnancy>(parent.pawn, egg.fertilizer);
 | 
			
		||||
                            currentIntervalHours = (int)pregnancy?.GestationHours();
 | 
			
		||||
                            pregnant = true;
 | 
			
		||||
                            deadeggs.Add(egg);
 | 
			
		||||
                        }
 | 
			
		||||
| 
						 | 
				
			
			@ -1449,13 +1457,18 @@ namespace RJW_Menstruation
 | 
			
		|||
                Implant();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (parent.pawn.GetRJWPregnancy() != null)
 | 
			
		||||
            if (parent.pawn.health.hediffSet.hediffs.Contains(pregnancy))
 | 
			
		||||
            {
 | 
			
		||||
                curStageHrs += 1;
 | 
			
		||||
                StayCurrentStageConst(Stage.Pregnant);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                if (pregnancy != null)
 | 
			
		||||
                {
 | 
			
		||||
                    Log.Warning("Pawn does not have specified pregnancy, but the womb is still marked as pregnant");
 | 
			
		||||
                    pregnancy = null;
 | 
			
		||||
                }
 | 
			
		||||
                if (Breast != null)
 | 
			
		||||
                {
 | 
			
		||||
                    Breast.BirthTransition();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,6 +55,11 @@ namespace RJW_Menstruation
 | 
			
		|||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static HediffComp_Menstruation GetMenstruationComp(this Hediff_BasePregnancy pregnancy)
 | 
			
		||||
        {
 | 
			
		||||
            return pregnancy.pawn.GetMenstruationComps().FirstOrDefault(comp => comp.Pregnancy == pregnancy);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static HediffComp_Anus GetAnusComp(this Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
            var hedifflist = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.FindAll((Hediff h) => h.def.defName.ToLower().Contains("anus"));
 | 
			
		||||
| 
						 | 
				
			
			@ -84,6 +89,36 @@ namespace RJW_Menstruation
 | 
			
		|||
            return 1.0f - Mathf.Pow(1.0f - Configurations.FertilizeChance, comp.TotalFertCum * comp.Props.basefertilizationChanceFactor);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // A looser CanImpregnate
 | 
			
		||||
        public static bool CanFertilize(Pawn fucker, Pawn fucked, xxx.rjwSextype sexType = xxx.rjwSextype.Vaginal, bool availableWomb = false)
 | 
			
		||||
        {
 | 
			
		||||
            if (fucker == null || fucked == null) return false;
 | 
			
		||||
 | 
			
		||||
            if (!fucked.GetMenstruationComps().Any()) return PregnancyHelper.CanImpregnate(fucker, fucked, sexType);
 | 
			
		||||
 | 
			
		||||
            if (sexType != xxx.rjwSextype.Vaginal && sexType != xxx.rjwSextype.DoublePenetration) return false;
 | 
			
		||||
 | 
			
		||||
            if (AndroidsCompatibility.IsAndroid(fucker) && AndroidsCompatibility.IsAndroid(fucked)) return false;
 | 
			
		||||
 | 
			
		||||
            if (fucker.IsUnsexyRobot() || fucked.IsUnsexyRobot()) return false;
 | 
			
		||||
 | 
			
		||||
            if (!fucker.RaceHasPregnancy() || !fucked.RaceHasPregnancy()) return false;
 | 
			
		||||
 | 
			
		||||
            if (!Genital_Helper.has_penis_fertile(fucker, fucker.GetGenitalsList())) return false;
 | 
			
		||||
            
 | 
			
		||||
            if (xxx.is_human(fucked) && xxx.is_human(fucker) && !RJWPregnancySettings.humanlike_pregnancy_enabled) return false;
 | 
			
		||||
 | 
			
		||||
            if (xxx.is_animal(fucker) != xxx.is_animal(fucked) && !RJWPregnancySettings.bestial_pregnancy_enabled) return false;
 | 
			
		||||
 | 
			
		||||
            if (xxx.is_animal(fucker) && xxx.is_animal(fucked) && !RJWPregnancySettings.animal_pregnancy_enabled) return false;
 | 
			
		||||
 | 
			
		||||
            if (fucker.def.defName != fucked.def.defName && RJWPregnancySettings.interspecies_impregnation_modifier <= 0.0f && !RJWPregnancySettings.complex_interspecies) return false;
 | 
			
		||||
 | 
			
		||||
            if (availableWomb && fucked.GetMenstruationComps().All(comp => comp.Pregnancy != null)) return false;
 | 
			
		||||
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static Texture2D GetPregnancyIcon(this HediffComp_Menstruation comp, Hediff hediff)
 | 
			
		||||
        {
 | 
			
		||||
            string icon = "";
 | 
			
		||||
| 
						 | 
				
			
			@ -166,9 +201,9 @@ namespace RJW_Menstruation
 | 
			
		|||
        }
 | 
			
		||||
        public static Texture2D GetEggIcon(this HediffComp_Menstruation comp, bool includeOvary)
 | 
			
		||||
        {
 | 
			
		||||
            if (comp.parent.pawn.IsPregnant(Configurations.InfoDetail != Configurations.DetailLevel.All) && !(PregnancyHelper.GetPregnancy(comp.parent.pawn) is Hediff_MechanoidPregnancy))
 | 
			
		||||
            {            
 | 
			
		||||
                if (comp.parent.pawn.GetPregnancyProgress() < 0.2f) return ContentFinder<Texture2D>.Get("Eggs/Egg_Implanted00", true);
 | 
			
		||||
            if (comp.Pregnancy != null && !(comp.Pregnancy is Hediff_MechanoidPregnancy))
 | 
			
		||||
            {
 | 
			
		||||
                if (comp.GetPregnancyProgress() < 0.2f) return ContentFinder<Texture2D>.Get("Eggs/Egg_Implanted00", true);
 | 
			
		||||
                else return ContentFinder<Texture2D>.Get("Womb/Empty", true);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,6 +33,12 @@ namespace RJW_Menstruation
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void Miscarry()
 | 
			
		||||
        {
 | 
			
		||||
            base.Miscarry();
 | 
			
		||||
            this.GetMenstruationComp().Pregnancy = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void GiveBirth()
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -62,6 +68,7 @@ namespace RJW_Menstruation
 | 
			
		|||
            }
 | 
			
		||||
 | 
			
		||||
            pawn.health.RemoveHediff(this);
 | 
			
		||||
            this.GetMenstruationComp().Pregnancy = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public string GetBabyInfo()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,8 +49,8 @@ namespace RJW_Menstruation
 | 
			
		|||
            else description += comp.GetCurStageLabel + "\n";
 | 
			
		||||
            if (pawn.IsPregnant())
 | 
			
		||||
            {
 | 
			
		||||
                Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
 | 
			
		||||
                if (Utility.ShowFetusImage((Hediff_BasePregnancy)hediff))
 | 
			
		||||
                Hediff_BasePregnancy hediff = comp.Pregnancy;
 | 
			
		||||
                if (Utility.ShowFetusImage(hediff))
 | 
			
		||||
                {
 | 
			
		||||
                    icon = comp.GetPregnancyIcon(hediff);
 | 
			
		||||
                    if (hediff is Hediff_BasePregnancy h)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,12 +15,15 @@ namespace RJW_Menstruation
 | 
			
		|||
    [HarmonyPatch(typeof(PregnancyHelper), nameof(PregnancyHelper.impregnate))]
 | 
			
		||||
    public static class Impregnate_Patch
 | 
			
		||||
    {
 | 
			
		||||
        public static bool Prefix(SexProps props)
 | 
			
		||||
        public static bool Prefix(SexProps props, out HediffComp_Menstruation __state)
 | 
			
		||||
        {
 | 
			
		||||
            xxx.rjwSextype sextype = props.sexType;
 | 
			
		||||
            Pawn pawn = props.pawn;
 | 
			
		||||
            Pawn partner = props.partner;
 | 
			
		||||
 | 
			
		||||
            if (PregnancyHelper.GetPregnancy(partner) is Hediff_BasePregnancy oldestPregnancy) __state = oldestPregnancy.GetMenstruationComp();
 | 
			
		||||
            else __state = null;
 | 
			
		||||
 | 
			
		||||
            if (sextype != xxx.rjwSextype.Vaginal && sextype != xxx.rjwSextype.DoublePenetration) return true;
 | 
			
		||||
 | 
			
		||||
            if (partner.IsAnimal() && !Configurations.EnableAnimalCycle) return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +38,7 @@ namespace RJW_Menstruation
 | 
			
		|||
            else comp = pawn.GetRandomMenstruationComp();
 | 
			
		||||
            if (comp == null) return true;
 | 
			
		||||
 | 
			
		||||
            if (Genital_Helper.has_penis_fertile(pawn, pawnparts) && PregnancyHelper.CanImpregnate(pawn, partner, sextype))
 | 
			
		||||
            if (Genital_Helper.has_penis_fertile(pawn, pawnparts) && MenstruationUtility.CanFertilize(pawn, partner, sextype))
 | 
			
		||||
            {
 | 
			
		||||
                PregnancyHelper.Doimpregnate(pawn, partner);
 | 
			
		||||
                return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -47,8 +50,20 @@ namespace RJW_Menstruation
 | 
			
		|||
            else comp.CumIn(pawn, pawn.GetCumVolume(pawnparts), 0);
 | 
			
		||||
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public static void Postfix(SexProps props, HediffComp_Menstruation __state)
 | 
			
		||||
        {
 | 
			
		||||
            if (__state == null || __state.Pregnancy != null) return;
 | 
			
		||||
            // It was pregnant, but not anymore. This probably means the pregnancy was destroyed by e.g. a mech implant
 | 
			
		||||
            Pawn pawn = props.partner;
 | 
			
		||||
            Hediff_BasePregnancy newestPregnancy = pawn.health.hediffSet.GetHediffs<Hediff_BasePregnancy>().MaxBy(hediff => hediff.loadID);
 | 
			
		||||
            if (newestPregnancy == null) return;
 | 
			
		||||
            foreach (HediffComp_Menstruation comp in pawn.GetMenstruationComps())
 | 
			
		||||
            {
 | 
			
		||||
                if (comp.Pregnancy == newestPregnancy) return;  // One of the wombs did get it
 | 
			
		||||
            }
 | 
			
		||||
            __state.Pregnancy = newestPregnancy;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -129,9 +144,9 @@ namespace RJW_Menstruation
 | 
			
		|||
            // This is stricter than can_impregnate, so quickly filter out scenarios that are negative anyways.
 | 
			
		||||
            if (__result == false || __instance != Quirk.ImpregnationFetish) return;
 | 
			
		||||
            __result =
 | 
			
		||||
                (PregnancyHelper.CanImpregnate(pawn, partner) && (partner.GetMenstruationComps()?.Any(comp => comp.IsDangerDay) ?? true))
 | 
			
		||||
                (MenstruationUtility.CanFertilize(pawn, partner, availableWomb: true) && (partner.GetMenstruationComps()?.Any(comp => comp.IsDangerDay) ?? true))
 | 
			
		||||
                ||
 | 
			
		||||
                (PregnancyHelper.CanImpregnate(partner, pawn) && (pawn.GetMenstruationComps()?.Any(comp => comp.IsDangerDay) ?? true));
 | 
			
		||||
                (MenstruationUtility.CanFertilize(partner, pawn, availableWomb: true) && (pawn.GetMenstruationComps()?.Any(comp => comp.IsDangerDay) ?? true));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -150,9 +165,9 @@ namespace RJW_Menstruation
 | 
			
		|||
            else __result--;
 | 
			
		||||
 | 
			
		||||
            if (
 | 
			
		||||
                (PregnancyHelper.CanImpregnate(pawn, partner, props.sexType) && (partner.GetMenstruationComps()?.Any(comp => comp.IsDangerDay) ?? true))
 | 
			
		||||
                (MenstruationUtility.CanFertilize(pawn, partner, props.sexType, true) && (partner.GetMenstruationComps()?.Any(comp => comp.IsDangerDay) ?? true))
 | 
			
		||||
                ||
 | 
			
		||||
                (PregnancyHelper.CanImpregnate(partner, pawn, props.sexType) && (pawn.GetMenstruationComps()?.Any(comp => comp.IsDangerDay) ?? true)))
 | 
			
		||||
                (MenstruationUtility.CanFertilize(partner, pawn, props.sexType, true) && (pawn.GetMenstruationComps()?.Any(comp => comp.IsDangerDay) ?? true)))
 | 
			
		||||
                __result++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -174,15 +189,15 @@ namespace RJW_Menstruation
 | 
			
		|||
        }
 | 
			
		||||
        public static void Postfix(ref float __result, Pawn fucker, Pawn fucked)
 | 
			
		||||
        {
 | 
			
		||||
            if (fucker.IsInEstrus(true) && PregnancyHelper.CanImpregnate(fucked, fucker))
 | 
			
		||||
            if (fucker.IsInEstrus(true) && MenstruationUtility.CanFertilize(fucked, fucker))
 | 
			
		||||
            {
 | 
			
		||||
                __result *= (1f + GetNetFertility(fucker, fucked) / 4);
 | 
			
		||||
            }
 | 
			
		||||
            else if (fucker.IsInEstrus(false) && PregnancyHelper.CanImpregnate(fucked, fucker))
 | 
			
		||||
            else if (fucker.IsInEstrus(false) && MenstruationUtility.CanFertilize(fucked, fucker))
 | 
			
		||||
            {
 | 
			
		||||
                __result *= (1f + GetNetFertility(fucker, fucked) / 40);
 | 
			
		||||
            }
 | 
			
		||||
            else if(xxx.is_animal(fucker) && fucked.IsInEstrus(true) && PregnancyHelper.CanImpregnate(fucker, fucked))
 | 
			
		||||
            else if(xxx.is_animal(fucker) && fucked.IsInEstrus(true) && MenstruationUtility.CanFertilize(fucker, fucked))
 | 
			
		||||
            {
 | 
			
		||||
                __result *= 1.25f;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,6 +101,7 @@
 | 
			
		|||
      <HintPath>..\..\..\..\..\rjw\1.3\Assemblies\RJW.dll</HintPath>
 | 
			
		||||
      <Private>False</Private>
 | 
			
		||||
    </Reference>
 | 
			
		||||
    <Reference Include="System" />
 | 
			
		||||
    <Reference Include="System.Xml" />
 | 
			
		||||
    <Reference Include="UnityEngine">
 | 
			
		||||
      <HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.dll</HintPath>
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +159,7 @@
 | 
			
		|||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="Lib.Harmony">
 | 
			
		||||
      <Version>2.1.1</Version>
 | 
			
		||||
	  <ExcludeAssets>runtime</ExcludeAssets>
 | 
			
		||||
      <ExcludeAssets>runtime</ExcludeAssets>
 | 
			
		||||
    </PackageReference>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -151,16 +151,15 @@ namespace RJW_Menstruation
 | 
			
		|||
            fontstyleleft.normal.textColor = Color.white;
 | 
			
		||||
 | 
			
		||||
            float preginfoheight = 0f;
 | 
			
		||||
            bool pregnant = pawn.IsPregnant();
 | 
			
		||||
            Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
 | 
			
		||||
            if (pregnant && Utility.ShowFetusImage((Hediff_BasePregnancy)hediff))
 | 
			
		||||
            Hediff_BasePregnancy hediff = comp.Pregnancy;
 | 
			
		||||
            if (hediff != null && Utility.ShowFetusImage(hediff))
 | 
			
		||||
            {
 | 
			
		||||
                womb = comp.GetPregnancyIcon(hediff);
 | 
			
		||||
                if (hediff is Hediff_MultiplePregnancy m)
 | 
			
		||||
                {
 | 
			
		||||
                    if (m.GestationProgress < 0.2f) cum = comp.GetCumIcon();
 | 
			
		||||
                    else cum = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
 | 
			
		||||
                    Pawn fetus = pawn.GetFetus();
 | 
			
		||||
                    Pawn fetus = comp.GetFetus();
 | 
			
		||||
                    if (fetus != null && Utility.ShowFetusInfo())
 | 
			
		||||
                    {
 | 
			
		||||
                        string feinfo = m.GetBabyInfo();
 | 
			
		||||
| 
						 | 
				
			
			@ -188,7 +187,7 @@ namespace RJW_Menstruation
 | 
			
		|||
                {
 | 
			
		||||
                    if (b.GestationProgress < 0.2f) cum = comp.GetCumIcon();
 | 
			
		||||
                    else cum = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
 | 
			
		||||
                    Pawn fetus = pawn.GetFetus();
 | 
			
		||||
                    Pawn fetus = comp.GetFetus();
 | 
			
		||||
                    if (fetus != null && Utility.ShowFetusInfo())
 | 
			
		||||
                    {
 | 
			
		||||
                        preginfoheight = fontheight;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -141,37 +141,27 @@ namespace RJW_Menstruation
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public static float GetPregnancyProgress(this Pawn pawn)
 | 
			
		||||
        public static float GetFarthestPregnancyProgress(this Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
            Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
 | 
			
		||||
            if (hediff is Hediff_BasePregnancy h)
 | 
			
		||||
            {
 | 
			
		||||
                return h.GestationProgress;
 | 
			
		||||
            }
 | 
			
		||||
            return -1;
 | 
			
		||||
            return pawn.health.hediffSet.GetHediffs<Hediff_BasePregnancy>().MaxBy(hediff => hediff.GestationProgress)?.GestationProgress ?? -1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static Pawn GetFetus(this Pawn pawn)
 | 
			
		||||
        public static float GetPregnancyProgress(this HediffComp_Menstruation comp)
 | 
			
		||||
        {
 | 
			
		||||
            Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
 | 
			
		||||
            if (hediff is Hediff_BasePregnancy h)
 | 
			
		||||
            {
 | 
			
		||||
                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;
 | 
			
		||||
            if (comp.Pregnancy == null) return -1;
 | 
			
		||||
            else return comp.Pregnancy.GestationProgress;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static Hediff_BasePregnancy GetRJWPregnancy(this Pawn pawn)
 | 
			
		||||
        public static Pawn GetFetus(this HediffComp_Menstruation comp)
 | 
			
		||||
        {
 | 
			
		||||
            return (Hediff_BasePregnancy)pawn.health.hediffSet.hediffs.FirstOrDefault(x => x is Hediff_BasePregnancy);
 | 
			
		||||
            if (comp.Pregnancy == null) return null;
 | 
			
		||||
            if (!comp.Pregnancy.babies.NullOrEmpty()) return comp.Pregnancy.babies.First();
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                Log.Error("Baby not exist: baby was not created or removed. Remove pregnancy.");
 | 
			
		||||
                comp.Pregnancy.Miscarry();
 | 
			
		||||
                return null;
 | 
			
		||||
            }            
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static void DrawBreastIcon(this Pawn pawn, Rect rect , bool drawOrigin = false)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,8 +2,7 @@ Version 1.0.7.0
 | 
			
		|||
 - Not save compatible with previous versions. Expect tons of red errors and strangeness if you try, but theoretically it should eventually work again.
 | 
			
		||||
 | 
			
		||||
 - Experimental support for multiple vaginas.
 | 
			
		||||
   - Known issue: A pregnant pawn will have the fetus graphic appear in all wombs.
 | 
			
		||||
   - Unknown effect if a womb becomes pregnant while another womb already is.
 | 
			
		||||
   - Super-experimental support for multiple concurrent pregnancies.
 | 
			
		||||
 - Overhauled many things under the hood.
 | 
			
		||||
 - Cycle randomization completely redone. Everyone now has a (hidden) cycle speed and cycle variability.
 | 
			
		||||
 - Ovary initialization redone. All pawns now get a total number of eggs based on their age and racial properties.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue