mirror of
				https://gitgud.io/lutepickle/rjw_menstruation.git
				synced 2024-08-14 22:46:52 +00:00 
			
		
		
		
	Add HediffComp_PeriodicOvulator
This commit is contained in:
		
							parent
							
								
									b3ffe9afed
								
							
						
					
					
						commit
						f235c32af1
					
				
					 5 changed files with 138 additions and 3 deletions
				
			
		
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -30,6 +30,28 @@
 | 
				
			||||||
			</comps>
 | 
								</comps>
 | 
				
			||||||
		</value>
 | 
							</value>
 | 
				
			||||||
	</Operation>
 | 
						</Operation>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<!--<Operation Class="PatchOperationAdd">
 | 
				
			||||||
 | 
							<xpath>/Defs/rjw.HediffDef_PartBase[defName="DogVagina"]</xpath>
 | 
				
			||||||
 | 
							<value>
 | 
				
			||||||
 | 
								<comps>
 | 
				
			||||||
 | 
									<li Class="RJW_Menstruation.CompProperties_PeriodicOvulator">
 | 
				
			||||||
 | 
										<maxCumCapacity>8</maxCumCapacity>
 | 
				
			||||||
 | 
										<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
 | 
				
			||||||
 | 
										<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
 | 
				
			||||||
 | 
										<follicularIntervalDays>14</follicularIntervalDays>
 | 
				
			||||||
 | 
										<lutealIntervalDays>36</lutealIntervalDays>
 | 
				
			||||||
 | 
										<bleedingIntervalDays>8</bleedingIntervalDays>
 | 
				
			||||||
 | 
										<recoveryIntervalDays>15</recoveryIntervalDays>
 | 
				
			||||||
 | 
										<eggLifespanDays>4</eggLifespanDays>
 | 
				
			||||||
 | 
										<wombTex>Womb/Womb</wombTex>
 | 
				
			||||||
 | 
										<vagTex>Genitals/Vagina</vagTex>
 | 
				
			||||||
 | 
										<estrusDaysBeforeOvulation>9</estrusDaysBeforeOvulation>
 | 
				
			||||||
 | 
										<cycleIntervalDays>180~360</cycleIntervalDays>
 | 
				
			||||||
 | 
									</li>
 | 
				
			||||||
 | 
								</comps>
 | 
				
			||||||
 | 
							</value>
 | 
				
			||||||
 | 
						</Operation>-->
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	<Operation Class="PatchOperationAdd">
 | 
						<Operation Class="PatchOperationAdd">
 | 
				
			||||||
		<xpath>/Defs/rjw.HediffDef_PartBase[defName="CatVagina"]</xpath>
 | 
							<xpath>/Defs/rjw.HediffDef_PartBase[defName="CatVagina"]</xpath>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -639,7 +639,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
                    curStage = Stage.Pregnant;
 | 
					                    curStage = Stage.Pregnant;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                CumOut();
 | 
					                BeforeSimulator();
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
                if (pregnancy == null && (Pawn.health.capacities.GetLevel(xxx.reproduction) <= 0 || EggHealth <= 0 || Pawn.SterileGenes())) curStage = Stage.Infertile;
 | 
					                if (pregnancy == null && (Pawn.health.capacities.GetLevel(xxx.reproduction) <= 0 || EggHealth <= 0 || Pawn.SterileGenes())) curStage = Stage.Infertile;
 | 
				
			||||||
                switch (curStage)
 | 
					                switch (curStage)
 | 
				
			||||||
| 
						 | 
					@ -1053,6 +1053,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
                else if (currentIntervalHours < curStageHrs) curStageHrs = currentIntervalHours;
 | 
					                else if (currentIntervalHours < curStageHrs) curStageHrs = currentIntervalHours;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (crampPain < 0) crampPain = PainRandomizer();
 | 
					            if (crampPain < 0) crampPain = PainRandomizer();
 | 
				
			||||||
 | 
					            InitializeExtraValues();
 | 
				
			||||||
            if (cums == null) cums = new List<Cum>();
 | 
					            if (cums == null) cums = new List<Cum>();
 | 
				
			||||||
            if (eggs == null) eggs = new List<Egg>();
 | 
					            if (eggs == null) eggs = new List<Egg>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1065,6 +1066,10 @@ namespace RJW_Menstruation
 | 
				
			||||||
            initError = false;
 | 
					            initError = false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected virtual void InitializeExtraValues()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        protected virtual float RaceCyclesPerYear()
 | 
					        protected virtual float RaceCyclesPerYear()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            int breedingSeasons = 0;
 | 
					            int breedingSeasons = 0;
 | 
				
			||||||
