Fixed Anus Replacement, added sample gene to add extra penis or no penis, added License

This commit is contained in:
Vegapnk 2022-11-14 15:55:52 +01:00
parent b30b108c55
commit bb679527af
21 changed files with 431 additions and 64 deletions

BIN
.LICENSE.txt.swp Normal file

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<GeneDef Name="GeneExtraGenitaliaBase" Abstract="True">
<displayCategory>rjw_genes_genitalia</displayCategory>
<!--
<exclusionTags>
<li>GenitalType</li>
</exclusionTags>
<biostatCpx>0</biostatCpx>
<biostatMet>0</biostatMet>
-->
</GeneDef>
<GeneDef ParentName="GeneExtraGenitaliaBase">
<defName>rjw_genes_extra_penis</defName>
<label>extra penis</label>
<description>Males of this species grow an additional penis .</description>
<iconPath>Genes/Icons/Placeholder</iconPath>
<geneClass>RJW_Genes.Gene_ExtraPenis</geneClass>
<displayOrderInCategory>15</displayOrderInCategory>
<exclusionTags>
<li>PenisAmount</li>
</exclusionTags>
</GeneDef>
<GeneDef ParentName="GeneExtraGenitaliaBase">
<defName>rjw_genes_no_penis</defName>
<label>no penis</label>
<description>Males of this do not have a penis.</description>
<iconPath>Genes/Icons/Placeholder</iconPath>
<geneClass>RJW_Genes.Gene_NoPenis</geneClass>
<displayOrderInCategory>16</displayOrderInCategory>
<exclusionTags>
<li>PenisAmount</li>
</exclusionTags>
</GeneDef>
</Defs>

View File

@ -6,8 +6,8 @@
<exclusionTags>
<li>GenitalType</li>
</exclusionTags>
<!--
<biostatCpx>0</biostatCpx>
<!--
<biostatMet>0</biostatMet>
-->
</GeneDef>

View File

@ -101,6 +101,18 @@
</li>
</operations>
</Operation>
<Operation Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="Genie"]/genes</xpath>
<value>
<li>rjw_genes_human_genitalia</li>
</value>
</li>
</operations>
</Operation>
<!-- SPECIAL Penises -->
@ -128,18 +140,6 @@
</operations>
</Operation>
<Operation Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAdd">
<xpath>Defs/XenotypeDef[defName="Genie"]/genes</xpath>
<value>
<li>rjw_genes_slime_genitalia</li>
</value>
</li>
</operations>
</Operation>
<Operation Class="PatchOperationSequence">
<success>Always</success>
<operations>

9
LICENSE.txt Normal file
View File

@ -0,0 +1,9 @@
Copyright 2022 Vegapnk
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -8,6 +8,7 @@ namespace RJW_Genes
{
[MayRequireBiotech] public static readonly GeneCategoryDef rjw_genes_genitalia;
// Base Genitalia Types
[MayRequireBiotech] public static readonly GeneDef rjw_genes_human_genitalia;
[MayRequireBiotech] public static readonly GeneDef rjw_genes_equine_genitalia;
[MayRequireBiotech] public static readonly GeneDef rjw_genes_demonic_genitalia;
@ -16,5 +17,9 @@ namespace RJW_Genes
[MayRequireBiotech] public static readonly GeneDef rjw_genes_ovipositor_genitalia;
[MayRequireBiotech] public static readonly GeneDef rjw_genes_feline_genitalia;
[MayRequireBiotech] public static readonly GeneDef rjw_genes_canine_genitalia;
// Extra Genitalia
[MayRequireBiotech] public static readonly GeneDef rjw_genes_extra_penis;
[MayRequireBiotech] public static readonly GeneDef rjw_genes_no_penis;
}
}

