Compare commits

...

53 commits

Author SHA1 Message Date
lutepickle
b5df8b1dce Merge branch 'dev' 2026-06-08 09:30:22 -07:00
lutepickle
d8b98ca05e Fix patch to RJW tab with 6.1.4 2026-06-08 09:29:12 -07:00
lutepickle
a8caad85c6 Merge branch 'dev' 2026-05-17 12:25:36 -07:00
lutepickle
ef909091f8 Add GetFluids with 0 arguments that returns all fluids 2026-05-09 09:21:10 -07:00
lutepickle
8341d3f213 Rebuild 2026-04-16 20:55:04 -07:00
lutepickle
1600f0ea58 Update changelog 2026-04-12 10:12:41 -07:00
lutepickle
18d316c26b Merge branch 'feat/ghostclinic3YTB/render-womb-icon-column' into 'dev'
feat(rjw-menstruation): add sortable womb status column to RJW main tab

See merge request lutepickle/rjw_menstruation!18
2026-04-12 17:10:21 +00:00
ghostclinic3YTB
82216c5a7d feat(rjw-menstruation): add sortable womb status column to RJW main tab 2026-04-12 17:10:21 +00:00
lutepickle
c38464c806 Fix wrong filename when using udder for multiple breasts, or if no breast comp/BreastTex 2026-03-27 16:30:36 -07:00
lutepickle
714eba8e9c Check for bad amount of cum when loading as a failsafe 2026-03-21 20:36:14 -07:00
lutepickle
df134584d7 Have an interaction check failure fall back to rjw impregnate code to properly handle non-fertilization vaginal sex. 2026-03-05 20:45:58 -08:00
lutepickle
8b6d1f70c4 Merge branch 'dev' 2026-03-01 08:26:59 -08:00
lutepickle
0408e792e6 Rebuild 2026-03-01 08:26:45 -08:00
lutepickle
7998d18f3d Use RJW part getter for anuses and breasts to draw 2026-02-19 06:16:45 -08:00
lutepickle
9c0cc92f7d Override breast image with udders if >1 breasts. Also use default breast image if no comp 2026-02-17 11:50:31 -08:00
lutepickle
2bb35f0241 Pass comp to GetAnalIcon for Fluids submod 2026-02-17 05:51:03 -08:00
lutepickle
8d4f4ac3f1 Update Traditional Chinese translation by Hydrogen 2026-02-17 05:50:32 -08:00
lutepickle
c5d1a901c9 Merge branch 'dev' 2026-02-03 12:21:29 -08:00
lutepickle
0f5994dce4 Null test hediff in CheckForStateChange_Patch 2025-12-24 22:33:36 -08:00
lutepickle
325ccaa400 Rebuild for RJW 6.0.3 2025-12-22 10:10:46 -08:00
lutepickle
7041a25742 Process MenstruationModExtension in ThingDef and HediffDef 2025-11-26 21:57:53 -08:00
lutepickle
e0ceb0020d Separate baby image into own function for menstruation fluids mod 2025-10-27 07:11:52 -07:00
lutepickle
83b64f5d8d Add Hediff_MultiplePregnancy.PostMake for Eltoro's addons 2025-10-23 09:30:09 -07:00
lutepickle
0a41e8a048 Merge dev into main 2025-10-18 06:34:48 -07:00
lutepickle
0b2f421b6e Ensure quirks compatibility is built against the latest quirks code 2025-10-18 06:13:06 -07:00
lutepickle
778a59a9c1 Instead of a separate ModExtension to disable cycling, add support for MenstruationModExtension to ThingDef and HediffDef. Cycle modifiers for those are not yet implemented 2025-10-18 05:56:45 -07:00
lutepickle
0515cc84f4 Revert "Add DisableCycleExtension for disabling cycle, supported on ThingDef, HediffDef, or GeneDef"
This reverts commit 717fb3cfc9.
2025-10-18 05:37:12 -07:00
lutepickle
717fb3cfc9 Add DisableCycleExtension for disabling cycle, supported on ThingDef, HediffDef, or GeneDef 2025-10-16 15:55:18 -07:00
lutepickle
2aaf496b15 If Pregnancy is set, automatically go to the Pregnant stage 2025-10-12 15:43:37 -07:00
lutepickle
9cffa1e822 Have TotalCumPercent account for BodySize 2025-10-12 15:42:12 -07:00
lutepickle
8c76091ffc Fix for latest Quirks code 2025-10-02 20:15:31 -07:00
lutepickle
57811be7ae Slight refactor in pheromones 2025-10-02 20:15:09 -07:00
lutepickle
3e3f321270 Fix directory structure for Quirks 2025-09-28 18:37:47 -07:00
lutepickle
325f8c9277 Rename Source and Assemblies folder for Linux compatibility 2025-09-28 15:12:14 -07:00
lutepickle
5d3b25b5de Set menstruation to load after Quirks 2025-09-28 15:11:12 -07:00
lutepickle
8f8c90d1ce Rename Source and Assemblies folder for Linux compatibility 2025-09-28 15:10:56 -07:00
lutepickle
299c6c6e17 Fix RedWings not being picked up properly 2025-09-28 14:30:22 -07:00
lutepickle
7dd4e470a3 Rebuild for 1.6.1.0 2025-09-28 05:30:06 -07:00
lutepickle
9b4a7413b8 Merge branch 'dev' of https://gitgud.io/lutepickle/rjw_menstruation into dev 2025-09-28 05:25:10 -07:00
lutepickle
0383ba40b2 Merge branch 'dev' into 'dev'
patch CumCanFertilize.

See merge request lutepickle/rjw_menstruation!11
2025-09-28 12:24:59 +00:00
lutepickle
8f93a25664 Update changelog 2025-09-25 14:24:04 -07:00
lutepickle
4467c9475e Merge branch 'fr-translation' into 'dev'
Add French translation

See merge request lutepickle/rjw_menstruation!10
2025-09-25 21:22:26 +00:00
ADHD_Coder
4904e2f325 patch CumCanFertilize. 2025-09-25 11:51:42 -07:00
lutepickle
8c3fdab8ff Merge branch 'dev' of https://gitgud.io/lutepickle/rjw_menstruation into dev 2025-09-22 18:32:19 -07:00
lutepickle
2904c4a78a Don't restrict ovum extraction for non-cyclers 2025-09-22 18:14:49 -07:00
lutepickle
23cdd7ca88 Fix null reference when a multiple pregnancy miscarries from a removed vagina 2025-09-22 05:34:41 -07:00
lutepickle
c7e39731d2 Fix null reference when a multiple pregnancy miscarries from a removed vagina 2025-09-21 18:05:53 -07:00
lutepickle
e7e0d5eddb Merge main into dev 2025-09-21 16:23:05 -07:00
lutepickle
d54291b581 Merge main back into dev 2025-09-21 16:19:48 -07:00
lutepickle
67bf9946f7 Add red wings quirk 2025-09-21 07:39:48 -07:00
lutepickle
ed506c0fdf Rename EstrusPreferences.cs to Preferences.cs 2025-09-19 15:29:52 -07:00
lutepickle
8cf71699db Split mechanoid pregnancy check into its own function 2025-09-19 05:22:40 -07:00
m4conazao
5053d6be1e Add French translation 2025-09-10 19:10:59 +02:00
68 changed files with 1243 additions and 194 deletions

3
.gitignore vendored
View file

@ -343,3 +343,6 @@ healthchecksdb
*.psd
*.dds
*.pdn
Directory.Build.props
Directory.Build.targets

View file

