public static void Doimpregnate(Pawn pawn, Pawn partner) { if (RJWSettings.DevMode) { Log.Message("[RJW] Doimpregnate " + xxx.get_pawnname(pawn) + " is a father, " + xxx.get_pawnname(partner) + " is a mother"); } if (AndroidsCompatibility.IsAndroid(pawn) && !AndroidsCompatibility.AndroidPenisFertility(pawn)) { if (RJWSettings.DevMode) { Log.Message(" Father is android with no arcotech penis, abort"); } return; } if (AndroidsCompatibility.IsAndroid(partner) && !AndroidsCompatibility.AndroidVaginaFertility(partner)) { if (RJWSettings.DevMode) { Log.Message(" Mother is android with no arcotech v****a, abort"); } return; } // fertility check float fertility = RJWPregnancySettings.humanlike_impregnation_chance / 100f; if (xxx.is_animal(partner)) { fertility = RJWPregnancySettings.animal_impregnation_chance / 100f; } // Interspecies modifier if (pawn.def.defName != partner.def.defName) { if (RJWPregnancySettings.complex_interspecies) { fertility *= SexUtility.BodySimilarity(pawn, partner); } else { fertility *= RJWPregnancySettings.interspecies_impregnation_modifier; } } //Rand.PopState(); //Rand.PushState(RJW_Multiplayer.PredictableSeed()); float ReproductionFactor = Math.Min(pawn.health.capacities.GetLevel(xxx.reproduction), partner.health.capacities.GetLevel(xxx.reproduction)); float pregnancy_threshold = fertility * ReproductionFactor; float non_pregnancy_chance = Rand.Value; BodyPartRecord torso = partner.RaceProps.body.AllParts.Find(x => x.def == BodyPartDefOf.Torso); if (non_pregnancy_chance > pregnancy_threshold || pregnancy_threshold == 0) { if (RJWSettings.DevMode) { Log.Message(" Impregnation failed. Chance: " + pregnancy_threshold.ToStringPercent() + " roll: " + non_pregnancy_chance.ToStringPercent()); } return; } if (RJWSettings.DevMode) { Log.Message(" Impregnation succeeded. Chance: " + pregnancy_threshold.ToStringPercent() + " roll: " + non_pregnancy_chance.ToStringPercent()); } PregnancyDecider(partner, pawn); }