Esempio n. 1
0
    private static bool TryGetHybrids(StatRequest req, out IEnumerable <HybridDef> hybridDefs)
    {
        if (AnimalGroupDef.TryGetGroups(req, out var groups))
        {
            hybridDefs = groups.Select(a => HybridDef.TryGetHybrids(a, out var h) ? h : null).Where(h => h != null)
                         .SelectMany(x => x).Select(h => h.Value).SelectMany(x => x).Distinct();
            return(true);
        }

        hybridDefs = default;
        return(false);
    }
    public static bool Guard_Hediff_AnimalFertilityReduced(Pawn male, Pawn female)
    {
        if (
            HybridDef.TryGetHybrids(male.kindDef, female.kindDef, out var hybridList) &&
            hybridList.TryGetRandomElement(out var hybrid) &&
            hybrid.fertilizationFailesIfGreaterThanZeroCurve.TryGetRandomValue(
                out var fertilizationFailesIfGreaterThanZero) &&
            fertilizationFailesIfGreaterThanZero >= 0f
            )
        {
            DogsMateMod.Debug(
                $"fertilizationFailesIfGreaterThanZero: {fertilizationFailesIfGreaterThanZero:0.000}, " +
                "failed"
                );
            return(true);
        }

        var maleHediff   = SeverityOf(male);
        var femaleHediff = SeverityOf(female);

        if (maleHediff <= 0f && femaleHediff <= 0f)
        {
            return(true);
        }

        if (maleHediff >= 1f || femaleHediff >= 1f)
        {
            DogsMateMod.Debug(
                $"male fertility: {(1f - maleHediff) * 100:0.0}%, " +
                $"female fertility: {(1f - femaleHediff) * 100:0.0}%, " +
                "can't fertilize"
                );
            return(false);
        }

        var threshold =
            Mathf.Sqrt((1f - maleHediff) * (1f - femaleHediff) * (1f - Mathf.Max(maleHediff, femaleHediff)));

        DogsMateMod.Debug(
            $"male fertility: {(1f - maleHediff) * 100:0.0}%, " +
            $"female fertility: {(1f - femaleHediff) * 100:0.0}%, " +
            $"fertilation chance:  {threshold * 50:0.0}%" // RimWorld lets every other fertilation fail.
            );
        var value = Rand.Value;

        return(value <= threshold);
    }
Esempio n. 3
0
 public override bool ShouldShowFor(StatRequest req)
 {
     return(AnimalGroupDef.TryGetGroups(req, out var groups) &&
            groups.Any(a => HybridDef.TryGetHybrids(a, out _)));
 }