diff --git a/1.4/Assemblies/RJW_Menstruation.dll b/1.4/Assemblies/RJW_Menstruation.dll index 0e76721..ce5f760 100644 Binary files a/1.4/Assemblies/RJW_Menstruation.dll and b/1.4/Assemblies/RJW_Menstruation.dll differ diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/DrugOutcomeDoers.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/DrugOutcomeDoers.cs index 2b51556..0cbbf40 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/DrugOutcomeDoers.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/DrugOutcomeDoers.cs @@ -89,7 +89,7 @@ namespace RJW_Menstruation else m.moodPowerFactor = 0.3f; } - if (pawn.HasQuirk(QuirkUtility.Quirks.Breeder)) pawn.needs.mood.thoughts.memories.TryGainMemoryFast(VariousDefOf.HateTookContraceptivePill); + if (pawn.WantsToGetPregnant()) pawn.needs.mood.thoughts.memories.TryGainMemoryFast(VariousDefOf.HateTookContraceptivePill); else pawn.needs.mood.thoughts.memories.TryGainMemoryFast(VariousDefOf.TookContraceptivePill); } } diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Breast.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Breast.cs index 46022d1..5bb48b7 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Breast.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Breast.cs @@ -69,7 +69,7 @@ namespace RJW_Menstruation get { if (babyHalfAge > 0f) return babyHalfAge; - List ages = Pawn.def.race.lifeStageAges; + List ages = Pawn.RaceProps.lifeStageAges; if (ages?.Count > 1) babyHalfAge = ages[1].minAge / 2; diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_InducedOvulator.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_InducedOvulator.cs index 0bea073..a32969c 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_InducedOvulator.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_InducedOvulator.cs @@ -15,6 +15,14 @@ namespace RJW_Menstruation public class HediffComp_InducedOvulator : HediffComp_Menstruation { + protected bool hadOvulatoryStage = false; // Regardless of whether an egg was actually produced + + protected override void InitializeExtraValues() + { + base.InitializeExtraValues(); + hadOvulatoryStage |= IsEggExist; + } + public override string GetCurStageDesc { get @@ -35,7 +43,7 @@ namespace RJW_Menstruation protected override float RaceCyclesPerYear() { // Don't bother with breeding season, since so much time is planned to be spent pregnant. - float pregnanciesPerYear = GenDate.DaysPerYear / Mathf.Max(1, Pawn.def.race.gestationPeriodDays); + float pregnanciesPerYear = GenDate.DaysPerYear / Mathf.Max(1, Pawn.RaceProps.gestationPeriodDays); return 2 * pregnanciesPerYear / Configurations.ImplantationChanceDefault; } @@ -46,12 +54,31 @@ namespace RJW_Menstruation return Mathf.CeilToInt((Pawn.relations?.ChildrenCount ?? 0) / Configurations.ImplantationChanceDefault); } + public override void CompExposeData() + { + base.CompExposeData(); + Scribe_Values.Look(ref hadOvulatoryStage, "hadOvulatoryStage", false); + } + protected override void GoOvulatoryStage() { estrusflag = false; + hadOvulatoryStage = false; GoNextStage(Stage.Luteal); } + protected override void OvulatoryAction() + { + base.OvulatoryAction(); + hadOvulatoryStage = true; + } + + protected override void LutealAction() + { + base.LutealAction(); + if (curStage != Stage.Luteal) hadOvulatoryStage = false; + } + protected override void AfterCumIn(Pawn cummer) { base.AfterCumIn(cummer); @@ -70,7 +97,7 @@ namespace RJW_Menstruation case Stage.Ovulatory: return true; case Stage.Luteal: - return IsEggExist && curStageTicks < EggLifespanTicks; + return hadOvulatoryStage && curStageTicks < EggLifespanTicks; default: return false; } @@ -88,7 +115,7 @@ namespace RJW_Menstruation case Stage.Ovulatory: return true; case Stage.Luteal: - return IsEggExist && curStageTicks < EggLifespanTicks; + return hadOvulatoryStage && curStageTicks < EggLifespanTicks; default: return false; } diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs index 80bae88..2745e80 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs @@ -66,7 +66,7 @@ namespace RJW_Menstruation const float minmakefilthvalue = 1.0f; const int maxImplantDelayHours = 30 * GenDate.HoursPerDay; const int minImplantAgeHours = 3 * GenDate.HoursPerDay; - const float fluidLeakThreshold = 2.5f; + const float fluidLeakThreshold = 3.5f; const float pulloutSuccessRate = 0.8f; const float fetishPulloutSuccessModifier = 0.25f; @@ -104,6 +104,7 @@ namespace RJW_Menstruation public static readonly Dictionary StageTexture = new Dictionary() { { Stage.Follicular, TextureCache.FollicularTexture }, + { Stage.Ovulatory, TextureCache.OvulatoryTexture }, { Stage.Luteal, TextureCache.LutealTexture }, { Stage.Bleeding, TextureCache.BleedingTexture }, { Stage.Pregnant, TextureCache.PregnantTexture }, @@ -122,6 +123,8 @@ namespace RJW_Menstruation protected string customwombtex = null; protected string customvagtex = null; protected bool estrusflag = false; + protected float ovulationChanceCache = -1.0f; // Dirtied every simulation + protected float implantationChanceCache = -1.0f; protected int opcache = -1; protected float antisperm = 0.0f; protected float? originvagsize = null; @@ -195,7 +198,7 @@ namespace RJW_Menstruation float avglittersize; try { - avglittersize = Mathf.Max(Rand.ByCurveAverage(Pawn.def.race.litterSizeCurve), 1.0f); + avglittersize = Mathf.Max(Rand.ByCurveAverage(Pawn.RaceProps.litterSizeCurve), 1.0f); } catch { @@ -207,7 +210,7 @@ namespace RJW_Menstruation opcache = (int)(RaceCyclesPerYear() * avglittersize * yearsBeforeMenopause * - (Pawn.def.race.lifeExpectancy / ThingDefOf.Human.race.lifeExpectancy)); + (Pawn.RaceProps.lifeExpectancy / ThingDefOf.Human.race.lifeExpectancy)); if (opcache == 0) opcache = 1; return opcache; } @@ -293,58 +296,71 @@ namespace RJW_Menstruation // I hate doing this, but it's the least bad option public bool calculatingOvulationChance = false; + protected float CalcuatedOvulationChance() + { + float ovulationChance = 1.0f; + if (EggHealth <= 0.0f) return 0.0f; + if (EggHealth < 1.0f / 3.0f) ovulationChance = 0.8f; + if (ModsConfig.BiotechActive && xxx.is_human(Pawn)) + { + if (Pawn.SterileGenes()) return 0.0f; + // Replicate how rjw.PawnCapacityWorker_Fertility.CalculateCapacityLevel does it, but without the age factor + if (!Pawn.RaceHasFertility()) return 0.0f; + if (AndroidsCompatibility.IsAndroid(Pawn) && parent.def != Genital_Helper.archotech_vagina) return 0.0f; + foreach (var part in StatDefOf.Fertility.parts) + { + if(part is StatPart_FertilityByGenderAge fertilityByAge) + { + float factor = 1.0f; + fertilityByAge.TransformValue(StatRequest.For(Pawn), ref factor); + if (factor <= 0.0f) return 0.0f; // Too young or too old + } + else part.TransformValue(StatRequest.For(Pawn), ref ovulationChance); + } + if (Pawn.HasQuirk(QuirkUtility.Quirks.Breeder)) ovulationChance *= 10.0f; + try + { + calculatingOvulationChance = true; + ovulationChance *= PawnCapacityUtility.CalculateCapacityLevel(Pawn.health.hediffSet, xxx.reproduction); + } + finally { calculatingOvulationChance = false; } + } + return ovulationChance; + } + + protected float CalcuatedImplantChance() + { + float factor = 1.0f; + if (ModsConfig.BiotechActive && xxx.is_human(Pawn)) + { + // Implant factor will be based solely on pawn age, plus any rollover from ovulation chance + StatPart_FertilityByGenderAge fertilityStatPart = StatDefOf.Fertility.GetStatPart(); + fertilityStatPart?.TransformValue(StatRequest.For(Pawn), ref factor); + float ovulationOverflow = OvulationChance; + if (ovulationOverflow > 1.0f) factor *= ovulationOverflow; + return Props.baseImplantationChanceFactor * FertilityModifier * factor; + } + else + { + return Pawn.health.capacities.GetLevel(xxx.reproduction) * Props.baseImplantationChanceFactor * FertilityModifier * factor; + } + } + public float OvulationChance { get { - float ovulationChance = 1.0f; - if (EggHealth <= 0.0f) return 0.0f; - if (EggHealth < 1.0f / 3.0f) ovulationChance = 0.8f; - if (ModsConfig.BiotechActive && xxx.is_human(Pawn)) - { - if (Pawn.SterileGenes()) return 0.0f; - // Replicate how rjw.PawnCapacityWorker_Fertility.CalculateCapacityLevel does it, but without the age factor - if (!Pawn.RaceHasFertility()) return 0.0f; - if (AndroidsCompatibility.IsAndroid(Pawn) && parent.def != Genital_Helper.archotech_vagina) return 0.0f; - foreach (var part in StatDefOf.Fertility.parts) - { - if(part is StatPart_FertilityByGenderAge fertilityByAge) - { - float factor = 1.0f; - fertilityByAge.TransformValue(StatRequest.For(Pawn), ref factor); - if (factor <= 0.0f) return 0.0f; // Too young or too old - } - else part.TransformValue(StatRequest.For(Pawn), ref ovulationChance); - } - if (Pawn.HasQuirk(QuirkUtility.Quirks.Breeder)) ovulationChance *= 10.0f; - try - { - calculatingOvulationChance = true; - ovulationChance *= PawnCapacityUtility.CalculateCapacityLevel(Pawn.health.hediffSet, xxx.reproduction); - } - finally { calculatingOvulationChance = false; } - } - return ovulationChance; + if (ovulationChanceCache < 0.0f) ovulationChanceCache = CalcuatedOvulationChance(); + return ovulationChanceCache; } } + public float ImplantChance { get { - float factor = 1.0f; - if (ModsConfig.BiotechActive && xxx.is_human(Pawn)) - { - // Implant factor will be based solely on pawn age, plus any rollover from ovulation chance - StatPart_FertilityByGenderAge fertilityStatPart = StatDefOf.Fertility.GetStatPart(); - fertilityStatPart?.TransformValue(StatRequest.For(Pawn), ref factor); - float ovulationOverflow = OvulationChance; - if (ovulationOverflow > 1.0f) factor *= ovulationOverflow; - return Props.baseImplantationChanceFactor * FertilityModifier * factor; - } - else - { - return Pawn.health.capacities.GetLevel(xxx.reproduction) * Props.baseImplantationChanceFactor * FertilityModifier * factor; - } + if (implantationChanceCache < 0.0f) implantationChanceCache = CalcuatedImplantChance(); + return implantationChanceCache; } } @@ -554,7 +570,7 @@ namespace RJW_Menstruation { try { - Color c = Pawn.def.race.BloodDef.graphicData.color; + Color c = Pawn.RaceProps.BloodDef.graphicData.color; return c; } catch @@ -1216,7 +1232,7 @@ namespace RJW_Menstruation float avglittersize; try { - avglittersize = Mathf.Max(Rand.ByCurveAverage(Pawn.def.race.litterSizeCurve), 1.0f); + avglittersize = Mathf.Max(Rand.ByCurveAverage(Pawn.RaceProps.litterSizeCurve), 1.0f); } catch (NullReferenceException) { @@ -1259,6 +1275,8 @@ namespace RJW_Menstruation protected virtual void BeforeSimulator() { + ovulationChanceCache = -1.0f; + implantationChanceCache = -1.0f; CumOut(); } @@ -1479,7 +1497,7 @@ namespace RJW_Menstruation { // ~1.5 per hour times acceleration float bledAmount = 0.03f * Configurations.BleedingAmount * Configurations.CycleAcceleration * Rand.Range(0.5f, 1.5f) * TickInterval / GenDate.TicksPerHour; - CumIn(Pawn, bledAmount, Translations.Menstrual_Blood, -5.0f, Pawn.def.race?.BloodDef ?? ThingDefOf.Filth_Blood); + CumIn(Pawn, bledAmount, Translations.Menstrual_Blood, -5.0f, Pawn.RaceProps?.BloodDef ?? ThingDefOf.Filth_Blood); Cum blood = GetNotCum(Translations.Menstrual_Blood); if (blood != null) blood.Color = BloodColor; } @@ -1601,7 +1619,7 @@ namespace RJW_Menstruation float eggnum; try { - eggnum = Math.Max(Rand.ByCurve(Pawn.def.race.litterSizeCurve), 1f); + eggnum = Math.Max(Rand.ByCurve(Pawn.RaceProps.litterSizeCurve), 1f); } catch (NullReferenceException) { @@ -1780,7 +1798,7 @@ namespace RJW_Menstruation if (IsDangerDay) { - if (Pawn.HasQuirk(QuirkUtility.Quirks.Breeder) || Pawn.HasQuirk(QuirkUtility.Quirks.ImpregnationFetish)) + if (Pawn.WantsToGetPregnant()) { Pawn.needs.mood.thoughts.memories.TryGainMemory(VariousDefOf.CameInsideFFetish, cummer); } @@ -1803,7 +1821,7 @@ namespace RJW_Menstruation } else { - if (Pawn.HasQuirk(QuirkUtility.Quirks.Breeder) || Pawn.HasQuirk(QuirkUtility.Quirks.ImpregnationFetish)) + if (Pawn.WantsToGetPregnant()) { Pawn.needs.mood.thoughts.memories.TryGainMemory(VariousDefOf.CameInsideFFetishSafe, cummer); } @@ -1967,7 +1985,7 @@ namespace RJW_Menstruation public class Egg : IExposable { public bool fertilized; - public int lifeSpanTicks; + public int lifeSpanTicks; // Actual ticks scaled by cycleAcceleration public Pawn fertilizer; public int ageTicks; public int ticksSinceFertilization = 0; @@ -1994,23 +2012,25 @@ namespace RJW_Menstruation { int lifespanhrs = -1; int position = -1; - int fertstage = -1; Scribe_Values.Look(ref lifespanhrs, "lifespanhrs", lifespanhrs, true); Scribe_Values.Look(ref position, "position", position, true); - Scribe_Values.Look(ref fertstage, "fertstage", fertstage, true); if (lifespanhrs >= 0) lifeSpanTicks = lifespanhrs * GenDate.TicksPerHour; if (position >= 0) ageTicks = position * GenDate.TicksPerHour; - if (fertstage >= 0) ticksSinceFertilization = fertstage * GenDate.TicksPerHour; } Scribe_References.Look(ref fertilizer, "fertilizer", true); Scribe_Values.Look(ref fertilized, "fertilized", false); Scribe_Values.Look(ref lifeSpanTicks, "lifeSpanTicks", lifeSpanTicks, true); Scribe_Values.Look(ref ageTicks, "ageTicks", ageTicks, true); Scribe_Values.Look(ref ticksSinceFertilization, "ticksSinceFertilization", 0); + if (ticksSinceFertilization == 0 && Scribe.mode == LoadSaveMode.LoadingVars) + { + // A bit awkward to do this twice, but it prevents ticksSinceFertilization from getting overwritten on a fertstage load + int fertstage = -1; + Scribe_Values.Look(ref fertstage, "fertstage", fertstage, true); + if (fertstage >= 0) ticksSinceFertilization = fertstage * GenDate.TicksPerHour; + } } } - - } public class HediffComp_Anus : HediffComp diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs index f352a1b..ab09dd3 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs @@ -349,7 +349,7 @@ namespace RJW_Menstruation else if (hediff is Hediff_BasePregnancy rjw_preg) return (rjw_preg.p_end_tick - rjw_preg.p_start_tick) / GenDate.TicksPerHour; // TODO: Biotech pregnancy - else return hediff.pawn.def.race.gestationPeriodDays * GenDate.HoursPerDay; + else return hediff.pawn.RaceProps.gestationPeriodDays * GenDate.HoursPerDay; } public static float RandomVariabilityPercent(int recursion = 0) @@ -401,6 +401,22 @@ namespace RJW_Menstruation return false; } + public static bool WantsToGetPregnant(this Pawn pawn) + { + if (pawn.HasQuirk(QuirkUtility.Quirks.Breeder) || + pawn.HasQuirk(QuirkUtility.Quirks.ImpregnationFetish)) + return true; + + Ideo ideo = pawn.Ideo; + if (ideo == null || VariousDefOf.Pregnancy_Elevated == null) return false; + if (ideo.HasPrecept(VariousDefOf.Pregnancy_Elevated) || + ideo.HasPrecept(VariousDefOf.Pregnancy_Holy) || + ideo.HasPrecept(VariousDefOf.Pregnancy_Required)) + return true; + + return false; + } + public static float DamagePants(this Pawn pawn, float fluidAmount) { if (pawn.apparel == null) return 0; diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs index b47d614..f9ab88e 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs @@ -23,11 +23,11 @@ namespace RJW_Menstruation { if (is_discovered || !xxx.is_human(pawn) || - pawn.HasQuirk(QuirkUtility.Quirks.Breeder) || + pawn.HasQuirk(QuirkUtility.Quirks.Breeder) || (pawn.Ideo?.HasPrecept(VariousDefOf.Pregnancy_Required) ?? false) || (pawn.relations?.DirectRelations?.Find(x => x.def.Equals(PawnRelationDefOf.Spouse) || x.def.Equals(PawnRelationDefOf.Fiance))) != null) return; - if (pawn.HasQuirk(QuirkUtility.Quirks.ImpregnationFetish) || pawn.relations?.DirectRelations?.Find(x => x.def.Equals(PawnRelationDefOf.Lover)) != null) + if (pawn.WantsToGetPregnant() || pawn.relations?.DirectRelations?.Find(x => x.def.Equals(PawnRelationDefOf.Lover)) != null) { pawn.needs.mood.thoughts.memories.TryGainMemory(VariousDefOf.UnwantedPregnancyMild); } diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/GC_Patch.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/GC_Patch.cs index 79e7be5..37eda3e 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/GC_Patch.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/GC_Patch.cs @@ -16,7 +16,7 @@ namespace RJW_Menstruation.Patch { if (!__result.NullOrEmpty()) return; if (cummedPawns.Contains(pawn)) - __result = "Has cum or fertilized egg in a womb"; + __result = "EggFertOrCumInWomb"; } } diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/TextureCache.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/TextureCache.cs index b1c3853..4c9c591 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/TextureCache.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/TextureCache.cs @@ -15,13 +15,13 @@ namespace RJW_Menstruation return milktexturecache; } } - // Sex drive - public static Texture2D SexDriveTexture + // Ovulation, sex drive + public static Texture2D OvulatoryTexture { get { - if (sexdrivetexturecache == null) sexdrivetexturecache = SolidColorMaterials.NewSolidColorTexture(0.686f, 0.062f, 0.698f, 1.0f); - return sexdrivetexturecache; + if (ovulatorytexturecache == null) ovulatorytexturecache = SolidColorMaterials.NewSolidColorTexture(0.686f, 0.062f, 0.698f, 1.0f); + return ovulatorytexturecache; } } // Bleeding, vulnerability @@ -93,7 +93,7 @@ namespace RJW_Menstruation public static readonly Texture2D GatherCum_Pussy = ContentFinder.Get("UI/Icon/ToPussy"); private static Texture2D milktexturecache = SolidColorMaterials.NewSolidColorTexture(0.992f, 1.0f, 0.960f, 1.0f); - private static Texture2D sexdrivetexturecache = SolidColorMaterials.NewSolidColorTexture(0.686f, 0.062f, 0.698f, 1.0f); + private static Texture2D ovulatorytexturecache = SolidColorMaterials.NewSolidColorTexture(0.686f, 0.062f, 0.698f, 1.0f); private static Texture2D bleedingtexturecache = SolidColorMaterials.NewSolidColorTexture(0.415f, 0.0f, 0.003f, 1.0f); private static Texture2D pregnanttexturecache = SolidColorMaterials.NewSolidColorTexture(0.082f, 0.453f, 0.6f, 1.0f); private static Texture2D recovertexturecache = SolidColorMaterials.NewSolidColorTexture(0.6f, 0.83f, 0.35f, 1.0f); @@ -101,10 +101,5 @@ namespace RJW_Menstruation private static Texture2D animaltexturecache = SolidColorMaterials.NewSolidColorTexture(0.411f, 0.521f, 0.878f, 1.0f); private static Texture2D lutealtexturecache = SolidColorMaterials.NewSolidColorTexture(0.843f, 0.474f, 0.6f, 1.0f); private static Texture2D whoredtexturecache = SolidColorMaterials.NewSolidColorTexture(0.7f, 0.7f, 0.0f, 1.0f); - - - - - } } diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs index 9b726b2..2c8b4c8 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs @@ -433,7 +433,7 @@ namespace RJW_Menstruation float statvalue; const float height = 24f; statvalue = pawn.GetStatValue(xxx.sex_drive_stat); - FillableBarLabeled(lineRect, " " + xxx.sex_drive_stat.LabelCap.CapitalizeFirst() + " " + statvalue.ToStringPercent(), statvalue / 2, TextureCache.SexDriveTexture, Texture2D.blackTexture, xxx.sex_drive_stat.description); + FillableBarLabeled(lineRect, " " + xxx.sex_drive_stat.LabelCap.CapitalizeFirst() + " " + statvalue.ToStringPercent(), statvalue / 2, TextureCache.OvulatoryTexture, Texture2D.blackTexture, xxx.sex_drive_stat.description); lineRect.y += height; statvalue = pawn.GetStatValue(xxx.vulnerability_stat); diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs index 815d8ab..db91411 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs @@ -53,7 +53,7 @@ namespace RJW_Menstruation if (pawn.kindDef?.race == pawn.def) return pawn.kindDef; return VariousDefOf.AllKinds.Find(kind => kind.race == pawn.def && kind.defName.Contains("Colonist")) ?? VariousDefOf.AllKinds.Find(kind => kind.race == pawn.def) ?? - pawn.def.race?.AnyPawnKind ?? + pawn.RaceProps?.AnyPawnKind ?? pawn.kindDef; } diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/VariousDefOf.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/VariousDefOf.cs index 7f368cc..6c5e143 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/VariousDefOf.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/VariousDefOf.cs @@ -167,5 +167,10 @@ namespace RJW_Menstruation public static readonly HediffDef Hediff_Lactating_Permanent = DefDatabase.GetNamedSilentFail("Lactating_Permanent"); public static readonly HediffDef Hediff_Heavy_Lactating_Permanent = DefDatabase.GetNamedSilentFail("Heavy_Lactating_Permanent"); public static readonly JobDef Job_LactateSelf_MC = DefDatabase.GetNamedSilentFail("LactateSelf_MC"); + + // Defs from Sexperience Ideology + public static readonly PreceptDef Pregnancy_Elevated = DefDatabase.GetNamedSilentFail("Pregnancy_Elevated"); + public static readonly PreceptDef Pregnancy_Holy = DefDatabase.GetNamedSilentFail("Pregnancy_Holy"); + public static readonly PreceptDef Pregnancy_Required = DefDatabase.GetNamedSilentFail("Pregnancy_Required"); } } diff --git a/changelogs.txt b/changelogs.txt index f427a5b..97ae1c8 100644 --- a/changelogs.txt +++ b/changelogs.txt @@ -2,6 +2,7 @@ Version 1.0.9.0 - Fix errors when opening the womb dialog of some low fertility pawns. - Updated Traditional Chinese translation by Hydrogen. - New options to update wombs more or less often, defaulting to every hour. + - When using the sexperience-ideology mod, pawns with pro-pregnancy precepts will have thoughts more agreeable with potential pregnancies. - More generous egg allocation for newly spawned periodic ovulators. - Menstruation-related genes will now stay on females during initial pawn setup.