Compare commits

..

No commits in common. "c20f36dafc685fb9ffd2fa28c35e2ebc105ca615" and "eef293f6f0a814a491742cf33f33213a5d0c70d3" have entirely different histories.

49 changed files with 184 additions and 380 deletions

Binary file not shown.

View file

@ -8,9 +8,6 @@
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes> <backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes> <backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li> </li>
<li Class="RJW_Genes.SexualizerGeneExtension">
<order>20</order>
</li>
</modExtensions> </modExtensions>
</GeneDef> </GeneDef>

View file

@ -11,9 +11,6 @@
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes> <backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes> <backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li> </li>
<li Class="RJW_Genes.SexualizerGeneExtension">
<order>50</order>
</li>
</modExtensions> </modExtensions>
</GeneDef> </GeneDef>
@ -75,9 +72,6 @@
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes> <backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes> <backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li> </li>
<li Class="RJW_Genes.SexualizerGeneExtension">
<order>50</order>
</li>
</modExtensions> </modExtensions>
</GeneDef> </GeneDef>

View file

@ -5,14 +5,11 @@
<!--These Genes need to be loaded quite late, otherwise e.g. genitalia types will re-roll and overrule genitalia size--> <!--These Genes need to be loaded quite late, otherwise e.g. genitalia types will re-roll and overrule genitalia size-->
<modExtensions> <modExtensions>
<li MayRequire="OskarPotocki.VanillaFactionsExpanded.Core" Class="VEF.Genes.GeneExtension"> <li MayRequire="OskarPotocki.VanillaFactionsExpanded.Core" Class="VEF.Genes.GeneExtension">
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes> <backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes> <backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li> </li>
<li Class="RJW_Genes.SexualizerGeneExtension"> </modExtensions>
<order>50</order>
</li>
</modExtensions>
</GeneDef> </GeneDef>
<!-- Penis --> <!-- Penis -->

View file

@ -14,9 +14,6 @@
<backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes> <backgroundPathEndogenes>Genes/Icons/RJW_Genes_Endogene_Background</backgroundPathEndogenes>
<backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes> <backgroundPathXenogenes>Genes/Icons/RJW_Genes_Xenogene_Background</backgroundPathXenogenes>
</li> </li>
<li Class="RJW_Genes.SexualizerGeneExtension">
<order>30</order>
</li>
</modExtensions> </modExtensions>
</GeneDef> </GeneDef>

View file

@ -11,9 +11,9 @@
<xpath>Defs/XenotypeDef[defName = "LoS_Lamia" <xpath>Defs/XenotypeDef[defName = "LoS_Lamia"
or defName = "LoS_TrueLamia" or defName = "LoS_TrueLamia"
or defName = "Naga" or defName = "Naga"
or defName = "LoS_Adderman" or defName = "Los_Adderman"
or defName = "LoS_Anacondaman" or defName = "Los_Anacondaman"
or defName = "LoS_Snakeman"]/genes</xpath> or defName = "Los_Snakeman"]/genes</xpath>
<value> <value>
<li>rjw_genes_reptilian_genitalia</li> <li>rjw_genes_reptilian_genitalia</li>
</value> </value>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Patch>
<Operation Class="PatchOperationFindMod">
<mods>
<li>Biotech Nyaron</li>
</mods>
<match Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="Nyaron"]/genes</xpath>
<value>
<li>rjw_genes_feline_genitalia</li>
</value>
</match>
</Operation>
</Patch>

View file

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

View file

@ -12,16 +12,4 @@
</value> </value>
</match> </match>
</Operation> </Operation>
<Operation Class="PatchOperationFindMod">
<mods>
<li>[CAP]Biotech Nyaron HAR Addition</li>
</mods>
<match Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="Nyaron"]/genes</xpath>
<value>
<li>rjw_genes_tight_female_genitalia</li>
<li>rjw_genes_feline_genitalia</li>
</value>
</match>
</Operation>
</Patch> </Patch>

View file

@ -2,10 +2,10 @@
<Patch> <Patch>
<Operation Class="PatchOperationFindMod"> <Operation Class="PatchOperationFindMod">
<mods> <mods>
<li>Papou Xenotype: Emotional Birds (Continued)</li> <li>Papou Race : emotional birds</li>
</mods> </mods>
<match Class="PatchOperationAdd"> <match Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="Papago"]/genes</xpath> <xpath>Defs/XenotypeDef[defName="papago"]/genes</xpath>
<value> <value>
<li>rjw_genes_orgasm_rush</li> <li>rjw_genes_orgasm_rush</li>
<li>rjw_genes_tight_female_genitalia</li> <li>rjw_genes_tight_female_genitalia</li>

View file