View File

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<GeneDef Name="GeneGenitalTypeBase" Abstract="True">
<displayCategory>rjw_genes_genitalia</displayCategory>
<exclusionTags>
<li>GenitalType</li>
</exclusionTags>
<biostatCpx>0</biostatCpx>
<!--
<biostatMet>0</biostatMet>
-->
</GeneDef>
<GeneDef ParentName="GeneGenitalTypeBase">
<defName>rjw_genes_human_genitalia</defName>
<label>human genitalia</label>
<description>Carriers of this carry genitalia similar to humans.</description>
<iconPath>Genes/Icons/Placeholder</iconPath>
<geneClass>RJW_Genes.Gene_HumanGenitalia</geneClass>
<displayOrderInCategory>1</displayOrderInCategory>
</GeneDef>
<GeneDef ParentName="GeneGenitalTypeBase">
<defName>rjw_genes_equine_genitalia</defName>
<label>equine genitalia</label>
<description>Carriers of this gene develop equine genitalia.</description>
<iconPath>Genes/Icons/Placeholder</iconPath>
<geneClass>RJW_Genes.Gene_EquineGenitalia</geneClass>
<displayOrderInCategory>2</displayOrderInCategory>
</GeneDef>
<GeneDef ParentName="GeneGenitalTypeBase">
<defName>rjw_genes_canine_genitalia</defName>
<label>canine genitalia</label>
<description>Carriers of this gene develop canine genitalia.</description>
<iconPath>Genes/Icons/Placeholder</iconPath>
<geneClass>RJW_Genes.Gene_CanineGenitalia</geneClass>
<displayOrderInCategory>3</displayOrderInCategory>
</GeneDef>
<GeneDef ParentName="GeneGenitalTypeBase">
<defName>rjw_genes_feline_genitalia</defName>
<label>feline genitalia</label>
<description>Carriers of this gene develop feline genitalia.</description>
<iconPath>Genes/Icons/Placeholder</iconPath>
<geneClass>RJW_Genes.Gene_FelineGenitalia</geneClass>
<displayOrderInCategory>4</displayOrderInCategory>
</GeneDef>
<GeneDef ParentName="GeneGenitalTypeBase">
<defName>rjw_genes_demonic_genitalia</defName>
<label>demonic genitalia</label>
<description>Carriers of this gene have demonic genitalia.</description>
<iconPath>Genes/Icons/Placeholder</iconPath>
<geneClass>RJW_Genes.Gene_DemonicGenitalia</geneClass>
<displayOrderInCategory>5</displayOrderInCategory>
</GeneDef>
<GeneDef ParentName="GeneGenitalTypeBase">
<defName>rjw_genes_dragon_genitalia</defName>
<label>dragon genitalia</label>
<description>Carriers of this gene develop dragon genitalia.</description>
<iconPath>Genes/Icons/Placeholder</iconPath>
<geneClass>RJW_Genes.Gene_DragonGenitalia</geneClass>
<displayOrderInCategory>6</displayOrderInCategory>
</GeneDef>
<GeneDef ParentName="GeneGenitalTypeBase">
<defName>rjw_genes_slime_genitalia</defName>
<label>slime genitalia</label>
<description>Carriers of this gene have slime genitalia.</description>
<iconPath>Genes/Icons/Placeholder</iconPath>
<geneClass>RJW_Genes.Gene_SlimeGenitalia</geneClass>
<displayOrderInCategory>7</displayOrderInCategory>
</GeneDef>
<GeneDef ParentName="GeneGenitalTypeBase">
<defName>rjw_genes_ovipositor_genitalia</defName>
<label>insect genitalia</label>
<description>Carriers of this gene have ovipositors similar to insects.</description>
<iconPath>Genes/Icons/Placeholder</iconPath>
<geneClass>RJW_Genes.Gene_OvipositorGenitalia</geneClass>
<displayOrderInCategory>8</displayOrderInCategory>
</GeneDef>
</Defs>

View File

