Compare commits

..

16 commits

Author SHA1 Message Date
Telanda
b70b975b67
Merge 2.6.2 Update (#228)
* - Seperation of Animal Gene code from base RJW_Genes

* - Clean-up of leftover XML Files
- Minor update to README.md

* Fixed missing translation text
Fixed Missing B&S Undead Patch
Fixed Anal Fertility Errors, might be broken again.

DLL Included for Merge.
2026-02-28 23:15:14 +11:00
Telanda-DDS
4946df511e - Recompiled Cumpliation plugin against newest version of Cumpilation.
- Fixed Indentation
2025-10-18 10:45:32 +11:00
Telanda-DDS
ef953fa1b7 - Fixes to address changed RJW Settings Variables. 2025-10-16 16:18:28 +11:00
Telanda-DDS
be27255832 - Updated All Version Information. 2025-09-05 16:42:35 +10:00
Telanda
83e9f9ef5b
Dev (#222)
- Seperation of Animal Gene code from base RJW_Genes
- Minor update to README.md
2025-09-05 16:37:32 +10:00
Telanda-DDS
45a451a127 - Added additional Debug Message Check. 2025-08-21 09:46:51 +10:00
Telanda-DDS
7692ce3425 - Fixed bug with beastiality gene inheritance null reference. 2025-08-18 14:40:02 +10:00
Telanda-DDS
b13f761ede - Versioning Updates 2025-08-18 12:26:00 +10:00
Telanda-DDS
ed761327d2 - Fixed bug with fertile Anus not correctly detecting if penetrating partner was fertile. 2025-08-18 12:20:00 +10:00
Telanda-DDS
e0a333f539 - Fixed incorrect reference to Sexperience mod. 2025-08-04 10:27:19 +10:00
Telanda-DDS
5025700727 - Fixed potential null varaible exception in ElToro Stretching patch.
- Fixed Orgasm Rush not triggering when partner was an Animal.
2025-08-03 12:06:16 +10:00
Telanda-DDS
a407f3f400 - 2.5.5 Version Update & CHANGELOG.md 2025-07-25 14:11:06 +10:00
Telanda-DDS
6e26d596cf - Updated Elastic gene to also increase speed at which stretched parts return to normal under ElToro's streching Mod.
- Removed Unnecessary packages.config
2025-07-25 14:06:02 +10:00
Telanda-DDS
670361a748 - Support for RJW RC-5
- Fixed Typo in Disease ThoughtDef
2025-07-25 11:25:52 +10:00
Telanda-DDS
c7ea7144dc - Fixed ElToro Stretching support causing an error if not present. 2025-07-25 09:51:45 +10:00
Telanda-DDS
97eabd540d - Fixed incorrect consciousness value. 2025-07-24 18:03:03 +10:00
46 changed files with 176 additions and 2124 deletions

Binary file not shown.

View file

@ -27,7 +27,7 @@
<li Class="RJW_Genes.GenitaliaTypeExtension"> <li Class="RJW_Genes.GenitaliaTypeExtension">
<penis>HorsePenis</penis> <penis>HorsePenis</penis>
<vagina>HorseVagina</vagina> <vagina>HorseVagina</vagina>
<anus>GenericAnus</anus> <anus>Anus</anus>
</li> </li>
</modExtensions> </modExtensions>
<displayOrderInCategory>802</displayOrderInCategory> <displayOrderInCategory>802</displayOrderInCategory>
@ -58,7 +58,7 @@
<li Class="RJW_Genes.GenitaliaTypeExtension"> <li Class="RJW_Genes.GenitaliaTypeExtension">
<penis>DogPenis</penis> <penis>DogPenis</penis>
<vagina>DogVagina</vagina> <vagina>DogVagina</vagina>
<anus>GenericAnus</anus> <anus>Anus</anus>
</li> </li>
</modExtensions> </modExtensions>
<displayOrderInCategory>803</displayOrderInCategory> <displayOrderInCategory>803</displayOrderInCategory>
@ -73,7 +73,7 @@
<li Class="RJW_Genes.GenitaliaTypeExtension"> <li Class="RJW_Genes.GenitaliaTypeExtension">
<penis>CatPenis</penis> <penis>CatPenis</penis>
<vagina>CatVagina</vagina> <vagina>CatVagina</vagina>
<anus>GenericAnus</anus> <anus>Anus</anus>
</li> </li>
</modExtensions> </modExtensions>
<displayOrderInCategory>804</displayOrderInCategory> <displayOrderInCategory>804</displayOrderInCategory>
@ -106,7 +106,7 @@
<li Class="RJW_Genes.GenitaliaTypeExtension"> <li Class="RJW_Genes.GenitaliaTypeExtension">
<penis>DragonPenis</penis> <penis>DragonPenis</penis>
<vagina>DragonVagina</vagina> <vagina>DragonVagina</vagina>
<anus>GenericAnus</anus> <anus>Anus</anus>
</li> </li>
<li Class="RJW_Genes.QirkExtension"> <li Class="RJW_Genes.QirkExtension">
<Satisfiedquirk>ScaleLoverQuirk</Satisfiedquirk> <Satisfiedquirk>ScaleLoverQuirk</Satisfiedquirk>
@ -189,6 +189,8 @@
<modExtensions> <modExtensions>
<li Class="RJW_Genes.GenitaliaTypeExtension"> <li Class="RJW_Genes.GenitaliaTypeExtension">
<penis>HemiPenis</penis> <penis>HemiPenis</penis>
<vagina>CloacalVagina</vagina>
<anus>CloacalAnus</anus>
</li> </li>
<li Class="RJW_Genes.QirkExtension"> <li Class="RJW_Genes.QirkExtension">
<Satisfiedquirk>ScaleLoverQuirk</Satisfiedquirk> <Satisfiedquirk>ScaleLoverQuirk</Satisfiedquirk>
@ -233,4 +235,31 @@
</exclusionTags> </exclusionTags>
</GeneDef> </GeneDef>
<GeneDef ParentName="GeneGenitalTypeBase">
<defName>rjw_genes_rodent_genitalia</defName>
<label>rodent genitalia</label>
<description>Carriers of this gene develop rodent genitalia.</description>
<iconPath>Genes/Icons/Genitalia_croc_icon</iconPath>
<modExtensions>
<li Class="RJW_Genes.GenitaliaTypeExtension">
<penis>RodentPenis</penis>
<vagina>RodentVagina</vagina>
</li>
</modExtensions>
</GeneDef>
<GeneDef ParentName="GeneGenitalTypeBase">
<defName>rjw_genes_cloacal_genitalia</defName>
<label>cloacal genitalia</label>
<description>Carriers of this gene develop cloacal genitalia.</description>
<iconPath>Genes/Icons/Genitalia_croc_icon</iconPath>
<modExtensions>
<li Class="RJW_Genes.GenitaliaTypeExtension">
<penis>CloacalPenis</penis>
<vagina>CloacalVagina</vagina>
<anus>CloacalAnus</anus>
</li>
</modExtensions>
</GeneDef>
</Defs> </Defs>

View file

@ -30,7 +30,7 @@
<capMods> <capMods>
<li> <li>
<capacity>Consciousness</capacity> <capacity>Consciousness</capacity>
<offset>-0.5</offset> <offset>-0.05</offset>
</li> </li>
</capMods> </capMods>
<statOffsets> <statOffsets>

View file

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<RJW_BGS.RaceGeneDef Name="Insect_base" Abstract="True">
<defName>Insect_base</defName>
<genes>
<li>
<defName>AG_InsectBlood</defName>
<chance>0.5</chance>
</li>
<li>
<defName>rjw_genes_ovipositor_genitalia</defName>
<chance>0.5</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef Name="Slime_base" Abstract="True">
<defName>Slime_base</defName>
<genes>
<li>
<defName>AG_SlimeBlood</defName>
<chance>0.5</chance>
</li>
<li>
<defName>rjw_genes_slime_genitalia</defName>
<chance>0.5</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
</Defs>

View file

@ -1,285 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<RJW_BGS.RaceGeneDef Name = "Canine">
<defName>Canine</defName>
<raceGroups>
<li>Canine_Group</li>
<li>CanineAnimal</li>
<li>CanineSingleGenderAnimal</li>
<li>CanineSkinAnimal</li>
</raceGroups>
<genes>
<li>
<defName>Ears_Floppy</defName>
<chance>0.75</chance>
</li>
<li>
<defName>Tail_Furry</defName>
<chance>0.2</chance>
</li>
<li>
<defName>Furskin</defName>
<chance>0.5</chance>
</li>
<li>
<defName>rjw_genes_canine_genitalia</defName>
<chance>0.4</chance>
</li>
<li>
<defName>ViolenceDisabled</defName>
<chance>0.05</chance>
</li>
<li>
<defName>PsychicBonding</defName>
<chance>0.05</chance>
</li>
<li>
<defName>Mood_Sanguine</defName>
<chance>0.1</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>Insect</defName>
<raceGroups>
<li>Insect_Group</li>
<li>ArthropodOvipositorAnimal</li>
<li>ArthropodOvipositorHornyAnimal</li>
</raceGroups>
<genes>
<li>
<defName>Beauty_Ugly</defName>
<chance>0.5</chance>
</li>
<li>
<defName>Immunity_Strong</defName>
<chance>0.6</chance>
</li>
<li>
<defName>ToxicEnvironmentResistance_Partial</defName>
<chance>0.4</chance>
</li>
<li>
<defName>rjw_genes_ovipositor_genitalia</defName>
<chance>0.15</chance>
</li>
<li>
<defName>rjw_genes_insectincubator</defName>
<chance>0.1</chance>
</li>
<li>
<defName>rjw_genes_insectbreeder</defName>
<chance>0.1</chance>
</li>
<li>
<defName>Body_Thin</defName>
<chance>0.3</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>Feline</defName>
<raceGroups>
<li>Feline_Group</li>
<li>FelineAnimal</li>
<li>FelineHornyAnimal</li>
<li>FelineSingleGenderAnimal</li>
<li>AA_SandProwlerAnimal</li>
</raceGroups>
<genes>
<li>
<defName>Tail_Furry</defName>
<chance>0.2</chance>
</li>
<li>
<defName>Furskin</defName>
<chance>0.5</chance>
</li>
<li>
<defName>Ears_Cat</defName>
<chance>0.9</chance>
</li>
<li>
<defName>PsychicBonding</defName>
<chance>0.05</chance>
</li>
<li>
<defName>Sleepy</defName>
<chance>0.25</chance>
</li>
<li>
<defName>DarkVision</defName>
<chance>0.25</chance>
</li>
<li>
<defName>rjw_genes_feline_genitalia</defName>
<chance>0.25</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>Equine</defName>
<raceGroups>
<li>Equine_Group</li>
<li>HorseAnimal</li>
</raceGroups>
<genes>
<li>
<defName>Furskin</defName>
<chance>0.2</chance>
</li>
<li>
<defName>rjw_genes_equine_genitalia</defName>
<chance>0.25</chance>
</li>
<li>
<defName>MoveSpeed_Quick</defName>
<chance>0.4</chance>
</li>
<li>
<defName>MoveSpeed_VeryQuick</defName>
<chance>0.1</chance>
</li>
<li>
<defName>rjw_genes_much_fluid</defName>
<chance>0.3</chance>
</li>
<li>
<defName>rjw_genes_very_much_fluid</defName>
<chance>0.05</chance>
</li>
<li>
<defName>Body_Hulk</defName>
<chance>0.4</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>Dragon</defName>
<raceGroups>
<li>Dragon_Group</li>
<li>ThrumboAnimal</li>
<li>DragonAnimal</li>
<li>DragonSingleGenderAnimal</li>
</raceGroups>
<genes>
<li>
<defName>Unstoppable</defName>
<chance>0.25</chance>
</li>
<li>
<defName>Headbone_CenterHorn</defName>
<chance>0.9</chance>
</li>
<li>
<defName>VoiceRoar</defName>
<chance>0.6</chance>
</li>
<li>
<defName>MaxTemp_SmallIncrease</defName>
<chance>0.7</chance>
</li>
<li>
<defName>MaxTemp_LargeIncrease</defName>
<chance>0.1</chance>
</li>
<li>
<defName>rjw_genes_dragon_genitalia</defName>
<chance>0.6</chance>
</li>
<li>
<defName>FireResistant</defName>
<chance>0.15</chance>
</li>
<li>
<defName>rjw_genes_much_fluid</defName>
<chance>0.3</chance>
</li>
<li>
<defName>rjw_genes_very_much_fluid</defName>
<chance>0.05</chance>
</li>
<li>
<defName>Body_Hulk</defName>
<chance>0.7</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>Rodent</defName>
<raceGroups>
<li>Rodent_Group</li>
<li>RodentAnimal</li>
<li>RodentSingleGenderAnimal</li>
<li>DragonSingleGenderAnimal</li>
</raceGroups>
<genes>
<li>
<defName>Furskin</defName>
<chance>0.2</chance>
</li>
<li>
<defName>Fertile</defName>
<chance>0.25</chance>
</li>
<li>
<defName>FastRunner</defName>
<chance>0.6</chance>
</li>
<li>
<defName>rjw_genes_small_genitalia</defName>
<chance>0.6</chance>
</li>
<li>
<defName>Immunity_Strong</defName>
<chance>0.4</chance>
</li>
<li>
<defName>ToxicEnvironmentResistance_Partial</defName>
<chance>0.1</chance>
</li>
<li>
<defName>Body_Thin</defName>
<chance>0.45</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>Racoon</defName>
<raceGroups>
<li>Raccon_Group</li>
<li>RaccoonAnimal</li>
</raceGroups>
<genes>
<li>
<defName>Furskin</defName>
<chance>0.25</chance>
</li>
<li>
<defName>Tail_Furry</defName>
<chance>0.25</chance>
</li>
<li>
<defName>StrongStomach</defName>
<chance>0.5</chance>
</li>
<li>
<defName>Immunity_Strong</defName>
<chance>0.2</chance>
</li>
<li>
<defName>ToxicEnvironmentResistance_Partial</defName>
<chance>0.1</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
</Defs>

View file

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<!-- this is to disable the xml, remove it for your own xml
<RJW_BGS.RaceGeneDef>
<defName>Canine</defName>
defName can be anything you want, as long as it is unique
<raceGroups>
<li>Canine_Group</li>
<li>CanineAnimal</li> from racesupport
<li>CanineSingleGenderAnimal</li> from racesupport
<li>CanineSkinAnimal</li> from racesupport
</raceGroups>
RJW.Racegroupdef, all animals in the added raceGroups will be part of this group, RJW race support uses other defnames and overwrite vanilla ones, so add them to if you use it.
<raceNames>
<li> </li>
</raceNames>
For more direct control you can use raceNames directly. Use the defName of the animal. Can also use modded animals.
<pawnKindNames>
<li> </li>
</pawnKindNames>
For even more direct control you can use pawnKindNames.
<priority>0</priority>
You can use priority incase you have multiple racegenedefs with the same animal under the same list (racegroup, racenames or pawnKindNames). If not assigned the value is 0. Higher priority is chosen.
The RaceGeneDef for an animal will first be decided by if it is in the pawnkindNames, after that racenames and lastly racegroup,
so if there is for a wolf a RaceGeneDef with the canine group and a second which has wolf under raceNames it will always use the second one to determine
which genes can be inherited
<genes>
<li>
<defName>Ears_Floppy</defName>
<chance>0.5</chance>
</li>
<li>
<defName>rjw_genes_slime_genitalia</defName> You can add modded genes which will be ignored if the mod is inactive.
<chance>0.5</chance>
</li>
</genes>
For each gene you need to find the defname and give it a chance to appear. Each gene is rolled independently.
</RJW_BGS.RaceGeneDef>
this is to disable the xml, remove it for your own xml -->
<!-- this is to disable the xml, remove it for your own xml
You can use parents to have animals get specific genes in addition to the group. So warg children will have a chance for Ears_Floppy, rjw_genes_slime_genitalia and StrongStomach
<RJW_BGS.RaceGeneDef ParentName = "Canine">
<defName>Warg</defName>
<raceNames>
<li>Warg</li>
</raceNames>
<genes>
<li>
<defName>StrongStomach</defName>
<chance>0.5</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
this is to disable the xml, remove it for your own xml -->
</Defs>

View file

@ -36,7 +36,7 @@
<baseOpinionOffset>-3</baseOpinionOffset> <baseOpinionOffset>-3</baseOpinionOffset>
</li> </li>
<li> <li>
<label>carries more way genetic diseases than me</label> <label>carries way more genetic diseases than me</label>
<baseOpinionOffset>-8</baseOpinionOffset> <baseOpinionOffset>-8</baseOpinionOffset>
</li> </li>
<li> <li>

View file

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<rjw_genes_bestiality_hybrid_name>animal-hybrid</rjw_genes_bestiality_hybrid_name>
</LanguageData>

View file

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<rjw_genes_animal_inheritance_settings_enabled_key>enabled</rjw_genes_animal_inheritance_settings_enabled_key>
<rjw_genes_animal_inheritance_settings_enabled_explanation>If toggled, Animal Pregnancies will try inherit genes.</rjw_genes_animal_inheritance_settings_enabled_explanation>
<rjw_genes_animal_inheritance_settings_chance_key></rjw_genes_animal_inheritance_settings_chance_key>
<rjw_genes_animal_inheritance_settings_chance_explanation></rjw_genes_animal_inheritance_settings_chance_explanation>
<rjw_genes_animal_inheritance_settings_added_as_xenogene_key>genes as xenogenes</rjw_genes_animal_inheritance_settings_added_as_xenogene_key>
<rjw_genes_animal_inheritance_settings_added_as_xenogene_explanation>If toggled on, animal genes will be added as xenogenes.</rjw_genes_animal_inheritance_settings_added_as_xenogene_explanation>
<rjw_genes_animal_inheritance_settings_ve_genetics_hybridization_key>enable VE genetics hybridation</rjw_genes_animal_inheritance_settings_ve_genetics_hybridization_key>
<rjw_genes_animal_inheritance_settings_ve_genetics_hybridization_explanation>If enabled and if you have VE genetics it will enable the hybridation system.</rjw_genes_animal_inheritance_settings_ve_genetics_hybridization_explanation>
<rjw_genes_animal_inheritance_settings_detailed_debug_key></rjw_genes_animal_inheritance_settings_detailed_debug_key>
<rjw_genes_animal_inheritance_settings_detailed_debug_explanation></rjw_genes_animal_inheritance_settings_detailed_debug_explanation>
</LanguageData>

View file

@ -4,5 +4,6 @@
<StatsReport_NoChildren>Pawn doesn't have any children.</StatsReport_NoChildren> <StatsReport_NoChildren>Pawn doesn't have any children.</StatsReport_NoChildren>
<StatsReport_ManyChildren>Pawn has a decent amount of children.</StatsReport_ManyChildren> <StatsReport_ManyChildren>Pawn has a decent amount of children.</StatsReport_ManyChildren>
<StatsReport_VeryManyChildren>Pawn has a lot of children.</StatsReport_VeryManyChildren> <StatsReport_VeryManyChildren>Pawn has a lot of children.</StatsReport_VeryManyChildren>
<RJW_Genes_GenitalsNotAlterable>Unable to geneticaly adapt or alter {PAWN_nameDef}'s genitals.</RJW_Genes_GenitalsNotAlterable>
</LanguageData> </LanguageData>

View file

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<defName>rjw_genes_animal_control_hediff</defName>
<label>part human</label>
<description>This creature is more controlable with a natural human part.</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.9, 1.0, 0.35)</defaultLabelColor>
<initialSeverity>1</initialSeverity>
<comps>
<li Class="VEF.AnimalBehaviours.HediffCompProperties_Draftable">
<makeNonFleeingToo>true</makeNonFleeingToo>
</li>
</comps>
<isBad>false</isBad>
</HediffDef>
</Defs>

View file

@ -1,654 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<RJW_BGS.RaceGeneDef>
<defName>GR_Manbear_GenGroup</defName>
<raceNames>
<li>GR_Manbear</li>
<li>GR_Bearman</li>
</raceNames>
<genes>
<li>
<defName>Immunity_Strong</defName>
<chance>0.8</chance>
</li>
<li>
<defName>MinTemp_LargeDecrease</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Aggression_Aggressive</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Sleepy</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Beard_Always</defName>
<chance>0.8</chance>
</li>
<li>
<defName>VoiceRoar</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Body_Fat</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Body_Hulk</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Hair_ReddishBrown</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Hair_DarkBrown</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Hair_DarkSaturatedReddish</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Hair_DarkReddish</defName>
<chance>0.8</chance>
</li>
<li>
<defName>RobustDigestion</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Furskin</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Unstoppable</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeTerrible_Artistic</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeTerrible_Social</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudePoor_Intellectual</defName>
<chance>0.8</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>GR_Manalope_GenGroup</defName>
<raceNames>
<li>GR_Manalope</li>
<li>GR_Booman</li>
</raceNames>
<genes>
<li>
<defName>FireSpew</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Beauty_Ugly</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Hair_Blonde</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Hair_SandyBlonde</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Hair_LightOrange</defName>
<chance>0.8</chance>
</li>
<li>
<defName>rjw_genes_udder</defName>
<chance>0.8</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>GR_Manchicken_GenGroup</defName>
<raceNames>
<li>GR_Manchicken</li>
<li>GR_Turkeyman</li>
</raceNames>
<genes>
<li>
<defName>Mood_Optimist</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Delicate</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Beauty_Pretty</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Body_Thin</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeTerrible_Melee</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeTerrible_Mining</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeRemarkable_Social</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeStrong_Intellectual</defName>
<chance>0.8</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>GR_Manffalo_GenGroup</defName>
<raceNames>
<li>GR_Manffalo</li>
<li>GR_Muffaloman</li>
</raceNames>
<genes>
<li>
<defName>Headbone_Human</defName>
<chance>0.9</chance>
</li>
<li>
<defName>Headbone_MiniHorns</defName>
<chance>0.9</chance>
</li>
<li>
<defName>Furskin</defName>
<chance>0.9</chance>
</li>
<li>
<defName>MinTemp_SmallIncrease</defName>
<chance>0.9</chance>
</li>
<li>
<defName>rjw_genes_big_male_genitalia</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_genes_loose_female_genitalia</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_genes_big_breasts</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_genes_udder</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_genes_Needle_genitalia</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_mc_genes_perm_lactating</defName>
<chance>0.05</chance>
</li>
<li>
<defName>rjw_genes_zoophile</defName>
<chance>0.5</chance>
</li>
<li>
<defName>AptitudeTerrible_Intellectual</defName>
<chance>0.05</chance>
</li>
<li>
<defName>AptitudePoor_Intellectual</defName>
<chance>0.7</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>GR_Manwolf_GenGroup</defName>
<raceNames>
<li>GR_Manwolf</li>
<li>GR_Dogman</li>
</raceNames>
<genes>
<li>
<defName>AptitudeTerrible_Mining</defName>
<chance>0.05</chance>
</li>
<li>
<defName>PsychicBonding</defName>
<chance>0.05</chance>
</li>
<li>
<defName>Mood_Sanguine</defName>
<chance>0.05</chance>
</li>
<li>
<defName>Ears_Floppy</defName>
<chance>0.9</chance>
</li>
<li>
<defName>rjw_genes_canine_genitalia</defName>
<chance>0.9</chance>
</li>
<li>
<defName>Furskin</defName>
<chance>0.9</chance>
</li>
<li>
<defName>MinTemp_SmallIncrease</defName>
<chance>0.9</chance>
</li>
<li>
<defName>Libido_High</defName>
<chance>0.9</chance>
</li>
<li>
<defName>AptitudePoor_Mining</defName>
<chance>0.5</chance>
</li>
<li>
<defName>rjw_genes_zoophile</defName>
<chance>0.5</chance>
</li>
<li>
<defName>Mood_Optimist</defName>
<chance>0.5</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>GR_Mancat_GenGroup</defName>
<raceNames>
<li>GR_Mancat</li>
<li>GR_Catman</li>
</raceNames>
<genes>
<li>
<defName>PsychicBonding</defName>
<chance>0.05</chance>
</li>
<li>
<defName>AptitudeTerrible_Animals</defName>
<chance>0.05</chance>
</li>
<li>
<defName>Ears_Cat</defName>
<chance>0.9</chance>
</li>
<li>
<defName>Body_Thin</defName>
<chance>0.9</chance>
</li>
<li>
<defName>rjw_genes_feline_genitalia</defName>
<chance>0.9</chance>
</li>
<li>
<defName>Furskin</defName>
<chance>0.9</chance>
</li>
<li>
<defName>MinTemp_SmallIncrease</defName>
<chance>0.9</chance>
</li>
<li>
<defName>rjw_genes_small_male_genitalia</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_genes_tight_female_genitalia</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_genes_small_breasts</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_genes_tight_anus</defName>
<chance>0.7</chance>
</li>
<li>
<defName>DarkVision</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudePoor_Animals</defName>
<chance>0.5</chance>
</li>
<li>
<defName>Beauty_Pretty</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_genes_zoophile</defName>
<chance>0.5</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>GR_Mansquirrel_GenGroup</defName>
<raceNames>
<li>GR_Mansquirrel</li>
<li>GR_Moleman</li>
</raceNames>
<genes>
<li>
<defName>MoveSpeed_VeryQuick</defName>
<chance>0.8</chance>
</li>
<li>
<defName>KindInstinct</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Delicate</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Ears_Cat</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Body_Thin</defName>
<chance>0.8</chance>
</li>
<li>
<defName>Tail_Furry</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeTerrible_Shooting</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeTerrible_Melee</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeTerrible_Mining</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeTerrible_Animals</defName>
<chance>0.8</chance>
</li>
<li>
<defName>AptitudeStrong_Intellectual</defName>
<chance>0.8</chance>
</li>
<li>
<defName>rjw_genes_Needle_genitalia</defName>
<chance>0.8</chance>
</li>
<li>
<defName>rjw_genes_zoophile</defName>
<chance>0.8</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>GR_Thrumboman_GenGroup</defName>
<raceNames>
<li>GR_Thrumboman</li>
</raceNames>
<genes>
<li>
<defName>Unstoppable</defName>
<chance>0.25</chance>
</li>
<li>
<defName>Headbone_CenterHorn</defName>
<chance>0.9</chance>
</li>
<li>
<defName>VoiceRoar</defName>
<chance>0.6</chance>
</li>
<li>
<defName>MaxTemp_SmallIncrease</defName>
<chance>0.7</chance>
</li>
<li>
<defName>MaxTemp_LargeIncrease</defName>
<chance>0.1</chance>
</li>
<li>
<defName>rjw_genes_dragon_genitalia</defName>
<chance>0.6</chance>
</li>
<li>
<defName>FireResistant</defName>
<chance>0.15</chance>
</li>
<li>
<defName>rjw_genes_much_fluid</defName>
<chance>0.3</chance>
</li>
<li>
<defName>rjw_genes_very_much_fluid</defName>
<chance>0.05</chance>
</li>
<li>
<defName>Body_Hulk</defName>
<chance>0.7</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>GR_Hurseman_GenGroup</defName>
<raceNames>
<li>GR_Hurseman</li>
</raceNames>
<genes>
<li>
<defName>Body_Standard</defName>
<chance>0.9</chance>
</li>
<li>
<defName>Body_Hulk</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_genes_equine_genitalia</defName>
<chance>0.9</chance>
</li>
<li>
<defName>rjw_genes_zoophile</defName>
<chance>0.5</chance>
</li>
<li>
<defName>rjw_genes_much_fluid</defName>
<chance>0.5</chance>
</li>
<li>
<defName>MoveSpeed_Quick</defName>
<chance>0.5</chance>
</li>
<li>
<defName>AptitudeTerrible_Mining</defName>
<chance>0.5</chance>
</li>
<li>
<defName>AptitudeTerrible_Intellectual</defName>
<chance>0.5</chance>
</li>
<li>
<defName>Furskin</defName>
<chance>0.9</chance>
</li>
<li>
<defName>MinTemp_SmallIncrease</defName>
<chance>0.9</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>GR_Manscarab_GenGroup</defName>
<raceNames>
<li>GR_Manscarab</li>
</raceNames>
<genes>
<li>
<defName>Beauty_Ugly</defName>
<chance>0.5</chance>
</li>
<li>
<defName>Immunity_Strong</defName>
<chance>0.6</chance>
</li>
<li>
<defName>ToxicEnvironmentResistance_Partial</defName>
<chance>0.4</chance>
</li>
<li>
<defName>rjw_genes_ovipositor_genitalia</defName>
<chance>0.15</chance>
</li>
<li>
<defName>rjw_genes_insectincubator</defName>
<chance>0.1</chance>
</li>
<li>
<defName>rjw_genes_insectbreeder</defName>
<chance>0.1</chance>
</li>
<li>
<defName>Body_Thin</defName>
<chance>0.3</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
<RJW_BGS.RaceGeneDef>
<defName>GR_Lizardman_GenGroup</defName>
<raceNames>
<li>GR_Lizardman</li>
</raceNames>
<genes>
<li>
<defName>AcidSpray</defName>
<chance>0.7</chance>
</li>
<li>
<defName>MinTemp_SmallIncrease</defName>
<chance>0.7</chance>
</li>
<li>
<defName>MaxTemp_SmallIncrease</defName>
<chance>0.7</chance>
</li>
<li>
<defName>Robust</defName>
<chance>0.7</chance>
</li>
<li>
<defName>Hair_BaldOnly</defName>
<chance>0.7</chance>
</li>
<li>
<defName>Beard_NoBeardOnly</defName>
<chance>0.7</chance>
</li>
<li>
<defName>Body_Standard</defName>
<chance>0.7</chance>
</li>
<li>
<defName>Headbone_CenterHorn</defName>
<chance>0.7</chance>
</li>
<li>
<defName>AptitudeTerrible_Artistic</defName>
<chance>0.7</chance>
</li>
<li>
<defName>AptitudeTerrible_Social</defName>
<chance>0.7</chance>
</li>
<li>
<defName>rjw_genes_reptilian_genitalia</defName>
<chance>0.7</chance>
</li>
</genes>
</RJW_BGS.RaceGeneDef>
</Defs>

View file

@ -1,164 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Bear_Group</defName>
<!-- Other Pawn is always assumed to be human -->
<SupportedParentKindDefs>
<li>Bear_Grizzly</li>
<li>Bear_Polar</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Manbear</li>
<li>GR_Bearman</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Boomalope_Group</defName>
<SupportedParentKindDefs>
<li>Boomalope</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Manalope</li>
<li>GR_Booman</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Poultry_Group</defName>
<SupportedParentKindDefs>
<li>Chicken</li>
<li>Cassowary</li>
<li>Emu</li>
<li>Ostrich</li>
<li>Goose</li>
<li>Turkey</li>
<li>Duck</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Manchicken</li>
<li>GR_Turkeyman</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Bovine_Group</defName>
<SupportedParentKindDefs>
<li>Muffalo</li>
<li>Cow</li>
<li>Bison</li>
<li>Yak</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Manffalo</li>
<li>GR_Muffaloman</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Canine_Group</defName>
<SupportedParentKindDefs>
<li>Warg</li>
<li>Wolf_Timber</li>
<li>Wolf_Arctic</li>
<li>Fox_Fennec</li>
<li>Fox_Red</li>
<li>Fox_Arctic</li>
<li>Husky</li>
<li>LabradorRetriever</li>
<li>YorkshireTerrier</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Manwolf</li>
<li>GR_Dogman</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Feline_Group</defName>
<SupportedParentKindDefs>
<li>Cougar</li>
<li>Panther</li>
<li>Lynx</li>
<li>Cat</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Mancat</li>
<li>GR_Catman</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Rabbit_Group</defName>
<SupportedParentKindDefs>
<li>GuineaPig</li>
<li>Hare</li>
<li>Snowhare</li>
<li>Squirrel</li>
<li>Rat</li>
<li>Raccoon</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Mansquirrel</li>
<li>GR_Moleman</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Thrumbo_Group</defName>
<SupportedParentKindDefs>
<li>Thrumbo</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Thrumboman</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Equine_Group</defName>
<SupportedParentKindDefs>
<li>Dromedary</li>
<li>Elk</li>
<li>Horse</li>
<li>Caribou</li>
<li>Donkey</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Hurseman</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Insect_Group</defName>
<SupportedParentKindDefs>
<li>Megascarab</li>
<li>Spelopede</li>
<li>Megaspider</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Manscarab</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
<RJW_Genes.VGEHybridOffspringDefs>
<defName>Reptile_Group</defName>
<SupportedParentKindDefs>
<li>Iguana</li>
<li>Cobra</li>
<li>Tortoise</li>
</SupportedParentKindDefs>
<PossibleHybridChildKindDefs>
<li>GR_Lizardman</li>
</PossibleHybridChildKindDefs>
</RJW_Genes.VGEHybridOffspringDefs>
</Defs>

View file

@ -9,16 +9,9 @@
<li Class="PatchOperationAdd"> <li Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="VU_Returned" or defName="VU_Ghoul" or defName="VU_Frankenstein"]/genes</xpath> <xpath>Defs/XenotypeDef[defName="VU_Returned" or defName="VU_Ghoul" or defName="VU_Frankenstein"]/genes</xpath>
<value> <value>
<li>rjw_genes_Necro_genitalia</li>
<li>rjw_genes_no_sex_need</li> <li>rjw_genes_no_sex_need</li>
</value> </value>
</li> </li>
<li Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="VU_Revenant"]/genes</xpath>
<value>
<li>rjw_genes_Necro_genitalia</li>
</value>
</li>
<li Class="PatchOperationAdd"> <li Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="VU_Lycantrope"]/genes</xpath> <!-- sic --> <xpath>Defs/XenotypeDef[defName="VU_Lycantrope"]/genes</xpath> <!-- sic -->
<value> <value>

