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); }
public override bool ShouldShowFor(StatRequest req) { return(AnimalGroupDef.TryGetGroups(req, out var groups) && groups.Any(a => HybridDef.TryGetHybrids(a, out _))); }