@ -0,0 +1,61 @@
using Verse;
using rjw;
using RimWorld;
namespace RJW_Genes
{
public class Gene_ExtraPenis : Gene
{
internal Hediff additional_penis;
public override void PostMake()
{
base.PostMake();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
Sexualizer.sexualize_pawn(pawn);
// Penis are only added for male pawns!
if (pawn.gender == Gender.Male && additional_penis == null)
{
createAndAddPenis();
}
}
public override void PostAdd()
{
base.PostAdd();
// Penis are only added for male pawns!
if (pawn.gender == Gender.Male && additional_penis == null)
{
createAndAddPenis();
}
}
public override void PostRemove()
{
base.PostRemove();
if(additional_penis != null)
pawn.health.RemoveHediff(additional_penis);
}
internal void createAndAddPenis()
{
var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn);
var penisDef = GenitaliaUtility.GetPenisForGene(correctGene);
var partBPR = Genital_Helper.get_genitalsBPR(pawn);
additional_penis = HediffMaker.MakeHediff(penisDef, pawn);
var CompHediff = additional_penis.TryGetComp<rjw.CompHediffBodyPart>();
if (CompHediff != null)
{
CompHediff.initComp(pawn);
CompHediff.updatesize();
}
pawn.health.AddHediff(additional_penis, partBPR);
}
}
}

View File

@ -0,0 +1,58 @@
using Verse;
using rjw;
using RimWorld;
namespace RJW_Genes
{
public class Gene_NoPenis : Gene
{
internal Hediff removed_penis;
// TODO: This gene only works if another Gene was set specifying the genitalia.
// If it is added later, it still works, but on creation it needs a different
public override void PostMake()
{
base.PostMake();
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
Sexualizer.sexualize_pawn(pawn);
// Penis are only added for male pawns!
if (pawn.gender == Gender.Male && removed_penis == null)
{
RemoveButStorePenis();
}
}
public override void PostAdd()
{
base.PostAdd();
// Penis are only added for male pawns!
if (pawn.gender == Gender.Male && removed_penis == null)
{
RemoveButStorePenis();
}
}
public override void PostRemove()
{
base.PostRemove();
if(removed_penis != null)
pawn.health.AddHediff(removed_penis);
}
internal void RemoveButStorePenis()
{
var partBPR = Genital_Helper.get_genitalsBPR(pawn);
Hediff penisToRemove = Genital_Helper.get_AllPartsHediffList(pawn).FindLast(x => Genital_Helper.is_penis(x));
if(penisToRemove != null)
{
removed_penis = penisToRemove;
pawn.health.RemoveHediff(penisToRemove);
}
}
}
}

View File

@ -8,14 +8,16 @@ namespace RJW_Genes
public override void PostMake()
{
base.PostMake();
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.changeGenitalia(this.pawn,Genital_Helper.canine_penis,Genital_Helper.canine_vagina,Genital_Helper.generic_anus);
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.canine_penis,Genital_Helper.canine_vagina,Genital_Helper.generic_anus);
}
public override void PostAdd()
{
base.PostMake();
GenitaliaChanger.changeGenitalia(this.pawn, Genital_Helper.canine_penis, Genital_Helper.canine_vagina, Genital_Helper.generic_anus);
GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.canine_penis, Genital_Helper.canine_vagina, Genital_Helper.generic_anus);
}
}

View File

@ -9,14 +9,16 @@ namespace RJW_Genes
public override void PostMake()
{
base.PostMake();
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.changeGenitalia(this.pawn,Genital_Helper.demon_penis,Genital_Helper.demon_vagina,Genital_Helper.demon_anus);
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.demon_penis,Genital_Helper.demon_vagina,Genital_Helper.demon_anus);
}
public override void PostAdd()
{
base.PostMake();
GenitaliaChanger.changeGenitalia(this.pawn, Genital_Helper.demon_penis, Genital_Helper.demon_vagina, Genital_Helper.demon_anus);
GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.demon_penis, Genital_Helper.demon_vagina, Genital_Helper.demon_anus);
}
}

View File

@ -8,14 +8,16 @@ namespace RJW_Genes
public override void PostMake()
{
base.PostMake();
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.changeGenitalia(this.pawn,Genital_Helper.dragon_penis,Genital_Helper.dragon_vagina,Genital_Helper.generic_anus);
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.dragon_penis,Genital_Helper.dragon_vagina,Genital_Helper.generic_anus);
}
public override void PostAdd()
{
base.PostMake();
GenitaliaChanger.changeGenitalia(this.pawn, Genital_Helper.dragon_penis, Genital_Helper.dragon_vagina, Genital_Helper.generic_anus);
GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.dragon_penis, Genital_Helper.dragon_vagina, Genital_Helper.generic_anus);
}
}

