2024-07-05 14:03:42 +00:00
using HarmonyLib ;
using RimWorld ;
using rjw ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.Threading.Tasks ;
using Verse ;
using static HarmonyLib . Code ;
namespace RJW_Genes
{
[HarmonyPatch(typeof(SexUtility), "Aftersex")]
public class Patch_PregnancyOverwrite
{
public const int FACTION_GOODWILL_CHANGE = - 5 ;
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_pregnancy_overwrite )
& & GeneUtility . HasGeneNullCheck ( partner , GeneDefOf . rjw_genes_pregnancy_overwrite ) )
return ;
// If both are pregnant, we have some weird interaction. Exit Early
if ( pawn . IsPregnant ( ) & & partner . IsPregnant ( ) )
return ;
// If neither are pregnant, nothing can happen.
if ( ! pawn . IsPregnant ( ) & & ! partner . IsPregnant ( ) )
return ;
ModLog . Debug ( "Firing Pregnancy Overwrite Patch - Passed Simple NullChecks" ) ;
if ( pawn . IsPregnant ( )
& & GeneUtility . HasGeneNullCheck ( partner , GeneDefOf . rjw_genes_pregnancy_overwrite ) )
TryReplacePregnancy ( partner , pawn ) ;
if ( partner . IsPregnant ( )
& & GeneUtility . HasGeneNullCheck ( pawn , GeneDefOf . rjw_genes_pregnancy_overwrite ) )
TryReplacePregnancy ( pawn , partner ) ;
}
2024-07-08 17:23:27 +00:00
/// <summary>
/// Tries to replace an existing pregnancy with a new pregnancy at the same gestation process.
/// The new pregnancy will have the same mother, but a new father and a new set of genes.
///
/// There is a check for pregnancy that checks for the general fertility (using Vanilla Functions) and multiplies it with a xml-configurable chance.
/// If anything is replaced, there will be a faction penalty applied.
/// </summary>
/// <param name="replacer"></param>
/// <param name="pregnant"></param>
2024-07-05 14:03:42 +00:00
public static void TryReplacePregnancy ( Pawn replacer , Pawn pregnant )
{
2024-07-08 17:23:27 +00:00
2024-07-05 14:03:42 +00:00
ModLog . Debug ( $"Firing Pregnancy Overwrite for {replacer} and {pregnant}" ) ;
Hediff pregnancyHediff = PregnancyUtility . GetPregnancyHediff ( pregnant ) ;
if ( pregnancyHediff = = null )
return ;
2024-07-08 17:23:27 +00:00
if ( DiseaseHelper . IsImmuneAgainstGeneticDisease ( pregnant , GeneDefOf . rjw_genes_pregnancy_overwrite ) )
{
ModLog . Debug ( $"{pregnant} is immune against rjw_genes_pregnancy_overwrite from {replacer}" ) ;
return ;
}
2024-07-05 14:03:42 +00:00
2024-07-08 17:23:27 +00:00
ChanceExtension chanceExt = GeneDefOf . rjw_genes_pregnancy_overwrite . GetModExtension < ChanceExtension > ( ) ;
float chance = chanceExt ! = null ? chanceExt . chance : 0.25f ;
chance * = PregnancyUtility . PregnancyChanceForPartners ( pregnant , replacer ) ;
2024-07-05 14:03:42 +00:00
2024-07-08 17:23:27 +00:00
if ( ( new Random ( ) ) . Next ( ) < chance )
{
float gestationProgress = pregnancyHediff . Severity ;
PregnancyUtility . ForceEndPregnancy ( pregnant ) ;
PregnancyHelper . StartVanillaPregnancy ( pregnant , replacer ) ;
Hediff replacementPregnancyHediff = PregnancyUtility . GetPregnancyHediff ( pregnant ) ;
replacementPregnancyHediff . Severity = gestationProgress ;
FactionUtility . HandleFactionGoodWillPenalties ( replacer , pregnant , "rjw_genes_GoodwillChangedReason_OverwritePregnancy" , FACTION_GOODWILL_CHANGE ) ;
} else
{
ModLog . Debug ( $"Did not Pregnancy-Overwrite for {replacer} and {pregnant}. Failed: roll<({chanceExt.chance} x {PregnancyUtility.PregnancyChanceForPartners(pregnant,replacer)}[PregnancyChance for Pawns])" ) ;
}
2024-07-05 14:03:42 +00:00
}
}
}