Compare commits

...

37 Commits

Author SHA1 Message Date
Naz 65e0713ac4 Merge branch 'main' into 'main'
Korean Translation

See merge request lutepickle/rjw_menstruation!3
2024-03-20 13:25:18 +00:00
lutepickle daeefe8218 Merge branch 'dev' 2024-03-17 16:33:09 -07:00
lutepickle e3647caf2a Build dll, change Rimworld reference in 1.4 to NuGet 2024-03-17 16:32:41 -07:00
lutepickle 9a6efaf37d Have pheromones apply in caravans 2024-03-13 10:07:25 -07:00
lutepickle cca7676bc0 Have ovulation and implant chance cache be nullable 2024-03-13 08:10:50 -07:00
lutepickle ba8801370f Have TotalFertCum account for destroyed pawns and animals 2024-03-13 08:03:02 -07:00
lutepickle c393ab45c0 Build 2024-03-11 16:48:26 -07:00
lutepickle f580d3232b Have breeder pawns boost implant chance for non-Biotech 2024-03-05 19:14:28 -08:00
lutepickle e964b2af93 Failsafe in the dialog window if a biotech pregnancy somehow gets a null mother (theoretically possible on implant error) 2024-03-05 16:01:33 -08:00
lutepickle 6e56664d41 Switch TickIntervalMinimum to being based on the named constant 2024-03-05 15:46:36 -08:00
lutepickle 4e88184f9b Add graphics to genes by Alpenglow 2024-03-05 09:06:02 -08:00
lutepickle 06ccb04a55 Clean up a bunch of unnecessary using statements 2024-03-04 18:25:44 -08:00
lutepickle 8bea56b65a Fix miscapitalization in CycleDisabledGenes.xml 2024-03-02 10:21:21 -08:00
lutepickle c6e4d81a20 Don't fertilize from destroyed pawns 2024-02-28 19:48:52 -08:00
lutepickle 1cdb12fd3a Replace some uses of Rand.Range with Utility.VariationRange 2024-02-27 21:56:59 -08:00
lutepickle 7e407a1cf9 Don't call Notify_UpdatedGenes if the gene isn't menstruation-related 2024-02-27 14:58:20 -08:00
lutepickle 32800a3499 Null check for apparel tracker in DirtyEffect 2024-02-22 22:09:12 -08:00
lutepickle ff95b8da39 It's safe and a bit quicker to unconditionally remove forced in CheckDirty 2024-02-17 15:37:14 -08:00
lutepickle 8306439576 Refactor allraces and allkinds 2024-02-16 22:03:03 -08:00
lutepickle ebb486179b Reformat RandomOvulationChance 2024-02-16 20:47:59 -08:00
lutepickle f79050483d Remove the originsize system. Nobody used it 2024-02-16 20:24:10 -08:00
lutepickle d483e22ac2 Little cleanup 2024-02-16 16:55:53 -08:00
lutepickle 7e5b2000da Mark the Conit fork of Birds & Bees as incompatible 2024-02-16 13:52:46 -08:00
lutepickle 836d3d69c8 Let CalculatedImpactChance return early to avoid unnecessarily hitting OvulationChance 2024-02-12 22:19:10 -08:00
lutepickle 50310988ca Be sure the periodic can go into anestrus if it initializes into ovulatory 2024-02-11 10:47:01 -08:00
lutepickle 82dea0f425 Always attempt to ovulate at least one egg 2024-02-11 07:30:25 -08:00
lutepickle bd39194fd1 Add Outland - Genetics' egglaying genes to the no cycle list 2024-02-11 06:43:56 -08:00
lutepickle 56b11069da Little refactor in GetBabyInfo and GetFatherInfo 2024-02-10 10:11:24 -08:00
lutepickle 02b0045fb3 Some input sanitization for the egg life span and ovulation genes 2024-02-08 21:33:39 -08:00
lutepickle fcbc19825e Move gene properties and cycle disabled genes to ModExtensions 2024-02-08 20:30:49 -08:00
lutepickle 7b00579969 Exclude Erin's Covyia egg genes from cycling 2024-02-08 16:00:13 -08:00
lutepickle cb8267bf0f Let a pawn be randomly initialized into their ovulatory stage 2024-02-04 19:49:20 -08:00
lutepickle 2dda753ab9 Be sure CheckDirty updates the stats if the old absorber had stats and the new doesn't 2024-02-04 17:07:10 -08:00
exoxemsn.com 8000949752 Update 1.4/Languages/Korean/Keyed/RJW_Menstruation.xml 2022-12-27 08:06:00 +00:00
exoxemsn.com 765b85dc2c Update 1.4/Languages/Korean/DefInjected/ThingDef/Pills_Menstruation.xml 2022-12-26 14:30:59 +00:00
exoxemsn.com 6cf5cba76b Update 1.4/Languages/Korean/DefInjected/HediffDef/Hediffs_Cum.xml, 1.4/Languages/Korean/DefInjected/HediffDef/Hediffs_Menstruation.xml, 1.4/Languages/Korean/DefInjected/JobDef/Jobs_CleanSelf.xml, 1.4/Languages/Korean/DefInjected/JobDef/Jobs_MilkSelf.xml, 1.4/Languages/Korean/DefInjected/KeyBinding/KeyBindings_Menstruation.xml, 1.4/Languages/Korean/DefInjected/RecipeDef/Recipes_Surgery_Breast.xml, 1.4/Languages/Korean/DefInjected/RecordDef/Records_Womb.xml, 1.4/Languages/Korean/DefInjected/StatDef/Stats_Absorber.xml, 1.4/Languages/Korean/DefInjected/TaleDef/Tales_Cum.xml, 1.4/Languages/Korean/DefInjected/ThingDef/Apparel_Absorbers.xml, 1.4/Languages/Korean/DefInjected/ThingDef/ApparelLayerDefs_Absorber.xml, 1.4/Languages/Korean/DefInjected/ThingDef/Filth_Mixture.xml, 1.4/Languages/Korean/DefInjected/ThingDef/Pills_Menstruation.xml, 1.4/Languages/Korean/DefInjected/ThoughtDef/Thoughts_sex.xml, 1.4/Languages/Korean/Keyed/RJW_Menstruation.xml 2022-12-22 13:46:10 +00:00
exoxemsn.com 8768c1b7e7 Deleted 1.4/Languages/Korean/DefInjected/ApparelLayerDef/RJWMenstruation.xml, 1.4/Languages/Korean/DefInjected/HediffDef/RJWMenstruation.xml, 1.4/Languages/Korean/DefInjected/JobDef/RJWMenstruation.xml, 1.4/Languages/Korean/DefInjected/RecipeDef/BreastSurgeries.xml, 1.4/Languages/Korean/DefInjected/RecordDef/RJWMenstruation.xml, 1.4/Languages/Korean/DefInjected/StatDef/RJWMenstruation.xml, 1.4/Languages/Korean/DefInjected/ThingDef/RJWMenstruation.xml, 1.4/Languages/Korean/DefInjected/ThoughtDef/RJWMenstruation.xml, 1.4/Languages/Korean/Keyed/RJW_Menstruation.xml 2022-12-22 13:38:18 +00:00
58 changed files with 493 additions and 324 deletions

Binary file not shown.

View File

@ -9,7 +9,8 @@
<GeneDef Name="Menstruation_EggLifetime" Abstract="True"> <GeneDef Name="Menstruation_EggLifetime" Abstract="True">
<displayCategory>Menstruation</displayCategory> <displayCategory>Menstruation</displayCategory>
<exclusionTags> <iconPath>UI/Genes/Placeholder</iconPath>
<exclusionTags>
<li>Menstruation_EggLifetime</li> <li>Menstruation_EggLifetime</li>
</exclusionTags> </exclusionTags>
</GeneDef> </GeneDef>
@ -18,33 +19,49 @@
<defName>Menstruation_ShortEggLifetime</defName> <defName>Menstruation_ShortEggLifetime</defName>
<label>short egg lifetime</label> <label>short egg lifetime</label>
<description>Unfertilized eggs with this gene last three-quarters as long.</description> <description>Unfertilized eggs with this gene last three-quarters as long.</description>
<iconPath>UI/Genes/Placeholder</iconPath> <iconPath>UI/Genes/ShortEggLifetime</iconPath>
<biostatMet>1</biostatMet> <biostatMet>1</biostatMet>
<displayOrderInCategory>10</displayOrderInCategory> <displayOrderInCategory>10</displayOrderInCategory>
<modExtensions>
<li Class ="RJW_Menstruation.MenstruationModExtension">
<eggLifeTimeFactor>0.75</eggLifeTimeFactor>
</li>
</modExtensions>
</GeneDef> </GeneDef>
<GeneDef ParentName="Menstruation_EggLifetime"> <GeneDef ParentName="Menstruation_EggLifetime">
<defName>Menstruation_DoubleEggLifetime</defName> <defName>Menstruation_DoubleEggLifetime</defName>
<label>double egg lifetime</label> <label>double egg lifetime</label>
<description>Unfertilized eggs with this gene last twice as long.</description> <description>Unfertilized eggs with this gene last twice as long.</description>
<iconPath>UI/Genes/Placeholder</iconPath> <iconPath>UI/Genes/DoubleEggLifetime</iconPath>
<biostatMet>-1</biostatMet> <biostatMet>-1</biostatMet>
<displayOrderInCategory>12</displayOrderInCategory> <displayOrderInCategory>12</displayOrderInCategory>
<modExtensions>
<li Class ="RJW_Menstruation.MenstruationModExtension">
<eggLifeTimeFactor>2.0</eggLifeTimeFactor>
</li>
</modExtensions>
</GeneDef> </GeneDef>
<GeneDef ParentName="Menstruation_EggLifetime"> <GeneDef ParentName="Menstruation_EggLifetime">
<defName>Menstruation_QuadEggLifetime</defName> <defName>Menstruation_QuadEggLifetime</defName>
<label>quadrule egg lifetime</label> <label>quadrule egg lifetime</label>
<description>Eggs with this gene last four times as long.</description> <description>Eggs with this gene last four times as long.</description>
<iconPath>UI/Genes/Placeholder</iconPath> <iconPath>UI/Genes/QuadEggLifetime</iconPath>
<biostatMet>-2</biostatMet> <biostatMet>-2</biostatMet>
<biostatCpx>1</biostatCpx> <biostatCpx>1</biostatCpx>
<displayOrderInCategory>16</displayOrderInCategory> <displayOrderInCategory>16</displayOrderInCategory>
<modExtensions>
<li Class ="RJW_Menstruation.MenstruationModExtension">
<eggLifeTimeFactor>4.0</eggLifeTimeFactor>
</li>
</modExtensions>
</GeneDef> </GeneDef>
<GeneDef Name="Menstruation_Estrus" Abstract="True"> <GeneDef Name="Menstruation_Estrus" Abstract="True">
<displayCategory>Menstruation</displayCategory> <displayCategory>Menstruation</displayCategory>
<exclusionTags> <iconPath>UI/Genes/Placeholder</iconPath>
<exclusionTags>
<li>Menstruation_Estrus</li> <li>Menstruation_Estrus</li>
</exclusionTags> </exclusionTags>
</GeneDef> </GeneDef>
@ -53,24 +70,35 @@
<defName>Menstruation_NeverEstrus</defName> <defName>Menstruation_NeverEstrus</defName>
<label>never estrus</label> <label>never estrus</label>
<description>Carriers of this gene will never go into estrus.</description> <description>Carriers of this gene will never go into estrus.</description>
<iconPath>UI/Genes/Placeholder</iconPath> <iconPath>UI/Genes/NeverEstrus</iconPath>
<biostatMet>1</biostatMet> <biostatMet>1</biostatMet>
<displayOrderInCategory>20</displayOrderInCategory> <displayOrderInCategory>20</displayOrderInCategory>
<modExtensions>
<li Class ="RJW_Menstruation.MenstruationModExtension">
<neverEstrus>true</neverEstrus>
</li>
</modExtensions>
</GeneDef> </GeneDef>
<GeneDef ParentName="Menstruation_Estrus"> <GeneDef ParentName="Menstruation_Estrus">
<defName>Menstruation_FullEstrus</defName> <defName>Menstruation_FullEstrus</defName>
<label>full estrus</label> <label>full estrus</label>
<description>Carriers of this gene will enter full estrus every menstrual cycle, regardless of vagina type.</description> <description>Carriers of this gene will enter full estrus every menstrual cycle, regardless of vagina type.</description>
<iconPath>UI/Genes/Placeholder</iconPath> <iconPath>UI/Genes/FullEstrus</iconPath>
<biostatMet>-1</biostatMet> <biostatMet>-1</biostatMet>
<biostatCpx>1</biostatCpx> <biostatCpx>1</biostatCpx>
<displayOrderInCategory>25</displayOrderInCategory> <displayOrderInCategory>25</displayOrderInCategory>
<modExtensions>
<li Class ="RJW_Menstruation.MenstruationModExtension">
<alwaysEstrus>true</alwaysEstrus>
</li>
</modExtensions>
</GeneDef> </GeneDef>
<GeneDef Name="Menstruation_Ovulation" Abstract="True"> <GeneDef Name="Menstruation_Ovulation" Abstract="True">
<displayCategory>Menstruation</displayCategory> <displayCategory>Menstruation</displayCategory>
<exclusionTags> <iconPath>UI/Genes/Placeholder</iconPath>
<exclusionTags>
<li>Menstruation_Ovulation</li> <li>Menstruation_Ovulation</li>
</exclusionTags> </exclusionTags>
</GeneDef> </GeneDef>
@ -79,18 +107,28 @@
<defName>Menstruation_DoubleOvulation</defName> <defName>Menstruation_DoubleOvulation</defName>
<label>double ovulation</label> <label>double ovulation</label>
<description>Carriers of this gene will ovulate twice as many eggs.</description> <description>Carriers of this gene will ovulate twice as many eggs.</description>
<iconPath>UI/Genes/Placeholder</iconPath> <iconPath>UI/Genes/DoubleOvulation</iconPath>
<biostatMet>-1</biostatMet> <biostatMet>-1</biostatMet>
<displayOrderInCategory>30</displayOrderInCategory> <displayOrderInCategory>30</displayOrderInCategory>
<modExtensions>
<li Class ="RJW_Menstruation.MenstruationModExtension">
<ovulationFactor>2</ovulationFactor>
</li>
</modExtensions>
</GeneDef> </GeneDef>
<GeneDef ParentName="Menstruation_Ovulation"> <GeneDef ParentName="Menstruation_Ovulation">
<defName>Menstruation_QuadOvulation</defName> <defName>Menstruation_QuadOvulation</defName>
<label>quadruple ovulation</label> <label>quadruple ovulation</label>
<description>Carriers of this gene will ovulate four times as many eggs.</description> <description>Carriers of this gene will ovulate four times as many eggs.</description>
<iconPath>UI/Genes/Placeholder</iconPath> <iconPath>UI/Genes/QuadOvulation</iconPath>
<biostatMet>-1</biostatMet> <biostatMet>-1</biostatMet>
<displayOrderInCategory>35</displayOrderInCategory> <displayOrderInCategory>35</displayOrderInCategory>
<modExtensions>
<li Class ="RJW_Menstruation.MenstruationModExtension">
<ovulationFactor>4</ovulationFactor>
</li>
</modExtensions>
</GeneDef> </GeneDef>
<GeneDef> <GeneDef>
@ -98,9 +136,14 @@
<label>no bleeding</label> <label>no bleeding</label>
<displayCategory>Menstruation</displayCategory> <displayCategory>Menstruation</displayCategory>
<description>Carriers of this gene will not bleed at the end of their cycle.</description> <description>Carriers of this gene will not bleed at the end of their cycle.</description>
<iconPath>UI/Genes/Placeholder</iconPath> <iconPath>UI/Genes/NoBleeding</iconPath>
<biostatMet>-1</biostatMet> <biostatMet>-1</biostatMet>
<displayOrderInCategory>40</displayOrderInCategory> <displayOrderInCategory>40</displayOrderInCategory>
<modExtensions>
<li Class ="RJW_Menstruation.MenstruationModExtension">
<noBleeding>true</noBleeding>
</li>
</modExtensions>
</GeneDef> </GeneDef>
<!-- Pheromones? --> <!-- Pheromones? -->

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<Hediff_ASA.label>항정자 항체</Hediff_ASA.label>
<Hediff_ASA.labelNoun>항정자 항체</Hediff_ASA.labelNoun>
<Hediff_ASA.description>항정자 항체. 정자의 생존 시간을 줄입니다.</Hediff_ASA.description>
<Hediff_ASA.labelNounPretty>{0}(은)는 항정자 항체를 가졌습니다.</Hediff_ASA.labelNounPretty>
<Hediff_ForceFertile.label>좋은 임신률</Hediff_ForceFertile.label>
<Hediff_ForceFertile.labelNoun>좋은 임신률</Hediff_ForceFertile.labelNoun>
<Hediff_ForceFertile.description>좋은 임신률</Hediff_ForceFertile.description>
<Hediff_ForceFertile.labelNounPretty>{0}(은)는 좋은 임신률을 가지고 있습니다.</Hediff_ForceFertile.labelNounPretty>
</LanguageData>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<Hediff_MenstrualCramp.label>생리통</Hediff_MenstrualCramp.label>
<Hediff_MenstrualCramp.description>생리 주기가 끝날 때 보지에서 출혈이 있습니다.
종종 고통스럽습니다.</Hediff_MenstrualCramp.description>
<Hediff_MenstrualCramp.stages.0.label>불편함</Hediff_MenstrualCramp.stages.0.label>
<Hediff_MenstrualCramp.stages.1.label>짜증남</Hediff_MenstrualCramp.stages.1.label>
<Hediff_MenstrualCramp.stages.2.label>아픔</Hediff_MenstrualCramp.stages.2.label>
<Hediff_MenstrualCramp.stages.3.label>고통스러움</Hediff_MenstrualCramp.stages.3.label>
<Hediff_Estrus.label>발정기</Hediff_Estrus.label>
<Hediff_Estrus.description>자궁이 생리 주기의 가장 비옥한 단계로 접어든 상태입니다. 신체가 임신하기를 갈망함에 따라 성적 흥분과 욕망은 극적으로 증가합니다.
질내 성교의 가능성이 증가하고 잠재적으로 짝짓기 선택의 기준이 낮아집니다.</Hediff_Estrus.description>
<Hediff_Estrus_Concealed.label>발정기(숨김)</Hediff_Estrus_Concealed.label>
<Hediff_Estrus_Concealed.description>자궁이 생리 주기의 가장 비옥한 단계로 접어든 상태입니다. 성적 흥분과 욕망이 약간 증가합니다.
질내 성교의 가능성이 약간 증가합니다.</Hediff_Estrus_Concealed.description>
<Hediff_PainReliever.label>진통제</Hediff_PainReliever.label>
<Hediff_PainReliever.description>생리통(및 기타)의 통증을 완화해 줍니다.</Hediff_PainReliever.description>
<Hediff_Cyclosporine.label>면역 억제제</Hediff_Cyclosporine.label>
<Hediff_Cyclosporine.description>면역 억제제의 영향으로, 감염과 질병을 물리치는 신체의 면역력이 떨어집니다.</Hediff_Cyclosporine.description>
</LanguageData>

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<Hediff_MenstrualCramp.label>생리통</Hediff_MenstrualCramp.label>
<Hediff_MenstrualCramp.description>생리중입니다.</Hediff_MenstrualCramp.description>
<Hediff_MenstrualCramp.stages.0.label>불편함</Hediff_MenstrualCramp.stages.0.label>
<Hediff_MenstrualCramp.stages.1.label>짜증남</Hediff_MenstrualCramp.stages.1.label>
<Hediff_MenstrualCramp.stages.2.label>아픔</Hediff_MenstrualCramp.stages.2.label>
<Hediff_MenstrualCramp.stages.3.label>고통스러움</Hediff_MenstrualCramp.stages.3.label>
<Hediff_Estrus.label>발정기</Hediff_Estrus.label>
<Hediff_Estrus.description>발정기입니다.</Hediff_Estrus.description>
<Hediff_Estrus_Concealed.label>발정기(숨김)</Hediff_Estrus_Concealed.label>
<Hediff_Estrus_Concealed.description>발정기입니다.</Hediff_Estrus_Concealed.description>
<Hediff_PainReliever.label>진통제</Hediff_PainReliever.label>
<Hediff_PainReliever.description>약간의 고통을 줄여줍니다.</Hediff_PainReliever.description>
</LanguageData>

