rjw_menstruation/1.3/source/RJW_Menstruation/RJW_Menstruation/StatParts.cs

90 lines
2.9 KiB
C#

using RimWorld;
using System.Collections.Generic;
using System.Linq;
using Verse;
namespace RJW_Menstruation
{
public abstract class StatPart_Menstruation_Effects : StatPart
{
public override void TransformValue(StatRequest req, ref float val)
{
if (req.Thing is Pawn pawn && ApplicableComps(pawn).Any())
val *= GetFactor(pawn);
}
protected abstract IEnumerable<HediffComp_Menstruation> ApplicableComps(Pawn pawn);
protected IEnumerable<HediffComp_Menstruation> AllComps(Pawn pawn)
{
return pawn.GetMenstruationComps();
}
protected abstract float GetFactor(Pawn pawn);
}
public abstract class StatPart_Climacteric_Effects : StatPart_Menstruation_Effects
{
public override string ExplanationPart(StatRequest req)
{
if (req.Thing is Pawn pawn && ApplicableComps(pawn).Any())
{
return $"{Translations.Stage_Climacteric.CapitalizeFirst()}: x{GetFactor(pawn).ToStringPercent()}";
}
else return null;
}
protected override IEnumerable<HediffComp_Menstruation> ApplicableComps(Pawn pawn)
{
return pawn.GetMenstruationComps().Where(comp => comp.EggHealth < 1f && comp.EggHealth > 0f);
}
}
public abstract class StatPart_Menopause_Effects : StatPart_Menstruation_Effects
{
public override string ExplanationPart(StatRequest req)
{
if (req.Thing is Pawn pawn && ApplicableComps(pawn).Any())
{
return $"{Translations.Stage_Menopause.CapitalizeFirst()}: x{GetFactor(pawn).ToStringPercent()}";
}
else return null;
}
protected override IEnumerable<HediffComp_Menstruation> ApplicableComps(Pawn pawn)
{
return pawn.GetMenstruationComps().Where(comp => comp.EggHealth <= 0f);
}
}
public class StatPart_Climacteric_SexFrequency : StatPart_Climacteric_Effects
{
protected override float GetFactor(Pawn pawn)
{
return AllComps(pawn).Average(comp => comp.SexFrequencyModifier);
}
}
public class StatPart_Climacteric_SexSatisfaction : StatPart_Climacteric_Effects
{
protected override float GetFactor(Pawn pawn)
{
return AllComps(pawn).Average(comp => comp.SexSatisfactionModifier);
}
}
public class StatPart_Menopause_SexFrequency : StatPart_Menopause_Effects
{
protected override float GetFactor(Pawn pawn)
{
return AllComps(pawn).Average(comp => comp.SexFrequencyModifier);
}
}
public class StatPart_Menopause_SexSatisfaction : StatPart_Menopause_Effects
{
protected override float GetFactor(Pawn pawn)
{
return AllComps(pawn).Average(comp => comp.SexSatisfactionModifier);
}
}
}