View file

@ -1,8 +0,0 @@
namespace RJW_BGS
{
public class BestialityGeneInheritanceDef
{
public string defName;
public float chance = 1f;
}
}

View file

@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using rjw;
namespace RJW_BGS
{
public class RaceGeneDef : Def
{
public int priority;
public string raceGroup; //keeping this for backwards compatibility
public List<string> raceGroups; //racegroup, but in list form so multiple can be entered, preference to use this over racegroup
public List<string> raceNames;
public List<string> pawnKindNames;
public List<BestialityGeneInheritanceDef> genes;
public string hybridName;
}
}

View file

@ -1,147 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using rjw;
using Verse;
namespace RJW_BGS
{
public class RaceGeneDef_Helper
{
//code based on racegroupdefinternal which has a similar function
public static RaceGeneDef GetRaceGeneDefInternal(Pawn pawn)
{
List<RaceGeneDef> Valids = ValidRaceGeneDefs(pawn);
if (Valids.Count > 0)
{
RaceGeneDef result = Valids.MaxBy(r => r.priority);
return result;
}
return null;
}
public static List<RaceGeneDef> ValidRaceGeneDefs(Pawn pawn)
{
PawnKindDef kindDef = pawn.kindDef;
if (kindDef == null)
{
RJW_Genes.ModLog.Warning($"Error looking up PawnKindDef for {pawn.Name} - Could not lookup Animal Inheritance Genes");
return null;
}
string raceName = kindDef.race.defName;
string pawnKindName = kindDef.defName;
//Wild animals have no name, so we will use pawnkindname instead
string pawnName = pawn.Name != null ? pawn.Name.ToStringFull : pawnKindName;
RaceGroupDef raceGroupDef = GetRaceGroupDef(kindDef);
RJW_Genes.ModLog.Debug($"Looking up Animal-Inheritable Genes for {pawnName} with KindDef {kindDef.defName},RaceName {raceName}, PawnKind {pawnKindName} and RaceGroup {raceGroupDef.defName}");
IEnumerable<RaceGeneDef> allDefs = DefDatabase<RaceGeneDef>.AllDefs;
List<RaceGeneDef> pawnKindDefs = allDefs.Where(delegate (RaceGeneDef group)
{
List<string> pawnKindNames = group.pawnKindNames;
return pawnKindNames != null && pawnKindNames.Contains(pawnKindName);
}).ToList<RaceGeneDef>();
if (pawnKindDefs.Count() > 0)
{
DebugPrintRaceGeneDefs("PawnKindDefs", pawnName,pawnKindDefs);
return pawnKindDefs;
}
RJW_Genes.ModLog.Debug($"Did not find PawnKindDefs for {pawnName}");
List<RaceGeneDef> raceKindDefs = allDefs.Where(delegate (RaceGeneDef group)
{
List<string> raceNames = group.raceNames;
return raceNames != null && raceNames.Contains(raceName);
}).ToList<RaceGeneDef>();
if (raceKindDefs.Count() > 0)
{
DebugPrintRaceGeneDefs("PawnKindDefs", pawnName, raceKindDefs);
return raceKindDefs;
}
RJW_Genes.ModLog.Debug($"Did not find RaceKindDefs for {pawnName}");
List<RaceGeneDef> raceGroupDefs = new List<RaceGeneDef>();
if (raceGroupDef != null)
{
raceGroupDefs = allDefs.Where(delegate (RaceGeneDef group)
{
string raceGroupDefName = group.raceGroup;
List<string> list_raceGroupDefName = group.raceGroups;
return (raceGroupDefName != null && raceGroupDefName == raceGroupDef.defName)
|| (list_raceGroupDefName != null && list_raceGroupDefName.Contains(raceGroupDef.defName));
}).ToList<RaceGeneDef>();
}
if (raceGroupDefs.Count() > 0)
{
DebugPrintRaceGeneDefs("RaceKindDefs", pawnName, raceGroupDefs);
return raceGroupDefs;
}
RJW_Genes.ModLog.Debug($"Did not find RaceGroupDefs for {pawnName}");
RJW_Genes.ModLog.Message($"Did not find any Genes inheritable for {pawnName}");
return new List<RaceGeneDef>();
}
private static void DebugPrintRaceGeneDefs(String header,String identifier,List<RaceGeneDef> defs)
{
if (RJW_Genes.RJW_Genes_Settings.rjw_genes_detailed_debug)
{
var defString = "[";
foreach (RaceGeneDef raceGeneDef in defs)
defString += $"({raceGeneDef.priority}:{raceGeneDef.defName} - {raceGeneDef.genes.Count} Genes)";
defString += "]";
RJW_Genes.ModLog.Message($"Found the following {header}-Genes for {identifier}: {defString}");
}
}
/// <summary>
/// These two Functions are Duplicates of private functions in RJW RaceGroupDef_Helper, used to get a racegroupdef from a kindDef.
/// If the RaceGroupDef_Helper class is made accessable directly, these functions can be removed.
/// </summary>
/// <param name="kindDef"></param>
/// <returns></returns>
private static RaceGroupDef GetRaceGroupDef(PawnKindDef kindDef)
{
var raceName = kindDef.race.defName;
var pawnKindName = kindDef.defName;
var groups = DefDatabase<RaceGroupDef>.AllDefs;
var kindMatches = groups.Where(group => group.pawnKindNames?.Contains(pawnKindName) ?? false).ToList();
var raceMatches = groups.Where(group => group.raceNames?.Contains(raceName) ?? false).ToList();
var count = kindMatches.Count() + raceMatches.Count();
if (count == 0)
{
//ModLog.Message($"Pawn named '{pawn.Name}' matched no RaceGroupDef. If you want to create a matching RaceGroupDef you can use the raceName '{raceName}' or the pawnKindName '{pawnKindName}'.");
return null;
}
else if (count == 1)
{
// ModLog.Message($"Pawn named '{pawn.Name}' matched 1 RaceGroupDef.");
return kindMatches.Concat(raceMatches).Single();
}
else
{
// ModLog.Message($"Pawn named '{pawn.Name}' matched {count} RaceGroupDefs.");
// If there are multiple RaceGroupDef matches, choose one of them.
// First prefer defs NOT defined in rjw.
// Then prefer a match by kind over a match by race.
return kindMatches.FirstOrDefault(match => !IsThisMod(match))
?? raceMatches.FirstOrDefault(match => !IsThisMod(match))
?? kindMatches.FirstOrDefault()
?? raceMatches.FirstOrDefault();
}
}
private static bool IsThisMod(Def def)
{
var rjwContent = LoadedModManager.RunningMods.Single(pack => pack.Name == "RimJobWorld");
return rjwContent.AllDefs.Contains(def);
}
}
}

