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 @@ + + + + + +