Added a Gene for Specified Sex using RJW Logic

This commit is contained in:
Vegapnk 2022-11-20 17:33:50 +01:00
parent bf4303177e
commit 95fc9b89a0
42 changed files with 318 additions and 186 deletions

View file

@ -0,0 +1,73 @@
using Verse;
using rjw;
using RimWorld;
using System.Collections;
using System.Linq;
using System;
namespace RJW_Genes
{
public class GenderUtility
{
/// <summary>
/// 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.
/// </summary>
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));
}
/// <summary>
/// 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.
/// </summary>
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));
}
/// <summary>
/// Adjusts the Body Type to match the given target gender
/// (for male and female only, baby,child and hulks don't change)
/// </summary>
/// <param name="pawn"></param>
/// <param name="targetGender"></param>
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<HeadTypeDef>.AllDefs.Where((Func<HeadTypeDef, bool>)(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();
}
}
}

View file

@ -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);
}
}
}
}

View file

@ -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);
}
}
}
}