View file

@ -1,14 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RJW_Genes
{
public class VGEHybridOffspringDefs : Verse.Def
{
public List<Verse.PawnKindDef> SupportedParentKindDefs;
public List<Verse.PawnKindDef> PossibleHybridChildKindDefs;
}
}

View file

@ -1,167 +0,0 @@
using System.Collections.Generic;
using Verse;
using RimWorld;
using rjw;
using RJW_Genes;
using System.Linq;
namespace RJW_BGS
{
public class InheritanceUtility
{
public static List<GeneDef> AnimalInheritedGenes(Pawn father, Pawn mother)
{
List<GeneDef> genelist = new List<GeneDef>();
//If Both are Humans, or Both are animals, do nothing & return empty GeneList
if (!mother.RaceProps.Humanlike && !father.RaceProps.Humanlike)
return genelist;
if (mother.RaceProps.Humanlike && father.RaceProps.Humanlike)
return genelist;
RJW_Genes.ModLog.Message($"Trigger an Animal-Gene-Inheritance for {father.Name} and {mother.Name}");
//One parent must be an animal and the other must be human, so only one needs to return
if (father != null && !father.RaceProps.Humanlike)
{
RJW_Genes.ModLog.Debug($"Father was found to be animal - looking up genes for {father.Name}");
return SelectGenes(father);
}
if (mother != null && !mother.RaceProps.Humanlike)
{
RJW_Genes.ModLog.Debug($"Mother was found to be animal - looking up genes for {mother.Name}");
return SelectGenes(mother);
}
return genelist;
}
/// <summary>
/// Looks up potential genes for an animal,
/// checks their chance and returns all 'triggered' genes.
/// </summary>
/// <param name="pawn">The animal for which to look up genes (Animals are Pawns in RW)</param>
/// <returns>The genes that will be inherited from this animal.</returns>
public static List<GeneDef> SelectGenes(Pawn pawn)
{
List<GeneDef> genelist = new List<GeneDef>();
RaceGeneDef raceGeneDef = RaceGeneDef_Helper.GetRaceGeneDefInternal(pawn);
if (raceGeneDef != null)
{
foreach (BestialityGeneInheritanceDef gene in raceGeneDef.genes)
{
if (gene.chance * RJW_BGSSettings.rjw_bgs_global_gene_chance >= Rand.Range(0.01f,1f))
{
GeneDef tmpGene = DefDatabase<GeneDef>.GetNamed(gene.defName, false);
if (tmpGene != null)
{
genelist.Add(tmpGene);
}
else
{
RJW_Genes.ModLog.Warning($"Unable to find gene {gene.defName}, skipping. May need to update {raceGeneDef.defName} definition.");
}
}
}
}
RJW_Genes.ModLog.Debug($"From {raceGeneDef.genes.Count} possible genes in {raceGeneDef.defName}, {genelist.Count} were added by chance ({RJW_BGSSettings.rjw_bgs_global_gene_chance} chance multiplier from Settings).");
return genelist;
}
/// <summary>
/// Adds a list of Genes to the pawns existing GeneSet.
/// Whether it is added as a Xenogene or Endogene is configured in Mod-Settings.
/// </summary>
/// <param name="pawn">The pawn for which Genes will be added</param>
/// <param name="genes">The Genes to add (Endogene by default, Xenogene with Mod Settings)</param>
public static void AddGenes(Pawn pawn, List<GeneDef> genes)
{
foreach (GeneDef gene in genes)
{
pawn.genes.AddGene(gene, RJW_BGSSettings.rjw_bgs_animal_genes_as_xenogenes);
}
}
/// <summary>
/// Initiates a bestiality baby with genes if the baby does not exist earlier.
/// This is used to make rjw-egg-pregnancies work.
/// Related file: PatchRJWHediffInsect_Egg.cs
/// </summary>
/// <param name="mother">The mother of the baby.</param>
/// <param name="dad">The father of the baby.</param>
/// <param name="baby">The baby created in non-pregnancy-way (has 0 Genes yet)</param>
public static void NewGenes(Pawn mother, Pawn dad, Pawn baby)
{
if (!RJW_BGSSettings.rjw_bgs_enabled)
{
return;
}
RJW_Genes.ModLog.Message($"Triggering an New-Gene Animal-Gene-Inheritance for {baby.Name} ({dad.Name} + {mother.Name})");
if (baby.RaceProps.Humanlike)
{
if (baby.genes == null)
{
baby.genes = new Pawn_GeneTracker(baby);
}
//Remove the hair and skin genes pawns always start with, should get correct ones from human parent anyway.
for (int i = baby.genes.Endogenes.Count - 1; i >= 0; i--)
{
baby.genes.RemoveGene(baby.genes.Endogenes[i]);
}
List<GeneDef> genes = PregnancyUtility.GetInheritedGenes(dad, mother);
List<GeneDef> beastgenes = InheritanceUtility.AnimalInheritedGenes(dad, mother);
InheritanceUtility.AddGenes(baby, beastgenes);
InheritanceUtility.AddGenes(baby, genes);
if(baby.genes.GetFirstEndogeneByCategory(EndogeneCategory.Melanin) == null)
{
AddSkinColor(mother, dad, baby);
}
}
}
public static void AddSkinColor(Pawn mother, Pawn father, Pawn baby)
{
if (mother != null && mother.genes != null)
{
GeneDef gene = mother.genes.GetFirstEndogeneByCategory(EndogeneCategory.Melanin);
if (gene != null)
{
baby.genes.AddGene(gene, false);
}
}
else if (father != null && father.genes != null)
{
GeneDef gene = father.genes.GetFirstEndogeneByCategory(EndogeneCategory.Melanin);
if (gene != null)
{
baby.genes.AddGene(gene, false);
}
}
else
{
Log.Message("Could not find skincolor of " + baby.Name + "'s parents, giving random skincolor.");
baby.genes.AddGene(PawnSkinColors.RandomSkinColorGene(baby), false);
}
}
/// <summary>
/// Used only for debugging, to see what you loaded and how it looks.
/// </summary>
private static void LogAllFoundRaceGroupGenes()
{
foreach (RaceGroupDef def in DefDatabase<RaceGroupDef>.AllDefs)
{
Log.Message("defName = " + def.defName);
if (def.raceNames != null)
{
foreach (string race in def.raceNames)
{
Log.Message(race);
}
}
}
}
}
}

