rjw_menstruation/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs

121 lines
4.5 KiB
C#

using HarmonyLib;
using rjw;
using Verse;
namespace RJW_Menstruation
{
[HarmonyPatch(typeof(PregnancyHelper), "impregnate")]
public static class impregnate_Patch
{
public static bool Prefix(Pawn pawn, Pawn partner, xxx.rjwSextype sextype = xxx.rjwSextype.None)
{
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;
}
}
[HarmonyPatch(typeof(PregnancyHelper), "Doimpregnate")]
public static class Doimpregnate_Patch
{
public static bool Prefix(Pawn pawn, Pawn partner) // partner has vagina
{
if (partner.IsAnimal() && !Configurations.EnableAnimalCycle) return true;
HediffComp_Menstruation comp = partner.GetMenstruationComp();
if (comp != null)
{
if (AndroidsCompatibility.IsAndroid(pawn) && !AndroidsCompatibility.AndroidPenisFertility(pawn))
{
comp.CumIn(pawn, pawn.GetCumVolume(), 0);
return false;
}
else comp.CumIn(pawn, pawn.GetCumVolume(), pawn.health.capacities.GetLevel(xxx.reproduction));
return false;
}
ModLog.Message("used original rjw method: Comp missing");
return true;
}
}
}