@ -14,7 +14,7 @@
<li>image->[FUCKER_nameFull]'s penis deep inside of [FUCKED_nameFull]'s vagina [circumstance_group]</li>
<li>image->[FUCKER_nameFull]'s penis vanishing into [FUCKED_nameFull]'s vagina [circumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina being filled by [FUCKER_nameFull]'s penis [circumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [cirsumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [circumstance_group]</li>
<li>circumstance_phrase->while [FUCKER_nameDef] grits [FUCKER_possessive] teeth</li>
<li>circumstance_phrase->while [FUCKER_nameDef] wears a triumphant smirk</li>
<li>circumstance_phrase->as [FUCKED_nameDef] shudders in ecstasy</li>

View file

@ -14,7 +14,7 @@
<li>image->[FUCKER_nameFull]'s penis deep inside of [FUCKED_nameFull]'s vagina [circumstance_group]</li>
<li>image->[FUCKER_nameFull]'s penis vanishing into [FUCKED_nameFull]'s vagina [circumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina being filled by [FUCKER_nameFull]'s penis [circumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [cirsumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [circumstance_group]</li>
<li>circumstance_phrase->while [FUCKER_nameDef] grits [FUCKER_possessive] teeth</li>
<li>circumstance_phrase->while [FUCKER_nameDef] wears a triumphant smirk</li>
<li>circumstance_phrase->as [FUCKED_nameDef] shudders in ecstasy</li>

View file

@ -14,7 +14,7 @@
<li>image->[FUCKER_nameFull]'s penis deep inside of [FUCKED_nameFull]'s vagina [circumstance_group]</li>
<li>image->[FUCKER_nameFull]'s penis vanishing into [FUCKED_nameFull]'s vagina [circumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina being filled by [FUCKER_nameFull]'s penis [circumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [cirsumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [circumstance_group]</li>
<li>circumstance_phrase->while [FUCKER_nameDef] grits [FUCKER_possessive] teeth</li>
<li>circumstance_phrase->while [FUCKER_nameDef] wears a triumphant smirk</li>
<li>circumstance_phrase->as [FUCKED_nameDef] shudders in ecstasy</li>

View file

@ -25,7 +25,7 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\assemblies\</OutputPath>
<OutputPath>..\..\Assemblies\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>

Binary file not shown.

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<PawnColumnDef>
<defName>RJWMenstruation_Womb</defName>
<headerIcon>Womb/Womb</headerIcon>
<headerTip>Open womb status. Click the header to sort by womb presence and cycle stage.</headerTip>
<workerClass>RJW_Menstruation.MainTab.PawnColumnWorker_WombStatus</workerClass>
<sortable>true</sortable>
<width>34</width>
</PawnColumnDef>
</Defs>

View file

@ -14,7 +14,7 @@
<li>image->[FUCKER_nameFull]'s penis deep inside of [FUCKED_nameFull]'s vagina [circumstance_group]</li>
<li>image->[FUCKER_nameFull]'s penis vanishing into [FUCKED_nameFull]'s vagina [circumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina being filled by [FUCKER_nameFull]'s penis [circumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [cirsumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [circumstance_group]</li>
<li>circumstance_phrase->while [FUCKER_nameDef] grits [FUCKER_possessive] teeth</li>
<li>circumstance_phrase->while [FUCKER_nameDef] wears a triumphant smirk</li>
<li>circumstance_phrase->as [FUCKED_nameDef] shudders in ecstasy</li>

View file

@ -25,7 +25,7 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\assemblies\</OutputPath>
<OutputPath>..\..\Assemblies\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>

View file

@ -166,4 +166,7 @@
<Description_Absorbed>已吸收</Description_Absorbed>
<!--Generated at: 2025-01-21-->
<Stage_Anestrus_Periodic_Desc>子宮處於月經週期之外。經過足夠的時間後,月經週期會恢復。</Stage_Anestrus_Periodic_Desc>
<!--Generated at: 2026-02-15-->
<Option_ShowInfertileIcon_Desc>對已經不育的子宮顯示子宮圖示</Option_ShowInfertileIcon_Desc>
<Option_ShowInfertileIcon_Label>仍然展示不育的子宮狀態</Option_ShowInfertileIcon_Label>
</LanguageData>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: genital -->
<Absorber.label>génital</Absorber.label>
</LanguageData>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: menstruation -->
<Menstruation.label>menstruation</Menstruation.label>
</LanguageData>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: double egg lifetime -->
<Menstruation_DoubleEggLifetime.label>Durée ovule double</Menstruation_DoubleEggLifetime.label>
<!-- EN: Unfertilized eggs with this gene last twice as long. -->
<Menstruation_DoubleEggLifetime.description>Les ovules non fécondés avec ce gène durent deux fois plus longtemps.</Menstruation_DoubleEggLifetime.description>
<!-- EN: double ovulation -->
<Menstruation_DoubleOvulation.label>Ovulation double</Menstruation_DoubleOvulation.label>
<!-- EN: Carriers of this gene will ovulate twice as many eggs. -->
<Menstruation_DoubleOvulation.description>Les porteuses de ce gène ovuleront deux fois plus dovules.</Menstruation_DoubleOvulation.description>
<!-- EN: full estrus -->
<Menstruation_FullEstrus.label>Œstrus complet</Menstruation_FullEstrus.label>
<!-- EN: Carriers of this gene will enter full estrus every menstrual cycle, regardless of vagina type. -->
<Menstruation_FullEstrus.description>Les porteuses de ce gène entreront en œstrus complet à chaque cycle menstruel, quel que soit le type de vagin.</Menstruation_FullEstrus.description>
<!-- EN: never estrus -->
<Menstruation_NeverEstrus.label>Jamais en œstrus</Menstruation_NeverEstrus.label>
<!-- EN: Carriers of this gene will never go into estrus. -->
<Menstruation_NeverEstrus.description>Les porteuses de ce gène ne seront jamais en œstrus.</Menstruation_NeverEstrus.description>
<!-- EN: no bleeding -->
<Menstruation_NoBleeding.label>Pas de saignement</Menstruation_NoBleeding.label>
<!-- EN: Carriers of this gene will not bleed at the end of their cycle. -->
<Menstruation_NoBleeding.description>Les porteuses de ce gène ne saigneront pas à la fin de leur cycle.</Menstruation_NoBleeding.description>
<!-- EN: quadrule egg lifetime -->
<Menstruation_QuadEggLifetime.label>Durée ovule quadruple</Menstruation_QuadEggLifetime.label>
<!-- EN: Eggs with this gene last four times as long. -->
<Menstruation_QuadEggLifetime.description>Les ovules avec ce gène durent quatre fois plus longtemps.</Menstruation_QuadEggLifetime.description>
<!-- EN: quadruple ovulation -->
<Menstruation_QuadOvulation.label>Ovulation quadruple</Menstruation_QuadOvulation.label>
<!-- EN: Carriers of this gene will ovulate four times as many eggs. -->
<Menstruation_QuadOvulation.description>Les porteuses de ce gène ovuleront quatre fois plus dovules.</Menstruation_QuadOvulation.description>
<!-- EN: short egg lifetime -->
<Menstruation_ShortEggLifetime.label>Durée ovule courte</Menstruation_ShortEggLifetime.label>
<!-- EN: Unfertilized eggs with this gene last three-quarters as long. -->
<Menstruation_ShortEggLifetime.description>Les ovules non fécondés avec ce gène durent les trois quarts de la durée normale.</Menstruation_ShortEggLifetime.description>
</LanguageData>

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: Antisperm antibody -->
<Hediff_ASA.label>Anticorps anti-sperme</Hediff_ASA.label>
<!-- EN: Antisperm antibody.\nIncreases death rate of sperm. -->
<Hediff_ASA.description>Anticorps anti-sperme. Augmente le taux de mortalité des spermatozoïdes.</Hediff_ASA.description>
<!-- EN: antisperm antibody -->
<Hediff_ASA.labelNoun>anticorps anti-sperme</Hediff_ASA.labelNoun>
<!-- EN: {0} has an antisperm antibody -->
<Hediff_ASA.labelNounPretty>{0} possède un anticorps anti-sperme</Hediff_ASA.labelNounPretty>
<!-- EN: Fertile -->
<Hediff_ForceFertile.label>Fertile</Hediff_ForceFertile.label>
<!-- EN: fertile -->
<Hediff_ForceFertile.description>fertile</Hediff_ForceFertile.description>
<!-- EN: fertile -->
<Hediff_ForceFertile.labelNoun>fertile</Hediff_ForceFertile.labelNoun>
<!-- EN: {0} is fertile -->
<Hediff_ForceFertile.labelNounPretty>{0} est fertile</Hediff_ForceFertile.labelNounPretty>
</LanguageData>

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: Affected by pheromones -->
<Hediff_AffectedByPheromones.label>Influencé par les phéromones</Hediff_AffectedByPheromones.label>
<!-- EN: A condition caused by being around someone in estrus. Sex drive and satisfaction is increased by the scent of heat. -->
<Hediff_AffectedByPheromones.description>Condition causée par la présence dune femme en œstrus. Le désir sexuel et la satisfaction augmentent avec lodeur de chaleur.</Hediff_AffectedByPheromones.description>
<!-- EN: weak -->
<Hediff_AffectedByPheromones.stages.weak.label>faible</Hediff_AffectedByPheromones.stages.weak.label>
<!-- EN: moderate -->
<Hediff_AffectedByPheromones.stages.moderate.label>modéré</Hediff_AffectedByPheromones.stages.moderate.label>
<!-- EN: strong -->
<Hediff_AffectedByPheromones.stages.strong.label>fort</Hediff_AffectedByPheromones.stages.strong.label>
<!-- EN: Cyclosporine -->
<Hediff_Cyclosporine.label>Cyclosporine</Hediff_Cyclosporine.label>
<!-- EN: Under the effect of an immunosuppressant, hampering the body's ability to fight off infection and disease. -->
<Hediff_Cyclosporine.description>Sous leffet dun immunosuppresseur, réduisant la capacité du corps à combattre infections et maladies.</Hediff_Cyclosporine.description>
<!-- EN: Estrus -->
<Hediff_Estrus.label>Œstrus</Hediff_Estrus.label>
<!-- EN: A condition caused by a womb entering the most fertile phase of its menstrual cycle. Sexual arousal and desire increase dramatically as the body yearns to become pregnant.\nIncreased chance of vaginal sex occurring and potentially lower standards in mate selection. -->
<Hediff_Estrus.description>Condition causée par un utérus entrant dans la phase la plus fertile de son cycle menstruel. Lexcitation et le désir sexuel augmentent fortement, le corps cherchant à devenir enceinte. Chance accrue de rapports vaginaux et critères de sélection du partenaire potentiellement abaissés.</Hediff_Estrus.description>
<!-- EN: estrus -->
<Hediff_Estrus.labelNoun>œstrus</Hediff_Estrus.labelNoun>
<!-- EN: Estrus (concealed) -->
<Hediff_Estrus_Concealed.label>Œstrus caché</Hediff_Estrus_Concealed.label>
<!-- EN: A condition caused by a womb its most fertile phase of the menstrual cycle. Sexual arousal and desire increase slightly.\nSlightly increased chance of vaginal sex. -->
<Hediff_Estrus_Concealed.description>Condition causée par un utérus entrant dans sa phase la plus fertile. Excitation et désir sexuel légèrement augmentés. Chance légèrement accrue de rapports vaginaux.</Hediff_Estrus_Concealed.description>
<!-- EN: estrus -->
<Hediff_Estrus_Concealed.labelNoun>œstrus</Hediff_Estrus_Concealed.labelNoun>
<!-- EN: In period -->
<Hediff_MenstrualCramp.label>En période</Hediff_MenstrualCramp.label>
<!-- EN: Bleeding from the vagina at the end of the menstrual cycle.\nOften painful. -->
<Hediff_MenstrualCramp.description>Saignement vaginal à la fin du cycle menstruel. Souvent douloureux.</Hediff_MenstrualCramp.description>
<!-- EN: in period -->
<Hediff_MenstrualCramp.labelNoun>en période</Hediff_MenstrualCramp.labelNoun>
<!-- EN: unpleasant -->
<Hediff_MenstrualCramp.stages.unpleasant.label>désagréable</Hediff_MenstrualCramp.stages.unpleasant.label>
<!-- EN: annoying -->
<Hediff_MenstrualCramp.stages.annoying.label>gênant</Hediff_MenstrualCramp.stages.annoying.label>
<!-- EN: aching -->
<Hediff_MenstrualCramp.stages.aching.label>courbaturé</Hediff_MenstrualCramp.stages.aching.label>
<!-- EN: painful -->
<Hediff_MenstrualCramp.stages.painful.label>douleur intense</Hediff_MenstrualCramp.stages.painful.label>
<!-- EN: Pain reliever -->
<Hediff_PainReliever.label>Antidouleur</Hediff_PainReliever.label>
<!-- EN: A mild reprieve from menstrual (and other) sources of pain. -->
<Hediff_PainReliever.description>Soulagement léger de la douleur menstruelle (et autres sources de douleur).</Hediff_PainReliever.description>
</LanguageData>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: washing vagina -->
<VaginaWashing.reportString>Lavage du vagin</VaginaWashing.reportString>
</LanguageData>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: lactating self -->
<LactateSelf.reportString>Allaitement</LactateSelf.reportString>
</LanguageData>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: Menstruation: open status window -->
<OpenStatusWindow.label>Menstruation : ouvrir la fenêtre détat</OpenStatusWindow.label>
</LanguageData>

View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: contract areolae -->
<Surgery_ContractAreola.label>Contracter les aréoles</Surgery_ContractAreola.label>
<!-- EN: Contract the areolae. -->
<Surgery_ContractAreola.description>Contracter les aréoles.</Surgery_ContractAreola.description>
<!-- EN: contracting areolae -->
<Surgery_ContractAreola.jobString>Contraction des aréoles</Surgery_ContractAreola.jobString>
<!-- EN: Contract nipples -->
<Surgery_ContractNipple.label>Contracter les tétons</Surgery_ContractNipple.label>
<!-- EN: Contract the nipples. -->
<Surgery_ContractNipple.description>Contracter les tétons.</Surgery_ContractNipple.description>
<!-- EN: contracting nipples -->
<Surgery_ContractNipple.jobString>Contraction des tétons</Surgery_ContractNipple.jobString>
<!-- EN: Darken nipples -->
<Surgery_DarkenNipple.label>Assombrir les tétons</Surgery_DarkenNipple.label>
<!-- EN: Darken the nipples. -->
<Surgery_DarkenNipple.description>Assombrir les tétons.</Surgery_DarkenNipple.description>
<!-- EN: darkening nipples -->
<Surgery_DarkenNipple.jobString>Assombrissement des tétons</Surgery_DarkenNipple.jobString>
<!-- EN: expand areolae -->
<Surgery_ExpandAreola.label>Élargir les aréoles</Surgery_ExpandAreola.label>
<!-- EN: Expand the areolae. -->
<Surgery_ExpandAreola.description>Élargir les aréoles.</Surgery_ExpandAreola.description>
<!-- EN: expanding areolae -->
<Surgery_ExpandAreola.jobString>Élargissement des aréoles</Surgery_ExpandAreola.jobString>
<!-- EN: Expand nipple -->
<Surgery_ExpandNipple.label>Élargir les tétons</Surgery_ExpandNipple.label>
<!-- EN: Expand the nipples. -->
<Surgery_ExpandNipple.description>Élargir les tétons.</Surgery_ExpandNipple.description>
<!-- EN: expanding nipples -->
<Surgery_ExpandNipple.jobString>Élargissement des tétons</Surgery_ExpandNipple.jobString>
<!-- EN: Lighten nipples -->
<Surgery_LightenNipple.label>Éclaircir les tétons</Surgery_LightenNipple.label>
<!-- EN: Lighten the nipples. -->
<Surgery_LightenNipple.description>Éclaircir les tétons.</Surgery_LightenNipple.description>
<!-- EN: lightening nipples -->
<Surgery_LightenNipple.jobString>Éclaircissement des tétons</Surgery_LightenNipple.jobString>
</LanguageData>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: creampied -->
<AmountofCreampied.label>Éjaculation interne</AmountofCreampied.label>
<!-- EN: The milliliters of cum that's been ejaculated into my womb. -->
<AmountofCreampied.description>Millilitres de sperme éjaculés dans mon utérus.</AmountofCreampied.description>
<!-- EN: fertilized eggs -->
<AmountofFertilizedEggs.label>Œufs fécondés</AmountofFertilizedEggs.label>
<!-- EN: The number of my eggs that sperm has fertilized. -->
<AmountofFertilizedEggs.description>Nombre de mes œufs fécondés par des spermatozoïdes.</AmountofFertilizedEggs.description>
</LanguageData>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: Absorbable -->
<MaxAbsorbable.label>Absorbable</MaxAbsorbable.label>
<!-- EN: Maximum amount of fluid that this item can absorb. -->
<MaxAbsorbable.description>Quantité maximale de liquide que cet objet peut absorber.</MaxAbsorbable.description>
<!-- EN: {0} ml -->
<MaxAbsorbable.formatString>{0} ml</MaxAbsorbable.formatString>
</LanguageData>

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: came inside -->
<CameInside.label>Éjaculation interne</CameInside.label>
<!-- EN:
<li>tale_noun->[FUCKER_nameDef] coming inside of [FUCKED_nameDef]</li>
<li>image->[FUCKER_nameFull]'s penis deep inside of [FUCKED_nameFull]'s vagina [circumstance_group]</li>
<li>image->[FUCKER_nameFull]'s penis vanishing into [FUCKED_nameFull]'s vagina [circumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina being filled by [FUCKER_nameFull]'s penis [circumstance_group]</li>
<li>image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [circumstance_group]</li>
<li>circumstance_phrase->while [FUCKER_nameDef] grits [FUCKER_possessive] teeth</li>
<li>circumstance_phrase->while [FUCKER_nameDef] wears a triumphant smirk</li>
<li>circumstance_phrase->as [FUCKED_nameDef] shudders in ecstasy</li>
<li>circumstance_phrase->as [FUCKER_nameDef] shoots [FUCKER_possessive] load into [FUCKED_nameDef]</li>
<li>circumstance_phrase->while [FUCKED_nameDef] looks into [FUCKER_nameDef]'s eyes with a smile</li>
<li>desc_sentence->[FUCKER_nameDef]'s cum oozes out of [FUCKED_nameDef]'s vagina and drips onto the floor.</li>
<li>desc_sentence->[FUCKER_nameDef]'s sperm races into [FUCKED_nameDef]'s womb and enters [FUCKED_possessive] egg.</li>
<li>desc_sentence->[FUCKER_nameDef]'s cum shoots into [FUCKED_nameDef]'s womb.</li>
<li>desc_sentence->[FUCKED_nameDef]'s womb is filled with cum.</li>
<li>desc_sentence->Sweat runs down [FUCKER_nameDef]'s face.</li>
<li>desc_sentence->[FUCKED_nameDef] is panting heavily.</li>
-->
<CameInside.rulePack.rulesStrings>
<li>tale_noun-&gt;[FUCKER_nameDef] éjacule dans [FUCKED_nameDef]</li>
<li>image-&gt;[FUCKER_nameFull] a son pénis profondément dans le vagin de [FUCKED_nameFull] [circumstance_group]</li>
<li>image-&gt;[FUCKER_nameFull] voit son pénis disparaître dans le vagin de [FUCKED_nameFull] [circumstance_group]</li>
<li>image-&gt;[FUCKED_nameFull] voit son vagin se remplir du pénis de [FUCKER_nameFull] [circumstance_group]</li>
<li>image-&gt;[FUCKED_nameFull] voit son vagin serrer fortement le pénis de [FUCKER_nameFull] [circumstance_group]</li>
<li>circumstance_phrase-&gt;pendant que [FUCKER_nameDef] serre ses dents</li>
<li>circumstance_phrase-&gt;pendant que [FUCKER_nameDef] arbore un sourire triomphant</li>
<li>circumstance_phrase-&gt;alors que [FUCKED_nameDef] frissonne de plaisir</li>
<li>circumstance_phrase-&gt;alors que [FUCKER_nameDef] éjacule dans [FUCKED_nameDef]</li>
<li>circumstance_phrase-&gt;pendant que [FUCKED_nameDef] regarde [FUCKER_nameDef] dans les yeux en souriant</li>
<li>desc_sentence-&gt;Le sperme de [FUCKER_nameDef] sécoule du vagin de [FUCKED_nameDef] et tombe sur le sol.</li>
<li>desc_sentence-&gt;Le sperme de [FUCKER_nameDef] se précipite dans lutérus de [FUCKED_nameDef] et féconde un œuf de [FUCKED_nameDef].</li>
<li>desc_sentence-&gt;Le sperme de [FUCKER_nameDef] est éjaculé dans lutérus de [FUCKED_nameDef].</li>
<li>desc_sentence-&gt;Lutérus de [FUCKED_nameDef] est rempli de sperme.</li>
<li>desc_sentence-&gt;De la sueur coule sur le visage de [FUCKER_nameDef].</li>
<li>desc_sentence-&gt;[FUCKED_nameDef] halète lourdement.</li>
</CameInside.rulePack.rulesStrings>
</LanguageData>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: sanitary pad -->
<Absorber_Pad.label>Serviette hygiénique</Absorber_Pad.label>
<!-- EN: A pad for absorbing fluids from a vagina. -->
<Absorber_Pad.description>Une serviette pour absorber les fluides du vagin.</Absorber_Pad.description>
<!-- EN: wet sanitary pad -->
<Absorber_Pad_Dirty.label>Serviette hygiénique humide</Absorber_Pad_Dirty.label>
<!-- EN: A wet used pad. -->
<Absorber_Pad_Dirty.description>Une serviette utilisée et humide.</Absorber_Pad_Dirty.description>
<!-- EN: tampon -->
<Absorber_Tampon.label>Tampon</Absorber_Tampon.label>
<!-- EN: A tampon for absorbing fluids from a vagina.\nMay cause an infection if worn for too long. -->
<Absorber_Tampon.description>Un tampon pour absorber les fluides du vagin. Peut provoquer une infection sil est porté trop longtemps.</Absorber_Tampon.description>
<!-- EN: dirty tampon -->
<Absorber_Tampon_Dirty.label>Tampon sale</Absorber_Tampon_Dirty.label>
<!-- EN: A wet used tampon.\nMay cause infection if left in. -->
<Absorber_Tampon_Dirty.description>Un tampon utilisé et humide. Peut provoquer une infection sil est laissé en place.</Absorber_Tampon_Dirty.description>
</LanguageData>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: mixture -->
<FilthMixture.label>mélange</FilthMixture.label>
</LanguageData>

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: cyclosporine -->
<Cyclosporine.label>Cyclosporine</Cyclosporine.label>
<!-- EN: An immunosuppressant.\nCan cure antisperm antibody, but reduces the body's ability to fight off infection and disease for 24 hours. -->
<Cyclosporine.description>Un immunosuppresseur. Peut soigner lanticorps antispermatozoïde, mais réduit la capacité du corps à combattre infections et maladies pendant 24 heures.</Cyclosporine.description>
<!-- EN: Take {0} -->
<Cyclosporine.ingestible.ingestCommandString>Prendre {0}</Cyclosporine.ingestible.ingestCommandString>
<!-- EN: Taking {0}. -->
<Cyclosporine.ingestible.ingestReportString>Prise de {0}.</Cyclosporine.ingestible.ingestReportString>
<!-- EN: Ovary regeneration pill -->
<OvaryRegenerationPill.label>Comprimé de régénération ovarienne</OvaryRegenerationPill.label>
<!-- EN: Recovers the ovaries' health, restoring some quantity of eggs.\nLess effective on ovaries with few eggs remaining.\nCannot recover menopause. -->
<OvaryRegenerationPill.description>Restaure la santé des ovaires et une partie des ovules. Moins efficace sur des ovaires presque vides. Ne peut pas inverser la ménopause.</OvaryRegenerationPill.description>
<!-- EN: Take {0} -->
<OvaryRegenerationPill.ingestible.ingestCommandString>Prendre {0}</OvaryRegenerationPill.ingestible.ingestCommandString>
<!-- EN: Taking {0}. -->
<OvaryRegenerationPill.ingestible.ingestReportString>Prise de {0}.</OvaryRegenerationPill.ingestible.ingestReportString>
<!-- EN: Pain reliever -->
<PainReliever.label>Antidouleur</PainReliever.label>
<!-- EN: Relieves menstrual pain for 24 hours.\n\nAlso effective on other sources of pain. -->
<PainReliever.description>Soulage les douleurs menstruelles pendant 24 heures. Également efficace contre dautres douleurs.</PainReliever.description>
<!-- EN: Take {0} -->
<PainReliever.ingestible.ingestCommandString>Prendre {0}</PainReliever.ingestible.ingestCommandString>
<!-- EN: Taking {0}. -->
<PainReliever.ingestible.ingestReportString>Prise de {0}.</PainReliever.ingestible.ingestReportString>
<!-- EN: Superovulation inducing agent -->
<SuperovulationInducingAgent.label>Agent de superovulation</SuperovulationInducingAgent.label>
<!-- EN: Induce superovulation, causing the next ovulation to produce 1-4 extra eggs.\n\nMay hasten the onset of menopause. -->
<SuperovulationInducingAgent.description>Induit une superovulation, provoquant la production de 1 à 4 ovules supplémentaires à la prochaine ovulation. Peut accélérer lapparition de la ménopause.</SuperovulationInducingAgent.description>
<!-- EN: Take {0} -->
<SuperovulationInducingAgent.ingestible.ingestCommandString>Prendre {0}</SuperovulationInducingAgent.ingestible.ingestCommandString>
<!-- EN: Taking {0}. -->
<SuperovulationInducingAgent.ingestible.ingestReportString>Prise de {0}.</SuperovulationInducingAgent.ingestible.ingestReportString>
</LanguageData>

View file

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: {0} came inside -->
<CameInsideF.stages.came_inside.label>{0} a éjaculé à l'intérieur</CameInsideF.stages.came_inside.label>
<!-- EN: I'm worried I might get pregnant. -->
<CameInsideF.stages.came_inside.description>Je suis inquiète de pouvoir tomber enceinte.</CameInsideF.stages.came_inside.description>
<!-- EN: {0} came inside -->
<CameInsideFFetish.stages.came_inside.label>{0} a éjaculé à l'intérieur</CameInsideFFetish.stages.came_inside.label>
<!-- EN: I hope I get pregnant. -->
<CameInsideFFetish.stages.came_inside.description>J'espère tomber enceinte.</CameInsideFFetish.stages.came_inside.description>
<!-- EN: {0} came inside -->
<CameInsideFFetishSafe.stages.came_inside.label>{0} a éjaculé à l'intérieur</CameInsideFFetishSafe.stages.came_inside.label>
<!-- EN: I don't think I'll get pregnant, but it's fun to fantasize. -->
<CameInsideFFetishSafe.stages.came_inside.description>Je ne pense pas tomber enceinte, mais c'est amusant de fantasmer.</CameInsideFFetishSafe.stages.came_inside.description>
<!-- EN: {0} came inside -->
<CameInsideFIdeo.stages.came_inside.label>{0} a éjaculé à l'intérieur</CameInsideFIdeo.stages.came_inside.label>
<!-- EN: I hope this makes me pregnant like I should be. -->
<CameInsideFIdeo.stages.came_inside.description>J'espère que cela me rendra enceinte comme je devrais l'être.</CameInsideFIdeo.stages.came_inside.description>
<!-- EN: {0} came inside -->
<CameInsideFLowFert.stages.came_inside.label>{0} a éjaculé à l'intérieur</CameInsideFLowFert.stages.came_inside.label>
<!-- EN: I'm worried I might get pregnant.\nThe chance is low, but... -->
<CameInsideFLowFert.stages.came_inside.description>Je suis inquiète de pouvoir tomber enceinte. La chance est faible, mais…</CameInsideFLowFert.stages.came_inside.description>
<!-- EN: came inside of {0} -->
<CameInsideM.stages.came_inside_of.label>a éjaculé à l'intérieur de {0}</CameInsideM.stages.came_inside_of.label>
<!-- EN: That felt so good. -->
<CameInsideM.stages.came_inside_of.description>Cela faisait tellement de bien.</CameInsideM.stages.came_inside_of.description>
<!-- EN: came inside of {0} -->
<CameInsideMIdeo.stages.came_inside_of.label>a éjaculé à l'intérieur de {0}</CameInsideMIdeo.stages.came_inside_of.label>
<!-- EN: It is my duty to make her pregnant. -->
<CameInsideMIdeo.stages.came_inside_of.description>C'est mon devoir de la rendre enceinte.</CameInsideMIdeo.stages.came_inside_of.description>
<!-- EN: egg restoration received -->
<EggRestorationReceived.stages.egg_restoration_received.label>Restauration des ovules reçue</EggRestorationReceived.stages.egg_restoration_received.label>
<!-- EN: I can breed for a little longer now. -->
<EggRestorationReceived.stages.egg_restoration_received.description>Je peux encore produire des ovules un peu plus longtemps.</EggRestorationReceived.stages.egg_restoration_received.description>
<!-- EN: {0} came inside -->
<HaterCameInsideF.stages.came_inside.label>{0} a éjaculé à l'intérieur</HaterCameInsideF.stages.came_inside.label>
<!-- EN: I don't want to be pregnant with his baby! -->
<HaterCameInsideF.stages.came_inside.description>Je ne veux pas être enceinte de son bébé !</HaterCameInsideF.stages.came_inside.description>
<!-- EN: {0} came inside -->
<HaterCameInsideFEstrus.stages.came_inside.label>{0} a éjaculé à l'intérieur</HaterCameInsideFEstrus.stages.came_inside.label>
<!-- EN: What was I thinking, letting him do that? -->
<HaterCameInsideFEstrus.stages.came_inside.description>À quoi pensais-je, en le laissant faire ça ?</HaterCameInsideFEstrus.stages.came_inside.description>
<!-- EN: {0} came inside -->
<HaterCameInsideFIdeo.stages.came_inside.label>{0} a éjaculé à l'intérieur</HaterCameInsideFIdeo.stages.came_inside.label>
<!-- EN: I know I should become pregnant, but does it have to be his? -->
<HaterCameInsideFIdeo.stages.came_inside.description>Je sais que je devrais devenir enceinte, mais est-ce que ça doit être avec lui ?</HaterCameInsideFIdeo.stages.came_inside.description>
<!-- EN: {0} came inside -->
<HaterCameInsideFSafe.stages.came_inside.label>{0} a éjaculé à l'intérieur</HaterCameInsideFSafe.stages.came_inside.label>
<!-- EN: I probably won't get pregnant, but I still don't like it. -->
<HaterCameInsideFSafe.stages.came_inside.description>Je ne tomberai probablement pas enceinte, mais ça ne me plaît toujours pas.</HaterCameInsideFSafe.stages.came_inside.description>
<!-- EN: came inside of {0} -->
<HaterCameInsideM.stages.came_inside_of.label>a éjaculé à l'intérieur de {0}</HaterCameInsideM.stages.came_inside_of.label>
<!-- EN: I came inside of my rival! -->
<HaterCameInsideM.stages.came_inside_of.description>J'ai éjaculé à l'intérieur de ma rivale !</HaterCameInsideM.stages.came_inside_of.description>
<!-- EN: took contraceptive pill -->
<HateTookContraceptivePill.stages.took_contraceptive_pill.label>a pris une pilule contraceptive</HateTookContraceptivePill.stages.took_contraceptive_pill.label>
<!-- EN: I want to get pregnant. -->
<HateTookContraceptivePill.stages.took_contraceptive_pill.description>Je veux tomber enceinte.</HateTookContraceptivePill.stages.took_contraceptive_pill.description>
<!-- EN: took contraceptive pill -->
<HateTookContraceptivePillIdeo.stages.took_contraceptive_pill.label>a pris une pilule contraceptive</HateTookContraceptivePillIdeo.stages.took_contraceptive_pill.label>
<!-- EN: My beliefs demand I become pregnant. -->
<HateTookContraceptivePillIdeo.stages.took_contraceptive_pill.description>Mes convictions exigent que je devienne enceinte.</HateTookContraceptivePillIdeo.stages.took_contraceptive_pill.description>
<!-- EN: dripping fluids -->
<LeakingFluids.stages.dripping_fluids.label>écoulement de fluides</LeakingFluids.stages.dripping_fluids.label>
<!-- EN: Can't I get something to absorb this? -->
<LeakingFluids.stages.dripping_fluids.description>Ne puis-je rien utiliser pour absorber ça ?</LeakingFluids.stages.dripping_fluids.description>
<!-- EN: took contraceptive pill -->
<TookContraceptivePill.stages.took_contraceptive_pill.label>a pris la pilule contraceptive</TookContraceptivePill.stages.took_contraceptive_pill.label>
<!-- EN: Everything will be okay now. -->
<TookContraceptivePill.stages.took_contraceptive_pill.description>Tout ira bien maintenant.</TookContraceptivePill.stages.took_contraceptive_pill.description>
<!-- EN: unwanted pregnancy -->
<UnwantedPregnancy.stages.unwanted_pregnancy.label>grossesse non désirée</UnwantedPregnancy.stages.unwanted_pregnancy.label>
<!-- EN: How will I take care of a baby? What am I going to do? -->
<UnwantedPregnancy.stages.unwanted_pregnancy.description>Comment vais-je m'occuper d'un bébé ? Que vais-je faire ?</UnwantedPregnancy.stages.unwanted_pregnancy.description>
<!-- EN: unwanted pregnancy -->
<UnwantedPregnancyMild.stages.unwanted_pregnancy.label>grossesse non désirée</UnwantedPregnancyMild.stages.unwanted_pregnancy.label>
<!-- EN: I'm having a baby. I hope I can manage. -->
<UnwantedPregnancyMild.stages.unwanted_pregnancy.description>Je vais avoir un bébé. J'espère que je pourrai gérer.</UnwantedPregnancyMild.stages.unwanted_pregnancy.description>
</LanguageData>

View file

@ -0,0 +1,321 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: RJW Menstruation Cycle -->
<Mod_Title>Cycle menstruel RJW</Mod_Title>
<!-- EN: menstrual blood -->
<Menstrual_Blood>Sang menstruel</Menstrual_Blood>
<!-- EN: Empty -->
<Info_noCum>Vide</Info_noCum>
<!-- EN: Follicular -->
<Stage_Follicular>Folliculaire</Stage_Follicular>
<!-- EN: Ovulation -->
<Stage_Ovulatory>Ovulation</Stage_Ovulatory>
<!-- EN: Luteal -->
<Stage_Luteal>Lutéale</Stage_Luteal>
<!-- EN: In period -->
<Stage_Bleeding>Menstruations</Stage_Bleeding>
<!-- EN: Pregnant -->
<Stage_Pregnant>Enceinte</Stage_Pregnant>
<!-- EN: Recovering from birth -->
<Stage_Recover>Récupération post-partum</Stage_Recover>
<!-- EN: None -->
<Stage_None>Aucune</Stage_None>
<!-- EN: Climacteric -->
<Stage_Climacteric>Climatérique</Stage_Climacteric>
<!-- EN: Menopause -->
<Stage_Menopause>Ménopause</Stage_Menopause>
<!-- EN: Anestrus -->
<Stage_Anestrus>Anœstrus</Stage_Anestrus>
<!-- EN: The ovaries are preparing to release an egg. Ovulation will occur at the end of this phase. -->
<Stage_Follicular_Desc>Les ovaires se préparent à libérer un ovule. Lovulation aura lieu à la fin de cette phase.</Stage_Follicular_Desc>
<!-- EN: The ovaries are preparing to release an egg. Ovulation will occur if semen enters the womb. -->
<Stage_Follicular_Induced_Desc>Les ovaires se préparent à libérer un ovule. Lovulation aura lieu si du sperme entre dans lutérus.</Stage_Follicular_Induced_Desc>
<!-- EN: The ovaries are releasing an egg into the womb. -->
<Stage_Ovulatory_Desc>Les ovaires libèrent un ovule dans lutérus.</Stage_Ovulatory_Desc>
<!-- EN: The womb is prepared to recieve a fertilized egg. Pregnancy will result if one implants before the end of the stage. -->
<Stage_Luteal_Desc>Lutérus est prêt à recevoir un ovule fécondé. Une grossesse surviendra si un ovule simplante avant la fin de cette phase.</Stage_Luteal_Desc>
<!-- EN: The womb is shedding its lining, along with any eggs that failed to implant. -->
<Stage_Bleeding_Desc>Lutérus se débarrasse de sa muqueuse, ainsi que des ovules non fécondés.</Stage_Bleeding_Desc>
<!-- EN: A baby is growing inside the womb. With time and care, it will become a new resident of this world. -->
<Stage_Pregnant_Desc>Un bébé grandit dans lutérus. Avec du temps et des soins, il deviendra un nouvel habitant de ce monde.</Stage_Pregnant_Desc>
<!-- EN: The womb is recovering from its recent pregnancy. -->
<Stage_Recover_Desc>Lutérus se rétablit de sa récente grossesse.</Stage_Recover_Desc>
<!-- EN: The womb is not fertile and cannot become pregnant. -->
<Stage_None_Desc>Lutérus nest pas fertile et ne peut pas concevoir.</Stage_None_Desc>
<!-- EN: The ovaries have neared exhaustion and the menstrual cycle has become irregular. -->
<Stage_Climacteric_Desc>Les ovaires approchent de lépuisement et le cycle devient irrégulier.</Stage_Climacteric_Desc>
<!-- EN: The ovaries have been exhausted and the womb can no longer produce eggs. -->
<Stage_Menopause_Desc>Les ovaires sont épuisés et lutérus ne peut plus produire dovules.</Stage_Menopause_Desc>
<!-- EN: The womb is out of breeding season. The cycle will resume once conditions are met. -->
<Stage_Anestrus_Desc>Lutérus est hors saison de reproduction. Le cycle reprendra quand les conditions seront réunies.</Stage_Anestrus_Desc>
<!-- EN: The womb is between cycles. The cycle will resume after enough time has passed. -->
<Stage_Anestrus_Periodic_Desc>Lutérus est entre deux cycles. Le cycle reprendra après un certain temps.</Stage_Anestrus_Periodic_Desc>
<!-- EN: Status -->
<Button_HealthTab>État</Button_HealthTab>
<!-- EN: Lactate self -->
<Button_MilkTooltip>Allaitement</Button_MilkTooltip>
<!-- EN: State -->
<Dialog_WombInfo01>État</Dialog_WombInfo01>
<!-- EN: Fetus -->
<Dialog_WombInfo02>Fœtus</Dialog_WombInfo02>
<!-- EN: Father -->
<Dialog_WombInfo03>Père</Dialog_WombInfo03>
<!-- EN: Cum list -->
<Dialog_WombInfo04>Liste de sperme</Dialog_WombInfo04>
<!-- EN: Fertilized -->
<Dialog_WombInfo05>Fécondé</Dialog_WombInfo05>
<!-- EN: Fertilizing -->
<Dialog_WombInfo06>En fécondation</Dialog_WombInfo06>
<!-- EN: Ovulated -->
<Dialog_WombInfo07>Ovulé</Dialog_WombInfo07>
<Dialog_WombInfo08></Dialog_WombInfo08>
<Dialog_WombInfo09></Dialog_WombInfo09>
<!-- EN: Unknown -->
<Dialog_FatherUnknown>Père inconnu</Dialog_FatherUnknown>
<!-- EN: Absorbed -->
<Description_Absorbed>Absorbé</Description_Absorbed>
<!-- EN: Enable womb icon -->
<Option1_Label_1>Activer licône utérus</Option1_Label_1>
<!-- EN: Enable button in health tab -->
<Option1_Label_2>Activer le bouton dans longlet santé</Option1_Label_2>
<!-- EN: Enable animal cycle -->
<Option2_Label>Activer le cycle animal</Option2_Label>
<!-- EN: Simulate animal cycles.
Not recommended. -->
<Option2_Desc>Simuler les cycles animaux. Non recommandé.</Option2_Desc>
<!-- EN: Implantation chance -->
<Option3_Label>Chance dimplantation</Option3_Label>
<!-- EN: Base implantation chance of fertilized egg
This value affects the chance of impregnation. -->
<Option3_Desc>Chance de base dimplantation de lovule fécondé. Affecte la probabilité de grossesse.</Option3_Desc>
<!-- EN: Fertilization chance -->
<Option4_Label>Chance de fécondation</Option4_Label>
<!-- EN: The fertilization chance per ml of sperm per hour
This value affects the chance of impregnation. -->
<Option4_Desc>Chance de fécondation par ml de sperme par heure. Affecte la probabilité de grossesse.</Option4_Desc>
<!-- EN: Cum decay ratio per hour -->
<Option5_Label>Perte de sperme par heure</Option5_Label>
<!-- EN: The amount of cum in the womb will drop by this amount every hour
This value affects the chance of impregnation. -->
<Option5_Desc>La quantité de sperme dans lutérus diminue de ce montant chaque heure. Affecte la probabilité de grossesse.</Option5_Desc>
<!-- EN: Cum fertility decay ratio per hour -->
<Option6_Label>Perte de fertilité du sperme par heure</Option6_Label>
<!-- EN: Cum will lose fertility by this amount every hour
This value affects fertilization chance indirectly. -->
<Option6_Desc>Le sperme perd sa fertilité de ce montant chaque heure. Affecte indirectement la chance de fécondation.</Option6_Desc>
<!-- EN: Cycle acceleration -->
<Option7_Label>Accélération du cycle</Option7_Label>
<!-- EN: Accelerate menstruation cycle
This can cause early menopause and infertility.
Setting this lower than x12 is recommended.
Rimworld's timescale: x6(default) -->
<Option7_Desc>Accélérer le cycle menstruel. Peut causer ménopause précoce et infertilité. Recommandé : ne pas descendre en dessous de x12. Échelle de temps Rimworld : x6 (par défaut).</Option7_Desc>
<!-- EN: Colonist update interval -->
<Option_ColonistUpdateInterval_Label>Intervalle mise à jour colones</Option_ColonistUpdateInterval_Label>
<!-- EN: How often the womb of each of your colonists, prisoners, and slaves update.
Lowering this will improve accuracy, increasing this can improve performance. -->
<Option_ColonistUpdateInterval_Desc>Fréquence de mise à jour des utérus de vos colones, prisonnières et esclaves. Réduire améliore la précision, augmenter améliore la performance.</Option_ColonistUpdateInterval_Desc>
<!-- EN: Non-colonist update interval -->
<Option_NonColonistUpdateInterval_Label>Intervalle mise à jour non-colones</Option_NonColonistUpdateInterval_Label>
<!-- EN: How often the womb of humans you don't control update.
Lowering this will improve accuracy, increasing this can improve performance. -->
<Option_NonColonistUpdateInterval_Desc>Fréquence de mise à jour des utérus des humains non contrôlés. Réduire améliore la précision, augmenter améliore la performance.</Option_NonColonistUpdateInterval_Desc>
<!-- EN: Animal update interval -->
<Option_AnimalUpdateInterval_Label>Intervalle mise à jour animaux</Option_AnimalUpdateInterval_Label>
<!-- EN: How often the womb of animals update.
Lowering this will improve accuracy, increasing this can improve performance. -->
<Option_AnimalUpdateInterval_Desc>Fréquence de mise à jour des utérus des animaux. Réduire améliore la précision, augmenter améliore la performance.</Option_AnimalUpdateInterval_Desc>
<!-- EN: Debug -->
<Option8_Label>Débogage</Option8_Label>
<!-- EN: Show debug information. -->
<Option8_Desc>Afficher les informations de débogage.</Option8_Desc>
<!-- EN: Womb status -->
<Option9_Label>État de lutérus</Option9_Label>
<!-- EN: Draw womb icon in status window. -->
<Option9_Desc>Afficher licône utérus dans la fenêtre détat.</Option9_Desc>
<!-- EN: Vagina and breast status -->
<Option10_Label>État vagin et seins</Option10_Label>
<!-- EN: Draw vagina, anus and breast icons in the status window. -->
<Option10_Desc>Afficher les icônes vagin, anus et seins dans la fenêtre détat.</Option10_Desc>
<!-- EN: Fetus information level -->
<Option11_Label>Niveau information fœtus</Option11_Label>
<!-- EN: Show all information about a fetus. -->
<Option11_Desc_1>Afficher toutes les informations sur le fœtus.</Option11_Desc_1>
<!-- EN: Show all information about a fetus after discovered pregnancy. -->
<Option11_Desc_2>Afficher toutes les informations sur le fœtus après découverte de la grossesse.</Option11_Desc_2>
<!-- EN: Show only image of a fetus after discovered pregnancy. -->
<Option11_Desc_3>Afficher seulement limage du fœtus après découverte de la grossesse.</Option11_Desc_3>
<!-- EN: Do not show any information about a fetus. -->
<Option11_Desc_4>Ne pas afficher dinformation sur le fœtus.</Option11_Desc_4>
<!-- EN: Enable menopause -->
<Option12_Label>Activer ménopause</Option12_Label>
<!-- EN: Enable menopause effect that makes pawn infertile when they run out of eggs.
If you have problems with long lived races, turn off this option. -->
<Option12_Desc>Activer leffet ménopause qui rend infertile lorsque les ovules sont épuisés. Désactiver pour races longévives.</Option12_Desc>
<!-- EN: Enable pheromones -->
<Option_EnablePheromones_Label>Activer phéromones</Option_EnablePheromones_Label>
<!-- EN: Allow humanlikes in visible estrus to increase the sex drive of nearby humanlike males. -->
<Option_EnablePheromones_Desc>Autoriser les humanoïdes en œstrus visible à augmenter le désir sexuel des mâles proches.</Option_EnablePheromones_Desc>
<!-- EN: Animal pheromone effect -->
<Option_AnimalPheromoneEffect_Label>Effet phéromones animaux</Option_AnimalPheromoneEffect_Label>
<!-- EN: Set the effect that animals in visible estrus have on humanlikes. -->
<Option_AnimalPheromoneEffect_Desc>Définir leffet des animaux en œstrus visible sur les humanoïdes.</Option_AnimalPheromoneEffect_Desc>
<!-- EN: Use multiple pregnancy -->
<Option13_Label>Activer grossesses multiples</Option13_Label>
<!-- EN: Use multiple pregnancy instead RJW's default pregnancy
Disable this option if you are in trouble with impregnation
RJW pregnancy should be turned on. -->
<Option13_Desc>Utiliser grossesses multiples au lieu de la grossesse RJW par défaut. Désactiver si problème dimplantation. RJW doit rester activé.</Option13_Desc>
<!-- EN: Enable hetero ovular twins -->
<Option14_Label>Activer jumeaux hétéro-ovulaires</Option14_Label>
<!-- EN: Allow pregnancy from multiple eggs at the same time. -->
<Option14_Desc>Autoriser la grossesse à partir de plusieurs ovules en même temps.</Option14_Desc>
<!-- EN: Enable enzygotic twins -->
<Option15_Label>Activer jumeaux enzygotiques</Option15_Label>
<!-- EN: Enable a single egg to result in multiple identical offspring. -->
<Option15_Desc>Autoriser un ovule unique à produire plusieurs enfants identiques.</Option15_Desc>
<!-- EN: Enzygotic twins chance -->
<Option16_Label>Chance jumeaux enzygotiques</Option16_Label>
<!-- EN: The chance of identical twins. -->
<Option16_Desc>Chance davoir des jumeaux identiques.</Option16_Desc>
<!-- EN: Max enzygotic twins -->
<Option17_Label>Nombre max jumeaux identiques</Option17_Label>
<!-- EN: The maximum number of identical siblings. -->
<Option17_Desc>Nombre maximum de frères et sœurs identiques.</Option17_Desc>
<!-- EN: Enable egg overlay -->
<Option18_Label>Activer superposition ovule</Option18_Label>
<!-- EN: Enable egg overlay on womb icon. -->
<Option18_Desc>Afficher superposition des ovules sur icône utérus.</Option18_Desc>
<!-- EN: Bleeding amount -->
<Option19_Label_1>Quantité de saignement</Option19_Label_1>
<!-- EN: Estimated total bleeding amount -->
<Option19_Label_2>Quantité totale estimée</Option19_Label_2>
<!-- EN: The approximate bleeding amount.
The normal bleeding amount of a human is about 20~80ml per cycle. -->
<Option19_Desc>Quantité approximative de saignement. Normale : 20~80ml par cycle.</Option19_Desc>
<!-- EN: Colonist -->
<Option20_Label_1>Colone</Option20_Label_1>
<!-- EN: Prisoner -->
<Option20_Label_2>Prisonnière</Option20_Label_2>
<!-- EN: Allied Faction -->
<Option20_Label_3>Faction alliée</Option20_Label_3>
<!-- EN: Neutral -->
<Option20_Label_4>Neutre</Option20_Label_4>
<!-- EN: Hostile Faction -->
<Option20_Label_5>Faction hostile</Option20_Label_5>
<!-- EN: Target pawns: -->
<Option21_Label>Cibles :</Option21_Label>
<!-- EN: The gizmo and button will appear for these pawns -->
<Option21_Desc>Le gizmo et le bouton apparaîtront pour ces pions.</Option21_Desc>
<!-- EN: Use hybrid extension -->
<Option22_Label>Activer extension hybride</Option22_Label>
<!-- EN: Overrides RJW and RaceSupport's hybrid definition.
Dominant hybrid extension determines whose definition used first. Not recommended to change this. -->
<Option22_Desc>Remplace les définitions hybrides RJW et RaceSupport. Lextension dominante est prioritaire. Ne pas modifier.</Option22_Desc>
<!-- EN: Dominant hybrid extension -->
<Option23_Label>Extension hybride dominante</Option23_Label>
<!-- EN: Mother -->
<Option23_Label_1>Mère</Option23_Label_1>
<!-- EN: Father -->
<Option23_Label_2>Père</Option23_Label_2>
<!-- EN: Breast growth during pregnancy -->
<Option_MaxBreastIncrementFactor_Label>Croissance des seins pendant la grossesse</Option_MaxBreastIncrementFactor_Label>
<!-- EN: Change how much a pregnant pawn's breasts will grow when pregnant. Some pawns will grow more than others. -->
<Option_MaxBreastIncrementFactor_Desc>Modifier combien les seins dune femme enceinte vont grandir. Certaines croîtront plus que dautres.</Option_MaxBreastIncrementFactor_Desc>
<!-- EN: Nipple change during pregnancy -->
<Option_MaxNippleIncrementFactor_Label>Changement des tétons pendant la grossesse</Option_MaxNippleIncrementFactor_Label>
<!-- EN: Change how much a pregnant pawn's nipples will change during pregnancy. -->
<Option_MaxNippleIncrementFactor_Desc>Modifier combien les tétons dune femme enceinte vont changer.</Option_MaxNippleIncrementFactor_Desc>
<!-- EN: Permanent nipple change after pregnancy -->
<Option_PermanentNippleChange_Label>Changement permanent des tétons après la grossesse</Option_PermanentNippleChange_Label>
<!-- EN: Adjusts approximately how much of a pregnant pawn's nipples will remain changed after the pregnancy ends. -->
<Option_PermanentNippleChange_Desc>Modifie combien des changements des tétons restent après la grossesse.</Option_PermanentNippleChange_Desc>
<!-- EN: Customize Hybrids -->
<Option28_Label>Personnaliser hybrides</Option28_Label>
<!-- EN: Open custom hybrid editor.
This will overrides hybrid definitions of XML files. -->
<Option28_Tooltip>Ouvrir éditeur hybride personnalisé. Remplace les définitions hybrides XML.</Option28_Tooltip>
<!-- EN: Allow shrink icon -->
<Option29_Label>Autoriser la réduction de licône</Option29_Label>
<!-- EN: Let icon become smaller if needed. -->
<Option29_Desc>Permet à licône de devenir plus petite si nécessaire.</Option29_Desc>
<!-- EN: Egg lifespan multiplier -->
<Option30_Label>Multiplicateur durée ovule</Option30_Label>
<!-- EN: Multiply egg's lifespan.
All non-implanted eggs will die at end of luteal stage regardless of this setting. -->
<Option30_Desc>Multiplie la durée de vie des ovules. Tous les ovules non implantés meurent à la fin de la phase lutéale.</Option30_Desc>
<!-- EN: Enable vagina morph after birth -->
<Option31_Label>Activer métamorphose du vagin post-partum</Option31_Label>
<!-- EN: Enable permanent vagina stretch after birth.
If you are using another mod handling this, turn off this option. -->
<Option31_Desc>Activer létirement permanent du vagin après la naissance. Désactiver si un autre mod gère cela.</Option31_Desc>
<!-- EN: Morph power -->
<Option32_Label>Puissance de la métamorphose</Option32_Label>
<!-- EN: Set morph power. -->
<Option32_Desc>Définir la puissance de la métamorphose.</Option32_Desc>
<!-- EN: Estrus overrides RJW hookup settings -->
<Option_EstrusOverride_Label>Œstrus remplace RJW</Option_EstrusOverride_Label>
<!-- EN: If enabled, a pawn in visible estrus will use these settings for potential impregnation hookups instead of the RJW settings.
All settings default to their RJW counterparts. -->
<Option_EstrusOverride_Desc>Si activé, une femme en œstrus visible utilisera ces réglages pour la fécondation au lieu de RJW. Tous les autres restent par défaut.</Option_EstrusOverride_Desc>
<!-- EN: Hookup minimum fuckability in estrus -->
<Option_EstrusFuckability_Label>Baisabilité minimale pendant lœstrus</Option_EstrusFuckability_Label>
<!-- EN: Hookup minimum attractability in estrus -->
<Option_EstrusAttractability_Label>Attractivité minimale pendant lœstrus</Option_EstrusAttractability_Label>
<!-- EN: Hookup minimum opinion in estrus -->
<Option_EstrusRelationship_Label>Opinion minimale pendant lœstrus</Option_EstrusRelationship_Label>
<!-- EN: Estimated sperm lifespan -->
<EstimatedCumLifespan>Durée de vie du sperme estimée</EstimatedCumLifespan>
<!-- EN: Estimated egg lifespan -->
<EstimatedEggLifespan>Durée de vie de lovule estimée</EstimatedEggLifespan>
<!-- EN: Ovulation {0} -->
<OvulationChanceLabel>Ovulation {0}</OvulationChanceLabel>
<!-- EN: Chance of each egg being released during ovulation. -->
<OvulationChanceDesc>Chance que chaque ovule soit libéré à lovulation.</OvulationChanceDesc>
<!-- EN: Implantation chance of fertilized eggs.
Chance of fertilization this hour: {0}% -->
<FertilityDesc>Chance dimplantation des ovules fécondés. Chance de fécondation cette heure : {0}%</FertilityDesc>
<!-- EN: Use basic RJW pregnancy -->
<Option_PregnancyFromBaseRJW_Label>Utiliser grossesse RJW de base</Option_PregnancyFromBaseRJW_Label>
<!-- EN: Use menstruation multiple pregnancy -->
<Option_PregnancyFromMultiplePregnancy_Label>Utiliser grossesses multiples menstruelles</Option_PregnancyFromMultiplePregnancy_Label>
<!-- EN: Use Biotech pregnancy -->
<Option_PregnancyFromBiotech_Label>Utiliser grossesse Biotech</Option_PregnancyFromBiotech_Label>
<!-- EN: Enable multiple babies/twins in a single Biotech pregnancy. -->
<Option_EnableBiotechTwins_Label>Autoriser jumeaux/plusieurs bébés pour une seule grossesse Biotech</Option_EnableBiotechTwins_Label>
<!-- EN: Enabling this option will allow identical and hetero ovular twins with Biotech.
Also allows the hybrid system, but two humanlikes cannot produce an animal. -->
<Option_EnableBiotechTwins_Desc>Autorise jumeaux identiques et hétéro-ovulaires avec Biotech. Permet aussi système hybride, mais deux humanoïdes ne peuvent produire un animal.</Option_EnableBiotechTwins_Desc>
<!-- EN: Show womb status when drafted -->
<Option_EnableDraftedIcon_Label>Afficher le statut de lutérus en cours de mobilisation</Option_EnableDraftedIcon_Label>
<!-- EN: Draw womb icon for drafted pawns -->
<Option_EnableDraftedIcon_Desc>Afficher licône de lutérus en cours de mobilisation</Option_EnableDraftedIcon_Desc>
<!-- EN: Show womb status when infertile -->
<Option_ShowInfertileIcon_Label>Afficher le statut dun utérus infertile</Option_ShowInfertileIcon_Label>
<!-- EN: Draw womb icon for infertile wombs -->
<Option_ShowInfertileIcon_Desc>Afficher licône dun utérus infertile</Option_ShowInfertileIcon_Desc>
<!-- EN: Reset to default -->
<Button_ResetToDefault>Réinitialiser par défaut</Button_ResetToDefault>
<!-- EN: Vaginal washing -->
<FloatMenu_CleanSelf>Nettoyage vaginal</FloatMenu_CleanSelf>
<!-- EN: Custom Hybrid Editor -->
<CustomHybrid_List_Title>Éditeur Hybrides Personnalisé</CustomHybrid_List_Title>
<!-- EN: Hybrids of {0} -->
<CustomHybrid_Title>Hybrides de {0}</CustomHybrid_Title>
<!-- EN: When {0} breed with {1}, {2} will be born at {3} chance.
If both races have hybrid definitions for each other, the father's definition will be used. -->
<CustomHybrid_Tooltip>Lorsque {0} se reproduit avec {1}, {2} naîtra avec une chance de {3}. Si les deux races ont des définitions hybrides, celle du père est utilisée.</CustomHybrid_Tooltip>
<!-- EN: No eggs -->
<CannotNoEggs>Pas dovules</CannotNoEggs>
<!-- EN: Must have a womb -->
<CannotNoWomb>Doit avoir un utérus</CannotNoWomb>
<!-- EN: {PAWN_labelShort} has completed {PAWN_possessive} egg restoration cycle. -->
<EggRestorationCompleted>{PAWN_labelShort} a terminé son cycle de restauration des ovules.</EggRestorationCompleted>
</LanguageData>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<Patch>
<Operation Class="PatchOperationSequence">
<operations>
<li Class="PatchOperationInsert">
<xpath>/Defs/PawnTableDef[defName="RJW_PawnTable_Colonists"]/columns/li[text()="Pregnant"]</xpath>
<value>
<li>RJWMenstruation_Womb</li>
</value>
</li>
<li Class="PatchOperationInsert">
<xpath>/Defs/PawnTableDef[defName="RJW_PawnTable_Property"]/columns/li[text()="Pregnant"]</xpath>
<value>
<li>RJWMenstruation_Womb</li>
</value>
</li>
</operations>
</Operation>
</Patch>

Binary file not shown.

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<RJWQuirks.QuirkDef>
<defName>RedWings</defName>
<label>Red Wings</label>
<description>{pawn} enjoys partners who are menstruating and enjoys having menstrual blood on {pawn_possessive} penis</description>
<satisfiedBy Class="RJW_Menstruation_Quirks.RedWingsCondition" />
<requirements>
<li Class="RJW_Menstruation_Quirks.RedWingsRequirement" />
</requirements>
<ignoreIllegalLabelCharacterConfigError>true</ignoreIllegalLabelCharacterConfigError>
</RJWQuirks.QuirkDef>
</Defs>

View file

@ -25,7 +25,7 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\assemblies\</OutputPath>
<OutputPath>..\..\Assemblies\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
@ -59,7 +59,7 @@
<ItemGroup>
<Compile Include="Harmony.cs" />
<Compile Include="QuirksCompatibility.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RedWings.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
@ -71,5 +71,8 @@
<Private>False</Private>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View file

@ -1,15 +1,21 @@
using HarmonyLib;
using RJW_Menstruation;
using RimWorld;
using rjw;
using RJW_Menstruation;
using RJWQuirks;
using RJWQuirks.Condition;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Verse;
namespace RJW_Menstruation_Quirks
{
[DefOf]
public static class QuirkDefs
{
public static readonly QuirkDef Teratophile;
public static readonly QuirkDef RedWings;
}
[HarmonyPatch(typeof(QuirkUtility), nameof(QuirkUtility.HasQuirk))]
public static class HasQuirk_Patch
{
@ -18,26 +24,24 @@ namespace RJW_Menstruation_Quirks
switch (quirk)
{
case QuirkUtility.Quirks.Breeder:
__result = pawn.HasQuirk(Breeder);
__result = pawn.HasQuirk(RqDefOf.Quirk.Breeder);
return;
case QuirkUtility.Quirks.ImpregnationFetish:
__result = pawn.HasQuirk(Impregnation);
__result = pawn.HasQuirk(RqDefOf.Quirk.ImpregnationFetish);
return;
case QuirkUtility.Quirks.Messy:
__result = pawn.HasQuirk(Messy);
__result = pawn.HasQuirk(RqDefOf.Quirk.Messy);
return;
case QuirkUtility.Quirks.Teratophile:
__result = pawn.HasQuirk(Teratophile);
__result = pawn.HasQuirk(QuirkDefs.Teratophile);
return;
case QuirkUtility.Quirks.RedWingsFetish:
__result = pawn.HasQuirk(QuirkDefs.RedWings);
return;
default:
return;
}
}
private static QuirkDef Breeder = DefDatabase<QuirkDef>.GetNamed("Breeder");
private static QuirkDef Impregnation = DefDatabase<QuirkDef>.GetNamed("ImpregnationFetish");
private static QuirkDef Messy = DefDatabase<QuirkDef>.GetNamed("Messy");
private static QuirkDef Teratophile = DefDatabase<QuirkDef>.GetNamed("Teratophile");
}
[HarmonyPatch(typeof(PartnerCanImpregnatePawn), nameof(PartnerCanImpregnatePawn.SatisfiedByPartner))]

View file

@ -0,0 +1,35 @@
using rjw;
using rjw.Modules.Interactions;
using RJW_Menstruation;
using RJWQuirks.Condition;
using RJWQuirks.Requirement;
using System.Collections.Generic;
using System.Linq;
using Verse;
namespace RJW_Menstruation_Quirks
{
public class RedWingsRequirement : RequirementBase
{
public override bool Satisfied(Pawn pawn)
{
return pawn.GetGenitalsList().Any(genital => (genital.def as HediffDef_SexPart)?.genitalFamily == GenitalFamily.Penis);
}
}
public class RedWingsCondition : ConditionBase
{
public override bool SatisfiedByPartner(Pawn pawn, Pawn partner)
{
if (!partner.ShouldCycle()) return false;
return partner.GetMenstruationComps().Any(comp => comp.curStage == HediffComp_Menstruation.Stage.Bleeding);
}
public override bool SatisfiedBySex(SexProps sexProps)
{
if (!sexProps.hasPartner()) return false;
List<ILewdablePart> partnerParts = sexProps.IsInitiator() ? sexProps.resolved.RecipientParts : sexProps.resolved.InitiatorParts;
return partnerParts.Any(part => part.Family == LewdablePartFamily.Vagina) && SatisfiedByPartner(sexProps.pawn, sexProps.partner);
}
}
}

Binary file not shown.

View file

@ -1,33 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Quirks")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Quirks")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("d9363a87-bbc4-456d-9880-07414944c02a")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View file

@ -25,7 +25,7 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\assemblies\</OutputPath>
<OutputPath>..\..\Assemblies\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>

View file

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Lib.Harmony" version="2.3.6" targetFramework="net48" />
</packages>

View file

@ -169,6 +169,13 @@ namespace RJW_Menstruation
Scribe_Values.Look(ref useCustomColor, "useCustomColor", false);
Scribe_Values.Look(ref customColor, "customColor", default);
Scribe_Defs.Look(ref filthDef, "filthDef");
if (Scribe.mode == LoadSaveMode.PostLoadInit &&
(Single.IsInfinity(FertVolume) || Single.IsNaN(FertVolume) || volume < 0f))
{
Log.Error($"Invalid amount of {pawn}'s cum in a womb");
volume = 0;
fertility = 0;
}
}
public void MakeThinner(float speed)

View file

@ -126,7 +126,7 @@ namespace RJW_Menstruation
protected int? opcache = null;
protected float antisperm = 0.0f;
// RJW pregnancy, or Biotech pregnancy/labor/laborpushing
protected Hediff pregnancy = null;
protected Hediff pregnancy = null; // Remove, instead reference per-genital pregnancy list
protected int eggLifeSpanTicks = GenDate.DaysToTicks(2);
protected EstrusLevel estrusLevel = EstrusLevel.Visible;
@ -188,7 +188,13 @@ namespace RJW_Menstruation
}
else return pregnancy;
}
set => pregnancy = value;
set
{
pregnancy = value;
if (pregnancy != null && curStage != Stage.Pregnant)
GoNextStage(Stage.Pregnant);
}
}
public int OvaryPowerThreshold
@ -261,7 +267,7 @@ namespace RJW_Menstruation
}
public float TotalCumPercent
{
get => cums?.Sum(cum => cum.Volume) / Props.maxCumCapacity ?? 0;
get => cums?.Sum(cum => cum.Volume) / (Props.maxCumCapacity * Pawn.BodySize) ?? 0;
}
public float CumCapacity
{
@ -307,7 +313,7 @@ namespace RJW_Menstruation
{
StatDefOf.Fertility.Worker.ClearCacheForThing(Pawn); // No effect for now, but a future RW update might add caching for this
calculatingOvulationChance = true;
ovulationChance *= PawnCapacityUtility.CalculateCapacityLevel(Pawn.health.hediffSet, xxx.reproduction);
ovulationChance *= PawnCapacityUtility.CalculateCapacityLevel(Pawn.health.hediffSet, xxx.reproduction); // Add genital fertility
}
finally
{
@ -666,7 +672,16 @@ namespace RJW_Menstruation
}
}
public void Notify_UpdatedGenes()
private void ProcessExtension(MenstruationModExtension extension)
{
eggLifeSpanTicks = (int)(eggLifeSpanTicks * extension.eggLifeTimeFactor);
if (extension.alwaysEstrus) estrusLevel = EstrusLevel.Visible;
else if (extension.neverEstrus) estrusLevel = EstrusLevel.None;
ovulationFactor *= extension.ovulationFactor;
if (extension.noBleeding) noBleeding = true;
}
public void DirtyStats()
{
eggLifeSpanTicks = GenDate.DaysToTicks(Props.eggLifespanDays);
estrusLevel = Props.concealedEstrus ? EstrusLevel.Concealed : EstrusLevel.Visible;
@ -674,19 +689,31 @@ namespace RJW_Menstruation
noBleeding = false;
opcache = null;
if (Pawn.genes == null || !ModsConfig.BiotechActive) return;
foreach (MenstruationModExtension extension in Pawn.genes.GenesListForReading.Where(gene => gene.Active).Select(gene => gene.def.GetModExtension<MenstruationModExtension>()).Where(ext => ext != null))
{
eggLifeSpanTicks = (int)(eggLifeSpanTicks * extension.eggLifeTimeFactor);
if (extension.alwaysEstrus) estrusLevel = EstrusLevel.Visible;
else if (extension.neverEstrus) estrusLevel = EstrusLevel.None;
ovulationFactor *= extension.ovulationFactor;
if (extension.noBleeding) noBleeding = true;
}
MenstruationModExtension thingExtension = Pawn.def.GetModExtension<MenstruationModExtension>();
if (thingExtension != null)
ProcessExtension(thingExtension);
if (Pawn.genes != null && ModsConfig.BiotechActive)
foreach (MenstruationModExtension geneExtension in Pawn.genes.GenesListForReading.Where(gene => gene.Active).Select(gene => gene.def.GetModExtension<MenstruationModExtension>()).Where(ext => ext != null))
ProcessExtension(geneExtension);
foreach (MenstruationModExtension hediffExtension in Pawn.health.hediffSet.hediffs.Select(hediff => hediff.def.GetModExtension<MenstruationModExtension>()).Where(ext => ext != null))
ProcessExtension(hediffExtension);
if (eggLifeSpanTicks < 0) eggLifeSpanTicks = 0;
if (ovulationFactor < 0f) ovulationFactor = 0f;
}
public void Notify_UpdatedGenes()
{
DirtyStats();
}
public void Notify_HediffsChanged()
{
DirtyStats();
}
public bool ShouldSimulate()
{
if (!Pawn.ShouldCycle()) return false;
@ -783,10 +810,10 @@ namespace RJW_Menstruation
Log.Warning($"Attempted to remove menstruation comp from wrong pawn ({Pawn}).");
return;
}
switch (pregnancy)
if (Pregnancy.IsMechanoidPregnant()) return;
switch (Pregnancy)
{
case null:
case Hediff_MechanoidPregnancy _:
break;
case Hediff_BasePregnancy rjw_preg:
rjw_preg.Miscarry();
@ -795,8 +822,6 @@ namespace RJW_Menstruation
vanilla_preg.Miscarry();
break;
}
base.CompPostPostRemoved();
}
public override string CompTipStringExtra
@ -857,6 +882,11 @@ namespace RJW_Menstruation
return cums?.Find(cum => !cum.notcum && cum.pawn == pawn);
}
public IEnumerable<Cum> GetFluids()
{
return cums ?? Enumerable.Empty<Cum>();
}
public IEnumerable<Cum> GetFluids(Pawn pawn)
{
return cums?.Where(cum => cum.pawn == pawn) ?? Enumerable.Empty<Cum>();
@ -1225,7 +1255,7 @@ namespace RJW_Menstruation
protected virtual void PreInitialize()
{
Notify_UpdatedGenes();
DirtyStats();
}
protected virtual void PostInitialize()
@ -1385,7 +1415,7 @@ namespace RJW_Menstruation
return !cum.notcum &&
cum.FertVolume > 0 &&
!(cum.pawn?.Destroyed ?? true) &&
(RJWPregnancySettings.bestial_pregnancy_enabled || xxx.is_animal(Pawn) == xxx.is_animal(cum.pawn));
(PregnancyHelper.BeastialPregnancyPossible(parent.pawn, cum.pawn) || xxx.is_animal(Pawn) == xxx.is_animal(cum.pawn));
}
protected Pawn Fertilize()
@ -1434,7 +1464,7 @@ namespace RJW_Menstruation
deadeggs.Add(egg);
continue;
}
else if (Pawn.health.hediffSet.GetFirstHediff<Hediff_InsectEgg>() != null || pregnancy is Hediff_MechanoidPregnancy)
else if (Pawn.health.hediffSet.GetFirstHediff<Hediff_InsectEgg>() != null || pregnancy.IsMechanoidPregnant())
{
if (Configurations.Debug) Log.Message($"Could not implant {Pawn}'s egg due to insect or mechanoid pregnancy");
deadeggs.Add(egg);
@ -1451,7 +1481,7 @@ namespace RJW_Menstruation
try
{
if (Configurations.Debug) Log.Message($"Implanting fertilized egg of {Pawn} into {parent}, father {egg.fertilizer}");
if (pregnancy == null)
if (pregnancy == null) // Support pregnancy list, maybe split off into function
{
Configurations.PregnancyType usePregnancy = xxx.is_human(Pawn) ? Configurations.PregnancySource : Configurations.PregnancyType.MultiplePregnancy;
switch (usePregnancy)
@ -1469,7 +1499,7 @@ namespace RJW_Menstruation
case Configurations.PregnancyType.MultiplePregnancy:
if (Configurations.Debug) Log.Message($"Creating new menstruation pregnancy");
pregnancy = Hediff_BasePregnancy.Create<Hediff_MultiplePregnancy>(Pawn, egg.fertilizer);
pregnancy = Hediff_BasePregnancy.Create<Hediff_MultiplePregnancy>(Pawn, egg.fertilizer); // Add fertility comp of mother
pregnant = true;
deadeggs.Add(egg);
break;
@ -1826,6 +1856,7 @@ namespace RJW_Menstruation
protected virtual void ThoughtCumInside(Pawn cummer)
{
const int haterThreshold = -5;
MemoryThoughtHandler cummerMemories = cummer?.needs?.mood?.thoughts.memories;
MemoryThoughtHandler pawnMemories = Pawn?.needs?.mood?.thoughts.memories;
@ -1833,7 +1864,7 @@ namespace RJW_Menstruation
if (cummer.IsProPregnancy(out Precept preceptm) || (cummer.IsTeratophile() != (Pawn.GetStatValue(StatDefOf.PawnBeauty) >= 0)))
{
if (cummer.relations.OpinionOf(Pawn) <= -5)
if (cummer.relations.OpinionOf(Pawn) <= haterThreshold)
cummerMemories.TryGainMemory(VariousDefOf.HaterCameInsideM, Pawn);
else if (preceptm != null)
cummerMemories.TryGainMemory(VariousDefOf.CameInsideMIdeo, Pawn, preceptm);
@ -1847,14 +1878,14 @@ namespace RJW_Menstruation
{
if (preceptf != null)
{
if (Pawn.relations.OpinionOf(cummer) <= -5)
if (Pawn.relations.OpinionOf(cummer) <= haterThreshold)
pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideFIdeo, cummer, preceptf);
else
pawnMemories.TryGainMemory(VariousDefOf.CameInsideFIdeo, cummer, preceptf);
}
else pawnMemories.TryGainMemory(VariousDefOf.CameInsideFFetish, cummer);
}
else if (Pawn.relations.OpinionOf(cummer) <= -5)
else if (Pawn.relations.OpinionOf(cummer) <= haterThreshold)
pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideF, cummer);
else if (Pawn.IsInEstrus() && Pawn.relations.OpinionOf(cummer) < RJWHookupSettings.MinimumRelationshipToHookup)
pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideFEstrus, cummer);
@ -1868,7 +1899,7 @@ namespace RJW_Menstruation
{
if (Pawn.IsProPregnancy(out Precept _))
pawnMemories.TryGainMemory(VariousDefOf.CameInsideFFetishSafe, cummer);
else if (Pawn.relations.OpinionOf(cummer) <= -5)
else if (Pawn.relations.OpinionOf(cummer) <= haterThreshold)
pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideFSafe, cummer);
}
}

View file

@ -78,10 +78,10 @@ namespace RJW_Menstruation
if (!PawnCapacityUtility.BodyCanEverDoCapacity(body, PawnCapacityDefOf.Breathing)) return 0.0f;
HediffSet hediffs = target.health.hediffSet;
float breathingEffect = PawnCapacityUtility.CalculateCapacityLevel(hediffs, PawnCapacityDefOf.Breathing);
float noseEffect = 1.0f;
List<BodyPartRecord> noses = body.GetPartsWithDef(VariousDefOf.Nose);
if (noses.Any()) // if the body doesn't have a nose but still breathes, then let it be affected
noseEffect = noses.Average(nose => PawnCapacityUtility.CalculatePartEfficiency(hediffs, nose));
// if the body doesn't have a nose but still breathes, then let it be affected
float noseEffect = body.GetPartsWithDef(VariousDefOf.Nose).
Select(nose => PawnCapacityUtility.CalculatePartEfficiency(hediffs, nose)).
DefaultIfEmpty(1.0f).Average();
return penisEffect * breathingEffect * noseEffect;
}

View file

@ -33,7 +33,7 @@ namespace RJW_Menstruation
public static HediffComp_Menstruation GetRandomMenstruationComp(this Pawn pawn, bool preferDangerDay = false)
{
List<HediffComp_Menstruation> comps = pawn.GetMenstruationComps().ToList();
return pawn.GetMenstruationComps().Where(comp => !preferDangerDay || comp.IsDangerDay).RandomElementWithFallback() ?? comps.RandomElementWithFallback();
return comps.Where(comp => !preferDangerDay || comp.IsDangerDay).RandomElementWithFallback() ?? comps.RandomElementWithFallback();
}
public static HediffComp_Menstruation GetMenstruationCompFromVagina(this Hediff vagina)
@ -87,35 +87,27 @@ namespace RJW_Menstruation
return 1.0f - Mathf.Pow(1.0f - Configurations.FertilizeChance, comp.TotalFertCum * comp.Props.basefertilizationChanceFactor);
}
public static string GetSingleBabyImage(HediffComp_Menstruation comp, Hediff pregnancy)
{
ThingDef babydef;
HediffComp_PregeneratedBabies babiescomp = pregnancy?.TryGetComp<HediffComp_PregeneratedBabies>();
if (pregnancy.IsMechanoidPregnant()) babydef = (pregnancy as Hediff_BasePregnancy)?.babies?.FirstOrDefault()?.def ?? VariousDefOf.Scyther;
else if (pregnancy is Hediff_BasePregnancy preg) babydef = preg.babies?.FirstOrDefault()?.def ?? ThingDefOf.Human;
else if (babiescomp?.HasBaby ?? false) babydef = babiescomp.PeekBaby().def;
else babydef = comp.Pawn.def;
return babydef.GetModExtension<PawnDNAModExtension>()?.fetusTexPath ?? "Fetus/Fetus_Default";
}
public static Texture2D GetPregnancyIcon(this HediffComp_Menstruation comp, Hediff hediff)
{
float gestationProgress = comp.StageProgress;
ThingDef babydef;
int babycount;
HediffComp_PregeneratedBabies babiescomp = hediff?.TryGetComp<HediffComp_PregeneratedBabies>();
if (hediff is Hediff_MechanoidPregnancy)
{
babydef = VariousDefOf.Scyther;
babycount = 1;
}
else if (hediff is Hediff_BasePregnancy preg)
{
babydef = preg.babies?.FirstOrDefault()?.def ?? ThingDefOf.Human;
babycount = preg.babies?.Count ?? 1;
}
else if (babiescomp?.HasBaby ?? false)
{
babydef = babiescomp.PeekBaby().def;
babycount = babiescomp.BabyCount;
}
else
{
babydef = comp.Pawn.def;
babycount = 1;
}
if (hediff is Hediff_BasePregnancy preg) babycount = preg.babies?.Count ?? 1;
else babycount = hediff?.TryGetComp<HediffComp_PregeneratedBabies>()?.BabyCount ?? 1;
string fetustex = babydef.GetModExtension<PawnDNAModExtension>()?.fetusTexPath ?? "Fetus/Fetus_Default";
string fetustex = GetSingleBabyImage(comp, hediff);
string icon;
if (gestationProgress < 0.2f) icon = comp.WombTex + "_Implanted";
else if (gestationProgress < 0.4f) icon = fetustex + "00";
@ -275,7 +267,7 @@ namespace RJW_Menstruation
}
else return ContentFinder<Texture2D>.Get("Eggs/Egg", true);
case HediffComp_Menstruation.Stage.Pregnant:
if (comp.Pregnancy is Hediff_MechanoidPregnancy) break;
if (comp.Pregnancy.IsMechanoidPregnant()) break;
else if (comp.GetPregnancyProgress() < 0.2f) return ContentFinder<Texture2D>.Get("Eggs/Egg_Implanted00", true);
else break;
}
@ -316,11 +308,11 @@ namespace RJW_Menstruation
return ContentFinder<Texture2D>.Get(icon, true);
}
public static Texture2D GetAnalIcon(this Pawn pawn)
// comp used by Menstruation Fluids
public static Texture2D GetAnalIcon(this Pawn pawn, HediffComp_Menstruation comp)
{
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"));
if (hediff == null) return ContentFinder<Texture2D>.Get("Genitals/Anal00", true);
if (!pawn.GetAnusList().Any()) return ContentFinder<Texture2D>.Get("Genitals/Anal00", true);
Hediff hediff = pawn.GetAnusList().MaxBy(a => a.Severity);
string icon = ((CompProperties_Anus)hediff.GetAnusComp()?.props)?.analTex ?? "Genitals/Anal";
float severity = hediff.Severity;
@ -366,11 +358,12 @@ namespace RJW_Menstruation
public static bool ShouldCycle(this Pawn pawn)
{
if (!Configurations.EnableAnimalCycle && pawn.IsAnimal()) return false;
if (pawn.GetComp<CompEggLayer>() != null) return false;
if (VariousDefOf.CycleDisableThings.Contains(pawn.def)) return false;
if (pawn.health?.hediffSet?.hediffs.Select(hediff => hediff.def).Intersect(VariousDefOf.CycleDisableHediffs).Any() ?? false) return false;
if (pawn.RaceHasOviPregnancy()) return false;
if (ModsConfig.BiotechActive && pawn.genes != null &&
pawn.genes.GenesListForReading.Where(gene => gene.Active).Select(gene => gene.def).Intersect(VariousDefOf.EggLayerGenes).Any()) return false;
pawn.genes.GenesListForReading.Where(gene => gene.Active).Select(gene => gene.def).Intersect(VariousDefOf.CycleDisableGenes).Any()) return false;
return true;
}

View file

@ -10,6 +10,12 @@ namespace RJW_Menstruation
{
protected Dictionary<Pawn, Pawn> enzygoticSiblings = new Dictionary<Pawn, Pawn>(); // Each pawn and who they split from
// used by Eltoro's addons
public override void PostMake()
{
base.PostMake();
}
public override void DiscoverPregnancy()
{
PregnancyThought();
@ -37,7 +43,9 @@ namespace RJW_Menstruation
public override void Miscarry()
{
this.GetMenstruationCompFromPregnancy().Pregnancy = null;
HediffComp_Menstruation comp = this.GetMenstruationCompFromPregnancy();
if (comp != null)
comp.Pregnancy = null;
if (babies != null)
foreach (var baby in babies)
baby.Destroy(DestroyMode.Vanish);
@ -46,7 +54,6 @@ namespace RJW_Menstruation
public override void GiveBirth()
{
if (babies.NullOrEmpty())
{
ModLog.Warning(" no babies (debug?) " + this.GetType().Name);
@ -137,7 +144,6 @@ namespace RJW_Menstruation
PostBirth(mother, father, baby);
}
private void BestialBirth(Pawn baby)
{
Pawn mother = pawn; Pawn father = Utility.GetFather(baby, pawn);
@ -290,7 +296,6 @@ namespace RJW_Menstruation
}
}
public bool AddNewBaby(Pawn mother, Pawn father)
{
string lastname;
@ -533,5 +538,4 @@ namespace RJW_Menstruation
return obj.def.GetHashCode();
}
}
}

View file

@ -0,0 +1,138 @@
using RimWorld;
using UnityEngine;
using Verse;
namespace RJW_Menstruation.MainTab
{
public class PawnColumnWorker_WombStatus : PawnColumnWorker
{
private const float CellIconSize = 24f;
private const float ProgressBarHeight = 2f;
private const float IconScale = 0.85f;
private const int HasVisibleWombOffset = 100;
public override void DoCell(Rect rect, Pawn pawn, PawnTable table)
{
HediffComp_Menstruation comp = GetDisplayComp(pawn);
if (comp == null) return;
Gizmo_Womb gizmo = Pawn_GetGizmos.CreateGizmo_WombStatus(pawn, comp);
Rect iconRect = new Rect(
rect.x + (rect.width - CellIconSize) / 2f,
rect.y + Mathf.Max((rect.height - CellIconSize) / 2f, 0f),
CellIconSize,
CellIconSize);
DrawCellIcon(iconRect, gizmo);
if (Mouse.IsOver(iconRect) && !gizmo.defaultDesc.NullOrEmpty())
{
TooltipHandler.TipRegion(iconRect, gizmo.defaultDesc);
}
if (Widgets.ButtonInvisible(iconRect, doMouseoverSound: false))
{
Dialog_WombStatus.ToggleWindow(pawn, comp);
}
}
public override int GetMinWidth(PawnTable table)
{
return 30;
}
public override int GetMaxWidth(PawnTable table)
{
return GetMinWidth(table);
}
public override int GetMinCellHeight(Pawn pawn)
{
return 30;
}
public override int Compare(Pawn a, Pawn b)
{
int result = GetSortValue(a).CompareTo(GetSortValue(b));
if (result != 0) return result;
return string.CompareOrdinal(a.LabelShortCap, b.LabelShortCap);
}
private static HediffComp_Menstruation GetDisplayComp(Pawn pawn)
{
if (!pawn.ShowStatus() || !pawn.ShouldCycle()) return null;
HediffComp_Menstruation comp = pawn.GetFirstMenstruationComp();
if (comp == null) return null;
if (!Configurations.ShowInfertileIcon &&
(comp.CurrentVisibleStage == HediffComp_Menstruation.Stage.Infertile ||
comp.CurrentVisibleStage == HediffComp_Menstruation.Stage.None))
{
return null;
}
return comp;
}
private static int GetSortValue(Pawn pawn)
{
if (!pawn.ShowStatus() || !pawn.ShouldCycle()) return int.MinValue;
HediffComp_Menstruation comp = pawn.GetFirstMenstruationComp();
if (comp == null) return int.MinValue + 1;
return HasVisibleWombOffset + GetStageSortValue(comp.CurrentVisibleStage);
}
private static int GetStageSortValue(HediffComp_Menstruation.Stage stage)
{
switch (stage)
{
case HediffComp_Menstruation.Stage.Luteal:
return 9;
case HediffComp_Menstruation.Stage.Ovulatory:
return 8;
case HediffComp_Menstruation.Stage.Follicular:
return 7;
case HediffComp_Menstruation.Stage.Pregnant:
return 6;
case HediffComp_Menstruation.Stage.Bleeding:
return 5;
case HediffComp_Menstruation.Stage.Recover:
return 4;
case HediffComp_Menstruation.Stage.Anestrus:
return 3;
case HediffComp_Menstruation.Stage.Infertile:
return 2;
case HediffComp_Menstruation.Stage.None:
return 1;
default:
return 0;
}
}
private static void DrawCellIcon(Rect rect, Gizmo_Womb gizmo)
{
Texture baseIcon = gizmo.icon ?? BaseContent.BadTex;
Texture overlay = gizmo.icon_overlay ?? BaseContent.BadTex;
Widgets.DrawTextureFitted(rect, baseIcon, IconScale);
Color oldColor = GUI.color;
GUI.color = gizmo.cumcolor;
Widgets.DrawTextureFitted(rect, overlay, IconScale);
GUI.color = Color.white;
if (Configurations.DrawEggOverlay)
{
gizmo.comp.DrawEggOverlay(rect, false);
}
Rect progressRect = new Rect(rect.x + 2f, rect.y, rect.width - 4f, ProgressBarHeight);
Widgets.FillableBar(progressRect, gizmo.comp.StageProgress, gizmo.comp.GetStageTexture);
GUI.color = oldColor;
}
}
}

View file

@ -79,6 +79,7 @@ namespace RJW_Menstruation
__result = "CannotPregnant".Translate();
return;
}
if (!pawn.ShouldCycle()) return;
IEnumerable<HediffComp_Menstruation> comps = pawn.GetMenstruationComps();
if (!comps.Any()) return;
if (comps.All(comp => comp.ovarypower <= 0))
@ -95,6 +96,7 @@ namespace RJW_Menstruation
{
public static void Postfix(Pawn pawn)
{
if (!pawn.ShouldCycle()) return;
HediffComp_Menstruation mostEggs = pawn.GetMenstruationComps().MaxByWithFallback(comp => comp.ovarypower);
if ((mostEggs?.ovarypower ?? 0) <= 0) return;
mostEggs.ovarypower--;
@ -202,6 +204,17 @@ namespace RJW_Menstruation
}
}
[HarmonyPatch(typeof(Pawn_HealthTracker), nameof(Pawn_HealthTracker.CheckForStateChange))]
public class CheckForStateChange_Patch
{
public static void Postfix(Pawn ___pawn, Hediff hediff)
{
if (hediff == null || !hediff.def.HasModExtension<MenstruationModExtension>()) return;
foreach (HediffComp_Menstruation comp in ___pawn.GetMenstruationComps())
comp.Notify_HediffsChanged();
}
}
[HarmonyPatch(typeof(Pawn_GeneTracker), "Notify_GenesChanged")]
public class Notify_GenesChanged_Patch
{

View file

@ -46,7 +46,7 @@ namespace RJW_Menstruation
}
private static Gizmo CreateGizmo_WombStatus(Pawn pawn, HediffComp_Menstruation comp)
internal static Gizmo_Womb CreateGizmo_WombStatus(Pawn pawn, HediffComp_Menstruation comp)
{
if (!comp.loaded)
comp.Initialize();

View file

@ -23,7 +23,7 @@ namespace RJW_Menstruation
if (sextype != xxx.rjwSextype.Vaginal && sextype != xxx.rjwSextype.DoublePenetration) return true;
if (!mother.ShouldCycle()) return true;
if (!InteractionCanCausePregnancy(props)) return false;
if (!InteractionCanCausePregnancy(props)) return true;
List<Hediff> pawnparts = Genital_Helper.get_PartsHediffList(father, Genital_Helper.get_genitalsBPR(father));
@ -166,7 +166,7 @@ namespace RJW_Menstruation
if (!pawn.IsInEstrus(true)) return;
minimumFuckability = Mathf.Min(minimumFuckability, Configurations.EstrusFuckabilityToHookup);
minimumRelationship = Math.Min(minimumRelationship, Configurations.EstrusRelationshipToHookup);
minimumRelationship = Mathf.Min(minimumRelationship, Configurations.EstrusRelationshipToHookup);
minimumAttractiveness = Mathf.Min(minimumAttractiveness, Configurations.EstrusAttractivenessToHookup);
}
}

View file

@ -111,8 +111,10 @@ namespace RJW_Menstruation
}
public override IEnumerable<SexPreference> GetPreferences(Pawn pawn, Pawn partner, SexProps props)
{
float preferenceAmount = pawn.HasRedWingsFetish() ? Preference.Need : Preference.Despise;
yield return new PenetratingPreference(Preference.Neutral)
.IfSatisfied(new PartnerPartPreference(rjw.Modules.Interactions.LewdablePartFamily.Vagina, Preference.Despise));
.IfSatisfied(new PartnerPartPreference(rjw.Modules.Interactions.LewdablePartFamily.Vagina, preferenceAmount));
}
}
}

View file

@ -13,6 +13,7 @@ namespace RJW_Menstruation
ImpregnationFetish,
Messy,
Teratophile,
RedWingsFetish,
}
[MethodImpl(MethodImplOptions.NoInlining)]
@ -27,5 +28,6 @@ namespace RJW_Menstruation
public static bool HasImpregnationFetish(this Pawn pawn) => HasQuirk(pawn, Quirks.ImpregnationFetish);
public static bool IsMessy(this Pawn pawn) => HasQuirk(pawn, Quirks.Messy);
public static bool IsTeratophile(this Pawn pawn) => HasQuirk(pawn, Quirks.Teratophile);
public static bool HasRedWingsFetish(this Pawn pawn) => HasQuirk(pawn, Quirks.RedWingsFetish);
}
}

View file

@ -67,7 +67,7 @@
<Compile Include="Cum.cs" />
<Compile Include="DebugActions.cs" />
<Compile Include="DrugOutcomeDoers.cs" />
<Compile Include="EstrusPreferences.cs" />
<Compile Include="Preferences.cs" />
<Compile Include="FloatMenuOptionVaginalWashing.cs" />
<Compile Include="HediffComps\HediffComp_InducedOvulator.cs" />
<Compile Include="HediffComps\HediffComp_PeriodicOvulator.cs" />
@ -90,6 +90,7 @@
<Compile Include="HediffComps\HediffComp_Breast.cs" />
<Compile Include="Hediff_MultiplePregnancy.cs" />
<Compile Include="JobDrivers.cs" />
<Compile Include="MainTab\PawnColumnWorker_WombStatus.cs" />
<Compile Include="UI\Gizmo_Womb.cs" />
<Compile Include="Patch\Harmony.cs" />
<Compile Include="HediffComps\HediffComp_Menstruation.cs" />
@ -178,4 +179,4 @@
</Content>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
</Project>

View file

@ -390,7 +390,7 @@ namespace RJW_Menstruation
Rect genitalAnusLabelRect = new Rect(rect.x, rect.y + fontheight + genitalRectHeight, genitalRectWidth, fontheight);
vagina = pawn.GetGenitalIcon(comp);
anal = pawn.GetAnalIcon();
anal = pawn.GetAnalIcon(comp);
GUI.color = new Color(1.00f, 0.47f, 0.47f, 1);
GUI.Box(rect, "", boxstyle);
GUI.color = Utility.SafeSkinColor(pawn);

View file

@ -141,6 +141,11 @@ namespace RJW_Menstruation
return false;
}
public static bool IsMechanoidPregnant(this Hediff hediff)
{
return hediff is Hediff_MechanoidPregnancy;
}
public static float GetFarthestPregnancyProgress(this Pawn pawn)
{
if (ModsConfig.BiotechActive)
@ -155,7 +160,7 @@ namespace RJW_Menstruation
}
List<Hediff_BasePregnancy> pregnancies = new List<Hediff_BasePregnancy>();
pawn.health.hediffSet.GetHediffs(ref pregnancies);
return pregnancies.MaxByWithFallback(hediff => hediff.GestationProgress)?.GestationProgress ?? 0;
return pregnancies.Select(hediff => hediff.GestationProgress).DefaultIfEmpty(0.0f).Max();
}
public static float GetPregnancyProgress(this HediffComp_Menstruation comp)
@ -183,60 +188,9 @@ namespace RJW_Menstruation
public static void DrawBreastIcon(this Pawn pawn, Rect rect)
{
Hediff hediff = pawn.health.hediffSet.hediffs.FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def));
Texture2D breast, nipple, areola;
if (hediff != null)
{
HediffComp_Breast comp = hediff.TryGetComp<HediffComp_Breast>();
string icon;
if (comp != null) icon = comp.BreastTex ?? "Breasts/Breast_Breast";
else
{
breast = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00", false);
nipple = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00_Nipple00", false);
areola = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00_Areola00", false);
GUI.color = SafeSkinColor(pawn);
GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
GUI.color = Color.white;
GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
return;
}
if (hediff.Severity < 0.20f) icon += "_Breast00";
else if (hediff.Severity < 0.40f) icon += "_Breast01";
else if (hediff.Severity < 0.60f) icon += "_Breast02";
else if (hediff.Severity < 0.80f) icon += "_Breast03";
else if (hediff.Severity < 1.00f) icon += "_Breast04";
else icon += "_Breast05";
string nippleicon, areolaicon;
float nipplesize, areolasize;
nipplesize = comp.NippleSize;
areolasize = comp.AreolaSize;
nippleicon = icon + "_Nipple0" + GetNippleIndex(nipplesize);
areolaicon = icon + "_Areola0" + GetAreolaIndex(areolasize);
breast = ContentFinder<Texture2D>.Get(icon, false);
areola = ContentFinder<Texture2D>.Get(areolaicon, false);
nipple = ContentFinder<Texture2D>.Get(nippleicon, false);
GUI.color = SafeSkinColor(pawn);
GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
GUI.color = comp.NippleColor;
GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
if (Configurations.Debug) TooltipHandler.TipRegion(rect, comp.DebugInfo());
}
else
int breastCount = pawn.GetBreastList().Count();
if (breastCount == 0)
{
breast = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00", false);
nipple = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00_Nipple00", false);
@ -246,10 +200,42 @@ namespace RJW_Menstruation
GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
GUI.color = Color.white;
GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
return;
}
Hediff hediff = pawn.GetBreastList().MaxBy(h => h.Severity);
HediffComp_Breast comp = hediff.TryGetComp<HediffComp_Breast>();
string icon;
if (breastCount > 1) icon = "Breasts_Udder/Breast";
else icon = comp?.BreastTex ?? "Breasts/Breast";
if (hediff.Severity < 0.20f) icon += "_Breast00";
else if (hediff.Severity < 0.40f) icon += "_Breast01";
else if (hediff.Severity < 0.60f) icon += "_Breast02";
else if (hediff.Severity < 0.80f) icon += "_Breast03";
else if (hediff.Severity < 1.00f) icon += "_Breast04";
else icon += "_Breast05";
string nippleicon, areolaicon;
float nipplesize, areolasize;
nipplesize = comp?.NippleSize ?? 0.4f;
areolasize = comp?.AreolaSize ?? 0.4f;
nippleicon = icon + "_Nipple0" + GetNippleIndex(nipplesize);
areolaicon = icon + "_Areola0" + GetAreolaIndex(areolasize);
breast = ContentFinder<Texture2D>.Get(icon, false);
areola = ContentFinder<Texture2D>.Get(areolaicon, false);
nipple = ContentFinder<Texture2D>.Get(nippleicon, false);
GUI.color = SafeSkinColor(pawn);
GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
GUI.color = comp?.NippleColor ?? Color.white;
GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
if (Configurations.Debug && comp != null) TooltipHandler.TipRegion(rect, comp.DebugInfo());
}
public static int GetNippleIndex(float nipplesize)
@ -353,7 +339,7 @@ namespace RJW_Menstruation
}
public static string GetBreastLabel(this Pawn pawn)
{
Hediff hediff = pawn.health.hediffSet.hediffs.FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def));
Hediff hediff = pawn.health.hediffSet.hediffs.Where(h => VariousDefOf.AllBreasts.Contains(h.def)).MaxByWithFallback(h => h.Severity);
if (hediff != null) return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")";
else return "";
}