View file

@ -1,44 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using UnityEngine;
using HarmonyLib;
using rjw;
namespace RJW_BGS
{
[HarmonyPatch(typeof(Hediff_BasePregnancy))]
public class Patch_RJW_BasePregnancy_VanillaExpandedGenetics
{
public static HediffDef controler = DefDatabase<HediffDef>.GetNamed("rjw_genes_animal_control_hediff", false);
/// <summary>
/// This Patch (only) adds the "rjw_genes_animal_control_hediff" to newborn VE hybrid-animals.
/// </summary>
/// <param name="__instance"></param>
[HarmonyPostfix]
[HarmonyPatch("GenerateBabies")]
public static void AddHediff (Hediff_BasePregnancy __instance)
{
if (controler == null) return;
if (!RJW_BGSSettings.rjw_bgs_VE_genetics)
{
return;
}
foreach (Pawn baby in __instance.babies)
{
if(baby != null && VGEHybridUtility.SupportedHybridRaces.Contains(baby.kindDef))
baby.health.AddHediff(controler);
}
}
}
}

View file

@ -1,52 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using HarmonyLib;
using RimWorld;
using Verse;
using rjw;
namespace RJW_BGS
{
[HarmonyPatch(typeof(Hediff_BasePregnancy), "Initialize")]
public static class Patch_RJW_BestialityPregnancyUtility
{
[HarmonyPostfix]
public static void AddGenes(Pawn mother, Pawn dad, ref Hediff_BasePregnancy __instance)
{
if (!RJW_BGSSettings.rjw_bgs_enabled || (!mother.IsAnimal && !dad.IsAnimal))
{
return;
}
foreach (Pawn baby in __instance.babies)
{
if (baby.RaceProps.Humanlike)
{
if (baby.genes == null)
{
baby.genes = new Pawn_GeneTracker(baby);
}
//Remove the hair and skin genes pawns always start with, should get correct ones from human parent anyway.
for (int i = baby.genes.Endogenes.Count - 1; i >= 0; i--)
{
baby.genes.RemoveGene(baby.genes.Endogenes[i]);
}
List<GeneDef> humangenes = PregnancyUtility.GetInheritedGenes(dad, mother);
List<GeneDef> beastgenes = InheritanceUtility.AnimalInheritedGenes(dad, mother);
InheritanceUtility.AddGenes(baby, beastgenes);
InheritanceUtility.AddGenes(baby, humangenes);
// The mix-breed babies should be labelled hybrids
baby.genes.hybrid = true;
//reason = "AbilityDisabledNoFertilinGene".Translate(this.parent.pawn);
baby.genes.xenotypeName = "rjw_genes_bestiality_hybrid_name".Translate();
RJW_Genes.ModLog.Debug($"Conception of a Bestiality-Child - Added {humangenes.Count} human-genes and {beastgenes.Count} animal-genes.");
}
}
}
}
}

