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 ApplicableComps(Pawn pawn); protected IEnumerable 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 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 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); } } }