privacy-please/Source/Scripts/Utilities/PrivacyUtility.cs

96 lines
3.3 KiB
C#
Raw Normal View History

using System.Collections.Generic;
2022-11-04 13:52:17 +00:00
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
2022-11-04 13:52:17 +00:00
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)
2022-11-04 13:52:17 +00:00
{
2023-01-31 06:06:52 +00:00
if (pawn.IsHavingSex() == false && pawn.IsMasturbating() == false) return;
if (pawn.IsUnableToSenseSex() || pawn.RaceProps.Animal || pawn.RaceProps.IsMechanoid) return;
if (BasicSettings.ignoreRitualAndPartySex && pawn.IsPartOfRitualOrGathering()) return;
2022-11-04 13:52:17 +00:00
// Local variables
JobDriver_Sex jobDriver = pawn.jobs.curDriver as JobDriver_Sex;
2023-01-31 06:06:52 +00:00
if (jobDriver == null) return;
2022-11-04 13:52:17 +00:00
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;
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);
2023-01-29 16:54:14 +00:00
bool tryToPropositionTheWitness = Random.value < BasicSettings.chanceForOtherToJoinInSex && jobDriver?.Sexprops.isWhoring != true && SexInteractionUtility.PasserbyCanBePropositionedForSex(witness, pawn.GetAllSexParticipants());
// Try to proposition the witness
if ((int)reactionOfPawn >= (int)ReactionToSexDiscovery.Acceptance && (int)reactionOfWitness >= (int)ReactionToSexDiscovery.Acceptance && tryToPropositionTheWitness)
{
// Voyeurism
2023-01-31 06:06:52 +00:00
if (witness.IsVoyeur() || (witness.IsCuckold() && SexInteractionUtility.SexParticipantsIncludesACheatingPartner(witness, pawn.GetAllSexParticipants())))
2022-11-04 13:52:17 +00:00
{
2023-01-31 06:06:52 +00:00
pawn.interactions.TryInteractWith(witness, ModInteractionDefOf.InviteVoyeurism);
Job job = new Job(ModJobDefOf.WatchSex, pawn);
witness.jobs.TryTakeOrderedJob(job);
2022-11-04 13:52:17 +00:00
}
// Consensual sex
2022-11-04 13:52:17 +00:00
else if (pawn.IsMasturbating())
{
2023-01-31 06:06:52 +00:00
pawn.interactions.TryInteractWith(witness, ModInteractionDefOf.InviteToHaveSex);
2022-11-04 13:52:17 +00:00
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);
}
}
2023-01-26 06:36:18 +00:00
// Group sex
else
2022-11-04 13:52:17 +00:00
{
2023-01-31 06:06:52 +00:00
pawn.interactions.TryInteractWith(witness, ModInteractionDefOf.InviteToHaveGroupSex);
2022-11-04 13:52:17 +00:00
Job job = new Job(DefDatabase<JobDef>.GetNamed("JoinInSex", false), pawn.GetSexReceiver(), bed);
witness.jobs.TryTakeOrderedJob(job);
}
}
2023-01-26 06:36:18 +00:00
// The proposition failed. Is this awkward for those having sex?
2023-01-29 16:54:14 +00:00
else if ((int)reactionOfPawn < (int)ReactionToSexDiscovery.Uncaring)
2023-01-26 06:36:18 +00:00
{
// The pawn is uncomfortable and is stopping sex
foreach (Pawn participant in pawn.GetAllSexParticipants())
2023-01-29 16:54:14 +00:00
{
JobDriver_Sex participantJobDriver = participant.jobs.curDriver as JobDriver_Sex;
if (participantJobDriver?.ticks_left > 60)
{ participantJobDriver.ticks_left = 60; }
}
}
2022-11-04 13:52:17 +00:00
}
}
}
}
}