@ -7,7 +7,7 @@
<match Class="PatchOperationAdd"> <match Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="RBSF_Faun"]/genes</xpath> <xpath>Defs/XenotypeDef[defName="RBSF_Faun"]/genes</xpath>
<value> <value>
<li>rjw_genes_Needle_genitalia</li> <li>rjw_genes_equine_genitalia</li>
<li>rjw_genes_zoophile</li> <li>rjw_genes_zoophile</li>
<li>rjw_genes_mating_call</li> <li>rjw_genes_mating_call</li>
<li>rjw_genes_tight_female_genitalia</li> <li>rjw_genes_tight_female_genitalia</li>

View file

@ -7,10 +7,8 @@
<match Class="PatchOperationAdd"> <match Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="RBSF_Satyr"]/genes</xpath> <xpath>Defs/XenotypeDef[defName="RBSF_Satyr"]/genes</xpath>
<value> <value>
<li>rjw_genes_equine_genitalia</li>
<li>rjw_genes_aphrodisiac_pheromones</li> <li>rjw_genes_aphrodisiac_pheromones</li>
<li>rjw_genes_much_fluid</li> <li>rjw_genes_much_fluid</li>
<li>rjw_genes_zoophile</li>
</value> </value>
</match> </match>
</Operation> </Operation>

View file

@ -15,8 +15,8 @@ Global
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.Debug|Any CPU.Build.0 = Debug|Any CPU {D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.Debug|Any CPU.Build.0 = Release|Any CPU
{D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.Release|Any CPU.ActiveCfg = Release|Any CPU {D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.Release|Any CPU.Build.0 = Release|Any CPU {D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}.Release|Any CPU.Build.0 = Release|Any CPU
{3BF2C17E-C492-44DA-8BC4-7AF6ADEB6468}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3BF2C17E-C492-44DA-8BC4-7AF6ADEB6468}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

View file

@ -11,4 +11,5 @@ namespace RJW_Genes
{ {
public float chance; public float chance;
} }
} }

View file

@ -1,25 +0,0 @@
using Verse;
namespace RJW_Genes
{
/// <summary>
/// Used by the 'On Sexualization' Patch to determine if a gene needs to be applied, and what order to do so.
/// This Extension is applied to RJW related genes that Depend on the order they are Applied in,
/// using the following basic values
///
/// 10 Unused.
/// 20 Genes that Alter the Number of sexual parts a Pawn may have. (Includes the Zero Genes?)
/// 30 Genes that Alter the type of genitals a Pawn may have.
/// 40 Genes that Add a specific genital type to the pawn.
/// 50 Genes that alter the values on a pawns genitals such as size or fluid type.
/// </summary>
#pragma warning disable CS0649 //Disable the warning for a variable that is 'unset'.
internal class SexualizerGeneExtension : DefModExtension
{
public int order;
}
#pragma warning restore CS0649
}

View file

@ -1,50 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
internal static class Patch_RJWSexualizer
{
/// <summary>
/// This Harmony patch is called after Sexualiser, and runs all the genes on that pawn that would have not been functional before sexualization.
/// </summary>
public static void ApplyGenesPostfix(Pawn pawn)
{
//Generate a sorted list of Genes that need to be processed.
if (pawn == null) return;
Dictionary<int,List<Gene>> geneDict = new Dictionary<int,List<Gene>>();
if (pawn.genes == null) return;
foreach (Gene curGene in pawn.genes.GenesListForReading)
{
if (!curGene.def.HasModExtension<SexualizerGeneExtension>()) continue;
SexualizerGeneExtension geneExtension = curGene.def.GetModExtension<SexualizerGeneExtension>();
if (geneDict.ContainsKey(geneExtension.order))
{
geneDict[geneExtension.order].Add(curGene);
}
else
{
geneDict.Add(geneExtension.order, new List<Gene> { curGene });
}
}
//Once we have the List, iterate over it to run the relavant functions.
List<int> keysList = geneDict.Keys.ToList();
keysList.Sort();
foreach (int key in keysList)
{
foreach (var curGene in geneDict[key])
{
curGene.PostAdd();
}
}
}
}
}

View file

@ -15,7 +15,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>portable</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>..\..\Mods\Cumpilation\Assemblies\</OutputPath> <OutputPath>..\..\Mods\Cumpilation\Assemblies\</OutputPath>
<DefineConstants> <DefineConstants>

View file

@ -16,22 +16,22 @@ namespace RJW_Genes
// Some sources add Genes before they fire, e.g. Character Editor // Some sources add Genes before they fire, e.g. Character Editor
// This should harden the gene, to solve #19 // This should harden the gene, to solve #19
//if (HasAlreadyTwoAnus()) if (HasAlreadyTwoAnus())
//{ {
// return; return;
//} }
//if (additional_anus == null) if (additional_anus == null)
//{ {
// CreateAndAddAnus(); CreateAndAddAnus();
//} }
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
// Some sources add Genes before they fire, e.g. Character Editor // Some sources add Genes before they fire, e.g. Character Editor
// This should harden the gene, to solve #19 // This should harden the gene, to solve #19
if (HasAlreadyTwoAnus()) if (HasAlreadyTwoAnus())

