diff --git a/1.6/Assemblies/Rjw-Genes.dll b/1.6/Assemblies/Rjw-Genes.dll index 4778bf2..e8bf050 100644 Binary files a/1.6/Assemblies/Rjw-Genes.dll and b/1.6/Assemblies/Rjw-Genes.dll differ diff --git a/1.6/Defs/GeneDefs/GeneDefs_GenitaliaTypes.xml b/1.6/Defs/GeneDefs/GeneDefs_GenitaliaTypes.xml index 543c542..d5efbae 100644 --- a/1.6/Defs/GeneDefs/GeneDefs_GenitaliaTypes.xml +++ b/1.6/Defs/GeneDefs/GeneDefs_GenitaliaTypes.xml @@ -27,7 +27,7 @@
  • HorsePenis HorseVagina - Anus + GenericAnus
  • 802 @@ -58,7 +58,7 @@
  • DogPenis DogVagina - Anus + GenericAnus
  • 803 @@ -73,7 +73,7 @@
  • CatPenis CatVagina - Anus + GenericAnus
  • 804 @@ -106,7 +106,7 @@
  • DragonPenis DragonVagina - Anus + GenericAnus
  • ScaleLoverQuirk @@ -189,8 +189,6 @@
  • HemiPenis - CloacalVagina - CloacalAnus
  • ScaleLoverQuirk @@ -235,31 +233,4 @@ - - rjw_genes_rodent_genitalia - - Carriers of this gene develop rodent genitalia. - Genes/Icons/Genitalia_croc_icon - -
  • - RodentPenis - RodentVagina -
  • - - - - - rjw_genes_cloacal_genitalia - - Carriers of this gene develop cloacal genitalia. - Genes/Icons/Genitalia_croc_icon - -
  • - CloacalPenis - CloacalVagina - CloacalAnus -
  • -
    -
    - \ No newline at end of file diff --git a/1.6/Defs/RaceGeneDefs/RaceGeneDefs_Base.xml b/1.6/Defs/RaceGeneDefs/RaceGeneDefs_Base.xml new file mode 100644 index 0000000..2e03f2b --- /dev/null +++ b/1.6/Defs/RaceGeneDefs/RaceGeneDefs_Base.xml @@ -0,0 +1,30 @@ + + + + Insect_base + +
  • + AG_InsectBlood + 0.5 +
  • +
  • + rjw_genes_ovipositor_genitalia + 0.5 +
  • +
    +
    + + + Slime_base + +
  • + AG_SlimeBlood + 0.5 +
  • +
  • + rjw_genes_slime_genitalia + 0.5 +
  • +
    +
    +
    \ No newline at end of file diff --git a/1.6/Defs/RaceGeneDefs/RaceGeneDefs_Vanilla_Racegroups.xml b/1.6/Defs/RaceGeneDefs/RaceGeneDefs_Vanilla_Racegroups.xml new file mode 100644 index 0000000..ca732bf --- /dev/null +++ b/1.6/Defs/RaceGeneDefs/RaceGeneDefs_Vanilla_Racegroups.xml @@ -0,0 +1,285 @@ + + + + Canine + +
  • Canine_Group
  • +
  • CanineAnimal
  • +
  • CanineSingleGenderAnimal
  • +
  • CanineSkinAnimal
  • +
    + +
  • + Ears_Floppy + 0.75 +
  • +
  • + Tail_Furry + 0.2 +
  • +
  • + Furskin + 0.5 +
  • +
  • + rjw_genes_canine_genitalia + 0.4 +
  • +
  • + ViolenceDisabled + 0.05 +
  • +
  • + PsychicBonding + 0.05 +
  • +
  • + Mood_Sanguine + 0.1 +
  • +
    +
    + + + + Insect + +
  • Insect_Group
  • +
  • ArthropodOvipositorAnimal
  • +
  • ArthropodOvipositorHornyAnimal
  • +
    + +
  • + Beauty_Ugly + 0.5 +
  • +
  • + Immunity_Strong + 0.6 +
  • +
  • + ToxicEnvironmentResistance_Partial + 0.4 +
  • +
  • + rjw_genes_ovipositor_genitalia + 0.15 +
  • +
  • + rjw_genes_insectincubator + 0.1 +
  • +
  • + rjw_genes_insectbreeder + 0.1 +
  • +
  • + Body_Thin + 0.3 +
  • +
    +
    + + + Feline + +
  • Feline_Group
  • +
  • FelineAnimal
  • +
  • FelineHornyAnimal
  • +
  • FelineSingleGenderAnimal
  • +
  • AA_SandProwlerAnimal
  • +
    + + +
  • + Tail_Furry + 0.2 +
  • +
  • + Furskin + 0.5 +
  • +
  • + Ears_Cat + 0.9 +
  • +
  • + PsychicBonding + 0.05 +
  • +
  • + Sleepy + 0.25 +
  • +
  • + DarkVision + 0.25 +
  • +
  • + rjw_genes_feline_genitalia + 0.25 +
  • +
    +
    + + + Equine + +
  • Equine_Group
  • +
  • HorseAnimal
  • +
    + +
  • + Furskin + 0.2 +
  • +
  • + rjw_genes_equine_genitalia + 0.25 +
  • +
  • + MoveSpeed_Quick + 0.4 +
  • +
  • + MoveSpeed_VeryQuick + 0.1 +
  • +
  • + rjw_genes_much_fluid + 0.3 +
  • +
  • + rjw_genes_very_much_fluid + 0.05 +
  • +
  • + Body_Hulk + 0.4 +
  • +
    +
    + + + Dragon + +
  • Dragon_Group
  • +
  • ThrumboAnimal
  • +
  • DragonAnimal
  • +
  • DragonSingleGenderAnimal
  • +
    + +
  • + Unstoppable + 0.25 +
  • +
  • + Headbone_CenterHorn + 0.9 +
  • +
  • + VoiceRoar + 0.6 +
  • +
  • + MaxTemp_SmallIncrease + 0.7 +
  • +
  • + MaxTemp_LargeIncrease + 0.1 +
  • +
  • + rjw_genes_dragon_genitalia + 0.6 +
  • +
  • + FireResistant + 0.15 +
  • +
  • + rjw_genes_much_fluid + 0.3 +
  • +
  • + rjw_genes_very_much_fluid + 0.05 +
  • +
  • + Body_Hulk + 0.7 +
  • +
    +
    + + + Rodent + +
  • Rodent_Group
  • +
  • RodentAnimal
  • +
  • RodentSingleGenderAnimal
  • +
  • DragonSingleGenderAnimal
  • +
    + +
  • + Furskin + 0.2 +
  • +
  • + Fertile + 0.25 +
  • +
  • + FastRunner + 0.6 +
  • +
  • + rjw_genes_small_genitalia + 0.6 +
  • +
  • + Immunity_Strong + 0.4 +
  • +
  • + ToxicEnvironmentResistance_Partial + 0.1 +
  • +
  • + Body_Thin + 0.45 +
  • +
    +
    + + + Racoon + +
  • Raccon_Group
  • +
  • RaccoonAnimal
  • +
    + +
  • + Furskin + 0.25 +
  • +
  • + Tail_Furry + 0.25 +
  • +
  • + StrongStomach + 0.5 +
  • +
  • + Immunity_Strong + 0.2 +
  • +
  • + ToxicEnvironmentResistance_Partial + 0.1 +
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.6/Defs/RaceGeneDefs/RaceGeneDefs_template.xml b/1.6/Defs/RaceGeneDefs/RaceGeneDefs_template.xml new file mode 100644 index 0000000..b092257 --- /dev/null +++ b/1.6/Defs/RaceGeneDefs/RaceGeneDefs_template.xml @@ -0,0 +1,65 @@ + + + + + + \ No newline at end of file diff --git a/1.6/Languages/English/Keyed/Bestiality.xml b/1.6/Languages/English/Keyed/Bestiality.xml new file mode 100644 index 0000000..e6edf59 --- /dev/null +++ b/1.6/Languages/English/Keyed/Bestiality.xml @@ -0,0 +1,4 @@ + + + animal-hybrid + diff --git a/1.6/Languages/English/Keyed/Mod_Settings_AnimalGeneInheritance.xml b/1.6/Languages/English/Keyed/Mod_Settings_AnimalGeneInheritance.xml new file mode 100644 index 0000000..bb7012d --- /dev/null +++ b/1.6/Languages/English/Keyed/Mod_Settings_AnimalGeneInheritance.xml @@ -0,0 +1,18 @@ + + + + enabled + If toggled, Animal Pregnancies will try inherit genes. + + + + + genes as xenogenes + If toggled on, animal genes will be added as xenogenes. + + enable VE genetics hybridation + If enabled and if you have VE genetics it will enable the hybridation system. + + + + diff --git a/1.6/Languages/English/Keyed/StatsReports.xml b/1.6/Languages/English/Keyed/StatsReports.xml index 63085f9..715bccb 100644 --- a/1.6/Languages/English/Keyed/StatsReports.xml +++ b/1.6/Languages/English/Keyed/StatsReports.xml @@ -4,6 +4,5 @@ Pawn doesn't have any children. Pawn has a decent amount of children. Pawn has a lot of children. - Unable to geneticaly adapt or alter {PAWN_nameDef}'s genitals. diff --git a/1.6/Mods/Cumpilation/Assemblies/CumpilationPatcher.dll b/1.6/Mods/Cumpilation/Assemblies/CumpilationPatcher.dll index 586660a..d902457 100644 Binary files a/1.6/Mods/Cumpilation/Assemblies/CumpilationPatcher.dll and b/1.6/Mods/Cumpilation/Assemblies/CumpilationPatcher.dll differ diff --git a/1.6/Mods/VE_Genetics/Defs/HedifDef/Hediffs_Animals.xml b/1.6/Mods/VE_Genetics/Defs/HedifDef/Hediffs_Animals.xml new file mode 100644 index 0000000..aa0c672 --- /dev/null +++ b/1.6/Mods/VE_Genetics/Defs/HedifDef/Hediffs_Animals.xml @@ -0,0 +1,19 @@ + + + + + rjw_genes_animal_control_hediff + + This creature is more controlable with a natural human part. + HediffWithComps + (0.9, 1.0, 0.35) + 1 + +
  • + true +
  • +
    + false +
    + +
    \ No newline at end of file diff --git a/1.6/Mods/VE_Genetics/Defs/RaceGeneDef/RaceGeneDefs_VEgenetic.xml b/1.6/Mods/VE_Genetics/Defs/RaceGeneDef/RaceGeneDefs_VEgenetic.xml new file mode 100644 index 0000000..80da257 --- /dev/null +++ b/1.6/Mods/VE_Genetics/Defs/RaceGeneDef/RaceGeneDefs_VEgenetic.xml @@ -0,0 +1,654 @@ + + + + + GR_Manbear_GenGroup + + +
  • GR_Manbear
  • +
  • GR_Bearman
  • +
    + + + +
  • + Immunity_Strong + 0.8 +
  • +
  • + MinTemp_LargeDecrease + 0.8 +
  • +
  • + Aggression_Aggressive + 0.8 +
  • +
  • + Sleepy + 0.8 +
  • +
  • + Beard_Always + 0.8 +
  • +
  • + VoiceRoar + 0.8 +
  • +
  • + Body_Fat + 0.8 +
  • +
  • + Body_Hulk + 0.8 +
  • +
  • + Hair_ReddishBrown + 0.8 +
  • +
  • + Hair_DarkBrown + 0.8 +
  • +
  • + Hair_DarkSaturatedReddish + 0.8 +
  • +
  • + Hair_DarkReddish + 0.8 +
  • +
  • + RobustDigestion + 0.8 +
  • +
  • + Furskin + 0.8 +
  • +
  • + Unstoppable + 0.8 +
  • +
  • + AptitudeTerrible_Artistic + 0.8 +
  • +
  • + AptitudeTerrible_Social + 0.8 +
  • +
  • + AptitudePoor_Intellectual + 0.8 +
  • + +
    + +
    + + + GR_Manalope_GenGroup + + +
  • GR_Manalope
  • +
  • GR_Booman
  • +
    + + + +
  • + FireSpew + 0.8 +
  • +
  • + Beauty_Ugly + 0.8 +
  • +
  • + Hair_Blonde + 0.8 +
  • +
  • + Hair_SandyBlonde + 0.8 +
  • +
  • + Hair_LightOrange + 0.8 +
  • +
  • + rjw_genes_udder + 0.8 +
  • + +
    + +
    + + + GR_Manchicken_GenGroup + + +
  • GR_Manchicken
  • +
  • GR_Turkeyman
  • +
    + + + +
  • + Mood_Optimist + 0.8 +
  • +
  • + Delicate + 0.8 +
  • +
  • + Beauty_Pretty + 0.8 +
  • +
  • + Body_Thin + 0.8 +
  • +
  • + AptitudeTerrible_Melee + 0.8 +
  • +
  • + AptitudeTerrible_Mining + 0.8 +
  • +
  • + AptitudeRemarkable_Social + 0.8 +
  • +
  • + AptitudeStrong_Intellectual + 0.8 +
  • + +
    + +
    + + + GR_Manffalo_GenGroup + + +
  • GR_Manffalo
  • +
  • GR_Muffaloman
  • +
    + + + +
  • + Headbone_Human + 0.9 +
  • +
  • + Headbone_MiniHorns + 0.9 +
  • +
  • + Furskin + 0.9 +
  • +
  • + MinTemp_SmallIncrease + 0.9 +
  • +
  • + rjw_genes_big_male_genitalia + 0.7 +
  • +
  • + rjw_genes_loose_female_genitalia + 0.7 +
  • +
  • + rjw_genes_big_breasts + 0.7 +
  • +
  • + rjw_genes_udder + 0.7 +
  • +
  • + rjw_genes_Needle_genitalia + 0.7 +
  • +
  • + rjw_mc_genes_perm_lactating + 0.05 +
  • +
  • + rjw_genes_zoophile + 0.5 +
  • +
  • + AptitudeTerrible_Intellectual + 0.05 +
  • +
  • + AptitudePoor_Intellectual + 0.7 +
  • +
    + +
    + + + GR_Manwolf_GenGroup + + +
  • GR_Manwolf
  • +
  • GR_Dogman
  • +
    + + + +
  • + AptitudeTerrible_Mining + 0.05 +
  • +
  • + PsychicBonding + 0.05 +
  • +
  • + Mood_Sanguine + 0.05 +
  • +
  • + Ears_Floppy + 0.9 +
  • +
  • + rjw_genes_canine_genitalia + 0.9 +
  • +
  • + Furskin + 0.9 +
  • +
  • + MinTemp_SmallIncrease + 0.9 +
  • +
  • + Libido_High + 0.9 +
  • +
  • + AptitudePoor_Mining + 0.5 +
  • +
  • + rjw_genes_zoophile + 0.5 +
  • +
  • + Mood_Optimist + 0.5 +
  • +
    + +
    + + + GR_Mancat_GenGroup + + +
  • GR_Mancat
  • +
  • GR_Catman
  • +
    + + + +
  • + PsychicBonding + 0.05 +
  • +
  • + AptitudeTerrible_Animals + 0.05 +
  • +
  • + Ears_Cat + 0.9 +
  • +
  • + Body_Thin + 0.9 +
  • +
  • + rjw_genes_feline_genitalia + 0.9 +
  • +
  • + Furskin + 0.9 +
  • +
  • + MinTemp_SmallIncrease + 0.9 +
  • +
  • + rjw_genes_small_male_genitalia + 0.7 +
  • +
  • + rjw_genes_tight_female_genitalia + 0.7 +
  • +
  • + rjw_genes_small_breasts + 0.7 +
  • +
  • + rjw_genes_tight_anus + 0.7 +
  • +
  • + DarkVision + 0.8 +
  • +
  • + AptitudePoor_Animals + 0.5 +
  • +
  • + Beauty_Pretty + 0.7 +
  • +
  • + rjw_genes_zoophile + 0.5 +
  • +
    + +
    + + + GR_Mansquirrel_GenGroup + + +
  • GR_Mansquirrel
  • +
  • GR_Moleman
  • +
    + + + +
  • + MoveSpeed_VeryQuick + 0.8 +
  • +
  • + KindInstinct + 0.8 +
  • +
  • + Delicate + 0.8 +
  • +
  • + Ears_Cat + 0.8 +
  • +
  • + Body_Thin + 0.8 +
  • +
  • + Tail_Furry + 0.8 +
  • +
  • + AptitudeTerrible_Shooting + 0.8 +
  • +
  • + AptitudeTerrible_Melee + 0.8 +
  • +
  • + AptitudeTerrible_Mining + 0.8 +
  • +
  • + AptitudeTerrible_Animals + 0.8 +
  • +
  • + AptitudeStrong_Intellectual + 0.8 +
  • +
  • + rjw_genes_Needle_genitalia + 0.8 +
  • +
  • + rjw_genes_zoophile + 0.8 +
  • + +
    + +
    + + + GR_Thrumboman_GenGroup + + +
  • GR_Thrumboman
  • +
    + + + +
  • + Unstoppable + 0.25 +
  • +
  • + Headbone_CenterHorn + 0.9 +
  • +
  • + VoiceRoar + 0.6 +
  • +
  • + MaxTemp_SmallIncrease + 0.7 +
  • +
  • + MaxTemp_LargeIncrease + 0.1 +
  • +
  • + rjw_genes_dragon_genitalia + 0.6 +
  • +
  • + FireResistant + 0.15 +
  • +
  • + rjw_genes_much_fluid + 0.3 +
  • +
  • + rjw_genes_very_much_fluid + 0.05 +
  • +
  • + Body_Hulk + 0.7 +
  • + +
    + +
    + + + + + GR_Hurseman_GenGroup + + +
  • GR_Hurseman
  • +
    + + + +
  • + Body_Standard + 0.9 +
  • +
  • + Body_Hulk + 0.7 +
  • +
  • + rjw_genes_equine_genitalia + 0.9 +
  • +
  • + rjw_genes_zoophile + 0.5 +
  • +
  • + rjw_genes_much_fluid + 0.5 +
  • +
  • + MoveSpeed_Quick + 0.5 +
  • +
  • + AptitudeTerrible_Mining + 0.5 +
  • +
  • + AptitudeTerrible_Intellectual + 0.5 +
  • +
  • + Furskin + 0.9 +
  • +
  • + MinTemp_SmallIncrease + 0.9 +
  • + +
    + +
    + + + + + GR_Manscarab_GenGroup + + +
  • GR_Manscarab
  • +
    + + + +
  • + Beauty_Ugly + 0.5 +
  • +
  • + Immunity_Strong + 0.6 +
  • +
  • + ToxicEnvironmentResistance_Partial + 0.4 +
  • +
  • + rjw_genes_ovipositor_genitalia + 0.15 +
  • +
  • + rjw_genes_insectincubator + 0.1 +
  • +
  • + rjw_genes_insectbreeder + 0.1 +
  • +
  • + Body_Thin + 0.3 +
  • + +
    + +
    + + + GR_Lizardman_GenGroup + + +
  • GR_Lizardman
  • +
    + + + +
  • + AcidSpray + 0.7 +
  • +
  • + MinTemp_SmallIncrease + 0.7 +
  • +
  • + MaxTemp_SmallIncrease + 0.7 +
  • +
  • + Robust + 0.7 +
  • +
  • + Hair_BaldOnly + 0.7 +
  • +
  • + Beard_NoBeardOnly + 0.7 +
  • +
  • + Body_Standard + 0.7 +
  • +
  • + Headbone_CenterHorn + 0.7 +
  • +
  • + AptitudeTerrible_Artistic + 0.7 +
  • +
  • + AptitudeTerrible_Social + 0.7 +
  • +
  • + rjw_genes_reptilian_genitalia + 0.7 +
  • + +
    + +
    + +
    \ No newline at end of file diff --git a/1.6/Mods/VE_Genetics/Defs/RaceGroupDef/Hybrid_Group.xml b/1.6/Mods/VE_Genetics/Defs/RaceGroupDef/Hybrid_Group.xml new file mode 100644 index 0000000..b356155 --- /dev/null +++ b/1.6/Mods/VE_Genetics/Defs/RaceGroupDef/Hybrid_Group.xml @@ -0,0 +1,164 @@ + + + + + Bear_Group + + +
  • Bear_Grizzly
  • +
  • Bear_Polar
  • +
    + +
  • GR_Manbear
  • +
  • GR_Bearman
  • +
    +
    + + + Boomalope_Group + +
  • Boomalope
  • +
    + +
  • GR_Manalope
  • +
  • GR_Booman
  • +
    +
    + + + Poultry_Group + +
  • Chicken
  • +
  • Cassowary
  • +
  • Emu
  • +
  • Ostrich
  • +
  • Goose
  • +
  • Turkey
  • +
  • Duck
  • +
    + +
  • GR_Manchicken
  • +
  • GR_Turkeyman
  • +
    +
    + + + Bovine_Group + +
  • Muffalo
  • +
  • Cow
  • +
  • Bison
  • +
  • Yak
  • +
    + + +
  • GR_Manffalo
  • +
  • GR_Muffaloman
  • +
    +
    + + + Canine_Group + +
  • Warg
  • +
  • Wolf_Timber
  • +
  • Wolf_Arctic
  • +
  • Fox_Fennec
  • +
  • Fox_Red
  • +
  • Fox_Arctic
  • +
  • Husky
  • +
  • LabradorRetriever
  • +
  • YorkshireTerrier
  • +
    + + +
  • GR_Manwolf
  • +
  • GR_Dogman
  • +
    +
    + + + Feline_Group + +
  • Cougar
  • +
  • Panther
  • +
  • Lynx
  • +
  • Cat
  • +
    + + +
  • GR_Mancat
  • +
  • GR_Catman
  • +
    +
    + + + Rabbit_Group + +
  • GuineaPig
  • +
  • Hare
  • +
  • Snowhare
  • +
  • Squirrel
  • +
  • Rat
  • +
  • Raccoon
  • +
    + + +
  • GR_Mansquirrel
  • +
  • GR_Moleman
  • +
    +
    + + + Thrumbo_Group + +
  • Thrumbo
  • +
    + + +
  • GR_Thrumboman
  • +
    +
    + + + Equine_Group + +
  • Dromedary
  • +
  • Elk
  • +
  • Horse
  • +
  • Caribou
  • +
  • Donkey
  • +
    + + +
  • GR_Hurseman
  • +
    +
    + + + Insect_Group + +
  • Megascarab
  • +
  • Spelopede
  • +
  • Megaspider
  • +
    + + +
  • GR_Manscarab
  • +
    +
    + + + Reptile_Group + +
  • Iguana
  • +
  • Cobra
  • +
  • Tortoise
  • +
    + + +
  • GR_Lizardman
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.6/Patches/Xenotypes/PatchBSUndead.xml b/1.6/Patches/Xenotypes/PatchBSUndead.xml index c0a9632..0c2e592 100644 --- a/1.6/Patches/Xenotypes/PatchBSUndead.xml +++ b/1.6/Patches/Xenotypes/PatchBSUndead.xml @@ -9,9 +9,16 @@
  • Defs/XenotypeDef[defName="VU_Returned" or defName="VU_Ghoul" or defName="VU_Frankenstein"]/genes +
  • rjw_genes_Necro_genitalia
  • rjw_genes_no_sex_need
  • +
  • + Defs/XenotypeDef[defName="VU_Revenant"]/genes + +
  • rjw_genes_Necro_genitalia
  • + +
  • Defs/XenotypeDef[defName="VU_Lycantrope"]/genes diff --git a/1.6/Source/Animal_Inheritance/Defs/BestialityGeneInheritanceDef.cs b/1.6/Source/Animal_Inheritance/Defs/BestialityGeneInheritanceDef.cs new file mode 100644 index 0000000..ae0c51e --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Defs/BestialityGeneInheritanceDef.cs @@ -0,0 +1,8 @@ +namespace RJW_BGS +{ + public class BestialityGeneInheritanceDef + { + public string defName; + public float chance = 1f; + } +} diff --git a/1.6/Source/Animal_Inheritance/Defs/RaceGeneDef.cs b/1.6/Source/Animal_Inheritance/Defs/RaceGeneDef.cs new file mode 100644 index 0000000..10a9149 --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Defs/RaceGeneDef.cs @@ -0,0 +1,21 @@ +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 raceGroups; //racegroup, but in list form so multiple can be entered, preference to use this over racegroup + public List raceNames; + public List pawnKindNames; + public List genes; + public string hybridName; + } +} diff --git a/1.6/Source/Animal_Inheritance/Defs/RaceGeneDef_Helper.cs b/1.6/Source/Animal_Inheritance/Defs/RaceGeneDef_Helper.cs new file mode 100644 index 0000000..ac58a8c --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Defs/RaceGeneDef_Helper.cs @@ -0,0 +1,147 @@ +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 Valids = ValidRaceGeneDefs(pawn); + if (Valids.Count > 0) + { + RaceGeneDef result = Valids.MaxBy(r => r.priority); + return result; + } + return null; + } + + public static List 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 allDefs = DefDatabase.AllDefs; + List pawnKindDefs = allDefs.Where(delegate (RaceGeneDef group) + { + List pawnKindNames = group.pawnKindNames; + return pawnKindNames != null && pawnKindNames.Contains(pawnKindName); + }).ToList(); + if (pawnKindDefs.Count() > 0) + { + DebugPrintRaceGeneDefs("PawnKindDefs", pawnName,pawnKindDefs); + return pawnKindDefs; + } + RJW_Genes.ModLog.Debug($"Did not find PawnKindDefs for {pawnName}"); + + List raceKindDefs = allDefs.Where(delegate (RaceGeneDef group) + { + List raceNames = group.raceNames; + return raceNames != null && raceNames.Contains(raceName); + }).ToList(); + if (raceKindDefs.Count() > 0) + { + DebugPrintRaceGeneDefs("PawnKindDefs", pawnName, raceKindDefs); + return raceKindDefs; + } + RJW_Genes.ModLog.Debug($"Did not find RaceKindDefs for {pawnName}"); + + List raceGroupDefs = new List(); + if (raceGroupDef != null) + { + raceGroupDefs = allDefs.Where(delegate (RaceGeneDef group) + { + string raceGroupDefName = group.raceGroup; + List list_raceGroupDefName = group.raceGroups; + return (raceGroupDefName != null && raceGroupDefName == raceGroupDef.defName) + || (list_raceGroupDefName != null && list_raceGroupDefName.Contains(raceGroupDef.defName)); + }).ToList(); + } + + 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(); + } + + private static void DebugPrintRaceGeneDefs(String header,String identifier,List 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}"); + } + } + + + /// + /// 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. + /// + /// + /// + private static RaceGroupDef GetRaceGroupDef(PawnKindDef kindDef) + { + var raceName = kindDef.race.defName; + var pawnKindName = kindDef.defName; + var groups = DefDatabase.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); + } + } +} diff --git a/1.6/Source/Animal_Inheritance/Defs/VGEHybridOffspringDefs.cs b/1.6/Source/Animal_Inheritance/Defs/VGEHybridOffspringDefs.cs new file mode 100644 index 0000000..60421fb --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Defs/VGEHybridOffspringDefs.cs @@ -0,0 +1,14 @@ +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 SupportedParentKindDefs; + public List PossibleHybridChildKindDefs; + } +} diff --git a/1.6/Source/Animal_Inheritance/InheritanceUtility.cs b/1.6/Source/Animal_Inheritance/InheritanceUtility.cs new file mode 100644 index 0000000..127c0e1 --- /dev/null +++ b/1.6/Source/Animal_Inheritance/InheritanceUtility.cs @@ -0,0 +1,167 @@ +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 AnimalInheritedGenes(Pawn father, Pawn mother) + { + List genelist = new List(); + //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; + } + + /// + /// Looks up potential genes for an animal, + /// checks their chance and returns all 'triggered' genes. + /// + /// The animal for which to look up genes (Animals are Pawns in RW) + /// The genes that will be inherited from this animal. + public static List SelectGenes(Pawn pawn) + { + List genelist = new List(); + 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.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; + } + + + /// + /// Adds a list of Genes to the pawns existing GeneSet. + /// Whether it is added as a Xenogene or Endogene is configured in Mod-Settings. + /// + /// The pawn for which Genes will be added + /// The Genes to add (Endogene by default, Xenogene with Mod Settings) + public static void AddGenes(Pawn pawn, List genes) + { + foreach (GeneDef gene in genes) + { + pawn.genes.AddGene(gene, RJW_BGSSettings.rjw_bgs_animal_genes_as_xenogenes); + } + } + + /// + /// 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 + /// + /// The mother of the baby. + /// The father of the baby. + /// The baby created in non-pregnancy-way (has 0 Genes yet) + 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 genes = PregnancyUtility.GetInheritedGenes(dad, mother); + List 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); + } + } + + /// + /// Used only for debugging, to see what you loaded and how it looks. + /// + private static void LogAllFoundRaceGroupGenes() + { + foreach (RaceGroupDef def in DefDatabase.AllDefs) + { + Log.Message("defName = " + def.defName); + if (def.raceNames != null) + { + foreach (string race in def.raceNames) + { + Log.Message(race); + } + } + } + } + } +} diff --git a/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_BasePregnancy_VanillaExpandedGenetics.cs b/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_BasePregnancy_VanillaExpandedGenetics.cs new file mode 100644 index 0000000..af9bab1 --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_BasePregnancy_VanillaExpandedGenetics.cs @@ -0,0 +1,44 @@ +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.GetNamed("rjw_genes_animal_control_hediff", false); + + /// + /// This Patch (only) adds the "rjw_genes_animal_control_hediff" to newborn VE hybrid-animals. + /// + /// + [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); + } + + } + } +} diff --git a/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_BestialityPregnancyUtility.cs b/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_BestialityPregnancyUtility.cs new file mode 100644 index 0000000..7f67390 --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_BestialityPregnancyUtility.cs @@ -0,0 +1,52 @@ +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 humangenes = PregnancyUtility.GetInheritedGenes(dad, mother); + List 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."); + } + } + } + } +} diff --git a/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_HediffInsect_Egg.cs b/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_HediffInsect_Egg.cs new file mode 100644 index 0000000..9861537 --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_HediffInsect_Egg.cs @@ -0,0 +1,35 @@ +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 Transpiler(IEnumerable 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); + } + + } + } + } +} diff --git a/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_PregnancyHelper_VanillaExpandedGenetics.cs b/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_PregnancyHelper_VanillaExpandedGenetics.cs new file mode 100644 index 0000000..36c7cfb --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Patches/Patch_RJW_PregnancyHelper_VanillaExpandedGenetics.cs @@ -0,0 +1,110 @@ +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 +{ + + /// + /// 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(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 + /// + [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(mother, father, DnaGivingParent.Father); + + var kindDef = VGEHybridUtility.LookupPossiblyOffspringHybrid(father.kindDef); + var stored = father.kindDef; + father.kindDef = kindDef; + Hediff_BasePregnancy preg = Hediff_BasePregnancy.Create(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(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; + } + } + +} diff --git a/1.6/Source/Animal_Inheritance/Patches/Patch_Vanilla_PregnancyUtility.cs b/1.6/Source/Animal_Inheritance/Patches/Patch_Vanilla_PregnancyUtility.cs new file mode 100644 index 0000000..80c16bd --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Patches/Patch_Vanilla_PregnancyUtility.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using HarmonyLib; +using RimWorld; +using Verse; + +namespace RJW_BGS +{ + /// + /// 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". + /// + [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 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"); + } + } + } +} diff --git a/1.6/Source/Animal_Inheritance/Settings/RJW_BGSSettings.cs b/1.6/Source/Animal_Inheritance/Settings/RJW_BGSSettings.cs new file mode 100644 index 0000000..b191904 --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Settings/RJW_BGSSettings.cs @@ -0,0 +1,58 @@ +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(ref RJW_BGSSettings.rjw_bgs_enabled, "rjw_bgs_enabled", RJW_BGSSettings.rjw_bgs_enabled, true); + Scribe_Values.Look(ref RJW_BGSSettings.rjw_bgs_global_gene_chance, "rjw_bgs_global_gene_chance", RJW_BGSSettings.rjw_bgs_global_gene_chance, true); + Scribe_Values.Look(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(ref RJW_BGSSettings.rjw_bgs_VE_genetics, "rjw_bgs_VE_genetics", RJW_BGSSettings.rjw_bgs_VE_genetics, true); + Scribe_Values.Look(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; + } +} diff --git a/1.6/Source/Animal_Inheritance/Settings/RJW_BGSSettingsController.cs b/1.6/Source/Animal_Inheritance/Settings/RJW_BGSSettingsController.cs new file mode 100644 index 0000000..12ef107 --- /dev/null +++ b/1.6/Source/Animal_Inheritance/Settings/RJW_BGSSettingsController.cs @@ -0,0 +1,27 @@ +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(); + } + + public override string SettingsCategory() + { + return "RJW Genes Animal Gene Inheritance"; + } + public override void DoSettingsWindowContents(Rect inRect) + { + RJW_BGSSettings.DoWindowContents(inRect); + } + } +} diff --git a/1.6/Source/Animal_Inheritance/VGEHybridUtility.cs b/1.6/Source/Animal_Inheritance/VGEHybridUtility.cs new file mode 100644 index 0000000..3426f75 --- /dev/null +++ b/1.6/Source/Animal_Inheritance/VGEHybridUtility.cs @@ -0,0 +1,63 @@ +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 + { + /// + /// All VGE-Hybrids that can result from Bestiality - these are drawn from the existing XML-Defs. + /// + public static List SupportedHybridRaces { + get{return DefDatabase.AllDefs.SelectMany(def => def.PossibleHybridChildKindDefs).Distinct().ToList();} + } + + /// + /// All Animals that can produce VGE Hybrids - these are drawn from the existing XML-Defs. + /// + public static List SupportedInitialAnimalRaces { + get { return DefDatabase.AllDefs.SelectMany(def => def.SupportedParentKindDefs).Distinct().ToList(); } + } + + /// + /// Returns a possible Hybrid KindDef for a given Animal. + /// Null if there is none. + /// Random one if there are multiple. + /// + /// The animal fathering the baby + /// KindDef for Hybrid originated from Parent Animal. Null on None, Not-Supported or Error. Random one from multiple. + public static PawnKindDef LookupPossiblyOffspringHybrid(PawnKindDef Parent) + { + if (Parent == null) return null; + if (!SupportedInitialAnimalRaces.Contains(Parent)) return null; + else + { + return DefDatabase.AllDefs + .Where(def => def.SupportedParentKindDefs.Contains(Parent)) + .SelectMany(def => def.PossibleHybridChildKindDefs) + .Distinct() + .RandomElementWithFallback(null); + // Man I am a true Java Developer + } + } + + /// + /// 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 + /// + public static void LogAllFoundVGEHybridDefinitions() + { + IEnumerable defs = DefDatabase.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."); + } + + } + +} diff --git a/1.6/Source/Common/Helpers/LaborState.cs b/1.6/Source/Common/Helpers/LaborState.cs index abb00a1..8a0e59d 100644 --- a/1.6/Source/Common/Helpers/LaborState.cs +++ b/1.6/Source/Common/Helpers/LaborState.cs @@ -18,7 +18,7 @@ namespace RJW_Genes this.birthTotal = birthTotal; this.birthCount = 0; this.hasOvaryAgitator = pawn.health.hediffSet.HasHediff(HediffDef.Named("OvaryAgitator")); - this.hasBioscaffold = pawn.health.hediffSet.HasHediff(HediffDef.Named("Bioscaffold")); + this.hasBioscaffold = pawn.health.hediffSet.HasHediff(HediffDef.Named("OvaryAgitator")); } } } diff --git a/1.6/Source/Common/patches/PatchPregnancyHelper.cs b/1.6/Source/Common/patches/PatchPregnancyHelper.cs index a040924..2ed0f39 100644 --- a/1.6/Source/Common/patches/PatchPregnancyHelper.cs +++ b/1.6/Source/Common/patches/PatchPregnancyHelper.cs @@ -5,10 +5,9 @@ using System.Text; using System.Threading.Tasks; using HarmonyLib; using RimWorld; +using Verse; using rjw; using rjw.Modules.Interactions; -using Verse; -using static rjw.RJWPregnancySettings; //using rjw.Modules.Interactions.Enums; namespace RJW_Genes @@ -18,8 +17,8 @@ namespace RJW_Genes { public static HediffDef vasectomydef = DefDatabase.GetNamed("Vasectomy", true); // Token: 0x0600000F RID: 15 - //[HarmonyPostfix] - //[HarmonyPatch("impregnate")] + [HarmonyPostfix] + [HarmonyPatch("impregnate")] private static void ImpregnatePostfix(ref SexProps props) { @@ -56,6 +55,7 @@ namespace RJW_Genes //"normal" and "beastial" pregnancy if (RJWSettings.DevMode) ModLog.Message(" 'normal' pregnancy checks"); + //interaction stuff if for handling futa/see who penetrates who in interaction if (!props.isReceiver && interaction.Extension.initiatorRequirement.genitalTags.Contains(GenitalTag.CanPenetrate) && @@ -77,13 +77,11 @@ namespace RJW_Genes return; } - if (!giver.GetLewdParts().AllRJWParts.Any(p => p.HasGenitalTag(GenitalTag.CanFertilize))) + if (!interaction.Extension.initiatorRequirement.genitalTags.Contains(GenitalTag.CanFertilize)) { if (RJWSettings.DevMode) ModLog.Message(xxx.get_pawnname(giver) + " has no parts to Fertilize with"); return; } - - //If recieving pawn has a Vasectomy,temporarily remove it to prevent fertility Malice, replace it after DoImpregnate. if (vasectomy != null) { if (RJWSettings.DevMode) ModLog.Message("vasectomy check"); @@ -91,9 +89,8 @@ namespace RJW_Genes } if (CanImpregnate2(giver, receiver, props.sexType)) { - if (RJWSettings.DevMode) ModLog.Message(xxx.get_pawnname(giver)+" is analy impregnating "+ xxx.get_pawnname(receiver)); - //DOES NOT EXIST - //PregnancyHelper.DoImpregnate(giver, receiver); + + PregnancyHelper.DoImpregnate(giver, receiver); } if (vasectomy != null) @@ -106,7 +103,7 @@ namespace RJW_Genes private static bool CanImpregnate2(Pawn fucker, Pawn fucked, xxx.rjwSextype sexType) { - if (fucker == null || fucked == null) + if (fucker == null || fucked == null) { return false; @@ -199,7 +196,7 @@ namespace RJW_Genes } List genitalsList = fucker.GetGenitalsList(); - List genitalsList2 = fucked.GetGenitalsList(); + List genitalsList2 = fucked.GetGenitalsList(); if (!Genital_Helper.has_penis_fertile(fucker, genitalsList) && !Genital_Helper.has_penis_fertile(fucked, genitalsList2)) { if (RJWSettings.DevMode) @@ -226,7 +223,7 @@ namespace RJW_Genes return false; } - if (((xxx.is_animal(fucker) && xxx.is_human(fucked)) || (xxx.is_human(fucker) && xxx.is_animal(fucked))) && RJWPregnancySettings.bestial_pregnancy == BestialPregnancy.None) + if (((xxx.is_animal(fucker) && xxx.is_human(fucked)) || (xxx.is_human(fucker) && xxx.is_animal(fucked))) && !RJWPregnancySettings.bestial_pregnancy_enabled) { if (RJWSettings.DevMode) { diff --git a/1.6/Source/DefOfs/GeneDefOf.cs b/1.6/Source/DefOfs/GeneDefOf.cs index 0d60b95..5da5430 100644 --- a/1.6/Source/DefOfs/GeneDefOf.cs +++ b/1.6/Source/DefOfs/GeneDefOf.cs @@ -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_inflatable; public static readonly GeneDef rjw_genes_generous_donor; - [MayRequire("vegapnk.cumpilation")] public static readonly GeneDef rjw_genes_living_cumbucket; + [MayRequire("rjw.sexperience")] public static readonly GeneDef rjw_genes_living_cumbucket; // Reproduction diff --git a/1.6/Source/DefOfs/HediffDefOf.cs b/1.6/Source/DefOfs/HediffDefOf.cs index 8878f75..9eee352 100644 --- a/1.6/Source/DefOfs/HediffDefOf.cs +++ b/1.6/Source/DefOfs/HediffDefOf.cs @@ -30,6 +30,6 @@ namespace RJW_Genes public static readonly HediffDef OvaryAgitator; public static readonly HediffDef Bioscaffold; - [MayRequire("vegapnk.cumpilation")] public static readonly HediffDef rjw_genes_filled_living_cumbucket; + [MayRequire("rjw.sexperience")] public static readonly HediffDef rjw_genes_filled_living_cumbucket; } } diff --git a/1.6/Source/Genes/Life_Force/JobGivers/JobGiver_GetLifeForce.cs b/1.6/Source/Genes/Life_Force/JobGivers/JobGiver_GetLifeForce.cs index e4b273b..e9845e4 100644 --- a/1.6/Source/Genes/Life_Force/JobGivers/JobGiver_GetLifeForce.cs +++ b/1.6/Source/Genes/Life_Force/JobGivers/JobGiver_GetLifeForce.cs @@ -26,7 +26,7 @@ namespace RJW_Genes return null; } - if (ModsConfig.IsActive("vegapnk.cumpilation") && gene_lifeforce.StoredCumAllowed && genes.HasActiveGene(GeneDefOf.rjw_genes_cum_eater)) + if (ModsConfig.IsActive("rjw.sexperience") && gene_lifeforce.StoredCumAllowed && genes.HasActiveGene(GeneDefOf.rjw_genes_cum_eater)) { Thing gatheredCum = this.GetStoredCum(pawn); if (gatheredCum == null) diff --git a/1.6/Source/Genes/Patches/MultiplePregnancies.cs b/1.6/Source/Genes/Patches/MultiplePregnancies.cs index ded8271..f5d3eeb 100644 --- a/1.6/Source/Genes/Patches/MultiplePregnancies.cs +++ b/1.6/Source/Genes/Patches/MultiplePregnancies.cs @@ -56,13 +56,13 @@ namespace RJWLoveFeeding Pawn_GeneTracker genes = fucked.genes; if (genes.HasActiveGene(RJW_Genes.GeneDefOf.RS_MultiPregnancy)) { - if (RJWSettings.DevMode) Log.Message(xxx.get_pawnname(fucked) + " has multipregnancy gene"); + Log.Message(xxx.get_pawnname(fucked) + " has multipregnancy gene"); return false; } } else { - if (RJWSettings.DevMode) Log.Message(setNoPreggo.First().def.defName + ": This prevents pregnancy"); + Log.Message(setNoPreggo.First().def.defName + ": This prevents pregnancy"); } } diff --git a/1.6/Source/Genes/Patches/Patch_eltoro_streching.cs b/1.6/Source/Genes/Patches/Patch_eltoro_streching.cs index c8275e4..0f93a16 100644 --- a/1.6/Source/Genes/Patches/Patch_eltoro_streching.cs +++ b/1.6/Source/Genes/Patches/Patch_eltoro_streching.cs @@ -20,7 +20,7 @@ namespace RJW_Genes /// public static void Postfix(Pawn pawn, BodyPartRecord part, HediffDef def, float severity, ref bool __result) { - 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}."); __result = false; @@ -41,16 +41,12 @@ namespace RJW_Genes /// public static void Postfix(ref HediffComp __instance, ref float __result) { - if (__instance.Pawn?.genes?.HasActiveGene(GeneDefOf.rjw_genes_elasticity) ?? false) + if (__instance.Pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_elasticity)) { ModLog.Debug($"Healing streching factor @ x2 speed for pawn : {__instance.Pawn.Name}."); __result = 2f; - } else - { - return; } - - + return; } } diff --git a/1.6/Source/Genes/Special/Patches/Patch_OrgasmRush.cs b/1.6/Source/Genes/Special/Patches/Patch_OrgasmRush.cs index 0dea579..d6df246 100644 --- a/1.6/Source/Genes/Special/Patches/Patch_OrgasmRush.cs +++ b/1.6/Source/Genes/Special/Patches/Patch_OrgasmRush.cs @@ -23,10 +23,9 @@ namespace RJW_Genes if (props == null || props.pawn == null || !props.hasPartner()) return; - // Exit for Animals - Animals can't get or trigger Orgasm Rushes. - //if (props.pawn.IsAnimal() || props.partner.IsAnimal()) - if (props.pawn.IsAnimal()) - return; + // Exit for Animals - Animals can't get or trigger Orgasm Rushes. Fixes #15 + if (props.pawn.IsAnimal() || props.partner.IsAnimal()) + return; if (props.pawn.genes != null && props.pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_orgasm_rush)) { diff --git a/1.6/Source/Properties/AssemblyInfo.cs b/1.6/Source/Properties/AssemblyInfo.cs index 5dbde35..a2e00ed 100644 --- a/1.6/Source/Properties/AssemblyInfo.cs +++ b/1.6/Source/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Rjw-Genes")] -[assembly: AssemblyCopyright("Copyright © 2026")] +[assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,4 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.6.2")] +[assembly: AssemblyVersion("2.5.5.0")] +[assembly: AssemblyFileVersion("2.5.5.0")] diff --git a/1.6/Source/RJW_Genes.cs b/1.6/Source/RJW_Genes.cs index b7c0385..f40aed6 100644 --- a/1.6/Source/RJW_Genes.cs +++ b/1.6/Source/RJW_Genes.cs @@ -11,6 +11,8 @@ namespace RJW_Genes static RJW_Genes() { ModLog.Message("RJW-Genes loaded"); + + RJW_BGS.VGEHybridUtility.LogAllFoundVGEHybridDefinitions(); } } } diff --git a/1.6/Source/Rjw-Genes.csproj b/1.6/Source/Rjw-Genes.csproj index 6d77471..5bcad21 100644 --- a/1.6/Source/Rjw-Genes.csproj +++ b/1.6/Source/Rjw-Genes.csproj @@ -26,6 +26,19 @@ + + + + + + + + + + + + + @@ -200,8 +213,8 @@ - - ..\..\..\..\..\..\Steam\steamapps\workshop\content\294100\2009463077\Current\Assemblies\0Harmony.dll + + ..\..\..\..\..\..\Steam\steamapps\workshop\content\294100\2009463077\1.5\Assemblies\0Harmony.dll False diff --git a/About/About.xml b/About/About.xml index 41240b4..dce15c0 100644 --- a/About/About.xml +++ b/About/About.xml @@ -2,7 +2,7 @@ RJW Genes Vegapnk - 1.6 Rewrite by Telanda Vegapnk.rjw.genes - 2.6.2 + 2.5.5
  • 1.4
  • 1.5
  • diff --git a/About/Manifest.xml b/About/Manifest.xml index 0cd2bf9..8f7b83a 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@ RJW-Genes - 2.6.2 + 2.5.5
  • RimJobWorld
  • diff --git a/CHANGELOG.md b/CHANGELOG.md index e044bfc..1730913 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,35 +1,3 @@ -#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) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c27c658..a41147f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,7 +17,7 @@ But please consider also the following: ## Contributors -- Shabalox (MechBreeding, InsectBreeding) +- Shabalox (MechBreeding, InsectBreeding, Animal Gene Inheritance) - WasMachenDennSachen (Various Icons) - Jaaldabaoth (1.5 Migration, MPreg, Femboys, Initial VE-Genetic Hybrids) - Flock-of-Birds (Cosmetic Genitalia per XML) diff --git a/README.md b/README.md index 3663b7c..69a204c 100644 --- a/README.md +++ b/README.md @@ -14,19 +14,21 @@ This mod adds genes related and based on RJW to Rimworld. - Cum-Amount Changes, Transfer Nutrition Boosts - 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*. **Conflicts:** -1. 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. Alpha Genes "Female / Male Only" Genes might overwrite later Genitalia-Changes and should be avoided in combination with RJW-Genes features. +1. Should not be used with the original RJW_Animal_Gene_Inheritance anymore. +2. There was an issue with other "Male-Only / Female-Only" Mods --- for which we provide our own Genes now. +3. CAI5000 will not crash, but will make *Seduce*-Ability fail. I think same goes for Combat Extended. +4. Alpha Genes "Female / Male Only" Genes might overwrite later Genitalia-Changes and should be avoided in combination with RJW-Genes features. ## Structure -- Toplevel: By Function (i.E. "Genes", "Utility") +- Toplevel: By Function (i.E. "Genes", "Animal Inheritance", "Utility") - Then: By Domain, following the Gene-Categories ("Cosmetic","Special", "Damage",...) - Last: By Type of Action (Def, Patch, etc.)