From bfdcac73ef4dea6350079f3d73a5673259873b0d Mon Sep 17 00:00:00 2001 From: AblativeAbsolute Date: Sat, 17 Sep 2022 02:18:16 +0000 Subject: [PATCH] Implemented basic exhibitionism precept --- Defs/PreceptDefs/Precepts_Exhibitionism.xml | 66 ++++++++++++++++++ Source/Scripts/Extensions/PawnExtension.cs | 9 ++- .../Utilities/SexInteractionUtility.cs | 20 ++++-- Textures/UI/Issues/Exhibitionism.png | Bin 0 -> 3800 bytes 4 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 Defs/PreceptDefs/Precepts_Exhibitionism.xml create mode 100644 Textures/UI/Issues/Exhibitionism.png 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 0000000000000000000000000000000000000000..6db94f9d397e09fa05d235aa2a3c5ee56a70bd0a GIT binary patch literal 3800 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 O0000