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