/// <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; } }