static void AddDirectRelation_GiveLacrating(Pawn_RelationsTracker __instance, PawnRelationDef def, Pawn otherPawn) { if (def == PawnRelationDefOf.Parent) { Pawn pawn = (Pawn)PawnFI.GetValue(__instance); Pawn mother = pawn.GetMother(); //Log.Message("mother : " + pawn.LabelIndefinite()); if (pawn.ageTracker.CurLifeStageIndex == AgeStage.Baby && mother == otherPawn) { if (mother.RaceProps.Humanlike && !mother.health.hediffSet.HasHediff(HediffDef.Named("Lactating"))) { if (AnotherModCheck.RJW_On) { try { ((Action)(() => { if (Genital_Helper.has_breasts(mother)) { mother.health.AddHediff(HediffDef.Named("Lactating"), ChildrenUtility.GetPawnBodyPart(mother, "Chest"), null); } if (Genital_Helper.has_vagina(mother)) { mother.health.AddHediff(HediffDef.Named("BnC_RJW_PostPregnancy"), ChildrenUtility.GetPawnBodyPart(mother, "Genitals"), null); } }))(); } catch (TypeLoadException) { } } else { mother.health.AddHediff(HediffDef.Named("Lactating"), ChildrenUtility.GetPawnBodyPart(mother, "Torso"), null); } } } } }
/// <summary> /// This method discovers all penetrations in the sex act and applies respective damage /// </summary> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="rape"></param> /// <param name="sextype"></param> /// <returns>Empty list if no eligible penetrations found, or an element for each penetration (can be DP etc.)</returns> public static void ProcessPenetrations(Pawn p1, Pawn p2, bool rape, xxx.rjwSextype sextype) { Dyspareunia.Log("Checking " + sextype + (rape ? " rape" : " sex") + " between " + p1.Label + " and " + p2.Label + "."); switch (sextype) { case xxx.rjwSextype.Vaginal: if (Dyspareunia.HasPenetratingOrgan(p1) && Genital_Helper.has_vagina(p2)) { ApplyDamage(Genital_Helper.get_penis_all(p1), Dyspareunia.GetVagina(p2), rape); } else { ApplyDamage(Genital_Helper.get_penis_all(p2), Dyspareunia.GetVagina(p1), false); } break; case xxx.rjwSextype.Anal: if (Dyspareunia.HasPenetratingOrgan(p1) && Genital_Helper.has_anus(p2)) { ApplyDamage(Genital_Helper.get_penis_all(p1), Dyspareunia.GetAnus(p2), rape); } else { ApplyDamage(Genital_Helper.get_penis_all(p2), Dyspareunia.GetAnus(p1), false); } break; case xxx.rjwSextype.Oral: // Oral penetration not supported ATM break; case xxx.rjwSextype.DoublePenetration: if (Genital_Helper.has_multipenis(p1) && Genital_Helper.has_vagina(p2) && Genital_Helper.has_anus(p2)) { ApplyDamage(Genital_Helper.get_penis_all(p1), Dyspareunia.GetVagina(p2), rape); ApplyDamage(Genital_Helper.get_penis_all(p1), Dyspareunia.GetAnus(p2), rape); } else { ApplyDamage(Genital_Helper.get_penis_all(p2), Dyspareunia.GetVagina(p1), false); ApplyDamage(Genital_Helper.get_penis_all(p2), Dyspareunia.GetAnus(p1), false); } break; case xxx.rjwSextype.Fingering: if (Genital_Helper.has_vagina(p2) || Genital_Helper.has_anus(p2)) { ApplyDamage(p1, GetFingerSize(p1), Dyspareunia.GetVagina(p2) ?? Dyspareunia.GetAnus(p2), rape); } else { ApplyDamage(p2, GetFingerSize(p2), Dyspareunia.GetVagina(p1) ?? Dyspareunia.GetAnus(p1), false); } break; case xxx.rjwSextype.Fisting: if (Genital_Helper.has_vagina(p2) || Genital_Helper.has_anus(p2)) { ApplyDamage(p1, GetHandSize(p1), Dyspareunia.GetVagina(p2) ?? Dyspareunia.GetAnus(p2), rape); } else { ApplyDamage(p2, GetHandSize(p2), Dyspareunia.GetVagina(p1) ?? Dyspareunia.GetAnus(p1), false); } break; case xxx.rjwSextype.MechImplant: Dyspareunia.Log("Processing mech implant sex between " + p1.Label + " and " + p2.Label); if (p1.kindDef.race.defName.ContainsAny("Mech_Centipede", "Mech_Lancer", "Mech_Scyther", "Mech_Crawler", "Mech_Skullywag", "Mech_Flamebot", "Mech_Mammoth", "Mech_Assaulter")) { ApplyDamage(p1, p1.BodySize, Dyspareunia.GetVagina(p2) ?? Dyspareunia.GetAnus(p2), rape); } else { ApplyDamage(p2, p2.BodySize, Dyspareunia.GetVagina(p1) ?? Dyspareunia.GetAnus(p1), false); } break; } }
public static bool Prefix(SexProps props) { xxx.rjwSextype sextype = props.sexType; Pawn pawn = props.pawn; Pawn partner = props.partner; if (sextype == xxx.rjwSextype.Vaginal) { var pawnpartBPR = Genital_Helper.get_genitalsBPR(pawn); var maleparts = Genital_Helper.get_PartsHediffList(pawn, pawnpartBPR); var partnerpartBPR = Genital_Helper.get_genitalsBPR(partner); var femaleparts = Genital_Helper.get_PartsHediffList(partner, partnerpartBPR); Pawn female = null, male = null; if (Genital_Helper.has_vagina(partner, femaleparts)) { female = partner; male = pawn; } else if (Genital_Helper.has_vagina(pawn, maleparts)) { female = pawn; femaleparts = maleparts; male = partner; maleparts = Genital_Helper.get_PartsHediffList(partner, partnerpartBPR); } else { return(true); } if (female.IsAnimal() && !Configurations.EnableAnimalCycle) { return(true); } HediffComp_Menstruation comp = female.GetMenstruationComp(); if (comp != null) { if (Genital_Helper.has_penis_fertile(male, maleparts) && PregnancyHelper.CanImpregnate(male, female, sextype)) { PregnancyHelper.Doimpregnate(male, female); return(false); } else if (Genital_Helper.has_ovipositorM(male, maleparts)) { comp.CumIn(male, Rand.Range(0.5f, 3.0f) * RJWSettings.cum_on_body_amount_adjust * male.BodySize, 1.0f); } else { comp.CumIn(male, male.GetCumVolume(maleparts), 0); } } //if (Genital_Helper.has_vagina(partner, partnerparts)) //{ // if (partner.IsAnimal() && !Configurations.EnableAnimalCycle) return true; // HediffComp_Menstruation comp = Utility.GetMenstruationComp(partner); // if (comp != null) // { // if (Genital_Helper.has_penis_fertile(pawn, pawnparts) && PregnancyHelper.CanImpregnate(pawn, partner, sextype)) // { // PregnancyHelper.Doimpregnate(pawn, partner); // return false; // } // else comp.CumIn(pawn, pawn.GetCumVolume(), 0); // } //} //else if (Genital_Helper.has_vagina(pawn, pawnparts)) //{ // if (pawn.IsAnimal() && !Configurations.EnableAnimalCycle) return true; // HediffComp_Menstruation comp = Utility.GetMenstruationComp(pawn); // if (comp != null) // { // if (Genital_Helper.has_penis_fertile(partner, partnerparts) && PregnancyHelper.CanImpregnate(partner, pawn, sextype)) // { // PregnancyHelper.Doimpregnate(partner, pawn); // return false; // } // else comp.CumIn(partner, partner.GetCumVolume(), 0); // } //} } return(true); }