diff --git a/Common/Assemblies/Rjw-Genes.dll b/Common/Assemblies/Rjw-Genes.dll index 5b7deea..05fb3b0 100644 Binary files a/Common/Assemblies/Rjw-Genes.dll and b/Common/Assemblies/Rjw-Genes.dll differ diff --git a/Common/Defs/Genes/GeneCategories.xml b/Common/Defs/Genes/GeneCategories.xml index e9b727b..202545e 100644 --- a/Common/Defs/Genes/GeneCategories.xml +++ b/Common/Defs/Genes/GeneCategories.xml @@ -1,10 +1,21 @@ + + + + rjw_genes_gender + + 20 + + rjw_genes_genitalia - 541 + 16 \ No newline at end of file diff --git a/Common/Defs/Genes/GeneDefs_ExtraGenitaliaEndogenes.xml b/Common/Defs/Genes/GeneDefs_ExtraGenitaliaEndogenes.xml index 3242cb6..703d8db 100644 --- a/Common/Defs/Genes/GeneDefs_ExtraGenitaliaEndogenes.xml +++ b/Common/Defs/Genes/GeneDefs_ExtraGenitaliaEndogenes.xml @@ -11,7 +11,7 @@ Males of this species grow an additional penis . Genes/Icons/Placeholder RJW_Genes.Gene_ExtraPenis - 20 + 701
  • PenisAmount
  • @@ -23,7 +23,7 @@ Males of this do not have a penis. Genes/Icons/Placeholder RJW_Genes.Gene_NoPenis - 21 + 702
  • PenisAmount
  • @@ -36,7 +36,7 @@ Females of this species grow an additional vagina . Genes/Icons/Placeholder RJW_Genes.Gene_ExtraVagina - 22 + 703
  • VaginaAmount
  • @@ -48,7 +48,7 @@ Females of this do not have a vagina. Genes/Icons/Placeholder RJW_Genes.Gene_NoVagina - 23 + 704
  • VaginaAmount
  • @@ -61,7 +61,7 @@ Females of this species grow an additional pair of breasts . Genes/Icons/Placeholder RJW_Genes.Gene_ExtraBreasts - 24 + 705
  • BreastAmount
  • @@ -73,7 +73,7 @@ Females of this do not have a pair of breasts. Genes/Icons/Placeholder RJW_Genes.Gene_NoBreasts - 25 + 706
  • BreastAmount
  • @@ -85,7 +85,7 @@ This specias has an extra anus. Genes/Icons/Placeholder RJW_Genes.Gene_ExtraAnus - 26 + 707
  • AnusAmount
  • @@ -97,7 +97,7 @@ This specias has no anus. Genes/Icons/Placeholder RJW_Genes.Gene_NoAnus - 27 + 708
  • AnusAmount
  • @@ -109,7 +109,7 @@ Males of this xenotype grow additional female genitalia, Females grow additional male genitalia. Genes/Icons/Placeholder RJW_Genes.Gene_Futa - 29 + 709
  • PenisAmount
  • VaginaAmount
  • diff --git a/Common/Defs/Genes/GeneDefs_GenitaliaSizes.xml b/Common/Defs/Genes/GeneDefs_GenitaliaSizes.xml index 8ecc4c7..41dac59 100644 --- a/Common/Defs/Genes/GeneDefs_GenitaliaSizes.xml +++ b/Common/Defs/Genes/GeneDefs_GenitaliaSizes.xml @@ -12,7 +12,7 @@ Penises of this Xenotype are bigger. Genes/Icons/Placeholder RJW_Genes.Gene_BigMaleGenitalia - 51 + 751
  • PenisSize
  • @@ -24,7 +24,7 @@ Penises of this Xenotype can be any size. Genes/Icons/Placeholder RJW_Genes.Gene_NormalMaleGenitalia - 52 + 752
  • PenisSize
  • @@ -36,7 +36,7 @@ Penises of this Xenotype are smaller. Genes/Icons/Placeholder RJW_Genes.Gene_SmallMaleGenitalia - 53 + 753
  • PenisSize
  • @@ -49,7 +49,7 @@ Vaginas of this Xenotype are quite spacy. Genes/Icons/Placeholder RJW_Genes.Gene_LooseFemaleGenitalia - 54 + 754
  • VaginaSize
  • @@ -61,7 +61,7 @@ Vaginas of this Xenotype can be any size. Genes/Icons/Placeholder RJW_Genes.Gene_NormalFemaleGenitalia - 55 + 755
  • VaginaSize
  • @@ -73,7 +73,7 @@ Vaginas of this Xenotype are pretty tight. Genes/Icons/Placeholder RJW_Genes.Gene_TightFemaleGenitalia - 56 + 756
  • VaginaSize
  • @@ -86,7 +86,7 @@ Females of this Xenotype have big honkers. Genes/Icons/Placeholder RJW_Genes.Gene_BigBreasts - 57 + 757
  • BreastSize
  • @@ -98,7 +98,7 @@ Females of this Xenotype have breasts of any size. Genes/Icons/Placeholder RJW_Genes.Gene_NormalBreasts - 58 + 758
  • BreastSize
  • @@ -110,7 +110,7 @@ Females of this Xenotype have smaller breasts. Genes/Icons/Placeholder RJW_Genes.Gene_SmallBreasts - 59 + 759
  • BreastSize
  • @@ -123,7 +123,7 @@ The Anus of this Xenotype is roomy. Genes/Icons/Placeholder RJW_Genes.Gene_LooseAnus - 60 + 760
  • AnusSize
  • @@ -135,7 +135,7 @@ Anus of this Xenotype can be any size. Genes/Icons/Placeholder RJW_Genes.Gene_NormalAnus - 61 + 761
  • AnusSize
  • @@ -147,7 +147,7 @@ The anus of this Xenotype is small. Genes/Icons/Placeholder RJW_Genes.Gene_TightAnus - 62 + 762
  • AnusSize
  • diff --git a/Common/Defs/Genes/GeneDefs_GenitaliaTypeEndogenes.xml b/Common/Defs/Genes/GeneDefs_GenitaliaTypeEndogenes.xml index ff90a9f..39f7f64 100644 --- a/Common/Defs/Genes/GeneDefs_GenitaliaTypeEndogenes.xml +++ b/Common/Defs/Genes/GeneDefs_GenitaliaTypeEndogenes.xml @@ -18,7 +18,7 @@ Carriers of this carry genitalia similar to humans. Genes/Icons/Placeholder RJW_Genes.Gene_HumanGenitalia - 1 + 801 @@ -27,7 +27,7 @@ Carriers of this gene develop equine genitalia. Genes/Icons/Placeholder RJW_Genes.Gene_EquineGenitalia - 2 + 802 @@ -36,7 +36,7 @@ Carriers of this gene develop canine genitalia. Genes/Icons/Placeholder RJW_Genes.Gene_CanineGenitalia - 3 + 803 @@ -45,7 +45,7 @@ Carriers of this gene develop feline genitalia. Genes/Icons/Placeholder RJW_Genes.Gene_FelineGenitalia - 4 + 804 @@ -54,7 +54,7 @@ Carriers of this gene have demonic genitalia. Genes/Icons/Placeholder RJW_Genes.Gene_DemonicGenitalia - 5 + 805 @@ -63,7 +63,7 @@ Carriers of this gene develop dragon genitalia. Genes/Icons/Placeholder RJW_Genes.Gene_DragonGenitalia - 6 + 806 @@ -72,7 +72,7 @@ Carriers of this gene have slime genitalia. Genes/Icons/Placeholder RJW_Genes.Gene_SlimeGenitalia - 7 + 807 @@ -81,7 +81,7 @@ Carriers of this gene have ovipositors similar to insects. Genes/Icons/Placeholder RJW_Genes.Gene_OvipositorGenitalia - 8 + 808 \ No newline at end of file diff --git a/Common/Defs/Genes/GeneDefs_SpecifiedGender.xml b/Common/Defs/Genes/GeneDefs_SpecifiedGender.xml new file mode 100644 index 0000000..521e878 --- /dev/null +++ b/Common/Defs/Genes/GeneDefs_SpecifiedGender.xml @@ -0,0 +1,25 @@ + + + + rjw_genes_female_only + + rjw_genes_gender + This Xenotype only has females. + 0 + Genes/Icons/Placeholder + RJW_Genes.Gene_FemaleOnly + 1 + + + + rjw_genes_male_only + rjw_genes_gender + + This Xenotype only has males. + 0 + Genes/Icons/Placeholder + RJW_Genes.Gene_MaleOnly + 2 + + + \ No newline at end of file diff --git a/Source/GeneDefOf.cs b/Source/GeneDefOf.cs index 198a961..cb300cd 100644 --- a/Source/GeneDefOf.cs +++ b/Source/GeneDefOf.cs @@ -7,6 +7,7 @@ namespace RJW_Genes public static class GeneDefOf { [MayRequireBiotech] public static readonly GeneCategoryDef rjw_genes_genitalia; + [MayRequireBiotech] public static readonly GeneCategoryDef rjw_genes_gender; // Base Genitalia Types [MayRequireBiotech] public static readonly GeneDef rjw_genes_human_genitalia; @@ -43,5 +44,8 @@ namespace RJW_Genes [MayRequireBiotech] public static readonly GeneDef rjw_genes_normal_anus; [MayRequireBiotech] public static readonly GeneDef rjw_genes_tight_anus; + // Gender + [MayRequireBiotech] public static readonly GeneDef rjw_genes_female_only; + [MayRequireBiotech] public static readonly GeneDef rjw_genes_male_only; } } diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs index 7bb5953..cea77f2 100644 --- a/Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs +++ b/Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs @@ -4,7 +4,7 @@ using RimWorld; namespace RJW_Genes { - public class Gene_ExtraAnus : Gene + public class Gene_ExtraAnus : RJW_Gene { internal Hediff additional_anus; @@ -12,8 +12,6 @@ namespace RJW_Genes public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); if (additional_anus == null) { diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs index e8e658f..8829854 100644 --- a/Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs +++ b/Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs @@ -4,7 +4,7 @@ using RimWorld; namespace RJW_Genes { - public class Gene_ExtraBreasts : Gene + public class Gene_ExtraBreasts : RJW_Gene { internal Hediff additional_breasts; @@ -12,13 +12,11 @@ namespace RJW_Genes 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) + // Tits are only added for female pawns! + if (GenderUtility.IsFemale(pawn) && additional_breasts == null) { - createAndAddPenis(); + CreateAndAddBreasts(); } } @@ -26,10 +24,10 @@ namespace RJW_Genes { base.PostAdd(); - // Penis are only added for female pawns! - if (pawn.gender == Gender.Female && additional_breasts == null) + // Tits are only added for female pawns! + if (GenderUtility.IsFemale(pawn) && additional_breasts == null) { - createAndAddPenis(); + CreateAndAddBreasts(); } } @@ -40,7 +38,7 @@ namespace RJW_Genes pawn.health.RemoveHediff(additional_breasts); } - internal void createAndAddPenis() + internal void CreateAndAddBreasts() { var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn); var breastDef = GenitaliaUtility.GetBreastsForGene(correctGene); diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs index 10dfb57..aee18c7 100644 --- a/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs +++ b/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs @@ -4,7 +4,7 @@ using RimWorld; namespace RJW_Genes { - public class Gene_ExtraPenis : Gene + public class Gene_ExtraPenis : RJW_Gene { internal Hediff additional_penis; @@ -12,13 +12,11 @@ namespace RJW_Genes 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) + if (GenderUtility.IsMale(pawn) && additional_penis == null) { - createAndAddPenis(); + CreateAndAddPenis(); } } @@ -27,9 +25,9 @@ namespace RJW_Genes base.PostAdd(); // Penis are only added for male pawns! - if (pawn.gender == Gender.Male && additional_penis == null) + if (GenderUtility.IsMale(pawn) && additional_penis == null) { - createAndAddPenis(); + CreateAndAddPenis(); } } @@ -40,7 +38,7 @@ namespace RJW_Genes pawn.health.RemoveHediff(additional_penis); } - internal void createAndAddPenis() + internal void CreateAndAddPenis() { var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn); HediffDef penisDef = GenitaliaUtility.GetPenisForGene(correctGene); diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs index a6f6bff..9940de0 100644 --- a/Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs +++ b/Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs @@ -4,7 +4,7 @@ using RimWorld; namespace RJW_Genes { - public class Gene_ExtraVagina : Gene + public class Gene_ExtraVagina : RJW_Gene { internal Hediff additional_vagina; @@ -17,11 +17,9 @@ namespace RJW_Genes 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) + if (GenderUtility.IsFemale(pawn) && additional_vagina == null) { CreateAndAddVagina(); } @@ -32,7 +30,7 @@ namespace RJW_Genes base.PostAdd(); // Vaginas are only added for female pawns! - if (pawn.gender == Gender.Female && additional_vagina == null) + if (GenderUtility.IsFemale(pawn) && additional_vagina == null) { CreateAndAddVagina(); } diff --git a/Source/Genes/ExtraGenitalia/Gene_Futa.cs b/Source/Genes/ExtraGenitalia/Gene_Futa.cs index 76749ff..2d9f367 100644 --- a/Source/Genes/ExtraGenitalia/Gene_Futa.cs +++ b/Source/Genes/ExtraGenitalia/Gene_Futa.cs @@ -4,7 +4,7 @@ using RimWorld; namespace RJW_Genes { - public class Gene_Futa : Gene + public class Gene_Futa : RJW_Gene { internal Hediff additional_genital; @@ -12,14 +12,12 @@ namespace RJW_Genes public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); - if (pawn.gender == Gender.Female && additional_genital == null) + if (GenderUtility.IsFemale(pawn) && additional_genital == null) { createAndAddPenis(); } - if (pawn.gender == Gender.Male && additional_genital == null) + if (GenderUtility.IsMale(pawn) && additional_genital == null) { CreateAndAddVagina(); } diff --git a/Source/Genes/ExtraGenitalia/Gene_NoAnus.cs b/Source/Genes/ExtraGenitalia/Gene_NoAnus.cs index 28ea3ba..d23b2df 100644 --- a/Source/Genes/ExtraGenitalia/Gene_NoAnus.cs +++ b/Source/Genes/ExtraGenitalia/Gene_NoAnus.cs @@ -4,7 +4,7 @@ using RimWorld; namespace RJW_Genes { - public class Gene_NoAnus : Gene + public class Gene_NoAnus : RJW_Gene { internal Hediff removed_anus; @@ -15,8 +15,6 @@ namespace RJW_Genes public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); if (removed_anus == null) { diff --git a/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs b/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs index bf1cd40..ddc75a1 100644 --- a/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs +++ b/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs @@ -4,7 +4,7 @@ using RimWorld; namespace RJW_Genes { - public class Gene_NoBreasts : Gene + public class Gene_NoBreasts : RJW_Gene { internal Hediff removed_breasts; @@ -15,11 +15,9 @@ namespace RJW_Genes 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) + if (GenderUtility.IsFemale(pawn) && removed_breasts == null) { RemoveButStoreBreasts(); } @@ -30,7 +28,7 @@ namespace RJW_Genes base.PostAdd(); // Breasts are removed for female pawns! - if (pawn.gender == Gender.Female && removed_breasts == null) + if (GenderUtility.IsFemale(pawn) && removed_breasts == null) { RemoveButStoreBreasts(); } diff --git a/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs b/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs index cd7f01f..be67ef4 100644 --- a/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs +++ b/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs @@ -4,7 +4,7 @@ using RimWorld; namespace RJW_Genes { - public class Gene_NoPenis : Gene + public class Gene_NoPenis : RJW_Gene { internal Hediff removed_penis; @@ -15,11 +15,9 @@ namespace RJW_Genes 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) + // Penis are only removed for male pawns! + if (GenderUtility.IsMale(pawn) && removed_penis == null) { RemoveButStorePenis(); } @@ -29,8 +27,8 @@ namespace RJW_Genes { base.PostAdd(); - // Penis are only added for male pawns! - if (pawn.gender == Gender.Male && removed_penis == null) + // Penis are only removed for male pawns! + if (GenderUtility.IsMale(pawn) && removed_penis == null) { RemoveButStorePenis(); } diff --git a/Source/Genes/ExtraGenitalia/Gene_NoVagina.cs b/Source/Genes/ExtraGenitalia/Gene_NoVagina.cs index 920c263..8083f58 100644 --- a/Source/Genes/ExtraGenitalia/Gene_NoVagina.cs +++ b/Source/Genes/ExtraGenitalia/Gene_NoVagina.cs @@ -4,7 +4,7 @@ using RimWorld; namespace RJW_Genes { - public class Gene_NoVagina : Gene + public class Gene_NoVagina : RJW_Gene { internal Hediff removed_vagina; @@ -15,11 +15,9 @@ namespace RJW_Genes 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) + if (GenderUtility.IsFemale(pawn) && removed_vagina == null) { RemoveButStoreVagina(); } @@ -30,7 +28,7 @@ namespace RJW_Genes base.PostAdd(); // Vaginas are only removed for female pawns! - if (pawn.gender == Gender.Female && removed_vagina == null) + if (GenderUtility.IsFemale(pawn) && removed_vagina == null) { RemoveButStoreVagina(); } diff --git a/Source/Genes/Gender/GenderUtility.cs b/Source/Genes/Gender/GenderUtility.cs new file mode 100644 index 0000000..ea0e1d6 --- /dev/null +++ b/Source/Genes/Gender/GenderUtility.cs @@ -0,0 +1,73 @@ +using Verse; +using rjw; +using RimWorld; +using System.Collections; +using System.Linq; +using System; + +namespace RJW_Genes +{ + public class GenderUtility + { + /// + /// Returns if a Pawn is female (Gender==Female) or if it should be (Gene==FemaleOnly) + /// This is used as a small helper, as the genes might fire in different orders. + /// + public static bool IsFemale(Pawn pawn) + { + return + pawn.gender == Gender.Female || pawn.genes.GenesListForReading.Any(gene => gene.def.defName.EqualsIgnoreCase(GeneDefOf.rjw_genes_female_only.defName)); + } + + /// + /// Returns if a Pawn is male (Gender==Male) or if it should be (Gene==MaleOnly) + /// This is used as a small helper, as the genes might fire in different orders. + /// + public static bool IsMale(Pawn pawn) + { + return + pawn.gender == Gender.Male || pawn.genes.GenesListForReading.Any(gene => gene.def.defName.EqualsIgnoreCase(GeneDefOf.rjw_genes_male_only.defName)); + } + + /// + /// Adjusts the Body Type to match the given target gender + /// (for male and female only, baby,child and hulks don't change) + /// + /// + /// + public static void AdjustBodyToTargetGender(Pawn pawn, Gender targetGender) + { + if (pawn == null) + return; + if (pawn.story.bodyType == BodyTypeDefOf.Baby || pawn.story.bodyType == BodyTypeDefOf.Hulk || pawn.story.bodyType == BodyTypeDefOf.Child) + return; + + if (targetGender == Gender.Male) + { + pawn.story.bodyType = BodyTypeDefOf.Male; + } + else if (targetGender == Gender.Female) + { + pawn.story.bodyType = BodyTypeDefOf.Female; + pawn.style.beardDef = BeardDefOf.NoBeard; + } + + // Re-Choose heads if it is wrong gender + if (pawn.story.headType.gender == Gender.None || pawn.story.headType.gender == targetGender) + { + // Do nothing, Gender of Heat is Neutral or matches + } + else + { + // Below line tries to get (and set) an available head from the backstory, if it returns true everything worked if it returns false we log it + if(! pawn.story.TryGetRandomHeadFromSet(DefDatabase.AllDefs.Where((Func)(x => x.randomChosen)))) + { + Log.Message("Failed to retrieve a correct-gender head for the pawn " + pawn.Name); + }; + } + + // Force Redraw at the spot + pawn.Drawer.renderer.graphics.SetAllGraphicsDirty(); + } + } +} diff --git a/Source/Genes/Gender/Gene_FemaleOnly.cs b/Source/Genes/Gender/Gene_FemaleOnly.cs new file mode 100644 index 0000000..0cfbe0d --- /dev/null +++ b/Source/Genes/Gender/Gene_FemaleOnly.cs @@ -0,0 +1,42 @@ +using Verse; +using rjw; + + +namespace RJW_Genes +{ + public class Gene_FemaleOnly : Gene + { + public override void PostMake() + { + base.PostMake(); + + AdjustPawnToFemale(); + // Here we call Sexualization after the Sex-Change + if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) + Sexualizer.sexualize_pawn(pawn); + } + + public override void PostAdd() + { + base.PostMake(); + AdjustPawnToFemale(); + } + + private void AdjustPawnToFemale() + { + // Here we really use the Gender.Female and not our helper IsFemale(pawn) + if (pawn.gender == Gender.Female) + return; + else + { + GenderHelper.ChangeSex(pawn, () => { + pawn.gender = Gender.Female; + GenitaliaChanger.RemoveAllGenitalia(pawn); + Sexualizer.sexualize_pawn(pawn); + }); + GenderUtility.AdjustBodyToTargetGender(pawn, Gender.Female); + } + } + + } +} diff --git a/Source/Genes/Gender/Gene_MaleOnly.cs b/Source/Genes/Gender/Gene_MaleOnly.cs new file mode 100644 index 0000000..51806cf --- /dev/null +++ b/Source/Genes/Gender/Gene_MaleOnly.cs @@ -0,0 +1,42 @@ +using Verse; +using rjw; + + +namespace RJW_Genes +{ + public class Gene_MaleOnly : Gene + { + public override void PostMake() + { + base.PostMake(); + + AdjustPawnToMale(); + // Here we call Sexualization after the Sex-Change + if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) + Sexualizer.sexualize_pawn(pawn); + } + + public override void PostAdd() + { + base.PostMake(); + AdjustPawnToMale(); + } + + private void AdjustPawnToMale() + { + if (pawn.gender == Gender.Male) + return; + else + { + GenderHelper.ChangeSex(pawn, () => { + + pawn.gender = Gender.Male; + GenitaliaChanger.RemoveAllGenitalia(pawn); + Sexualizer.sexualize_pawn(pawn); + }); + GenderUtility.AdjustBodyToTargetGender(pawn, Gender.Male); + } + } + + } +} diff --git a/Source/Genes/Genitalia/Gene_CanineGenitalia.cs b/Source/Genes/Genitalia/Gene_CanineGenitalia.cs index 1d37041..0f31a11 100644 --- a/Source/Genes/Genitalia/Gene_CanineGenitalia.cs +++ b/Source/Genes/Genitalia/Gene_CanineGenitalia.cs @@ -3,13 +3,11 @@ using rjw; namespace RJW_Genes { - public class Gene_CanineGenitalia : Gene + public class Gene_CanineGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.canine_penis,Genital_Helper.canine_vagina,Genital_Helper.generic_anus); } diff --git a/Source/Genes/Genitalia/Gene_DemonicGenitalia.cs b/Source/Genes/Genitalia/Gene_DemonicGenitalia.cs index 5d33f84..e4c5805 100644 --- a/Source/Genes/Genitalia/Gene_DemonicGenitalia.cs +++ b/Source/Genes/Genitalia/Gene_DemonicGenitalia.cs @@ -4,13 +4,11 @@ using rjw; namespace RJW_Genes { - public class Gene_DemonicGenitalia : Gene + public class Gene_DemonicGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.demon_penis,Genital_Helper.demon_vagina,Genital_Helper.demon_anus); } diff --git a/Source/Genes/Genitalia/Gene_DragonGenitalia.cs b/Source/Genes/Genitalia/Gene_DragonGenitalia.cs index 4e44954..abd930d 100644 --- a/Source/Genes/Genitalia/Gene_DragonGenitalia.cs +++ b/Source/Genes/Genitalia/Gene_DragonGenitalia.cs @@ -3,13 +3,11 @@ using rjw; namespace RJW_Genes { - public class Gene_DragonGenitalia : Gene + public class Gene_DragonGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.dragon_penis,Genital_Helper.dragon_vagina,Genital_Helper.generic_anus); } diff --git a/Source/Genes/Genitalia/Gene_EquineGenitalia.cs b/Source/Genes/Genitalia/Gene_EquineGenitalia.cs index 47eb65a..4ec956b 100644 --- a/Source/Genes/Genitalia/Gene_EquineGenitalia.cs +++ b/Source/Genes/Genitalia/Gene_EquineGenitalia.cs @@ -3,13 +3,11 @@ using rjw; namespace RJW_Genes { - public class Gene_EquineGenitalia : Gene + public class Gene_EquineGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.equine_penis,Genital_Helper.equine_vagina,Genital_Helper.generic_anus); } diff --git a/Source/Genes/Genitalia/Gene_FelineGenitalia.cs b/Source/Genes/Genitalia/Gene_FelineGenitalia.cs index 506437c..6c1b987 100644 --- a/Source/Genes/Genitalia/Gene_FelineGenitalia.cs +++ b/Source/Genes/Genitalia/Gene_FelineGenitalia.cs @@ -3,13 +3,11 @@ using rjw; namespace RJW_Genes { - public class Gene_FelineGenitalia : Gene + public class Gene_FelineGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.feline_penis,Genital_Helper.feline_vagina,Genital_Helper.generic_anus); } diff --git a/Source/Genes/Genitalia/Gene_HumanGenitalia.cs b/Source/Genes/Genitalia/Gene_HumanGenitalia.cs index cd9ee11..077e0c4 100644 --- a/Source/Genes/Genitalia/Gene_HumanGenitalia.cs +++ b/Source/Genes/Genitalia/Gene_HumanGenitalia.cs @@ -3,13 +3,11 @@ using rjw; namespace RJW_Genes { - public class Gene_HumanGenitalia : Gene + public class Gene_HumanGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.average_penis,Genital_Helper.average_vagina,Genital_Helper.average_anus); } diff --git a/Source/Genes/Genitalia/Gene_OvipositorGenitalia.cs b/Source/Genes/Genitalia/Gene_OvipositorGenitalia.cs index 3cab5d9..2e91c2c 100644 --- a/Source/Genes/Genitalia/Gene_OvipositorGenitalia.cs +++ b/Source/Genes/Genitalia/Gene_OvipositorGenitalia.cs @@ -3,13 +3,11 @@ using rjw; namespace RJW_Genes { - public class Gene_OvipositorGenitalia : Gene + public class Gene_OvipositorGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.ovipositorM,Genital_Helper.ovipositorF,Genital_Helper.insect_anus); } diff --git a/Source/Genes/Genitalia/Gene_SlimeGenitalia.cs b/Source/Genes/Genitalia/Gene_SlimeGenitalia.cs index 9837271..efbdfcb 100644 --- a/Source/Genes/Genitalia/Gene_SlimeGenitalia.cs +++ b/Source/Genes/Genitalia/Gene_SlimeGenitalia.cs @@ -3,13 +3,11 @@ using rjw; namespace RJW_Genes { - public class Gene_SlimeGenitalia : Gene + public class Gene_SlimeGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.slime_penis,Genital_Helper.slime_vagina,Genital_Helper.slime_anus); } diff --git a/Source/Genes/Genitalia/GenitaliaChanger.cs b/Source/Genes/Genitalia/GenitaliaChanger.cs index 84f4fab..48ddc4d 100644 --- a/Source/Genes/Genitalia/GenitaliaChanger.cs +++ b/Source/Genes/Genitalia/GenitaliaChanger.cs @@ -79,5 +79,14 @@ namespace RJW_Genes return candidate.def.defName.ToLower().Contains("bionic") || candidate.def.defName.ToLower().Contains("archo"); } + public static void RemoveAllGenitalia(Pawn pawn) + { + var parts = Genital_Helper.get_AllPartsHediffList(pawn); + foreach (var part in parts) + { + pawn.health.RemoveHediff(part); + } + } + } } diff --git a/Source/Genes/GenitaliaSize/Gene_BigBreasts.cs b/Source/Genes/GenitaliaSize/Gene_BigBreasts.cs index d2a4d05..b0e61ad 100644 --- a/Source/Genes/GenitaliaSize/Gene_BigBreasts.cs +++ b/Source/Genes/GenitaliaSize/Gene_BigBreasts.cs @@ -1,17 +1,12 @@ using Verse; -using rjw; -using System; - namespace RJW_Genes { - public class Gene_BigBreasts : Gene + public class Gene_BigBreasts : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); if (pawn.gender == Gender.Female) SizeAdjuster.AdjustAllBreastSizes(pawn,0.5f,1.0f); diff --git a/Source/Genes/GenitaliaSize/Gene_BigMaleGenitalia.cs b/Source/Genes/GenitaliaSize/Gene_BigMaleGenitalia.cs index a745ce6..b04df46 100644 --- a/Source/Genes/GenitaliaSize/Gene_BigMaleGenitalia.cs +++ b/Source/Genes/GenitaliaSize/Gene_BigMaleGenitalia.cs @@ -1,17 +1,11 @@ -using Verse; -using rjw; -using System; - -namespace RJW_Genes +namespace RJW_Genes { - public class Gene_BigMaleGenitalia : Gene + public class Gene_BigMaleGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); SizeAdjuster.AdjustAllPenisSizes(pawn,0.5f,1.0f); } diff --git a/Source/Genes/GenitaliaSize/Gene_LooseAnus.cs b/Source/Genes/GenitaliaSize/Gene_LooseAnus.cs index 92a237d..f5a5312 100644 --- a/Source/Genes/GenitaliaSize/Gene_LooseAnus.cs +++ b/Source/Genes/GenitaliaSize/Gene_LooseAnus.cs @@ -1,17 +1,11 @@ -using Verse; -using rjw; -using System; - -namespace RJW_Genes +namespace RJW_Genes { - public class Gene_LooseAnus : Gene + public class Gene_LooseAnus : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); SizeAdjuster.AdjustAllAnusSizes(pawn, 0.5f, 1.0f); } @@ -24,6 +18,5 @@ namespace RJW_Genes - } } diff --git a/Source/Genes/GenitaliaSize/Gene_LooseFemaleGenitalia.cs b/Source/Genes/GenitaliaSize/Gene_LooseFemaleGenitalia.cs index c14d5fd..68578b6 100644 --- a/Source/Genes/GenitaliaSize/Gene_LooseFemaleGenitalia.cs +++ b/Source/Genes/GenitaliaSize/Gene_LooseFemaleGenitalia.cs @@ -1,17 +1,11 @@ -using Verse; -using rjw; -using System; - -namespace RJW_Genes +namespace RJW_Genes { - public class Gene_LooseFemaleGenitalia : Gene + public class Gene_LooseFemaleGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); SizeAdjuster.AdjustAllVaginaSizes(pawn, 0.5f, 1.0f); } diff --git a/Source/Genes/GenitaliaSize/Gene_NormalAnus.cs b/Source/Genes/GenitaliaSize/Gene_NormalAnus.cs index 85370db..8ee0a45 100644 --- a/Source/Genes/GenitaliaSize/Gene_NormalAnus.cs +++ b/Source/Genes/GenitaliaSize/Gene_NormalAnus.cs @@ -6,14 +6,12 @@ namespace RJW_Genes /// /// Dummy Gene that does not alter the genitalia size. Normal RJW Logic and rolled sizes are kept. /// - public class Gene_NormalAnus : Gene + public class Gene_NormalAnus : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); } } diff --git a/Source/Genes/GenitaliaSize/Gene_NormalBreasts.cs b/Source/Genes/GenitaliaSize/Gene_NormalBreasts.cs index ec71b51..2b8f193 100644 --- a/Source/Genes/GenitaliaSize/Gene_NormalBreasts.cs +++ b/Source/Genes/GenitaliaSize/Gene_NormalBreasts.cs @@ -1,19 +1,16 @@ -using Verse; -using rjw; +using rjw; namespace RJW_Genes { /// /// Dummy Gene that does not alter the genitalia size. Normal RJW Logic and rolled sizes are kept. /// - public class Gene_NormalBreasts : Gene + public class Gene_NormalBreasts : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); } } diff --git a/Source/Genes/GenitaliaSize/Gene_NormalFemaleGenitalia.cs b/Source/Genes/GenitaliaSize/Gene_NormalFemaleGenitalia.cs index d00278f..fce0c87 100644 --- a/Source/Genes/GenitaliaSize/Gene_NormalFemaleGenitalia.cs +++ b/Source/Genes/GenitaliaSize/Gene_NormalFemaleGenitalia.cs @@ -6,14 +6,12 @@ namespace RJW_Genes /// /// Dummy Gene that does not alter the genitalia size. Normal RJW Logic and rolled sizes are kept. /// - public class Gene_NormalFemaleGenitalia : Gene + public class Gene_NormalFemaleGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); } diff --git a/Source/Genes/GenitaliaSize/Gene_NormalMaleGenitalia.cs b/Source/Genes/GenitaliaSize/Gene_NormalMaleGenitalia.cs index 0c3a89c..2fa6247 100644 --- a/Source/Genes/GenitaliaSize/Gene_NormalMaleGenitalia.cs +++ b/Source/Genes/GenitaliaSize/Gene_NormalMaleGenitalia.cs @@ -1,19 +1,14 @@ -using Verse; -using rjw; - -namespace RJW_Genes +namespace RJW_Genes { /// /// Dummy Gene that does not alter the genitalia size. Normal RJW Logic and rolled sizes are kept. /// - public class Gene_NormalMaleGenitalia : Gene + public class Gene_NormalMaleGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); } } diff --git a/Source/Genes/GenitaliaSize/Gene_SmallBreasts.cs b/Source/Genes/GenitaliaSize/Gene_SmallBreasts.cs index 01c1b74..d5b4a4e 100644 --- a/Source/Genes/GenitaliaSize/Gene_SmallBreasts.cs +++ b/Source/Genes/GenitaliaSize/Gene_SmallBreasts.cs @@ -1,17 +1,11 @@ -using Verse; -using rjw; -using System; - -namespace RJW_Genes +namespace RJW_Genes { - public class Gene_SmallBreasts : Gene + public class Gene_SmallBreasts : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); SizeAdjuster.AdjustAllBreastSizes(pawn, 0.0f, 0.5f); } diff --git a/Source/Genes/GenitaliaSize/Gene_SmallMaleGenitalia.cs b/Source/Genes/GenitaliaSize/Gene_SmallMaleGenitalia.cs index d9faebb..12ba154 100644 --- a/Source/Genes/GenitaliaSize/Gene_SmallMaleGenitalia.cs +++ b/Source/Genes/GenitaliaSize/Gene_SmallMaleGenitalia.cs @@ -1,17 +1,11 @@ -using Verse; -using rjw; -using System; - -namespace RJW_Genes +namespace RJW_Genes { - public class Gene_SmallMaleGenitalia : Gene + public class Gene_SmallMaleGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); SizeAdjuster.AdjustAllPenisSizes(pawn,0.0f,0.5f); } diff --git a/Source/Genes/GenitaliaSize/Gene_TightAnus.cs b/Source/Genes/GenitaliaSize/Gene_TightAnus.cs index 3a77026..56f52cd 100644 --- a/Source/Genes/GenitaliaSize/Gene_TightAnus.cs +++ b/Source/Genes/GenitaliaSize/Gene_TightAnus.cs @@ -1,17 +1,11 @@ -using Verse; -using rjw; -using System; - -namespace RJW_Genes +namespace RJW_Genes { - public class Gene_TightAnus : Gene + public class Gene_TightAnus : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); SizeAdjuster.AdjustAllAnusSizes(pawn, 0.0f, 0.5f); } diff --git a/Source/Genes/GenitaliaSize/Gene_TightFemaleGenitalia.cs b/Source/Genes/GenitaliaSize/Gene_TightFemaleGenitalia.cs index d7cc216..53ec2a7 100644 --- a/Source/Genes/GenitaliaSize/Gene_TightFemaleGenitalia.cs +++ b/Source/Genes/GenitaliaSize/Gene_TightFemaleGenitalia.cs @@ -1,17 +1,11 @@ -using Verse; -using rjw; -using System; - -namespace RJW_Genes +namespace RJW_Genes { - public class Gene_TightFemaleGenitalia : Gene + public class Gene_TightFemaleGenitalia : RJW_Gene { public override void PostMake() { base.PostMake(); - if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) - Sexualizer.sexualize_pawn(pawn); SizeAdjuster.AdjustAllVaginaSizes(pawn, 0.0f, 0.5f); } diff --git a/Source/Genes/RJW_Gene.cs b/Source/Genes/RJW_Gene.cs new file mode 100644 index 0000000..d03440c --- /dev/null +++ b/Source/Genes/RJW_Gene.cs @@ -0,0 +1,16 @@ +using rjw; +using Verse; + +namespace RJW_Genes +{ + public class RJW_Gene : Gene + { + + public override void PostMake() + { + base.PostMake(); + if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) + Sexualizer.sexualize_pawn(pawn); + } + } +} diff --git a/Source/Rjw-Genes.csproj b/Source/Rjw-Genes.csproj index 015652e..a284e5d 100644 --- a/Source/Rjw-Genes.csproj +++ b/Source/Rjw-Genes.csproj @@ -58,6 +58,9 @@ + + + @@ -80,6 +83,7 @@ +