diff --git a/Common/Assemblies/Rjw-Genes.dll b/Common/Assemblies/Rjw-Genes.dll
index 6446c8d..f5555d1 100644
Binary files a/Common/Assemblies/Rjw-Genes.dll and b/Common/Assemblies/Rjw-Genes.dll differ
diff --git a/Common/Defs/Genes/GeneDefs_ExtraGenitaliaEndogenes.xml b/Common/Defs/Genes/GeneDefs_ExtraGenitaliaEndogenes.xml
index 4adc957..575a7e0 100644
--- a/Common/Defs/Genes/GeneDefs_ExtraGenitaliaEndogenes.xml
+++ b/Common/Defs/Genes/GeneDefs_ExtraGenitaliaEndogenes.xml
@@ -2,39 +2,106 @@
rjw_genes_genitalia
-
-
+
rjw_genes_extra_penis
Males of this species grow an additional penis .
Genes/Icons/Placeholder
RJW_Genes.Gene_ExtraPenis
- 15
+ 20
PenisAmount
-
rjw_genes_no_penis
Males of this do not have a penis.
Genes/Icons/Placeholder
RJW_Genes.Gene_NoPenis
- 16
+ 21
PenisAmount
+
+
+ rjw_genes_extra_vagina
+
+ Females of this species grow an additional vagina .
+ Genes/Icons/Placeholder
+ RJW_Genes.Gene_ExtraVagina
+ 22
+
+ VaginaAmount
+
+
+
+
+ rjw_genes_no_vagina
+
+ Females of this do not have a vagina.
+ Genes/Icons/Placeholder
+ RJW_Genes.Gene_NoVagina
+ 23
+
+ VaginaAmount
+
+
+
+
+
+ rjw_genes_extra_breasts
+
+ Females of this species grow an additional pair of breasts .
+ Genes/Icons/Placeholder
+ RJW_Genes.Gene_ExtraBreasts
+ 24
+
+ BreastAmount
+
+
+
+
+ rjw_genes_no_breasts
+
+ Females of this do not have a pair of breasts.
+ Genes/Icons/Placeholder
+ RJW_Genes.Gene_NoBreasts
+ 25
+
+ BreastAmount
+
+
+
+
+ rjw_genes_extra_anus
+
+ This specias has an extra anus.
+ Genes/Icons/Placeholder
+ RJW_Genes.Gene_ExtraAnus
+ 26
+
+ AnusAmount
+
+
+
+
+ rjw_genes_no_anus
+
+ This specias has no anus.
+ Genes/Icons/Placeholder
+ RJW_Genes.Gene_NoAnus
+ 27
+
+ AnusAmount
+
+
+
+
\ No newline at end of file
diff --git a/Source/GeneDefOf.cs b/Source/GeneDefOf.cs
index caa43fa..f83db00 100644
--- a/Source/GeneDefOf.cs
+++ b/Source/GeneDefOf.cs
@@ -21,5 +21,11 @@ namespace RJW_Genes
// Extra Genitalia
[MayRequireBiotech] public static readonly GeneDef rjw_genes_extra_penis;
[MayRequireBiotech] public static readonly GeneDef rjw_genes_no_penis;
+ [MayRequireBiotech] public static readonly GeneDef rjw_genes_extra_vagina;
+ [MayRequireBiotech] public static readonly GeneDef rjw_genes_no_vagina;
+ [MayRequireBiotech] public static readonly GeneDef rjw_genes_extra_breasts;
+ [MayRequireBiotech] public static readonly GeneDef rjw_genes_no_breasts;
+ [MayRequireBiotech] public static readonly GeneDef rjw_genes_extra_anus;
+ [MayRequireBiotech] public static readonly GeneDef rjw_genes_no_anus;
}
}
diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs
new file mode 100644
index 0000000..7bb5953
--- /dev/null
+++ b/Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs
@@ -0,0 +1,59 @@
+using Verse;
+using rjw;
+using RimWorld;
+
+namespace RJW_Genes
+{
+ public class Gene_ExtraAnus : Gene
+ {
+
+ internal Hediff additional_anus;
+
+ public override void PostMake()
+ {
+ base.PostMake();
+ if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
+ Sexualizer.sexualize_pawn(pawn);
+
+ if (additional_anus == null)
+ {
+ CreateAndAddAnus();
+ }
+ }
+
+ public override void PostAdd()
+ {
+ base.PostAdd();
+
+ if (additional_anus == null)
+ {
+ CreateAndAddAnus();
+ }
+ }
+
+ public override void PostRemove()
+ {
+ base.PostRemove();
+ if(additional_anus != null)
+ pawn.health.RemoveHediff(additional_anus);
+ }
+
+ internal void CreateAndAddAnus()
+ {
+ var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn);
+ var anusDef = GenitaliaUtility.GetAnusForGene(correctGene);
+ var partBPR = Genital_Helper.get_anusBPR(pawn);
+ additional_anus = HediffMaker.MakeHediff(anusDef, pawn);
+
+ var CompHediff = additional_anus.TryGetComp();
+ if (CompHediff != null)
+ {
+ CompHediff.initComp(pawn);
+ CompHediff.updatesize();
+ }
+
+ pawn.health.AddHediff(additional_anus, partBPR);
+ }
+
+ }
+}
diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs
new file mode 100644
index 0000000..e8e658f
--- /dev/null
+++ b/Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs
@@ -0,0 +1,61 @@
+using Verse;
+using rjw;
+using RimWorld;
+
+namespace RJW_Genes
+{
+ public class Gene_ExtraBreasts : Gene
+ {
+
+ internal Hediff additional_breasts;
+
+ public override void PostMake()
+ {
+ base.PostMake();
+ if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
+ Sexualizer.sexualize_pawn(pawn);
+
+ // Penis are only added for female pawns!
+ if (pawn.gender == Gender.Female && additional_breasts == null)
+ {
+ createAndAddPenis();
+ }
+ }
+
+ public override void PostAdd()
+ {
+ base.PostAdd();
+
+ // Penis are only added for female pawns!
+ if (pawn.gender == Gender.Female && additional_breasts == null)
+ {
+ createAndAddPenis();
+ }
+ }
+
+ public override void PostRemove()
+ {
+ base.PostRemove();
+ if(additional_breasts != null)
+ pawn.health.RemoveHediff(additional_breasts);
+ }
+
+ internal void createAndAddPenis()
+ {
+ var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn);
+ var breastDef = GenitaliaUtility.GetBreastsForGene(correctGene);
+ var partBPR = Genital_Helper.get_breastsBPR(pawn);
+ additional_breasts = HediffMaker.MakeHediff(breastDef, pawn);
+
+ var CompHediff = additional_breasts.TryGetComp();
+ if (CompHediff != null)
+ {
+ CompHediff.initComp(pawn);
+ CompHediff.updatesize();
+ }
+
+ pawn.health.AddHediff(additional_breasts, partBPR);
+ }
+
+ }
+}
diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs
index b01e626..10dfb57 100644
--- a/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs
+++ b/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs
@@ -43,7 +43,7 @@ namespace RJW_Genes
internal void createAndAddPenis()
{
var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn);
- var penisDef = GenitaliaUtility.GetPenisForGene(correctGene);
+ HediffDef penisDef = GenitaliaUtility.GetPenisForGene(correctGene);
var partBPR = Genital_Helper.get_genitalsBPR(pawn);
additional_penis = HediffMaker.MakeHediff(penisDef, pawn);
diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs
new file mode 100644
index 0000000..a6f6bff
--- /dev/null
+++ b/Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs
@@ -0,0 +1,66 @@
+using Verse;
+using rjw;
+using RimWorld;
+
+namespace RJW_Genes
+{
+ public class Gene_ExtraVagina : Gene
+ {
+
+ internal Hediff additional_vagina;
+
+ //TODO: This works ingame when genes are added, but if there is
+ //a gene (e.g. ovipositor) in creation it does not work as expected (only has one genital)
+ //Penis works as expected
+
+
+ public override void PostMake()
+ {
+ base.PostMake();
+ if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
+ Sexualizer.sexualize_pawn(pawn);
+
+ // Vaginas are only added for female pawns!
+ if (pawn.gender == Gender.Female && additional_vagina == null)
+ {
+ CreateAndAddVagina();
+ }
+ }
+
+ public override void PostAdd()
+ {
+ base.PostAdd();
+
+ // Vaginas are only added for female pawns!
+ if (pawn.gender == Gender.Female && additional_vagina == null)
+ {
+ CreateAndAddVagina();
+ }
+ }
+
+ public override void PostRemove()
+ {
+ base.PostRemove();
+ if(additional_vagina != null)
+ pawn.health.RemoveHediff(additional_vagina);
+ }
+
+ internal void CreateAndAddVagina()
+ {
+ var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn);
+ HediffDef vaginaDef = GenitaliaUtility.GetVaginaForGene(correctGene);
+ var partBPR = Genital_Helper.get_genitalsBPR(pawn);
+ additional_vagina = HediffMaker.MakeHediff(vaginaDef, pawn);
+
+ var CompHediff = additional_vagina.TryGetComp();
+ if (CompHediff != null)
+ {
+ CompHediff.initComp(pawn);
+ CompHediff.updatesize();
+ }
+
+ pawn.health.AddHediff(additional_vagina, partBPR);
+ }
+
+ }
+}
diff --git a/Source/Genes/ExtraGenitalia/Gene_NoAnus.cs b/Source/Genes/ExtraGenitalia/Gene_NoAnus.cs
new file mode 100644
index 0000000..28ea3ba
--- /dev/null
+++ b/Source/Genes/ExtraGenitalia/Gene_NoAnus.cs
@@ -0,0 +1,57 @@
+using Verse;
+using rjw;
+using RimWorld;
+
+namespace RJW_Genes
+{
+ public class Gene_NoAnus : Gene
+ {
+
+ internal Hediff removed_anus;
+
+ // 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
+ // TODO: If all Genitalia are removed by genes, RJW adds some to the pawns at spawn
+ public override void PostMake()
+ {
+ base.PostMake();
+ if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
+ Sexualizer.sexualize_pawn(pawn);
+
+ if (removed_anus == null)
+ {
+ RemoveButStoreAnus();
+ }
+ }
+
+ public override void PostAdd()
+ {
+ base.PostAdd();
+
+ if (removed_anus == null)
+ {
+ RemoveButStoreAnus();
+ }
+ }
+
+ public override void PostRemove()
+ {
+ base.PostRemove();
+ if(removed_anus != null)
+ pawn.health.AddHediff(removed_anus);
+ }
+
+ internal void RemoveButStoreAnus()
+ {
+ var partBPR = Genital_Helper.get_anusBPR(pawn);
+ Hediff anusToRemove = Genital_Helper.get_AllPartsHediffList(pawn).FindLast(x => GenitaliaChanger.IsAnus(x));
+
+ if(anusToRemove != null)
+ {
+ removed_anus = anusToRemove;
+ pawn.health.RemoveHediff(anusToRemove);
+ }
+ }
+
+ }
+}
diff --git a/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs b/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs
new file mode 100644
index 0000000..bf1cd40
--- /dev/null
+++ b/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs
@@ -0,0 +1,59 @@
+using Verse;
+using rjw;
+using RimWorld;
+
+namespace RJW_Genes
+{
+ public class Gene_NoBreasts : Gene
+ {
+
+ internal Hediff removed_breasts;
+
+ // 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
+ // TODO: If all Genitalia are removed by genes, RJW adds some to the pawns at spawn. IDEA: Add male-nipples ?
+ public override void PostMake()
+ {
+ base.PostMake();
+ if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
+ Sexualizer.sexualize_pawn(pawn);
+
+ // Breasts are removed for female pawns!
+ if (pawn.gender == Gender.Female && removed_breasts == null)
+ {
+ RemoveButStoreBreasts();
+ }
+ }
+
+ public override void PostAdd()
+ {
+ base.PostAdd();
+
+ // Breasts are removed for female pawns!
+ if (pawn.gender == Gender.Female && removed_breasts == null)
+ {
+ RemoveButStoreBreasts();
+ }
+ }
+
+ public override void PostRemove()
+ {
+ base.PostRemove();
+ if(removed_breasts != null)
+ pawn.health.AddHediff(removed_breasts);
+ }
+
+ internal void RemoveButStoreBreasts()
+ {
+ var partBPR = Genital_Helper.get_breastsBPR(pawn);
+ Hediff breastsToRemove = Genital_Helper.get_AllPartsHediffList(pawn).FindLast(x => GenitaliaUtility.IsBreasts(x));
+
+ if(breastsToRemove != null)
+ {
+ removed_breasts = breastsToRemove;
+ pawn.health.RemoveHediff(breastsToRemove);
+ }
+ }
+
+ }
+}
diff --git a/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs b/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs
index 8c88452..cd7f01f 100644
--- a/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs
+++ b/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs
@@ -11,6 +11,7 @@ namespace RJW_Genes
// 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
+ // TODO: If all Genitalia are removed by genes, RJW adds some to the pawns at spawn
public override void PostMake()
{
base.PostMake();
diff --git a/Source/Genes/ExtraGenitalia/Gene_NoVagina.cs b/Source/Genes/ExtraGenitalia/Gene_NoVagina.cs
new file mode 100644
index 0000000..920c263
--- /dev/null
+++ b/Source/Genes/ExtraGenitalia/Gene_NoVagina.cs
@@ -0,0 +1,59 @@
+using Verse;
+using rjw;
+using RimWorld;
+
+namespace RJW_Genes
+{
+ public class Gene_NoVagina : Gene
+ {
+
+ internal Hediff removed_vagina;
+
+ // 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
+ // TODO: If all Genitalia are removed by genes, RJW adds some to the pawns at spawn
+ public override void PostMake()
+ {
+ base.PostMake();
+ if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn))
+ Sexualizer.sexualize_pawn(pawn);
+
+ // Vaginas are only removed for female pawns!
+ if (pawn.gender == Gender.Female && removed_vagina == null)
+ {
+ RemoveButStoreVagina();
+ }
+ }
+
+ public override void PostAdd()
+ {
+ base.PostAdd();
+
+ // Vaginas are only removed for female pawns!
+ if (pawn.gender == Gender.Female && removed_vagina == null)
+ {
+ RemoveButStoreVagina();
+ }
+ }
+
+ public override void PostRemove()
+ {
+ base.PostRemove();
+ if(removed_vagina != null)
+ pawn.health.AddHediff(removed_vagina);
+ }
+
+ internal void RemoveButStoreVagina()
+ {
+ var partBPR = Genital_Helper.get_genitalsBPR(pawn);
+ Hediff vaginaToRemove = Genital_Helper.get_AllPartsHediffList(pawn).FindLast(x => Genital_Helper.is_vagina(x));
+
+ if(vaginaToRemove != null)
+ {
+ removed_vagina = vaginaToRemove;
+ pawn.health.RemoveHediff(vaginaToRemove);
+ }
+ }
+
+ }
+}
diff --git a/Source/Genes/Genitalia/GenitaliaChanger.cs b/Source/Genes/Genitalia/GenitaliaChanger.cs
index 047beab..84f4fab 100644
--- a/Source/Genes/Genitalia/GenitaliaChanger.cs
+++ b/Source/Genes/Genitalia/GenitaliaChanger.cs
@@ -70,11 +70,11 @@ namespace RJW_Genes
}
- private static bool IsAnus(Hediff candidate)
+ public static bool IsAnus(Hediff candidate)
{
return candidate.def.defName.ToLower().Contains("anus"); }
- private static bool IsArtificial(Hediff candidate)
+ public static bool IsArtificial(Hediff candidate)
{
return candidate.def.defName.ToLower().Contains("bionic") || candidate.def.defName.ToLower().Contains("archo");
}
diff --git a/Source/GenitaliaUtility.cs b/Source/GenitaliaUtility.cs
index 97785dc..e11f06f 100644
--- a/Source/GenitaliaUtility.cs
+++ b/Source/GenitaliaUtility.cs
@@ -1,6 +1,7 @@
using RimWorld;
using Verse;
using rjw;
+using System;
namespace RJW_Genes
{
@@ -26,30 +27,6 @@ namespace RJW_Genes
return GeneDefOf.rjw_genes_human_genitalia;
}
- ///
- /// Adds a genital created from a given Def to the pawn.
- /// Does not alter/touch gender.
- ///
- /// The pawn whom to add the genital to,
- /// The type of genital to be added
- 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();
- if (CompHediff != null)
- {
- CompHediff.initComp(pawn);
- CompHediff.updatesize();
- }
-
- pawn.health.AddHediff(additionalGenital, partBPR);
- }
-
public static HediffDef GetPenisForGene(GeneDef gene)
{
@@ -69,6 +46,59 @@ namespace RJW_Genes
}
+ public static HediffDef GetVaginaForGene(GeneDef gene)
+ {
+ switch (gene.defName)
+ {
+ case "rjw_genes_human_genitalia": return Genital_Helper.average_vagina;
+ case "rjw_genes_equine_genitalia": return Genital_Helper.equine_vagina;
+ case "rjw_genes_canine_genitalia": return Genital_Helper.canine_vagina;
+ case "rjw_genes_feline_genitalia": return Genital_Helper.feline_vagina;
+ case "rjw_genes_demonic_genitalia": return Genital_Helper.demon_vagina;
+ case "rjw_genes_dragon_genitalia": return Genital_Helper.dragon_vagina;
+ case "rjw_genes_slime_genitalia": return Genital_Helper.slime_vagina;
+ case "rjw_genes_ovipositor_genitalia": return Genital_Helper.ovipositorF;
+
+ default: return Genital_Helper.average_vagina;
+ }
+ }
+
+ public static HediffDef GetAnusForGene(GeneDef gene)
+ {
+ switch (gene.defName)
+ {
+ //TODO: Do I want the default to be generic or average for feline,equine and canine?
+ case "rjw_genes_human_genitalia": return Genital_Helper.average_anus;
+ case "rjw_genes_equine_genitalia": return Genital_Helper.average_anus;
+ case "rjw_genes_canine_genitalia": return Genital_Helper.average_anus;
+ case "rjw_genes_feline_genitalia": return Genital_Helper.average_anus;
+ case "rjw_genes_demonic_genitalia": return Genital_Helper.demon_anus;
+ case "rjw_genes_dragon_genitalia": return Genital_Helper.average_anus;
+ case "rjw_genes_slime_genitalia": return Genital_Helper.slime_anus;
+ case "rjw_genes_ovipositor_genitalia": return Genital_Helper.insect_anus;
+
+ default: return Genital_Helper.generic_anus;
+ }
+ }
+
+ public static HediffDef GetBreastsForGene(GeneDef gene)
+ {
+ switch (gene.defName)
+ {
+ //TODO: Do I want the default to be generic or average?
+ case "rjw_genes_human_genitalia": return Genital_Helper.average_breasts;
+ 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_ovipositor_genitalia": return Genital_Helper.average_breasts;
+
+ default: return Genital_Helper.generic_breasts;
+ }
+ }
+
public static bool PawnStillNeedsGenitalia(Pawn pawn)
{
// There is the issue that the genes fire in a pseudo-random order
@@ -89,5 +119,10 @@ namespace RJW_Genes
return !pawn_has_any_genitalia;
}
+
+ public static bool IsBreasts(Hediff candidate)
+ {
+ return candidate.def.defName.ToLower().Contains("breast");
+ }
}
}
diff --git a/Source/Rjw-Genes.csproj b/Source/Rjw-Genes.csproj
index b2a146b..fd6b174 100644
--- a/Source/Rjw-Genes.csproj
+++ b/Source/Rjw-Genes.csproj
@@ -49,6 +49,12 @@
+
+
+
+
+
+