Merge pull request #125 from vegapnk/2.2

2.2.0
This commit is contained in:
vegapnk 2024-07-23 12:18:38 +02:00 committed by GitHub
commit 8960994491
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
130 changed files with 3242 additions and 305 deletions

View file

@ -1,4 +1,196 @@
# 2.1.0
# 2.2.0 (23-07-2024)
## Explanations
**Genetic Diseases**:
This update introduces genetic diseases that are shared on sex.
Infection is handled when sex finishes, so a coitus-interruptus will not result in infections.
Infections can be
- Turned off entirely
- Spread only on penetrative sex
- Chances are adjustable per XML per Gene
By turning their spread off, you effectively have a set of normal negative genes.
Dead pawns can spread diseases, but cannot receive them. For all you necros out there.
*Why???*
Most of the genes so far were positive or neutral,
so I got some fair requests to introduce negative genes to keep xenotypes balanced.
I know that this is some overlap with the STD mod, but well ... you are free to turn things off?
In theory, you can specify and gene of any kind to be spreadable by sex, not only ones written by this mod.
**Genetic Infectors**:
These Genes can apply a genetic disease, but are not genetic diseases themselves.
A single infector gene can have multiple resulting diseases, see this extension example:
```xml
<li Class="RJW_Genes.GeneticInfectorExtension">
<infectionChance>0.05</infectionChance>
<infectionGenes>
<li>rjw_genes_size_blinded</li>
<li>rjw_genes_infectious_bisexuality</li>
</infectionGenes>
</li>
```
The infection-chance is applied per gene - for the example above there would be a 5% chance to apply `size_blinded` and 5% chance to apply `infectious_bisexuality`.
Multiple infections can happen on a single sex.
The `infectionGenes` can be any gene, this is not limited to genetic diseases (e.g. ugly or something).
*Infectors* are always applied even if the genetic disease spread is turned off.
The created genetic diseases will follow the logic outlined above.
**Disease Immunity**:
Pawns can be immune to genetic diseases.
This is either done with a specialised gene (`rjw_genes_genetic_disease_immunity`)
or by genes giving specific immunities.
Any gene can give immunity against any genetic disease using an extension:
```xml
<li Class="RJW_Genes.ImmunityAgainstGenesExtension">
<givesImmunityAgainst>
<li>rjw_genes_size_blinded</li>
</givesImmunityAgainst>
</li>
```
These extensions can be slapped on any gene,
but they are meant mostly to have infectors immune against their own diseases.
**Twinkification / Feminization**:
Both approaches follow the same general logic.
- Pawn `A` has Twinkifier Gene and fucks Pawn `B`
- `B` receives a `twinkification progress` hediff with some effects
- Upon having ANY sex, `B` can gain genes from a relevant genepool.
- Genes can be minor or major, depending on the progress of twinkification.
Pawn `B` might be immune against twinkifier as normal immunity logic against diseases.
But once the hediff is there, the twinkification can happen unless you wait for it to cool down.
Gene additions are subject to an application chance (25% for minor, 10% for major)
and might try to add a gene that already exists - then nothing happens.
*Twink Genepool*:
- (Minor) Body_Thin
- (Minor) Homosexual
- (Minor) Beard_NoBeardOnly
- (Minor) Small male genitalia
- (Major) Minor Vulnerability
- (Major) Infectious Homosexuality
- (Major) Delicate
- (Major) Beauty Pretty
- (Major) Fertile Anus
*Feminization Genepool*:
- (Minor) Long Hair
- (Minor) No-Beard
- (Minor) Small Male Genitals
- (Minor) No Cum
- (Minor) Big Breasts (will only show later)
- (Major) Female Only
- (Major) No Penis
- (Major) Minor Vulnerability
You can configure all genes, as well as their application chance, in the Genes` XML.
*Why are these changes Genetic?*
Because this is the genes mod, and I find things here quite robust.
## Changelog
**Additions:**
- Gene: Genetic Disease Immunity. cannot get infected by any genetic diseases, and won't be affected by some other genes (see relevant genes)
- Disease Gene: Vulnerability. Pawn is likelier to be raped
- Disease Gene: Infectious Hypersexuality
- Disease Gene: Infectious Homosexuality & Bisexuality
- Disease Gene: Infectious lower fertility
- Disease Gene: Infectious higher sex need
- Disease Gene: Fluctual Sexual Need. (Configurable) Chance to reset sex-need to near-zero and gain a bit of rest-need.
- Disease Gene: Size Blinded. Pawns have a higher chance for hooking up with pawns with a big cock, lower chance for small cocks.
- Infector Gene: Genetic Stretcher. Pawns can infect other pawns with *Size Blinded*
- Gene: Hardwired Progenity. Pawns with this get a malus on having no-children, and bonus on having a lot.
- Gene: Sexual Genetic Swap. Pawns have a chance to switch a random gene with their sexpartner.
- (Archite) Gene: Sexual Genetic Thief. Pawns have a chance to steal a gene from their sexpartner. Genetic Disease Immunity shields against this.
- Gene: Sperm Displacement. Pawns might overwrite an existing pregnancy, becoming the new father. The pregnancy will stay in its gestation progress.
- Gene: Twinkification. Pawns turn their (male) sexual partners into breedable twinks.
- Gene: Feminization. Pawns turn their (male) sexual partners into women.
- Gene: Blocked Masturbation. Pawns cannot masturbate.
- {Sexperience} Gene: Living Cumbucket. Pawns with this Gene get "filled" upon sex, and slowly disperse usable gathered cum.
- Disease Gene: Infectious Blocked Masturbation
- Gene: Rut. Pawns have a chance to go into heat and need more sex for a day. (Default: 5% chance per day, to go 1 day in heat).
- Disease Gene: Infectious Rut.
- Pawns will have negative thoughts about pawns with more genetic diseases than themselves.
- Faction Penalties for spreading diseases, stealing genes and aging pawns with age transfer
- Patch for [Imphilee Xeno](https://steamcommunity.com/sharedfiles/filedetails/?id=2990674516) by @Bunuffin
**Changes**::
- Cum-Amount-Changing genes now are XML Adjustable and share a single `.cs`-class
- Incubi are now Bisexual too, as they should be.
**Fixes:**
- Fixed an Issue where pawns would always get the Pheromone social boost, unless they had the pheromone (#113)
- Fixed two hidden dependencies on Ideology and Royalty (#115)
- Fixed some more hidden dependencies on Ideology Icons (#118)
- Fixed a hidden dependency on Licentialabs (#119)
**Internal:**
- GenderFluid-Gene now uses a generalized `TickBasedChanceExtension` over its unique special `GenderFluidExtension`
- Introduced a `ModLog.Debug` Function that checks for the settings before printing - trying to spread it over the whole project.
- Removed TODO File. I have enough to do.
**Notes:**
*One Time Error Load*
The changes to the cum-gene will give a 1-time warning on loading the save. The warning looks like this:
```
Could not find class RJW_Genes.Gene_MuchCum while resolving node li. Trying to use Verse.Gene instead. Full node: <li Class="RJW_Genes.Gene_MuchCum"><def>rjw_genes_much_cum</def><pawn>Thing_Human697</pawn><overriddenByGene>null</overriddenByGene><loadID>82</loadID></li>
UnityEngine.StackTraceUtility:ExtractStackTrace ()
Verse.Log:Error (string)
...
```
This is not dangerous.
*Blocked Masturbation*
Might not be fully working - for testing, I run things in DevMode, and I can just order people to masturbate.
Please playtest this a bit for me, as I want to make it work nicely.
*Supporting*
You can now support me with [buying me a coffee](https://buymeacoffee.com/vegapnk).
The mod will remain free, open source and I will not hide or lock any features.
Its just meant if you want to drop me a tip.
**Since Beta-1** (11-07-2024)
- Made the Feminizer and Twinkifier configurable with XML.
- Typos in the Hediff Defs, tweaking of some values.
- Living Cum-Bucket & Rut Genes
- Great icons by @Alpenglow
**Since Beta-2** (17-07-2024)
- Changed behaviour of living cumbucket. Now, once "really full" the output happens more rarely but is much more at once.
- More Icons by @Alpenglow <3 this time attributed correct.
- Adjusted some of the metabolic values - likes cumflation, generous donor and living cumbucket have small costs.
# 2.1.0 (27-06-2024)
**Additions**:
@ -45,7 +237,7 @@
- Some new Icons thanks to Kira-Bad-Artist
- Some new Icons thanks to Archer
# 2.0.0
# 2.0.0 (30-05-2024)
**Summary**:
@ -92,20 +284,20 @@
- Patches to RJW-Pregnancy Helper to account for Male Pregs.
- Some replacements from `hasGene` to `hasActiveGene`
# 1.3.3
# 1.3.3 (02-11-2023)
**Fixes:**
- Added another check to the AG Malachai Xenotype (Fixes #68)
- Fixed the `GatheredCum`Fertilin Ingestion Patch throwing an Error for people without Sexperience (Fixes #69 (nice))
# 1.3.2
# 1.3.2 (24-10-2023)
**Fixes:**
- Removed patch for Malachai, needs a different patching operator but I don't want to have broken fixes for now (Tracked in a new Issue)
# 1.3.1
# 1.3.1 (22-10-2023)
**Changes**
@ -144,7 +336,7 @@ The pawns that are gender fluid can get pregnant.
However, with RJW 5.3.7 these pregnancies disappear.
This is a change needed upstream, but I will have a look.
# 1.2.1
# 1.2.1 (18-06-2023)
**Fixes**:
@ -224,9 +416,9 @@ And I am aware that the TiTs-Myr work different than the things I made now.
- Mostly Patches and Changes to the Halamyr Defs
- Some re-arranging and mayRequires for other mods
# 1.1.4
# 1.1.4 (06-04-2023)
Fixes:
**Fixes:**
- Youth Fountain and Age Drainer **really** "stop" at 18 (#26, #28) and never age pawns
- Drastically reduced vomiting time due to an missunderstanding (#29). `0.4` instead of `0.01`
@ -234,37 +426,37 @@ Fixes:
Sometimes life is like that, and you have to fix the fixes.
It was never really broken, life is just very long.
# 1.1.3
# 1.1.3 (28-03-2023)
Changes:
**Changes:**
- Youth Fountain and Age Drainer "stop" at 18 (#26)
- Youth Fountain and Age Drainer activate only for pawns at 18 (#26)
- Drained Pawns vomit less (from mtb 0.05 to 0.01)(#29)
Fixes:
**Fixes:**
- InsectBreeder would mess with normal Pawn-Animal pregancy for egg laying animals (#23)
# 1.1.2
# 1.1.2 (19-03-2023)
Changes:
**Changes:**
- Added more cool images from WasMachenDennSachen (#22)
Fixes:
**Fixes:**
- Aphrodisiac Pheromones checks for children and other conditions (#25)
# 1.1.1
# 1.1.1 (10-03-2023)
Changes:
**Changes:**
- Drastically increased mood-penalty for Fertilin-Loss (if the pawn is still too happy, there will never be a breakdown for missing fertilin)
- No-Breast Genes add Nipples
- Featureless Chest Gene (No Nipples at all, adds the RJW Featureless Chest as requested per some Kobold fetishists)
Fixes:
**Fixes:**
- Small and Big Male Genitalia had images wrong way round
- Fertilin should activate at a MinAge of 18

Binary file not shown.

View file

@ -67,5 +67,11 @@
<displayPriorityInXenotype>8</displayPriorityInXenotype>
</GeneCategoryDef>
<GeneCategoryDef>
<defName>rjw_genes_diseases</defName>
<label>genetic STDs</label>
<displayPriorityInXenotype>22</displayPriorityInXenotype>
</GeneCategoryDef>
</Defs>

View file

@ -15,7 +15,6 @@
</modExtensions>
</GeneDef>
<GeneDef ParentName="BreedingBase">
<defName>rjw_genes_mechbreeder</defName>
<label>mechbreeder</label>
@ -42,8 +41,9 @@
<GeneDef ParentName="BreedingBase">
<defName>rjw_genes_fertile_anus</defName>
<label>fertile anus</label>
<description>Xenotypes with this gene have a functional uterus connected to the anal cavity even
for males</description>
<description>Xenotypes with this gene have a functional uterus if they do not possess one by
means of their vagina.
For males, it is connected to the anal cavity and leads to a normal pregnancy.</description>
<iconPath>Genes/Icons/Fertile_anus</iconPath>
<displayOrderInCategory>54</displayOrderInCategory>
</GeneDef>
@ -81,7 +81,6 @@
<biostatMet>-1</biostatMet>
</GeneDef>
<GeneDef ParentName="BreedingBase">
<defName>rjw_genes_mating_call</defName>
<label>Mating Call</label>
@ -98,7 +97,6 @@
<biostatMet>-1</biostatMet>
</GeneDef>
<GeneDef ParentName="BreedingBase">
<defName>rjw_genes_pheromone_spit</defName>
<label>Pheromone Spit</label>
@ -115,4 +113,62 @@
<biostatMet>-1</biostatMet>
</GeneDef>
<GeneDef ParentName="BreedingBase">
<defName>rjw_genes_hardwired_progenity</defName>
<label>Hardwired Progenity</label>
<description>Carriers of this gene need to procreate. They suffer negative effects if they are
childless, and have increased capabilities if they reach a high amount of offsprings.</description>
<iconPath>Genes/Icons/hardwired_progenity</iconPath>
<displayOrderInCategory>70</displayOrderInCategory>
<conditionalStatAffecters>
<li Class="RJW_Genes.ConditionalStatAffecter_NoChildren">
<statOffsets>
<WorkSpeedGlobal>-0.1</WorkSpeedGlobal>
<Fertility>1.2</Fertility>
<SexFrequency>1.2</SexFrequency>
<MentalBreakThreshold>+0.15</MentalBreakThreshold>
<GlobalLearningFactor>-0.1</GlobalLearningFactor>
</statOffsets>
</li>
<li Class="RJW_Genes.ConditionalStatAffecter_ManyChildren">
<statOffsets>
<MoveSpeed>0.05</MoveSpeed>
<WorkSpeedGlobal>0.1</WorkSpeedGlobal>
<Fertility>0.1</Fertility>
<SexFrequency>0.4</SexFrequency>
</statOffsets>
</li>
<li Class="RJW_Genes.ConditionalStatAffecter_VeryManyChildren">
<statOffsets>
<MoveSpeed>0.15</MoveSpeed>
<WorkSpeedGlobal>0.25</WorkSpeedGlobal>
<MentalBreakThreshold>-0.25</MentalBreakThreshold>
</statOffsets>
</li>
</conditionalStatAffecters>
<biostatCpx>1</biostatCpx>
<biostatMet>0</biostatMet>
</GeneDef>
<GeneDef ParentName="BreedingBase">
<defName>rjw_genes_basic_rut</defName>
<label>Rut</label>
<description>Carriers of this gene can enter a state of heat, resulting in drastically higher
sexual activity.</description>
<iconPath>Genes/Icons/rut</iconPath>
<biostatCpx>1</biostatCpx>
<biostatMet>1</biostatMet>
<displayOrderInCategory>11</displayOrderInCategory>
<geneClass>RJW_Genes.Gene_Rut</geneClass>
<modExtensions>
<li Class="RJW_Genes.TickBasedChanceExtension">
<!-- 60k = 1 days -->
<tickInterval>60000</tickInterval>
<eventChance>0.05</eventChance>
</li>
</modExtensions>
</GeneDef>
</Defs>

View file

@ -21,10 +21,15 @@
<label>no cum</label>
<description>Males of these species have no fluid.</description>
<iconPath>Genes/Icons/No_Cum</iconPath>
<geneClass>RJW_Genes.Gene_NoCum</geneClass>
<geneClass>RJW_Genes.Gene_ChangeCumAmount</geneClass>
<displayOrderInCategory>533</displayOrderInCategory>
<biostatCpx>0</biostatCpx>
<biostatMet>1</biostatMet>
<modExtensions>
<li Class="RJW_Genes.MultiplierExtension">
<multiplier>0.0</multiplier>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="GeneCumAmount">
@ -32,10 +37,15 @@
<label>much cum</label>
<description>Males of this species produce a lot of fluid.</description>
<iconPath>Genes/Icons/Much_Cum</iconPath>
<geneClass>RJW_Genes.Gene_MuchCum</geneClass>
<geneClass>RJW_Genes.Gene_ChangeCumAmount</geneClass>
<displayOrderInCategory>534</displayOrderInCategory>
<biostatCpx>1</biostatCpx>
<biostatMet>-1</biostatMet>
<biostatMet>0</biostatMet>
<modExtensions>
<li Class="RJW_Genes.MultiplierExtension">
<multiplier>3.0</multiplier>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="GeneCumAmount">
@ -44,10 +54,15 @@
<description>Males of this species produce a whole lot of fluid. They are like fountains
basically.</description>
<iconPath>Genes/Icons/Very_Much_Cum</iconPath>
<geneClass>RJW_Genes.Gene_VeryMuchCum</geneClass>
<geneClass>RJW_Genes.Gene_ChangeCumAmount</geneClass>
<displayOrderInCategory>535</displayOrderInCategory>
<biostatCpx>1</biostatCpx>
<biostatMet>-2</biostatMet>
<biostatMet>-1</biostatMet>
<modExtensions>
<li Class="RJW_Genes.MultiplierExtension">
<multiplier>15.0</multiplier>
</li>
</modExtensions>
</GeneDef>
</Defs>

View file

@ -7,7 +7,7 @@
<displayCategory>rjw_genes_damage</displayCategory>
<description>This Gene makes the Carrier unable to get mood or social penalties from being raped
and they cannot be broken for a long period of time.</description>
<iconPath>UI/Icons/Rituals/TrialDefend</iconPath>
<iconPath>Genes/Icons/TrialDefend</iconPath>
<displayOrderInCategory>2</displayOrderInCategory>
<biostatMet>-1</biostatMet>
<biostatCpx>1</biostatCpx>

View file

@ -0,0 +1,336 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<GeneDef Name="RJWGeneDisease" Abstract="True">
<displayCategory>rjw_genes_diseases</displayCategory>
<randomChosen>false</randomChosen>
<modExtensions>
<li MayRequire="OskarPotocki.VanillaFactionsExpanded.Core"
Class="VanillaGenesExpanded.GeneExtension">
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Disease_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Endogene_Disease_Background</backgroundPathXenogenes>
</li>
</modExtensions>
</GeneDef>
<GeneDef>
<displayCategory>rjw_genes_diseases</displayCategory>
<defName>rjw_genes_genetic_disease_immunity</defName>
<displayOrderInCategory>1</displayOrderInCategory>
<marketValueFactor>0.95</marketValueFactor>
<label>genetic disease immunity</label>
<description>This gene makes the pawn immune against genetic STDs and some other genes that
imply negative side-effects.</description>
<biostatCpx>1</biostatCpx>
<biostatMet>-1</biostatMet>
<iconPath>Genes/Icons/disease_immunity</iconPath>
<modExtensions>
<li MayRequire="OskarPotocki.VanillaFactionsExpanded.Core"
Class="VanillaGenesExpanded.GeneExtension">
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_minor_vulnerability</defName>
<label>minor vulnerability</label>
<description>This gene makes the pawn a bit more vulnerable, and a slightly more attractive
target for rape.</description>
<biostatCpx>1</biostatCpx>
<biostatMet>1</biostatMet>
<marketValueFactor>0.85</marketValueFactor>
<iconPath>Genes/Icons/minor_vulnerability</iconPath>
<displayOrderInCategory>5</displayOrderInCategory>
<statOffsets>
<Vulnerability>0.15</Vulnerability>
</statOffsets>
<exclusionTags>
<li>RJW_Genes_Vulnerability</li>
</exclusionTags>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.05</infectionChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_major_vulnerability</defName>
<label>major vulnerability</label>
<description>This gene makes the pawn more vulnerable, and a more attractive target for
rape.</description>
<biostatCpx>2</biostatCpx>
<biostatMet>1</biostatMet>
<iconPath>Genes/Icons/major_vulnerability</iconPath>
<displayOrderInCategory>6</displayOrderInCategory>
<exclusionTags>
<li>RJW_Genes_Vulnerability</li>
</exclusionTags>
<statOffsets>
<Vulnerability>0.3</Vulnerability>
</statOffsets>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.03</infectionChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_infectious_blocked_masturbation</defName>
<label>infectious masturbation block</label>
<description>Carriers of this gene are unable to masturbate - they need a partner or
equipment.</description>
<iconPath>Genes/Icons/blocked_masturbation</iconPath>
<displayOrderInCategory>55</displayOrderInCategory>
<biostatCpx>1</biostatCpx>
<biostatMet>2</biostatMet>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.05</infectionChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_infectious_low_fertility</defName>
<label>infectious low fertility vulnerability</label>
<description>Carriers of this genetic disease have lower fertility.</description>
<biostatCpx>1</biostatCpx>
<biostatMet>1</biostatMet>
<marketValueFactor>0.9</marketValueFactor>
<iconPath>UI/Icons/ColonistBar/Idle</iconPath>
<displayOrderInCategory>5</displayOrderInCategory>
<statOffsets>
<Fertility>-0.15</Fertility>
</statOffsets>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.05</infectionChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_infectious_increased_sex_need</defName>
<label>infectious increased sexneed</label>
<description>Carriers of this genetic disease need more sex.</description>
<biostatCpx>0</biostatCpx>
<biostatMet>1</biostatMet>
<marketValueFactor>0.9</marketValueFactor>
<iconPath>UI/Icons/ColonistBar/Idle</iconPath>
<displayOrderInCategory>5</displayOrderInCategory>
<statOffsets>
<SexFrequency>0.15</SexFrequency>
</statOffsets>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.08</infectionChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_infectious_major_increased_sex_need</defName>
<label>major infectious increased sexneed</label>
<description>Carriers of this genetic disease need a lot more sex.</description>
<biostatCpx>1</biostatCpx>
<biostatMet>2</biostatMet>
<marketValueFactor>0.85</marketValueFactor>
<iconPath>UI/Icons/ColonistBar/Idle</iconPath>
<displayOrderInCategory>5</displayOrderInCategory>
<statOffsets>
<SexFrequency>1.0</SexFrequency>
</statOffsets>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.03</infectionChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_infectious_hypersexuality</defName>
<label>infectious hypersexuality</label>
<description>This gene makes the pawn hypersexual, and has a chance to spread on
intercourse.</description>
<iconPath>Genes/Icons/Hypersexual</iconPath>
<biostatCpx>2</biostatCpx>
<biostatMet>2</biostatMet>
<displayOrderInCategory>7</displayOrderInCategory>
<exclusionTags>
<li>rjw_genes_hypersexuality_trait_giver</li>
</exclusionTags>
<forcedTraits>
<li>
<def>Nymphomaniac</def>
</li>
</forcedTraits>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.05</infectionChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_infectious_bisexuality</defName>
<label>infectious bisexuality</label>
<description>This gene makes the pawn bisexual, and has a chance to spread on intercourse.</description>
<iconPath>Genes/Icons/bisexuality</iconPath>
<biostatCpx>1</biostatCpx>
<biostatMet>0</biostatMet>
<displayOrderInCategory>8</displayOrderInCategory>
<exclusionTags>
<li>rjw_genes_bisexuality_trait_giver</li>
<li>rjw_genes_sexual_orientation</li>
</exclusionTags>
<forcedTraits>
<li>
<def>Bisexual</def>
</li>
</forcedTraits>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.1</infectionChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_infectious_homosexuality</defName>
<label>infectious homosexuality</label>
<description>This gene makes the pawn homosexual, and has a chance to spread on intercourse.</description>
<iconPath>Genes/Icons/homosexuality</iconPath>
<biostatCpx>1</biostatCpx>
<biostatMet>0</biostatMet>
<displayOrderInCategory>9</displayOrderInCategory>
<exclusionTags>
<li>rjw_genes_homosexuality_trait_giver</li>
<li>rjw_genes_sexual_orientation</li>
</exclusionTags>
<forcedTraits>
<li>
<def>Gay</def>
</li>
</forcedTraits>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.1</infectionChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_fluctual_sexual_needs</defName>
<label>fluctual sexual needs</label>
<description>Carriers of this genetic disease have a chance to suddenly require sex, gaining
a bit of energy to find quick relief.</description>
<iconPath>UI/Icons/ColonistBar/Idle</iconPath>
<biostatCpx>1</biostatCpx>
<biostatMet>2</biostatMet>
<displayOrderInCategory>11</displayOrderInCategory>
<geneClass>RJW_Genes.Gene_FluctualSexualNeed</geneClass>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.1</infectionChance>
</li>
<li Class="RJW_Genes.TickBasedChanceExtension">
<!-- 30k = 1/2 days -->
<tickInterval>30000</tickInterval>
<eventChance>0.15</eventChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_size_blinded</defName>
<label>size blinded</label>
<description>This genetic disease makes the carrier dramatically more drawn to pawns with
huge cocks.</description>
<iconPath>Genes/Icons/size_blinded</iconPath>
<biostatCpx>1</biostatCpx>
<biostatMet>1</biostatMet>
<displayOrderInCategory>11</displayOrderInCategory>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.1</infectionChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_stretcher</defName>
<label>genetic stretcher</label>
<description>Pawns with this gene have a chance to alter the genes of their sexual partners
to prefer large cocks.</description>
<iconPath>Genes/Icons/stretcher</iconPath>
<biostatCpx>1</biostatCpx>
<biostatMet>0</biostatMet>
<displayOrderInCategory>12</displayOrderInCategory>
<modExtensions>
<li Class="RJW_Genes.ImmunityAgainstGenesExtension">
<givesImmunityAgainst>
<li>rjw_genes_size_blinded</li>
</givesImmunityAgainst>
</li>
<li Class="RJW_Genes.GeneticInfectorExtension">
<infectionChance>0.05</infectionChance>
<infectionGenes>
<li>rjw_genes_size_blinded</li>
</infectionGenes>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_infectious_rut</defName>
<label>Rut</label>
<description>Carriers of this gene can enter a state of heat, resulting in drastically
higher
sexual activity.</description>
<iconPath>Genes/Icons/rut</iconPath>
<biostatCpx>1</biostatCpx>
<biostatMet>2</biostatMet>
<displayOrderInCategory>11</displayOrderInCategory>
<geneClass>RJW_Genes.Gene_Rut</geneClass>
<modExtensions>
<li Class="RJW_Genes.TickBasedChanceExtension">
<!-- 60k = 1 days -->
<tickInterval>60000</tickInterval>
<eventChance>0.05</eventChance>
</li>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.1</infectionChance>
</li>
</modExtensions>
</GeneDef>
</Defs>

View file

@ -14,6 +14,10 @@
</li>
</forcedTraits>
<exclusionTags>
<li>rjw_genes_hypersexuality_trait_giver</li>
</exclusionTags>
<randomChosen>false</randomChosen>
<modExtensions>
<li MayRequire="OskarPotocki.VanillaFactionsExpanded.Core"
@ -48,31 +52,6 @@
</modExtensions>
</GeneDef>
<!--
<GeneDef>
<defName>rjw_genes_sadist_gene</defName>
<label>sadist</label>
<displayCategory>Reproduction</displayCategory>
<description>Xenotypes with this Gene are Sadists.</description>
<iconPath>Genes/Icons/Rape</iconPath>
<biostatMet>1</biostatMet>
<displayOrderInCategory>2</displayOrderInCategory>
<forcedTraits>
<li>
<def>rjw_genes_sadist</def>
</li>
</forcedTraits>
<modExtensions>
<li MayRequire="OskarPotocki.VanillaFactionsExpanded.Core"
Class="VanillaGenesExpanded.GeneExtension">
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li>
</modExtensions>
</GeneDef>
-->
<GeneDef>
<defName>rjw_genes_masochist</defName>
<label>masochist</label>
@ -102,7 +81,7 @@
<label>homosexual</label>
<displayCategory>Reproduction</displayCategory>
<description>This Gene makes you gay.</description>
<iconPath>UI\Ideoligions\Universal\RoundC</iconPath>
<iconPath>Genes/Icons/RoundC</iconPath>
<biostatMet>0</biostatMet>
<displayOrderInCategory>3</displayOrderInCategory>
<forcedTraits>
@ -111,6 +90,7 @@
</li>
</forcedTraits>
<exclusionTags>
<li>rjw_genes_homosexuality_trait_giver</li>
<li>rjw_genes_sexual_orientation</li>
</exclusionTags>
@ -129,7 +109,7 @@
<label>bisexual</label>
<displayCategory>Reproduction</displayCategory>
<description>Carriers of this Gene are Bisexual.</description>
<iconPath>UI\Ideoligions\Universal\RoundC</iconPath>
<iconPath>Genes/Icons/RoundC</iconPath>
<biostatMet>0</biostatMet>
<displayOrderInCategory>4</displayOrderInCategory>
<forcedTraits>
@ -139,6 +119,7 @@
</forcedTraits>
<exclusionTags>
<li>rjw_genes_sexual_orientation</li>
<li>rjw_genes_bisexuality_trait_giver</li>
</exclusionTags>
<randomChosen>false</randomChosen>
@ -200,4 +181,46 @@
</exclusionTags>
</GeneDef>
<GeneDef>
<defName>rjw_genes_pregnancy_overwrite</defName>
<label>Sperm Displacement</label>
<displayCategory>Reproduction</displayCategory>
<description>Carriers of this gene can 'overwrite' an existing pregnancy, keeping the
progress but effectively replacing the father.</description>
<iconPath>Genes/Icons/pregnancy_overwrite</iconPath>
<displayOrderInCategory>120</displayOrderInCategory>
<biostatCpx>4</biostatCpx>
<biostatMet>-2</biostatMet>
<modExtensions>
<!-- DevNote: The chance will be multiplied by both pawns' Fertility! -->
<li Class="RJW_Genes.ChanceExtension">
<chance>0.5</chance>
</li>
<li MayRequire="OskarPotocki.VanillaFactionsExpanded.Core"
Class="VanillaGenesExpanded.GeneExtension">
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li>
</modExtensions>
</GeneDef>
<GeneDef>
<defName>rjw_genes_blocked_masturbation</defName>
<label>no masturbation</label>
<displayCategory>Reproduction</displayCategory>
<description>Carriers of this gene are unable to masturbate - they need a partner or equipment.</description>
<iconPath>Genes/Icons/blocked_masturbation</iconPath>
<displayOrderInCategory>60</displayOrderInCategory>
<biostatCpx>0</biostatCpx>
<biostatMet>1</biostatMet>
<modExtensions>
<li MayRequire="OskarPotocki.VanillaFactionsExpanded.Core"
Class="VanillaGenesExpanded.GeneExtension">
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li>
</modExtensions>
</GeneDef>
</Defs>

View file

@ -19,7 +19,7 @@
partially filled)</description>
<biostatCpx>1</biostatCpx>
<biostatMet>-2</biostatMet>
<iconPath>UI/Memes/FleshPurity</iconPath>
<iconPath>Genes/Icons/FleshPurity</iconPath>
<displayOrderInCategory>1</displayOrderInCategory>
</GeneDef>
@ -30,7 +30,7 @@
(Partner stays adult)</description>
<biostatCpx>2</biostatCpx>
<biostatMet>-2</biostatMet>
<iconPath>UI/Ideoligions/FireLeaves</iconPath>
<iconPath>Genes/Icons/FireLeaves</iconPath>
<displayOrderInCategory>2</displayOrderInCategory>
<modExtensions>
<li Class="RJW_Genes.AgeTransferExtension">
@ -140,7 +140,7 @@
<GeneDef ParentName="SpecialBase">
<defName>rjw_genes_sex_tamer</defName>
<label>Sexual Tamer</label>
<label>sexual tamer</label>
<labelShortAdj>sextamer</labelShortAdj>
<description>Bestiality has a chance to tame animals or advance their training.</description>
<iconPath>Genes/Icons/RJW_Genes_SexualTamer</iconPath>
@ -149,4 +149,119 @@
<biostatMet>-1</biostatMet>
</GeneDef>
<GeneDef ParentName="SpecialBase">
<defName>rjw_genes_sexual_genetic_swap</defName>
<label>sexual genetic swap</label>
<description>Carriers with this gene may switch a gene with their sex-partner. Switched Genes are always endogenes.</description>
<iconPath>Genes/Icons/sexual_genetic_swap</iconPath>
<displayOrderInCategory>20</displayOrderInCategory>
<biostatCpx>3</biostatCpx>
<biostatMet>0</biostatMet>
<modExtensions>
<li Class="RJW_Genes.ChanceExtension">
<chance>0.1</chance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="SpecialBase">
<defName>rjw_genes_sexual_genetic_thief</defName>
<label>sexual gene thief</label>
<description>Carriers with this gene may steal a gene from their sex-partner. Stolen genes are always xenogenes.</description>
<iconPath>Genes/Icons/sexual_genetic_thief</iconPath>
<displayOrderInCategory>21</displayOrderInCategory>
<biostatCpx>5</biostatCpx>
<biostatMet>-2</biostatMet>
<biostatArc>1</biostatArc>
<modExtensions>
<li Class="RJW_Genes.ChanceExtension">
<chance>0.2</chance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="SpecialBase">
<defName>rjw_genes_feminizer</defName>
<label>feminizer</label>
<description>Carriers with this gene slowly turn male sexual partners into females.</description>
<iconPath>Genes/Icons/feminizer</iconPath>
<displayOrderInCategory>31</displayOrderInCategory>
<biostatCpx>4</biostatCpx>
<biostatMet>-1</biostatMet>
<modExtensions>
<li Class="RJW_Genes.ImmunityAgainstGenesExtension">
<givesImmunityAgainst>
<li>rjw_genes_feminizer</li>
</givesImmunityAgainst>
</li>
<li Class="RJW_Genes.HediffIncreaseOnSexExtension">
<hediffDef>rjw_genes_feminization_progress</hediffDef>
<canCreateHediff>true</canCreateHediff>
<severityIncrease>0.01</severityIncrease>
<applicationChance>1.00</applicationChance>
<applicableForWomen>false</applicableForWomen>
<applicableForMen>true</applicableForMen>
<requiresPenetrativeSex>false</requiresPenetrativeSex>
</li>
<li Class="RJW_Genes.GeneAlteringExtension">
<majorGenes>
<li>rjw_genes_female_only</li>
<li>rjw_genes_no_penis</li>
<li>rjw_genes_minor_vulnerability</li>
</majorGenes>
<minorGenes>
<li>rjw_genes_small_male_genitalia</li>
<li>rjw_genes_big_breasts</li>
<li>Beard_NoBeardOnly</li>
<li>Hair_LongOnly</li>
</minorGenes>
<minorApplicationChance>0.25</minorApplicationChance>
<majorApplicationChance>0.1</majorApplicationChance>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="SpecialBase">
<defName>rjw_genes_twinkifier</defName>
<label>twinkifier</label>
<description>Carriers with this gene slowly turn male sexual partners into breedabel cute twinks.</description>
<iconPath>Genes/Icons/twinkifier</iconPath>
<displayOrderInCategory>50</displayOrderInCategory>
<biostatCpx>4</biostatCpx>
<biostatMet>-1</biostatMet>
<modExtensions>
<li Class="RJW_Genes.ImmunityAgainstGenesExtension">
<givesImmunityAgainst>
<li>rjw_genes_twinkifier</li>
</givesImmunityAgainst>
</li>
<li Class="RJW_Genes.HediffIncreaseOnSexExtension">
<hediffDef>rjw_genes_twinkification_progress</hediffDef>
<canCreateHediff>true</canCreateHediff>
<severityIncrease>0.01</severityIncrease>
<applicationChance>1.00</applicationChance>
<applicableForWomen>false</applicableForWomen>
<applicableForMen>true</applicableForMen>
<requiresPenetrativeSex>false</requiresPenetrativeSex>
</li>
<li Class="RJW_Genes.GeneAlteringExtension">
<majorGenes>
<li>rjw_genes_fertile_anus</li>
<li>Beauty_Pretty</li>
<li>Delicate</li>
<li>rjw_genes_minor_vulnerability</li>
<li>rjw_genes_infectious_homosexuality</li>
</majorGenes>
<minorGenes>
<li>rjw_genes_small_male_genitalia</li>
<li>Beard_NoBeardOnly</li>
<li>Body_Thin</li>
<li>rjw_genes_homosexual</li>
</minorGenes>
<minorApplicationChance>0.25</minorApplicationChance>
<majorApplicationChance>0.1</majorApplicationChance>
</li>
</modExtensions>
</GeneDef>
</Defs>

View file

@ -65,10 +65,10 @@
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li>
<li Class="RJW_Genes.GenderFluidExtension">
<li Class="RJW_Genes.TickBasedChanceExtension">
<!-- 120k = 2 days -->
<changeInterval>120000</changeInterval>
<changeChance>0.25</changeChance>
<tickInterval>120000</tickInterval>
<eventChance>0.25</eventChance>
</li>
</modExtensions>
</GeneDef>

View file

@ -75,6 +75,7 @@
</doubleXenotypeChances>
<genes>
<li>rjw_genes_hypersexual</li>
<li>rjw_genes_bisexual</li>
<li>rjw_genes_male_only</li>
<li>rjw_genes_lifeforce</li>
<li>rjw_genes_lifeforce_drain</li>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<HediffDef>
<defName>rjw_genes_fertilin_lost</defName>
<hediffClass>Hediff_HemogenCraving</hediffClass>
@ -19,12 +19,13 @@
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>rjw_genes_succubus_drained</defName>
<hediffClass>HediffWithComps</hediffClass>
<label>Drained</label>
<description>The vitality of this pawn has been drained. Cannot be drained again until fully recovered.</description>
<description>The vitality of this pawn has been drained. Cannot be drained again until fully
recovered.</description>
<defaultLabelColor>(1,0,0.5)</defaultLabelColor>
<maxSeverity>1.0</maxSeverity>
<initialSeverity>1.0</initialSeverity>
@ -74,13 +75,13 @@
<statOffsets>
<WorkSpeedGlobal>-0.2</WorkSpeedGlobal>
</statOffsets>
<vomitMtbDays>0.4</vomitMtbDays>
<vomitMtbDays>0.4</vomitMtbDays>
<hungerRateFactorOffset>0.1</hungerRateFactorOffset>
<restFallFactorOffset>0.35</restFallFactorOffset>
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>rjw_genes_fertilin_craving</defName>
<label>fertilin craving</label>
@ -90,77 +91,78 @@
<maxSeverity>1.0</maxSeverity>
<initialSeverity>0.01</initialSeverity>
<stages>
<li>
<label>minor</label>
<painOffset>0.05</painOffset>
<capMods>
<li>
<capacity>Consciousness</capacity>
<setMax>0.9</setMax>
</li>
</capMods>
</li>
<li>
<label>moderate</label>
<minSeverity>0.35</minSeverity>
<painOffset>0.1</painOffset>
<capMods>
<li>
<capacity>Consciousness</capacity>
<setMax>0.8</setMax>
</li>
</capMods>
</li>
<li>
<label>major</label>
<minSeverity>0.7</minSeverity>
<painOffset>0.15</painOffset>
<capMods>
<li>
<capacity>Consciousness</capacity>
<setMax>0.5</setMax>
</li>
</capMods>
</li>
<li>
<label>minor</label>
<painOffset>0.05</painOffset>
<capMods>
<li>
<capacity>Consciousness</capacity>
<setMax>0.9</setMax>
</li>
</capMods>
</li>
<li>
<label>moderate</label>
<minSeverity>0.35</minSeverity>
<painOffset>0.1</painOffset>
<capMods>
<li>
<capacity>Consciousness</capacity>
<setMax>0.8</setMax>
</li>
</capMods>
</li>
<li>
<label>major</label>
<minSeverity>0.7</minSeverity>
<painOffset>0.15</painOffset>
<capMods>
<li>
<capacity>Consciousness</capacity>
<setMax>0.5</setMax>
</li>
</capMods>
</li>
</stages>
<comps>
<li Class="RJW_Genes.HediffCompProperties_SeverityFromFertilin">
<severityPerHourEmpty>0.05</severityPerHourEmpty>
<severityPerHourHemogen>-0.1</severityPerHourHemogen>
</li>
<li Class="RJW_Genes.HediffCompProperties_SeverityFromFertilin">
<severityPerHourEmpty>0.05</severityPerHourEmpty>
<severityPerHourHemogen>-0.1</severityPerHourHemogen>
</li>
</comps>
</HediffDef>
<HediffDef ParentName="RoleStatBuff">
<defName>rjw_genes_naked_prowess</defName>
<label>naked prowss</label>
<description>Driven by fertilin, this person has greatly increased strength and resilience.</description>
<hediffClass>HediffWithComps</hediffClass>
<stages>
<li>
<!--Maybe a bit to much, but they are supposed to be strong-->
<statOffsets>
<ArmorRating_Sharp>0.5</ArmorRating_Sharp>
<ArmorRating_Blunt>0.5</ArmorRating_Blunt>
<ArmorRating_Heat>0.5</ArmorRating_Heat>
<!-- <Insulation_Cold>10</Insulation_Cold>
<Insulation_Heat>10</Insulation_Heat> -->
</statOffsets>
<statFactors>
<IncomingDamageFactor>0.5</IncomingDamageFactor>
<MeleeDamageFactor>1.5</MeleeDamageFactor>
</statFactors>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_Disappears">
<showRemainingTime>True</showRemainingTime>
<disappearsAfterTicks>5000</disappearsAfterTicks> <!-- 2 hours -->
</li>
<li Class="HediffCompProperties_DisappearsOnDeath"/>
<!--TODO: Make hediff disappear if pawn is nolonger naked-->
</comps>
<isBad>false</isBad>
</HediffDef>
<HediffDef>
<defName>rjw_genes_naked_prowess</defName>
<defaultLabelColor>(0.52, 1, 0.95)</defaultLabelColor>
<label>naked prowss</label>
<description>Driven by fertilin, this person has greatly increased strength and resilience.</description>
<hediffClass>HediffWithComps</hediffClass>
<stages>
<li>
<!--Maybe
a bit to much, but they are supposed to be strong-->
<statOffsets>
<ArmorRating_Sharp>0.5</ArmorRating_Sharp>
<ArmorRating_Blunt>0.5</ArmorRating_Blunt>
<ArmorRating_Heat>0.5</ArmorRating_Heat>
</statOffsets>
<statFactors>
<IncomingDamageFactor>0.5</IncomingDamageFactor>
<MeleeDamageFactor>1.5</MeleeDamageFactor>
</statFactors>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_Disappears">
<showRemainingTime>True</showRemainingTime>
<disappearsAfterTicks>5000</disappearsAfterTicks> <!-- 2 hours -->
</li>
<li Class="HediffCompProperties_DisappearsOnDeath" />
<!--TODO:
Make hediff disappear if pawn is nolonger naked-->
</comps>
<isBad>false</isBad>
</HediffDef>
</Defs>
</Defs>

View file

@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<HediffDef>
<defName>rjw_genes_feminization_progress</defName>
<hediffClass>HediffWithComps</hediffClass>
<label>feminization</label>
<description>Something is changing this pawn - there is a chance to develop female features
upon sex.</description>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>1.0</maxSeverity>
<isBad>false</isBad>
<tendable>false</tendable>
<comps>
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>-0.01</severityPerDay>
</li>
</comps>
<stages>
<!-- DevNote: The labels and their effects can be changed, but the logic triggers at >0.6 for minor and >0.8 for major ! -->
<li>
<label>neglectable</label>
<becomeVisible>false</becomeVisible>
</li>
<li>
<label>minor</label>
<minSeverity>0.6</minSeverity>
<becomeVisible>true</becomeVisible>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>-0.5</offset>
</li>
</capMods>
<statOffsets>
<Vulnerability>0.25</Vulnerability>
</statOffsets>
</li>
<li>
<label>severe</label>
<minSeverity>0.8</minSeverity>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>-0.05</offset>
</li>
</capMods>
<becomeVisible>true</becomeVisible>
<statOffsets>
<Vulnerability>0.5</Vulnerability>
<SexFrequency>0.25</SexFrequency>
</statOffsets>
</li>
<li>
<label>critical</label>
<minSeverity>0.9</minSeverity>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>-0.1</offset>
</li>
</capMods>
<becomeVisible>true</becomeVisible>
<statOffsets>
<Vulnerability>1.0</Vulnerability>
<SexFrequency>0.5</SexFrequency>
</statOffsets>
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>rjw_genes_twinkification_progress</defName>
<hediffClass>HediffWithComps</hediffClass>
<label>twinkification</label>
<description>Something is changing this pawn - there is a chance to turn into a cute,
breedable twink upon sex.</description>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>1.0</maxSeverity>
<isBad>false</isBad>
<tendable>false</tendable>
<comps>
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>-0.01</severityPerDay>
</li>
</comps>
<stages>
<!-- DevNote: The labels and their effects can be changed, but the logic triggers at >0.6 for minor and >0.8 for major ! -->
<li>
<label>neglectable</label>
<becomeVisible>false</becomeVisible>
</li>
<li>
<label>minor</label>
<minSeverity>0.6</minSeverity>
<becomeVisible>true</becomeVisible>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>-0.05</offset>
</li>
</capMods>
<statOffsets>
<Vulnerability>0.25</Vulnerability>
</statOffsets>
</li>
<li>
<label>severe</label>
<minSeverity>0.8</minSeverity>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>-0.05</offset>
</li>
</capMods>
<becomeVisible>true</becomeVisible>
<statOffsets>
<Vulnerability>0.5</Vulnerability>
<SexFrequency>0.25</SexFrequency>
</statOffsets>
</li>
<li>
<label>critical</label>
<minSeverity>0.9</minSeverity>
<capMods>
<li>
<capacity>Consciousness</capacity>
<offset>-0.1</offset>
</li>
</capMods>
<becomeVisible>true</becomeVisible>
<statOffsets>
<Vulnerability>1.5</Vulnerability>
<SexFrequency>0.5</SexFrequency>
</statOffsets>
</li>
</stages>
</HediffDef>
</Defs>

View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<HediffDef>
<defName>rjw_genes_genetic_rut</defName>
<hediffClass>HediffWithComps</hediffClass>
<label>Rut</label>
<description>Based on genetics, this pawn is in heat.</description>
<defaultLabelColor>(240,200,110)</defaultLabelColor>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>1.0</maxSeverity>
<isBad>false</isBad>
<tendable>false</tendable>
<comps>
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>-1.00</severityPerDay>
</li>
</comps>
<stages>
<li>
<label>calming down</label>
<statOffsets>
<SexFrequency>0.50</SexFrequency>
</statOffsets>
<capMods>
<li>
<capacity>BloodPumping</capacity>
<offset>0.1</offset>
</li>
</capMods>
</li>
<li>
<label>in heat</label>
<minSeverity>0.4</minSeverity>
<statOffsets>
<SexFrequency>2.00</SexFrequency>
</statOffsets>
<capMods>
<li>
<capacity>Moving</capacity>
<offset>0.1</offset>
</li>
<li>
<capacity>BloodPumping</capacity>
<offset>0.15</offset>
</li>
</capMods>
</li>
</stages>
</HediffDef>
</Defs>

View file

@ -13,7 +13,7 @@
<li>
<minSeverity>0</minSeverity>
<statOffsets>
<SlaveSuppressionOffset>0.40</SlaveSuppressionOffset>
<SlaveSuppressionOffset MayRequire="Ideology">0.40</SlaveSuppressionOffset>
<Vulnerability>3.0</Vulnerability>
</statOffsets>
<capMods>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<HistoryEventDef>
<defName>rjw_genes_GoodwillChangedReason_StoleGene</defName>
<label>Stole a gene</label>
</HistoryEventDef>
<HistoryEventDef>
<defName>rjw_genes_GoodwillChangedReason_infected_with_disease</defName>
<label>Infected a pawn with a genetic disease</label>
</HistoryEventDef>
<HistoryEventDef>
<defName>rjw_genes_GoodwillChangedReason_spread_genetic_disease</defName>
<label>Spread a genetic disease</label>
</HistoryEventDef>
</Defs>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<HistoryEventDef>
<defName>rjw_genes_GoodwillChangedReason_aged_pawn_with_sex_gene</defName>
<label>Aged a pawn with sexual age transfer</label>
</HistoryEventDef>
<HistoryEventDef>
<defName>rjw_genes_GoodwillChangedReason_youthed_pawn_with_sex_gene</defName>
<label>Youthed a pawn with youth fountain</label>
</HistoryEventDef>
<HistoryEventDef>
<defName>rjw_genes_GoodwillChangedReason_OverwritePregnancy</defName>
<label>Replaced a pregnancy</label>
</HistoryEventDef>
</Defs>

View file

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThoughtDef>
<defName>rjw_genes_appealing_cock</defName>
<thoughtClass>Thought_SituationalSocial</thoughtClass>
<workerClass>RJW_Genes.ThoughtWorker_SizeBlinded_Social</workerClass>
<validWhileDespawned>true</validWhileDespawned>
<stages>
<li>
<label>small cock</label>
<baseOpinionOffset>-10</baseOpinionOffset>
</li>
<li>
<label>big cock</label>
<baseOpinionOffset>10</baseOpinionOffset>
</li>
<li>
<label>monster cock</label>
<baseOpinionOffset>20</baseOpinionOffset>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>rjw_genes_has_more_diseases</defName>
<thoughtClass>Thought_SituationalSocial</thoughtClass>
<workerClass>RJW_Genes.ThoughtWorker_HasMoreDiseasesThanMe_Social</workerClass>
<validWhileDespawned>true</validWhileDespawned>
<stages>
<li>
<label>carries more genetic diseases than me</label>
<baseOpinionOffset>-3</baseOpinionOffset>
</li>
<li>
<label>carries more way genetic diseases than me</label>
<baseOpinionOffset>-8</baseOpinionOffset>
</li>
<li>
<label>the genetic diseases on this fellow are off charts</label>
<baseOpinionOffset>-18</baseOpinionOffset>
</li>
</stages>
</ThoughtDef>
</Defs>

View file

@ -23,6 +23,8 @@
<li TKey="BestialityGeneSettings">The Settings for Animal-Gene Inheritance are distributed between RJW-Pregnancy-Settings and their own Mod-Options.</li>
<li TKey="FertilaAnusJoke">Children born by pawns with the `Fertile Anus` gene might be bullied at school, but they can still live a fulfilling and happy life.</li>
</tips>
</TipSetDef>

View file

@ -21,10 +21,17 @@
<rjw_genes_settings_regret_stealing_love_key>Regret Stealing Love</rjw_genes_settings_regret_stealing_love_key>
<rjw_genes_settings_regret_stealing_love_explanation>If off, pawns will not get bad thoughts for seduction.</rjw_genes_settings_regret_stealing_love_explanation>
<rjw_genes_settings_animal_mating_needs_penis_key>Animal-Mating GenitalCheck</rjw_genes_settings_animal_mating_needs_penis_key>
<rjw_genes_settings_animal_mating_needs_penis_explanation>If on, only animals that 'can rape' will be engaging in bestiality after being hit by a animal mating pulse. This usually means that only male animals will start breeding.</rjw_genes_settings_animal_mating_needs_penis_explanation>
<rjw_genes_genetic_disease_header_key>Genetic STDS</rjw_genes_genetic_disease_header_key>
<rjw_genes_settings_genetic_disease_spread_key>Genetic STD Spread</rjw_genes_settings_genetic_disease_spread_key>
<rjw_genes_settings_genetic_disease_spread_explanation>If checked, certain Genes will spread on sex.</rjw_genes_settings_genetic_disease_spread_explanation>
<rjw_genes_genetic_disease_as_endogenes_key>Genetic STDs as Endogenes</rjw_genes_genetic_disease_as_endogenes_key>
<rjw_genes_genetic_disease_as_endogenes_explanation>If checked, genetic diseases will be added as Endogenes. Otherwise they are added as Xenogenes.</rjw_genes_genetic_disease_as_endogenes_explanation>
<rjw_genes_genetic_disease_spread_only_on_penetrative_sex_key>Genetic STDs on penetrative-sex only</rjw_genes_genetic_disease_spread_only_on_penetrative_sex_key>
<rjw_genes_genetic_disease_spread_only_on_penetrative_sex_explanation>If checked, genetic STDs are only spread on penetrative sex. Otherwise, any sextype is considered for spread.</rjw_genes_genetic_disease_spread_only_on_penetrative_sex_explanation>
<rjw_genes_settings_generous_donor_cheatmode_key>generous-donor cheatmode</rjw_genes_settings_generous_donor_cheatmode_key>
<rjw_genes_settings_generous_donor_cheatmode_explanation>When enabled, pawns with the 'generous donor' are not drained and not fertilin exhausted. Hence they can fuel succubi and incubi non-stop. This makes them drastically easier to keep, and you should not do it.</rjw_genes_settings_generous_donor_cheatmode_explanation>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<StatsReport_NoChildren>Pawn doesn't have any children.</StatsReport_NoChildren>
<StatsReport_ManyChildren>Pawn has a decent amount of children.</StatsReport_ManyChildren>
<StatsReport_VeryManyChildren>Pawn has a lot of children.</StatsReport_VeryManyChildren>
</LanguageData>

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8" ?>
<Patch>
<Operation Class="PatchOperationSequence">
<operations>
<li Class="PatchOperationFindMod">
<mods>
<li>Imphilee Xeno</li>
</mods>
<match Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="LD_Imphilee"]/genes</xpath>
<value>
<li>rjw_genes_tight_female_genitalia</li>
<li>rjw_genes_small_breasts</li>
<li MayRequire="LustLicentia.RJWLabs">rjw_genes_elasticity</li>
<li>rjw_genes_demonic_genitalia</li>
</value>
</match>
</li>
<li Class="PatchOperationFindMod">
<mods>
<li>Imphilee Xeno</li>
</mods>
<match Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="LD_Imphilee_Overlord"]/genes</xpath>
<value>
<li>rjw_genes_tight_female_genitalia</li>
<li>rjw_genes_small_breasts</li>
<li MayRequire="LustLicentia.RJWLabs">rjw_genes_elasticity</li>
<li>rjw_genes_demonic_genitalia</li>
<li>rjw_genes_rapist</li>
</value>
</match>
</li>
</operations>
</Operation>
</Patch>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 195 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -16,5 +16,6 @@
<li IfModActive="vanillaracesexpanded.android">Mods/Android</li>
<li IfModActive="VanillaExpanded.VGeneticsE">Mods/VE_Genetics</li>
<li IfModActive="LustLicentia.RJWLabs">Mods/LicentiaLabs</li>
<li IfModActive="rjw.sexperience">Mods/Sexperience</li>
</v1.5>
</loadFolders>

View file

@ -27,6 +27,8 @@
<description>This Xenotype loves being cumflated.</description>
<iconPath>Genes/Icons/Cumflation</iconPath>
<displayOrderInCategory>536</displayOrderInCategory>
<biostatMet>-1</biostatMet>
<biostatCpx>2</biostatCpx>
<forcedTraits>
<li>
<def>LikesCumflation</def>
@ -71,6 +73,8 @@
<iconPath>Genes/Icons/Generous_Donor</iconPath>
<displayOrderInCategory>538</displayOrderInCategory>
<biostatCpx>2</biostatCpx>
<biostatMet>-1</biostatMet>
<modExtensions>
<li MayRequire="OskarPotocki.VanillaFactionsExpanded.Core" Class="VanillaGenesExpanded.GeneExtension">
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>

View file

@ -98,15 +98,6 @@
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>-0.75</severityPerDay>
</li>
<li Class="LicentiaLabs.Hediffs.HediffCompProperties_VomitCumMtb">
<mtbDaysPerStage>
<li>0</li>
<li>0</li>
<li>0.75</li>
<li>0.5</li>
<li>0.2</li>
</mtbDaysPerStage>
</li>
</comps>
<stages>
<li>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<GeneDef>
<defName>rjw_genes_living_cumbucket</defName>
<label>living cumbucket</label>
<displayCategory>rjw_genes_cum</displayCategory>
<description>When this Xenotype partakes in sexual activity, they store cum and produce it as an item.</description>
<iconPath>Genes/Icons/living_cumbucket</iconPath>
<displayOrderInCategory>559</displayOrderInCategory>
<biostatCpx>3</biostatCpx>
<biostatMet>-2</biostatMet>
<modExtensions>
<li MayRequire="OskarPotocki.VanillaFactionsExpanded.Core" Class="VanillaGenesExpanded.GeneExtension">
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li>
</modExtensions>
</GeneDef>
</Defs>

View file

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<defName>rjw_genes_filled_living_cumbucket</defName>
<hediffClass>HediffWithComps</hediffClass>
<label>filled living cumbucket</label>
<description>This pawn is a (filled) living cum bucket. Thanks to a generous donation, this pawn will slowly generate cum for pickup.</description>
<defaultLabelColor>(240,200,110)</defaultLabelColor>
<scenarioCanAdd>false</scenarioCanAdd>
<!-- <maxSeverity>1.0</maxSeverity> -->
<isBad>false</isBad>
<tendable>false</tendable>
<comps>
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>-0.5</severityPerDay>
</li>
<li Class="RJW_Genes.HediffsCompProperties_ProcessCumbucketMTB">
<mtbDaysPerStage>
<li>0</li>
<li>0.5</li>
<li>0.25</li>
<li>0.1</li>
<li>0.5</li>
</mtbDaysPerStage>
</li>
</comps>
<stages>
<li>
<label>slight</label>
<statOffsets>
<Vulnerability>-0.1</Vulnerability>
</statOffsets>
</li>
<li>
<label>moderate</label>
<minSeverity>0.4</minSeverity>
<hungerRateFactor>0.8</hungerRateFactor>
<statOffsets>
<Vulnerability>-0.25</Vulnerability>
</statOffsets>
<capMods>
<li>
<capacity>Moving</capacity>
<offset>-0.05</offset>
</li>
</capMods>
</li>
<li>
<label>full</label>
<minSeverity>0.65</minSeverity>
<hungerRateFactor>0.75</hungerRateFactor>
<statOffsets>
<Vulnerability>-0.25</Vulnerability>
</statOffsets>
<capMods>
<li>
<capacity>Moving</capacity>
<offset>-0.1</offset>
</li>
</capMods>
</li>
<li>
<label>over-full</label>
<minSeverity>1.1</minSeverity>
<hungerRateFactor>0.6</hungerRateFactor>
<statOffsets>
<Vulnerability>-0.5</Vulnerability>
</statOffsets>
<capMods>
<li>
<capacity>Moving</capacity>
<offset>-0.15</offset>
</li>
</capMods>
</li>
<li>
<label>living reservior</label>
<minSeverity>10.1</minSeverity>
<hungerRateFactor>0.1</hungerRateFactor>
<statOffsets>
<Vulnerability>-1.5</Vulnerability>
</statOffsets>
<capMods>
<li>
<capacity>Moving</capacity>
<offset>-0.55</offset>
</li>
</capMods>
</li>
</stages>
</HediffDef>
</Defs>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!--========= General ============-->
<JobDef>
<defName>ProcessCumbucket</defName>
<driverClass>RJW_Genes.JobDriver_ProcessingCumbucket</driverClass>
<playerInterruptible>false</playerInterruptible>
<casualInterruptible>false</casualInterruptible>
<reportString>processing internal cumbucket.</reportString>
<suspendable>false</suspendable>
</JobDef>
</Defs>

View file

@ -1,5 +1,8 @@
# RJW-Genes [NSFW]
[![BuyMeACoffee](https://raw.githubusercontent.com/pachadotdev/buymeacoffee-badges/main/bmc-white.svg)](https://buymeacoffee.com/vegapnk)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
This mod adds genes related and based on RJW to Rimworld.
## Current Features
@ -12,6 +15,7 @@ This mod adds genes related and based on RJW to Rimworld.
- Sexual Vampires that need Cum, Cocks or some other sources.
- Mech Breeding Additions & Orgasmic Mytosis
- Human-Animal Gene Inheritance merged from [Shabakur](https://github.com/Shabakur/RJW_Animal_Gene_Inheritance)
- Genetic Diseases that spread on Intercourse
- Patches for some popular / common Xenotypes from other Mods.
*You might not see all of them. Many genes just show up if other mods are loaded*.

View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
public class ChanceExtension : DefModExtension
{
public float chance;
}
}

View file

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
public class HediffIncreaseOnSexExtension: DefModExtension
{
public HediffDef hediffDef;
public float severityIncrease;
public float applicationChance;
public bool canCreateHediff;
public bool applicableForWomen;
public bool applicableForMen;
public bool requiresPenetrativeSex;
}
}

View file

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
public class MultiplierExtension : DefModExtension
{
public float multiplier;
}
}

View file

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
public class TickBasedChanceExtension : TickIntervalExtension
{
/// <summary>
/// Set to 1 for "always", set to 0 for "never".
/// Everything else is a bit statistics, but e.g. when set to .5 the chances grow per day from [50%, 75%, 82.25%, ...]
/// </summary>
public float eventChance;
}
}

View file

@ -0,0 +1,42 @@
using RimWorld;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
public class FactionUtility
{
/// <summary>
/// Tries to change the goodwill between the factions of two pawns.
/// Exceptions when nothing happens:
/// - Pawns, or Pawns Factions, are null
/// - The `actors` Faction is not the players faction
/// - Both pawns have the same faction
/// - The Event is not found
/// </summary>
/// <param name="actor">The pawn that initiated a faction-goodwill change by his actions</param>
/// <param name="target">The pawn that was harmed/affected by the action</param>
/// <param name="HistoryEventDefname">The event defname, for proper reporting</param>
/// <param name="goodWillChange">How much (positive or negative) the goodwill will change</param>
public static void HandleFactionGoodWillPenalties(Pawn actor, Pawn target, string HistoryEventDefname, int goodWillChange, bool canSendHostileLetter=true)
{
if (actor == null) return;
if (target == null) return;
if (
target.Faction != null && actor.Faction != null
&& target.Faction != actor.Faction
&& target.Faction != Faction.OfPlayer)
{
HistoryEventDef reason = DefDatabase<HistoryEventDef>.GetNamedSilentFail(HistoryEventDefname);
if (reason == null) return;
target.Faction.TryAffectGoodwillWith(actor.Faction, goodWillChange, true, canSendHostileLetter, reason, target);
}
}
}
}

View file

@ -30,5 +30,12 @@ namespace RJW_Genes
Log.Warning($"[{ModId}] {message}");
}
public static void Debug(string message)
{
if (RJW_Genes_Settings.rjw_genes_detailed_debug)
{
Log.Message($"[{ModId}][debug] {message}");
}
}
}
}

View file

@ -0,0 +1,80 @@
using HarmonyLib;
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
/// <summary>
/// This patch "only" applies the hediff increase on sex.
/// It checks for the hediff, creates it if necessary and applicable,
/// and increases it based on the severity, chance and genders specified in the Extension.
///
/// Some hediffs want follow up logic, e.g. the Feminization Gene,
/// which is handled in an extra patch (that requires the hediff to be present already).
/// </summary>
[HarmonyPatch(typeof(SexUtility), "Aftersex")]
public class Patch_HediffIncreaseOnSex
{
public static void Postfix(SexProps props)
{
if (props == null || props.pawn == null || props.partner == null || props.partner.IsAnimal() || props.pawn.IsAnimal())
{
return;
}
Pawn pawn = props.pawn;
Pawn partner = props.partner;
if (pawn.genes == null || partner.genes == null) return;
TryApplyHediffsOfSex(pawn, partner, props);
TryApplyHediffsOfSex(partner, pawn, props);
}
/// <summary>
/// Checks for every gene in a pawn if it applies a hediff or the severity of an existing hediff in a sexual partner.
/// If the checks pass, the hediff is added or changed accordingly.
/// </summary>
/// <param name="pawn">Pawn that holds (one or many) genes that might apply a hediff change</param>
/// <param name="partner">Pawn that will receive or alter any hediffs, if applicable</param>
/// <param name="props">The Sexprops, used for checking if sex is penetrative</param>
static void TryApplyHediffsOfSex(Pawn pawn, Pawn partner, SexProps props)
{
var random = new Random();
foreach (Gene gene in pawn.genes.GenesListForReading)
{
HediffIncreaseOnSexExtension ext = gene.def.GetModExtension<HediffIncreaseOnSexExtension>();
if (ext == null) continue;
if (DiseaseHelper.IsImmuneAgainstGeneticDisease(partner, gene.def)) continue;
if (ext.requiresPenetrativeSex && DiseaseHelper.IsPenetrativeSex(props)) continue;
if (!ext.applicableForMen && partner.gender == Gender.Male) continue;
if (!ext.applicableForWomen && partner.gender == Gender.Female) continue;
if (random.NextDouble() >= ext.applicationChance) continue;
Hediff hediff = partner.health.hediffSet.GetFirstHediffOfDef(ext.hediffDef);
if (hediff == null)
{
if (!ext.canCreateHediff) continue;
hediff = partner.health.GetOrAddHediff(ext.hediffDef);
hediff.Severity = 0.01f;
ModLog.Debug($"{partner} got hediff {hediff.def.defName} from Patch_HediffIncreaseOnSex ({gene.def.defName}) upon sex with {pawn}");
}
float initial_severity = hediff.Severity;
ModLog.Debug($"{partner}s hediff {hediff.def.defName} was changed by Patch_HediffIncreaseOnSex ({gene.def.defName}) upon sex with {pawn} [from {initial_severity} to {initial_severity + ext.severityIncrease}]");
hediff.Severity += ext.severityIncrease;
// DevNote: I also want to have "negative" hediff changes here, but I think its not necessary. Once the severity reaches 0, or below, the hediff should remove itself.
}
}
}
}

View file

@ -73,14 +73,18 @@ namespace RJW_Genes
public static readonly GeneDef rjw_genes_fervent_ovipositor;
public static readonly GeneDef rjw_genes_insectbreeder;
public static readonly GeneDef rjw_genes_insectincubator;
// Cum
public static readonly GeneDef rjw_genes_hardwired_progenity;
public static readonly GeneDef rjw_genes_blocked_masturbation;
public static readonly GeneDef rjw_genes_basic_rut;
// Cum
public static readonly GeneDef rjw_genes_no_cum;
public static readonly GeneDef rjw_genes_much_cum;
public static readonly GeneDef rjw_genes_very_much_cum;
[MayRequire("LustLicentia.RJWLabs")] public static readonly GeneDef rjw_genes_likes_cumflation;
[MayRequire("LustLicentia.RJWLabs")] public static readonly GeneDef rjw_genes_cumflation_immunity;
[MayRequire("LustLicentia.RJWLabs")] public static readonly GeneDef rjw_genes_generous_donor;
[MayRequire("rjw.sexperience")] public static readonly GeneDef rjw_genes_living_cumbucket;
// Reproduction
@ -104,12 +108,17 @@ namespace RJW_Genes
public static readonly GeneDef rjw_genes_hormonal_saliva;
public static readonly GeneDef rjw_genes_cocoonweaver;
public static readonly GeneDef rjw_genes_sex_tamer;
public static readonly GeneDef rjw_genes_sexual_genetic_swap;
public static readonly GeneDef rjw_genes_sexual_genetic_thief;
public static readonly GeneDef rjw_genes_pregnancy_overwrite;
public static readonly GeneDef rjw_genes_feminizer;
public static readonly GeneDef rjw_genes_twinkifier;
// Cosmetic
public static readonly GeneDef rjw_genes_succubus_tail;
public static readonly GeneDef rjw_genes_succubus_wings;
//life force
// Life force | Fertilin
public static readonly GeneDef rjw_genes_lifeforce;
public static readonly GeneDef rjw_genes_pussyhealing;
public static readonly GeneDef rjw_genes_lifeforce_drain;
@ -121,6 +130,21 @@ namespace RJW_Genes
public static readonly GeneDef rjw_genes_cockeater;
public static readonly GeneDef rjw_genes_lifeforce_empath;
// Diseases
public static readonly GeneDef rjw_genes_genetic_disease_immunity;
public static readonly GeneDef rjw_genes_minor_vulnerability;
public static readonly GeneDef rjw_genes_major_vulnerability;
public static readonly GeneDef rjw_genes_fluctual_sexual_needs;
public static readonly GeneDef rjw_genes_size_blinded;
public static readonly GeneDef rjw_genes_infectious_low_fertility;
public static readonly GeneDef rjw_genes_infectious_increased_sex_need;
public static readonly GeneDef rjw_genes_infectious_bisexuality;
public static readonly GeneDef rjw_genes_infectious_homosexuality;
public static readonly GeneDef rjw_genes_infectious_hypersexuality;
public static readonly GeneDef rjw_genes_stretcher;
public static readonly GeneDef rjw_genes_infectious_blocked_masturbation;
public static readonly GeneDef rjw_genes_infectious_rut;
//Other Defs
public static readonly XenotypeDef rjw_genes_succubus;
public static readonly DutyDef rjw_genes_flirt;

View file

@ -0,0 +1,38 @@
using RimWorld;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
public class ConditionalStatAffecter_ManyChildren : ConditionalStatAffecter
{
public override string Label => (string)"StatsReport_ManyChildren".Translate();
public const int THRESHOLD_FOR_CHILDREN = 3;
public override bool Applies(StatRequest req)
{
if (req == null || req.Thing == null || !req.Thing.Spawned) return false;
if (req.Thing is Pawn pawn)
{
// Do nothing if Pawn is Baby or Child (#25)
if (!pawn.ageTracker.Adult)
return false;
if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_hardwired_progenity))
{
// This "middle" Conditional Stat Affecter only fires if the other one does not apply
return pawn.relations.ChildrenCount >= THRESHOLD_FOR_CHILDREN
&& pawn.relations.ChildrenCount < ConditionalStatAffecter_VeryManyChildren.THRESHOLD_FOR_CHILDREN;
}
}
return false;
}
}
}

View file

@ -0,0 +1,43 @@
using RimWorld;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
/// <summary>
/// This conditional stat affecter "fires" if the pawn has no children.
///
/// DevNote: I salvaged this from 1.3.3 Halamyr Conditional Stat Affecters.
/// It seems that with RW 1.5 there was a change how these work, as the req.Pawn seems to be null.
/// Now, the pawn is in req.Thing.
/// </summary>
public class ConditionalStatAffecter_NoChildren : ConditionalStatAffecter
{
public override string Label => (string)"StatsReport_NoChildren".Translate();
public override bool Applies(StatRequest req)
{
if (req == null || req.Thing == null || !req.Thing.Spawned) return false;
if (req.Thing is Pawn pawn)
{
// Do nothing if Pawn is Baby or Child (#25)
if (!pawn.ageTracker.Adult)
return false;
if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_hardwired_progenity))
{
return pawn.relations.ChildrenCount == 0;
}
}
return false;
}
}
}

View file

@ -0,0 +1,36 @@
using RimWorld;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
public class ConditionalStatAffecter_VeryManyChildren : ConditionalStatAffecter
{
public override string Label => (string)"StatsReport_VeryManyChildren".Translate();
public const int THRESHOLD_FOR_CHILDREN = 8;
public override bool Applies(StatRequest req)
{
if (req == null || req.Thing == null || !req.Thing.Spawned) return false;
if (req.Thing is Pawn pawn)
{
// Do nothing if Pawn is Baby or Child (#25)
if (!pawn.ageTracker.Adult)
return false;
if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_hardwired_progenity))
{
return pawn.relations.ChildrenCount >= THRESHOLD_FOR_CHILDREN;
}
}
return false;
}
}
}

View file

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
public class Gene_Rut : Gene
{
public override void Tick()
{
base.Tick();
if (pawn == null || pawn.genes == null)
return;
var chanceExtension = this.def.GetModExtension<TickBasedChanceExtension>();
if (chanceExtension == null) return;
if (pawn.IsHashIntervalTick(chanceExtension.tickInterval)){
Random r = new Random();
if (r.NextDouble() < chanceExtension.eventChance)
{
Hediff rut = pawn.health.GetOrAddHediff(HediffDefOf.rjw_genes_genetic_rut);
rut.Severity = 1;
ModLog.Debug($"Pawn {pawn} gained rjw_genes_genetic_rut based on chance.");
}
}
}
}
}

View file

@ -0,0 +1,26 @@
using HarmonyLib;
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
[HarmonyPatch(typeof(xxx), "can_masturbate")]
public class Patch_BlockedMasturbation
{
public void PostFix(Pawn pawn, ref bool __result)
{
if (pawn != null && !pawn.IsAnimal() && pawn.genes != null)
{
__result = __result
&& !pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_blocked_masturbation)
&& !pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_infectious_blocked_masturbation);
}
}
}
}

View file

@ -34,8 +34,23 @@ namespace RJW_Genes
}
//Get total fluidamount a person has.
public static float GetTotalFluidAmount(Pawn pawn, float multiplier = 1f)
/// <summary>
/// Looks up the "MultiplierExtensions" Value for a given Gene, with a fall back.
/// Returns the fallback if there is no Extension, or if the Multiplier is smaller than 0.
/// </summary>
public static float LookupCumMultiplier(Gene gene, float FALLBACK = 3.0f) => LookupCumMultiplier(gene.def,FALLBACK);
public static float LookupCumMultiplier(GeneDef def, float FALLBACK = 3.0f)
{
MultiplierExtension multiplier = def.GetModExtension<MultiplierExtension>();
if (multiplier == null || multiplier.multiplier < 0)
return FALLBACK;
else return multiplier.multiplier;
}
//Get total fluidamount a person has.
public static float GetTotalFluidAmount(Pawn pawn, float multiplier = 1f)
{
var partBPR = Genital_Helper.get_genitalsBPR(pawn);
var parts = Genital_Helper.get_PartsHediffList(pawn, partBPR);

View file

@ -1,34 +0,0 @@
namespace RJW_Genes
{
public class Gene_NoCum : RJW_Gene
{
bool has_been_fired = false;
public override void PostMake()
{
base.PostMake();
CumUtility.MultiplyFluidAmountBy(pawn, 0f);
has_been_fired = true;
}
public override void PostAdd()
{
base.PostAdd();
if (!has_been_fired) {
CumUtility.MultiplyFluidAmountBy(pawn, 0f);
has_been_fired = true;
}
}
public override void PostRemove()
{
// Cum Removal does not do at the moment :/ I would need to safe the old cum amount but I don't want to at the moment
base.PostAdd();
}
}
}

View file

@ -1,39 +0,0 @@
namespace RJW_Genes
{
public class Gene_VeryMuchCum : RJW_Gene
{
bool has_been_fired = false;
float multiplier_much_cum = 10f;
public override void PostMake()
{
base.PostMake();
CumUtility.MultiplyFluidAmountBy(pawn, multiplier_much_cum);
has_been_fired = true;
}
public override void PostAdd()
{
base.PostAdd();
if (!has_been_fired) {
CumUtility.MultiplyFluidAmountBy(pawn, multiplier_much_cum);
has_been_fired = true;
}
}
public override void PostRemove()
{
base.PostAdd();
if (has_been_fired)
{
CumUtility.MultiplyFluidAmountBy(pawn, 1/multiplier_much_cum);
has_been_fired = false;
}
}
}
}

View file

@ -1,36 +1,38 @@
namespace RJW_Genes
{
public class Gene_MuchCum : RJW_Gene
public class Gene_ChangeCumAmount : RJW_Gene
{
bool has_been_fired = false;
float multiplier_much_cum = 3f;
public override void PostMake()
{
base.PostMake();
CumUtility.MultiplyFluidAmountBy(pawn, multiplier_much_cum);
float multipier = CumUtility.LookupCumMultiplier(this);
CumUtility.MultiplyFluidAmountBy(pawn, multipier);
has_been_fired = true;
}
public override void PostAdd()
{
base.PostAdd();
if (!has_been_fired) {
CumUtility.MultiplyFluidAmountBy(pawn, multiplier_much_cum);
if (!has_been_fired)
{
float multipier = CumUtility.LookupCumMultiplier(this);
CumUtility.MultiplyFluidAmountBy(pawn, multipier);
has_been_fired = true;
}
}
public override void PostRemove()
{
base.PostAdd();
if (has_been_fired)
{
CumUtility.MultiplyFluidAmountBy(pawn, 1/multiplier_much_cum);
float multipier = CumUtility.LookupCumMultiplier(this);
CumUtility.MultiplyFluidAmountBy(pawn, 1/ multipier);
has_been_fired = false;
}
}

View file

@ -0,0 +1,28 @@

using RimWorld;
using System;
using Verse;
namespace RJW_Genes
{
public class HediffComp_ProcessCumbucket : HediffComp
{
public HediffsCompProperties_ProcessCumbucketMTB Props
{
get
{
return (HediffsCompProperties_ProcessCumbucketMTB)this.props;
}
}
public override void CompPostTick(ref float severityAdjustment)
{
if (this.Props.mtbDaysPerStage[this.parent.CurStageIndex] > 0f && base.Pawn.IsHashIntervalTick(60) && Rand.MTBEventOccurs(this.Props.mtbDaysPerStage[this.parent.CurStageIndex], 60000f, 60f))
{
ModLog.Debug($"Triggered HediffComp_ProcessCumbucket CompPostTick - Starting a JobDriver ProcessCumbucket for {this.parent.pawn}");
this.Pawn.jobs.StartJob(JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("ProcessCumbucket")), lastJobEndCondition: Verse.AI.JobCondition.InterruptForced, resumeCurJobAfterwards: true);
}
}
}
}

View file

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
public class HediffsCompProperties_ProcessCumbucketMTB : HediffCompProperties
{
public HediffsCompProperties_ProcessCumbucketMTB()
{
this.compClass = typeof(HediffComp_ProcessCumbucket);
}
public override IEnumerable<string> ConfigErrors(HediffDef parentDef)
{
foreach (string text in base.ConfigErrors(parentDef))
{
yield return text;
}
if (this.mtbDaysPerStage == null)
{
yield return "mtbDaysPerStage is not defined";
}
else if (this.mtbDaysPerStage.Count != parentDef.stages.Count)
{
yield return "mtbDaysPerStage count doesn't match Hediffs number of stages";
}
yield break;
}
public List<float> mtbDaysPerStage;
}
}

View file

@ -0,0 +1,132 @@
using LicentiaLabs;
using System.Collections.Generic;
using Verse;
using Verse.AI;
using UnityEngine;
using System;
using rjw;
using RimWorld;
namespace RJW_Genes
{
/// <summary>
/// Shamelessly stolen from LicentaLabs
/// [Jaals Fork] https://gitgud.io/Jaaldabaoth/licentia-labs/-/blob/master/Source/LicentiaLabs/LicentiaLabs/JobDriver_VomitCum.cs
/// </summary>
class JobDriver_ProcessingCumbucket : JobDriver_Vomit
{
public override bool CanBeginNowWhileLyingDown()
{
return true;
}
protected override IEnumerable<Toil> MakeNewToils()
{
if (!ModsConfig.IsActive("rjw.sexperience"))
yield break;
Toil toil = new Toil();
toil.initAction = delegate ()
{
this.ticksLeft = Rand.Range(150, 600);
int num = 0;
IntVec3 c;
for (; ; )
{
c = this.pawn.Position + GenAdj.AdjacentCellsAndInside[Rand.Range(0, 9)];
num++;
if (num > 12)
{
break;
}
if (c.InBounds(this.pawn.Map) && c.Standable(this.pawn.Map))
{
// DevNote: I am not 100% what this all means, but IL_77 is a jump to the case below (it says IL_77).
// basically, this calls the next part of the function, but I am not super sure why this has to be like this.
// JobDrivers are scary.
goto IL_77;
}
}
c = this.pawn.Position;
IL_77:
this.job.targetA = c;
this.pawn.pather.StopDead();
};
toil.tickAction = delegate ()
{
if (this.ticksLeft % 150 == 149)
{
if (!sourceName.NullOrEmpty())
{
if (ModsConfig.IsActive("LustLicentia.RJWLabs"))
FilthMaker.TryMakeFilth(this.job.targetA.Cell, base.Map, Licentia.ThingDefs.FilthCum, sourceName);
SpawnCum(this.pawn, this.job.targetA.Cell, base.Map);
}
else
{
if (ModsConfig.IsActive("LustLicentia.RJWLabs"))
FilthMaker.TryMakeFilth(this.job.targetA.Cell, base.Map, Licentia.ThingDefs.FilthCum);
SpawnCum(this.pawn, this.job.targetA.Cell, base.Map);
}
}
this.ticksLeft--;
if (this.ticksLeft <= 0)
{
base.ReadyForNextToil();
TaleRecorder.RecordTale(Licentia.TaleDefs.VomitedCum, new object[]
{
this.pawn
});
}
};
toil.defaultCompleteMode = ToilCompleteMode.Never;
toil.WithEffect(EffecterDefOf.Vomit, TargetIndex.A, new Color(100f, 100f, 100f, 0.5f));
toil.PlaySustainerOrSound(() => SoundDefOf.Vomit, 1f);
yield return toil;
yield break;
}
private void SpawnCum(Pawn pawn, IntVec3 cell, Map map)
{
ThingDef cumDef = DefDatabase<ThingDef>.GetNamed("GatheredCum", true);
Hediff hediff = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.rjw_genes_filled_living_cumbucket);
if (hediff == null)
{
ModLog.Warning($"{pawn} has the JobDriver_ProcessCumbucket but does not have the Hediff for filled cumbucket.");
return;
}
// Case 1: "Normal Severity", just puke out a bit of cum here and there.
if (hediff.Severity <= 10)
{
Thing cum = ThingMaker.MakeThing(cumDef);
cum.Position = cell;
int stacks = Math.Max(1, (int)(hediff.Severity * 1.5));
stacks = Math.Min(stacks, 75); // 75 is the default max stacksize ...
cum.stackCount = stacks;
cum.SpawnSetup(map, false);
hediff.Severity -= (stacks / 50);
} else
// Case 2: Reserviour mode, put out a lot of cum at once but less often.
{
int stacks = Math.Max(1, (int)(hediff.Severity * 1.5));
while (stacks > 0)
{
Thing cum = ThingMaker.MakeThing(cumDef);
cum.Position = cell;
var curStacks = Math.Min(stacks, 75); // 75 is the default max stacksize ...
cum.stackCount = stacks;
cum.SpawnSetup(map, false);
hediff.Severity -= (curStacks / 50);
stacks -= curStacks;
}
}
}
private int ticksLeft;
public string sourceName;
}
}

View file

@ -0,0 +1,64 @@
using HarmonyLib;
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using static System.Net.Mime.MediaTypeNames;
namespace RJW_Genes
{
[HarmonyPatch(typeof(SexUtility), nameof(SexUtility.SatisfyPersonal))]
public class Patch_LivingCumbucket_StackHediff
{
/// <summary>
/// This is the amount of fluid required if the pawn has a bodysize of 1, to reach a severity in the hediff of 1.
/// The hediff can still be increased over 1.0.
/// </summary>
const float fluid_amount_required_for_hediff_severity_ = 100.0f;
public static void Postfix(SexProps props)
{
if (!ModsConfig.IsActive("rjw.sexperience"))
return;
// ShortCuts: Exit Early if Pawn or Partner are null (can happen with Masturbation or other nieche-cases)
if (props == null || props.pawn == null || !props.hasPartner())
return;
Pawn pawnA = props.pawn;
Pawn pawnB = props.partner;
if (pawnA.genes != null && pawnA.genes.HasActiveGene(GeneDefOf.rjw_genes_living_cumbucket) && CumUtility.GetTotalFluidAmount(pawnB) > 0)
{
ProcessLivingCumbucket(pawnA, CumUtility.GetTotalFluidAmount(pawnB));
}
if (pawnB.genes != null && pawnB.genes.HasActiveGene(GeneDefOf.rjw_genes_living_cumbucket) && CumUtility.GetTotalFluidAmount(pawnA) > 0)
{
ProcessLivingCumbucket(pawnB, CumUtility.GetTotalFluidAmount(pawnA));
}
}
public static void ProcessLivingCumbucket(Pawn pawn, float cumamount)
{
float bodysize = pawn.BodySize;
float result_severity_increase = cumamount / (fluid_amount_required_for_hediff_severity_ * bodysize);
Hediff hediff = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.rjw_genes_filled_living_cumbucket);
if (hediff == null)
{
hediff = pawn.health.GetOrAddHediff(HediffDefOf.rjw_genes_filled_living_cumbucket);
hediff.Severity = 0.01f;
}
hediff.Severity += result_severity_increase;
ModLog.Debug($"Pumping the living cumbucket {pawn} (Bodysize {bodysize}) with {cumamount} cum, resulting in severity {hediff.Severity} (+{result_severity_increase})");
}
}
}

View file

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
public class GeneticDiseaseExtension : DefModExtension
{
/// <summary>
/// The chance for this gene to spread upon (finished) sex.
/// </summary>
public float infectionChance;
}
}

Some files were not shown because too many files have changed in this diff Show more