View file

@ -1,35 +0,0 @@
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;
using HarmonyLib;
using rjw;
namespace RJW_BGS
{
[HarmonyPatch(typeof(Hediff_InsectEgg), "GiveBirth")]
public static class Patch_RJW_HediffInsect_Egg
{
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
MethodInfo newgenes = AccessTools.Method(typeof(InheritanceUtility), "NewGenes", null, null);
FieldInfo implanter = AccessTools.Field(typeof(Hediff_InsectEgg), "implanter");
FieldInfo father = AccessTools.Field(typeof(Hediff_InsectEgg), "father");
foreach (CodeInstruction instruction in instructions)
{
yield return instruction;
if (instruction.opcode == OpCodes.Call && instruction.operand.ToString() == "Void BabyPostBirth(Verse.Pawn, Verse.Pawn, Verse.Pawn)")
{
yield return new CodeInstruction(OpCodes.Ldloc_0, null);
yield return new CodeInstruction(OpCodes.Ldfld, implanter);
yield return new CodeInstruction(OpCodes.Ldarg_0, null);
yield return new CodeInstruction(OpCodes.Ldfld, father);
yield return new CodeInstruction(OpCodes.Ldloc_1, null);
yield return new CodeInstruction(OpCodes.Call, newgenes);
}
}
}
}
}

View file

@ -1,110 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using RJW_BGS;
using HarmonyLib;
using rjw;
using static rjw.Hediff_BasePregnancy;
using RJW_Genes;
namespace RJW_BGS
{
[HarmonyPatch(typeof(PregnancyHelper))]
public class Patch_RJW_PregnancyHelper_VanillaExpandedGenetics
{
/// <summary>
/// This Patch changes the pregnancy logic to check for possible hybridization.
/// Iff the hybridization applies, this prefix skips the normal AddPregnancyHediff (by returning false).
///
/// Small Note: Below we use `Hediff_BasePregnancy.Create<Hediff_BestialPregnancy>(mother, father, DnaGivingParent.Mother);`
/// This completely creates the pregnancy, it does not need to be assigned to anything or added to some hediffs.
///
/// There was an issue with Pawn Generation and this has been Reworked - Please see #116 for more documentation.
/// The current state of affairs is that hybrids are generated using RJW-Pregnancy and "switching" the Fathers KindDef only for Child Generation, before switching it back.
/// It's not easy to just change the Babies kindDef, because RJW-Preg runs a PawnGeneration Request.
/// Thus, if you just change that from Husky to Dogman, most of the things are still Husky and you get a lot of red errors after birth.
///
/// Relevant RJW Files:
///
/// - Hediff_BestialPregnancy https://gitgud.io/Ed86/rjw/-/blob/master/1.5/Source/Modules/Pregnancy/Hediffs/Hediff_BestialPregnancy.cs?ref_type=heads
/// - Hediff_BasePregnancy https://gitgud.io/Ed86/rjw/-/blob/master/1.5/Source/Modules/Pregnancy/Hediffs/Hediff_BasePregnancy.cs?ref_type=heads
/// </summary>
[HarmonyPrefix]
[HarmonyPatch("AddPregnancyHediff")]
public static bool AddPregnancyHediffPrefix(Pawn mother, Pawn father)
{
// Error & Setting HandlingHandling, "true" means the normal method is run (and nothing else from this patch).
// Behaviour of Harmony Prefixes: https://harmony.pardeike.net/articles/patching-prefix.html
if (!RJW_BGSSettings.rjw_bgs_VE_genetics) return true;
if (mother == null || father == null) return true;
RJW_Genes.ModLog.Debug("Trying to add RJW Pregnancy Hediff - Checking for potential VGE Animal-Hybridization");
bool humanMotherAndSupportedAnimal = xxx.is_human(mother) && VGEHybridUtility.SupportedInitialAnimalRaces.Contains(father.kindDef);
bool humanMotherAndSupportedHybrid = xxx.is_human(mother) && VGEHybridUtility.SupportedHybridRaces.Contains(father.kindDef);
bool humanFatherAndSupportedAnimal = xxx.is_human(father) && VGEHybridUtility.SupportedInitialAnimalRaces.Contains(mother.kindDef);
bool humanFatherAndSupportedHybrid = xxx.is_human(father) && VGEHybridUtility.SupportedHybridRaces.Contains(mother.kindDef);
// Exit if there are no supported parents / nothing to do for my logic
if (!(humanMotherAndSupportedAnimal || humanMotherAndSupportedHybrid || humanFatherAndSupportedAnimal || humanFatherAndSupportedHybrid))
{
RJW_Genes.ModLog.Debug("Aborting VGE-Hybdrization Pregnancy - Parents were unsupported RaceKinds");
return true;
}
// Exit by chance
if((new Random()).NextDouble() > RJW_BGSSettings.rjw_bgs_ve_genetics_chance)
{
RJW_Genes.ModLog.Debug($"VGE-Hybridization chance ({Math.Round(RJW_BGSSettings.rjw_bgs_ve_genetics_chance,3)*100}%) was not met - continuing with normal pregnancy behaviour.");
return true;
}
if (humanMotherAndSupportedAnimal)
{
RJW_Genes.ModLog.Debug("Found a human mother and a supported animal resulting in an animal-child - starting VGE pregnancy (rjw.Hediff_BestialPregnancy)");
Hediff_BasePregnancy.Create<Hediff_BestialPregnancy>(mother, father, DnaGivingParent.Father);
var kindDef = VGEHybridUtility.LookupPossiblyOffspringHybrid(father.kindDef);
var stored = father.kindDef;
father.kindDef = kindDef;
Hediff_BasePregnancy preg = Hediff_BasePregnancy.Create<Hediff_BestialPregnancy>(mother, father, DnaGivingParent.Father);
father.kindDef = stored;
// "false" means the normal method is not run
return false;
}
else if (humanMotherAndSupportedHybrid)
{
RJW_Genes.ModLog.Debug("Found a human mother and a hybrid - this behaviour has been disabled from 2.2.1 onward - sorry :(");
return true;
}
else if (humanFatherAndSupportedAnimal)
{
RJW_Genes.ModLog.Debug("Found a human father and a supported animal resulting in an animal-child - starting VGE pregnancy (rjw.Hediff_BestialPregnancy)");
var kindDef = VGEHybridUtility.LookupPossiblyOffspringHybrid(mother.kindDef);
var stored = mother.kindDef;
mother.kindDef = kindDef;
Hediff_BasePregnancy preg = Hediff_BasePregnancy.Create<Hediff_BestialPregnancy>(mother, father, DnaGivingParent.Mother);
mother.kindDef = stored;
return false;
}
else if (humanFatherAndSupportedHybrid)
{
RJW_Genes.ModLog.Debug("Found a human father and a hybrid - this behaviour has been disabled from 2.2.1 onward - sorry :(");
return true;
}
RJW_Genes.ModLog.Debug("Issues in applying the Patch for VGE hybdritization - doing nothing and continuing with normal pregnancy.");
return true;
}
}
}