View File

@ -8,14 +8,16 @@ namespace RJW_Genes
public override void PostMake()
{
base.PostMake();
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.changeGenitalia(this.pawn,Genital_Helper.equine_penis,Genital_Helper.equine_vagina,Genital_Helper.generic_anus);
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.equine_penis,Genital_Helper.equine_vagina,Genital_Helper.generic_anus);
}
public override void PostAdd()
{
base.PostMake();
GenitaliaChanger.changeGenitalia(this.pawn, Genital_Helper.equine_penis, Genital_Helper.equine_vagina, Genital_Helper.generic_anus);
GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.equine_penis, Genital_Helper.equine_vagina, Genital_Helper.generic_anus);
}
}

View File

@ -8,14 +8,16 @@ namespace RJW_Genes
public override void PostMake()
{
base.PostMake();
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.changeGenitalia(this.pawn,Genital_Helper.feline_penis,Genital_Helper.feline_vagina,Genital_Helper.generic_anus);
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.feline_penis,Genital_Helper.feline_vagina,Genital_Helper.generic_anus);
}
public override void PostAdd()
{
base.PostMake();
GenitaliaChanger.changeGenitalia(this.pawn, Genital_Helper.feline_penis, Genital_Helper.feline_vagina, Genital_Helper.generic_anus);
GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.feline_penis, Genital_Helper.feline_vagina, Genital_Helper.generic_anus);
}
}

View File

@ -8,14 +8,16 @@ namespace RJW_Genes
public override void PostMake()
{
base.PostMake();
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.changeGenitalia(this.pawn,Genital_Helper.average_penis,Genital_Helper.average_vagina,Genital_Helper.average_anus);
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.average_penis,Genital_Helper.average_vagina,Genital_Helper.average_anus);
}
public override void PostAdd()
{
base.PostAdd();
GenitaliaChanger.changeGenitalia(this.pawn, Genital_Helper.average_penis, Genital_Helper.average_vagina, Genital_Helper.average_anus);
GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.average_penis, Genital_Helper.average_vagina, Genital_Helper.average_anus);
}
}

View File

@ -8,14 +8,16 @@ namespace RJW_Genes
public override void PostMake()
{
base.PostMake();
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.changeGenitalia(this.pawn,Genital_Helper.ovipositorM,Genital_Helper.ovipositorF,Genital_Helper.insect_anus);
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.ovipositorM,Genital_Helper.ovipositorF,Genital_Helper.insect_anus);
}
public override void PostAdd()
{
base.PostMake();
GenitaliaChanger.changeGenitalia(this.pawn, Genital_Helper.ovipositorM, Genital_Helper.ovipositorF, Genital_Helper.insect_anus);
GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.ovipositorM, Genital_Helper.ovipositorF, Genital_Helper.insect_anus);
}
}

View File

@ -8,14 +8,16 @@ namespace RJW_Genes
public override void PostMake()
{
base.PostMake();
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.changeGenitalia(this.pawn,Genital_Helper.slime_penis,Genital_Helper.slime_vagina,Genital_Helper.slime_anus);
if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
Sexualizer.sexualize_pawn(pawn);
GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.slime_penis,Genital_Helper.slime_vagina,Genital_Helper.slime_anus);
}
public override void PostAdd()
{
base.PostMake();
GenitaliaChanger.changeGenitalia(this.pawn, Genital_Helper.slime_penis, Genital_Helper.slime_vagina, Genital_Helper.slime_anus);
GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.slime_penis, Genital_Helper.slime_vagina, Genital_Helper.slime_anus);
}
}

View File

