diff --git a/1.4/Assemblies/RJW_Menstruation.dll b/1.4/Assemblies/RJW_Menstruation.dll index 631f7ee..3ed15f2 100644 Binary files a/1.4/Assemblies/RJW_Menstruation.dll and b/1.4/Assemblies/RJW_Menstruation.dll differ diff --git a/1.4/Languages/English/Keyed/RJW_Menstruation.xml b/1.4/Languages/English/Keyed/RJW_Menstruation.xml index 18611bd..a1c65b3 100644 --- a/1.4/Languages/English/Keyed/RJW_Menstruation.xml +++ b/1.4/Languages/English/Keyed/RJW_Menstruation.xml @@ -56,12 +56,6 @@ Cum will lose fertility by this amount every hour This value affects fertilization chance indirectly. Cycle acceleration Accelerate menstruation cycle This can cause early menopause and infertility. Setting this lower than x12 is recommended. Rimworld's timescale: x6(default) - Colonist update interval - How often the womb of each of your colonists, prisoners, and slaves update. Lowering this will improve accuracy, increasing this can improve performance. - Non-colonist update interval - How often the womb of humans you don't control update. Lowering this will improve accuracy, increasing this can improve performance. - Animal update interval - How often the womb of animals update. Lowering this will improve accuracy, increasing this can improve performance. Debug Show debug information. Womb status diff --git a/1.4/MilkModule/Assemblies/MilkModule.dll b/1.4/MilkModule/Assemblies/MilkModule.dll index a9bde84..c56319f 100644 Binary files a/1.4/MilkModule/Assemblies/MilkModule.dll and b/1.4/MilkModule/Assemblies/MilkModule.dll differ diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Configurations.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Configurations.cs index 25d8ce1..d450c4d 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Configurations.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Configurations.cs @@ -1,5 +1,4 @@ -using RimWorld; -using rjw; +using rjw; using System; using System.Collections.Generic; using UnityEngine; @@ -18,9 +17,6 @@ namespace RJW_Menstruation public const float CumFertilityDecayRatioDefault = 0.05f; public const int CumFertilityDecayRatioAdjustDefault = 50; public const int CycleAccelerationDefault = 6; - public const int ColonistTickIntervalDefault = 2500; // 1 hour - public const int NonColonistTickIntervalDefault = 2500; - public const int AnimalTickIntervalDefault = 2500; public const float EnzygoticTwinsChanceDefault = 0.002f; public const int EnzygoticTwinsChanceAdjustDefault = 2; public const int MaxEnzygoticTwinsDefault = 9; @@ -45,9 +41,6 @@ namespace RJW_Menstruation public static float CumFertilityDecayRatio = CumFertilityDecayRatioDefault; public static int CumFertilityDecayRatioAdjust = CumFertilityDecayRatioAdjustDefault; public static int CycleAcceleration = CycleAccelerationDefault; - public static int ColonistTickInterval = ColonistTickIntervalDefault; - public static int NonColonistTickInterval = NonColonistTickIntervalDefault; - public static int AnimalTickInterval = AnimalTickIntervalDefault; public static bool EnableWombIcon = true; public static bool EnableDraftedIcon = true; public static bool EnableAnimalCycle = false; @@ -92,9 +85,6 @@ namespace RJW_Menstruation EnableGatherCumGizmo = true; EnableAnimalCycle = false; CycleAcceleration = CycleAccelerationDefault; - ColonistTickInterval = ColonistTickIntervalDefault; - NonColonistTickInterval = NonColonistTickIntervalDefault; - AnimalTickInterval = AnimalTickIntervalDefault; EstrusOverridesHookupSettings = false; EstrusFuckabilityToHookup = RJWHookupSettings.MinimumFuckabilityToHookup; EstrusAttractivenessToHookup = RJWHookupSettings.MinimumAttractivenessToHookup; @@ -198,9 +188,6 @@ namespace RJW_Menstruation Scribe_Values.Look(ref CumFertilityDecayRatioAdjust, "CumFertilityDecayRatioAdjust", CumFertilityDecayRatioAdjust, true); Scribe_Values.Look(ref CumFertilityDecayRatio, "CumFertilityDecayRatio", CumFertilityDecayRatio, true); Scribe_Values.Look(ref CycleAcceleration, "CycleAcceleration", CycleAcceleration, true); - Scribe_Values.Look(ref ColonistTickInterval, "ColonistTickInterval", ColonistTickInterval, true); - Scribe_Values.Look(ref NonColonistTickInterval, "NonColonistTickInterval", NonColonistTickInterval, true); - Scribe_Values.Look(ref AnimalTickInterval, "AnimalTickInterval", AnimalTickInterval, true); Scribe_Values.Look(ref EnableWombIcon, "EnableWombIcon", EnableWombIcon, true); Scribe_Values.Look(ref EnableDraftedIcon, "EnableDraftedIcon", EnableDraftedIcon, true); Scribe_Values.Look(ref EnableAnimalCycle, "EnableAnimalCycle", EnableAnimalCycle, true); @@ -287,9 +274,8 @@ namespace RJW_Menstruation public override void DoSettingsWindowContents(Rect inRect) { Rect outRect = new Rect(0f, 30f, inRect.width, inRect.height - 30f); - float mainRectHeight = 126f + + float mainRectHeight = 30f + (Configurations.EnableWombIcon || Configurations.EnableButtonInHT ? 400f : 0f) + - (Configurations.EnableAnimalCycle ? 48f : 0f) + (Configurations.EstrusOverridesHookupSettings ? 144f : 0f) + (Configurations.PregnancySource == Configurations.PregnancyType.MultiplePregnancy ? (Configurations.EnableEnzygoticTwins ? 175f : 75f) : 0f) + (Configurations.PregnancySource == Configurations.PregnancyType.Biotech ? 75f : 0f) + @@ -417,11 +403,11 @@ namespace RJW_Menstruation string estimatedlifespan; if (semenlifespan < 0) { - estimatedlifespan = string.Format(": Infinite", semenlifespan); + estimatedlifespan = String.Format(": Infinite", semenlifespan); } else { - estimatedlifespan = string.Format(": {0:0}h", semenlifespan); + estimatedlifespan = String.Format(": {0:0}h", semenlifespan); } listmain.LabelDouble(Translations.Option6_Label + " " + Configurations.CumFertilityDecayRatio * 100 + "%", Translations.EstimatedCumLifespan + estimatedlifespan, Translations.Option6_Desc); Configurations.CumFertilityDecayRatioAdjust = (int)listmain.Slider(Configurations.CumFertilityDecayRatioAdjust, 0, 1000); @@ -430,20 +416,6 @@ namespace RJW_Menstruation listmain.Label(Translations.Option7_Label + " x" + Configurations.CycleAcceleration, -1, Translations.Option7_Desc); Configurations.CycleAcceleration = (int)listmain.Slider(Configurations.CycleAcceleration, 1, 50); - Adjust = Configurations.ColonistTickInterval / 25; - listmain.LabelDouble(Translations.Option_ColonistUpdateInterval_Label, GenDate.ToStringTicksToPeriod(Configurations.ColonistTickInterval), Translations.Option_ColonistUpdateInterval_Desc); - Configurations.ColonistTickInterval = (int)listmain.Slider(Adjust, 0, 400) * 25; - - Adjust = Configurations.NonColonistTickInterval / 25; - listmain.LabelDouble(Translations.Option_NonColonistUpdateInterval_Label, GenDate.ToStringTicksToPeriod(Configurations.NonColonistTickInterval), Translations.Option_NonColonistUpdateInterval_Desc); - Configurations.NonColonistTickInterval = (int)listmain.Slider(Adjust, 0, 400) * 25; - - if(Configurations.EnableAnimalCycle) - { - Adjust = Configurations.AnimalTickInterval / 25; - listmain.LabelDouble(Translations.Option_AnimalUpdateInterval_Label, GenDate.ToStringTicksToPeriod(Configurations.AnimalTickInterval), Translations.Option_AnimalUpdateInterval_Desc); - Configurations.AnimalTickInterval = (int)listmain.Slider(Adjust, 0, 400) * 25; - } float var2 = EstimatedBleedingAmountPerHour; float var1 = Math.Max(EstimatedBleedingAmount, var2); diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Cum.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Cum.cs index d7a424c..c1f9931 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Cum.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Cum.cs @@ -174,7 +174,7 @@ namespace RJW_Menstruation } - public void MakeThinner(float speed) + public void MakeThinner(int speed) { cumthickness = cumthickness.LerpMultiple(DecayResist, 0.3f, speed); } @@ -205,10 +205,8 @@ namespace RJW_Menstruation { // comp is used for Hydrogen's RJW Muscle Injury float totalleak = volume; - float decayPerInterval = 1 - Mathf.Pow(1 - Configurations.CumDecayRatio, (float)comp.TickInterval / GenDate.TicksPerHour); - float fertilityDecayPerInterval = 1 - Mathf.Pow(Configurations.CumFertilityDecayRatio, (float)comp.TickInterval / GenDate.TicksPerHour); - volume *= Math.Max(0, 1 - decayPerInterval * (1 - DecayResist) * leakfactor); - fertility *= Math.Max(0, 1 - (fertilityDecayPerInterval * (1 - DecayResist) + antisperm)); + volume *= Math.Max(0, (1 - (Configurations.CumDecayRatio * (1 - DecayResist)) * leakfactor)); + fertility *= Math.Max(0, 1 - (Configurations.CumFertilityDecayRatio * (1 - DecayResist) + antisperm)); CutMinor(); totalleak -= volume; return totalleak; 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..15e013b 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 @@ -70,7 +70,7 @@ namespace RJW_Menstruation case Stage.Ovulatory: return true; case Stage.Luteal: - return IsEggExist && curStageTicks < EggLifespanTicks; + return IsEggExist && curStageHrs < EggLifespanHours; default: return false; } @@ -84,11 +84,11 @@ namespace RJW_Menstruation switch (curStage) { case Stage.Follicular: - return curStageTicks > currentIntervalTicks - Props.estrusDaysBeforeOvulation * GenDate.TicksPerDay; + return curStageHrs > currentIntervalHours - Props.estrusDaysBeforeOvulation * 24; case Stage.Ovulatory: return true; case Stage.Luteal: - return IsEggExist && curStageTicks < EggLifespanTicks; + return IsEggExist && curStageHrs < EggLifespanHours; 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 a364560..78e7a77 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 @@ -29,7 +29,6 @@ namespace RJW_Menstruation public float baseImplantationChanceFactor; public float basefertilizationChanceFactor; public int follicularIntervalDays = 14; //before ovulation including beginning of bleeding - public int ovulationIntervalHours = 12; //between the end of follicular and the egg emerging public int lutealIntervalDays = 14; //after ovulation until bleeding public int bleedingIntervalDays = 6; //must be less than folicularIntervalDays public int recoveryIntervalDays = 10; //additional infertile days after gave birth @@ -64,16 +63,17 @@ namespace RJW_Menstruation public class HediffComp_Menstruation : HediffComp { const float minmakefilthvalue = 1.0f; - const int maxImplantDelayHours = 30 * GenDate.HoursPerDay; - const int minImplantAgeHours = 3 * GenDate.HoursPerDay; + //const int ovarypowerthreshold = 72; + + const int tickInterval = GenDate.TicksPerHour; + const int maxImplantDelayHours = 30 * 24; + const int minImplantAgeHours = 3 * 24; const float pulloutSuccessRate = 0.8f; const float fetishPulloutSuccessModifier = 0.25f; public CompProperties_Menstruation Props; public Stage curStage = Stage.Follicular; - public int curStageTicks = 0; // Actual number of ticks equals this / cycleAcceleration - private int tickInterval = -1; - const int recalculateTickInterval = GenDate.TicksPerDay; + public int curStageHrs = 0; public bool loaded = false; public bool initError = false; public int ovarypower = -100000; @@ -114,7 +114,7 @@ namespace RJW_Menstruation protected List eggs; protected float cycleSpeed = -1; protected float cycleVariability = -1; - protected int currentIntervalTicks = -1; // Actual number of ticks equals this / cycleAcceleration + protected int currentIntervalHours = -1; protected float crampPain = -1; protected Need sexNeed = null; protected string customwombtex = null; @@ -126,7 +126,7 @@ namespace RJW_Menstruation // RJW pregnancy, or Biotech pregnancy/labor/laborpushing protected Hediff pregnancy = null; - protected int eggLifeSpanTicks = 2 * GenDate.TicksPerDay; + protected int eggLifeSpanHours = 48; protected EstrusLevel estrusLevel = EstrusLevel.Visible; protected float ovulationFactor = 1f; protected bool noBleeding = false; @@ -155,21 +155,6 @@ namespace RJW_Menstruation new CurvePoint(1.0f,0.5f) }; - public int TickInterval - { - get - { - if (tickInterval <= 0) - { - if (Pawn.IsAnimal()) tickInterval = Configurations.AnimalTickInterval; - else if (Pawn.IsColonist || Pawn.IsPrisonerOfColony || Pawn.IsSlaveOfColony) tickInterval = Configurations.ColonistTickInterval; - else tickInterval = Configurations.NonColonistTickInterval; - if (tickInterval <= 0) tickInterval = 1; - } - return tickInterval; - } - } - public Hediff Pregnancy { get { @@ -495,12 +480,12 @@ namespace RJW_Menstruation /// /// returns fertstage. if not fertilized returns -1 /// - public int EggFertilizedTime + public int IsFertilized { get { if (eggs?.All(egg => !egg.fertilized) ?? true) return -1; - return eggs.Max(egg => egg.ticksSinceFertilization); + return eggs.Max(egg => egg.fertstage); } } public IEnumerable GetCummersAndFertilizers() @@ -517,9 +502,9 @@ namespace RJW_Menstruation get => !eggs.NullOrEmpty(); } - public int EggLifespanTicks + public int EggLifespanHours { - get => eggLifeSpanTicks; + get => eggLifeSpanHours; } public virtual bool IsDangerDay @@ -531,11 +516,11 @@ namespace RJW_Menstruation switch (curStage) { case Stage.Follicular: - return curStageTicks > 0.7f * currentIntervalTicks; + return curStageHrs > 0.7f * currentIntervalHours; case Stage.Ovulatory: return true; case Stage.Luteal: - return curStageTicks < EggLifespanTicks; + return curStageHrs < EggLifespanHours; default: return false; } @@ -574,16 +559,16 @@ namespace RJW_Menstruation set => originvagsize = value; } - public int CurStageIntervalTicks + public float CurStageIntervalHours { - get => currentIntervalTicks; + get => currentIntervalHours; } public float StageProgress { get { - if (pregnancy == null) return Mathf.Clamp01((float)curStageTicks / currentIntervalTicks); + if (pregnancy == null) return Mathf.Clamp01(curStageHrs / CurStageIntervalHours); bool is_discovered = false; switch (pregnancy) { @@ -605,7 +590,7 @@ namespace RJW_Menstruation if (Pawn.story?.bodyType == BodyTypeDefOf.Thin) discoveryTime = 0.25f; else if (Pawn.story?.bodyType == BodyTypeDefOf.Female) discoveryTime = 0.35f; // Estimated; there's no way to get the exact value after the fact without writing it into the save - float lutealProgressWhenImplanted = Math.Min(0.5f, maxImplantDelayHours / (Props.lutealIntervalDays * GenDate.HoursPerDay)); + float lutealProgressWhenImplanted = Math.Min(0.5f, maxImplantDelayHours / (Props.lutealIntervalDays * 24)); return GenMath.LerpDouble(0, discoveryTime, lutealProgressWhenImplanted, 1.0f, pregnancy.Severity); } @@ -623,23 +608,13 @@ namespace RJW_Menstruation public override void CompExposeData() { base.CompExposeData(); - if (Scribe.mode == LoadSaveMode.LoadingVars) - { - int curStageHrs = -1; - int currentIntervalHours = -1; - Scribe_Values.Look(ref curStageHrs, "curStageHrs", curStageHrs, true); - Scribe_Values.Look(ref currentIntervalHours, "currentIntervalHours", currentIntervalHours, true); - if (curStageHrs >= 0) curStageTicks = curStageHrs * GenDate.TicksPerHour; - if (currentIntervalHours >= 0) currentIntervalTicks = currentIntervalHours * GenDate.TicksPerHour; - } - Scribe_Collections.Look(ref cums, saveDestroyedThings: true, label: "cums", lookMode: LookMode.Deep, ctorArgs: new object[0]); Scribe_Collections.Look(ref eggs, saveDestroyedThings: true, label: "eggs", lookMode: LookMode.Deep, ctorArgs: new object[0]); Scribe_Values.Look(ref curStage, "curStage", curStage, true); - Scribe_Values.Look(ref curStageTicks, "curStageTicks", curStageTicks, true); + Scribe_Values.Look(ref curStageHrs, "curStageHrs", curStageHrs, true); Scribe_Values.Look(ref cycleSpeed, "cycleSpeed", cycleSpeed, true); Scribe_Values.Look(ref cycleVariability, "cycleVariability", cycleVariability, true); - Scribe_Values.Look(ref currentIntervalTicks, "currentIntervalTicks", currentIntervalTicks, true); + Scribe_Values.Look(ref currentIntervalHours, "currentIntervalHours", currentIntervalHours, true); Scribe_Values.Look(ref crampPain, "crampPain", crampPain, true); Scribe_Values.Look(ref ovarypower, "ovarypower", ovarypower, true); Scribe_Values.Look(ref eggstack, "eggstack", eggstack, true); @@ -660,16 +635,16 @@ namespace RJW_Menstruation public void Notify_UpdatedGenes() { - eggLifeSpanTicks = Props.eggLifespanDays * GenDate.TicksPerDay; + eggLifeSpanHours = Props.eggLifespanDays * 24; estrusLevel = Props.concealedEstrus ? EstrusLevel.Concealed : EstrusLevel.Visible; ovulationFactor = 1f; noBleeding = false; if (Pawn.genes == null || !ModsConfig.BiotechActive) return; - if (Pawn.genes.HasGene(VariousDefOf.ShortEggLifetime)) eggLifeSpanTicks = eggLifeSpanTicks * 3 / 4; - else if (Pawn.genes.HasGene(VariousDefOf.DoubleEggLifetime)) eggLifeSpanTicks *= 2; - else if (Pawn.genes.HasGene(VariousDefOf.QuadEggLifetime)) eggLifeSpanTicks *= 4; + if (Pawn.genes.HasGene(VariousDefOf.ShortEggLifetime)) eggLifeSpanHours = eggLifeSpanHours * 3 / 4; + else if (Pawn.genes.HasGene(VariousDefOf.DoubleEggLifetime)) eggLifeSpanHours *= 2; + else if (Pawn.genes.HasGene(VariousDefOf.QuadEggLifetime)) eggLifeSpanHours *= 4; if (Pawn.genes.HasGene(VariousDefOf.NeverEstrus)) estrusLevel = EstrusLevel.None; else if (Pawn.genes.HasGene(VariousDefOf.FullEstrus)) estrusLevel = EstrusLevel.Visible; @@ -713,8 +688,7 @@ namespace RJW_Menstruation Initialize(); } - if (Pawn.IsHashIntervalTick(recalculateTickInterval)) tickInterval = -1; // Every so often, force TickInterval to be recalculated in case the pawn's status changed. - if (!Pawn.IsHashIntervalTick(TickInterval)) return; + if (!Pawn.IsHashIntervalTick(tickInterval)) return; if (initError) Log.Warning($"Attempting to process {Pawn}'s womb uninitialized"); @@ -810,9 +784,9 @@ namespace RJW_Menstruation } } - protected virtual int TicksToNextStage() + protected virtual int HoursToNextStage() { - return Math.Max(0,(currentIntervalTicks - curStageTicks) / Configurations.CycleAcceleration); + return Math.Max(0,(currentIntervalHours - curStageHrs) / Configurations.CycleAcceleration); } public override string CompDebugString() @@ -820,7 +794,7 @@ namespace RJW_Menstruation if (curStage == Stage.None || curStage == Stage.Infertile || curStage == Stage.Pregnant) return base.CompDebugString(); StringBuilder debugString = new StringBuilder(); debugString.Append($"Time to next state: "); - debugString.Append(GenDate.ToStringTicksToPeriod(TicksToNextStage())); + debugString.Append(GenDate.ToStringTicksToPeriod(HoursToNextStage() * GenDate.TicksPerHour)); return debugString.ToString(); } @@ -831,7 +805,11 @@ namespace RJW_Menstruation /// public Cum GetNotCum(string notcumlabel) { - return cums?.Find(cum => cum.notcum && cum.notcumLabel.Equals(notcumlabel)); + if (!cums.NullOrEmpty()) foreach (Cum cum in cums) + { + if (cum.notcum && cum.notcumLabel.Equals(notcumlabel)) return cum; + } + return null; } /// @@ -847,17 +825,17 @@ namespace RJW_Menstruation /// /// Inject pawn's cum into womb /// - /// + /// /// /// /// - public void CumIn(Pawn cummer, float volume, float fertility = 1.0f, bool precum = false) + public void CumIn(Pawn pawn, float volume, float fertility = 1.0f, bool precum = false) { if (volume <= 0) return; - if (!precum && fertility > 0 && IsDangerDay && cummer.relations.GetPregnancyApproachForPartner(Pawn) == PregnancyApproach.AvoidPregnancy) + if (!precum && fertility > 0 && IsDangerDay && pawn.relations.GetPregnancyApproachForPartner(Pawn) == PregnancyApproach.AvoidPregnancy) { float successChance = pulloutSuccessRate; - if (cummer.HasQuirk(QuirkUtility.Quirks.ImpregnationFetish)) successChance *= fetishPulloutSuccessModifier; + if (pawn.HasQuirk(QuirkUtility.Quirks.ImpregnationFetish)) successChance *= fetishPulloutSuccessModifier; if (Pawn.HasQuirk(QuirkUtility.Quirks.ImpregnationFetish)) successChance *= fetishPulloutSuccessModifier; if (Rand.Chance(successChance)) return; } @@ -870,14 +848,14 @@ namespace RJW_Menstruation bool merged = false; if (!cums.NullOrEmpty()) foreach (Cum cum in cums) { - if (cum.pawn.Equals(cummer)) + if (cum.pawn.Equals(pawn)) { cum.MergeWithCum(volume, fertility); merged = true; } cum.DismishForce(cumoutrate); } - if (!merged) cums.Add(new Cum(cummer, volume * (1 - cumoutrate), fertility)); + if (!merged) cums.Add(new Cum(pawn, volume * (1 - cumoutrate), fertility)); } else { @@ -885,20 +863,20 @@ namespace RJW_Menstruation bool merged = false; if (!cums.NullOrEmpty()) foreach (Cum cum in cums) { - if (cum.pawn.Equals(cummer)) + if (cum.pawn.Equals(pawn)) { cum.MergeWithCum(volume, fertility); merged = true; } } - if (!merged) cums.Add(new Cum(cummer, volume, fertility)); + if (!merged) cums.Add(new Cum(pawn, volume, fertility)); } cumd = TotalCumPercent - cumd; if (!precum) { Pawn.records.AddTo(VariousDefOf.AmountofCreampied, volume); - AfterCumIn(cummer); + AfterCumIn(pawn); AfterFluidIn(cumd); } } @@ -906,12 +884,12 @@ namespace RJW_Menstruation /// /// Inject pawn's fluid into womb /// - /// + /// /// /// /// /// - public void CumIn(Pawn cummer, float volume, string notcumlabel, float decayresist = 0, ThingDef filthdef = null) + public void CumIn(Pawn pawn, float volume, string notcumlabel, float decayresist = 0, ThingDef filthdef = null) { if (volume <= 0) return; float tmp = TotalCum + volume; @@ -922,14 +900,14 @@ namespace RJW_Menstruation bool merged = false; if (!cums.NullOrEmpty()) foreach (Cum cum in cums) { - if (cum.notcum && cum.pawn.Equals(cummer) && cum.notcumLabel.Equals(notcumlabel)) + if (cum.notcum && cum.pawn.Equals(pawn) && cum.notcumLabel.Equals(notcumlabel)) { cum.MergeWithFluid(volume, decayresist, filthdef); merged = true; } cum.DismishForce(cumoutrate); } - if (!merged) cums.Add(new Cum(cummer, volume * (1 - cumoutrate), notcumlabel, decayresist, filthdef)); + if (!merged) cums.Add(new Cum(pawn, volume * (1 - cumoutrate), notcumlabel, decayresist, filthdef)); } else { @@ -937,13 +915,13 @@ namespace RJW_Menstruation bool merged = false; if (!cums.NullOrEmpty()) foreach (Cum cum in cums) { - if (cum.notcum && cum.pawn.Equals(cummer) && cum.notcumLabel.Equals(notcumlabel)) + if (cum.notcum && cum.pawn.Equals(pawn) && cum.notcumLabel.Equals(notcumlabel)) { cum.MergeWithFluid(volume, decayresist, filthdef); merged = true; } } - if (!merged) cums.Add(new Cum(cummer, volume, notcumlabel, decayresist, filthdef)); + if (!merged) cums.Add(new Cum(pawn, volume, notcumlabel, decayresist, filthdef)); } cumd = TotalCumPercent - cumd; AfterNotCumIn(); @@ -983,8 +961,8 @@ namespace RJW_Menstruation absorber = (Absorber)Pawn.apparel?.WornApparel?.Find(x => x is Absorber); if (absorber != null) { - absorber.WearEffect(TickInterval); - if (absorber.dirty && absorber.EffectAfterDirty) absorber.DirtyEffect(TickInterval); + absorber.WearEffect(); + if (absorber.dirty && absorber.EffectAfterDirty) absorber.DirtyEffect(); } } @@ -1013,33 +991,29 @@ namespace RJW_Menstruation /// public void CumOut() { - const float mlPerFilth = 5.0f; float leakfactor = 1.0f; float totalleak = 0f; float cumd = TotalCumPercent; - int preCumAmount = Mathf.CeilToInt(TotalCum / mlPerFilth); List filthlabels = new List(); BeforeCumOut(out Absorber absorber); if (cums.NullOrEmpty()) return; if (TotalCum > Props.maxCumCapacity * Pawn.BodySize) leakfactor = Math.Min(1 + (TotalCum - Props.maxCumCapacity * Pawn.BodySize) / 10, 2f); if (absorber != null && absorber.dirty && !absorber.LeakAfterDirty) leakfactor = 0f; if (Pawn.CurJobDef == xxx.knotted) leakfactor = 0f; + HashSet removecums = new HashSet(); foreach (Cum cum in cums) { - if (Rand.Chance((float)TickInterval / GenDate.TicksPerHour)) cum.CumEffects(Pawn); + cum.CumEffects(Pawn); float vd = cum.DismishNatural(leakfactor, this, antisperm); - cum.MakeThinner((float)Configurations.CycleAcceleration * TickInterval / GenDate.TicksPerHour); + cum.MakeThinner(Configurations.CycleAcceleration); totalleak += AbsorbCum(vd, absorber); string tmp = "FilthLabelWithSource".Translate(cum.FilthDef.label, cum.pawn?.LabelShort ?? "Unknown", 1.ToString()); filthlabels.Add(tmp.Replace(" x1", "")); + if (cum.ShouldRemove()) removecums.Add(cum); } - int postCumAmount = Mathf.CeilToInt(TotalCum / mlPerFilth); - for (int i = 0; i < preCumAmount - postCumAmount; i++) // Emit a filth every time the integer cum amount drops - { - if (cums.Count > 1) MakeCumFilthMixture(totalleak, filthlabels); - else if (cums.Count == 1) MakeCumFilth(cums.First(), totalleak); - } - cums.RemoveAll(cum => cum.ShouldRemove()); + if (cums.Count > 1) MakeCumFilthMixture(totalleak, filthlabels); + else if (cums.Count == 1) MakeCumFilth(cums.First(), totalleak); + cums.RemoveAll(cum => removecums.Contains(cum)); cumd = TotalCumPercent - cumd; if (totalleak >= 1.0f) AfterCumOut(); AfterFluidOut(cumd); @@ -1153,17 +1127,17 @@ namespace RJW_Menstruation InitOvary(); - if (currentIntervalTicks < 0) + if (currentIntervalHours < 0) { if (ShouldBeInfertile()) curStage = Stage.Infertile; else if (!IsBreedingSeason()) curStage = Stage.Anestrus; else curStage = RandomStage(); if (curStage == Stage.Follicular) - currentIntervalTicks = PeriodRandomizer(Stage.Follicular) - PeriodRandomizer(Stage.Bleeding); + currentIntervalHours = PeriodRandomizer(Stage.Follicular) - PeriodRandomizer(Stage.Bleeding); else - currentIntervalTicks = PeriodRandomizer(curStage); - if (currentIntervalTicks < 0) currentIntervalTicks = 0; - else if (currentIntervalTicks < curStageTicks) curStageTicks = currentIntervalTicks; + currentIntervalHours = PeriodRandomizer(curStage); + if (currentIntervalHours <= 0) currentIntervalHours = 1; + else if (currentIntervalHours < curStageHrs) curStageHrs = currentIntervalHours; } if (crampPain < 0) crampPain = PainRandomizer(); InitializeExtraValues(); @@ -1268,11 +1242,11 @@ namespace RJW_Menstruation switch (curStage) { case Stage.Follicular: - return curStageTicks > currentIntervalTicks - Props.estrusDaysBeforeOvulation * GenDate.TicksPerDay; + return curStageHrs > currentIntervalHours - Props.estrusDaysBeforeOvulation * 24; case Stage.Ovulatory: return true; case Stage.Luteal: - return curStageTicks < EggLifespanTicks; + return curStageHrs < EggLifespanHours; default: return false; } @@ -1322,11 +1296,9 @@ namespace RJW_Menstruation if (eligibleCum.Count == 0) return null; float totalFertPower = eligibleCum.Sum(cum => cum.FertVolume); - - float fertFailChancePerHour = Mathf.Pow(1.0f - Configurations.FertilizeChance, totalFertPower * Props.basefertilizationChanceFactor); - float fertFailChancePerInterval = Mathf.Pow(fertFailChancePerHour, (float)TickInterval / GenDate.TicksPerHour); - if (Rand.Chance(fertFailChancePerInterval)) return null; + if (Rand.Chance(Mathf.Pow(1.0f - Configurations.FertilizeChance, totalFertPower * Props.basefertilizationChanceFactor))) + return null; Pawn.records.AddTo(VariousDefOf.AmountofFertilizedEggs, 1); float selection = Rand.Range(0.0f, totalFertPower); @@ -1351,8 +1323,8 @@ namespace RJW_Menstruation foreach (Egg egg in eggs) { if (!egg.fertilized || - egg.ticksSinceFertilization < minImplantAgeHours * GenDate.TicksPerHour || - egg.ageTicks < Math.Min(Props.lutealIntervalDays * GenDate.TicksPerDay / 2, maxImplantDelayHours * GenDate.TicksPerHour)) + egg.fertstage < minImplantAgeHours || + egg.position < Math.Min(Props.lutealIntervalDays * 24 / 2, maxImplantDelayHours)) continue; else if (egg.fertilizer == null) { @@ -1436,8 +1408,8 @@ namespace RJW_Menstruation if (pregnancy is Hediff_BasePregnancy rjw_preg) { // TODO: advance biotech pregnancy - rjw_preg.p_start_tick -= egg.ticksSinceFertilization / Configurations.CycleAcceleration; - rjw_preg.p_end_tick -= egg.ticksSinceFertilization / Configurations.CycleAcceleration; + rjw_preg.p_start_tick -= egg.fertstage / Configurations.CycleAcceleration * GenDate.TicksPerHour; + rjw_preg.p_end_tick -= egg.fertstage / Configurations.CycleAcceleration * GenDate.TicksPerHour; } } } @@ -1462,9 +1434,7 @@ namespace RJW_Menstruation protected void BleedOut() { - // ~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, Rand.Range(0.02f * Configurations.BleedingAmount, 0.04f * Configurations.BleedingAmount), Translations.Menstrual_Blood, -5.0f, Pawn.def.race?.BloodDef ?? ThingDefOf.Filth_Blood); Cum blood = GetNotCum(Translations.Menstrual_Blood); if (blood != null) blood.Color = BloodColor; } @@ -1531,12 +1501,12 @@ namespace RJW_Menstruation HashSet deadeggs = new HashSet(); foreach (Egg egg in eggs) { - egg.ageTicks += TickInterval * Configurations.CycleAcceleration; - if (egg.fertilized) egg.ticksSinceFertilization += TickInterval * Configurations.CycleAcceleration; + egg.position += Configurations.CycleAcceleration; + if (egg.fertilized) egg.fertstage += Configurations.CycleAcceleration; else { - egg.lifeSpanTicks -= TickInterval * Configurations.CycleAcceleration; - if (egg.lifeSpanTicks < 0) deadeggs.Add(egg); + egg.lifespanhrs -= Configurations.CycleAcceleration; + if (egg.lifespanhrs < 0) deadeggs.Add(egg); } } eggs.RemoveAll(egg => deadeggs.Contains(egg)); @@ -1547,7 +1517,7 @@ namespace RJW_Menstruation Hediff hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_MenstrualCramp, Pawn); hediff.Severity = crampPain * Rand.Range(0.9f, 1.1f); HediffCompProperties_SeverityPerDay Prop = (HediffCompProperties_SeverityPerDay)hediff.TryGetComp().props; - Prop.severityPerDay = -hediff.Severity / (currentIntervalTicks / GenDate.TicksPerDay) * Configurations.CycleAcceleration; + Prop.severityPerDay = -hediff.Severity / (currentIntervalHours / 24) * Configurations.CycleAcceleration; Pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(Pawn)); } @@ -1559,14 +1529,14 @@ namespace RJW_Menstruation GoNextStage(Stage.Anestrus); return; } - else if (curStageTicks >= currentIntervalTicks) + else if (curStageHrs >= currentIntervalHours) { GoOvulatoryStage(); } else { - curStageTicks += TickInterval * Configurations.CycleAcceleration; - if (!estrusflag && curStageTicks > currentIntervalTicks - Props.estrusDaysBeforeOvulation * GenDate.TicksPerDay) + curStageHrs += Configurations.CycleAcceleration; + if (!estrusflag && curStageHrs > currentIntervalHours - Props.estrusDaysBeforeOvulation * 24) { estrusflag = true; SetEstrus(); @@ -1577,11 +1547,6 @@ namespace RJW_Menstruation protected virtual void OvulatoryAction() { - if (curStageTicks < currentIntervalTicks) - { - curStageTicks += TickInterval * Configurations.CycleAcceleration; - return; - } estrusflag = false; float eggnum; try @@ -1605,7 +1570,7 @@ namespace RJW_Menstruation for (int i = 0; i < toOvulate; i++) if (i < eggstack || Rand.Chance(ovulationChance)) // eggstack comes from drugs and are guaranteed ovulated { - eggs.Add(new Egg((int)(EggLifespanTicks / CycleFactor))); + eggs.Add(new Egg((int)(EggLifespanHours / CycleFactor))); ++ovulated; } ovarypower -= ovulated; @@ -1618,7 +1583,7 @@ namespace RJW_Menstruation protected virtual void LutealAction() { - if (curStageTicks >= currentIntervalTicks) + if (curStageHrs >= currentIntervalHours) { eggs.Clear(); if (EggHealth < 1f / 4f || (EggHealth < 1f / 3f && Rand.Chance(0.3f))) //skips bleeding @@ -1640,13 +1605,13 @@ namespace RJW_Menstruation } else { - curStageTicks += TickInterval * Configurations.CycleAcceleration; + curStageHrs += Configurations.CycleAcceleration; StayCurrentStage(); } } else { - curStageTicks += TickInterval * Configurations.CycleAcceleration; + curStageHrs += Configurations.CycleAcceleration; StayCurrentStage(); } @@ -1654,23 +1619,23 @@ namespace RJW_Menstruation protected virtual void BleedingAction() { - if (curStageTicks >= currentIntervalTicks) + if (curStageHrs >= currentIntervalHours) { Hediff hediff = Pawn.health.hediffSet.GetFirstHediffOfDef(VariousDefOf.Hediff_MenstrualCramp); if (hediff != null && !Pawn.GetMenstruationComps().Any(comp => comp != this && comp.curStage == Stage.Bleeding)) Pawn.health.RemoveHediff(hediff); - int totalFollicularTicks = PeriodRandomizer(Stage.Follicular); // The total amount of time for both bleeding and follicular - if (totalFollicularTicks <= currentIntervalTicks) // We've bled for so long that we completely missed the follicular phase + int totalFollicularHours = PeriodRandomizer(Stage.Follicular); // The total amount of time for both bleeding and follicular + if (totalFollicularHours <= currentIntervalHours) // We've bled for so long that we completely missed the follicular phase GoOvulatoryStage(); else { - currentIntervalTicks = totalFollicularTicks - currentIntervalTicks; // I.e., the remaining follicular time equals the total minus the bleeding time elapsed + currentIntervalHours = totalFollicularHours - currentIntervalHours; // I.e., the remaining follicular hours equals the total minus the bleeding hours elapsed GoNextStage(Stage.Follicular, false); } } else { - if (curStageTicks < currentIntervalTicks / 4) BleedOut(); - curStageTicks += TickInterval * Configurations.CycleAcceleration; + if (curStageHrs < currentIntervalHours / 4) for (int i = 0; i < Configurations.CycleAcceleration; i++) BleedOut(); + curStageHrs += Configurations.CycleAcceleration; StayCurrentStage(); } } @@ -1686,7 +1651,7 @@ namespace RJW_Menstruation if (pregnancy != null && Pawn.health.hediffSet.hediffs.Contains(pregnancy)) { - curStageTicks += TickInterval; + curStageHrs += 1; StayCurrentStageConst(Stage.Pregnant); } else @@ -1698,7 +1663,7 @@ namespace RJW_Menstruation protected virtual void RecoverAction() { - if (curStageTicks >= currentIntervalTicks) + if (curStageHrs >= currentIntervalHours) { if (ShouldBeInfertile()) { @@ -1715,7 +1680,7 @@ namespace RJW_Menstruation } else { - curStageTicks += TickInterval * Configurations.CycleAcceleration; + curStageHrs += Configurations.CycleAcceleration; StayCurrentStage(); } } @@ -1811,8 +1776,8 @@ namespace RJW_Menstruation public void GoNextStage(Stage nextstage, bool calculateHours = true) { - curStageTicks = 0; - if (calculateHours) currentIntervalTicks = PeriodRandomizer(nextstage); + curStageHrs = 0; + if (calculateHours) currentIntervalHours = PeriodRandomizer(nextstage); curStage = nextstage; } @@ -1854,17 +1819,15 @@ namespace RJW_Menstruation switch (stage) { case Stage.Follicular: - return (int)(Props.follicularIntervalDays * GenDate.TicksPerDay * (1 + Rand.Range(-cycleVariability, cycleVariability) * 1.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 1.5f)); - case Stage.Ovulatory: - return Props.ovulationIntervalHours * GenDate.TicksPerHour; // No variability for now + return (int)(Props.follicularIntervalDays * 24 * (1 + Rand.Range(-cycleVariability, cycleVariability) * 1.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 1.5f)); case Stage.Luteal: - return (int)(Props.lutealIntervalDays * GenDate.TicksPerDay * (1 + Rand.Range(-cycleVariability, cycleVariability) * 0.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 0.5f)); + return (int)(Props.lutealIntervalDays * 24 * (1 + Rand.Range(-cycleVariability, cycleVariability) * 0.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 0.5f)); case Stage.Bleeding: - return (int)(Props.bleedingIntervalDays * GenDate.TicksPerDay * (1 + Rand.Range(-cycleVariability, cycleVariability) * 0.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 0.5f)); + return (int)(Props.bleedingIntervalDays * 24 * (1 + Rand.Range(-cycleVariability, cycleVariability) * 0.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 0.5f)); case Stage.Recover: - return (int)(Props.recoveryIntervalDays * GenDate.TicksPerDay * Rand.Range(0.95f, 1.05f)); + return (int)(Props.recoveryIntervalDays * 24 * Rand.Range(0.95f, 1.05f)); case Stage.Pregnant: - return (int)(MenstruationUtility.GestationHours(pregnancy) * GenDate.TicksPerHour); + return (int)MenstruationUtility.GestationHours(pregnancy); default: return 1; } @@ -1900,13 +1863,13 @@ namespace RJW_Menstruation switch (stage) { case Stage.Follicular: - curStageTicks = Rand.Range(0, (Props.follicularIntervalDays - Props.bleedingIntervalDays) * GenDate.TicksPerDay); + curStageHrs = Rand.Range(0, (Props.follicularIntervalDays - Props.bleedingIntervalDays) * 24); break; case Stage.Luteal: - curStageTicks = Rand.Range(0, Props.lutealIntervalDays * GenDate.TicksPerDay); + curStageHrs = Rand.Range(0, Props.lutealIntervalDays * 24); break; case Stage.Bleeding: - curStageTicks = Rand.Range(0, Props.bleedingIntervalDays * GenDate.TicksPerDay); + curStageHrs = Rand.Range(0, Props.bleedingIntervalDays * 24); break; } return stage; @@ -1952,46 +1915,34 @@ namespace RJW_Menstruation public class Egg : IExposable { public bool fertilized; - public int lifeSpanTicks; + public int lifespanhrs; public Pawn fertilizer; - public int ageTicks; - public int ticksSinceFertilization = 0; + public int position; + public int fertstage = 0; public Egg() { fertilized = false; - lifeSpanTicks = (int)(96 * GenDate.TicksPerHour * Configurations.EggLifespanMultiplier); + lifespanhrs = (int)(96 * Configurations.EggLifespanMultiplier); fertilizer = null; - ageTicks = 0; + position = 0; } public Egg(int lifespanhrs) { fertilized = false; - lifeSpanTicks = (int)(lifespanhrs * GenDate.TicksPerHour * Configurations.EggLifespanMultiplier); + this.lifespanhrs = (int)(lifespanhrs * Configurations.EggLifespanMultiplier); fertilizer = null; - ageTicks = 0; + position = 0; } public void ExposeData() { - if (Scribe.mode == LoadSaveMode.LoadingVars) - { - 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", fertilized, true); - Scribe_Values.Look(ref lifeSpanTicks, "lifeSpanTicks", lifeSpanTicks, true); - Scribe_Values.Look(ref ageTicks, "ageTicks", ageTicks, true); - Scribe_Values.Look(ref ticksSinceFertilization, "ticksSinceFertilization", ticksSinceFertilization, true); + Scribe_Values.Look(ref lifespanhrs, "lifespanhrs", lifespanhrs, true); + Scribe_Values.Look(ref position, "position", position, true); + Scribe_Values.Look(ref fertstage, "fertstage", fertstage, true); } } diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_PeriodicOvulator.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_PeriodicOvulator.cs index eb1ac1a..6611547 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_PeriodicOvulator.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_PeriodicOvulator.cs @@ -16,8 +16,8 @@ namespace RJW_Menstruation public class HediffComp_PeriodicOvulator : HediffComp_Menstruation { - public int ticksToNextCycle = -100000; - public int averageCycleIntervalTicks = -1; + public int hoursToNextCycle = -100000; + public int averageCycleIntervalHours = -1; public new CompProperties_PeriodicOvulator Props; @@ -25,14 +25,14 @@ namespace RJW_Menstruation { base.InitializeExtraValues(); Props = (CompProperties_PeriodicOvulator)props; - if (averageCycleIntervalTicks < 0) + if (averageCycleIntervalHours < 0) { - averageCycleIntervalTicks = (int)(Props.cycleIntervalDays.RandomInRange * GenDate.TicksPerDay / cycleSpeed); - if (ticksToNextCycle < -50000) - ticksToNextCycle = Rand.Range(0, averageCycleIntervalTicks); + averageCycleIntervalHours = (int)(24f * Props.cycleIntervalDays.RandomInRange / cycleSpeed); + if (hoursToNextCycle < -50000) + hoursToNextCycle = Rand.Range(0, averageCycleIntervalHours); // Make the cutoff halfway into cycle, just to be sure there isn't a double-cycle the first time if ((curStage == Stage.Follicular || curStage == Stage.Luteal || curStage == Stage.Bleeding) - && (averageCycleIntervalTicks - ticksToNextCycle) / 2 >= GenDate.TicksPerDay * (Props.follicularIntervalDays + Props.lutealIntervalDays) / cycleSpeed) + && (averageCycleIntervalHours - hoursToNextCycle) / 2 >= 24 * (Props.follicularIntervalDays + Props.lutealIntervalDays) / cycleSpeed) GoNextStage(Stage.Anestrus); } } @@ -41,40 +41,31 @@ namespace RJW_Menstruation { // Don't bother trying to work seasonal breeding into the math // Due to the enormous variation in possible cycle gaps, cheat and base it off the individual - return averageCycleIntervalTicks * cycleSpeed / GenDate.TicksPerYear; // cancel out their cycleSpeed from initialization to get their "normal" speed + return averageCycleIntervalHours * cycleSpeed / (24 * 360); // cancel out their cycleSpeed from initialization to get their "normal" speed } protected override void BeforeSimulator() { base.BeforeSimulator(); - if (ticksToNextCycle > 0) ticksToNextCycle -= TickInterval * Configurations.CycleAcceleration; + if (hoursToNextCycle > 0) hoursToNextCycle -= Configurations.CycleAcceleration; } public override void CompExposeData() { base.CompExposeData(); - if (Scribe.mode == LoadSaveMode.LoadingVars) - { - int hoursToNextCycle = -1; - int averageCycleIntervalHours = -1; - Scribe_Values.Look(ref hoursToNextCycle, "hoursToNextCycle", hoursToNextCycle, true); - Scribe_Values.Look(ref averageCycleIntervalHours, "averageCycleIntervalHours", averageCycleIntervalHours, true); - if (hoursToNextCycle >= 0) ticksToNextCycle = hoursToNextCycle * GenDate.TicksPerHour; - if (averageCycleIntervalHours >= 0) averageCycleIntervalTicks = averageCycleIntervalHours * GenDate.TicksPerHour; - } - Scribe_Values.Look(ref ticksToNextCycle, "ticksToNextCycle", ticksToNextCycle, true); - Scribe_Values.Look(ref averageCycleIntervalTicks, "averageCycleIntervalTicks", averageCycleIntervalTicks, true); + Scribe_Values.Look(ref hoursToNextCycle, "hoursToNextCycle", hoursToNextCycle, true); + Scribe_Values.Look(ref averageCycleIntervalHours, "averageCycleIntervalHours", averageCycleIntervalHours, true); } - protected override int TicksToNextStage() + protected override int HoursToNextStage() { - if (curStage == Stage.Anestrus && ticksToNextCycle > 0) return ticksToNextCycle / Configurations.CycleAcceleration; - else return base.TicksToNextStage(); + if (curStage == Stage.Anestrus && hoursToNextCycle > 0) return hoursToNextCycle / Configurations.CycleAcceleration; + else return base.HoursToNextStage(); } protected override void BleedingAction() { - if (curStageTicks >= currentIntervalTicks) + if (curStageHrs >= currentIntervalHours) { Hediff hediff = Pawn.health.hediffSet.GetFirstHediffOfDef(VariousDefOf.Hediff_MenstrualCramp); if (hediff != null && !Pawn.GetMenstruationComps().Any(comp => comp != this && comp.curStage == Stage.Bleeding)) Pawn.health.RemoveHediff(hediff); @@ -90,14 +81,14 @@ namespace RJW_Menstruation base.PregnantAction(); if (curStage != Stage.Pregnant) // Go halfway into the cycle - ticksToNextCycle = (int)(averageCycleIntervalTicks * (1 + Rand.Range(-cycleVariability, cycleVariability))) / 2; + hoursToNextCycle = (int)(averageCycleIntervalHours * (1 + Rand.Range(-cycleVariability, cycleVariability))) / 2; } protected override void AnestrusAction() { - if (ticksToNextCycle <= 0) + if (hoursToNextCycle <= 0) { - ticksToNextCycle = (int)(averageCycleIntervalTicks * (1 + Rand.Range(-cycleVariability, cycleVariability))); + hoursToNextCycle = (int)(averageCycleIntervalHours * (1 + Rand.Range(-cycleVariability, cycleVariability))); if (IsBreedingSeason()) GoNextStage(Stage.Follicular); return; } @@ -108,7 +99,7 @@ namespace RJW_Menstruation { base.CopyCycleProperties(original); if (original is HediffComp_PeriodicOvulator comp) - averageCycleIntervalTicks = comp.averageCycleIntervalTicks; + averageCycleIntervalHours = comp.averageCycleIntervalHours; } } } 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..833d5e9 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs @@ -219,7 +219,6 @@ namespace RJW_Menstruation } public static Texture2D GetEggIcon(this HediffComp_Menstruation comp, bool includeOvary) { - float ovulationChance = comp.OvulationChance; const float ovaryChanceToShow_01 = 0.4f; const float ovaryChanceToShow_02 = 1.0f; switch (comp.CurrentVisibleStage) @@ -232,28 +231,28 @@ namespace RJW_Menstruation job.Sexprops != null && !job.Sexprops.usedCondom && (job.Sexprops.sexType == xxx.rjwSextype.Vaginal || job.Sexprops.sexType == xxx.rjwSextype.DoublePenetration)) - return ContentFinder.Get((ovulationChance >= ovaryChanceToShow_01) ? "Ovaries/Ovary_01" : "Ovaries/Ovary_00", true); + return ContentFinder.Get((comp.OvulationChance >= ovaryChanceToShow_01) ? "Ovaries/Ovary_01" : "Ovaries/Ovary_00", true); else break; } - if (comp.curStageTicks > comp.CurStageIntervalTicks - 30 * GenDate.TicksPerHour) // Approximate time for ovulation to occur - return ContentFinder.Get((ovulationChance >= ovaryChanceToShow_01) ? "Ovaries/Ovary_01" : "Ovaries/Ovary_00", true); + if (comp.curStageHrs > comp.CurStageIntervalHours - 30) // Approximate time for ovulation to occur + return ContentFinder.Get((comp.OvulationChance >= ovaryChanceToShow_01) ? "Ovaries/Ovary_01" : "Ovaries/Ovary_00", true); else break; case HediffComp_Menstruation.Stage.Ovulatory: if (!includeOvary) break; - if (ovulationChance >= ovaryChanceToShow_02) + if (comp.OvulationChance >= ovaryChanceToShow_02) return ContentFinder.Get("Ovaries/Ovary_02", true); - else if (ovulationChance >= ovaryChanceToShow_01) + else if (comp.OvulationChance >= ovaryChanceToShow_01) return ContentFinder.Get("Ovaries/Ovary_01", true); else return ContentFinder.Get("Ovaries/Ovary_00", true); case HediffComp_Menstruation.Stage.Luteal: if (!comp.IsEggExist) break; - int fertTime = comp.EggFertilizedTime; - if (fertTime >= 0) + int fertstage = comp.IsFertilized; + if (fertstage >= 0) { - if (fertTime <= GenDate.TicksPerHour * Configurations.CycleAcceleration) return ContentFinder.Get("Eggs/Egg_Fertilizing02", true); - else if (fertTime <= 18 * GenDate.TicksPerHour) return ContentFinder.Get("Eggs/Egg_Fertilized00", true); - else if (fertTime <= 54 * GenDate.TicksPerHour) return ContentFinder.Get("Eggs/Egg_Fertilized01", true); + if (fertstage <= Configurations.CycleAcceleration) return ContentFinder.Get("Eggs/Egg_Fertilizing02", true); + else if (fertstage <= 18) return ContentFinder.Get("Eggs/Egg_Fertilized00", true); + else if (fertstage <= 54) return ContentFinder.Get("Eggs/Egg_Fertilized01", true); else return ContentFinder.Get("Eggs/Egg_Fertilized02", true); } else if (comp.IsEggFertilizing) diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs index 4571fae..7185ccf 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using RimWorld; using rjw; using System.Collections.Generic; using System.Linq; @@ -48,7 +47,7 @@ namespace RJW_Menstruation if (Configurations.Debug) { description - .AppendFormat("{0}: {1}\n", comp.curStage, comp.curStageTicks / GenDate.TicksPerHour); + .AppendFormat("{0}: {1}\n", comp.curStage, comp.curStageHrs); if (comp.Pregnancy is Hediff_BasePregnancy rjwpreg) description .AppendFormat("due: {0}\n", rjwpreg.DueDate()); else if (comp.Pregnancy is Hediff_Pregnant biopreg) description diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Things.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Things.cs index e240bd0..e427e0f 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Things.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Things.cs @@ -197,8 +197,7 @@ namespace RJW_Menstruation public float absorbedfluids = 0; public bool dirty = false; - public int wearTicks = 0; - protected virtual float PassiveAbsorptionPerHour => 0.1f; + public int wearhours = 0; public virtual bool LeakAfterDirty => def.GetModExtension().leakAfterDirty; public virtual bool EffectAfterDirty => def.GetModExtension().effectsAfterDirty; public virtual ThingDef DirtyDef => def.GetModExtension().dirtyDef; @@ -206,12 +205,12 @@ namespace RJW_Menstruation public Color fluidColor = Color.white; - public virtual void DirtyEffect(int tickInterval) { } + public virtual void DirtyEffect() { } - public virtual void WearEffect(int tickInterval) + public virtual void WearEffect() { - absorbedfluids += PassiveAbsorptionPerHour * tickInterval / GenDate.TicksPerHour; - if (dirty) wearTicks += tickInterval; + absorbedfluids += 0.1f; + if (dirty) wearhours++; } public override Color DrawColorTwo => fluidColor; @@ -219,15 +218,9 @@ namespace RJW_Menstruation public override void ExposeData() { base.ExposeData(); - if(Scribe.mode == LoadSaveMode.LoadingVars) - { - int wearhours = -1; - Scribe_Values.Look(ref wearhours, "wearhours", wearhours, true); - if (wearhours >= 0) wearTicks = wearhours * GenDate.TicksPerHour; - } Scribe_Values.Look(ref absorbedfluids, "absorbedfluids", absorbedfluids, true); Scribe_Values.Look(ref dirty, "dirty", dirty, true); - Scribe_Values.Look(ref wearTicks, "wearTicks", wearTicks, true); + Scribe_Values.Look(ref wearhours, "wearhours", wearhours, true); Scribe_Values.Look(ref fluidColor, "fluidColor", fluidColor, true); } @@ -235,11 +228,16 @@ namespace RJW_Menstruation public class Absorber_Tampon : Absorber { - protected override float PassiveAbsorptionPerHour => 0.5f; - public override void DirtyEffect(int tickInterval) - { - if (wearTicks > MinHrstoDirtyEffect * GenDate.TicksPerHour && Rand.MTBEventOccurs(100.0f, GenDate.TicksPerHour, tickInterval) && !Wearer.apparel.IsLocked(this)) + public override void WearEffect() + { + if (dirty) wearhours++; + absorbedfluids += 0.5f; + } + + public override void DirtyEffect() + { + if (wearhours > MinHrstoDirtyEffect && Rand.Chance(0.01f) && !Wearer.apparel.IsLocked(this)) { Wearer.health.AddHediff(HediffDefOf.WoundInfection, Genital_Helper.get_genitalsBPR(Wearer)); } diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Translations.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Translations.cs index dd2982f..1a67ebf 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Translations.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Translations.cs @@ -60,12 +60,6 @@ namespace RJW_Menstruation 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 Option_ColonistUpdateInterval_Label = "Option_ColonistUpdateInterval_Label".Translate(); - public static readonly string Option_ColonistUpdateInterval_Desc = "Option_ColonistUpdateInterval_Desc".Translate(); - public static readonly string Option_NonColonistUpdateInterval_Label = "Option_NonColonistUpdateInterval_Label".Translate(); - public static readonly string Option_NonColonistUpdateInterval_Desc = "Option_NonColonistUpdateInterval_Desc".Translate(); - public static readonly string Option_AnimalUpdateInterval_Label = "Option_AnimalUpdateInterval_Label".Translate(); - public static readonly string Option_AnimalUpdateInterval_Desc = "Option_AnimalUpdateInterval_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(); diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs index 815d8ab..13aae6e 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs @@ -433,7 +433,7 @@ namespace RJW_Menstruation } - public static float LerpMultiple(this float a, float b, float t, float num) + public static float LerpMultiple(this float a, float b, float t, int num) { float tmult = Mathf.Pow(1 - t, num); return tmult * a + (1 - tmult) * b; diff --git a/changelogs.txt b/changelogs.txt index 85e123c..5dc6a70 100644 --- a/changelogs.txt +++ b/changelogs.txt @@ -1,7 +1,6 @@ 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. - Menstruation-related genes will now stay on females during initial pawn setup. Version 1.0.8.9