diff --git a/Defs/PreceptDefs/Precepts_Exhibitionism.xml b/Defs/PreceptDefs/Precepts_Exhibitionism.xml new file mode 100644 index 0000000..1f5dd22 --- /dev/null +++ b/Defs/PreceptDefs/Precepts_Exhibitionism.xml @@ -0,0 +1,66 @@ + + + + + Exhibitionism + + UI/Issues/Exhibitionism + + + + + Exhibitionism_Disapproved + Exhibitionism + + Pawns will care about others performing sexual acts before them and will feel embarassed. + Low + 50 + 1000 + 100 + + + + Exhibitionism_Forbidden + Exhibitionism + + The display of physical affections in front of others is a major taboo. + High + 40 + 1000 + 100 + + + + Exhibitionism_Acceptable + Exhibitionism + + Pawns will not care about others performing sexual acts before them. + Low + 30 + 1000 + 100 + + + + Exhibitionism_Approved + Exhibitionism + + The display of physical affection before others is encouraged. + Medium + 20 + 1000 + 100 + + + \ No newline at end of file diff --git a/Source/Scripts/Extensions/PawnExtension.cs b/Source/Scripts/Extensions/PawnExtension.cs index 2cb71f2..34ecf05 100644 --- a/Source/Scripts/Extensions/PawnExtension.cs +++ b/Source/Scripts/Extensions/PawnExtension.cs @@ -129,7 +129,14 @@ namespace Rimworld_Animations_Patch { return true; } bool hasPrivacy = true; - bool isExhibitionist = pawn.HasTrait("Exhibitionist") || xxx.has_quirk(pawn, "Exhibitionist"); + bool isExhibitionismAllowedByPrecept = false; + + Precept precept = new Precept(); + if (HasPreceptForIssue(pawn, DefDatabase.GetNamedSilentFail("Exhibitionism"), out precept)) { + isExhibitionismAllowedByPrecept = !IssueIsMajorTaboo(pawn, DefDatabase.GetNamedSilentFail("Exhibitionism"), out precept) && !IssueIsMinorTaboo(pawn, DefDatabase.GetNamedSilentFail("Exhibitionism"), out precept); + } + + bool isExhibitionist = pawn.HasTrait("Exhibitionist") || xxx.has_quirk(pawn, "Exhibitionist") || isExhibitionismAllowedByPrecept; pawn.IsInBed(out Building bed); diff --git a/Source/Scripts/Utilities/SexInteractionUtility.cs b/Source/Scripts/Utilities/SexInteractionUtility.cs index c1aff20..edfa231 100644 --- a/Source/Scripts/Utilities/SexInteractionUtility.cs +++ b/Source/Scripts/Utilities/SexInteractionUtility.cs @@ -91,7 +91,10 @@ namespace Rimworld_Animations_Patch else if (BasicSettings.worryAboutXeno && sexIsXeno) { tabooStatus = GetTabooStatusOfIssue(pawn, DefDatabase.GetNamedSilentFail("HAR_AlienDating"), TabooStatus.NotTaboo, out precept); } - + + else + { tabooStatus = GetTabooStatusOfIssue(pawn, DefDatabase.GetNamedSilentFail("Exhibitionism"), TabooStatus.NotTaboo, out precept); } + //DebugMode.Message("Sex job is: " + jobDriver + " Issue is: " + (precept?.def?.issue?.defName).ToStringSafe() + " Opinion is: " + (precept?.def?.defName).ToStringSafe() + " Judgement is: " + tabooStatus.ToString()); return tabooStatus; @@ -120,15 +123,18 @@ namespace Rimworld_Animations_Patch JobDriver_Sex jobDriver = pawn.jobs.curDriver as JobDriver_Sex; + bool pawnExhibitionismAllowedByPrecept = pawn.Ideo.HasPrecept(DefDatabase.GetNamedSilentFail("Exhibitionism_Approved")); + bool witnessVoyeurismAllowedByPrecept = witness.Ideo.HasPrecept(DefDatabase.GetNamedSilentFail("Exhibitionism_Approved")); + string pawnThoughtDefName = pawn.IsMasturbating() ? "SeenMasturbating" : "SeenHavingSex"; string witnessThoughtDefName = pawn.IsMasturbating() ? "SawMasturbation" : "SawSex"; bool pawnIsExhibitionist = pawn.HasTrait("Exhibitionist") || xxx.has_quirk(pawn, "Exhibitionist"); - if (pawnIsExhibitionist) + if (pawnIsExhibitionist || pawnExhibitionismAllowedByPrecept) { pawnThoughtDefName += "Exhibitionist"; } bool witnessIsVoyeur = witness.HasTrait("Voyeur") || xxx.has_quirk(witness, "Voyeur"); - if (witnessIsVoyeur) + if (witnessIsVoyeur || witnessVoyeurismAllowedByPrecept) { witnessThoughtDefName += "Voyeur"; } bool sexIsRitual = pawn.GetLord() != null && pawn.GetLord().LordJob is LordJob_Ritual && witness?.Ideo == pawn?.Ideo; @@ -140,6 +146,8 @@ namespace Rimworld_Animations_Patch // Determine if there are any issues with the witness' morals TabooStatus tabooStatus = CheckSexJobAgainstMorals(witness, jobDriver, out Precept precept); + bool witnessNoSpecialReaction = witness.Ideo.HasPrecept(DefDatabase.GetNamedSilentFail("Exhibitionism_Acceptable")) && !witnessIsVoyeur; + if (tabooStatus == TabooStatus.MajorTaboo) { witnessThoughtDefName = "SawMajorTaboo"; witnessJoiningSex = false; } @@ -149,7 +157,7 @@ namespace Rimworld_Animations_Patch else if (pawnIsCheating) { witnessThoughtDefName = "CheatedOnMe"; witnessJoiningSex = false; } - else if (BasicSettings.needPrivacy == false) + else if (BasicSettings.needPrivacy == false || witnessNoSpecialReaction) { witnessThoughtDefName = ""; } // Apply thoughts to witness @@ -212,6 +220,8 @@ namespace Rimworld_Animations_Patch // Check issue against pawn precepts tabooStatus = CheckSexJobAgainstMorals(pawn, jobDriver, out precept); + bool pawnNoSpecialReaction = pawn.Ideo.HasPrecept(DefDatabase.GetNamedSilentFail("Exhibitionism_Acceptable")) && !pawnIsExhibitionist; + if (tabooStatus == TabooStatus.MajorTaboo) { pawnThoughtDefName = "SeenCommittingMajorTaboo"; witnessJoiningSex = false; } @@ -221,7 +231,7 @@ namespace Rimworld_Animations_Patch else if (pawnIsCheating) { pawnThoughtDefName = "CaughtCheating"; witnessJoiningSex = false; } - else if (BasicSettings.needPrivacy == false) + else if (BasicSettings.needPrivacy == false || pawnNoSpecialReaction) { pawnThoughtDefName = ""; } // Apply thoughts to pawn diff --git a/Textures/UI/Issues/Exhibitionism.png b/Textures/UI/Issues/Exhibitionism.png new file mode 100644 index 0000000..6db94f9 Binary files /dev/null and b/Textures/UI/Issues/Exhibitionism.png differ