@ -11,16 +11,15 @@ namespace RJW_Genes
/// <summary>
/// This method changes the pawns genitalia to the given types of genitalia.
/// All genitals will be changed, e.g. pawns with 2 penises (for whatever reason) or is a futa, all genitals will be changed.
/// Anuses are currently not changed, due to a small bug.
/// </summary>
/// <param name="pawn">the pawn who's genitals will be changed</param>
/// <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 (currently disabled)</param>
public static void changeGenitalia(Pawn pawn, HediffDef penisReplacement, HediffDef vaginaReplacement, HediffDef anusReplacement)
/// <param name="anusReplacement">the new type of anus</param>
public static void ChangeGenitalia(Pawn pawn, HediffDef penisReplacement, HediffDef vaginaReplacement, HediffDef anusReplacement)
{
var oldParts = Genital_Helper.get_AllPartsHediffList(pawn);
var partBPR = Genital_Helper.get_genitalsBPR(pawn);
var oldParts = Genital_Helper.get_AllPartsHediffList(pawn);
BodyPartRecord correctBPR;
if (!oldParts.NullOrEmpty())
{
@ -31,16 +30,21 @@ namespace RJW_Genes
{
if (IsArtificial(existingGenital))
continue;
correctBPR = Genital_Helper.get_genitalsBPR(pawn);
replacementGenital = null;
CompHediff = null;
if (IsPenis(existingGenital))
replacementGenital = HediffMaker.MakeHediff(penisReplacement, pawn, partBPR);
if (Genital_Helper.is_penis(existingGenital))
replacementGenital = HediffMaker.MakeHediff(penisReplacement, pawn, correctBPR);
if (IsVagina(existingGenital))
replacementGenital = HediffMaker.MakeHediff(vaginaReplacement, pawn, partBPR);
if (Genital_Helper.is_vagina(existingGenital))
replacementGenital = HediffMaker.MakeHediff(vaginaReplacement, pawn, correctBPR);
//TODO: Adding Anus in this way had an issue by multiplying Anusses. At the moment Anus are not covered.
if (IsAnus(existingGenital))
{
correctBPR = Genital_Helper.get_anusBPR(pawn);
replacementGenital = HediffMaker.MakeHediff(anusReplacement, pawn, correctBPR);
}
if (replacementGenital != null)
{
@ -53,7 +57,7 @@ namespace RJW_Genes
GenderHelper.ChangeSex(pawn, () =>
{
pawn.health.RemoveHediff(existingGenital);
pawn.health.AddHediff(replacementGenital, partBPR);
pawn.health.AddHediff(replacementGenital, correctBPR);
});
}
}
@ -66,21 +70,6 @@ namespace RJW_Genes
}
private static bool IsPenis(Hediff candidate)
{
return
candidate.def.defName.ToLower().Contains("penis") ||
candidate.def.defName.ToLower().Contains("ovipositorm") ||
candidate.def.defName.ToLower().Contains("tentacle");
}
private static bool IsVagina(Hediff candidate)
{
return
candidate.def.defName.ToLower().Contains("vagina") ||
candidate.def.defName.ToLower().Contains("ovipositorf");
}
private static bool IsAnus(Hediff candidate)
{
return candidate.def.defName.ToLower().Contains("anus"); }

View File

@ -0,0 +1,93 @@
using RimWorld;
using Verse;
using rjw;
namespace RJW_Genes
{
public class GenitaliaUtility
{
/// <summary>
/// Returns the first (non) overwritten gene from the rjw_genes genitalia genes.
/// In case the pawn has none, as default the human one is returned.
/// </summary>
/// <param name="pawn">the pawn whom to find genitaliagenes for</param>
/// <returns>The first GeneDef of the pawn related to GenitaliaTypes</returns>
public static GeneDef GetGenitaliaTypeGeneForPawn(Pawn pawn)
{
foreach (var gene in pawn.genes.GenesListForReading)
{
if (gene.def.defName.Contains("rjw_genes") && gene.def.defName.EndsWith("_genitalia"))
if (!gene.Overridden)
return gene.def;
}
return GeneDefOf.rjw_genes_human_genitalia;
}
/// <summary>
/// Adds a genital created from a given Def to the pawn.
/// Does not alter/touch gender.
/// </summary>
/// <param name="pawn">The pawn whom to add the genital to,</param>
/// <param name="genitalToAdd">The type of genital to be added</param>
public static void AddGenitalToPawn(Pawn pawn,HediffDef genitalToAdd)
{
if (pawn == null || genitalToAdd == null)
return;
var partBPR = Genital_Helper.get_genitalsBPR(pawn);
var additionalGenital = HediffMaker.MakeHediff(genitalToAdd, pawn);
var CompHediff = additionalGenital.TryGetComp<rjw.CompHediffBodyPart>();
if (CompHediff != null)
{
CompHediff.initComp(pawn);
CompHediff.updatesize();
}
pawn.health.AddHediff(additionalGenital, partBPR);
}
public static HediffDef GetPenisForGene(GeneDef gene)
{
switch (gene.defName)
{
case "rjw_genes_human_genitalia": return Genital_Helper.average_penis;
case "rjw_genes_equine_genitalia": return Genital_Helper.equine_penis;
case "rjw_genes_canine_genitalia": return Genital_Helper.canine_penis;
case "rjw_genes_feline_genitalia": return Genital_Helper.feline_penis;
case "rjw_genes_demonic_genitalia": return Genital_Helper.demon_penis;
case "rjw_genes_dragon_genitalia": return Genital_Helper.dragon_penis;
case "rjw_genes_slime_genitalia": return Genital_Helper.slime_penis;
case "rjw_genes_ovipositor_genitalia": return Genital_Helper.ovipositorM;
default: return Genital_Helper.average_penis;
}
}
public static bool PawnStillNeedsGenitalia(Pawn pawn)
{
// There is the issue that the genes fire in a pseudo-random order
// Hence it can happen that the pawn still needs genitalia
// I wanted to make a simple lookup, but I think the genes are applied for all humans encountered so it could be huge
// So the heuristic is to check if the pawn has any of the 3 standard genitalia OR has all genes ticked that says "I don't want genitalia".
if (pawn == null) return false;
bool pawn_has_any_genitalia =
Genital_Helper.has_genitals(pawn) || Genital_Helper.has_anus(pawn) || Genital_Helper.has_breasts(pawn);
bool pawn_is_not_supposed_to_have_genitalia =
pawn.genes.GenesListForReading.Any(x => x.def.defName == "rjw_genes_no_penis");
if (pawn_is_not_supposed_to_have_genitalia)
return false;
else
return !pawn_has_any_genitalia;
}
}
}

View File

@ -28,6 +28,7 @@
</Reference>
<Reference Include="RJW">
<HintPath>..\..\rjw\1.4\Assemblies\RJW.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@ -40,12 +41,16 @@
<Private>False</Private>
</Reference>
<None Include="..\About\**" />
<None Include="..\Common\Defs\**" />
<None Include="..\Common\Defs\Genes\GeneCategories.xml" />
<None Include="..\Common\Defs\Genes\GeneDefs_ExtraGenitaliaEndogenes.xml" />
<None Include="..\Common\Defs\Genes\GeneDefs_GenitaliaTypeEndogenes.xml" />
<None Include="..\Common\Languages\**" />
<None Include="..\Common\Patches\**" />
</ItemGroup>
<ItemGroup>
<Compile Include="GeneDefOf.cs" />
<Compile Include="Genes\ExtraGenitalia\Gene_NoPenis.cs" />
<Compile Include="Genes\ExtraGenitalia\Gene_ExtraPenis.cs" />
<Compile Include="Genes\Genitalia\Gene_SlimeGenitalia.cs" />
<Compile Include="Genes\Genitalia\Gene_DragonGenitalia.cs" />
<Compile Include="Genes\Genitalia\Gene_FelineGenitalia.cs" />
@ -55,8 +60,12 @@
<Compile Include="Genes\Genitalia\Gene_EquineGenitalia.cs" />
<Compile Include="Genes\Genitalia\Gene_HumanGenitalia.cs" />
<Compile Include="Genes\Genitalia\GenitaliaChanger.cs" />
<Compile Include="GenitaliaUtility.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RJW_Genes.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="GeneDefs_GenitaliaTypeEndogenes.xml" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>