View File

@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LanguageData> <LanguageData>
<VaginaWashing.reportString>질세척 하는중</VaginaWashing.reportString> <VaginaWashing.reportString>질세척 하는중</VaginaWashing.reportString>
</LanguageData> </LanguageData>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<LactateSelf.reportString>스스로 젖 짜는 중</LactateSelf.reportString>
</LanguageData>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<OpenStatusWindow.label>생리: 상태 창을 엽니다.</OpenStatusWindow.label>
</LanguageData>

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<Surgery_ExpandAreola.label>유륜확대 수술</Surgery_ExpandAreola.label>
<Surgery_ExpandAreola.description>유륜을 크게만듭니다.</Surgery_ExpandAreola.description>
<Surgery_ExpandAreola.jobString>유륜확대 수술중</Surgery_ExpandAreola.jobString>
<Surgery_ContractAreola.label>유륜축소 수술</Surgery_ContractAreola.label>
<Surgery_ContractAreola.description>유륜을 작게만듭니다.</Surgery_ContractAreola.description>
<Surgery_ContractAreola.jobString>유륜축소 수술중</Surgery_ContractAreola.jobString>
<Surgery_ExpandNipple.label>유두확대 수술</Surgery_ExpandNipple.label>
<Surgery_ExpandNipple.description>유두를 크게만듭니다.</Surgery_ExpandNipple.description>
<Surgery_ExpandNipple.jobString>유두확대 수술중</Surgery_ExpandNipple.jobString>
<Surgery_ContractNipple.label>유두축소 수술</Surgery_ContractNipple.label>
<Surgery_ContractNipple.description>유두를 작게만듭니다.</Surgery_ContractNipple.description>
<Surgery_ContractNipple.jobString>유두축소 수술중</Surgery_ContractNipple.jobString>
</LanguageData>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<Surgery_ExpandAreola.label>유륜 확대</Surgery_ExpandAreola.label>
<Surgery_ExpandAreola.description>유륜을 크게 만듭니다.</Surgery_ExpandAreola.description>
<Surgery_ExpandAreola.jobString>유륜 확대 중</Surgery_ExpandAreola.jobString>
<Surgery_ContractAreola.label>유륜 축소</Surgery_ContractAreola.label>
<Surgery_ContractAreola.description>유륜을 작게 만듭니다.</Surgery_ContractAreola.description>
<Surgery_ContractAreola.jobString>유륜 축소 중</Surgery_ContractAreola.jobString>
<Surgery_ExpandNipple.label>유두 확대</Surgery_ExpandNipple.label>
<Surgery_ExpandNipple.description>유두를 크게 만듭니다.</Surgery_ExpandNipple.description>
<Surgery_ExpandNipple.jobString>유두 확대 중</Surgery_ExpandNipple.jobString>
<Surgery_ContractNipple.label>유두 축소</Surgery_ContractNipple.label>
<Surgery_ContractNipple.description>유두를 작게 만듭니다.</Surgery_ContractNipple.description>
<Surgery_ContractNipple.jobString>유두 축소 중</Surgery_ContractNipple.jobString>
<Surgery_DarkenNipple.label>유두 흑화</Surgery_DarkenNipple.label>
<Surgery_DarkenNipple.description>유두를 어둡게 만듭니다.</Surgery_DarkenNipple.description>
<Surgery_DarkenNipple.jobString>유두 흑화 중</Surgery_DarkenNipple.jobString>
<Surgery_LightenNipple.label>유두 미백</Surgery_LightenNipple.label>
<Surgery_LightenNipple.description>유두를 밝게 만듭니다.</Surgery_LightenNipple.description>
<Surgery_LightenNipple.jobString>유두 미백 중</Surgery_LightenNipple.jobString>
</LanguageData>

View File

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<AmountofCreampied.label>질내사정</AmountofCreampied.label>
<AmountofCreampied.description>질내사정당한 정액 양</AmountofCreampied.description>
</LanguageData>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<AmountofCreampied.label>질내사정</AmountofCreampied.label>
<AmountofCreampied.description>질내사정당한 정액 양</AmountofCreampied.description>
<AmountofFertilizedEggs.label>수정된 알</AmountofFertilizedEggs.label>
<AmountofFertilizedEggs.description>정자에 의해 수정된 알의 갯수</AmountofFertilizedEggs.description>
</LanguageData>

View File

@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LanguageData> <LanguageData>
<MaxAbsorbable.label>흡수량</MaxAbsorbable.label> <MaxAbsorbable.label>흡수량</MaxAbsorbable.label>
<MaxAbsorbable.description>액체를 흡수할수 있는 정도입니다.</MaxAbsorbable.description> <MaxAbsorbable.description>액체를 흡수할수 있는 정도입니다.</MaxAbsorbable.description>
</LanguageData> </LanguageData>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<CameInside.label>질내사정</CameInside.label>
<CameInside.rulePack.rulesStrings.0>tale_noun-&gt;[FUCKER_nameDef](은)는 [FUCKED_nameDef]의 안에 들어갔다.</CameInside.rulePack.rulesStrings.0>
<CameInside.rulePack.rulesStrings.1>image-&gt;[FUCKER_nameFull]의 자지는 [circumstance_group] [FUCKED_nameFull]의 보지 안에 깊숙히 들어갔다.</CameInside.rulePack.rulesStrings.1>
<CameInside.rulePack.rulesStrings.2>image-&gt;[FUCKER_nameFull]의 자지는 [circumstance_group] [FUCKED_nameFull]의 보지 속으로 사라졌다.</CameInside.rulePack.rulesStrings.2>
<CameInside.rulePack.rulesStrings.3>image-&gt;[FUCKED_nameFull]의 보지는 [circumstance_group] [FUCKER_nameFull]의 자지로 꽉 채워졌다.</CameInside.rulePack.rulesStrings.3>
<CameInside.rulePack.rulesStrings.4>image-&gt;[FUCKED_nameFull]의 보지는 [circumstance_group] [FUCKER_nameFull]의 자지를 꽉꽉 물어대었다.</CameInside.rulePack.rulesStrings.4>
<CameInside.rulePack.rulesStrings.5>circumstance_phrase-&gt;[FUCKER_nameDef](이)가 흥분에 이를 갈 때</CameInside.rulePack.rulesStrings.5>
<CameInside.rulePack.rulesStrings.6>circumstance_phrase-&gt;[FUCKER_nameDef](이)가 만족스런 미소를 짓는 동안</CameInside.rulePack.rulesStrings.6>
<CameInside.rulePack.rulesStrings.7>circumstance_phrase-&gt;[FUCKED_nameDef]쾌락에 몸을 떨 때</CameInside.rulePack.rulesStrings.7>
<CameInside.rulePack.rulesStrings.8>circumstance_phrase-&gt;[FUCKER_nameDef](이)가 [FUCKED_nameDef]에게 한 발 쌀 동안</CameInside.rulePack.rulesStrings.8>
<CameInside.rulePack.rulesStrings.9>circumstance_phrase-&gt;[FUCKED_nameDef](이)가 미소로 [FUCKER_nameDef]의 눈을 마주칠 때</CameInside.rulePack.rulesStrings.9>
<CameInside.rulePack.rulesStrings.10>desc_sentence-&gt;[FUCKER_nameDef]의 정액이 [FUCKED_nameDef]의 보지를 넘어 바닥에 넘쳐흘렀다.</CameInside.rulePack.rulesStrings.10>
<CameInside.rulePack.rulesStrings.11>desc_sentence-&gt;[FUCKER_nameDef]의 정자가 [FUCKED_nameDef]의 자궁에서 경주를 벌이고, 끝내 [FUCKED_possessive]의 난자에 도달했다.</CameInside.rulePack.rulesStrings.11>
<CameInside.rulePack.rulesStrings.12>desc_sentence-&gt;[FUCKER_nameDef]의 정액이 [FUCKED_nameDef]의 자궁에 쏟아졌다.</CameInside.rulePack.rulesStrings.12>
<CameInside.rulePack.rulesStrings.13>desc_sentence-&gt;[FUCKED_nameDef]의 자궁은 정액으로 가득찼다.</CameInside.rulePack.rulesStrings.13>
<CameInside.rulePack.rulesStrings.14>desc_sentence-&gt;[FUCKER_nameDef]의 얼굴에 땀이 흘러내렸다.</CameInside.rulePack.rulesStrings.14>
<CameInside.rulePack.rulesStrings.15>desc_sentence-&gt;[FUCKED_nameDef](은)는 심하게 헐떡였다.</CameInside.rulePack.rulesStrings.15>
</LanguageData>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LanguageData> <LanguageData>
<Absorber.label>성기</Absorber.label> <Absorber.label>성기</Absorber.label>
</LanguageData> </LanguageData>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<Absorber_Tampon.label>탐폰</Absorber_Tampon.label>
<Absorber_Tampon.description>보지에서 나오는 액체를 흡수하는 탐폰입니다.
오래 착용하고 있을 경우 감염이 발생할수도 있습니다.</Absorber_Tampon.description>
<Absorber_Tampon_Dirty.label>더러운 탐폰</Absorber_Tampon_Dirty.label>
<Absorber_Tampon_Dirty.description>사용된 축축한 탐폰입니다.</Absorber_Tampon_Dirty.description>
<Absorber_Pad.label>생리대</Absorber_Pad.label>
<Absorber_Pad.description>보지에서 나오는 액체를 흡수하는 생리대입니다.
흡수량 이상의 액체가 나올경우 샐수있습니다.</Absorber_Pad.description>
<Absorber_Pad_Dirty.label>젖은 생리대</Absorber_Pad_Dirty.label>
<Absorber_Pad_Dirty.description>사용된 축축한 생리대입니다.</Absorber_Pad_Dirty.description>
</LanguageData>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<FilthMixture.label>혼합물</FilthMixture.label>
</LanguageData>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<OvaryRegenerationPill.label>난소 재생약</OvaryRegenerationPill.label>
<OvaryRegenerationPill.description>난소를 재생시켜 평생 배출할 수 있는 난자의 총 양을 복구시킵니다.
난자 소모량이 클수록 효과가 줄어듭니다.
폐경을 회복시키지 않습니다.</OvaryRegenerationPill.description>
<SuperovulationInducingAgent.label>과배란 유도제</SuperovulationInducingAgent.label>
<SuperovulationInducingAgent.description>과배란을 유도하는 약물입니다. 과배란을 유도하여 다음 배란에서 1-4개의 여분의 난자를 배란합니다.
조기폐경을 초래할수도 있습니다.</SuperovulationInducingAgent.description>
<PainReliever.label>진통제</PainReliever.label>
<PainReliever.description>24시간 동안 생리통을 완화시켜 줍니다.
다른 통증에도 효과적입니다.</PainReliever.description>
<Cyclosporine.label>면역 억제제</Cyclosporine.label>
<Cyclosporine.description>면역 억제제.
항정자 항체를 치료할 수 있지만, 24시간 동안 감염과 질병을 퇴치하는 신체의 면역력을 떨어뜨립니다. 복용하면 정자의 생존 시간을 늘립니다.</Cyclosporine.description>
</LanguageData>

