using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; using RimWorld; using Verse; using Verse.AI; using Verse.AI.Group; using rjw; namespace Privacy_Please { public static class PrivacyUtility { public static void PrivacyCheckForPawn(Pawn pawn, float radius) { if (pawn.IsHavingSex() == false && pawn.IsMasturbating() == false) { return; } if (BasicSettings.ignoreRitualAndPartySex && pawn.IsPartOfRitualOrGathering()) { return; } // Local variables JobDriver_Sex jobDriver = pawn.jobs.curDriver as JobDriver_Sex; pawn.IsInBed(out Building bed); foreach (Thing thing in GenRadial.RadialDistinctThingsAround(pawn.Position, pawn.Map, radius, true)) { Pawn witness = thing as Pawn; if (witness == null) continue; // Caught having sex if (SexInteractionUtility.PawnCaughtLovinByWitness(pawn, witness)) { // Get the pawn's and witness' reaction to the discovery SexInteractionUtility.GetReactionsToSexDiscovery(jobDriver, witness, out ReactionToSexDiscovery reactionOfPawn, out ReactionToSexDiscovery reactionOfWitness, true); bool tryToPropositionTheWitness = Random.value < BasicSettings.chanceForOtherToJoinInSex && SexInteractionUtility.PasserbyCanBePropositionedForSex(witness, pawn.GetAllSexParticipants()); // Try to proposition the witness if ((int)reactionOfPawn >= (int)ReactionToSexDiscovery.Acceptance && (int)reactionOfWitness >= (int)ReactionToSexDiscovery.Acceptance && tryToPropositionTheWitness) { // Voyeurism if (pawn.IsVoyeur() || (pawn.IsCuckold() && SexInteractionUtility.SexParticipantsIncludesACheatingPartner(witness, pawn.GetAllSexParticipants()))) { Job job = new Job(DefDatabase.GetNamed("WatchSex", false), pawn.GetSexReceiver(), bed); witness.jobs.TryTakeOrderedJob(job); } // Consensual sex else if (pawn.IsMasturbating()) { if (bed == null) { Job job = new Job(xxx.quick_sex, pawn); witness.jobs.TryTakeOrderedJob(job); } else { Job job = new Job(xxx.casual_sex, pawn, bed); witness.jobs.TryTakeOrderedJob(job); } } // Threesome else if (pawn.GetSexReceiver() != null) { Job job = new Job(DefDatabase.GetNamed("JoinInSex", false), pawn.GetSexReceiver(), bed); witness.jobs.TryTakeOrderedJob(job); } } // The proposition failed. Awwkkkwaaarrddd.... else if (pawn.IsUnfazedBySex() == false && (int)reactionOfPawn < (int)ReactionToSexDiscovery.Approval) { if (BasicSettings.whoringIsUninteruptable && jobDriver?.Sexprops.isWhoring == true) { return; } // The pawn is uncomfortable and is stopping sex foreach (Pawn participant in pawn.GetAllSexParticipants()) { participant.jobs.EndCurrentJob(JobCondition.InterruptForced, false, false); } } } } } } }