View file

@ -16,23 +16,23 @@ namespace RJW_Genes
// Some sources add Genes before they fire, e.g. Character Editor // Some sources add Genes before they fire, e.g. Character Editor
// This should harden the gene, to solve #19 // This should harden the gene, to solve #19
//if (HasAlreadyTwoBreasts()) if (HasAlreadyTwoBreasts())
//{ {
// return; return;
//} }
//// Tits are only added for female pawns! // Tits are only added for female pawns!
//if (GenderUtility.IsFemale(pawn) && additional_breasts == null) if (GenderUtility.IsFemale(pawn) && additional_breasts == null)
//{ {
// CreateAndAddBreasts(); CreateAndAddBreasts();
//} }
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
// Some sources add Genes before they fire, e.g. Character Editor // Some sources add Genes before they fire, e.g. Character Editor
// This should harden the gene, to solve #19 // This should harden the gene, to solve #19
if (HasAlreadyTwoBreasts()) if (HasAlreadyTwoBreasts())

View file

@ -16,23 +16,23 @@ namespace RJW_Genes
// Some sources add Genes before they fire, e.g. Character Editor // Some sources add Genes before they fire, e.g. Character Editor
// This should harden the gene, to solve #19 // This should harden the gene, to solve #19
//if (HasAlreadyTwoPenis()) if (HasAlreadyTwoPenis())
//{ {
// return; return;
//} }
// Penis are only added for male pawns! // Penis are only added for male pawns!
//if (GenderUtility.IsMale(pawn) && additional_penis == null) if (GenderUtility.IsMale(pawn) && additional_penis == null)
//{ {
// CreateAndAddPenis(); CreateAndAddPenis();
//} }
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
// Some sources add Genes before they fire, e.g. Character Editor // Some sources add Genes before they fire, e.g. Character Editor
// This should harden the gene, to solve #19 // This should harden the gene, to solve #19
if (HasAlreadyTwoPenis()) if (HasAlreadyTwoPenis())

View file

@ -21,23 +21,23 @@ namespace RJW_Genes
// Some sources add Genes before they fire, e.g. Character Editor // Some sources add Genes before they fire, e.g. Character Editor
// This should harden the gene, to solve #19 // This should harden the gene, to solve #19
//if (HasAlreadyTwoVaginas()) if (HasAlreadyTwoVaginas())
//{ {
// return; return;
//} }
//// Vaginas are only added for female pawns! // Vaginas are only added for female pawns!
//if (GenderUtility.IsFemale(pawn) && additional_vagina == null) if (GenderUtility.IsFemale(pawn) && additional_vagina == null)
//{ {
// CreateAndAddVagina(); CreateAndAddVagina();
//} }
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
// Some sources add Genes before they fire, e.g. Character Editor // Some sources add Genes before they fire, e.g. Character Editor
// This should harden the gene, to solve #19 // This should harden the gene, to solve #19
if (HasAlreadyTwoVaginas()) if (HasAlreadyTwoVaginas())

View file