View File

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<Absorber_Tampon.label>탐폰</Absorber_Tampon.label>
<Absorber_Tampon.description>보지에서 나오는 액체를 흡수하는 탐폰입니다.&#10;오래 착용하고 있을 경우 감염이 발생할수도 있습니다.</Absorber_Tampon.description>
<Absorber_Tampon_Dirty.label>더러운 탐폰</Absorber_Tampon_Dirty.label>
<Absorber_Tampon_Dirty.description>사용된 축축한 탐폰입니다.</Absorber_Tampon_Dirty.description>
<Absorber_Pad.label>생리대</Absorber_Pad.label>
<Absorber_Pad.description>보지에서 나오는 액체를 흡수하는 생리대입니다.&#10;흡수량 이상의 액체가 나올경우 샐수있습니다.</Absorber_Pad.description>
<Absorber_Pad_Dirty.label>젖은 생리대</Absorber_Pad_Dirty.label>
<Absorber_Pad_Dirty.description>사용된 축축한 생리대입니다.</Absorber_Pad_Dirty.description>
<OvaryRegenerationPill.label>난소 재생약</OvaryRegenerationPill.label>
<OvaryRegenerationPill.description>난소를 재생시켜 배출할수있는 난자의 양을 증가시킵니다.&#10;난자 소모량이 클수록 효과가 줄어듭니다.&#10;폐경을 회복시키지 않습니다.</OvaryRegenerationPill.description>
<SuperovulationInducingAgent.label>과배란 유도제</SuperovulationInducingAgent.label>
<SuperovulationInducingAgent.description>과배란을 유도하는 약물입니다.&#10;조기폐경을 초래할수도 있습니다.</SuperovulationInducingAgent.description>
<PainReliever.label>진통제</PainReliever.label>
<PainReliever.description>하루동안 약간의 통증을 줄여줍니다.</PainReliever.description>
<FilthMixture.label>혼합물</FilthMixture.label>
</LanguageData>

View File

@ -1,29 +1,32 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LanguageData> <LanguageData>
<LeakingFluids.stages.0.label>가랑이가 축축함</LeakingFluids.stages.0.label> <LeakingFluids.stages.0.label>가랑이가 축축함</LeakingFluids.stages.0.label>
<LeakingFluids.stages.0.description>찝찝해...</LeakingFluids.stages.0.description> <LeakingFluids.stages.0.description>이걸 닦아낼 뭔가가 없을까?
<CameInsideF.stages.0.label>{0}에게 질내사정당함</CameInsideF.stages.0.label> </LeakingFluids.stages.0.description>
<CameInsideF.stages.0.description>임신할까봐 걱정돼...</CameInsideF.stages.0.description> <HaterCameInsideM.stages.0.label>{0}에게 질내사정함</HaterCameInsideM.stages.0.label>
<HaterCameInsideM.stages.0.description>그 년한테 질싸를 했어!</HaterCameInsideM.stages.0.description>
<CameInsideM.stages.0.label>{0}에게 질내사정함</CameInsideM.stages.0.label>
<CameInsideM.stages.0.description>질싸를하니 기분이 좋네.</CameInsideM.stages.0.description>
<CameInsideFFetish.stages.0.label>{0}에게 질내사정당함</CameInsideFFetish.stages.0.label>
<CameInsideFFetish.stages.0.description>임신하면 좋을 텐데.</CameInsideFFetish.stages.0.description>
<HaterCameInsideF.stages.0.label>{0}에게 질내사정당함</HaterCameInsideF.stages.0.label>
<HaterCameInsideF.stages.0.description>나는 그 새끼의 자식을 임신하고 싶지 않아!</HaterCameInsideF.stages.0.description>
<HaterCameInsideFEstrus.stages.0.label>{0}에게 질내사정당함</HaterCameInsideFEstrus.stages.0.label>
<HaterCameInsideFEstrus.stages.0.description>아. 이런 일을 당해야 하다니...</HaterCameInsideFEstrus.stages.0.description>
<CameInsideFLowFert.stages.0.label>{0}에게 질내사정당함</CameInsideFLowFert.stages.0.label> <CameInsideFLowFert.stages.0.label>{0}에게 질내사정당함</CameInsideFLowFert.stages.0.label>
<CameInsideFLowFert.stages.0.description>확률은 낮겠지만 임신할까봐 걱정돼...</CameInsideFLowFert.stages.0.description> <CameInsideFLowFert.stages.0.description>확률은 낮겠지만 임신할까봐 걱정돼...</CameInsideFLowFert.stages.0.description>
<CameInsideFFetish.stages.0.label>{0}에게 질내사정당함</CameInsideFFetish.stages.0.label> <CameInsideF.stages.0.label>{0}에게 질내사정당함</CameInsideF.stages.0.label>
<CameInsideFFetish.stages.0.description>임신할것 같아</CameInsideFFetish.stages.0.description> <CameInsideF.stages.0.description>임신할까봐 걱정돼...</CameInsideF.stages.0.description>
<CameInsideFFetishSafe.stages.0.label>{0}에게 질내사정당함</CameInsideFFetishSafe.stages.0.label> <CameInsideFFetishSafe.stages.0.label>{0}에게 질내사정당함</CameInsideFFetishSafe.stages.0.label>
<CameInsideFFetishSafe.stages.0.description>좋았어...</CameInsideFFetishSafe.stages.0.description> <CameInsideFFetishSafe.stages.0.description>아마 임신 안할꺼야. 게다가 좋기도 했어...</CameInsideFFetishSafe.stages.0.description>
<CameInsideM.stages.0.label>{0}에게 질내사정함</CameInsideM.stages.0.label>
<CameInsideM.stages.0.description>질싸를하니 기분이 좋네</CameInsideM.stages.0.description>
<HaterCameInsideF.stages.0.label>{0}에게 질내사정당함</HaterCameInsideF.stages.0.label>
<HaterCameInsideF.stages.0.description>그새끼의 자식을 임신하고 싶지 않아...</HaterCameInsideF.stages.0.description>
<HaterCameInsideFSafe.stages.0.label>{0}에게 질내사정당함</HaterCameInsideFSafe.stages.0.label> <HaterCameInsideFSafe.stages.0.label>{0}에게 질내사정당함</HaterCameInsideFSafe.stages.0.label>
<HaterCameInsideFSafe.stages.0.description>안전일이였지만 기분나빠</HaterCameInsideFSafe.stages.0.description> <HaterCameInsideFSafe.stages.0.description>안전일이였지만, 기분 더러워.</HaterCameInsideFSafe.stages.0.description>
<HaterCameInsideM.stages.0.label>{0}에게 질내사정함</HaterCameInsideM.stages.0.label>
<HaterCameInsideM.stages.0.description>그년한테 질싸를했어</HaterCameInsideM.stages.0.description>
<UnwantedPregnancy.stages.0.label>원치않은 임신</UnwantedPregnancy.stages.0.label> <UnwantedPregnancy.stages.0.label>원치않은 임신</UnwantedPregnancy.stages.0.label>
<UnwantedPregnancy.stages.0.description>어떻게 해야하지?...</UnwantedPregnancy.stages.0.description> <HaterCameInsideM.stages.0.description>그년한테 질싸를했어</HaterCameInsideM.stages.0.description> <UnwantedPregnancy.stages.0.description>어떻게 해야하지?...</UnwantedPregnancy.stages.0.description>
<UexpectedPregnancyMild.stages.0.label>원치않은 임신</UexpectedPregnancyMild.stages.0.label> <UnwantedPregnancyMild.stages.0.label>원치않은 임신</UnwantedPregnancyMild.stages.0.label>
<UexpectedPregnancyMild.stages.0.description>어떻게 해야하지?...</UexpectedPregnancyMild.stages.0.description> <UnwantedPregnancyMild.stages.0.description>아이를 가졌어. 하지만 아마 괜찮을꺼야.</UnwantedPregnancyMild.stages.0.description>
<TookContraceptivePill.stages.0.label>피임약 복용</TookContraceptivePill.stages.0.label> <TookContraceptivePill.stages.0.label>피임약 복용</TookContraceptivePill.stages.0.label>
<TookContraceptivePill.stages.0.description>괜찮을거야</TookContraceptivePill.stages.0.description> <TookContraceptivePill.stages.0.description>이젠 해도 괜찮아.</TookContraceptivePill.stages.0.description>
<HateTookContraptivePill.stages.0.label>피임약 복용</HateTookContraptivePill.stages.0.label> <HateTookContraptivePill.stages.0.label>피임약 복용</HateTookContraptivePill.stages.0.label>
<HateTookContraptivePill.stages.0.description>임신하고싶어</HateTookContraptivePill.stages.0.description> <HateTookContraptivePill.stages.0.description>임신하고 싶은데.</HateTookContraptivePill.stages.0.description>
</LanguageData> </LanguageData>

View File

