Exemplo n.º 1
0
 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);
                 }
             }
         }
     }
 }
Exemplo n.º 2
0
        /// <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;
            }
        }
Exemplo n.º 3
0
        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);
        }