Added two genes for steal and swap genes on sex

This commit is contained in:
Vegapnk 2024-07-04 16:04:51 +02:00
parent b15f0c4d56
commit b12e9afbc0
8 changed files with 192 additions and 3 deletions

View file

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

View file

@ -105,6 +105,8 @@ namespace RJW_Genes
public static readonly GeneDef rjw_genes_hormonal_saliva;
public static readonly GeneDef rjw_genes_cocoonweaver;
public static readonly GeneDef rjw_genes_sex_tamer;
public static readonly GeneDef rjw_genes_sexual_genetic_swap;
public static readonly GeneDef rjw_genes_sexual_genetic_thief;
// Cosmetic
public static readonly GeneDef rjw_genes_succubus_tail;

View file

@ -0,0 +1,69 @@
using HarmonyLib;
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
[HarmonyPatch(typeof(SexUtility), "Aftersex")]
public class Patch_GeneticSexSwap
{
public static void Postfix(SexProps props)
{
if (props == null || props.pawn == null || props.partner == null || props.partner.IsAnimal())
{
return;
}
Pawn pawn = props.pawn;
Pawn partner = props.partner;
if (pawn.genes == null || partner.genes == null) return;
// If both have the swap gene, nothing happens
if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_sexual_genetic_swap)
&& GeneUtility.HasGeneNullCheck(partner, GeneDefOf.rjw_genes_sexual_genetic_swap))
return;
// If neither has the swap gene, nothing happens
if (!GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_sexual_genetic_swap)
&& !GeneUtility.HasGeneNullCheck(partner, GeneDefOf.rjw_genes_sexual_genetic_swap))
return;
ChanceExtension chanceExt = GeneDefOf.rjw_genes_sexual_genetic_swap.GetModExtension<ChanceExtension>();
if (chanceExt != null && (new Random()).NextDouble() < chanceExt.chance)
SwapOneRandomGene(pawn, partner);
}
/// <summary>
/// Removes a random gene from one pawn and adds it too the other as xenogene.
/// The "gene swap" gene cannot be swapped!
/// </summary>
private static void SwapOneRandomGene(Pawn a, Pawn b, bool AddAsXenogene = true)
{
var geneFromA = a.genes.GenesListForReading
.Where(gene => a.genes.HasActiveGene(gene.def))
.Where(gene => gene.def != GeneDefOf.rjw_genes_sexual_genetic_swap)
.RandomElement();
var geneFromB = b.genes.GenesListForReading
.Where(gene => b.genes.HasActiveGene(gene.def))
.Where(gene => gene.def != GeneDefOf.rjw_genes_sexual_genetic_swap)
.RandomElement();
if (geneFromA == null || geneFromB == null) return;
ModLog.Debug($"Sexual Genetic Swap: Swapping {geneFromA.def} from {a} with {geneFromB.def} from {b}");
a.genes.AddGene(geneFromB.def, AddAsXenogene);
b.genes.AddGene(geneFromA.def, AddAsXenogene);
a.genes.RemoveGene(geneFromA);
b.genes.RemoveGene(geneFromB);
}
}
}

View file

@ -0,0 +1,68 @@
using HarmonyLib;
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
[HarmonyPatch(typeof(SexUtility), "Aftersex")]
public class Patch_GeneticSexThief
{
public static void Postfix(SexProps props)
{
if (props == null || props.pawn == null || props.partner == null || props.partner.IsAnimal())
{
return;
}
Pawn pawn = props.pawn;
Pawn partner = props.partner;
if (pawn.genes == null || partner.genes == null) return;
// If both have the swap gene, nothing happens
if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_sexual_genetic_thief)
&& GeneUtility.HasGeneNullCheck(partner, GeneDefOf.rjw_genes_sexual_genetic_thief))
return;
if (GeneUtility.HasGeneNullCheck(pawn,GeneDefOf.rjw_genes_sexual_genetic_thief) &&
!GeneUtility.HasGeneNullCheck(partner, GeneDefOf.rjw_genes_genetic_disease_immunity))
{
ChanceExtension chanceExt = GeneDefOf.rjw_genes_sexual_genetic_thief.GetModExtension<ChanceExtension>();
if (chanceExt != null && (new Random()).NextDouble() < chanceExt.chance)
StealRandomGene(pawn, partner);
}
if (GeneUtility.HasGeneNullCheck(partner, GeneDefOf.rjw_genes_sexual_genetic_thief) &&
!GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_genetic_disease_immunity))
{
ChanceExtension chanceExt = GeneDefOf.rjw_genes_sexual_genetic_thief.GetModExtension<ChanceExtension>();
if (chanceExt != null && (new Random()).NextDouble() < chanceExt.chance)
StealRandomGene(partner, pawn);
}
}
/// <summary>
/// Removes a random gene from one pawn and adds it too the other as xenogene.
/// </summary>
private static void StealRandomGene(Pawn stealer, Pawn victim, bool AddAsXenogene = true)
{
var stolenGene = victim.genes.GenesListForReading
.Where(gene => victim.genes.HasActiveGene(gene.def))
.RandomElement();
if (stolenGene == null) return;
ModLog.Debug($"Sexual Gene Thief: {stealer} steals {stolenGene.def} from {victim}");
stealer.genes.AddGene(stolenGene.def, AddAsXenogene);
victim.genes.RemoveGene(stolenGene);
}
}
}

View file

@ -12,7 +12,6 @@ namespace RJW_Genes
[HarmonyPatch(typeof(SexUtility), "Aftersex")]
public class Patch_HormonalSaliva
{
// TODO: Reduce to 0.02 after debug.
const float SIZE_INCREMENT_FALLBACK = 0.02f;
const float MAX_BODY_SIZE_FALLBACK = 2.5f;
const float CUM_MULTIPLIER_FALLBACK = 1.05f;

View file

@ -56,6 +56,7 @@
<Compile Include="Animal_Inheritance\Settings\RJW_BGSSettings.cs" />
<Compile Include="Animal_Inheritance\Settings\RJW_BGSSettingsController.cs" />
<Compile Include="Animal_Inheritance\Defs\BestialityGeneInheritanceDef.cs" />
<Compile Include="Common\Defs\ChanceExtension.cs" />
<Compile Include="Common\Defs\DistanceExtension.cs" />
<Compile Include="Common\Defs\ModExtensionHelper.cs" />
<Compile Include="Common\Defs\TickBasedChanceExtension.cs" />
@ -188,6 +189,8 @@
<Compile Include="Genes\Special\Defs\AgeTransferExtension.cs" />
<Compile Include="Genes\Special\Defs\HormonalSalivaExtension.cs" />
<Compile Include="Genes\Special\Patches\Patch_AgeDrain.cs" />
<Compile Include="Genes\Special\Patches\Patch_GeneticSexSwap.cs" />
<Compile Include="Genes\Special\Patches\Patch_GeneticSexThief.cs" />
<Compile Include="Genes\Special\Patches\Patch_HormonalSaliva.cs" />
<Compile Include="Genes\Special\Patches\Patch_OrgasmMytosis.cs" />
<Compile Include="Genes\Special\Patches\Patch_SexualTamer.cs" />