View file

@ -1,45 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using HarmonyLib;
using RimWorld;
using Verse;
namespace RJW_BGS
{
/// <summary>
/// This Patch is applied to change the normal pregnancy to add animal-inheritance.
/// If the settings allow animal gene inheritance,
/// the genes are determined and "simply added".
/// </summary>
[HarmonyPatch(typeof(PregnancyUtility), "GetInheritedGeneSet", new Type[]
{
typeof(Pawn),
typeof(Pawn),
//typeof(bool)
}
)]
public static class Patch_Vanilla_PregnancyUtility
{
[HarmonyPostfix]
public static void AnimalInheritedGenes(Pawn father, Pawn mother, ref GeneSet __result)
{
if (!RJW_BGSSettings.rjw_bgs_enabled)
{
return;
}
List<GeneDef> genes = InheritanceUtility.AnimalInheritedGenes(father, mother);
if (genes.Any())
{
RJW_Genes.ModLog.Debug($"Adding {(genes.Count)} Genes from an Animal-Pregnancy between {father} and {mother}");
foreach (GeneDef gene in genes)
{
__result.AddGene(gene);
}
} else
{
RJW_Genes.ModLog.Debug($"Tried to add Genes from Animal-Pregnancy between {father} and {mother} but didn't find any");
}
}
}
}

View file

@ -1,58 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using UnityEngine;
namespace RJW_BGS
{
public class RJW_BGSSettings : ModSettings
{
public static void DoWindowContents(Rect inRect)
{
//Copied from RJW settings mostly
Rect outRect = new Rect(0f, 30f, inRect.width, inRect.height - 30f);
Rect rect = new Rect(0f, 0f, inRect.width - 16f, inRect.height + 300f);
//Widgets.BeginScrollView(outRect, ref RJWSettings.scrollPosition, rect, true);
Listing_Standard listing_Standard = new Listing_Standard();
listing_Standard.maxOneColumn = true;
listing_Standard.ColumnWidth = rect.width / 2.05f;
listing_Standard.Begin(rect);
listing_Standard.Gap(5f);
listing_Standard.Gap(24f);
listing_Standard.CheckboxLabeled("rjw_genes_animal_inheritance_settings_enabled_key".Translate(), ref rjw_bgs_enabled, "rjw_genes_animal_inheritance_settings_enabled_explanation".Translate(), 0f, 1f);
//listing_Standard.CheckboxLabeled("sexfrenzy", ref sexfrenzy, "disable the effects", 0f, 1f);
listing_Standard.Gap(5f);
//1.6 Fix added (TipSignal?)(TipSignal)
listing_Standard.Label("gene inheritance chance: " + Math.Round((double)(RJW_BGSSettings.rjw_bgs_global_gene_chance * 100f), 0).ToString() + "%", -1f, (TipSignal?)(TipSignal)"modify chance for a gene to be inherited.");
RJW_BGSSettings.rjw_bgs_global_gene_chance = listing_Standard.Slider(RJW_BGSSettings.rjw_bgs_global_gene_chance, 0f, 5f);
listing_Standard.Gap(5f);
listing_Standard.CheckboxLabeled("rjw_genes_animal_inheritance_settings_added_as_xenogene_key".Translate(), ref rjw_bgs_animal_genes_as_xenogenes, "rjw_genes_animal_inheritance_settings_added_as_xenogene_explanation".Translate(), 0f, 1f);
listing_Standard.Gap(5f);
listing_Standard.CheckboxLabeled("rjw_genes_animal_inheritance_settings_ve_genetics_hybridization_key".Translate(), ref rjw_bgs_VE_genetics, "rjw_genes_animal_inheritance_settings_ve_genetics_hybridization_explanation".Translate(), 0f, 1f);
listing_Standard.Gap(5f);
//1.6 Fix added (TipSignal?)(TipSignal)
listing_Standard.Label("VE Hybrid Chance: " + Math.Round((double)(RJW_BGSSettings.rjw_bgs_ve_genetics_chance * 100f), 0).ToString() + "%", -1f, (TipSignal?)(TipSignal)"modify chance for a bestiality child to be hybrid.");
RJW_BGSSettings.rjw_bgs_ve_genetics_chance = listing_Standard.Slider(RJW_BGSSettings.rjw_bgs_ve_genetics_chance, 0f, 1f);
}
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look<bool>(ref RJW_BGSSettings.rjw_bgs_enabled, "rjw_bgs_enabled", RJW_BGSSettings.rjw_bgs_enabled, true);
Scribe_Values.Look<float>(ref RJW_BGSSettings.rjw_bgs_global_gene_chance, "rjw_bgs_global_gene_chance", RJW_BGSSettings.rjw_bgs_global_gene_chance, true);
Scribe_Values.Look<bool>(ref RJW_BGSSettings.rjw_bgs_animal_genes_as_xenogenes, "rjw_bgs_animal_genes_as_xenogenes", RJW_BGSSettings.rjw_bgs_animal_genes_as_xenogenes, true);
Scribe_Values.Look<bool>(ref RJW_BGSSettings.rjw_bgs_VE_genetics, "rjw_bgs_VE_genetics", RJW_BGSSettings.rjw_bgs_VE_genetics, true);
Scribe_Values.Look<float>(ref RJW_BGSSettings.rjw_bgs_ve_genetics_chance, "rjw_bgs_ve_genetics_chance", RJW_BGSSettings.rjw_bgs_ve_genetics_chance, true);
}
public static float rjw_bgs_global_gene_chance = 1f;
public static bool rjw_bgs_enabled = true;
public static bool rjw_bgs_animal_genes_as_xenogenes = false;
public static bool rjw_bgs_VE_genetics = true;
public static float rjw_bgs_ve_genetics_chance = 0.25f;
}
}

View file

@ -1,27 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using UnityEngine;
namespace RJW_BGS
{
public class RJW_BGSSettingsController : Mod
{
public RJW_BGSSettingsController(ModContentPack content) : base(content)
{
base.GetSettings<RJW_BGSSettings>();
}
public override string SettingsCategory()
{
return "RJW Genes Animal Gene Inheritance";
}
public override void DoSettingsWindowContents(Rect inRect)
{
RJW_BGSSettings.DoWindowContents(inRect);
}
}
}

View file

@ -1,63 +0,0 @@
using RJW_Genes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_BGS
{
public class VGEHybridUtility
{
/// <summary>
/// All VGE-Hybrids that can result from Bestiality - these are drawn from the existing XML-Defs.
/// </summary>
public static List<PawnKindDef> SupportedHybridRaces {
get{return DefDatabase<VGEHybridOffspringDefs>.AllDefs.SelectMany(def => def.PossibleHybridChildKindDefs).Distinct().ToList();}
}
/// <summary>
/// All Animals that can produce VGE Hybrids - these are drawn from the existing XML-Defs.
/// </summary>
public static List<PawnKindDef> SupportedInitialAnimalRaces {
get { return DefDatabase<VGEHybridOffspringDefs>.AllDefs.SelectMany(def => def.SupportedParentKindDefs).Distinct().ToList(); }
}
/// <summary>
/// Returns a possible Hybrid KindDef for a given Animal.
/// Null if there is none.
/// Random one if there are multiple.
/// </summary>
/// <param name="Parent">The animal fathering the baby</param>
/// <returns>KindDef for Hybrid originated from Parent Animal. Null on None, Not-Supported or Error. Random one from multiple.</returns>
public static PawnKindDef LookupPossiblyOffspringHybrid(PawnKindDef Parent)
{
if (Parent == null) return null;
if (!SupportedInitialAnimalRaces.Contains(Parent)) return null;
else
{
return DefDatabase<VGEHybridOffspringDefs>.AllDefs
.Where(def => def.SupportedParentKindDefs.Contains(Parent))
.SelectMany(def => def.PossibleHybridChildKindDefs)
.Distinct()
.RandomElementWithFallback(null);
// Man I am a true Java Developer
}
}
/// <summary>
/// Small Method for debugging - I used it mostly on game-startup to see if reading all Defs worked fine.
/// Introduced after the VGE-Hybridization Rework from #116
/// </summary>
public static void LogAllFoundVGEHybridDefinitions()
{
IEnumerable<VGEHybridOffspringDefs> defs = DefDatabase<VGEHybridOffspringDefs>.AllDefs;
var parents = defs.SelectMany(def => def.SupportedParentKindDefs).Distinct();
var offsprings = defs.SelectMany(def => def.PossibleHybridChildKindDefs).Distinct();
RJW_Genes.ModLog.Debug($"Found {defs.Count()} VGEHybridOffspringDefs, covering {parents.Count()} distinct possible parent-animals and {offsprings.Count()} distinct possible hybrid-children.");
}
}
}

View file

@ -18,7 +18,7 @@ namespace RJW_Genes
this.birthTotal = birthTotal; this.birthTotal = birthTotal;
this.birthCount = 0; this.birthCount = 0;
this.hasOvaryAgitator = pawn.health.hediffSet.HasHediff(HediffDef.Named("OvaryAgitator")); this.hasOvaryAgitator = pawn.health.hediffSet.HasHediff(HediffDef.Named("OvaryAgitator"));
this.hasBioscaffold = pawn.health.hediffSet.HasHediff(HediffDef.Named("OvaryAgitator")); this.hasBioscaffold = pawn.health.hediffSet.HasHediff(HediffDef.Named("Bioscaffold"));
} }
} }
} }

View file