| 
						 | 
					@ -1130,8 +1135,12 @@ namespace RJW_Menstruation
 | 
				
			||||||
            ovarypower = Math.Max(0, (int)(ovarypower * multiply));
 | 
					            ovarypower = Math.Max(0, (int)(ovarypower * multiply));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected virtual void BeforeSimulator()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            CumOut();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        protected void AfterSimulator()
 | 
					        protected virtual void AfterSimulator()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (EggHealth < 1f)
 | 
					            if (EggHealth < 1f)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					@ -1796,7 +1805,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
                GoNextStage(Stage.Pregnant);
 | 
					                GoNextStage(Stage.Pregnant);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public void CopyCycleProperties(HediffComp_Menstruation original)
 | 
					        public virtual void CopyCycleProperties(HediffComp_Menstruation original)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            cycleSpeed = original.cycleSpeed;
 | 
					            cycleSpeed = original.cycleSpeed;
 | 
				
			||||||
            cycleVariability = original.cycleVariability;
 | 
					            cycleVariability = original.cycleVariability;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,103 @@
 | 
				
			||||||
 | 
					using RimWorld;
 | 
				
			||||||
 | 
					using Verse;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace RJW_Menstruation
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class CompProperties_PeriodicOvulator : CompProperties_Menstruation
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public FloatRange cycleIntervalDays; // From the start of one cycle to the start of the next
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public CompProperties_PeriodicOvulator()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            compClass = typeof(HediffComp_PeriodicOvulator);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public class HediffComp_PeriodicOvulator : HediffComp_Menstruation
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public int hoursToNextCycle = -100000;
 | 
				
			||||||
 | 
					        public int averageCycleIntervalHours = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public new CompProperties_PeriodicOvulator Props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void InitializeExtraValues()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            base.InitializeExtraValues();
 | 
				
			||||||
 | 
					            Props = (CompProperties_PeriodicOvulator)props;
 | 
				
			||||||
 | 
					            if (averageCycleIntervalHours < 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                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)
 | 
				
			||||||
 | 
					                    && (averageCycleIntervalHours - hoursToNextCycle) / 2 >= 24 * (Props.follicularIntervalDays + Props.lutealIntervalDays) / cycleSpeed)
 | 
				
			||||||
 | 
					                    curStage = Stage.Anestrus;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override float RaceCyclesPerYear()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // 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 averageCycleIntervalHours * cycleSpeed / (24 * 360); // cancel out their cycleSpeed from initialization to get their "normal" speed
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void BeforeSimulator()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            base.BeforeSimulator();
 | 
				
			||||||
 | 
					            if (hoursToNextCycle > 0) hoursToNextCycle -= Configurations.CycleAcceleration;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override void CompExposeData()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            base.CompExposeData();
 | 
				
			||||||
 | 
					            Scribe_Values.Look(ref hoursToNextCycle, "hoursToNextCycle", hoursToNextCycle, true);
 | 
				
			||||||
 | 
					            Scribe_Values.Look(ref averageCycleIntervalHours, "averageCycleIntervalHours", averageCycleIntervalHours, true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void BleedingAction()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (curStageHrs >= currentIntervalHours)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Hediff hediff = Pawn.health.hediffSet.GetFirstHediffOfDef(VariousDefOf.Hediff_MenstrualCramp);
 | 
				
			||||||
 | 
					                if (hediff != null) Pawn.health.RemoveHediff(hediff);
 | 
				
			||||||
 | 
					                estrusflag = false;
 | 
				
			||||||
 | 
					                GoNextStage(Stage.Anestrus);
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (curStageHrs < currentIntervalHours / 4) for (int i = 0; i < Configurations.CycleAcceleration; i++) BleedOut();
 | 
				
			||||||
 | 
					                curStageHrs += Configurations.CycleAcceleration;
 | 
				
			||||||
 | 
					                StayCurrentStage();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void PregnantAction()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            base.PregnantAction();
 | 
				
			||||||
 | 
					            if (curStage != Stage.Pregnant)
 | 
				
			||||||
 | 
					                // Go halfway into the cycle
 | 
				
			||||||
 | 
					                hoursToNextCycle = (int)(averageCycleIntervalHours * Rand.Range(-cycleVariability, cycleVariability)) / 2;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void AnestrusAction()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (hoursToNextCycle <= 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                hoursToNextCycle = (int)(averageCycleIntervalHours * Rand.Range(-cycleVariability, cycleVariability));
 | 
				
			||||||
 | 
					                if (IsBreedingSeason()) GoNextStage(Stage.Follicular);
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            StayCurrentStage();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override void CopyCycleProperties(HediffComp_Menstruation original)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            base.CopyCycleProperties(original);
 | 
				
			||||||
 | 
					            if (original is HediffComp_PeriodicOvulator comp)
 | 
				
			||||||
 | 
					                averageCycleIntervalHours = comp.averageCycleIntervalHours;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -68,6 +68,7 @@
 | 
				
			||||||
    <Compile Include="DrugOutcomeDoers.cs" />
 | 
					    <Compile Include="DrugOutcomeDoers.cs" />
 | 
				
			||||||
    <Compile Include="EstrusPartKindUsageRule.cs" />
 | 
					    <Compile Include="EstrusPartKindUsageRule.cs" />
 | 
				
			||||||
    <Compile Include="HediffComps\HediffComp_InducedOvulator.cs" />
 | 
					    <Compile Include="HediffComps\HediffComp_InducedOvulator.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="HediffComps\HediffComp_PeriodicOvulator.cs" />
 | 
				
			||||||
    <Compile Include="HediffComps\MenstruationUtility.cs" />
 | 
					    <Compile Include="HediffComps\MenstruationUtility.cs" />
 | 
				
			||||||
    <Compile Include="Hediff_Estrus.cs" />
 | 
					    <Compile Include="Hediff_Estrus.cs" />
 | 
				
			||||||
    <Compile Include="IngestionOutcomeDoers.cs" />
 | 
					    <Compile Include="IngestionOutcomeDoers.cs" />
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue