diff --git a/.gitignore b/.gitignore index 2236aa5..b14b0f8 100644 --- a/.gitignore +++ b/.gitignore @@ -343,3 +343,6 @@ healthchecksdb *.psd *.dds *.pdn + +Directory.Build.props +Directory.Build.targets diff --git a/1.3/Defs/TaleDefs/Tales_Cum.xml b/1.3/Defs/TaleDefs/Tales_Cum.xml index 105f2b2..ff70353 100644 --- a/1.3/Defs/TaleDefs/Tales_Cum.xml +++ b/1.3/Defs/TaleDefs/Tales_Cum.xml @@ -14,7 +14,7 @@
  • image->[FUCKER_nameFull]'s penis deep inside of [FUCKED_nameFull]'s vagina [circumstance_group]
  • image->[FUCKER_nameFull]'s penis vanishing into [FUCKED_nameFull]'s vagina [circumstance_group]
  • image->[FUCKED_nameFull]'s vagina being filled by [FUCKER_nameFull]'s penis [circumstance_group]
  • -
  • image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [cirsumstance_group]
  • +
  • image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [circumstance_group]
  • circumstance_phrase->while [FUCKER_nameDef] grits [FUCKER_possessive] teeth
  • circumstance_phrase->while [FUCKER_nameDef] wears a triumphant smirk
  • circumstance_phrase->as [FUCKED_nameDef] shudders in ecstasy
  • diff --git a/1.4/Defs/TaleDefs/Tales_Cum.xml b/1.4/Defs/TaleDefs/Tales_Cum.xml index 105f2b2..ff70353 100644 --- a/1.4/Defs/TaleDefs/Tales_Cum.xml +++ b/1.4/Defs/TaleDefs/Tales_Cum.xml @@ -14,7 +14,7 @@
  • image->[FUCKER_nameFull]'s penis deep inside of [FUCKED_nameFull]'s vagina [circumstance_group]
  • image->[FUCKER_nameFull]'s penis vanishing into [FUCKED_nameFull]'s vagina [circumstance_group]
  • image->[FUCKED_nameFull]'s vagina being filled by [FUCKER_nameFull]'s penis [circumstance_group]
  • -
  • image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [cirsumstance_group]
  • +
  • image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [circumstance_group]
  • circumstance_phrase->while [FUCKER_nameDef] grits [FUCKER_possessive] teeth
  • circumstance_phrase->while [FUCKER_nameDef] wears a triumphant smirk
  • circumstance_phrase->as [FUCKED_nameDef] shudders in ecstasy
  • diff --git a/1.5/Defs/TaleDefs/Tales_Cum.xml b/1.5/Defs/TaleDefs/Tales_Cum.xml index 105f2b2..ff70353 100644 --- a/1.5/Defs/TaleDefs/Tales_Cum.xml +++ b/1.5/Defs/TaleDefs/Tales_Cum.xml @@ -14,7 +14,7 @@
  • image->[FUCKER_nameFull]'s penis deep inside of [FUCKED_nameFull]'s vagina [circumstance_group]
  • image->[FUCKER_nameFull]'s penis vanishing into [FUCKED_nameFull]'s vagina [circumstance_group]
  • image->[FUCKED_nameFull]'s vagina being filled by [FUCKER_nameFull]'s penis [circumstance_group]
  • -
  • image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [cirsumstance_group]
  • +
  • image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [circumstance_group]
  • circumstance_phrase->while [FUCKER_nameDef] grits [FUCKER_possessive] teeth
  • circumstance_phrase->while [FUCKER_nameDef] wears a triumphant smirk
  • circumstance_phrase->as [FUCKED_nameDef] shudders in ecstasy
  • diff --git a/1.6/Animal Genetics/assemblies/Animal Genetics.dll b/1.6/Animal Genetics/Assemblies/Animal Genetics.dll similarity index 93% rename from 1.6/Animal Genetics/assemblies/Animal Genetics.dll rename to 1.6/Animal Genetics/Assemblies/Animal Genetics.dll index 3117561..e28598f 100644 Binary files a/1.6/Animal Genetics/assemblies/Animal Genetics.dll and b/1.6/Animal Genetics/Assemblies/Animal Genetics.dll differ diff --git a/1.6/Animal Genetics/source/Animal Genetics/AGCompatibility.cs b/1.6/Animal Genetics/Source/Animal Genetics/AGCompatibility.cs similarity index 100% rename from 1.6/Animal Genetics/source/Animal Genetics/AGCompatibility.cs rename to 1.6/Animal Genetics/Source/Animal Genetics/AGCompatibility.cs diff --git a/1.6/Animal Genetics/source/Animal Genetics/Animal Genetics.csproj b/1.6/Animal Genetics/Source/Animal Genetics/Animal Genetics.csproj similarity index 98% rename from 1.6/Animal Genetics/source/Animal Genetics/Animal Genetics.csproj rename to 1.6/Animal Genetics/Source/Animal Genetics/Animal Genetics.csproj index 141619d..f4e6293 100644 --- a/1.6/Animal Genetics/source/Animal Genetics/Animal Genetics.csproj +++ b/1.6/Animal Genetics/Source/Animal Genetics/Animal Genetics.csproj @@ -25,7 +25,7 @@ pdbonly true - ..\..\assemblies\ + ..\..\Assemblies\ TRACE prompt 4 diff --git a/1.6/Animal Genetics/source/Animal Genetics/Harmony.cs b/1.6/Animal Genetics/Source/Animal Genetics/Harmony.cs similarity index 100% rename from 1.6/Animal Genetics/source/Animal Genetics/Harmony.cs rename to 1.6/Animal Genetics/Source/Animal Genetics/Harmony.cs diff --git a/1.6/Animal Genetics/source/Animal Genetics/packages.config b/1.6/Animal Genetics/Source/Animal Genetics/packages.config similarity index 100% rename from 1.6/Animal Genetics/source/Animal Genetics/packages.config rename to 1.6/Animal Genetics/Source/Animal Genetics/packages.config diff --git a/1.6/Assemblies/RJW_Menstruation.dll b/1.6/Assemblies/RJW_Menstruation.dll index de0b4d7..86b2376 100644 Binary files a/1.6/Assemblies/RJW_Menstruation.dll and b/1.6/Assemblies/RJW_Menstruation.dll differ diff --git a/1.6/Defs/RJWTab/PawnColumnDefs_Menstruation.xml b/1.6/Defs/RJWTab/PawnColumnDefs_Menstruation.xml new file mode 100644 index 0000000..1ef4a86 --- /dev/null +++ b/1.6/Defs/RJWTab/PawnColumnDefs_Menstruation.xml @@ -0,0 +1,11 @@ + + + + RJWMenstruation_Womb + Womb/Womb + Open womb status. Click the header to sort by womb presence and cycle stage. + RJW_Menstruation.MainTab.PawnColumnWorker_WombStatus + true + 34 + + diff --git a/1.6/Defs/TaleDefs/Tales_Cum.xml b/1.6/Defs/TaleDefs/Tales_Cum.xml index 105f2b2..ff70353 100644 --- a/1.6/Defs/TaleDefs/Tales_Cum.xml +++ b/1.6/Defs/TaleDefs/Tales_Cum.xml @@ -14,7 +14,7 @@
  • image->[FUCKER_nameFull]'s penis deep inside of [FUCKED_nameFull]'s vagina [circumstance_group]
  • image->[FUCKER_nameFull]'s penis vanishing into [FUCKED_nameFull]'s vagina [circumstance_group]
  • image->[FUCKED_nameFull]'s vagina being filled by [FUCKER_nameFull]'s penis [circumstance_group]
  • -
  • image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [cirsumstance_group]
  • +
  • image->[FUCKED_nameFull]'s vagina gripping [FUCKER_nameFull]'s penis tight [circumstance_group]
  • circumstance_phrase->while [FUCKER_nameDef] grits [FUCKER_possessive] teeth
  • circumstance_phrase->while [FUCKER_nameDef] wears a triumphant smirk
  • circumstance_phrase->as [FUCKED_nameDef] shudders in ecstasy
  • diff --git a/1.6/Humanoid Alien Races/assemblies/HAR.dll b/1.6/Humanoid Alien Races/Assemblies/HAR.dll similarity index 92% rename from 1.6/Humanoid Alien Races/assemblies/HAR.dll rename to 1.6/Humanoid Alien Races/Assemblies/HAR.dll index 271f4cb..611da42 100644 Binary files a/1.6/Humanoid Alien Races/assemblies/HAR.dll and b/1.6/Humanoid Alien Races/Assemblies/HAR.dll differ diff --git a/1.6/Humanoid Alien Races/source/Humanoid Alien Races/HARCompatibility.cs b/1.6/Humanoid Alien Races/Source/Humanoid Alien Races/HARCompatibility.cs similarity index 100% rename from 1.6/Humanoid Alien Races/source/Humanoid Alien Races/HARCompatibility.cs rename to 1.6/Humanoid Alien Races/Source/Humanoid Alien Races/HARCompatibility.cs diff --git a/1.6/Humanoid Alien Races/source/Humanoid Alien Races/Harmony.cs b/1.6/Humanoid Alien Races/Source/Humanoid Alien Races/Harmony.cs similarity index 100% rename from 1.6/Humanoid Alien Races/source/Humanoid Alien Races/Harmony.cs rename to 1.6/Humanoid Alien Races/Source/Humanoid Alien Races/Harmony.cs diff --git a/1.6/Humanoid Alien Races/source/Humanoid Alien Races/Humanoid Alien Races.csproj b/1.6/Humanoid Alien Races/Source/Humanoid Alien Races/Humanoid Alien Races.csproj similarity index 98% rename from 1.6/Humanoid Alien Races/source/Humanoid Alien Races/Humanoid Alien Races.csproj rename to 1.6/Humanoid Alien Races/Source/Humanoid Alien Races/Humanoid Alien Races.csproj index 38ce26b..ed75f73 100644 --- a/1.6/Humanoid Alien Races/source/Humanoid Alien Races/Humanoid Alien Races.csproj +++ b/1.6/Humanoid Alien Races/Source/Humanoid Alien Races/Humanoid Alien Races.csproj @@ -25,7 +25,7 @@ pdbonly true - ..\..\assemblies\ + ..\..\Assemblies\ TRACE prompt 4 diff --git a/1.6/Humanoid Alien Races/source/Humanoid Alien Races/packages.config b/1.6/Humanoid Alien Races/Source/Humanoid Alien Races/packages.config similarity index 100% rename from 1.6/Humanoid Alien Races/source/Humanoid Alien Races/packages.config rename to 1.6/Humanoid Alien Races/Source/Humanoid Alien Races/packages.config diff --git a/1.6/Languages/ChineseTraditional/Keyed/RJW_Menstruation.xml b/1.6/Languages/ChineseTraditional/Keyed/RJW_Menstruation.xml index 99bf5f0..d61c6b9 100644 --- a/1.6/Languages/ChineseTraditional/Keyed/RJW_Menstruation.xml +++ b/1.6/Languages/ChineseTraditional/Keyed/RJW_Menstruation.xml @@ -166,4 +166,7 @@ 已吸收 子宮處於月經週期之外。經過足夠的時間後,月經週期會恢復。 + + 對已經不育的子宮顯示子宮圖示 + 仍然展示不育的子宮狀態 diff --git a/1.6/Languages/French/DefInjected/ApparelLayerDef/ApparelLayerDefs_Absorber.xml b/1.6/Languages/French/DefInjected/ApparelLayerDef/ApparelLayerDefs_Absorber.xml new file mode 100644 index 0000000..74738f1 --- /dev/null +++ b/1.6/Languages/French/DefInjected/ApparelLayerDef/ApparelLayerDefs_Absorber.xml @@ -0,0 +1,7 @@ + + + + + génital + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/GeneCategoryDef/GeneDefs_Menstruation.xml b/1.6/Languages/French/DefInjected/GeneCategoryDef/GeneDefs_Menstruation.xml new file mode 100644 index 0000000..3989412 --- /dev/null +++ b/1.6/Languages/French/DefInjected/GeneCategoryDef/GeneDefs_Menstruation.xml @@ -0,0 +1,7 @@ + + + + + menstruation + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/GeneDef/GeneDefs_Menstruation.xml b/1.6/Languages/French/DefInjected/GeneDef/GeneDefs_Menstruation.xml new file mode 100644 index 0000000..dba149c --- /dev/null +++ b/1.6/Languages/French/DefInjected/GeneDef/GeneDefs_Menstruation.xml @@ -0,0 +1,44 @@ + + + + + Durée ovule double + + Les ovules non fécondés avec ce gène durent deux fois plus longtemps. + + + Ovulation double + + Les porteuses de ce gène ovuleront deux fois plus d’ovules. + + + Œstrus complet + + Les porteuses de ce gène entreront en œstrus complet à chaque cycle menstruel, quel que soit le type de vagin. + + + Jamais en œstrus + + Les porteuses de ce gène ne seront jamais en œstrus. + + + Pas de saignement + + Les porteuses de ce gène ne saigneront pas à la fin de leur cycle. + + + Durée ovule quadruple + + Les ovules avec ce gène durent quatre fois plus longtemps. + + + Ovulation quadruple + + Les porteuses de ce gène ovuleront quatre fois plus d’ovules. + + + Durée ovule courte + + Les ovules non fécondés avec ce gène durent les trois quarts de la durée normale. + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/HediffDef/Hediffs_Cum.xml b/1.6/Languages/French/DefInjected/HediffDef/Hediffs_Cum.xml new file mode 100644 index 0000000..7fd74f0 --- /dev/null +++ b/1.6/Languages/French/DefInjected/HediffDef/Hediffs_Cum.xml @@ -0,0 +1,22 @@ + + + + + Anticorps anti-sperme + + Anticorps anti-sperme. Augmente le taux de mortalité des spermatozoïdes. + + anticorps anti-sperme + + {0} possède un anticorps anti-sperme + + + Fertile + + fertile + + fertile + + {0} est fertile + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/HediffDef/Hediffs_Menstruation.xml b/1.6/Languages/French/DefInjected/HediffDef/Hediffs_Menstruation.xml new file mode 100644 index 0000000..2527648 --- /dev/null +++ b/1.6/Languages/French/DefInjected/HediffDef/Hediffs_Menstruation.xml @@ -0,0 +1,54 @@ + + + + + Influencé par les phéromones + + Condition causée par la présence d’une femme en œstrus. Le désir sexuel et la satisfaction augmentent avec l’odeur de chaleur. + + faible + + modéré + + fort + + + Cyclosporine + + Sous l’effet d’un immunosuppresseur, réduisant la capacité du corps à combattre infections et maladies. + + + Œstrus + + Condition causée par un utérus entrant dans la phase la plus fertile de son cycle menstruel. L’excitation 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. + + œstrus + + + Œstrus caché + + 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. + + œstrus + + + En période + + Saignement vaginal à la fin du cycle menstruel. Souvent douloureux. + + en période + + désagréable + + gênant + + courbaturé + + douleur intense + + + Antidouleur + + Soulagement léger de la douleur menstruelle (et autres sources de douleur). + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/JobDef/Jobs_CleanSelf.xml b/1.6/Languages/French/DefInjected/JobDef/Jobs_CleanSelf.xml new file mode 100644 index 0000000..3e9ca77 --- /dev/null +++ b/1.6/Languages/French/DefInjected/JobDef/Jobs_CleanSelf.xml @@ -0,0 +1,7 @@ + + + + + Lavage du vagin + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/JobDef/Jobs_MilkSelf.xml b/1.6/Languages/French/DefInjected/JobDef/Jobs_MilkSelf.xml new file mode 100644 index 0000000..9c6086f --- /dev/null +++ b/1.6/Languages/French/DefInjected/JobDef/Jobs_MilkSelf.xml @@ -0,0 +1,7 @@ + + + + + Allaitement + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/KeyBindingDef/KeyBindings_Menstruation.xml b/1.6/Languages/French/DefInjected/KeyBindingDef/KeyBindings_Menstruation.xml new file mode 100644 index 0000000..fed2bf6 --- /dev/null +++ b/1.6/Languages/French/DefInjected/KeyBindingDef/KeyBindings_Menstruation.xml @@ -0,0 +1,7 @@ + + + + + Menstruation : ouvrir la fenêtre d’état + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/RecipeDef/Recipes_Surgery_Breast.xml b/1.6/Languages/French/DefInjected/RecipeDef/Recipes_Surgery_Breast.xml new file mode 100644 index 0000000..38b89f9 --- /dev/null +++ b/1.6/Languages/French/DefInjected/RecipeDef/Recipes_Surgery_Breast.xml @@ -0,0 +1,46 @@ + + + + + Contracter les aréoles + + Contracter les aréoles. + + Contraction des aréoles + + + Contracter les tétons + + Contracter les tétons. + + Contraction des tétons + + + Assombrir les tétons + + Assombrir les tétons. + + Assombrissement des tétons + + + Élargir les aréoles + + Élargir les aréoles. + + Élargissement des aréoles + + + Élargir les tétons + + Élargir les tétons. + + Élargissement des tétons + + + Éclaircir les tétons + + Éclaircir les tétons. + + Éclaircissement des tétons + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/RecordDef/Records_Womb.xml b/1.6/Languages/French/DefInjected/RecordDef/Records_Womb.xml new file mode 100644 index 0000000..d34f3c1 --- /dev/null +++ b/1.6/Languages/French/DefInjected/RecordDef/Records_Womb.xml @@ -0,0 +1,14 @@ + + + + + Éjaculation interne + + Millilitres de sperme éjaculés dans mon utérus. + + + Œufs fécondés + + Nombre de mes œufs fécondés par des spermatozoïdes. + + diff --git a/1.6/Languages/French/DefInjected/StatDef/Stats_Absorber.xml b/1.6/Languages/French/DefInjected/StatDef/Stats_Absorber.xml new file mode 100644 index 0000000..21cf86e --- /dev/null +++ b/1.6/Languages/French/DefInjected/StatDef/Stats_Absorber.xml @@ -0,0 +1,11 @@ + + + + + Absorbable + + Quantité maximale de liquide que cet objet peut absorber. + + {0} ml + + diff --git a/1.6/Languages/French/DefInjected/TaleDef/Tales_Cum.xml b/1.6/Languages/French/DefInjected/TaleDef/Tales_Cum.xml new file mode 100644 index 0000000..85b6442 --- /dev/null +++ b/1.6/Languages/French/DefInjected/TaleDef/Tales_Cum.xml @@ -0,0 +1,43 @@ + + + + + Éjaculation interne + + +
  • tale_noun->[FUCKER_nameDef] éjacule dans [FUCKED_nameDef]
  • +
  • image->[FUCKER_nameFull] a son pénis profondément dans le vagin de [FUCKED_nameFull] [circumstance_group]
  • +
  • image->[FUCKER_nameFull] voit son pénis disparaître dans le vagin de [FUCKED_nameFull] [circumstance_group]
  • +
  • image->[FUCKED_nameFull] voit son vagin se remplir du pénis de [FUCKER_nameFull] [circumstance_group]
  • +
  • image->[FUCKED_nameFull] voit son vagin serrer fortement le pénis de [FUCKER_nameFull] [circumstance_group]
  • +
  • circumstance_phrase->pendant que [FUCKER_nameDef] serre ses dents
  • +
  • circumstance_phrase->pendant que [FUCKER_nameDef] arbore un sourire triomphant
  • +
  • circumstance_phrase->alors que [FUCKED_nameDef] frissonne de plaisir
  • +
  • circumstance_phrase->alors que [FUCKER_nameDef] éjacule dans [FUCKED_nameDef]
  • +
  • circumstance_phrase->pendant que [FUCKED_nameDef] regarde [FUCKER_nameDef] dans les yeux en souriant
  • +
  • desc_sentence->Le sperme de [FUCKER_nameDef] s’écoule du vagin de [FUCKED_nameDef] et tombe sur le sol.
  • +
  • desc_sentence->Le sperme de [FUCKER_nameDef] se précipite dans l’utérus de [FUCKED_nameDef] et féconde un œuf de [FUCKED_nameDef].
  • +
  • desc_sentence->Le sperme de [FUCKER_nameDef] est éjaculé dans l’utérus de [FUCKED_nameDef].
  • +
  • desc_sentence->L’utérus de [FUCKED_nameDef] est rempli de sperme.
  • +
  • desc_sentence->De la sueur coule sur le visage de [FUCKER_nameDef].
  • +
  • desc_sentence->[FUCKED_nameDef] halète lourdement.
  • +
    + +
    \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/ThingDef/Apparel_Absorbers.xml b/1.6/Languages/French/DefInjected/ThingDef/Apparel_Absorbers.xml new file mode 100644 index 0000000..08f3d45 --- /dev/null +++ b/1.6/Languages/French/DefInjected/ThingDef/Apparel_Absorbers.xml @@ -0,0 +1,24 @@ + + + + + Serviette hygiénique + + Une serviette pour absorber les fluides du vagin. + + + Serviette hygiénique humide + + Une serviette utilisée et humide. + + + Tampon + + Un tampon pour absorber les fluides du vagin. Peut provoquer une infection s’il est porté trop longtemps. + + + Tampon sale + + Un tampon utilisé et humide. Peut provoquer une infection s’il est laissé en place. + + diff --git a/1.6/Languages/French/DefInjected/ThingDef/Filth_Mixture.xml b/1.6/Languages/French/DefInjected/ThingDef/Filth_Mixture.xml new file mode 100644 index 0000000..5f5f148 --- /dev/null +++ b/1.6/Languages/French/DefInjected/ThingDef/Filth_Mixture.xml @@ -0,0 +1,7 @@ + + + + + mélange + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/ThingDef/Pills_Menstruation.xml b/1.6/Languages/French/DefInjected/ThingDef/Pills_Menstruation.xml new file mode 100644 index 0000000..8e5047f --- /dev/null +++ b/1.6/Languages/French/DefInjected/ThingDef/Pills_Menstruation.xml @@ -0,0 +1,40 @@ + + + + + Cyclosporine + + Un immunosuppresseur. Peut soigner l’anticorps antispermatozoïde, mais réduit la capacité du corps à combattre infections et maladies pendant 24 heures. + + Prendre {0} + + Prise de {0}. + + + Comprimé de régénération ovarienne + + Restaure la santé des ovaires et une partie des ovules. Moins efficace sur des ovaires presque vides. Ne peut pas inverser la ménopause. + + Prendre {0} + + Prise de {0}. + + + Antidouleur + + Soulage les douleurs menstruelles pendant 24 heures. Également efficace contre d’autres douleurs. + + Prendre {0} + + Prise de {0}. + + + Agent de superovulation + + Induit une superovulation, provoquant la production de 1 à 4 ovules supplémentaires à la prochaine ovulation. Peut accélérer l’apparition de la ménopause. + + Prendre {0} + + Prise de {0}. + + \ No newline at end of file diff --git a/1.6/Languages/French/DefInjected/ThoughtDef/Thoughts_sex.xml b/1.6/Languages/French/DefInjected/ThoughtDef/Thoughts_sex.xml new file mode 100644 index 0000000..bcb230a --- /dev/null +++ b/1.6/Languages/French/DefInjected/ThoughtDef/Thoughts_sex.xml @@ -0,0 +1,99 @@ + + + + + {0} a éjaculé à l'intérieur + + Je suis inquiète de pouvoir tomber enceinte. + + + {0} a éjaculé à l'intérieur + + J'espère tomber enceinte. + + + {0} a éjaculé à l'intérieur + + Je ne pense pas tomber enceinte, mais c'est amusant de fantasmer. + + + {0} a éjaculé à l'intérieur + + J'espère que cela me rendra enceinte comme je devrais l'être. + + + {0} a éjaculé à l'intérieur + + Je suis inquiète de pouvoir tomber enceinte. La chance est faible, mais… + + + a éjaculé à l'intérieur de {0} + + Cela faisait tellement de bien. + + + a éjaculé à l'intérieur de {0} + + C'est mon devoir de la rendre enceinte. + + + Restauration des ovules reçue + + Je peux encore produire des ovules un peu plus longtemps. + + + {0} a éjaculé à l'intérieur + + Je ne veux pas être enceinte de son bébé ! + + + {0} a éjaculé à l'intérieur + + À quoi pensais-je, en le laissant faire ça ? + + + {0} a éjaculé à l'intérieur + + Je sais que je devrais devenir enceinte, mais est-ce que ça doit être avec lui ? + + + {0} a éjaculé à l'intérieur + + Je ne tomberai probablement pas enceinte, mais ça ne me plaît toujours pas. + + + a éjaculé à l'intérieur de {0} + + J'ai éjaculé à l'intérieur de ma rivale ! + + + a pris une pilule contraceptive + + Je veux tomber enceinte. + + + a pris une pilule contraceptive + + Mes convictions exigent que je devienne enceinte. + + + écoulement de fluides + + Ne puis-je rien utiliser pour absorber ça ? + + + a pris la pilule contraceptive + + Tout ira bien maintenant. + + + grossesse non désirée + + Comment vais-je m'occuper d'un bébé ? Que vais-je faire ? + + + grossesse non désirée + + Je vais avoir un bébé. J'espère que je pourrai gérer. + + \ No newline at end of file diff --git a/1.6/Languages/French/Keyed/RJW_Menstruation.xml b/1.6/Languages/French/Keyed/RJW_Menstruation.xml new file mode 100644 index 0000000..d1b4bac --- /dev/null +++ b/1.6/Languages/French/Keyed/RJW_Menstruation.xml @@ -0,0 +1,321 @@ + + + + Cycle menstruel RJW + + + Sang menstruel + + Vide + + Folliculaire + + Ovulation + + Lutéale + + Menstruations + + Enceinte + + Récupération post-partum + + Aucune + + Climatérique + + Ménopause + + Anœstrus + + Les ovaires se préparent à libérer un ovule. L’ovulation aura lieu à la fin de cette phase. + + Les ovaires se préparent à libérer un ovule. L’ovulation aura lieu si du sperme entre dans l’utérus. + + Les ovaires libèrent un ovule dans l’utérus. + + L’utérus est prêt à recevoir un ovule fécondé. Une grossesse surviendra si un ovule s’implante avant la fin de cette phase. + + L’utérus se débarrasse de sa muqueuse, ainsi que des ovules non fécondés. + + Un bébé grandit dans l’utérus. Avec du temps et des soins, il deviendra un nouvel habitant de ce monde. + + L’utérus se rétablit de sa récente grossesse. + + L’utérus n’est pas fertile et ne peut pas concevoir. + + Les ovaires approchent de l’épuisement et le cycle devient irrégulier. + + Les ovaires sont épuisés et l’utérus ne peut plus produire d’ovules. + + L’utérus est hors saison de reproduction. Le cycle reprendra quand les conditions seront réunies. + + L’utérus est entre deux cycles. Le cycle reprendra après un certain temps. + + État + + Allaitement + + État + + Fœtus + + Père + + Liste de sperme + + Fécondé + + En fécondation + + Ovulé + + + + Père inconnu + + Absorbé + + + + Activer l’icône utérus + + Activer le bouton dans l’onglet santé + + Activer le cycle animal + + Simuler les cycles animaux. Non recommandé. + + Chance d’implantation + + Chance de base d’implantation de l’ovule fécondé. Affecte la probabilité de grossesse. + + Chance de fécondation + + Chance de fécondation par ml de sperme par heure. Affecte la probabilité de grossesse. + + Perte de sperme par heure + + La quantité de sperme dans l’utérus diminue de ce montant chaque heure. Affecte la probabilité de grossesse. + + Perte de fertilité du sperme par heure + + Le sperme perd sa fertilité de ce montant chaque heure. Affecte indirectement la chance de fécondation. + + Accélération du cycle + + 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). + + Intervalle mise à jour colones + + 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. + + Intervalle mise à jour non-colones + + 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. + + Intervalle mise à jour animaux + + Fréquence de mise à jour des utérus des animaux. Réduire améliore la précision, augmenter améliore la performance. + + Débogage + + Afficher les informations de débogage. + + État de l’utérus + + Afficher l’icône utérus dans la fenêtre d’état. + + État vagin et seins + + Afficher les icônes vagin, anus et seins dans la fenêtre d’état. + + Niveau information fœtus + + Afficher toutes les informations sur le fœtus. + + Afficher toutes les informations sur le fœtus après découverte de la grossesse. + + Afficher seulement l’image du fœtus après découverte de la grossesse. + + Ne pas afficher d’information sur le fœtus. + + Activer ménopause + + Activer l’effet ménopause qui rend infertile lorsque les ovules sont épuisés. Désactiver pour races longévives. + + Activer phéromones + + Autoriser les humanoïdes en œstrus visible à augmenter le désir sexuel des mâles proches. + + Effet phéromones animaux + + Définir l’effet des animaux en œstrus visible sur les humanoïdes. + + Activer grossesses multiples + + Utiliser grossesses multiples au lieu de la grossesse RJW par défaut. Désactiver si problème d’implantation. RJW doit rester activé. + + Activer jumeaux hétéro-ovulaires + + Autoriser la grossesse à partir de plusieurs ovules en même temps. + + Activer jumeaux enzygotiques + + Autoriser un ovule unique à produire plusieurs enfants identiques. + + Chance jumeaux enzygotiques + + Chance d’avoir des jumeaux identiques. + + Nombre max jumeaux identiques + + Nombre maximum de frères et sœurs identiques. + + Activer superposition ovule + + Afficher superposition des ovules sur icône utérus. + + Quantité de saignement + + Quantité totale estimée + + Quantité approximative de saignement. Normale : 20~80 ml par cycle. + + Colone + + Prisonnière + + Faction alliée + + Neutre + + Faction hostile + + Cibles : + + Le gizmo et le bouton apparaîtront pour ces pions. + + Activer extension hybride + + Remplace les définitions hybrides RJW et RaceSupport. L’extension dominante est prioritaire. Ne pas modifier. + + Extension hybride dominante + + Mère + + Père + + Croissance des seins pendant la grossesse + + Modifier combien les seins d’une femme enceinte vont grandir. Certaines croîtront plus que d’autres. + + Changement des tétons pendant la grossesse + + Modifier combien les tétons d’une femme enceinte vont changer. + + Changement permanent des tétons après la grossesse + + Modifie combien des changements des tétons restent après la grossesse. + + Personnaliser hybrides + + Ouvrir éditeur hybride personnalisé. Remplace les définitions hybrides XML. + + Autoriser la réduction de l’icône + + Permet à l’icône de devenir plus petite si nécessaire. + + Multiplicateur durée ovule + + Multiplie la durée de vie des ovules. Tous les ovules non implantés meurent à la fin de la phase lutéale. + + Activer métamorphose du vagin post-partum + + Activer l’étirement permanent du vagin après la naissance. Désactiver si un autre mod gère cela. + + Puissance de la métamorphose + + Définir la puissance de la métamorphose. + + Œstrus remplace RJW + + 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. + + Baisabilité minimale pendant l’œstrus + + Attractivité minimale pendant l’œstrus + + Opinion minimale pendant l’œstrus + + Durée de vie du sperme estimée + + Durée de vie de l’ovule estimée + + Ovulation {0} + + Chance que chaque ovule soit libéré à l’ovulation. + + Chance d’implantation des ovules fécondés. Chance de fécondation cette heure : {0}% + + Utiliser grossesse RJW de base + + Utiliser grossesses multiples menstruelles + + Utiliser grossesse Biotech + + Autoriser jumeaux/plusieurs bébés pour une seule grossesse Biotech + + Autorise jumeaux identiques et hétéro-ovulaires avec Biotech. Permet aussi système hybride, mais deux humanoïdes ne peuvent produire un animal. + + Afficher le statut de l’utérus en cours de mobilisation + + Afficher l’icône de l’utérus en cours de mobilisation + + Afficher le statut d’un utérus infertile + + Afficher l’icône d’un utérus infertile + + Réinitialiser par défaut + + + Nettoyage vaginal + + + Éditeur Hybrides Personnalisé + + Hybrides de {0} + + 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. + + + Pas d’ovules + + Doit avoir un utérus + + {PAWN_labelShort} a terminé son cycle de restauration des ovules. + + \ No newline at end of file diff --git a/1.6/Patches/RJW_PawnTableDefs.xml b/1.6/Patches/RJW_PawnTableDefs.xml new file mode 100644 index 0000000..edbc555 --- /dev/null +++ b/1.6/Patches/RJW_PawnTableDefs.xml @@ -0,0 +1,19 @@ + + + + +
  • + /Defs/PawnTableDef[defName="RJW_PawnTable_Colonists"]/columns/li[text()="Pregnant"] + +
  • RJWMenstruation_Womb
  • + + +
  • + /Defs/PawnTableDef[defName="RJW_PawnTable_Property"]/columns/li[text()="Pregnant"] + +
  • RJWMenstruation_Womb
  • + + +
    +
    +
    diff --git a/1.6/Quirks/Assemblies/Quirks.dll b/1.6/Quirks/Assemblies/Quirks.dll new file mode 100644 index 0000000..91a4a19 Binary files /dev/null and b/1.6/Quirks/Assemblies/Quirks.dll differ diff --git a/1.6/Quirks/Defs/RJWQuirks.QuirkDef/RedWings.xml b/1.6/Quirks/Defs/RJWQuirks.QuirkDef/RedWings.xml new file mode 100644 index 0000000..93d41ec --- /dev/null +++ b/1.6/Quirks/Defs/RJWQuirks.QuirkDef/RedWings.xml @@ -0,0 +1,14 @@ + + + + + RedWings + + {pawn} enjoys partners who are menstruating and enjoys having menstrual blood on {pawn_possessive} penis + + +
  • + + true + + \ No newline at end of file diff --git a/1.6/Quirks/source/Quirks/Harmony.cs b/1.6/Quirks/Source/Quirks/Harmony.cs similarity index 100% rename from 1.6/Quirks/source/Quirks/Harmony.cs rename to 1.6/Quirks/Source/Quirks/Harmony.cs diff --git a/1.6/Quirks/source/Quirks/Quirks.csproj b/1.6/Quirks/Source/Quirks/Quirks.csproj similarity index 95% rename from 1.6/Quirks/source/Quirks/Quirks.csproj rename to 1.6/Quirks/Source/Quirks/Quirks.csproj index 891b564..405ea2b 100644 --- a/1.6/Quirks/source/Quirks/Quirks.csproj +++ b/1.6/Quirks/Source/Quirks/Quirks.csproj @@ -25,7 +25,7 @@ pdbonly true - ..\..\assemblies\ + ..\..\Assemblies\ TRACE prompt 4 @@ -59,7 +59,7 @@ - + @@ -71,5 +71,8 @@ False + + + \ No newline at end of file diff --git a/1.6/Quirks/source/Quirks/QuirksCompatibility.cs b/1.6/Quirks/Source/Quirks/QuirksCompatibility.cs similarity index 79% rename from 1.6/Quirks/source/Quirks/QuirksCompatibility.cs rename to 1.6/Quirks/Source/Quirks/QuirksCompatibility.cs index b485198..c4da198 100644 --- a/1.6/Quirks/source/Quirks/QuirksCompatibility.cs +++ b/1.6/Quirks/Source/Quirks/QuirksCompatibility.cs @@ -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.GetNamed("Breeder"); - private static QuirkDef Impregnation = DefDatabase.GetNamed("ImpregnationFetish"); - private static QuirkDef Messy = DefDatabase.GetNamed("Messy"); - private static QuirkDef Teratophile = DefDatabase.GetNamed("Teratophile"); } [HarmonyPatch(typeof(PartnerCanImpregnatePawn), nameof(PartnerCanImpregnatePawn.SatisfiedByPartner))] diff --git a/1.6/Quirks/Source/Quirks/RedWings.cs b/1.6/Quirks/Source/Quirks/RedWings.cs new file mode 100644 index 0000000..0623748 --- /dev/null +++ b/1.6/Quirks/Source/Quirks/RedWings.cs @@ -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 partnerParts = sexProps.IsInitiator() ? sexProps.resolved.RecipientParts : sexProps.resolved.InitiatorParts; + return partnerParts.Any(part => part.Family == LewdablePartFamily.Vagina) && SatisfiedByPartner(sexProps.pawn, sexProps.partner); + } + } +} diff --git a/1.6/Quirks/source/Quirks/packages.config b/1.6/Quirks/Source/Quirks/packages.config similarity index 100% rename from 1.6/Quirks/source/Quirks/packages.config rename to 1.6/Quirks/Source/Quirks/packages.config diff --git a/1.6/Quirks/assemblies/Quirks.dll b/1.6/Quirks/assemblies/Quirks.dll deleted file mode 100644 index 1d479c0..0000000 Binary files a/1.6/Quirks/assemblies/Quirks.dll and /dev/null differ diff --git a/1.6/Quirks/source/Quirks/Properties/AssemblyInfo.cs b/1.6/Quirks/source/Quirks/Properties/AssemblyInfo.cs deleted file mode 100644 index c627d22..0000000 --- a/1.6/Quirks/source/Quirks/Properties/AssemblyInfo.cs +++ /dev/null @@ -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")] diff --git a/1.6/Vanilla Expanded Core/assemblies/VECore.dll b/1.6/Vanilla Expanded Core/Assemblies/VECore.dll similarity index 92% rename from 1.6/Vanilla Expanded Core/assemblies/VECore.dll rename to 1.6/Vanilla Expanded Core/Assemblies/VECore.dll index 41d7ff1..f47a501 100644 Binary files a/1.6/Vanilla Expanded Core/assemblies/VECore.dll and b/1.6/Vanilla Expanded Core/Assemblies/VECore.dll differ diff --git a/1.6/Vanilla Expanded Core/source/VECore/Harmony.cs b/1.6/Vanilla Expanded Core/Source/VECore/Harmony.cs similarity index 100% rename from 1.6/Vanilla Expanded Core/source/VECore/Harmony.cs rename to 1.6/Vanilla Expanded Core/Source/VECore/Harmony.cs diff --git a/1.6/Vanilla Expanded Core/source/VECore/VECompatibility.cs b/1.6/Vanilla Expanded Core/Source/VECore/VECompatibility.cs similarity index 100% rename from 1.6/Vanilla Expanded Core/source/VECore/VECompatibility.cs rename to 1.6/Vanilla Expanded Core/Source/VECore/VECompatibility.cs diff --git a/1.6/Vanilla Expanded Core/source/VECore/VECore.csproj b/1.6/Vanilla Expanded Core/Source/VECore/VECore.csproj similarity index 98% rename from 1.6/Vanilla Expanded Core/source/VECore/VECore.csproj rename to 1.6/Vanilla Expanded Core/Source/VECore/VECore.csproj index 4562f6f..b582d79 100644 --- a/1.6/Vanilla Expanded Core/source/VECore/VECore.csproj +++ b/1.6/Vanilla Expanded Core/Source/VECore/VECore.csproj @@ -25,7 +25,7 @@ pdbonly true - ..\..\assemblies\ + ..\..\Assemblies\ TRACE prompt 4 diff --git a/1.6/Vanilla Expanded Core/source/VECore/packages.config b/1.6/Vanilla Expanded Core/source/VECore/packages.config deleted file mode 100644 index dd3bf9a..0000000 --- a/1.6/Vanilla Expanded Core/source/VECore/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Cum.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Cum.cs index b02d683..94eecdb 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Cum.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Cum.cs @@ -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) diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs index a36f5bf..afca25e 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs @@ -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()).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(); + 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()).Where(ext => ext != null)) + ProcessExtension(geneExtension); + + foreach (MenstruationModExtension hediffExtension in Pawn.health.hediffSet.hediffs.Select(hediff => hediff.def.GetModExtension()).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 GetFluids() + { + return cums ?? Enumerable.Empty(); + } + public IEnumerable GetFluids(Pawn pawn) { return cums?.Where(cum => cum.pawn == pawn) ?? Enumerable.Empty(); @@ -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() != null || pregnancy is Hediff_MechanoidPregnancy) + else if (Pawn.health.hediffSet.GetFirstHediff() != 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(Pawn, egg.fertilizer); + pregnancy = Hediff_BasePregnancy.Create(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); } } diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Pheromones.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Pheromones.cs index cd41c92..d15d49b 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Pheromones.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Pheromones.cs @@ -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 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; } diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs index 4d5acc1..92f5dfc 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs @@ -33,7 +33,7 @@ namespace RJW_Menstruation public static HediffComp_Menstruation GetRandomMenstruationComp(this Pawn pawn, bool preferDangerDay = false) { List 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(); + 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()?.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(); - 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()?.BabyCount ?? 1; - string fetustex = babydef.GetModExtension()?.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.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.Get("Eggs/Egg_Implanted00", true); else break; } @@ -316,11 +308,11 @@ namespace RJW_Menstruation return ContentFinder.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.Get("Genitals/Anal00", true); + if (!pawn.GetAnusList().Any()) return ContentFinder.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() != 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; } diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs index 8d36346..e67afc0 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs @@ -10,6 +10,12 @@ namespace RJW_Menstruation { protected Dictionary enzygoticSiblings = new Dictionary(); // 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(); } } - } diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/MainTab/PawnColumnWorker_WombStatus.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/MainTab/PawnColumnWorker_WombStatus.cs new file mode 100644 index 0000000..3c28db8 --- /dev/null +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/MainTab/PawnColumnWorker_WombStatus.cs @@ -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; + } + } +} diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs index d45cf97..7ff4746 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs @@ -79,6 +79,7 @@ namespace RJW_Menstruation __result = "CannotPregnant".Translate(); return; } + if (!pawn.ShouldCycle()) return; IEnumerable 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()) return; + foreach (HediffComp_Menstruation comp in ___pawn.GetMenstruationComps()) + comp.Notify_HediffsChanged(); + } + } + [HarmonyPatch(typeof(Pawn_GeneTracker), "Notify_GenesChanged")] public class Notify_GenesChanged_Patch { diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs index 7838e01..8c2b59b 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs @@ -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(); diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs index 2fdd516..fa25f4c 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs @@ -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 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); } } diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/EstrusPreferences.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Preferences.cs similarity index 96% rename from 1.6/source/RJW_Menstruation/RJW_Menstruation/EstrusPreferences.cs rename to 1.6/source/RJW_Menstruation/RJW_Menstruation/Preferences.cs index 3bf07ac..1cb9411 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/EstrusPreferences.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Preferences.cs @@ -111,8 +111,10 @@ namespace RJW_Menstruation } public override IEnumerable 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)); } } } diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/QuirkUtility.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/QuirkUtility.cs index 6c4c658..497015d 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/QuirkUtility.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/QuirkUtility.cs @@ -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); } } diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj b/1.6/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj index 7915523..26593c6 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj @@ -67,7 +67,7 @@ - + @@ -90,6 +90,7 @@ + @@ -178,4 +179,4 @@ - \ No newline at end of file + diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs index 72706ef..e172853 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs @@ -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); diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Utility.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Utility.cs index bf5c37c..854e200 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Utility.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Utility.cs @@ -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 pregnancies = new List(); 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(); - string icon; - if (comp != null) icon = comp.BreastTex ?? "Breasts/Breast_Breast"; - else - { - breast = ContentFinder.Get("Breasts/Breast_Breast00", false); - nipple = ContentFinder.Get("Breasts/Breast_Breast00_Nipple00", false); - areola = ContentFinder.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.Get(icon, false); - areola = ContentFinder.Get(areolaicon, false); - nipple = ContentFinder.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.Get("Breasts/Breast_Breast00", false); nipple = ContentFinder.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(); + 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.Get(icon, false); + areola = ContentFinder.Get(areolaicon, false); + nipple = ContentFinder.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 ""; } diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/VariousDefOf.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/VariousDefOf.cs index 2852366..a74bff6 100644 --- a/1.6/source/RJW_Menstruation/RJW_Menstruation/VariousDefOf.cs +++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/VariousDefOf.cs @@ -53,7 +53,9 @@ namespace RJW_Menstruation private static HashSet allvaginas = null; private static HashSet allanuses = null; private static HashSet allbreasts = null; - private static HashSet egglayergenes = null; + private static HashSet cycledisablethings = null; + private static HashSet cycledisablehediffs = null; + private static HashSet cycledisablegenes = null; public static List AllRaces { @@ -106,14 +108,40 @@ namespace RJW_Menstruation return allbreasts; } } - public static HashSet EggLayerGenes + + private static HashSet CycleDisableType() where T: Def + { + return DefDatabase.AllDefsListForReading.Where(def => def.GetModExtension()?.disableCycle ?? false).ToHashSet(); + } + public static HashSet CycleDisableThings { get { - if (egglayergenes != null) return egglayergenes; - egglayergenes = DefDatabase.AllDefsListForReading.Where(geneDef => geneDef.GetModExtension()?.disableCycle ?? false).ToHashSet(); + if (cycledisablethings != null) return cycledisablethings; + cycledisablethings = CycleDisableType(); + cycledisablethings.UnionWith(DefDatabase.AllDefsListForReading.Where(thingdef => thingdef.HasComp())); - return egglayergenes; + return cycledisablethings; + } + } + public static HashSet CycleDisableHediffs + { + get + { + if (cycledisablehediffs != null) return cycledisablehediffs; + cycledisablehediffs = CycleDisableType(); + + return cycledisablehediffs; + } + } + public static HashSet CycleDisableGenes + { + get + { + if (cycledisablegenes != null) return cycledisablegenes; + cycledisablegenes = CycleDisableType(); + + return cycledisablegenes; } } diff --git a/About/About.xml b/About/About.xml index ddd0ad6..5dd0b8e 100644 --- a/About/About.xml +++ b/About/About.xml @@ -31,6 +31,7 @@
  • rim.job.world
  • Abraxas.RJW.RaceSupport
  • rjw.milk.humanoid
  • +
  • rjw.quirks
  • diff --git a/About/Manifest.xml b/About/Manifest.xml index f53ced8..bef173d 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@ RJW Menstruation - 1.6.0.0 + 1.6.2.4 diff --git a/changelogs.txt b/changelogs.txt index 50ca8da..7316879 100644 --- a/changelogs.txt +++ b/changelogs.txt @@ -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.