@ -1,18 +1,29 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LanguageData> <LanguageData>
<Mod_Title>RJW Menstruation Cycle</Mod_Title> <Mod_Title>RJW 생리 주기</Mod_Title>
<Menstrual_Blood>생리혈</Menstrual_Blood> <Menstrual_Blood>생리혈</Menstrual_Blood>
<Info_noCum>없음</Info_noCum> <Info_noCum>정액 없음</Info_noCum>
<Stage_Follicular>난포기</Stage_Follicular> <Stage_Follicular>난포기</Stage_Follicular>
<Stage_Ovulatory>배란</Stage_Ovulatory> <Stage_Ovulatory>배란</Stage_Ovulatory>
<Stage_Luteal>황체기</Stage_Luteal> <Stage_Luteal>황체기</Stage_Luteal>
<Stage_Bleeding>생리중</Stage_Bleeding> <Stage_Bleeding>생리중</Stage_Bleeding>
<Stage_Pregnant>임신</Stage_Pregnant> <Stage_Pregnant>임신</Stage_Pregnant>
<Stage_Recover>회복기</Stage_Recover> <Stage_Recover>회복기</Stage_Recover>
<Stage_None>없음</Stage_None> <Stage_None>불임</Stage_None>
<Stage_Climacteric>갱년기</Stage_Climacteric> <Stage_Climacteric>갱년기</Stage_Climacteric>
<Stage_Menopause>폐경</Stage_Menopause>
<Stage_Anestrus>휴지기</Stage_Anestrus> <Stage_Anestrus>휴지기</Stage_Anestrus>
<Stage_Follicular_Desc>난소가 배란할 준비를 하고 있습니다. 배란은 이 단계가 끝날 때 발생합니다.</Stage_Follicular_Desc>
<Stage_Follicular_Induced_Desc>난소가 배란할 준비를 하고 있습니다. 정액이 자궁에 들어가면 배란이 일어날 것입니다.</Stage_Follicular_Induced_Desc>
<Stage_Ovulatory_Desc>난소는 자궁 안으로 난자를 방출하고 있습니다.</Stage_Ovulatory_Desc>
<Stage_Luteal_Desc>자궁은 수정란을 받을 준비가 되어 있습니다. 이 단계가 끝나기 전에 착상이 되면 임신이 됩니다.</Stage_Luteal_Desc>
<Stage_Bleeding_Desc>착상에 실패한 난자와 함께 자궁의 내벽이 허물어지고 있습니다.</Stage_Bleeding_Desc>
<Stage_Pregnant_Desc>아기가 자궁 안에서 자라고 있습니다. 정성으로 보살핀다면, 이 세상에 새롭게 태어날 것입니다.</Stage_Pregnant_Desc>
<Stage_Recover_Desc>자궁이 최근 임신에서 회복되고 있습니다.</Stage_Recover_Desc>
<Stage_None_Desc>자궁이 불임으로 임신할 수 없습니다.</Stage_None_Desc>
<Stage_Climacteric_Desc>난소가 거의 고갈되어 생리 주기가 불규칙해졌습니다.</Stage_Climacteric_Desc>
<Stage_Menopause_Desc>난소가 고갈되어 자궁은 더 이상 난자를 품을 수 없습니다.</Stage_Menopause_Desc>
<Stage_Anestrus_Desc>자궁이 번식기가 아닙니다. 조건이 충족되면 주기가 재개됩니다.</Stage_Anestrus_Desc>
<Button_HealthTab>상태창</Button_HealthTab> <Button_HealthTab>상태창</Button_HealthTab>
<Button_MilkTooltip>모유 짜기</Button_MilkTooltip> <Button_MilkTooltip>모유 짜기</Button_MilkTooltip>
<Dialog_WombInfo01>상태</Dialog_WombInfo01> <Dialog_WombInfo01>상태</Dialog_WombInfo01>
@ -24,11 +35,15 @@
<Dialog_WombInfo07>배란</Dialog_WombInfo07> <Dialog_WombInfo07>배란</Dialog_WombInfo07>
<Dialog_WombInfo08></Dialog_WombInfo08> <Dialog_WombInfo08></Dialog_WombInfo08>
<Dialog_WombInfo09></Dialog_WombInfo09> <Dialog_WombInfo09></Dialog_WombInfo09>
<Dialog_DoCleanWomb_Tooltip>양동이에 정액 모으기</Dialog_DoCleanWomb_Tooltip>
<Dialog_DontCleanWomb_Tooltip>자궁의 정액 모으기</Dialog_DontCleanWomb_Tooltip>
<Dialog_FatherUnknown>알려지지 않음</Dialog_FatherUnknown>
<Option1_Label_1>자궁아이콘 활성화</Option1_Label_1> <Option1_Label_1>자궁아이콘 활성화</Option1_Label_1>
<Option1_Label_2>건강탭에 버튼 추가</Option1_Label_2> <Option1_Label_2>건강탭에 버튼 추가</Option1_Label_2>
<Option2_Label>동물주기 활성화</Option2_Label> <Option2_Label>동물주기 활성화</Option2_Label>
<Option2_Desc>동물의 월경주기를 시뮬레이션합니다.&#10;변경한후에 세이브로드가 필요합니다.&#10;not recommended</Option2_Desc> <Option2_Desc>동물의 월경주기를 시뮬레이션합니다.
변경한후에 세이브로드가 필요합니다.
추천하지 않음</Option2_Desc>
<Option3_Label>착상확률</Option3_Label> <Option3_Label>착상확률</Option3_Label>
<Option3_Desc>수정란의 착상확률을 설정합니다.</Option3_Desc> <Option3_Desc>수정란의 착상확률을 설정합니다.</Option3_Desc>
<Option4_Label>수정확률</Option4_Label> <Option4_Label>수정확률</Option4_Label>
@ -36,10 +51,14 @@
<Option5_Label>시간당 정액배출비율</Option5_Label> <Option5_Label>시간당 정액배출비율</Option5_Label>
<Option5_Desc>이 비율만큼 매 시간마다 정액이 배출됩니다.</Option5_Desc> <Option5_Desc>이 비율만큼 매 시간마다 정액이 배출됩니다.</Option5_Desc>
<Option6_Label>시간당 정자 사망비율</Option6_Label> <Option6_Label>시간당 정자 사망비율</Option6_Label>
<Option6_Desc>이 비율만큼 매 시간마다 정자가 사망해 정액이 생식능력을 잃습니다.&#10;정자 예상수명: 정액이 대부분의 생식능력을 잃는 시간입니다.</Option6_Desc> <Option6_Desc>이 비율만큼 매 시간마다 정자가 사망해 정액이 생식능력을 잃습니다.
정자 예상수명: 정액이 대부분의 생식능력을 잃는 시간입니다.</Option6_Desc>
<Option7_Label>주기 가속</Option7_Label> <Option7_Label>주기 가속</Option7_Label>
<Option7_Desc>월경주기를 더 빠르게합니다.&#10;이 설정은 조기폐경과 난임을 유발할수도 있습니다.&#10;12배속 이하로 설정하는것을 권장합니다.&#10;림월드의 시간배율: x6(default)</Option7_Desc> <Option7_Desc>월경주기를 더 빠르게합니다.
<Option8_Label>Debug</Option8_Label> 이 설정은 조기폐경과 난임을 유발할수도 있습니다.
12배속 이하로 설정하는것을 권장합니다.
림월드의 시간배율: x6(기본)</Option7_Desc>
<Option8_Label>디버그</Option8_Label>
<Option8_Desc>디버그정보를 보여줍니다.</Option8_Desc> <Option8_Desc>디버그정보를 보여줍니다.</Option8_Desc>
<Option9_Label>자궁 그림</Option9_Label> <Option9_Label>자궁 그림</Option9_Label>
<Option9_Desc>상태창에 자궁그림을 표시합니다.</Option9_Desc> <Option9_Desc>상태창에 자궁그림을 표시합니다.</Option9_Desc>
@ -51,9 +70,13 @@
<Option11_Desc_3>태아에 대한 정보를 표시하지 않지만, 임신한 이후 태아이미지를 표시합니다.</Option11_Desc_3> <Option11_Desc_3>태아에 대한 정보를 표시하지 않지만, 임신한 이후 태아이미지를 표시합니다.</Option11_Desc_3>
<Option11_Desc_4>태아에 대한 어떠한 정보도 표시하지 않습니다.</Option11_Desc_4> <Option11_Desc_4>태아에 대한 어떠한 정보도 표시하지 않습니다.</Option11_Desc_4>
<Option12_Label>폐경기 활성화</Option12_Label> <Option12_Label>폐경기 활성화</Option12_Label>
<Option12_Desc>시간이 지남에따라 불임상태로 만드는 폐경기를 활성화합니다.&#10;수명이 긴 종족을 사용할때 문제가 있으면 이 옵션을 끄세요.&#10;변경한후에 세이브로드가 필요합니다.</Option12_Desc> <Option12_Desc>시간이 지남에따라 불임상태로 만드는 폐경기를 활성화합니다.
수명이 긴 종족을 사용할때 문제가 있으면 이 옵션을 끄세요.
변경한후에 세이브로드가 필요합니다.</Option12_Desc>
<Option13_Label>다중임신</Option13_Label> <Option13_Label>다중임신</Option13_Label>
<Option13_Desc>RJW의 기본임신 대신 다중임신을 사용합니다.&#10;임신에 문제가 있다면 이 기능을 끄는것으로 해결될수도 있습니다.&#10;RJW 임신이 활성화 되어야 합니다.</Option13_Desc> <Option13_Desc>RJW의 기본임신 대신 다중임신을 사용합니다.
임신에 문제가 있다면 이 기능을 끄는것으로 해결될수도 있습니다.
RJW 임신이 활성화 되어야 합니다.</Option13_Desc>
<Option14_Label>이란성 쌍둥이 활성화</Option14_Label> <Option14_Label>이란성 쌍둥이 활성화</Option14_Label>
<Option14_Desc>다수의 난자가 임신으로 이어지게 합니다.</Option14_Desc> <Option14_Desc>다수의 난자가 임신으로 이어지게 합니다.</Option14_Desc>
<Option15_Label>일란성 쌍둥이 활성화</Option15_Label> <Option15_Label>일란성 쌍둥이 활성화</Option15_Label>
@ -66,7 +89,9 @@
<Option18_Desc>자궁그림 위에 난자그림를 표시합니다.</Option18_Desc> <Option18_Desc>자궁그림 위에 난자그림를 표시합니다.</Option18_Desc>
<Option19_Label_1>생리양</Option19_Label_1> <Option19_Label_1>생리양</Option19_Label_1>
<Option19_Label_2>예상되는 총 생리양</Option19_Label_2> <Option19_Label_2>예상되는 총 생리양</Option19_Label_2>
<Option19_Desc>생리혈의 양을 설정합니다.&#10;실제 생리양은 보지에따라 다를수 있습니다.&#10;일반적인 인간 여성의 생리량은 약 20~80ml입니다.</Option19_Desc> <Option19_Desc>생리혈의 양을 설정합니다.
실제 생리양은 보지에따라 다를수 있습니다.
일반적인 인간 여성의 생리량은 약 20~80ml입니다.</Option19_Desc>
<Option20_Label_1>정착민</Option20_Label_1> <Option20_Label_1>정착민</Option20_Label_1>
<Option20_Label_2>죄수</Option20_Label_2> <Option20_Label_2>죄수</Option20_Label_2>
<Option20_Label_3>동맹관계</Option20_Label_3> <Option20_Label_3>동맹관계</Option20_Label_3>
@ -75,36 +100,54 @@
<Option21_Label>표시 대상</Option21_Label> <Option21_Label>표시 대상</Option21_Label>
<Option21_Desc>아이콘과 버튼을 표시할 대상입니다.</Option21_Desc> <Option21_Desc>아이콘과 버튼을 표시할 대상입니다.</Option21_Desc>
<Option22_Label>잡종 정의 대체</Option22_Label> <Option22_Label>잡종 정의 대체</Option22_Label>
<Option22_Desc>RJW와 RaceSupport의 잡종정의를 대체합니다.&#10;우선순위는 누구의 잡종 정의를 우선으로 사용할지 정합니다. 변경하지 않는것을 추천합니다.</Option22_Desc> <Option22_Desc>RJW와 RaceSupport의 잡종정의를 대체합니다.
우선순위는 누구의 잡종 정의를 우선으로 사용할지 정합니다. 변경하지 않는것을 추천합니다.</Option22_Desc>
<Option23_Label>우선순위</Option23_Label> <Option23_Label>우선순위</Option23_Label>
<Option23_Label_1></Option23_Label_1> <Option23_Label_1></Option23_Label_1>
<Option23_Label_2></Option23_Label_2> <Option23_Label_2></Option23_Label_2>
<Option24_Label>임신후 유두 변화량</Option24_Label> <Option_MaxBreastIncrementFactor_Label>임신 중 유방 크기 변화</Option_MaxBreastIncrementFactor_Label>
<Option24_Desc>임신후에 유두가 얼마나 어두워지고 커지는지 설정합니다.</Option24_Desc> <Option_MaxBreastIncrementFactor_Desc>임신했을 때 가슴이 얼마나 커질지 설정합니다. 폰에 따라 변화 정도가 다릅니다.</Option_MaxBreastIncrementFactor_Desc>
<Option25_Label>유두 영구변화량</Option25_Label> <Option_MaxNippleIncrementFactor_Label>임신 중 유두 변화</Option_MaxNippleIncrementFactor_Label>
<Option25_Desc>매번 임신할때마다 유두가 얼마나 영구적으로 어두워지고 커지는지 설정합니다.</Option25_Desc> <Option_MaxNippleIncrementFactor_Desc>임신 중에 유두가 얼마나 변할지를 설정합니다.</Option_MaxNippleIncrementFactor_Desc>
<Option26_Label>최대 변화량</Option26_Label> <Option_PermanentNippleChange_Label>임신 후 유두 영구 변화</Option_PermanentNippleChange_Label>
<Option26_Desc>유두는 이 값 이상으로 변하지 않습니다.</Option26_Desc> <Option_PermanentNippleChange_Desc>임신한 폰의 유두가 임신이 끝난 후 변화된 상태를 유지할 대략적인 양을 설정합니다.</Option_PermanentNippleChange_Desc>
<Option27_Label>유두 변화 속도</Option27_Label>
<Option27_Desc>유두가 얼마나 빨리 변하는지 설정합니다.</Option27_Desc>
<Option28_Label>잡종 정의 변경하기</Option28_Label> <Option28_Label>잡종 정의 변경하기</Option28_Label>
<Option28_Tooltip>사용자 지정 잡종 편집기를 엽니다.&#10;이 설정은 XML파일의 잡종 정의를 대체합니다.</Option28_Tooltip> <Option28_Tooltip>사용자 지정 잡종 편집기를 엽니다.
이 설정은 XML파일의 잡종 정의를 대체합니다.</Option28_Tooltip>
<Option29_Label>아이콘 축소 허용</Option29_Label> <Option29_Label>아이콘 축소 허용</Option29_Label>
<Option29_Desc>아이콘 축소를 허용합니다.</Option29_Desc> <Option29_Desc>아이콘 축소를 허용합니다.</Option29_Desc>
<Option30_Label>난자 수명 배수</Option30_Label> <Option30_Label>난자 수명 배수</Option30_Label>
<Option30_Desc>난자 수명을 늘립니다.&#10;이 설정에 관계없이 황체기가 끝나면 난자는 죽습니다.</Option30_Desc> <Option30_Desc>난자 수명을 늘립니다.
이 설정에 관계없이 황체기가 끝나면 난자는 죽습니다.</Option30_Desc>
<Option31_Label>출산 이후 보지 변화 활성화</Option31_Label> <Option31_Label>출산 이후 보지 변화 활성화</Option31_Label>
<Option31_Desc>출산 이후 보지가 영구적으로 늘어나게 합니다.&#10;만약 이 설정을 다루고있는 다른 모드가 있다면, 이 설정을 끄세요.</Option31_Desc> <Option31_Desc>출산 이후 보지가 영구적으로 늘어나게 합니다.
만약 이 설정을 다루고있는 다른 모드가 있다면, 이 설정을 끄세요.</Option31_Desc>
<Option32_Label>변화 강도</Option32_Label> <Option32_Label>변화 강도</Option32_Label>
<Option32_Desc>변화 강도를 설정합니다.</Option32_Desc> <Option32_Desc>변화 강도를 설정합니다.</Option32_Desc>
<Option_EnableGatherCumGizmo_Label>정액 모으기 아이콘을 보이기</Option_EnableGatherCumGizmo_Label>
<Option_EstrusOverride_Label>발정기 시, RJW 유혹 설정 덮어쓰기</Option_EstrusOverride_Label>
<Option_EstrusOverride_Desc>활성화된 경우 발정기에 있는 폰은 RJW 설정 대신 유혹으로 이 설정을 사용합니다.
모든 설정은 기본적으로 해당 RJW 설정으로 설정됩니다.</Option_EstrusOverride_Desc>
<Option_EstrusFuckability_Label>발정기 시 유혹 최소 섹스 가능성</Option_EstrusFuckability_Label>
<Option_EstrusAttractability_Label>발정기 시 유혹 최소 매력</Option_EstrusAttractability_Label>
<Option_EstrusRelationship_Label>발정기 시 유혹 최소 의견</Option_EstrusRelationship_Label>
<EstimatedCumLifespan>정자 예상수명</EstimatedCumLifespan> <EstimatedCumLifespan>정자 예상수명</EstimatedCumLifespan>
<EstimatedEggLifespan>난자 예상수명</EstimatedEggLifespan> <EstimatedEggLifespan>난자 예상수명</EstimatedEggLifespan>
<FertilityDesc>한시간 안에 수정될 확률: {0}%&#10;수정란이 임신으로 진행될 확률입니다.&#10;흰색 오버레이는 정자가 난자를 수정시킬 확률을 표시하는 것입니다.</FertilityDesc> <FertilityDesc>한시간 안에 수정될 확률: {0}%
흰색 오버레이는 정자가 난자를 수정시킬 확률을 표시하는 것이고,
분홍색 임신률 그래프는 수정된 난자가 착상되어 임신으로 진행될 확률입니다.
수정이 되더라도 착상에 실패하면 임신하지 않습니다.</FertilityDesc>
<Option_PregnancyFromBaseRJW_Label>RJW 기본 임신 사용</Option_PregnancyFromBaseRJW_Label>
<Option_PregnancyFromMultiplePregnancy_Label>생리 모드 다중 임신 사용</Option_PregnancyFromMultiplePregnancy_Label>
<Option_PregnancyFromBiotech_Label>바이오테크 임신 사용</Option_PregnancyFromBiotech_Label>
<Button_ResetToDefault>기본값으로 재설정</Button_ResetToDefault>
<Gizmo_GatherCum>정액 모으기</Gizmo_GatherCum>
<FloatMenu_CleanSelf>질세척</FloatMenu_CleanSelf> <FloatMenu_CleanSelf>질세척</FloatMenu_CleanSelf>
<CustomHybrid_List_Title>사용자 지정 잡종 편집기</CustomHybrid_List_Title> <CustomHybrid_List_Title>사용자 지정 잡종 편집기</CustomHybrid_List_Title>
<CustomHybrid_Title>{0}의 잡종설정</CustomHybrid_Title> <CustomHybrid_Title>{0}의 잡종설정</CustomHybrid_Title>
<CustomHybrid_Tooltip>{0}이(가) {1}와(과) 교미했을 때, {2}이(가) {3}의 확률로 태어납니다.&#10;만약 두 종족이 서로에 대한 잡종 정의가 있을경우 아버지 쪽의 정의가 우선적으로 사용됩니다.</CustomHybrid_Tooltip> <CustomHybrid_Tooltip>{0}이(가) {1}와(과) 교미했을 때, {2}이(가) {3}의 확률로 태어납니다.
만약 두 종족이 서로에 대한 잡종 정의가 있을경우 아버지 쪽의 정의가 우선적으로 사용됩니다.</CustomHybrid_Tooltip>
</LanguageData> <CannotNoEggs>난자 없음</CannotNoEggs>
</LanguageData>

