using HarmonyLib; using RimWorld; using Verse; using System; using System.Collections.Generic; using rjw; using rjw.Modules.Interactions.Enums; using System.Linq; using System.Reflection; namespace rjwfh { [StaticConstructorOnStartup] internal static class InitHarmonyPatches { static InitHarmonyPatches() { var har = new Harmony("rjw.FH"); har.PatchAll(Assembly.GetExecutingAssembly()); } } [HarmonyPatch(typeof(AfterSexUtility), "think_about_sex", new Type[] { typeof(Pawn), typeof(Pawn), typeof(bool), typeof(SexProps), typeof(bool)})] [StaticConstructorOnStartup] static class Holefuck_AfterSexUtility_think_about_sex { public static readonly ThoughtDef RJW_fucker = DefDatabase.GetNamed("RJW_Holefucker"); public static readonly ThoughtDef RJW_fucked = DefDatabase.GetNamed("RJW_Holefucked"); [HarmonyPostfix] private static void think_about_sex_Patch(Pawn pawn, Pawn partner, bool isReceiving, SexProps props, bool whoring = false) { try { if (partner == null) { return; } Pawn p1 = pawn; Pawn p2 = partner; List p1p = new List(); List p2p = new List(); List p1pf = new List(); List p2pf = new List(); Hediff pp = null; Hediff hole = null; ThoughtDef T = null; int size = 0; //Log.Message("p1 " + p1.Name); //Log.Message("p2 " + p2.Name); if (props.sexType == xxx.rjwSextype.Vaginal) { //Log.Message("Vaginal"); var interaction = rjw.Modules.Interactions.Helpers.InteractionHelper.GetWithExtension(props.dictionaryKey); //pp fucks hole if (interaction.DominantHasTag(GenitalTag.CanPenetrate) && interaction.SubmissiveHasFamily(GenitalFamily.Vagina)) { //initiator fucks reciever //Log.Message("straight"); if (!isReceiving) {//p1(initiator) fucks p2(reciever) p1pf.AddRange(p1.GetGenitalsList().Where(x => Genital_Helper.is_penis(x))); p2pf.AddRange(p2.GetGenitalsList().Where(x => Genital_Helper.is_vagina(x))); T = RJW_fucker; pp = p1pf.FirstOrDefault(); hole = p2pf.FirstOrDefault(); } else {//p1(reciever) fucked by p2(initiator) p1pf.AddRange(p1.GetGenitalsList().Where(x => Genital_Helper.is_vagina(x))); p2pf.AddRange(p2.GetGenitalsList().Where(x => Genital_Helper.is_penis(x))); T = RJW_fucked; pp = p2pf.FirstOrDefault(); hole = p1pf.FirstOrDefault(); } if (p1pf.NullOrEmpty()) return; if (p2pf.NullOrEmpty()) return; } //hole "fucks" pp else if (interaction.DominantHasFamily(GenitalFamily.Vagina) && interaction.SubmissiveHasTag(GenitalTag.CanPenetrate) && interaction.HasInteractionTag(InteractionTag.Reverse)) { //initiator fucks (reverse fucked by/rides) reciever //Log.Message("reverse"); if (!isReceiving) {//p1(initiator) fucked by p2(reciever) p1pf.AddRange(p1.GetGenitalsList().Where(x => Genital_Helper.is_vagina(x))); p2pf.AddRange(p2.GetGenitalsList().Where(x => Genital_Helper.is_penis(x))); T = RJW_fucked; pp = p2pf.FirstOrDefault(); hole = p1pf.FirstOrDefault(); } else {//p1(reciever) fucks p2(initiator) p2pf.AddRange(p2.GetGenitalsList().Where(x => Genital_Helper.is_vagina(x))); p1pf.AddRange(p1.GetGenitalsList().Where(x => Genital_Helper.is_penis(x))); T = RJW_fucker; pp = p1pf.FirstOrDefault(); hole = p2pf.FirstOrDefault(); } if (p1pf.NullOrEmpty()) return; if (p2pf.NullOrEmpty()) return; } else { return; } } if (props.sexType == xxx.rjwSextype.Anal) { //Log.Message("Anal"); var interaction = rjw.Modules.Interactions.Helpers.InteractionHelper.GetWithExtension(props.dictionaryKey); //pp fucks hole if (interaction.DominantHasTag(GenitalTag.CanPenetrate) && interaction.SubmissiveHasFamily(GenitalFamily.Anus)) { //initiator fucks reciever //Log.Message("straight"); if (!isReceiving) {//p1(initiator) fucks p2(reciever) p1pf.AddRange(p1.GetGenitalsList().Where(x => Genital_Helper.is_penis(x))); p2pf.AddRange(p2.GetAnusList()); T = RJW_fucker; pp = p1pf.FirstOrDefault(); hole = p2pf.FirstOrDefault(); } else {//p1(reciever) fucked by p2(initiator) p1pf.AddRange(p1.GetAnusList()); p2pf.AddRange(p2.GetGenitalsList().Where(x => Genital_Helper.is_penis(x))); T = RJW_fucked; pp = p2pf.FirstOrDefault(); hole = p1pf.FirstOrDefault(); } if (p1pf.NullOrEmpty()) return; if (p2pf.NullOrEmpty()) return; } //hole "fucks" pp else if (interaction.DominantHasFamily(GenitalFamily.Anus) && interaction.SubmissiveHasTag(GenitalTag.CanPenetrate) && interaction.HasInteractionTag(InteractionTag.Reverse)) { //initiator fucks (reverse fucked by/rides) reciever //Log.Message("reverse"); if (!isReceiving) {//p1(initiator) fucked by p2(reciever) p1pf.AddRange(p1.GetAnusList()); p2pf.AddRange(p2.GetGenitalsList().Where(x => Genital_Helper.is_penis(x))); T = RJW_fucked; pp = p2pf.FirstOrDefault(); hole = p1pf.FirstOrDefault(); } else {//p1(reciever) fucks p2(initiator) p2pf.AddRange(p2.GetAnusList()); p1pf.AddRange(p1.GetGenitalsList().Where(x => Genital_Helper.is_penis(x))); T = RJW_fucker; pp = p1pf.FirstOrDefault(); hole = p2pf.FirstOrDefault(); } if (p1pf.NullOrEmpty()) return; if (p2pf.NullOrEmpty()) return; } else { return; } } if (props.sexType == xxx.rjwSextype.DoublePenetration) { //Log.Message("BP"); //todo, maybe return; } var stage = -1; size = size_check(pp, hole); if (size != 0) { if (size < 0) stage = 0; else stage = 1; if (stage != -1) p1.needs.mood.thoughts.memories.TryGainMemory(ThoughtMaker.MakeThought(T, stage), null); } return; } catch (Exception e) { Log.Error(e.ToString()); } } public static int size_check(Hediff pp, Hediff hole) { var i = 0; //Log.Message("size_check:"); //Log.Message("pp " + pp.Severity); //Log.Message("hole " + hole.Severity); //Log.Message("dif " + (pp.Severity - hole.Severity)); if (pp.Severity - hole.Severity >= 0.2) // tight { //Log.Message("tight"); i++; } else if (pp.Severity - hole.Severity <= -0.2) // loose { //Log.Message("loose"); i--; } else // okayish { //Log.Message("okayish"); } return i; } } }