@ -5,9 +5,10 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using HarmonyLib; using HarmonyLib;
using RimWorld; using RimWorld;
using Verse;
using rjw; using rjw;
using rjw.Modules.Interactions; using rjw.Modules.Interactions;
using Verse;
using static rjw.RJWPregnancySettings;
//using rjw.Modules.Interactions.Enums; //using rjw.Modules.Interactions.Enums;
namespace RJW_Genes namespace RJW_Genes
@ -17,18 +18,18 @@ namespace RJW_Genes
{ {
public static HediffDef vasectomydef = DefDatabase<HediffDef>.GetNamed("Vasectomy", true); public static HediffDef vasectomydef = DefDatabase<HediffDef>.GetNamed("Vasectomy", true);
// Token: 0x0600000F RID: 15 // Token: 0x0600000F RID: 15
[HarmonyPostfix] //[HarmonyPostfix]
[HarmonyPatch("impregnate")] //[HarmonyPatch("impregnate")]
private static void ImpregnatePostfix(ref SexProps props) private static void ImpregnatePostfix(ref SexProps props)
{ {
if (RJWSettings.DevMode) rjw.ModLog.Message("Rimjobworld::impregnate(" + props.sexType + "):: " + xxx.get_pawnname(props.pawn) + " + " + xxx.get_pawnname(props.partner) + ":"); if (RJWSettings.DevMode) rjw.ModLog.Message("Rimjobworld::impregnate(" + props.sexType + "):: " + xxx.get_pawnname(props.pawn) + " + " + xxx.get_pawnname(props.partner) + ":");
//"mech" pregnancy //"mech" pregnancy
if (props.sexType == xxx.rjwSextype.MechImplant) //if (props.sexType == xxx.rjwSextype.MechImplant)
{ //{
return; // return;
} //}
Pawn giver = props.pawn; // orgasmer Pawn giver = props.pawn; // orgasmer
Pawn receiver = props.partner; Pawn receiver = props.partner;
@ -55,7 +56,6 @@ namespace RJW_Genes
//"normal" and "beastial" pregnancy //"normal" and "beastial" pregnancy
if (RJWSettings.DevMode) ModLog.Message(" 'normal' pregnancy checks"); if (RJWSettings.DevMode) ModLog.Message(" 'normal' pregnancy checks");
//interaction stuff if for handling futa/see who penetrates who in interaction //interaction stuff if for handling futa/see who penetrates who in interaction
if (!props.isReceiver && if (!props.isReceiver &&
interaction.Extension.initiatorRequirement.genitalTags.Contains(GenitalTag.CanPenetrate) && interaction.Extension.initiatorRequirement.genitalTags.Contains(GenitalTag.CanPenetrate) &&
@ -77,11 +77,13 @@ namespace RJW_Genes
return; return;
} }
if (!interaction.Extension.initiatorRequirement.genitalTags.Contains(GenitalTag.CanFertilize)) if (!giver.GetLewdParts().AllRJWParts.Any(p => p.HasGenitalTag(GenitalTag.CanFertilize)))
{ {
if (RJWSettings.DevMode) ModLog.Message(xxx.get_pawnname(giver) + " has no parts to Fertilize with"); if (RJWSettings.DevMode) ModLog.Message(xxx.get_pawnname(giver) + " has no parts to Fertilize with");
return; return;
} }
//If recieving pawn has a Vasectomy,temporarily remove it to prevent fertility Malice, replace it after DoImpregnate.
if (vasectomy != null) if (vasectomy != null)
{ {
if (RJWSettings.DevMode) ModLog.Message("vasectomy check"); if (RJWSettings.DevMode) ModLog.Message("vasectomy check");
@ -89,8 +91,9 @@ namespace RJW_Genes
} }
if (CanImpregnate2(giver, receiver, props.sexType)) if (CanImpregnate2(giver, receiver, props.sexType))
{ {
if (RJWSettings.DevMode) ModLog.Message(xxx.get_pawnname(giver)+" is analy impregnating "+ xxx.get_pawnname(receiver));
PregnancyHelper.DoImpregnate(giver, receiver); //DOES NOT EXIST
//PregnancyHelper.DoImpregnate(giver, receiver);
} }
if (vasectomy != null) if (vasectomy != null)
@ -103,7 +106,7 @@ namespace RJW_Genes
private static bool CanImpregnate2(Pawn fucker, Pawn fucked, xxx.rjwSextype sexType) private static bool CanImpregnate2(Pawn fucker, Pawn fucked, xxx.rjwSextype sexType)
{ {
if (fucker == null || fucked == null) if (fucker == null || fucked == null)
{ {
return false; return false;
@ -121,15 +124,15 @@ namespace RJW_Genes
":" ":"
})); }));
} }
if (sexType == xxx.rjwSextype.MechImplant && !RJWPregnancySettings.mechanoid_pregnancy_enabled) //if (sexType == xxx.rjwSextype.MechImplant && !RJWPregnancySettings.mechanoid_pregnancy_enabled)
{ //{
if (RJWSettings.DevMode) // if (RJWSettings.DevMode)
{ // {
ModLog.Message(" mechanoid 'pregnancy' disabled"); // ModLog.Message(" mechanoid 'pregnancy' disabled");
} // }
return false; //return false;
} //}
if (sexType != xxx.rjwSextype.Vaginal && sexType != xxx.rjwSextype.DoublePenetration && !(sexType == xxx.rjwSextype.Anal && fucked.genes.HasActiveGene(GeneDefOf.rjw_genes_fertile_anus))) if (sexType != xxx.rjwSextype.Vaginal && sexType != xxx.rjwSextype.DoublePenetration && !(sexType == xxx.rjwSextype.Anal && fucked.genes.HasActiveGene(GeneDefOf.rjw_genes_fertile_anus)))
{ {
if (RJWSettings.DevMode) if (RJWSettings.DevMode)
@ -148,15 +151,15 @@ namespace RJW_Genes
return false; return false;
} }
if ((fucker.IsUnsexyRobot() || fucked.IsUnsexyRobot()) && sexType != xxx.rjwSextype.MechImplant) //if ((fucker.IsUnsexyRobot() || fucked.IsUnsexyRobot()) && sexType != xxx.rjwSextype.MechImplant)
{ // {
if (RJWSettings.DevMode) // if (RJWSettings.DevMode)
{ // {
ModLog.Message(" unsexy robot cant be pregnant"); // ModLog.Message(" unsexy robot cant be pregnant");
} // }
return false; // return false;
} //}
if (!fucker.RaceHasPregnancy()) if (!fucker.RaceHasPregnancy())
{ {
if (RJWSettings.DevMode) if (RJWSettings.DevMode)
@ -196,7 +199,7 @@ namespace RJW_Genes
} }
List<Hediff> genitalsList = fucker.GetGenitalsList(); List<Hediff> genitalsList = fucker.GetGenitalsList();
List<Hediff> genitalsList2 = fucked.GetGenitalsList(); List<Hediff> genitalsList2 = fucked.GetGenitalsList();
if (!Genital_Helper.has_penis_fertile(fucker, genitalsList) && !Genital_Helper.has_penis_fertile(fucked, genitalsList2)) if (!Genital_Helper.has_penis_fertile(fucker, genitalsList) && !Genital_Helper.has_penis_fertile(fucked, genitalsList2))
{ {
if (RJWSettings.DevMode) if (RJWSettings.DevMode)
@ -223,7 +226,7 @@ namespace RJW_Genes
return false; return false;
} }
if (((xxx.is_animal(fucker) && xxx.is_human(fucked)) || (xxx.is_human(fucker) && xxx.is_animal(fucked))) && !RJWPregnancySettings.bestial_pregnancy_enabled) if (((xxx.is_animal(fucker) && xxx.is_human(fucked)) || (xxx.is_human(fucker) && xxx.is_animal(fucked))) && RJWPregnancySettings.bestial_pregnancy == BestialPregnancy.None)
{ {
if (RJWSettings.DevMode) if (RJWSettings.DevMode)
{ {

View file

@ -76,7 +76,7 @@ namespace RJW_Genes
[MayRequire("vegapnk.cumpilation")] public static readonly GeneDef rjw_genes_un_inflatable; [MayRequire("vegapnk.cumpilation")] public static readonly GeneDef rjw_genes_un_inflatable;
[MayRequire("vegapnk.cumpilation")] public static readonly GeneDef rjw_genes_inflatable; [MayRequire("vegapnk.cumpilation")] public static readonly GeneDef rjw_genes_inflatable;
public static readonly GeneDef rjw_genes_generous_donor; public static readonly GeneDef rjw_genes_generous_donor;
[MayRequire("rjw.sexperience")] public static readonly GeneDef rjw_genes_living_cumbucket; [MayRequire("vegapnk.cumpilation")] public static readonly GeneDef rjw_genes_living_cumbucket;
// Reproduction // Reproduction

View file

@ -30,6 +30,6 @@ namespace RJW_Genes
public static readonly HediffDef OvaryAgitator; public static readonly HediffDef OvaryAgitator;
public static readonly HediffDef Bioscaffold; public static readonly HediffDef Bioscaffold;
[MayRequire("rjw.sexperience")] public static readonly HediffDef rjw_genes_filled_living_cumbucket; [MayRequire("vegapnk.cumpilation")] public static readonly HediffDef rjw_genes_filled_living_cumbucket;
} }
} }

View file

@ -26,7 +26,7 @@ namespace RJW_Genes
return null; return null;
} }
if (ModsConfig.IsActive("rjw.sexperience") && gene_lifeforce.StoredCumAllowed && genes.HasActiveGene(GeneDefOf.rjw_genes_cum_eater)) if (ModsConfig.IsActive("vegapnk.cumpilation") && gene_lifeforce.StoredCumAllowed && genes.HasActiveGene(GeneDefOf.rjw_genes_cum_eater))
{ {
Thing gatheredCum = this.GetStoredCum(pawn); Thing gatheredCum = this.GetStoredCum(pawn);
if (gatheredCum == null) if (gatheredCum == null)

View file

@ -56,13 +56,13 @@ namespace RJWLoveFeeding
Pawn_GeneTracker genes = fucked.genes; Pawn_GeneTracker genes = fucked.genes;
if (genes.HasActiveGene(RJW_Genes.GeneDefOf.RS_MultiPregnancy)) if (genes.HasActiveGene(RJW_Genes.GeneDefOf.RS_MultiPregnancy))
{ {
Log.Message(xxx.get_pawnname(fucked) + " has multipregnancy gene"); if (RJWSettings.DevMode) Log.Message(xxx.get_pawnname(fucked) + " has multipregnancy gene");
return false; return false;
} }
} }
else else
{ {
Log.Message(setNoPreggo.First<Hediff>().def.defName + ": This prevents pregnancy"); if (RJWSettings.DevMode) Log.Message(setNoPreggo.First<Hediff>().def.defName + ": This prevents pregnancy");
} }
} }

View file

@ -4,6 +4,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Verse; using Verse;
using HarmonyLib;
namespace RJW_Genes namespace RJW_Genes
{ {
@ -17,18 +18,40 @@ namespace RJW_Genes
/// <param name="def"></param> /// <param name="def"></param>
/// <param name="severity"></param> /// <param name="severity"></param>
/// <returns></returns> /// <returns></returns>
public static bool Prefix(Pawn pawn, BodyPartRecord part, HediffDef def, float severity) public static void Postfix(Pawn pawn, BodyPartRecord part, HediffDef def, float severity, ref bool __result)
{ {
ModLog.Debug($"Checking elasticity genes for pawn {pawn.Name}."); if (pawn?.genes?.HasActiveGene(GeneDefOf.rjw_genes_elasticity) ?? false)
if (pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_elasticity))
{ {
ModLog.Debug($"Preventing creation of Injury Hediffs from streching for pawn {pawn.Name}."); ModLog.Debug($"Preventing creation of Injury Hediffs from streching for pawn {pawn.Name}.");
return false; __result = false;
return;
} }
else else
{ {
return true; return;
} }
} }
} }
public class Patch_eltoro_strechheal
{
/// <summary>
/// Patch function that connects to Strecher.ApplyInjury, itercepting the creation of injury hediffs, and preventing if a Gene would stop the injury.
/// </summary>
/// <returns></returns>
public static void Postfix(ref HediffComp __instance, ref float __result)
{
if (__instance.Pawn?.genes?.HasActiveGene(GeneDefOf.rjw_genes_elasticity) ?? false)
{
ModLog.Debug($"Healing streching factor @ x2 speed for pawn : {__instance.Pawn.Name}.");
__result = 2f;
} else
{
return;
}
}
}
} }