View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<Patch>
<Operation Class="PatchOperationFindMod">
<mods>
<li>Alpha Genes</li>
</mods>
<match Class="PatchOperationAddModExtension">
<xpath>/Defs/GeneDef[defName="AG_EggLaying"]</xpath>
<value>
<li Class="RJW_Menstruation.MenstruationModExtension">
<disableCycle>true</disableCycle>
</li>
</value>
</match>
</Operation>
<Operation Class="PatchOperationFindMod">
<mods>
<li>Vanilla Races Expanded - Saurid</li>
</mods>
<match Class="PatchOperationAddModExtension">
<xpath>/Defs/GeneDef[defName="VRESaurids_Oviparous"]</xpath>
<value>
<li Class="RJW_Menstruation.MenstruationModExtension">
<disableCycle>true</disableCycle>
</li>
</value>
</match>
</Operation>
<Operation Class="PatchOperationFindMod">
<mods>
<li>Vanilla Races Expanded - Phytokin</li>
</mods>
<match Class="PatchOperationAddModExtension">
<xpath>/Defs/GeneDef[defName="VRE_SaplingBirth"]</xpath>
<value>
<li Class="RJW_Menstruation.MenstruationModExtension">
<disableCycle>true</disableCycle>
</li>
</value>
</match>
</Operation>
<Operation Class="PatchOperationFindMod">
<mods>
<li>Erin's Corvyia</li>
</mods>
<match Class="PatchOperationAddModExtension">
<xpath>/Defs/GeneDef[defName="ERN_EggLayer"]</xpath>
<value>
<li Class="RJW_Menstruation.MenstruationModExtension">
<disableCycle>true</disableCycle>
</li>
</value>
</match>
</Operation>
<Operation Class="PatchOperationFindMod">
<mods>
<li>Outland - Genetics</li>
</mods>
<match Class="PatchOperationAddModExtension">
<xpath>/Defs/GeneDef[defName="Outland_EggLayer"]</xpath>
<value>
<li Class="RJW_Menstruation.MenstruationModExtension">
<disableCycle>true</disableCycle>
</li>
</value>
</match>
</Operation>
</Patch>

View File

@ -144,11 +144,5 @@
</li> </li>
</comps> </comps>
</value> </value>
</Operation> </Operation>
</Patch> </Patch>

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,5 +1,4 @@
using AlienRace; using AlienRace;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using Verse; using Verse;

View File

@ -21,7 +21,7 @@ namespace RJW_Menstruation
public const int ColonistTickIntervalDefault = GenDate.TicksPerHour; public const int ColonistTickIntervalDefault = GenDate.TicksPerHour;
public const int NonColonistTickIntervalDefault = GenDate.TicksPerHour; public const int NonColonistTickIntervalDefault = GenDate.TicksPerHour;
public const int AnimalTickIntervalDefault = GenDate.TicksPerHour; public const int AnimalTickIntervalDefault = GenDate.TicksPerHour;
public const int TickIntervalMinimum = 20; public const int TickIntervalMinimum = GenTicks.TicksPerRealSecond / 3;
public const int TickIntervalMaximum = 4 * GenDate.TicksPerHour; public const int TickIntervalMaximum = 4 * GenDate.TicksPerHour;
public const float EnzygoticTwinsChanceDefault = 0.002f; public const float EnzygoticTwinsChanceDefault = 0.002f;
public const int EnzygoticTwinsChanceAdjustDefault = 2; public const int EnzygoticTwinsChanceAdjustDefault = 2;

View File

@ -1,7 +1,6 @@
using RimWorld; using RimWorld;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Text; using System.Text;
using UnityEngine; using UnityEngine;
using Verse; using Verse;

View File

@ -1,5 +1,4 @@
using RimWorld; using RimWorld;
using rjw;
using System.Collections.Generic; using System.Collections.Generic;
using Verse; using Verse;

View File

@ -109,5 +109,7 @@ namespace RJW_Menstruation
if (curStage == Stage.Luteal && !hadOvulatoryStage) return false; if (curStage == Stage.Luteal && !hadOvulatoryStage) return false;
else return base.ShouldBeInEstrus(); else return base.ShouldBeInEstrus();
} }
protected override float RandomOvulationChance => 0;
} }
} }

View File