@ -11,18 +11,18 @@ namespace RJW_Genes
{ {
base.PostMake(); base.PostMake();
//if (removed_breasts == null) if (removed_breasts == null)
//{ {
// RemoveButStoreBreasts(); RemoveButStoreBreasts();
// AddFeaturelessBreast(); AddFeaturelessBreast();
//} }
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
if (removed_breasts == null) if (removed_breasts == null)
{ {
RemoveButStoreBreasts(); RemoveButStoreBreasts();

View file

@ -15,7 +15,6 @@ namespace RJW_Genes
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
if (GenderUtility.IsMale(this.pawn) && this.additional_genital == null) if (GenderUtility.IsMale(this.pawn) && this.additional_genital == null)
{ {
this.CreateAndAddVagina(); this.CreateAndAddVagina();

View file

@ -19,7 +19,7 @@ namespace RJW_Genes
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
// If the Pawn is already a Futa, do not do anything. Can Happen by Base-RJW Spawn Chance or potentially races / other mods. // If the Pawn is already a Futa, do not do anything. Can Happen by Base-RJW Spawn Chance or potentially races / other mods.
if (IsAlreadyFuta(pawn)) if (IsAlreadyFuta(pawn))
{ {

View file

@ -13,17 +13,17 @@ namespace RJW_Genes
{ {
base.PostMake(); base.PostMake();
//if (removed_anus == null) if (removed_anus == null)
//{ {
// RemoveButStoreAnus(); RemoveButStoreAnus();
//} }
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
if (removed_anus == null) if (removed_anus == null)
{ {
RemoveButStoreAnus(); RemoveButStoreAnus();

View file

@ -13,18 +13,18 @@ namespace RJW_Genes
{ {
base.PostMake(); base.PostMake();
//// Breasts are removed for female pawns! // Breasts are removed for female pawns!
//if (GenderUtility.IsFemale(pawn) && oldSize < 0) if (GenderUtility.IsFemale(pawn) && oldSize < 0)
//{ {
// RemoveButStoreBreasts(); RemoveButStoreBreasts();
//} }
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
// Breasts are removed for female pawns! // Breasts are removed for female pawns!
if (GenderUtility.IsFemale(pawn) && oldSize < 0) if (GenderUtility.IsFemale(pawn) && oldSize < 0)
{ {

View file

@ -13,18 +13,18 @@ namespace RJW_Genes
{ {
base.PostMake(); base.PostMake();
//// Penis are only removed for male pawns! // Penis are only removed for male pawns!
//if (GenderUtility.IsMale(pawn) && removed_penis == null) if (GenderUtility.IsMale(pawn) && removed_penis == null)
//{ {
// RemoveButStorePenis(); RemoveButStorePenis();
//} }
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
// Penis are only removed for male pawns! // Penis are only removed for male pawns!
if (GenderUtility.IsMale(pawn) && removed_penis == null) if (GenderUtility.IsMale(pawn) && removed_penis == null)
{ {

View file

@ -14,17 +14,17 @@ namespace RJW_Genes
base.PostMake(); base.PostMake();
// Vaginas are only removed for female pawns! // Vaginas are only removed for female pawns!
//if (GenderUtility.IsFemale(pawn) && removed_vagina == null) if (GenderUtility.IsFemale(pawn) && removed_vagina == null)
//{ {
// RemoveButStoreVagina(); RemoveButStoreVagina();
//} }
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
// Vaginas are only removed for female pawns! // Vaginas are only removed for female pawns!
if (GenderUtility.IsFemale(pawn) && removed_vagina == null) if (GenderUtility.IsFemale(pawn) && removed_vagina == null)
{ {

View file

@ -27,7 +27,7 @@ namespace RJW_Genes
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
AddUdders(); AddUdders();
} }

View file

@ -9,16 +9,15 @@
{ {
base.PostMake(); base.PostMake();
//float multipier = FluidUtility.LookupFluidMultiplier(this); float multipier = FluidUtility.LookupFluidMultiplier(this);
//FluidUtility.MultiplyFluidAmountBy(pawn, multipier); FluidUtility.MultiplyFluidAmountBy(pawn, multipier);
//has_been_fired = true; has_been_fired = true;
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
if (!has_been_fired) if (!has_been_fired)
{ {
float multipier = FluidUtility.LookupFluidMultiplier(this); float multipier = FluidUtility.LookupFluidMultiplier(this);

View file

@ -18,7 +18,6 @@ namespace RJW_Genes
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
Apply(); Apply();
} }

View file

@ -15,10 +15,8 @@ namespace RJW_Genes
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostMake(); base.PostMake();
if (this.Active) { AdjustPawnToFemale();
AdjustPawnToFemale(); GenderUtility.RemoveSexChangeThoughtsIfTooYoung(this.pawn);
GenderUtility.RemoveSexChangeThoughtsIfTooYoung(this.pawn);
}
} }
private void AdjustPawnToFemale() private void AdjustPawnToFemale()

View file

@ -56,16 +56,14 @@ namespace RJW_Genes
// Case 2: Check every interval if the Chance triggers // Case 2: Check every interval if the Chance triggers
else if (pawn.IsHashIntervalTick(change_interval) && (new Random()).NextDouble() < switch_chance) else if (pawn.IsHashIntervalTick(change_interval) && (new Random()).NextDouble() < switch_chance)
{ {
// Case 2.A - if the Pawn is Pregnant, do not allow sex change this interval.
if (pawn.IsPregnant()) return;
// Case 2.B) SexChange was blocked, postpone it // Case 2.A) SexChange was blocked, postpone it
if (SexChangeBlocked(pawn)) if (SexChangeBlocked(pawn))
{ {
sexChangeWasBlocked |= true; sexChangeWasBlocked |= true;
return; return;
} }
// Case 2.C) Nothing blocking, change the sex. // Case 2.B) Nothing blocking, change the sex.
else { ChangeSex();} else { ChangeSex();}
} }

View file

@ -15,11 +15,8 @@ namespace RJW_Genes
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostMake(); base.PostMake();
if (this.Active) AdjustPawnToMale();
{ GenderUtility.RemoveSexChangeThoughtsIfTooYoung(this.pawn);
AdjustPawnToMale();
GenderUtility.RemoveSexChangeThoughtsIfTooYoung(this.pawn);
}
} }
private void AdjustPawnToMale() private void AdjustPawnToMale()

View file

@ -13,7 +13,6 @@ namespace RJW_Genes
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
Apply(); Apply();
} }

View file

@ -32,18 +32,17 @@ namespace RJW_Genes
public override void PostMake() public override void PostMake()
{ {
base.PostMake(); base.PostMake();
//if (pawn.ageTracker.AgeBiologicalYears >= RJW_Genes_Settings.rjw_genes_resizing_age) if (pawn.ageTracker.AgeBiologicalYears >= RJW_Genes_Settings.rjw_genes_resizing_age)
//{ {
// Resize(); Resize();
// ResizingWasApplied = true; ResizingWasApplied = true;
//} }
} }
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
base.PostAdd(); base.PostAdd();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) return; //If pawn hasn't been sexualized yet, skip.
if (pawn.ageTracker.AgeBiologicalYears >= RJW_Genes_Settings.rjw_genes_resizing_age) if (pawn.ageTracker.AgeBiologicalYears >= RJW_Genes_Settings.rjw_genes_resizing_age)
{ {
Resize(); Resize();

View file

@ -46,13 +46,8 @@ namespace RJW_Genes
} }
// Increase Fluid // Increase Fluid
// Increase Fluid, if it's already above 10x don't increase to avoid crash issues. if (CompHediff != null)
if (CompHediff != null && (CompHediff.partFluidMultiplier < 100))
{
CompHediff.partFluidMultiplier *= 1.05f; CompHediff.partFluidMultiplier *= 1.05f;
if (CompHediff.partFluidMultiplier > 100)
CompHediff.partFluidMultiplier = 100;
}
} }
} }

View file

@ -38,6 +38,7 @@ namespace RJW_Genes
ModLog.Message("Pawn: " + __instance.pawn.NameShortColored + " (" + __instance.pawn.ThingID + ")"); ModLog.Message("Pawn: " + __instance.pawn.NameShortColored + " (" + __instance.pawn.ThingID + ")");
ModLog.Message("birthCount: " + laborStateMap.TryGetValue(__instance.pawn.ThingID).birthCount); ModLog.Message("birthCount: " + laborStateMap.TryGetValue(__instance.pawn.ThingID).birthCount);
} }
return; return;
} }
@ -45,7 +46,7 @@ namespace RJW_Genes
if (laborStateIsNull && hasLitteredBirthsGene) if (laborStateIsNull && hasLitteredBirthsGene)
{ {
ModLog.Message("Found littered births gene"); ModLog.Message("Found littered births gene");
int litteredBirthsTotalRoll = Rand.RangeInclusive(1, 3); int litteredBirthsTotalRoll = Rand.RangeInclusive(2, 4);
laborStateMap.SetOrAdd(__instance.pawn.ThingID, new LaborState(__instance.pawn, litteredBirthsTotalRoll)); laborStateMap.SetOrAdd(__instance.pawn.ThingID, new LaborState(__instance.pawn, litteredBirthsTotalRoll));
return; return;
} }
@ -118,7 +119,7 @@ namespace RJW_Genes
return; return;
} }
if (currentLaborState.birthTotal <= currentLaborState.birthCount) if (currentLaborState.birthTotal == currentLaborState.birthCount)
{ {
laborStateMap.Remove(__instance.pawn.ThingID); laborStateMap.Remove(__instance.pawn.ThingID);
if (__instance.pawn.health.hediffSet.HasHediff(HediffDef.Named("Bioscaffold"))) if (__instance.pawn.health.hediffSet.HasHediff(HediffDef.Named("Bioscaffold")))

View file

@ -6,11 +6,8 @@ using System.Threading.Tasks;
using rjw; using rjw;
using Verse; using Verse;
namespace RJW_Genes namespace RJW_Genes
{ {
[Obsolete]
internal static class Patch_sexualize_pawn internal static class Patch_sexualize_pawn
{ {
/// <summary> /// <summary>

View file

@ -19,7 +19,12 @@ namespace RJW_Genes
public override void PostAdd() public override void PostAdd()
{ {
if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns. if (pawn.kindDef == null) return; //Added to catch Rimworld creating statues of pawns.
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
{
Sexualizer.sexualize_pawn(pawn);
}
base.PostAdd(); base.PostAdd();
} }
@ -32,8 +37,5 @@ namespace RJW_Genes
public virtual void Notify_OnPawnGeneration() public virtual void Notify_OnPawnGeneration()
{ {
} }
public virtual void Notify_OnPawnSexualization() { }
} }
} }

View file

@ -59,13 +59,9 @@ namespace RJW_Genes
} }
CompHediff.UpdateSeverity(); CompHediff.UpdateSeverity();
// Increase Fluid, if it's already above 10x don't increase to avoid crash issues. // Increase Fluid
if (CompHediff != null && (CompHediff.partFluidMultiplier < 100)) if (CompHediff != null)
{
CompHediff.partFluidMultiplier *= cum_multiplier; CompHediff.partFluidMultiplier *= cum_multiplier;
if (CompHediff.partFluidMultiplier > 100)
CompHediff.partFluidMultiplier = 100;
}
} }
} }

View file

@ -48,12 +48,10 @@ namespace RJW_Genes
//harmony.Patch(AccessTools.Method(typeof(Quirk), nameof(Quirk.CountSatisfiedQuirks)), //harmony.Patch(AccessTools.Method(typeof(Quirk), nameof(Quirk.CountSatisfiedQuirks)),
//postfix: new HarmonyMethod(typeof(QuirkPatcher), nameof(QuirkPatcher.CountSatisfiedPostfix))); //postfix: new HarmonyMethod(typeof(QuirkPatcher), nameof(QuirkPatcher.CountSatisfiedPostfix)));
//RJW.Sexualizer.sexualize_pawn //RJW.Sexualizer.sexualize_pawn
harmony.Patch(AccessTools.Method(typeof(Sexualizer), nameof(Sexualizer.sexualize_pawn)), harmony.Patch(AccessTools.Method(typeof(Sexualizer), nameof(Sexualizer.sexualize_pawn)),
//prefix: new HarmonyMethod(typeof(Patch_sexualize_pawn), nameof(Patch_sexualize_pawn.PreFix))); //Old Method that ran Sexualize early. prefix: new HarmonyMethod(typeof(Patch_sexualize_pawn), nameof(Patch_sexualize_pawn.PreFix)));
postfix: new HarmonyMethod(typeof(Patch_RJWSexualizer), nameof(Patch_RJWSexualizer.ApplyGenesPostfix)));
//Patch for Elastic Gene support with Eltoro's Streching mod. //Patch for Elastic Gene support with Eltoro's Streching mod.

View file

@ -32,4 +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.7.0")] [assembly: AssemblyVersion("2.6.2")]

View file

@ -22,16 +22,6 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit> <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<OutputPath>..\Assemblies\</OutputPath>
<Optimize>true</Optimize>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>9</LangVersion>
<ErrorReport>prompt</ErrorReport>
<DebugType>portable</DebugType>
<DebugSymbols>true</DebugSymbols>
<DefineConstants>TRACE;DEBUG</DefineConstants>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<None Include="..\About\**" /> <None Include="..\About\**" />
</ItemGroup> </ItemGroup>
@ -41,7 +31,6 @@
<Compile Include="Common\Defs\HediffIncreaseOnSexExtension.cs" /> <Compile Include="Common\Defs\HediffIncreaseOnSexExtension.cs" />
<Compile Include="Common\Defs\ModExtensionHelper.cs" /> <Compile Include="Common\Defs\ModExtensionHelper.cs" />
<Compile Include="Common\Defs\MultiplierExtension.cs" /> <Compile Include="Common\Defs\MultiplierExtension.cs" />
<Compile Include="Common\Defs\SexualizerGeneExtension.cs" />
<Compile Include="Common\Defs\TickBasedChanceExtension.cs" /> <Compile Include="Common\Defs\TickBasedChanceExtension.cs" />
<Compile Include="Common\Either.cs" /> <Compile Include="Common\Either.cs" />
<Compile Include="Common\Helpers\FactionUtility.cs" /> <Compile Include="Common\Helpers\FactionUtility.cs" />
@ -52,7 +41,6 @@
<Compile Include="Common\Patches\PatchImplants.cs" /> <Compile Include="Common\Patches\PatchImplants.cs" />
<Compile Include="Common\Patches\Patch_HediffIncreaseOnSex.cs" /> <Compile Include="Common\Patches\Patch_HediffIncreaseOnSex.cs" />
<Compile Include="Common\Patches\Patch_ParentRelationUtility_GetParents.cs" /> <Compile Include="Common\Patches\Patch_ParentRelationUtility_GetParents.cs" />
<Compile Include="Common\Patches\Patch_RJWSexualizer.cs" />
<Compile Include="Genes\Breeding\Abilities\CompAbilityEffect_MatingCall.cs" /> <Compile Include="Genes\Breeding\Abilities\CompAbilityEffect_MatingCall.cs" />
<Compile Include="Genes\Breeding\Abilities\CompAbilityEffect_PheromoneSpit.cs" /> <Compile Include="Genes\Breeding\Abilities\CompAbilityEffect_PheromoneSpit.cs" />
<Compile Include="Genes\Breeding\Abilities\CompProperties_AbilityMatingCall.cs" /> <Compile Include="Genes\Breeding\Abilities\CompProperties_AbilityMatingCall.cs" />

View file

@ -1,64 +1,27 @@
<ModMetaData> <ModMetaData>
<name>RJW Genes</name> <name>RJW Genes</name>
<authors> <author>Vegapnk - 1.6 Rewrite by Telanda</author>
<li>Vegapnk</li>
<li>1.6 Rewrite by Telanda</li>
</authors>
<packageId>Vegapnk.rjw.genes</packageId> <packageId>Vegapnk.rjw.genes</packageId>
<modVersion>2.7.0</modVersion> <modVersion>2.6.2</modVersion>
<supportedVersions> <supportedVersions>
<li>1.4</li> <li>1.4</li>
<li>1.5</li> <li>1.5</li>
<li>1.6</li> <li>1.6</li>
</supportedVersions> </supportedVersions>
<description>Adds Genes for RJW Content. <description>
Adds Genes for RJW Content.
Adds: Adds:
- Genes for Genitalia Types and Sizes - Genes for Genitalia Types and Sizes
- Fertilin, a resource similiar to Hemogen, and accompanying sex-vampires - Fertilin, a resource similiar to Hemogen, and accompanying sex-vampires
- Mechanics for Breeding and being Breed by Animals and Insects - Mechanics for Breeding and being Breed by Animals and Insects
- Inherit genes from bestiality or produce VGE-Hybrids
- Male / Female Only, MPreg, Genderfluid Pawns - Male / Female Only, MPreg, Genderfluid Pawns
- Orgasmic Mytosis, Orgasmic Supercharging, Age-Transfer on Sex, Pheromones - Orgasmic Mytosis, Orgasmic Supercharging, Age-Transfer on Sex, Pheromones
- Cum-Amount changes, Cumflation Immunity - Cum-Amount changes, Cumflation Immunity
- Horny Pheromones, Animal Mating Call - Horny Pheromones, Animal Mating Call
- Genetic Diseases that Spread on Intercourse - Genetic Diseases that Spread on Intercourse
- Patches for some popular Xenotypes from the Workshop
- Sexual Taming of Animals - Sexual Taming of Animals
Patches for the following Xenotype Mods
- Alpha Genes
- Biotech Expansion - Mammalia
- Biotech Expansion - Mythic
- Biotech Nyaron
- Big and Small Heaven and Hell
- Big and Small More Xenotypes
- Big and Small - Races
- Big and Small - Slimes
- Big and Small - Lamias and other Snake-People
- Big and Small - Vampires and the Undead
- Big and Small - Yokai
- Erin's Auronya
- Erin's Shisune
- Kijin Race 3.0
- NaraiXenotype
- Obsidia Expansion - Arachnas Xenotype
- Papou Xenotype: Emotional Birds (Continued)
- Rimsenal Xenotype Pack - Askbarn
- Roo's Faun Xenotype
- Roo's Minotaur Xenotype
- Roo's Satyr Xenotype
- Vanilla Races Expanded - Android
- Vanilla Races Expanded - Archon
- Vanilla Races Expanded - Fungoid
- Vanilla Races Expanded - Genie
- Vanilla Races Expanded - Highmate
- Vanilla Races Expanded - Lycanthrope
- Vanilla Races Expanded - Pigskin
- Vanilla Races Expanded - Phytokin
- Vanilla Races Expanded - Sanguophage
- Vanilla Races Expanded - Saurid
- [LTS]Xenotech
For Feedback or Support please see the Rimjob World Discord!
https://discord.gg/UWZ3WfVWeK
</description> </description>
<url>https://github.com/vegapnk/RJW-Genes</url> <url>https://github.com/vegapnk/RJW-Genes</url>
<modDependencies> <modDependencies>
@ -77,51 +40,27 @@ https://discord.gg/UWZ3WfVWeK
<steamWorkshopUrl>steam://url/CommunityFilePage/2009463077</steamWorkshopUrl> <steamWorkshopUrl>steam://url/CommunityFilePage/2009463077</steamWorkshopUrl>
<downloadUrl>https://github.com/pardeike/HarmonyRimWorld/releases/latest</downloadUrl> <downloadUrl>https://github.com/pardeike/HarmonyRimWorld/releases/latest</downloadUrl>
</li> </li>
<!--
<li>
<packageId>vegapnk.cumpilation</packageId>
<displayName>Cumpilation</displayName>
<steamWorkshopUrl></steamWorkshopUrl>
<downloadUrl>https://github.com/vegapnk/Cumpilation</downloadUrl>
</li>
-->
</modDependencies> </modDependencies>
<loadAfter> <loadAfter>
<li>ASMR.RJW.RaceSupport</li>
<li>biotexpans.insect</li>
<li>biotexpans.mammalia</li>
<li>biotexpans.mythic</li>
<li>brrainz.harmony</li>
<li>CaptoLamia.NyaronBioTechHAR</li>
<li>erin.auronyabiotech</li>
<li>erin.shisune</li>
<li>Ludeon.RimWorld.Biotech</li>
<li>Ludeon.RimWorld.Ideology</li>
<li>Ludeon.RimWorld.Royalty</li>
<li>Ludeon.RimWorld</li> <li>Ludeon.RimWorld</li>
<li>lyzz.naraixenotype</li> <li>Ludeon.RimWorld.Royalty</li>
<li>obsidiaexpansion.xenos.arachnas</li> <li>Ludeon.RimWorld.Ideology</li>
<li>OskarPotocki.VanillaFactionsExpanded.Core</li> <li>Ludeon.RimWorld.Biotech</li>
<li>oskarpotocki.vfe.empire</li>
<li>redmattis.bsslimes</li>
<li>redmattis.heaven</li>
<li>redmattis.lamiasandothersnakes</li>
<li>redmattis.undead</li>
<li>redmattis.yokai</li>
<li>rim.job.world</li> <li>rim.job.world</li>
<li>rimsenal.askbarn</li> <li>brrainz.harmony</li>
<li>rjw.sexperience.cumgenes</li> <li>OskarPotocki.VanillaFactionsExpanded.Core</li>
<li>sarg.alphaanimals</li> <li>sarg.alphaanimals</li>
<li>sarg.alphagenes</li>
<li>Sl4vP0weR.DominantGene</li> <li>Sl4vP0weR.DominantGene</li>
<li>ssulunge.kijinrace3</li> <li>rjw.sexperience.cumgenes</li>
<li>tug.minotaur</li>
<li>tug.satyr</li>
<li>v.rooboid.faun</li>
<li>VanillaExpanded.VGeneticsE</li>
<li>vanillaracesexpanded.android</li>
<li>vanillaracesexpanded.archon</li>
<li>vanillaracesexpanded.fungoid</li>
<li>vanillaracesexpanded.genie</li>
<li>vanillaracesexpanded.highmate</li>
<li>vanillaracesexpanded.lycanthrope</li>
<li>vanillaracesexpanded.phytokin</li>
<li>vanillaracesexpanded.sanguophage</li>
<li>vanillaracesexpanded.saurid</li>
<li>vegapnk.cumpilation</li> <li>vegapnk.cumpilation</li>
<li>zal.papou</li>
</loadAfter> </loadAfter>
</ModMetaData> </ModMetaData>

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.7.0</version> <version>2.6.2</version>
<dependencies> <dependencies>
<li>RimJobWorld</li> <li>RimJobWorld</li>
</dependencies> </dependencies>

View file

@ -1,51 +1,4 @@
# 2.7.0 (23-07-2026) #INPROG
(Commit by @Telanda-DDS)
### Fixes.
- Rewrite of how Genital Genes handle non-Sexualised pawns, should address most 'extra genitals' bugs.
- Gender Fluid no longer allows sex changes while a pawn is pregnant.
- Updated Big & Small - Lamia Patches to account for changes in Def Capitalisation.
- Hormonal Saliva & Evergrowth now have a caps on fluid production, pawns should no longer grow so productive their cumshots crash the game.
### Xenotypes.
I've done a Check over the included xenotype patches, A few Xenotypes that hadn't been updated to 1.6 have been removed, and minor fixes Applied to other races. The current Supported Xenotype list is as following.
- Alpha Genes
- Biotech Expansion - Mammalia
- Biotech Expansion - Mythic
- Biotech Nyaron
- Big and Small Heaven and Hell
- Big and Small More Xenotypes
- Big and Small - Races
- Big and Small - Slimes
- Big and Small - Lamias and other Snake-People
- Big and Small - Vampires and the Undead
- Big and Small - Yokai
- Erin's Auronya
- Erin's Shisune
- Kijin Race 3.0
- NaraiXenotype
- Obsidia Expansion - Arachnas Xenotype
- Papou Xenotype: Emotional Birds (Continued)
- Rimsenal Xenotype Pack - Askbarn
- Roo's Faun Xenotype
- Roo's Minotaur Xenotype
- Roo's Satyr Xenotype
- Vanilla Races Expanded - Android
- Vanilla Races Expanded - Archon
- Vanilla Races Expanded - Fungoid
- Vanilla Races Expanded - Genie
- Vanilla Races Expanded - Highmate
- Vanilla Races Expanded - Lycanthrope
- Vanilla Races Expanded - Pigskin
- Vanilla Races Expanded - Phytokin
- Vanilla Races Expanded - Sanguophage
- Vanilla Races Expanded - Saurid
- \[LTS\]Xenotech
### Known Issues.
- Fertile Anus gene is Unreliable, and does not work with Biotech Pregnancies Enabled in RJW. (Waiting for large Upstream patch to RJW Core to be accepted.)
# 2.6.2 (15-02-2026) # 2.6.2 (15-02-2026)
(Commit by @Telanda-DDS) (Commit by @Telanda-DDS)