View file

@ -23,9 +23,10 @@ namespace RJW_Genes
if (props == null || props.pawn == null || !props.hasPartner()) if (props == null || props.pawn == null || !props.hasPartner())
return; return;
// Exit for Animals - Animals can't get or trigger Orgasm Rushes. Fixes #15 // Exit for Animals - Animals can't get or trigger Orgasm Rushes.
if (props.pawn.IsAnimal() || props.partner.IsAnimal()) //if (props.pawn.IsAnimal() || props.partner.IsAnimal())
return; if (props.pawn.IsAnimal())
return;
if (props.pawn.genes != null && props.pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_orgasm_rush)) if (props.pawn.genes != null && props.pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_orgasm_rush))
{ {

View file

@ -54,12 +54,18 @@ namespace RJW_Genes
prefix: new HarmonyMethod(typeof(Patch_sexualize_pawn), nameof(Patch_sexualize_pawn.PreFix))); prefix: new HarmonyMethod(typeof(Patch_sexualize_pawn), nameof(Patch_sexualize_pawn.PreFix)));
//Patch for Elastic Gene support with Eltro's Streching mod. //Patch for Elastic Gene support with Eltoro's Streching mod.
if (ModLister.GetActiveModWithIdentifier("eltoro.stretching") != null) if (ModsConfig.IsActive("eltoro.stretching"))
{ {
ModLog.Debug("Patching eltoro.Streching for elasticity gene Support."); ModLog.Debug("Patching eltoro.Streching for elasticity gene Support.");
harmony.Patch(AccessTools.Method(typeof(Stretcher), "ApplyInjury"), // This patching structure allows to patch a class that is not allways present, and a Private function that is not normaly Available.
prefix: new HarmonyMethod(typeof(Patch_eltoro_streching), nameof(Patch_eltoro_streching.Prefix))); harmony.Patch(AccessTools.Method(GenTypes.GetTypeInAnyAssembly("LLStretcher.Stretcher"), "ApplyInjuryHook"),
postfix: new HarmonyMethod(typeof(Patch_eltoro_streching), nameof(Patch_eltoro_streching.Postfix)));
// HediffComp_StretchMemory.StretchRecoveryHook
harmony.Patch(AccessTools.Method(GenTypes.GetTypeInAnyAssembly("LLStretcher.HediffComp_StretchMemory"), "StretchRecoveryHook"),
postfix: new HarmonyMethod(typeof(Patch_eltoro_strechheal), nameof(Patch_eltoro_strechheal.Postfix)));
} }
} }

View file

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Rjw-Genes")] [assembly: AssemblyProduct("Rjw-Genes")]
[assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyCopyright("Copyright © 2026")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
@ -32,5 +32,4 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.5.3.0")] [assembly: AssemblyVersion("2.6.2")]
[assembly: AssemblyFileVersion("2.5.3.0")]

View file

@ -11,8 +11,6 @@ namespace RJW_Genes
static RJW_Genes() static RJW_Genes()
{ {
ModLog.Message("RJW-Genes loaded"); ModLog.Message("RJW-Genes loaded");
RJW_BGS.VGEHybridUtility.LogAllFoundVGEHybridDefinitions();
} }
} }
} }

View file

@ -26,19 +26,6 @@
<None Include="..\About\**" /> <None Include="..\About\**" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Animal_Inheritance\Defs\VGEHybridOffspringDefs.cs" />
<Compile Include="Animal_Inheritance\VGEHybridUtility.cs" />
<Compile Include="Animal_Inheritance\InheritanceUtility.cs" />
<Compile Include="Animal_Inheritance\Patches\Patch_RJW_BasePregnancy_VanillaExpandedGenetics.cs" />
<Compile Include="Animal_Inheritance\Patches\Patch_RJW_BestialityPregnancyUtility.cs" />
<Compile Include="Animal_Inheritance\Patches\Patch_RJW_HediffInsect_Egg.cs" />
<Compile Include="Animal_Inheritance\Patches\Patch_RJW_PregnancyHelper_VanillaExpandedGenetics.cs" />
<Compile Include="Animal_Inheritance\Patches\Patch_Vanilla_PregnancyUtility.cs" />
<Compile Include="Animal_Inheritance\Defs\RaceGeneDef.cs" />
<Compile Include="Animal_Inheritance\Defs\RaceGeneDef_Helper.cs" />
<Compile Include="Animal_Inheritance\Settings\RJW_BGSSettings.cs" />
<Compile Include="Animal_Inheritance\Settings\RJW_BGSSettingsController.cs" />
<Compile Include="Animal_Inheritance\Defs\BestialityGeneInheritanceDef.cs" />
<Compile Include="Common\Defs\ChanceExtension.cs" /> <Compile Include="Common\Defs\ChanceExtension.cs" />
<Compile Include="Common\Defs\DistanceExtension.cs" /> <Compile Include="Common\Defs\DistanceExtension.cs" />
<Compile Include="Common\Defs\HediffIncreaseOnSexExtension.cs" /> <Compile Include="Common\Defs\HediffIncreaseOnSexExtension.cs" />
@ -213,8 +200,8 @@
<Content Include="GeneDefs_GenitaliaTypeEndogenes.xml" /> <Content Include="GeneDefs_GenitaliaTypeEndogenes.xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="0Harmony, Version=2.3.3.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="0Harmony">
<HintPath>..\..\..\..\..\..\Steam\steamapps\workshop\content\294100\2009463077\1.5\Assemblies\0Harmony.dll</HintPath> <HintPath>..\..\..\..\..\..\Steam\steamapps\workshop\content\294100\2009463077\Current\Assemblies\0Harmony.dll</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="Assembly-CSharp, Version=1.4.8385.39127, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Assembly-CSharp, Version=1.4.8385.39127, Culture=neutral, processorArchitecture=MSIL">

View file

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

View file

@ -2,7 +2,7 @@
<name>RJW Genes</name> <name>RJW Genes</name>
<author>Vegapnk - 1.6 Rewrite by Telanda</author> <author>Vegapnk - 1.6 Rewrite by Telanda</author>
<packageId>Vegapnk.rjw.genes</packageId> <packageId>Vegapnk.rjw.genes</packageId>
<modVersion>2.5.3</modVersion> <modVersion>2.6.2</modVersion>
<supportedVersions> <supportedVersions>
<li>1.4</li> <li>1.4</li>
<li>1.5</li> <li>1.5</li>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Manifest> <Manifest>
<identifier>RJW-Genes</identifier> <identifier>RJW-Genes</identifier>
<version>2.5.3</version> <version>2.6.2</version>
<dependencies> <dependencies>
<li>RimJobWorld</li> <li>RimJobWorld</li>
</dependencies> </dependencies>

View file

@ -1,3 +1,51 @@
#INPROG
# 2.6.2 (15-02-2026)
(Commit by @Telanda-DDS)
**Fixes**
- Fixed incorrect gene Definition for Big and Small - Vampires and the Undead.
- Fixed missing translation text field `RJW_Genes_GenitalsNotAlterable`
------------
# 2.6.1 (16-10-2025)
(Commit by @Telanda-DDS)
**Fixes**
- Updated RJW Patches to reference changed setting variable.
# 2.6.0 (05-09-2025)
(Commit by @Telanda-DDS)
**Changes**
- Removed Animal Gene Inheritance code from Core RJW_Genes and moved it into it's own mod.
- Replaced all references to GenericAnus with Anus in Genital type Genes.
# 2.5.7 (18-08-2025)
(Commit by @Telanda-DDS)
**Fixes**
- Fixed fertile anus not correctly detecting if penetrating partner had a penis capable of impregnation.
# 2.5.5 (25-07-2025)
(Commit by @Telanda-DDS)
**Changes**
- Support for RJW RC-5
- Updated Elastic gene to also increase speed at which stretched parts return to normal under ElToro's stretching Mod.
**Fixes**
- Fixed Load bug with VRE-Genie Sexperience interaction.
- Fixed incorrect consciousness value on infectious sex change Gene.
- Fixed ElToro Stretching support causing an error if not present.
- Fixed Typo in Disease ThoughtDef
# 2.5.3 (19-07-2025) # 2.5.3 (19-07-2025)
(Commit by @Telanda-DDS) (Commit by @Telanda-DDS)

View file

@ -17,7 +17,7 @@ But please consider also the following:
## Contributors ## Contributors
- Shabalox (MechBreeding, InsectBreeding, Animal Gene Inheritance) - Shabalox (MechBreeding, InsectBreeding)
- WasMachenDennSachen (Various Icons) - WasMachenDennSachen (Various Icons)
- Jaaldabaoth (1.5 Migration, MPreg, Femboys, Initial VE-Genetic Hybrids) - Jaaldabaoth (1.5 Migration, MPreg, Femboys, Initial VE-Genetic Hybrids)
- Flock-of-Birds (Cosmetic Genitalia per XML) - Flock-of-Birds (Cosmetic Genitalia per XML)

View file

@ -14,21 +14,19 @@ This mod adds genes related and based on RJW to Rimworld.
- Cum-Amount Changes, Transfer Nutrition Boosts - Cum-Amount Changes, Transfer Nutrition Boosts
- Sexual Vampires that need Cum, Cocks or some other sources. - Sexual Vampires that need Cum, Cocks or some other sources.
- Mech Breeding Additions & Orgasmic Mytosis - 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 - Genetic Diseases that spread on Intercourse
- Patches for some popular / common Xenotypes from other Mods. - 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*. *You might not see all of them. Many genes just show up if other mods are loaded*.
**Conflicts:** **Conflicts:**
1. Should not be used with the original RJW_Animal_Gene_Inheritance anymore. 1. There was an issue with other "Male-Only / Female-Only" Mods --- for which we provide our own Genes now.
2. There was an issue with other "Male-Only / Female-Only" Mods --- for which we provide our own Genes now. 2. CAI5000 will not crash, but will make *Seduce*-Ability fail. I think same goes for Combat Extended.
3. CAI5000 will not crash, but will make *Seduce*-Ability fail. I think same goes for Combat Extended. 3. Alpha Genes "Female / Male Only" Genes might overwrite later Genitalia-Changes and should be avoided in combination with RJW-Genes features.
4. Alpha Genes "Female / Male Only" Genes might overwrite later Genitalia-Changes and should be avoided in combination with RJW-Genes features.
## Structure ## Structure
- Toplevel: By Function (i.E. "Genes", "Animal Inheritance", "Utility") - Toplevel: By Function (i.E. "Genes", "Utility")
- Then: By Domain, following the Gene-Categories ("Cosmetic","Special", "Damage",...) - Then: By Domain, following the Gene-Categories ("Cosmetic","Special", "Damage",...)
- Last: By Type of Action (Def, Patch, etc.) - Last: By Type of Action (Def, Patch, etc.)