@ -123,11 +123,10 @@ namespace RJW_Menstruation
protected string customwombtex = null; protected string customwombtex = null;
protected string customvagtex = null; protected string customvagtex = null;
protected bool estrusflag = false; protected bool estrusflag = false;
protected float ovulationChanceCache = -1.0f; // Dirtied every simulation protected float? ovulationChanceCache = null; // Dirtied every simulation
protected float implantationChanceCache = -1.0f; protected float? implantationChanceCache = null;
protected int opcache = -1; protected int opcache = -1;
protected float antisperm = 0.0f; protected float antisperm = 0.0f;
protected float? originvagsize = null;
// RJW pregnancy, or Biotech pregnancy/labor/laborpushing // RJW pregnancy, or Biotech pregnancy/labor/laborpushing
protected Hediff pregnancy = null; protected Hediff pregnancy = null;
@ -179,7 +178,8 @@ namespace RJW_Menstruation
public float HoursBetweenSimulations => (float)TickInterval / GenDate.TicksPerHour; public float HoursBetweenSimulations => (float)TickInterval / GenDate.TicksPerHour;
public Hediff Pregnancy { public Hediff Pregnancy
{
get get
{ {
if (pregnancy == null) return null; if (pregnancy == null) return null;
@ -255,11 +255,11 @@ namespace RJW_Menstruation
public float TotalCum public float TotalCum
{ {
get => cums?.Sum(cum => cum.Volume) ?? 0; get => cums?.Sum(cum => cum.Volume) ?? 0;
} }
public float TotalFertCum public float TotalFertCum
{ {
get => cums?.Sum(cum => cum.FertVolume) ?? 0; get => cums?.Where(cum => CumCanFertilize(cum)).Sum(cum => cum.FertVolume) ?? 0;
} }
public float TotalCumPercent public float TotalCumPercent
{ {
@ -289,7 +289,7 @@ namespace RJW_Menstruation
private bool calculatingOvulationChance = false; private bool calculatingOvulationChance = false;
public bool CalculatingOvulationChance { get => calculatingOvulationChance; } public bool CalculatingOvulationChance { get => calculatingOvulationChance; }
protected float CalculatedOvulationChance() private float CalculatedOvulationChance()
{ {
float ovulationChance = 1.0f; float ovulationChance = 1.0f;
if (EggHealth <= 0.0f) return 0.0f; if (EggHealth <= 0.0f) return 0.0f;
@ -315,19 +315,20 @@ namespace RJW_Menstruation
return ovulationChance; return ovulationChance;
} }
protected float CalculatedImplantChance() private float CalculatedImplantChance()
{ {
if (ModsConfig.BiotechActive && xxx.is_human(Pawn)) if (ModsConfig.BiotechActive && xxx.is_human(Pawn))
{ {
// Implant factor will be based solely on pawn age, plus any rollover from ovulation chance // Implant factor will be based solely on pawn age, plus any rollover from ovulation chance
float factor = 1.0f; float factor = 1.0f;
StatDefOf.Fertility.GetStatPart<StatPart_FertilityByGenderAge>()?.TransformValue(StatRequest.For(Pawn), ref factor); StatDefOf.Fertility.GetStatPart<StatPart_FertilityByGenderAge>()?.TransformValue(StatRequest.For(Pawn), ref factor);
if (factor <= 0.0f) return 0.0f;
if (OvulationChance > 1.0f) factor *= OvulationChance; if (OvulationChance > 1.0f) factor *= OvulationChance;
return Props.baseImplantationChanceFactor * FertilityModifier * factor; return Props.baseImplantationChanceFactor * FertilityModifier * factor;
} }
else else
{ {
return Pawn.health.capacities.GetLevel(xxx.reproduction) * Props.baseImplantationChanceFactor * FertilityModifier; return Pawn.health.capacities.GetLevel(xxx.reproduction) * Props.baseImplantationChanceFactor * FertilityModifier * (Pawn.IsBreeder() ? 10.0f : 1.0f);
} }
} }
@ -335,8 +336,8 @@ namespace RJW_Menstruation
{ {
get get
{ {
if (ovulationChanceCache < 0.0f) ovulationChanceCache = CalculatedOvulationChance(); if (ovulationChanceCache == null) ovulationChanceCache = CalculatedOvulationChance();
return ovulationChanceCache; return ovulationChanceCache.Value;
} }
} }
@ -345,8 +346,8 @@ namespace RJW_Menstruation
{ {
get get
{ {
if (implantationChanceCache < 0.0f) implantationChanceCache = CalculatedImplantChance(); if (implantationChanceCache == null) implantationChanceCache = CalculatedImplantChance();
return implantationChanceCache; return implantationChanceCache.Value;
} }
} }
@ -356,7 +357,7 @@ namespace RJW_Menstruation
{ {
if (cums.NullOrEmpty()) yield return Translations.Info_noCum; if (cums.NullOrEmpty()) yield return Translations.Info_noCum;
else foreach (Cum cum in cums) else foreach (Cum cum in cums)
yield return string.Format("{0}: {1:0.##}ml", cum.notcum ? cum.notcumLabel : cum.pawn?.Label, cum.Volume); yield return string.Format("{0}: {1:0.##}ml", cum.notcum ? cum.notcumLabel : cum.pawn?.Label, cum.Volume);
} }
} }
public Color GetCumMixtureColor public Color GetCumMixtureColor
@ -563,19 +564,6 @@ namespace RJW_Menstruation
} }
} }
public float OriginVagSize
{
get
{
if (originvagsize == null)
{
originvagsize = parent.Severity;
}
return originvagsize ?? 0.1f;
}
set => originvagsize = value;
}
public int CurStageIntervalTicks public int CurStageIntervalTicks
{ {
get => currentIntervalTicks; get => currentIntervalTicks;
@ -608,7 +596,7 @@ namespace RJW_Menstruation
else if (Pawn.story?.bodyType == BodyTypeDefOf.Female) discoveryTime = 0.35f; 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 // 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 * GenDate.HoursPerDay));
return GenMath.LerpDouble(0, discoveryTime, lutealProgressWhenImplanted, 1.0f, pregnancy.Severity); return GenMath.LerpDouble(0, discoveryTime, lutealProgressWhenImplanted, 1.0f, pregnancy.Severity);
} }
} }
@ -656,7 +644,6 @@ namespace RJW_Menstruation
Scribe_Values.Look(ref ovarypower, "ovarypower", ovarypower, true); Scribe_Values.Look(ref ovarypower, "ovarypower", ovarypower, true);
Scribe_Values.Look(ref eggstack, "eggstack", 0); Scribe_Values.Look(ref eggstack, "eggstack", 0);
Scribe_Values.Look(ref estrusflag, "estrusflag", false); Scribe_Values.Look(ref estrusflag, "estrusflag", false);
Scribe_Values.Look(ref originvagsize, "originvagsize", originvagsize, true);
Scribe_Values.Look(ref DoCleanWomb, "DoCleanWomb", false); Scribe_Values.Look(ref DoCleanWomb, "DoCleanWomb", false);
Scribe_References.Look(ref pregnancy, "pregnancy"); Scribe_References.Look(ref pregnancy, "pregnancy");
if (Scribe.mode == LoadSaveMode.PostLoadInit) if (Scribe.mode == LoadSaveMode.PostLoadInit)
@ -679,23 +666,18 @@ namespace RJW_Menstruation
ovulationFactor = 1f; ovulationFactor = 1f;
noBleeding = false; noBleeding = false;
opcache = -1; opcache = -1;
if (Pawn.genes == null || !ModsConfig.BiotechActive) return; if (Pawn.genes == null || !ModsConfig.BiotechActive) return;
foreach (MenstruationModExtension extension in Pawn.genes.GenesListForReading.Select(gene => gene.def.GetModExtension<MenstruationModExtension>()).Where(ext => ext != null))
foreach (GeneDef geneDef in Pawn.genes.GenesListForReading.Select(gene => gene.def))
{ {
if (geneDef == VariousDefOf.ShortEggLifetime) eggLifeSpanTicks = eggLifeSpanTicks * 3 / 4; eggLifeSpanTicks = (int)(eggLifeSpanTicks * extension.eggLifeTimeFactor);
else if (geneDef == VariousDefOf.DoubleEggLifetime) eggLifeSpanTicks *= 2; if (extension.alwaysEstrus) estrusLevel = EstrusLevel.Visible;
else if (geneDef == VariousDefOf.QuadEggLifetime) eggLifeSpanTicks *= 4; else if (extension.neverEstrus) estrusLevel = EstrusLevel.None;
ovulationFactor *= extension.ovulationFactor;
else if (geneDef == VariousDefOf.NeverEstrus) estrusLevel = EstrusLevel.None; if (extension.noBleeding) noBleeding = true;
else if (geneDef == VariousDefOf.FullEstrus) estrusLevel = EstrusLevel.Visible;
else if (geneDef == VariousDefOf.DoubleOvulation) ovulationFactor = 2f;
else if (geneDef == VariousDefOf.QuadOvulation) ovulationFactor = 4f;
else if (geneDef == VariousDefOf.NoBleeding) noBleeding = true;
} }
if (eggLifeSpanTicks < 0) eggLifeSpanTicks = 0;
if (ovulationFactor < 0f) ovulationFactor = 0f;
} }
public bool ShouldSimulate() public bool ShouldSimulate()
@ -724,7 +706,7 @@ namespace RJW_Menstruation
{ {
if (Pawn.IsHashIntervalTick(recalculateTickInterval)) TickInterval = -1; // Every so often, force TickInterval to be recalculated in case the pawn's status changed. 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 (!ShouldSimulate()) return; if (!ShouldSimulate()) return;
// Initialize immediately if needed, but if there's an error, then don't spam it every tick // Initialize immediately if needed, but if there's an error, then don't spam it every tick
@ -733,7 +715,7 @@ namespace RJW_Menstruation
Log.Warning($"{Pawn}'s womb is ticking, but was not initialized first"); Log.Warning($"{Pawn}'s womb is ticking, but was not initialized first");
Initialize(); Initialize();
} }
if (initError) Log.Warning($"Attempting to process {Pawn}'s womb uninitialized"); if (initError) Log.Warning($"Attempting to process {Pawn}'s womb uninitialized");
if (Pregnancy != null && curStage != Stage.Pregnant) if (Pregnancy != null && curStage != Stage.Pregnant)
@ -743,7 +725,7 @@ namespace RJW_Menstruation
} }
BeforeSimulator(); BeforeSimulator();
if (ShouldBeInfertile()) GoNextStage(Stage.Infertile); if (ShouldBeInfertile()) GoNextStage(Stage.Infertile);
switch (curStage) switch (curStage)
{ {
@ -820,7 +802,7 @@ namespace RJW_Menstruation
tip.Append(": "); tip.Append(": ");
tip.Append(GetCurStageLabel); tip.Append(GetCurStageLabel);
string fertInfo = GetFertilizingInfo; string fertInfo = GetFertilizingInfo;
if(CurrentVisibleStage == Stage.Luteal && fertInfo.Length > 0) if (CurrentVisibleStage == Stage.Luteal && fertInfo.Length > 0)
{ {
tip.AppendLine(); tip.AppendLine();
tip.Append(fertInfo); tip.Append(fertInfo);
@ -831,7 +813,7 @@ namespace RJW_Menstruation
protected virtual int TicksToNextStage() protected virtual int TicksToNextStage()
{ {
return Math.Max(0,(currentIntervalTicks - curStageTicks) / Configurations.CycleAcceleration); return Math.Max(0, (currentIntervalTicks - curStageTicks) / Configurations.CycleAcceleration);
} }
public override string CompDebugString() public override string CompDebugString()
@ -1176,7 +1158,7 @@ namespace RJW_Menstruation
if (cycleSpeed < 0f) cycleSpeed = Utility.RandGaussianLike(0.8f, 1.2f); if (cycleSpeed < 0f) cycleSpeed = Utility.RandGaussianLike(0.8f, 1.2f);
if (cycleVariability < 0f) cycleVariability = MenstruationUtility.RandomVariabilityPercent(); if (cycleVariability < 0f) cycleVariability = MenstruationUtility.RandomVariabilityPercent();
InitOvary(); InitOvary();
if (currentIntervalTicks < 0) if (currentIntervalTicks < 0)
@ -1284,8 +1266,8 @@ namespace RJW_Menstruation
protected virtual void BeforeSimulator() protected virtual void BeforeSimulator()
{ {
ovulationChanceCache = -1.0f; ovulationChanceCache = null;
implantationChanceCache = -1.0f; implantationChanceCache = null;
CumOut(); CumOut();
} }
@ -1353,10 +1335,18 @@ namespace RJW_Menstruation
} }
} }
public bool CumCanFertilize(Cum cum)
{
return !cum.notcum &&
cum.FertVolume > 0 &&
!(cum.pawn?.Destroyed ?? true) &&
(RJWPregnancySettings.bestial_pregnancy_enabled || xxx.is_animal(Pawn) == xxx.is_animal(cum.pawn));
}
protected Pawn Fertilize() protected Pawn Fertilize()
{ {
if (cums.NullOrEmpty()) return null; if (cums.NullOrEmpty()) return null;
List<Cum> eligibleCum = cums.FindAll(cum => !cum.notcum && cum.FertVolume > 0 && cum.pawn != null && (RJWPregnancySettings.bestial_pregnancy_enabled || xxx.is_animal(Pawn) == xxx.is_animal(cum.pawn))); List<Cum> eligibleCum = cums.FindAll(cum => CumCanFertilize(cum));
if (eligibleCum.Count == 0) return null; if (eligibleCum.Count == 0) return null;
float totalFertPower = eligibleCum.Sum(cum => cum.FertVolume); float totalFertPower = eligibleCum.Sum(cum => cum.FertVolume);
@ -1364,7 +1354,7 @@ namespace RJW_Menstruation
//float fertFailChancePerHour = Mathf.Pow(1.0f - Configurations.FertilizeChance, totalFertPower * Props.basefertilizationChanceFactor); //float fertFailChancePerHour = Mathf.Pow(1.0f - Configurations.FertilizeChance, totalFertPower * Props.basefertilizationChanceFactor);
//float fertFailChancePerInterval = Mathf.Pow(fertFailChancePerHour, (float)TickInterval / GenDate.TicksPerHour); //float fertFailChancePerInterval = Mathf.Pow(fertFailChancePerHour, (float)TickInterval / GenDate.TicksPerHour);
float fertFailChancePerInterval = Mathf.Pow(1.0f - Configurations.FertilizeChance, totalFertPower * Props.basefertilizationChanceFactor * HoursBetweenSimulations); float fertFailChancePerInterval = Mathf.Pow(1.0f - Configurations.FertilizeChance, totalFertPower * Props.basefertilizationChanceFactor * HoursBetweenSimulations);
if (Rand.Chance(fertFailChancePerInterval)) return null; if (Rand.Chance(fertFailChancePerInterval)) return null;
Pawn.records.AddTo(VariousDefOf.AmountofFertilizedEggs, 1); Pawn.records.AddTo(VariousDefOf.AmountofFertilizedEggs, 1);
@ -1494,7 +1484,7 @@ namespace RJW_Menstruation
float interspeciesFactor = InterspeciesImplantFactor(egg.fertilizer); float interspeciesFactor = InterspeciesImplantFactor(egg.fertilizer);
float implantChance = Configurations.ImplantationChance * ImplantChance * interspeciesFactor; float implantChance = Configurations.ImplantationChance * ImplantChance * interspeciesFactor;
Log.Message($"Fertilized egg of {Pawn} failed to implant (chance {implantChance.ToStringPercent()}, " + Log.Message($"Fertilized egg of {Pawn} failed to implant (chance {implantChance.ToStringPercent()}, " +
(interspeciesFactor < 1.0f ? $"interspecies factor {interspeciesFactor.ToStringPercent()}, " : "" ) + (interspeciesFactor < 1.0f ? $"interspecies factor {interspeciesFactor.ToStringPercent()}, " : "") +
$"father {egg.fertilizer})"); $"father {egg.fertilizer})");
} }
deadeggs.Add(egg); deadeggs.Add(egg);
@ -1525,7 +1515,7 @@ namespace RJW_Menstruation
protected void BleedOut() protected void BleedOut()
{ {
// ~1.5 per hour times acceleration // ~1.5 per hour times acceleration
float bledAmount = 0.03f * Configurations.BleedingAmount * Configurations.CycleAcceleration * Rand.Range(0.5f, 1.5f) * HoursBetweenSimulations; float bledAmount = Utility.VariationRange(0.03f * Configurations.BleedingAmount * Configurations.CycleAcceleration * HoursBetweenSimulations, 0.5f);
CumIn(Pawn, bledAmount, Translations.Menstrual_Blood, -5.0f, Pawn.RaceProps?.BloodDef ?? ThingDefOf.Filth_Blood); CumIn(Pawn, bledAmount, Translations.Menstrual_Blood, -5.0f, Pawn.RaceProps?.BloodDef ?? ThingDefOf.Filth_Blood);
Cum blood = GetNotCum(Translations.Menstrual_Blood); Cum blood = GetNotCum(Translations.Menstrual_Blood);
if (blood != null) blood.Color = BloodColor; if (blood != null) blood.Color = BloodColor;
@ -1580,9 +1570,6 @@ namespace RJW_Menstruation
return amount; return amount;
} }
protected void EggDecay() protected void EggDecay()
{ {
HashSet<Egg> deadeggs = new HashSet<Egg>(); HashSet<Egg> deadeggs = new HashSet<Egg>();
@ -1602,7 +1589,7 @@ namespace RJW_Menstruation
protected void AddCrampPain() protected void AddCrampPain()
{ {
Hediff hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_MenstrualCramp, Pawn); Hediff hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_MenstrualCramp, Pawn);
hediff.Severity = crampPain * Rand.Range(0.9f, 1.1f); hediff.Severity = Utility.VariationRange(crampPain, 0.1f);
HediffCompProperties_SeverityPerDay Prop = (HediffCompProperties_SeverityPerDay)hediff.TryGetComp<HediffComp_SeverityPerDay>().props; HediffCompProperties_SeverityPerDay Prop = (HediffCompProperties_SeverityPerDay)hediff.TryGetComp<HediffComp_SeverityPerDay>().props;
Prop.severityPerDay = -hediff.Severity / (currentIntervalTicks / GenDate.TicksPerDay) * Configurations.CycleAcceleration; Prop.severityPerDay = -hediff.Severity / (currentIntervalTicks / GenDate.TicksPerDay) * Configurations.CycleAcceleration;
Pawn.health.AddHediff(hediff, parent.Part); Pawn.health.AddHediff(hediff, parent.Part);
@ -1659,7 +1646,7 @@ namespace RJW_Menstruation
eggnum = 1f; eggnum = 1f;
} }
eggnum *= ovulationFactor; eggnum *= ovulationFactor;
int toOvulate = (int)eggnum + eggstack; int toOvulate = Math.Max(1, (int)eggnum + eggstack);
int ovulated = 0; int ovulated = 0;
for (int i = 0; i < toOvulate; i++) for (int i = 0; i < toOvulate; i++)
@ -1670,7 +1657,7 @@ namespace RJW_Menstruation
} }
ovarypower -= ovulated; ovarypower -= ovulated;
eggstack = 0; eggstack = 0;
if (Configurations.Debug && ovulated != toOvulate) if (Configurations.Debug && ovulated < toOvulate)
Log.Message($"{Pawn} ovulated {ovulated}/{toOvulate} eggs ({OvulationChance.ToStringPercent()} chance)"); Log.Message($"{Pawn} ovulated {ovulated}/{toOvulate} eggs ({OvulationChance.ToStringPercent()} chance)");
GoNextStage(Stage.Luteal); GoNextStage(Stage.Luteal);
@ -1817,10 +1804,10 @@ namespace RJW_Menstruation
} }
else pawnMemories.TryGainMemory(VariousDefOf.CameInsideFFetish, cummer); else pawnMemories.TryGainMemory(VariousDefOf.CameInsideFFetish, cummer);
} }
else if (Pawn.relations.OpinionOf(cummer) <= -5) else if (Pawn.relations.OpinionOf(cummer) <= -5)
pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideF, cummer); pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideF, cummer);
else if (Pawn.IsInEstrus() && Pawn.relations.OpinionOf(cummer) < RJWHookupSettings.MinimumRelationshipToHookup) else if (Pawn.IsInEstrus() && Pawn.relations.OpinionOf(cummer) < RJWHookupSettings.MinimumRelationshipToHookup)
pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideFEstrus, cummer); pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideFEstrus, cummer);
else if (!Pawn.relations.DirectRelationExists(PawnRelationDefOf.Spouse, cummer) && !Pawn.relations.DirectRelationExists(PawnRelationDefOf.Fiance, cummer)) else if (!Pawn.relations.DirectRelationExists(PawnRelationDefOf.Spouse, cummer) && !Pawn.relations.DirectRelationExists(PawnRelationDefOf.Fiance, cummer))
{ {
if (Pawn.health.capacities.GetLevel(xxx.reproduction) < 0.50f) pawnMemories.TryGainMemory(VariousDefOf.CameInsideFLowFert, cummer); if (Pawn.health.capacities.GetLevel(xxx.reproduction) < 0.50f) pawnMemories.TryGainMemory(VariousDefOf.CameInsideFLowFert, cummer);
@ -1881,15 +1868,15 @@ namespace RJW_Menstruation
switch (stage) switch (stage)
{ {
case Stage.Follicular: case Stage.Follicular:
return (int)(Props.follicularIntervalDays * GenDate.TicksPerDay * (1 + Rand.Range(-cycleVariability, cycleVariability) * 1.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 1.5f)); return (int)(Utility.VariationRange(Props.follicularIntervalDays * GenDate.TicksPerDay, cycleVariability * 1.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 1.5f));
case Stage.Ovulatory: case Stage.Ovulatory:
return Props.ovulationIntervalHours * GenDate.TicksPerHour; // No variability for now return Props.ovulationIntervalHours * GenDate.TicksPerHour; // No variability for now
case Stage.Luteal: case Stage.Luteal:
return (int)(Props.lutealIntervalDays * GenDate.TicksPerDay * (1 + Rand.Range(-cycleVariability, cycleVariability) * 0.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 0.5f)); return (int)(Utility.VariationRange(Props.lutealIntervalDays * GenDate.TicksPerDay, cycleVariability * 0.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 0.5f));
case Stage.Bleeding: case Stage.Bleeding:
return (int)(Props.bleedingIntervalDays * GenDate.TicksPerDay * (1 + Rand.Range(-cycleVariability, cycleVariability) * 0.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 0.5f)); return (int)(Utility.VariationRange(Props.bleedingIntervalDays * GenDate.TicksPerDay, cycleVariability * 0.5f * variabilityFactor) / (1 + (cycleSpeed - 1) * 0.5f));
case Stage.Recover: case Stage.Recover:
return (int)(Props.recoveryIntervalDays * GenDate.TicksPerDay * Rand.Range(0.95f, 1.05f)); return (int)Utility.VariationRange(Props.recoveryIntervalDays * GenDate.TicksPerDay, 0.05f);
case Stage.Pregnant: case Stage.Pregnant:
return (int)(MenstruationUtility.GestationHours(pregnancy) * GenDate.TicksPerHour); return (int)(MenstruationUtility.GestationHours(pregnancy) * GenDate.TicksPerHour);
default: default:
@ -1917,10 +1904,13 @@ namespace RJW_Menstruation
else return Rand.Range(0.6f, 1.0f); else return Rand.Range(0.6f, 1.0f);
} }
protected virtual float RandomOvulationChance => (float)Props.ovulationIntervalHours / GenDate.HoursPerDay;
protected Stage RandomStage() protected Stage RandomStage()
{ {
Stage stage = Rand.ElementByWeight( Stage stage = Rand.ElementByWeight(
Stage.Follicular, Props.follicularIntervalDays - Props.bleedingIntervalDays, Stage.Follicular, Props.follicularIntervalDays - Props.bleedingIntervalDays,
Stage.Ovulatory, RandomOvulationChance,
Stage.Luteal, Props.lutealIntervalDays, Stage.Luteal, Props.lutealIntervalDays,
Stage.Bleeding, Props.bleedingIntervalDays); Stage.Bleeding, Props.bleedingIntervalDays);
@ -1929,6 +1919,9 @@ namespace RJW_Menstruation
case Stage.Follicular: case Stage.Follicular:
curStageTicks = Rand.Range(0, (Props.follicularIntervalDays - Props.bleedingIntervalDays) * GenDate.TicksPerDay); curStageTicks = Rand.Range(0, (Props.follicularIntervalDays - Props.bleedingIntervalDays) * GenDate.TicksPerDay);
break; break;
case Stage.Ovulatory:
curStageTicks = Rand.Range(0, Props.ovulationIntervalHours * GenDate.TicksPerHour);
break;
case Stage.Luteal: case Stage.Luteal:
curStageTicks = Rand.Range(0, Props.lutealIntervalDays * GenDate.TicksPerDay); curStageTicks = Rand.Range(0, Props.lutealIntervalDays * GenDate.TicksPerDay);
break; break;
@ -2029,28 +2022,6 @@ namespace RJW_Menstruation
public class HediffComp_Anus : HediffComp public class HediffComp_Anus : HediffComp
{ {
protected float? originanussize; public CompProperties_Anus Props => (CompProperties_Anus)props;
public float OriginAnusSize
{
get
{
if (originanussize == null)
{
originanussize = parent.Severity;
}
return originanussize ?? 0.1f;
}
}
public override void CompExposeData()
{
base.CompExposeData();
Scribe_Values.Look(ref originanussize, "originanussize", originanussize, true);
}
public override void CompPostTick(ref float severityAdjustment)
{
}
} }
} }

View File

@ -1,5 +1,4 @@
using RimWorld; using RimWorld;
using System.Linq;
using Verse; using Verse;
namespace RJW_Menstruation namespace RJW_Menstruation
@ -29,14 +28,14 @@ namespace RJW_Menstruation
protected override void InitializeExtraValues() protected override void InitializeExtraValues()
{ {
base.InitializeExtraValues(); base.InitializeExtraValues();
if (averageCycleIntervalTicks < 0) if (averageCycleIntervalTicks < 0)
{ {
averageCycleIntervalTicks = (int)(Props.cycleIntervalDays.RandomInRange * GenDate.TicksPerDay / cycleSpeed); averageCycleIntervalTicks = (int)(Props.cycleIntervalDays.RandomInRange * GenDate.TicksPerDay / cycleSpeed);
if (ticksToNextCycle < -50000) if (ticksToNextCycle < -50000)
ticksToNextCycle = Rand.Range(0, averageCycleIntervalTicks); ticksToNextCycle = Rand.Range(0, averageCycleIntervalTicks);
// Make the cutoff halfway into cycle, just to be sure there isn't a double-cycle the first time // 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) if ((curStage == Stage.Follicular || curStage == Stage.Ovulatory || curStage == Stage.Luteal || curStage == Stage.Bleeding)
&& (averageCycleIntervalTicks - ticksToNextCycle) / 2 >= GenDate.TicksPerDay * (Props.follicularIntervalDays + Props.lutealIntervalDays) / cycleSpeed) && (averageCycleIntervalTicks - ticksToNextCycle) / 2 >= GenDate.TicksPerDay * (Props.follicularIntervalDays + Props.lutealIntervalDays) / cycleSpeed)
GoNextStage(Stage.Anestrus); GoNextStage(Stage.Anestrus);
} }
@ -99,14 +98,14 @@ namespace RJW_Menstruation
base.PregnantAction(); base.PregnantAction();
if (curStage != Stage.Pregnant) if (curStage != Stage.Pregnant)
// Go halfway into the cycle // Go halfway into the cycle
ticksToNextCycle = (int)(averageCycleIntervalTicks * (1 + Rand.Range(-cycleVariability, cycleVariability))) / 2; ticksToNextCycle = (int)Utility.VariationRange(averageCycleIntervalTicks, cycleVariability) / 2;
} }
protected override void AnestrusAction() protected override void AnestrusAction()
{ {
if (ticksToNextCycle <= 0 && IsBreedingSeason()) if (ticksToNextCycle <= 0 && IsBreedingSeason())
{ {
ticksToNextCycle = (int)(averageCycleIntervalTicks * (1 + Rand.Range(-cycleVariability, cycleVariability))); ticksToNextCycle = (int)Utility.VariationRange(averageCycleIntervalTicks, cycleVariability);
GoNextStage(Stage.Follicular); GoNextStage(Stage.Follicular);
} }
} }

