This commit is contained in:
Jaaldabaoth 2024-06-04 13:08:37 +02:00
parent 951085ec59
commit 25008ce5dc
48 changed files with 2345 additions and 59 deletions

View file

@ -55,6 +55,18 @@ namespace RJW_Genes
compHediffBodyPart.updatesize(0f);
}
this.pawn.health.AddHediff(this.additional_genital, part, null, null);
foreach (Gene g in pawn.genes.GenesListForReading)
{
if (g.def.defName == "rjw_genes_hydrolic_genitalia")
{
g.PostAdd();
}
if (g.def.defName == "rjw_genes_bionic_genitalia")
{
g.PostAdd();
return;
}
}
}
// Token: 0x040001B0 RID: 432

View file

@ -36,6 +36,18 @@ namespace RJW_Genes
});
GenderUtility.AdjustBodyToTargetGender(pawn, Gender.Female);
}
foreach(Gene g in pawn.genes.GenesListForReading)
{
if(g.def.defName== "rjw_genes_hydrolic_genitalia")
{
g.PostAdd();
}
if (g.def.defName == "rjw_genes_bionic_genitalia")
{
g.PostAdd();
return;
}
}
}
public override void Notify_OnPawnGeneration()

View file

@ -36,6 +36,18 @@ namespace RJW_Genes
});
GenderUtility.AdjustBodyToTargetGender(pawn, Gender.Male);
}
foreach (Gene g in pawn.genes.GenesListForReading)
{
if (g.def.defName == "rjw_genes_hydrolic_genitalia")
{
g.PostAdd();
}
if (g.def.defName == "rjw_genes_bionic_genitalia")
{
g.PostAdd();
return;
}
}
}
public override void Notify_OnPawnGeneration()

View file

@ -11,5 +11,8 @@ namespace RJW_Genes
public HediffDef_PartBase vagina;
public HediffDef_PartBase anus;
public HediffDef_PartBase breasts;
}
}

View file

@ -17,7 +17,7 @@ namespace RJW_Genes
Apply();
}
protected virtual void Apply()
public virtual void Apply()
{
if (this.Active)
{
@ -27,7 +27,7 @@ namespace RJW_Genes
ModLog.Error($"Gene {def} failed to change genitals - Need a modExtension with Class=\"{typeof(GenitaliaTypeExtension).FullName}\".");
return;
}
GenitaliaChanger.ChangeGenitalia(pawn, genitals.penis, genitals.vagina, genitals.anus);
GenitaliaChanger.ChangeGenitalia(pawn, genitals.penis, genitals.vagina, genitals.anus, genitals.breasts);
}
}
}

View file

@ -2,6 +2,7 @@
using RimWorld;
using Verse;
using System.Collections.Generic;
using rjw.Modules.Interactions.DefModExtensions;
namespace RJW_Genes
{
@ -16,7 +17,7 @@ namespace RJW_Genes
/// <param name="penisReplacement">the new type of penis</param>
/// <param name="vaginaReplacement">the new type of vagina</param>
/// <param name="anusReplacement">the new type of anus</param>
public static void ChangeGenitalia(Pawn pawn, HediffDef penisReplacement = null, HediffDef vaginaReplacement = null, HediffDef anusReplacement = null)
public static void ChangeGenitalia(Pawn pawn, HediffDef penisReplacement = null, HediffDef vaginaReplacement = null, HediffDef anusReplacement = null , HediffDef breastsReplacement = null)
{
var oldParts = Genital_Helper.get_AllPartsHediffList(pawn);
BodyPartRecord correctBPR;
@ -40,6 +41,12 @@ namespace RJW_Genes
if (Genital_Helper.is_vagina(existingGenital) && vaginaReplacement != null && existingGenital.def != vaginaReplacement)
replacementGenital = HediffMaker.MakeHediff(vaginaReplacement, pawn, correctBPR);
if (is_breast(existingGenital) && breastsReplacement != null && existingGenital.def != breastsReplacement)
{
correctBPR = Genital_Helper.get_breastsBPR(pawn);
replacementGenital = HediffMaker.MakeHediff(breastsReplacement, pawn, correctBPR);
}
if (IsAnus(existingGenital) && anusReplacement != null && existingGenital.def != anusReplacement)
{
correctBPR = Genital_Helper.get_anusBPR(pawn);
@ -74,7 +81,18 @@ namespace RJW_Genes
{
return candidate.def.defName.ToLower().Contains("anus"); }
public static bool IsArtificial(Hediff candidate)
public static bool is_breast(Hediff hed)
{
if (!GenitalPartExtension.TryGet(hed, out var ext))
{
return false;
}
return ext.family == rjw.Modules.Interactions.Enums.GenitalFamily.Breasts;
}
public static bool IsArtificial(Hediff candidate)
{
return candidate.def.defName.ToLower().Contains("bionic") || candidate.def.defName.ToLower().Contains("archo");
}
@ -88,5 +106,7 @@ namespace RJW_Genes
}
}
}
}

View file