View file

@ -53,7 +53,9 @@ namespace RJW_Menstruation
private static HashSet<HediffDef> allvaginas = null;
private static HashSet<HediffDef> allanuses = null;
private static HashSet<HediffDef> allbreasts = null;
private static HashSet<GeneDef> egglayergenes = null;
private static HashSet<ThingDef> cycledisablethings = null;
private static HashSet<HediffDef> cycledisablehediffs = null;
private static HashSet<GeneDef> cycledisablegenes = null;
public static List<ThingDef> AllRaces
{
@ -106,14 +108,40 @@ namespace RJW_Menstruation
return allbreasts;
}
}
public static HashSet<GeneDef> EggLayerGenes
private static HashSet<T> CycleDisableType<T>() where T: Def
{
return DefDatabase<T>.AllDefsListForReading.Where(def => def.GetModExtension<MenstruationModExtension>()?.disableCycle ?? false).ToHashSet();
}
public static HashSet<ThingDef> CycleDisableThings
{
get
{
if (egglayergenes != null) return egglayergenes;
egglayergenes = DefDatabase<GeneDef>.AllDefsListForReading.Where(geneDef => geneDef.GetModExtension<MenstruationModExtension>()?.disableCycle ?? false).ToHashSet();
if (cycledisablethings != null) return cycledisablethings;
cycledisablethings = CycleDisableType<ThingDef>();
cycledisablethings.UnionWith(DefDatabase<ThingDef>.AllDefsListForReading.Where(thingdef => thingdef.HasComp<CompEggLayer>()));
return egglayergenes;
return cycledisablethings;
}
}
public static HashSet<HediffDef> CycleDisableHediffs
{
get
{
if (cycledisablehediffs != null) return cycledisablehediffs;
cycledisablehediffs = CycleDisableType<HediffDef>();
return cycledisablehediffs;
}
}
public static HashSet<GeneDef> CycleDisableGenes
{
get
{
if (cycledisablegenes != null) return cycledisablegenes;
cycledisablegenes = CycleDisableType<GeneDef>();
return cycledisablegenes;
}
}

View file

@ -31,6 +31,7 @@
<li>rim.job.world</li>
<li>Abraxas.RJW.RaceSupport</li>
<li>rjw.milk.humanoid</li>
<li>rjw.quirks</li>
</loadAfter>
<incompatibleWithByVersion>
<v1.4>

View file

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

View file

@ -1,3 +1,31 @@
Version 1.6.2.4
- Fix error on startup and missing womb status in RJW tab with RJW 6.1.4.
Version 1.6.2.3
- Fix multiple breasts not appearing in the menstruation UI.
- Status of wombs now appears in RJW main tab, contributed by GhostClinic.
Version 1.6.2.2
- Pawns with multiple breasts will now display an udder in the menstruation UI.
- Updated Traditional Chinese translation by Hydrogen.
Version 1.6.2.1
- Modifiers in MenstruationModExtensions in ThingDefs and HediffDefs now function.
Version 1.6.2.0
- Added support for adding the MenstruationModExtension to ThingDefs and HediffDefs.
- This can be used to disable the menstrual cycle on pawns of particular types and with particular hediffs.
- The other modifiers in MenstruationModExtension have no effect when used in a ThingDef or HediffDef for now.
- Improved support for RJW Quirks.
Version 1.6.1.0
- Compatibility update for RJW 6.0.1.
- Requires RJW 6.0.1.
- Added red wings quirk when using the quirks submod.
- Improved compatibility with Eltoros Mechanoid Addon.
- Fix error when removing a vagina with a menstruation pregnancy.
- Added French translation by m4conazao
Version 1.6.0.0
- Support for RimWorld 1.6. All future changes to Menstruation will only be for RimWorld 1.6.
- New option added to the settings to hide wombs of infertile pawns.