View File

@ -1,6 +1,7 @@
 
using RimWorld; using RimWorld;
using RimWorld.Planet;
using rjw; using rjw;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -46,6 +47,8 @@ namespace RJW_Menstruation
protected IEnumerable<Pawn> AffectedPawns() protected IEnumerable<Pawn> AffectedPawns()
{ {
if(Pawn.GetCaravan() is Caravan caravan)
foreach (Pawn p in caravan.PawnsListForReading.Where(p => p != Pawn)) yield return p;
Map mapHeld = Pawn.MapHeld; Map mapHeld = Pawn.MapHeld;
if (mapHeld == null) yield break; if (mapHeld == null) yield break;
foreach (Pawn pawn in mapHeld.mapPawns.AllPawnsSpawned) foreach (Pawn pawn in mapHeld.mapPawns.AllPawnsSpawned)

View File

@ -1,5 +1,4 @@
using HarmonyLib; using HarmonyLib;
using Mono.Cecil.Cil;
using RimWorld; using RimWorld;
using rjw; using rjw;
using System; using System;
@ -203,7 +202,7 @@ namespace RJW_Menstruation
if (comp?.HasBaby ?? false) if (comp?.HasBaby ?? false)
{ {
OutcomeChance thisOutcome = outcome; OutcomeChance thisOutcome = outcome;
Precept_Ritual precept_Ritual = (Precept_Ritual)comp.Pawn.Ideo.GetPrecept(PreceptDefOf.ChildBirth); Precept_Ritual precept_Ritual = (Precept_Ritual)comp.Pawn.Ideo.GetPrecept(RimWorld.PreceptDefOf.ChildBirth);
float birthQuality = PregnancyUtility.GetBirthQualityFor(mother); float birthQuality = PregnancyUtility.GetBirthQualityFor(mother);
do do
{ {

View File

@ -1,14 +1,10 @@
using RimWorld; using RimWorld;
using RimWorld.Planet;
using rjw; using rjw;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.Linq; using System.Linq;
using System.Text;
using UnityEngine; using UnityEngine;
using Verse; using Verse;
using Verse.AI;
namespace RJW_Menstruation namespace RJW_Menstruation
{ {
@ -141,7 +137,7 @@ namespace RJW_Menstruation
else if (gestationProgress < 0.8f) icon = fetustex + "04"; else if (gestationProgress < 0.8f) icon = fetustex + "04";
else icon = fetustex + "05"; else icon = fetustex + "05";
return TryGetTwinsIcon(icon, babycount) ?? ContentFinder<Texture2D>.Get((icon), true); return TryGetTwinsIcon(icon, babycount) ?? ContentFinder<Texture2D>.Get(icon, true);
} }
public static Texture2D TryGetTwinsIcon(string path, int babycount) public static Texture2D TryGetTwinsIcon(string path, int babycount)
@ -160,7 +156,7 @@ namespace RJW_Menstruation
List<Hediff_InsectEgg> insectEggs = new List<Hediff_InsectEgg>(); List<Hediff_InsectEgg> insectEggs = new List<Hediff_InsectEgg>();
comp.Pawn.health.hediffSet.GetHediffs(ref insectEggs); comp.Pawn.health.hediffSet.GetHediffs(ref insectEggs);
if (!insectEggs.NullOrEmpty() && insectEggs.Sum(hediff => hediff.eggssize) > 1.0f) return null; // same logic as "Stuffed" in GetInsectEggedIcon if (insectEggs?.Sum(hediff => hediff.eggssize) > 1.0f) return null; // same logic as "Stuffed" in GetInsectEggedIcon
string icon = comp.WombTex; string icon = comp.WombTex;
float cumpercent = comp.TotalCumPercent; float cumpercent = comp.TotalCumPercent;
@ -183,7 +179,7 @@ namespace RJW_Menstruation
else if (cumpercent < 0.89f) icon += "_Cum_15"; else if (cumpercent < 0.89f) icon += "_Cum_15";
else if (cumpercent < 0.95f) icon += "_Cum_16"; else if (cumpercent < 0.95f) icon += "_Cum_16";
else icon += "_Cum_17"; else icon += "_Cum_17";
Texture2D cumtex = ContentFinder<Texture2D>.Get((icon), true); Texture2D cumtex = ContentFinder<Texture2D>.Get(icon, true);
return cumtex; return cumtex;
} }
public static Texture2D GetInsectEggedIcon(this HediffComp_Menstruation comp) public static Texture2D GetInsectEggedIcon(this HediffComp_Menstruation comp)
@ -306,15 +302,13 @@ namespace RJW_Menstruation
} }
public static Texture2D GetGenitalIcon(this Pawn pawn, HediffComp_Menstruation comp, bool drawOrigin = false) public static Texture2D GetGenitalIcon(this Pawn pawn, HediffComp_Menstruation comp)
{ {
Hediff hediff = comp?.parent; Hediff hediff = comp?.parent;
if (hediff == null) return ContentFinder<Texture2D>.Get("Genitals/Vagina00", true); if (hediff == null) return ContentFinder<Texture2D>.Get("Genitals/Vagina00", true);
//HediffComp_Menstruation comp = hediff.GetMenstruationComp(); //HediffComp_Menstruation comp = hediff.GetMenstruationComp();
string icon; string icon;
float severity; float severity = hediff.Severity;
if (drawOrigin) severity = comp.OriginVagSize;
else severity = hediff.Severity;
if (comp != null) icon = comp.VagTex; if (comp != null) icon = comp.VagTex;
else icon = "Genitals/Vagina"; else icon = "Genitals/Vagina";
@ -331,30 +325,18 @@ namespace RJW_Menstruation
else if (severity < 1.01f) icon += "10"; //cavernous else if (severity < 1.01f) icon += "10"; //cavernous
else icon += "11"; //abyssal else icon += "11"; //abyssal
return ContentFinder<Texture2D>.Get((icon), true); return ContentFinder<Texture2D>.Get(icon, true);
} }
public static Texture2D GetAnalIcon(this Pawn pawn, bool drawOrigin = false) public static Texture2D GetAnalIcon(this Pawn pawn)
{ {
Hediff hediff = pawn.health.hediffSet.hediffs.FirstOrDefault(h => VariousDefOf.AllAnuses.Contains(h.def)) ?? Hediff hediff = pawn.health.hediffSet.hediffs.FirstOrDefault(h => VariousDefOf.AllAnuses.Contains(h.def)) ??
pawn.health.hediffSet.hediffs.FirstOrDefault(h => h.def.defName.ToLower().Contains("anus")); pawn.health.hediffSet.hediffs.FirstOrDefault(h => h.def.defName.ToLower().Contains("anus"));
if (hediff == null) return ContentFinder<Texture2D>.Get(("Genitals/Anal00"), true); if (hediff == null) return ContentFinder<Texture2D>.Get("Genitals/Anal00", true);
string icon = ((CompProperties_Anus)hediff.GetAnusComp()?.props)?.analTex ?? "Genitals/Anal";
float severity = hediff.Severity;
string icon;
float severity;
HediffComp_Anus comp = hediff.GetAnusComp();
if (comp != null)
{
CompProperties_Anus Props = (CompProperties_Anus)comp.props;
icon = Props.analTex ?? "Genitals/Anal";
if (drawOrigin) severity = comp.OriginAnusSize;
else severity = hediff.Severity;
}
else
{
icon = "Genitals/Anal";
severity = hediff.Severity;
}
if (severity < 0.20f) icon += "00"; //micro if (severity < 0.20f) icon += "00"; //micro
else if (severity < 0.40f) icon += "01"; //tight else if (severity < 0.40f) icon += "01"; //tight
else if (severity < 0.60f) icon += "02"; //average else if (severity < 0.60f) icon += "02"; //average
@ -362,7 +344,7 @@ namespace RJW_Menstruation
else if (severity < 1.01f) icon += "04"; //cavernous else if (severity < 1.01f) icon += "04"; //cavernous
else icon += "05"; //abyssal else icon += "05"; //abyssal
return ContentFinder<Texture2D>.Get((icon), true); return ContentFinder<Texture2D>.Get(icon, true);
} }
public static float GestationHours(this Hediff hediff) public static float GestationHours(this Hediff hediff)
@ -398,7 +380,8 @@ namespace RJW_Menstruation
if (!Configurations.EnableAnimalCycle && pawn.IsAnimal()) return false; if (!Configurations.EnableAnimalCycle && pawn.IsAnimal()) return false;
if (pawn.GetComp<CompEggLayer>() != null) return false; if (pawn.GetComp<CompEggLayer>() != null) return false;
if (pawn.RaceHasOviPregnancy()) return false; if (pawn.RaceHasOviPregnancy()) return false;
if (ModsConfig.BiotechActive && pawn.genes != null &&
if (ModsConfig.BiotechActive && pawn.genes != null &&
pawn.genes.GenesListForReading.Select(gene => gene.def).Intersect(VariousDefOf.EggLayerGenes).Any()) return false; pawn.genes.GenesListForReading.Select(gene => gene.def).Intersect(VariousDefOf.EggLayerGenes).Any()) return false;
return true; return true;
@ -452,7 +435,7 @@ namespace RJW_Menstruation
if (precept != null) return true; if (precept != null) return true;
else return pawn.IsBreeder() || else return pawn.IsBreeder() ||
pawn.HasImpregnationFetish(); pawn.HasImpregnationFetish();
} }
public static float DamagePants(this Pawn pawn, float fluidAmount) public static float DamagePants(this Pawn pawn, float fluidAmount)

View File

@ -1,5 +1,4 @@
using RimWorld; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using Verse; using Verse;

View File

@ -1,10 +1,7 @@
using RimWorld; using RimWorld;
using rjw; using rjw;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Text;
using Verse; using Verse;
namespace RJW_Menstruation namespace RJW_Menstruation

View File

@ -0,0 +1,15 @@
using Verse;
namespace RJW_Menstruation
{
public class MenstruationModExtension : DefModExtension
{
public float eggLifeTimeFactor = 1.0f;
public bool neverEstrus = false;
public bool alwaysEstrus = false;
public float ovulationFactor = 1.0f;
public bool noBleeding = false;
public bool disableCycle = false;
}
}

View File