@ -16,12 +16,11 @@ namespace RJW_Genes
/// <returns>The first GeneDef of the pawn related to GenitaliaTypes</returns>
public static GeneDef GetGenitaliaTypeGeneForPawn(Pawn pawn)
{
foreach (var gene in pawn.genes.GenesListForReading)
{
foreach (var gene in pawn.genes.GenesListForReading)
{
if (gene is Gene_GenitaliaType)
if (!gene.Overridden)
return gene.def;
return gene.def;
}
return null;
}
@ -46,23 +45,7 @@ namespace RJW_Genes
public static HediffDef GetBreastsForGene(GeneDef gene)
{
if (gene == null)
return Genital_Helper.average_breasts;
switch (gene.defName)
{
//TODO: Do I want the default to be generic or average?
case "rjw_genes_equine_genitalia": return Genital_Helper.average_breasts;
case "rjw_genes_canine_genitalia": return Genital_Helper.average_breasts;
case "rjw_genes_feline_genitalia": return Genital_Helper.average_breasts;
case "rjw_genes_demonic_genitalia": return Genital_Helper.average_breasts;
case "rjw_genes_dragon_genitalia": return Genital_Helper.average_breasts;
case "rjw_genes_slime_genitalia": return Genital_Helper.slime_breasts;
case "rjw_genes_udder_breasts": return Genital_Helper.udder_breasts;
case "rjw_genes_ovipositor_genitalia": return Genital_Helper.average_breasts;
default: return Genital_Helper.average_breasts;
}
return gene?.GetModExtension<GenitaliaTypeExtension>()?.breasts ?? Genital_Helper.average_breasts;
}
public static bool PawnStillNeedsGenitalia(Pawn pawn)

View file

@ -0,0 +1,13 @@
using Verse;
using RimWorld;
using rjw;
using System;
namespace RJW_Genes
{
public class QirkExtension : DefModExtension
{
public String Satisfiedquirk;
}
}

View file

@ -0,0 +1,60 @@
using Verse;
using RimWorld;
using rjw;
using System.Collections.Generic;
using rjw.Modules.Quirks;
using System;
namespace RJW_Genes
{
public class QuirkPatcher
{
public static void CountSatisfiedPostfix(ref int __result, SexProps props)
{
Pawn pawn = props.pawn;
Pawn partner = props.partner;
if(pawn!=null && partner != null)
{
if(!pawn.IsHuman()||!partner.IsHuman())
{
return;
}
}
int count = -1;
List<string> listquirk = new List<string>();
string s;
foreach (Gene g in partner.genes.GenesListForReading)
{
if (partner.genes.HasActiveGene(g.def))
{
s = null;
s = g.def?.GetModExtension<QirkExtension>()?.Satisfiedquirk;
if (!string.IsNullOrEmpty(s))
{
listquirk.Add(s);
}
}
}
foreach (Quirk q in Quirk.All)
{
if (pawn.Has(q))
{
foreach (string s2 in listquirk)
{
if (!string.IsNullOrEmpty(s2))
if (q.LocaliztionKey==s2)
{
count++;
Quirk.AddThought(pawn);
}
}
}
}
if(count>0)__result = __result + count;
return;
}
}
}

View file

@ -1,5 +1,6 @@
using HarmonyLib;
using RimWorld;
using RimWorld.BaseGen;
using RimWorld.QuestGen;
using rjw;
using rjw.Modules.Shared.Extensions;
@ -10,6 +11,7 @@ using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
@ -24,13 +26,19 @@ namespace RJW_Genes
private const float SEVERITY_INCREASE_PER_ORGASM = 0.075f;
public static void Postfix(JobDriver_Sex __instance)
public static void Postfix(JobDriver_Sex __instance)
{
Pawn orgasmingPawn = __instance.pawn;
if (orgasmingPawn != null && GeneUtility.HasGeneNullCheck(orgasmingPawn, GeneDefOf.rjw_genes_sexual_mytosis) && ! orgasmingPawn.health.hediffSet.HasHediff(HediffDefOf.rjw_genes_mytosis_shock_hediff))
bool hasPollutedMytosis = false;
if (orgasmingPawn != null && (GeneUtility.HasGeneNullCheck(orgasmingPawn, GeneDefOf.rjw_genes_sexual_mytosis) || hasPollutedMytosis) && ! orgasmingPawn.health.hediffSet.HasHediff(HediffDefOf.rjw_genes_mytosis_shock_hediff))
{
var mytosisHediff = GetOrgasmMytosisHediff(orgasmingPawn);
mytosisHediff.Severity += SEVERITY_INCREASE_PER_ORGASM;
if(hasPollutedMytosis && orgasmingPawn.Spawned && GridsUtility.IsPolluted(orgasmingPawn.Position, orgasmingPawn.Map))
{
mytosisHediff.Severity -= SEVERITY_INCREASE_PER_ORGASM;
}
if (mytosisHediff.Severity >= 1.0)
{
@ -295,6 +303,8 @@ namespace RJW_Genes
}
}
/*