@ -1,11 +1,11 @@
using HarmonyLib; using HarmonyLib;
using System.Linq;
using RimWorld; using RimWorld;
using Verse;
using System.Collections.Generic;
using System.Reflection;
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit; using System.Reflection.Emit;
using Verse;
namespace RJW_Menstruation namespace RJW_Menstruation
{ {
@ -195,8 +195,9 @@ namespace RJW_Menstruation
[HarmonyPatch(typeof(Pawn_GeneTracker), "Notify_GenesChanged")] [HarmonyPatch(typeof(Pawn_GeneTracker), "Notify_GenesChanged")]
public class Notify_GenesChanged_Patch public class Notify_GenesChanged_Patch
{ {
public static void Postfix(Pawn_GeneTracker __instance) public static void Postfix(Pawn_GeneTracker __instance, GeneDef addedOrRemovedGene)
{ {
if (!addedOrRemovedGene.HasModExtension<MenstruationModExtension>()) return;
foreach (HediffComp_Menstruation comp in __instance.pawn.GetMenstruationComps()) foreach (HediffComp_Menstruation comp in __instance.pawn.GetMenstruationComps())
comp.Notify_UpdatedGenes(); comp.Notify_UpdatedGenes();
} }

View File

@ -2,7 +2,6 @@
using RimWorld; using RimWorld;
using rjw; using rjw;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Text;
using UnityEngine; using UnityEngine;
using Verse; using Verse;

View File

@ -1,5 +1,4 @@
using AlienRace; using HarmonyLib;
using HarmonyLib;
using rjw; using rjw;
using rjw.Modules.Interactions.Internals.Implementation; using rjw.Modules.Interactions.Internals.Implementation;
using rjw.Modules.Interactions.Rules.PartKindUsageRules; using rjw.Modules.Interactions.Rules.PartKindUsageRules;

View File

@ -1,6 +1,5 @@
using HarmonyLib; using HarmonyLib;
using RimWorld; using RimWorld;
using rjw;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;

View File

@ -20,9 +20,8 @@ namespace RJW_Menstruation
StringBuilder res = new StringBuilder(); StringBuilder res = new StringBuilder();
IEnumerable<Pawn> babiesdistinct = babies.Distinct(new RaceComparer());
int iteration = 0; int iteration = 0;
foreach (Pawn baby in babiesdistinct) foreach (Pawn baby in babies.Distinct(new RaceComparer()))
{ {
int num = babies.Where(x => x.def.Equals(baby.def)).Count(); int num = babies.Where(x => x.def.Equals(baby.def)).Count();
if (iteration > 0) res.Append(", "); if (iteration > 0) res.Append(", ");
@ -43,9 +42,8 @@ namespace RJW_Menstruation
if (!is_parent_known && Configurations.InfoDetail != Configurations.DetailLevel.All) if (!is_parent_known && Configurations.InfoDetail != Configurations.DetailLevel.All)
return res.Append(Translations.Dialog_FatherUnknown).ToString(); return res.Append(Translations.Dialog_FatherUnknown).ToString();
IEnumerable<Pawn> babiesdistinct = babies.Distinct(new FatherComparer(mother));
int iteration = 0; int iteration = 0;
foreach (Pawn baby in babiesdistinct) foreach (Pawn baby in babies.Distinct(new FatherComparer(mother)))
{ {
if (iteration > 0) res.Append(", "); if (iteration > 0) res.Append(", ");
res.Append(Utility.GetFather(baby, mother)?.LabelShort ?? Translations.Dialog_FatherUnknown); res.Append(Utility.GetFather(baby, mother)?.LabelShort ?? Translations.Dialog_FatherUnknown);

View File

@ -74,6 +74,7 @@
<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" />
<Compile Include="MenstruationModExtension.cs" />
<Compile Include="Patch\Biotech_Patch.cs" /> <Compile Include="Patch\Biotech_Patch.cs" />
<Compile Include="Patch\GC_Patch.cs" /> <Compile Include="Patch\GC_Patch.cs" />
<Compile Include="Patch\Gizmo_Patch.cs" /> <Compile Include="Patch\Gizmo_Patch.cs" />
@ -108,10 +109,6 @@
<HintPath>..\..\..\..\..\..\..\..\workshop\content\294100\2830943477\1.4\Assemblies\AnimalGenetics.dll</HintPath> <HintPath>..\..\..\..\..\..\..\..\workshop\content\294100\2830943477\1.4\Assemblies\AnimalGenetics.dll</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="Assembly-CSharp">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="RJW"> <Reference Include="RJW">
<HintPath>..\..\..\..\..\rjw\1.4\Assemblies\RJW.dll</HintPath> <HintPath>..\..\..\..\..\rjw\1.4\Assemblies\RJW.dll</HintPath>
<Private>False</Private> <Private>False</Private>
@ -172,6 +169,9 @@
</BootstrapperPackage> </BootstrapperPackage>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Krafs.Rimworld.Ref">
<Version>1.4.3901</Version>
</PackageReference>
<PackageReference Include="Lib.Harmony"> <PackageReference Include="Lib.Harmony">
<Version>2.2.2</Version> <Version>2.2.2</Version>
<ExcludeAssets>runtime</ExcludeAssets> <ExcludeAssets>runtime</ExcludeAssets>

View File

@ -219,14 +219,14 @@ namespace RJW_Menstruation
public void CheckDirty() public void CheckDirty()
{ {
if (absorbedfluids > this.GetStatValue(VariousDefOf.MaxAbsorbable) && !(Wearer?.apparel?.IsLocked(this) ?? false)) if (absorbedfluids > this.GetStatValue(VariousDefOf.MaxAbsorbable) && !(Wearer?.apparel?.IsLocked(this) ?? false) && DirtyDef != def && DirtyDef != null)
{ {
bool oldHasStats = !def.equippedStatOffsets.NullOrEmpty();
bool newHasStats = !DirtyDef.equippedStatOffsets.NullOrEmpty();
def = DirtyDef; def = DirtyDef;
dirty = true; dirty = true;
OutfitForcedHandler forcedHandler = Wearer.outfits?.forcedHandler; Wearer.outfits?.forcedHandler?.SetForced(this, false);
if (forcedHandler?.IsForced(this) ?? false) if (oldHasStats || newHasStats)
forcedHandler.SetForced(this, false);
if (!def.equippedStatOffsets.NullOrEmpty())
Wearer.health.capacities.Notify_CapacityLevelsDirty(); Wearer.health.capacities.Notify_CapacityLevelsDirty();
Wearer.apparel.Notify_ApparelChanged(); Wearer.apparel.Notify_ApparelChanged();
} }
@ -272,7 +272,7 @@ namespace RJW_Menstruation
public override void DirtyEffect(int tickInterval) public override void DirtyEffect(int tickInterval)
{ {
if (wearTicks > MinHrstoDirtyEffect * GenDate.TicksPerHour && Rand.MTBEventOccurs(100.0f, GenDate.TicksPerHour, tickInterval) && !Wearer.apparel.IsLocked(this)) if (wearTicks > MinHrstoDirtyEffect * GenDate.TicksPerHour && Rand.MTBEventOccurs(100.0f, GenDate.TicksPerHour, tickInterval) && !(Wearer.apparel?.IsLocked(this) ?? false))
{ {
Wearer.health.AddHediff(HediffDefOf.WoundInfection, Genital_Helper.get_genitalsBPR(Wearer)); Wearer.health.AddHediff(HediffDefOf.WoundInfection, Genital_Helper.get_genitalsBPR(Wearer));
} }

View File

@ -227,7 +227,7 @@ namespace RJW_Menstruation
string feinfo = PregnancyCommon.GetBabyInfo(babiescomp?.babies); string feinfo = PregnancyCommon.GetBabyInfo(babiescomp?.babies);
string fainfo = PregnancyCommon.GetFatherInfo(babiescomp?.babies, babiescomp.Pawn, true) + " "; // Keep all parents known, for now string fainfo = PregnancyCommon.GetFatherInfo(babiescomp?.babies, babiescomp.Pawn, true) + " "; // Keep all parents known, for now
if (feinfo == "Null") feinfo = "1 " + p.Mother.def.label + " " + Translations.Dialog_WombInfo02; if (feinfo == "Null") feinfo = "1 " + (p.Mother ?? pawn).def.label + " " + Translations.Dialog_WombInfo02;
if (fainfo == "Null ") if (fainfo == "Null ")
{ {
string father = p.Father?.LabelShort ?? Translations.Dialog_FatherUnknown; string father = p.Father?.LabelShort ?? Translations.Dialog_FatherUnknown;
@ -388,10 +388,9 @@ namespace RJW_Menstruation
Rect genitalIconRect = new Rect(rect.x, rect.y + fontheight, genitalRectWidth, genitalRectHeight); Rect genitalIconRect = new Rect(rect.x, rect.y + fontheight, genitalRectWidth, genitalRectHeight);
Rect genitalVaginaLabelRect = new Rect(rect.x, rect.y + 10f, genitalRectWidth, fontheight); Rect genitalVaginaLabelRect = new Rect(rect.x, rect.y + 10f, genitalRectWidth, fontheight);
Rect genitalAnusLabelRect = new Rect(rect.x, rect.y + fontheight + genitalRectHeight, genitalRectWidth, fontheight); Rect genitalAnusLabelRect = new Rect(rect.x, rect.y + fontheight + genitalRectHeight, genitalRectWidth, fontheight);
bool showOrigin = Mouse.IsOver(genitalIconRect) && Input.GetMouseButton(0);
vagina = pawn.GetGenitalIcon(comp, showOrigin); vagina = pawn.GetGenitalIcon(comp);
anal = pawn.GetAnalIcon(showOrigin); anal = pawn.GetAnalIcon();
GUI.color = new Color(1.00f, 0.47f, 0.47f, 1); GUI.color = new Color(1.00f, 0.47f, 0.47f, 1);
GUI.Box(rect, "", boxstyle); GUI.Box(rect, "", boxstyle);
GUI.color = Utility.SafeSkinColor(pawn); GUI.color = Utility.SafeSkinColor(pawn);

View File

@ -80,7 +80,7 @@ namespace RJW_Menstruation
try try
{ {
res = part.FluidAmmount * part.FluidModifier * pawn.BodySize / pawn.RaceProps.baseBodySize * Rand.Range(0.8f, 1.2f); res = VariationRange(part.FluidAmmount * part.FluidModifier * pawn.BodySize / pawn.RaceProps.baseBodySize, 0.2f);
} }
catch (NullReferenceException) catch (NullReferenceException)
{ {

View File

@ -45,14 +45,6 @@ namespace RJW_Menstruation
public static readonly RecordDef AmountofCreampied = DefDatabase<RecordDef>.GetNamed("AmountofCreampied"); public static readonly RecordDef AmountofCreampied = DefDatabase<RecordDef>.GetNamed("AmountofCreampied");
public static readonly RecordDef AmountofFertilizedEggs = DefDatabase<RecordDef>.GetNamed("AmountofFertilizedEggs"); public static readonly RecordDef AmountofFertilizedEggs = DefDatabase<RecordDef>.GetNamed("AmountofFertilizedEggs");
public static readonly TaleDef TaleCameInside = DefDatabase<TaleDef>.GetNamed("CameInside"); public static readonly TaleDef TaleCameInside = DefDatabase<TaleDef>.GetNamed("CameInside");
public static readonly GeneDef ShortEggLifetime = DefDatabase<GeneDef>.GetNamed("Menstruation_ShortEggLifetime");
public static readonly GeneDef DoubleEggLifetime = DefDatabase<GeneDef>.GetNamed("Menstruation_DoubleEggLifetime");
public static readonly GeneDef QuadEggLifetime = DefDatabase<GeneDef>.GetNamed("Menstruation_QuadEggLifetime");
public static readonly GeneDef NeverEstrus = DefDatabase<GeneDef>.GetNamed("Menstruation_NeverEstrus");
public static readonly GeneDef FullEstrus = DefDatabase<GeneDef>.GetNamed("Menstruation_FullEstrus");
public static readonly GeneDef DoubleOvulation = DefDatabase<GeneDef>.GetNamed("Menstruation_DoubleOvulation");
public static readonly GeneDef QuadOvulation = DefDatabase<GeneDef>.GetNamed("Menstruation_QuadOvulation");
public static readonly GeneDef NoBleeding = DefDatabase<GeneDef>.GetNamed("Menstruation_NoBleeding");
private static List<ThingDef> allraces = null; private static List<ThingDef> allraces = null;
private static List<PawnKindDef> allkinds = null; private static List<PawnKindDef> allkinds = null;
@ -66,9 +58,8 @@ namespace RJW_Menstruation
get get
{ {
if (allraces != null) return allraces; if (allraces != null) return allraces;
allraces = DefDatabase<ThingDef>.AllDefsListForReading.Where(thingdef => thingdef.race?.IsFlesh ?? false).ToList();
List<ThingDef> allThings = DefDatabase<ThingDef>.AllDefsListForReading;
allraces = allThings.FindAll(x => x.race != null && x.race.IsFlesh);
return allraces; return allraces;
} }
} }
@ -77,9 +68,8 @@ namespace RJW_Menstruation
get get
{ {
if (allkinds != null) return allkinds; if (allkinds != null) return allkinds;
allkinds = DefDatabase<PawnKindDef>.AllDefsListForReading.Where(pawnkinddef => pawnkinddef.race != null).ToList();
List<PawnKindDef> allKinds = DefDatabase<PawnKindDef>.AllDefsListForReading;
allkinds = allKinds.FindAll(x => x.race != null);
return allkinds; return allkinds;
} }
} }
@ -157,13 +147,7 @@ namespace RJW_Menstruation
get get
{ {
if (egglayergenes != null) return egglayergenes; if (egglayergenes != null) return egglayergenes;
egglayergenes = new HashSet<GeneDef> egglayergenes = DefDatabase<GeneDef>.AllDefsListForReading.Where(geneDef => geneDef.GetModExtension<MenstruationModExtension>()?.disableCycle ?? false).ToHashSet();
{
DefDatabase<GeneDef>.GetNamedSilentFail("AG_EggLaying"), // Alpha Genes
DefDatabase<GeneDef>.GetNamedSilentFail("VRESaurids_Oviparous"), // VE Saurid
DefDatabase<GeneDef>.GetNamedSilentFail("VRE_SaplingBirth"), // VE Phytokin
};
egglayergenes.Remove(null);
return egglayergenes; return egglayergenes;
} }

View File

@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ModMetaData> <ModMetaData>
<packageId>rjw.menstruation</packageId>
<name>RJW Menstruation Cycle</name> <name>RJW Menstruation Cycle</name>
<author>lutepickle</author> <author>lutepickle</author>
<url>https://gitgud.io/lutepickle/rjw_menstruation/</url>
<supportedVersions> <supportedVersions>
<li>1.2</li> <li>1.2</li>
<li>1.3</li> <li>1.3</li>
@ -28,13 +30,17 @@
<li>Abraxas.RJW.RaceSupport</li> <li>Abraxas.RJW.RaceSupport</li>
<li>rjw.milk.humanoid</li> <li>rjw.milk.humanoid</li>
</loadAfter> </loadAfter>
<packageId>rjw.menstruation</packageId> <incompatibleWithByVersion>
<v1.4>
<li>conit.thebirdsandthebees</li> <!--Breaks fertility calculations-->
</v1.4>
</incompatibleWithByVersion>
<description>Adds menstruation mechanics to vaginas: <description>Adds menstruation mechanics to vaginas:
Wombs cycle between follicular, luteal, and bleeding phases Wombs cycle between follicular, luteal, and bleeding phases
Tracks eggs ovulated and cum in wombs to determine pregnancy Tracks eggs ovulated and cum in wombs to determine pregnancy
Womb icon and status window Womb icon and status window
Estrus effects Estrus and pheromone effects
Race-specific fetus images for many vanilla animals Race-specific fetus images for many vanilla animals
Pregnancies from multiple eggs and different fathers Pregnancies from multiple eggs and different fathers
Identical siblings Identical siblings

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Manifest> <Manifest>
<identifier>RJW Menstruation</identifier> <identifier>RJW Menstruation</identifier>
<version>1.0.9.3</version> <version>1.0.9.4</version>
<dependencies> <dependencies>
</dependencies> </dependencies>
<incompatibleWith /> <incompatibleWith />

View File

@ -1,3 +1,8 @@
Version 1.0.9.4
- Added graphics for the menstruation genes with thanks to Alpenglow.
- Pawns in estrus now give their pheromones to their caravan-mates.
- Pawns with the egglaying genes from Erin's Corvyia and Outland - Genetics no longer have a menstrual cycle.
Version 1.0.9.3 Version 1.0.9.3
- The biosculptor egg restoration cycle will now give more eggs to races that ovulate more than one egg at a time. - The biosculptor egg restoration cycle will now give more eggs to races that ovulate more than one egg at a time.
- All pawns can now use all menstruation genes, regardless of gender or having a womb. - All pawns can now use all menstruation genes, regardless of gender or having a womb.