This commit is contained in:
AbstractConcept 2023-01-31 00:06:52 -06:00
parent 2256f28cf8
commit 12b947317e
52 changed files with 444 additions and 689 deletions

Binary file not shown.

Binary file not shown.

View File

@ -26,7 +26,31 @@
<li>rim.job.world</li>
</loadAfter>
<description>
This mod adds a greater awareness of sex to people. When people witness (or are witnessed taking part in) various sexual activities, those involved will exhibit different reactions depending on their traits and ideologies. Sexperience - Ideology is highly recommended in order to help customise your colonists' opinions on different sexual activities.
Sex acts that can provoke reactions include:
- Exhibitionism: Encountering someone lovin' will generally result in the embarrassment of all involved and those copulating to immediately cease their activities (unless they happen to be an Exhibitionist). Reactions can be modified through the Exhibitionism precept
- Masturbation: Finding someone masturbating will likely embarrass both parties. The discovered individual will immediately stopping what they were doing (unless they happen to be an Exhibitionist). Reactions to masturbation can be modified through the Masturbation precept (included in Sexperience - Ideology)
- Cheating: Discovering a partner cheating will greatly upset most people (unless they happen to be a Culkold). Reactions to cheating can be modified through the Infidelity precept
- Bestiality: Witnessing bestiality will generally cause individuals to run away (unless they are a Zoophile). Reactions to bestiality can be modified through the Bestiality precept (included in Sexperience - Ideology)
- Rape: Witnessing rape will generally cause individuals to run away (unless they are a Rapist). Reactions to rape can be modified through the Rape precept (included in Sexperience - Ideology).
- Necrophilia: Witnessing necrophilia will generally cause individuals to run away and likely vomit (unless they are a Necrophile). Reactions to necrophilia can be modified through the Necrophilia precept (included in Sexperience - Ideology).
- Xenophilia: Stumbing upon humanoids of different species lovin' will generally be treated like encountering any other lovein' couple (unless the witness happens to be a Xenophobe). Reactions to xenophilia can be modified through the Alien Dating precept (included in Humanoid Alien Races).
Options have been included to toggle whether people should react to these various sex acts and whether people will turn a blind eye to them during rituals and parties. Additional options have been included to customise how colonists, prisoners, slaves, and members of other factions should react to other.
This mod also provides improved threesome support. Threesomes can now be triggered via two new ways:
- When a pawn sets off to bed their partner a passer-by might be invited to accompany them.
- If a pawn encounters a couple having sex then they may just might be invited to join in.
The chance of a threesome occurring can be configured in the mod options. In all cases, however, those involved must have a good opinion of each other and the passer-by mustn't be doing a player ordered / important job at the time.
Three new RJW quirks are also included - Cuckold, Cuckolder, and Voyeur. Cuckolds like to watch their partners cheated on them, while Cuckolders get a kick out of having their partner watch it happen. Voyeurs just like to watch others in general (providing what they see isn't too upsetting, of course).
Misc features
- Any lewd fluids that pawns produce during sex will not be marked for cleaning until they are done.
</description>
</ModMetaData>

View File

@ -1,30 +1,2 @@
Privacy, Please!
This mod adds a greater awareness of sex to people. When people witness (or are witnessed taking part in) various sexual activities, those involved will exhibit different reactions depending on their traits and ideologies. Sexperience - Ideology is highly recommended in order to help customise your colonists' opinions on different sexual activities.
Sex acts that can provoke reactions include:
- Consensual sex: Encountering two lovin' individuals will generally result in the embarrassment of all involved and the copulating couple immediately ceasing their activities (unless the couple happen to be Exhibitionists). Reactions to consensual sex can be modified through the Exhibitionism precept
- Masturbation: Finding some masturbating will likely embarrass both parties and the discovered individual immediately stopping what they were doing (unless they happen to be an Exhibitionist). Reactions to masturbation can be modified through the Masturbation precept (included in Sexperience - Ideology)
- Cheating: Discovering a partner cheating will greatly upset most people (unless they happen to be a Culkold). Reactions to cheating can be modified through the Infidelity precept
- Bestiality: Witnessing bestiality will generally cause individuals to run away (unless they are a Zoophile). Reactions to bestiality can be modified through the Bestiality precept (included in Sexperience - Ideology)
- Rape: Witnessing rape will generally cause individuals to run away (unless they are a Rapist). Reactions to rape can be modified through the Rape precept (included in Sexperience - Ideology).
- Necrophilia: Witnessing necrophilia will generally cause individuals to run away and likely vomit (unless they are a Necrophile). Reactions to necrophilia can be modified through the Necrophilia precept (included in Sexperience - Ideology).
- Xenophilia: Stumbing upon humanoids of different species lovin' will generally be treated like encountering any other lovein' couple (unless the witness happens to be a Xenophobe). Reactions to xenophilia can be modified through the Alien Dating precept (included in Humanoid Alien Races).
Options have been included to toggle whether people should react to these various sex acts and whether people will turn a blind eye to them during rituals and parties. Additional options have been included to toggle whether prisoners, slaves, and members of other factions should react to witnessed sexual activities.
This mod also provides improved threesome support. Threesomes can now be triggered via two new ways:
- When a pawn sets off to bed their partner a passer-by might be invited to accompany them.
- If a pawn encounters a couple having sex then they may just might be invited to join in.
The chance of a threesome occurring can be configured in the mod options. In all cases, however, those involved must have a good opinion of each other and the passer-by mustn't be doing an player ordered or important job at the time.
Three new RJW quirks are also included - Cuckold, Cuckolder, and Voyeur. Cuckolds like to watch their partners cheated on them, while Cuckolders get a kick out of having their partner watch it happen. Voyeurs just like to watch others in general (providing what they see isn't too upsetting, of course).
Misc features
- Those using S16's apparel mod or the UnderWhere mod can make use of an included setting that will allow you toggle whether wearing underwear alone is sufficient to satisfy an ideological need for modesty. You may want to turn this setting off if you want ideologies to be stricter about what they consider to be modest. Ideologies which prefer to wear fewer clothes than normal are not affected by this setting.
- The scantier underwear from these mods now only covers either the chest or groin. Wearing underwear will counts as covering private parts for the purposes of determining nudity if not running Ideology.
- New situational mood: Exposed underwear. Non-Exhibitionists will be upset if they are not wearing enough clothing to cover up their underwear. This mood can be toggled on or off.
- Any lewd fluids that people produce during sex will not be marked for cleaning until they are done.
v 1.0.0
- Initial release

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Manifest>
<version>1.0.0</version>
<downloadUri>https://gitgud.io/AbstractConcept/rimworld-animations-patch</downloadUri>
<downloadUri></downloadUri>
</Manifest>

View File

@ -2,9 +2,9 @@
<Defs>
<FleckDef ParentName="FleckBase_Thrown">
<defName>Eye</defName>
<defName>EyeHeart</defName>
<graphicData>
<texPath>UI/Flecks/Eye</texPath>
<texPath>UI/Flecks/EyeHeart</texPath>
</graphicData>
<altitudeLayer>MetaOverlays</altitudeLayer>
<fadeInTime>0.08</fadeInTime>

View File

@ -1,57 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<defName>Disquiet</defName>
<label>disquiet</label>
<description>This person saw something that upset them and it's weighting on their thoughts.</description>
<isBad>false</isBad>
<stages>
<li>
<label>present</label>
<becomeVisible>false</becomeVisible>
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>Panicked</defName>
<label>panicked</label>
<description>This person saw something that has shaked them to their core. Will they run or fight?</description>
<isBad>false</isBad>
<stages>
<li>
<label>present</label>
<becomeVisible>false</becomeVisible>
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>Nauseated</defName>
<label>nauseated</label>
<description>This poor soul saw something something so utterly foul that they just might be sick from the thought.</description>
<isBad>false</isBad>
<stages>
<li>
<label>present</label>
<becomeVisible>false</becomeVisible>
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>Indignant</defName>
<label>indignant</label>
<description>This person witnessed something quite distasteful and is going to give the offender a piece of their mind.</description>
<isBad>false</isBad>
<stages>
<li>
<label>present</label>
<becomeVisible>false</becomeVisible>
</li>
</stages>
</HediffDef>
</Defs>

41
Defs/InteractionDefs.xml Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<InteractionDef>
<defName>InviteToHaveSex</defName>
<label>invited</label>
<workerClass>Privacy_Please.InteractionWorker_NullWorker</workerClass>
<symbol>UI/Interactions/Lovin</symbol>
<logRulesInitiator>
<rulesStrings>
<li>r_logentry->[INITIATOR_nameDef] invited [RECIPIENT_nameDef] to have sex with [INITIATOR_objective].</li>
</rulesStrings>
</logRulesInitiator>
</InteractionDef>
<InteractionDef>
<defName>InviteToHaveGroupSex</defName>
<label>invited</label>
<workerClass>Privacy_Please.InteractionWorker_NullWorker</workerClass>
<symbol>UI/Interactions/Lovin</symbol>
<logRulesInitiator>
<rulesStrings>
<li>r_logentry->[INITIATOR_nameDef] invited [RECIPIENT_nameDef] to a threesome.</li>
</rulesStrings>
</logRulesInitiator>
</InteractionDef>
<InteractionDef>
<defName>InviteVoyeurism</defName>
<label>invited</label>
<workerClass>Privacy_Please.InteractionWorker_NullWorker</workerClass>
<symbol>UI/Interactions/Voyeurism</symbol>
<logRulesInitiator>
<rulesStrings>
<li>r_logentry->[INITIATOR_nameDef] invited [RECIPIENT_nameDef] to watch [INITIATOR_objective].</li>
</rulesStrings>
</logRulesInitiator>
</InteractionDef>
</Defs>

View File

@ -12,7 +12,7 @@
<JobDef>
<defName>WatchSex</defName>
<driverClass>Privacy_Please.JobDriver_WatchSex</driverClass>
<reportString>watching from afar.</reportString>
<reportString>sneaking a peep.</reportString>
<casualInterruptible>false</casualInterruptible>
</JobDef>

View File

@ -27,7 +27,7 @@
<impact>Low</impact>
<displayOrderInIssue>20</displayOrderInIssue>
<displayOrderInImpact>1000</displayOrderInImpact>
<defaultSelectionWeight>100</defaultSelectionWeight>
<defaultSelectionWeight>20</defaultSelectionWeight>
</PreceptDef>
<PreceptDef>
@ -38,7 +38,7 @@
<impact>Medium</impact>
<displayOrderInIssue>10</displayOrderInIssue>
<displayOrderInImpact>1000</displayOrderInImpact>
<defaultSelectionWeight>100</defaultSelectionWeight>
<defaultSelectionWeight>5</defaultSelectionWeight>
</PreceptDef>
</Defs>

View File

@ -4,7 +4,7 @@
<IssueDef>
<defName>Infidelity</defName>
<label>infidelity</label>
<iconPath>UI/Issues/Exhibitionism</iconPath>
<iconPath>UI/Issues/Infidelity</iconPath>
</IssueDef>
<!-- Precepts -->
@ -27,7 +27,7 @@
<impact>Low</impact>
<displayOrderInIssue>20</displayOrderInIssue>
<displayOrderInImpact>1000</displayOrderInImpact>
<defaultSelectionWeight>100</defaultSelectionWeight>
<defaultSelectionWeight>20</defaultSelectionWeight>
</PreceptDef>
<PreceptDef>
@ -38,7 +38,7 @@
<impact>Low</impact>
<displayOrderInIssue>10</displayOrderInIssue>
<displayOrderInImpact>1000</displayOrderInImpact>
<defaultSelectionWeight>100</defaultSelectionWeight>
<defaultSelectionWeight>5</defaultSelectionWeight>
</PreceptDef>
</Defs>

View File

@ -9,7 +9,7 @@
<impact>Low</impact>
<displayOrderInIssue>10</displayOrderInIssue>
<displayOrderInImpact>1000</displayOrderInImpact>
<defaultSelectionWeight>100</defaultSelectionWeight>
<defaultSelectionWeight>5</defaultSelectionWeight>
</PreceptDef>
</Defs>

View File

@ -9,6 +9,10 @@
<pawnReaction>
<defaultThoughtDef>PartookInExhibitionism_Disapproved</defaultThoughtDef>
<replacementThoughts>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Acceptable</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Acceptable</replacementThoughtDef>
@ -16,11 +20,7 @@
<li>
<requiredPreceptDef>Exhibitionism_Approved</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
</li>
</replacementThoughts>
</pawnReaction>
<witnessReaction>
@ -30,19 +30,71 @@
<li>SawNecrophilia_Horrible</li>
<li>SawNecrophilia_Disapproved</li>
<li>SawNecrophilia_Acceptable</li>
<li>SawNecrophilia_Honorable</li>
<li>SawNecrophilia_Approved</li>
</preceptThoughtDefs>
<replacementThoughts>
<li>
<requiredTraits>
<li>Necrophiliac</li>
</requiredTraits>
<replacementThoughtDef>SawNecrophilia_Honorable</replacementThoughtDef>
<replacementThoughtDef>SawNecrophilia_Approved</replacementThoughtDef>
</li>
</replacementThoughts>
</witnessReaction>
</Privacy_Please.SexActReactionDef>
<Privacy_Please.SexActReactionDef>
<defName>reactionToBestialityWithOrdinaryAnimal</defName>
<issueDefName>Bestiality</issueDefName>
<sexActCheck>SexActIsBestialityWithOrdinaryAnimal</sexActCheck>
<pawnReaction>
<defaultThoughtDef>PartookInExhibitionism_Disapproved</defaultThoughtDef>
<replacementThoughts>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Acceptable</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Acceptable</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Approved</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
</replacementThoughts>
</pawnReaction>
<witnessReaction>
<defaultThoughtDef>SawBestiality_OrdinaryAnimal</defaultThoughtDef>
</witnessReaction>
</Privacy_Please.SexActReactionDef>
<Privacy_Please.SexActReactionDef>
<defName>reactionToBestialityWithSpecialAnimal</defName>
<issueDefName>Bestiality</issueDefName>
<sexActCheck>SexActIsBestialityWithSpecialAnimal</sexActCheck>
<pawnReaction>
<defaultThoughtDef>PartookInExhibitionism_Disapproved</defaultThoughtDef>
<replacementThoughts>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Acceptable</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Acceptable</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Approved</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
</replacementThoughts>
</pawnReaction>
<witnessReaction>
<defaultThoughtDef>SawBestiality_Honorable</defaultThoughtDef>
</witnessReaction>
</Privacy_Please.SexActReactionDef>
<Privacy_Please.SexActReactionDef>
<defName>reactionToBestiality</defName>
<issueDefName>Bestiality</issueDefName>
@ -50,6 +102,10 @@
<pawnReaction>
<defaultThoughtDef>PartookInExhibitionism_Disapproved</defaultThoughtDef>
<replacementThoughts>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Acceptable</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Acceptable</replacementThoughtDef>
@ -57,11 +113,7 @@
<li>
<requiredPreceptDef>Exhibitionism_Approved</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
</li>
</replacementThoughts>
</pawnReaction>
<witnessReaction>
@ -91,6 +143,10 @@
<pawnReaction>
<defaultThoughtDef>PartookInExhibitionism_Disapproved</defaultThoughtDef>
<replacementThoughts>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Acceptable</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Acceptable</replacementThoughtDef>
@ -98,11 +154,7 @@
<li>
<requiredPreceptDef>Exhibitionism_Approved</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
</li>
</replacementThoughts>
</pawnReaction>
<witnessReaction>
@ -162,10 +214,14 @@
<Privacy_Please.SexActReactionDef>
<defName>reactionToXenophilia</defName>
<issueDefName>HAR_AlienDating</issueDefName>
<sexActCheck>SexActIsRape</sexActCheck>
<sexActCheck>SexActIsXenophilia</sexActCheck>
<pawnReaction>
<defaultThoughtDef>PartookInExhibitionism_Disapproved</defaultThoughtDef>
<replacementThoughts>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Acceptable</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Acceptable</replacementThoughtDef>
@ -173,19 +229,11 @@
<li>
<requiredPreceptDef>Exhibitionism_Approved</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
</li>
</replacementThoughts>
</pawnReaction>
<witnessReaction>
<defaultThoughtDef>SawExhibitionism_Disapproved</defaultThoughtDef>
<preceptThoughtDefs>
<li>SawHAR_AlienDating_Prohibited</li>
<li>SawHAR_AlienDating_Horrible</li>
</preceptThoughtDefs>
<replacementThoughts>
<li>
<requiredTraits>
@ -193,6 +241,18 @@
</requiredTraits>
<replacementThoughtDef>SawHAR_AlienDating_Prohibited</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>HAR_AlienDating_Prohibited</requiredPreceptDef>
<replacementThoughtDef>SawHAR_AlienDating_Prohibited</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>HAR_AlienDating_Horrible</requiredPreceptDef>
<replacementThoughtDef>SawHAR_AlienDating_Horrible</replacementThoughtDef>
</li>
<li>
<requiredQuirk>Voyeur</requiredQuirk>
<replacementThoughtDef>SawExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Disapproved</requiredPreceptDef>
<replacementThoughtDef>SawExhibitionism_Disapproved</replacementThoughtDef>
@ -204,62 +264,11 @@
<li>
<requiredPreceptDef>Exhibitionism_Approved</requiredPreceptDef>
<replacementThoughtDef>SawExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredQuirk>Voyeur</requiredQuirk>
<replacementThoughtDef>SawExhibitionism_Approved</replacementThoughtDef>
</li>
</li>
</replacementThoughts>
</witnessReaction>
</Privacy_Please.SexActReactionDef>
<!--<Privacy_Please.SexActReactionDef>
<defName>reactionToXenophilia</defName>
<issueDefName>HAR_AlienDating</issueDefName>
<sexActCheck>SexActIsRape</sexActCheck>
<pawnReaction>
<defaultThoughtDef>PartookInExhibitionism_Disapproved</defaultThoughtDef>
<replacementThoughts>
<li>
<preceptThoughtDefs>Exhibitionism_Approved</preceptThoughtDefs>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<preceptThoughtDefs>Exhibitionism_Acceptable</preceptThoughtDefs>
<replacementThoughtDef>PartookInExhibitionism_Acceptable</replacementThoughtDef>
</li>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
</replacementThoughts>
</pawnReaction>
<witnessReaction>
<defaultThoughtDef>SawHAR_AlienDating_Acceptable</defaultThoughtDef>
<preceptThoughtDefs>
<li>SawHAR_AlienDating_Prohibited</li>
<li>SawHAR_AlienDating_Horrible</li>
<li>SawHAR_AlienDating_Acceptable</li>
<li>SawHAR_AlienDating_Preferred</li>
<li>SawHAR_AlienDating_Know_Honorable</li>
</preceptThoughtDefs>
<replacementThoughts>
<li>
<requiredTraits>
<Xenophobia>1</Xenophobia>
</requiredTraits>
<replacementThoughtDef>SawHAR_AlienDating_Prohibited</replacementThoughtDef>
</li>
<li>
<requiredTraits>
<Xenophobia>-1</Xenophobia>
</requiredTraits>
<replacementThoughtDef>SawHAR_AlienDating_Know_Honorable</replacementThoughtDef>
</li>
</replacementThoughts>
</witnessReaction>
</Privacy_Please.SexActReactionDef>-->
<Privacy_Please.SexActReactionDef>
<defName>reactionToMasturbation</defName>
<issueDefName>Masturbation</issueDefName>
@ -267,6 +276,10 @@
<pawnReaction>
<defaultThoughtDef>PartookInExhibitionism_Disapproved</defaultThoughtDef>
<replacementThoughts>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Acceptable</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Acceptable</replacementThoughtDef>
@ -274,19 +287,20 @@
<li>
<requiredPreceptDef>Exhibitionism_Approved</requiredPreceptDef>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredQuirk>Exhibitionist</requiredQuirk>
<replacementThoughtDef>PartookInExhibitionism_Approved</replacementThoughtDef>
</li>
</li>
</replacementThoughts>
</pawnReaction>
<witnessReaction>
<defaultThoughtDef>SawExhibitionism_Disapproved</defaultThoughtDef>
<preceptThoughtDefs>
<li>SawMasturbation_Abhorrent</li>
</preceptThoughtDefs>
<replacementThoughts>
<li>
<requiredPreceptDef>Masturbation_Abhorrent</requiredPreceptDef>
<replacementThoughtDef>SawMasturbation_Abhorrent</replacementThoughtDef>
</li>
<li>
<requiredQuirk>Voyeur</requiredQuirk>
<replacementThoughtDef>SawExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredPreceptDef>Exhibitionism_Disapproved</requiredPreceptDef>
<replacementThoughtDef>SawExhibitionism_Disapproved</replacementThoughtDef>
@ -298,11 +312,7 @@
<li>
<requiredPreceptDef>Exhibitionism_Approved</requiredPreceptDef>
<replacementThoughtDef>SawExhibitionism_Approved</replacementThoughtDef>
</li>
<li>
<requiredQuirk>Voyeur</requiredQuirk>
<replacementThoughtDef>SawExhibitionism_Approved</replacementThoughtDef>
</li>
</li>
</replacementThoughts>
</witnessReaction>
</Privacy_Please.SexActReactionDef>

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThoughtDef>
<defName>CaughtCheating</defName>
<thoughtClass>Thought_Memory</thoughtClass>
<durationDays>10.0</durationDays>
<stackLimit>300</stackLimit>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
<stages>
<li>
<label>caught cheating by {0}</label>
<description>What have I done? {1}, please forgive me...</description>
<baseMoodEffect>-10</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
</Defs>

View File

@ -20,6 +20,21 @@
<reactionToSexDiscovery>Panic</reactionToSexDiscovery>
</Privacy_Please.SexActThoughtDef>
<Privacy_Please.SexActThoughtDef>
<defName>SawBestiality_OrdinaryAnimal</defName>
<durationDays>20</durationDays>
<stackLimit>3</stackLimit>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
<stages>
<li>
<label>displeased by common bestiality</label>
<description>They mated with some common beast.</description>
<baseMoodEffect>-15</baseMoodEffect>
</li>
</stages>
<reactionToSexDiscovery>Discomfort</reactionToSexDiscovery>
</Privacy_Please.SexActThoughtDef>
<Privacy_Please.SexActThoughtDef>
<defName>SawBestiality_Horrible</defName>
<durationDays>20</durationDays>
@ -28,7 +43,7 @@
<stages>
<li>
<label>disturbed by bestiality</label>
<description>Hey, leave that poor thing alone!</description>
<description>Leave that poor thing alone!</description>
<baseMoodEffect>-15</baseMoodEffect>
</li>
</stages>

View File

@ -4,7 +4,6 @@
<!-- Pawn thoughts -->
<Privacy_Please.SexActThoughtDef>
<defName>PartookInExhibitionism_Disapproved</defName>
<thoughtClass>Thought_Memory</thoughtClass>
<durationDays>5.0</durationDays>
<stackLimit>3</stackLimit>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
@ -20,7 +19,6 @@
<Privacy_Please.SexActThoughtDef>
<defName>PartookInExhibitionism_Acceptable</defName>
<thoughtClass>Thought_Memory</thoughtClass>
<durationDays>0.5</durationDays>
<stackLimit>3</stackLimit>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
@ -28,7 +26,7 @@
<li>
<label>uncaring exhibitionist</label>
<description>Eh, it's no big deal.</description>
<baseMoodEffect>0</baseMoodEffect>
<baseMoodEffect>0.01</baseMoodEffect>
</li>
</stages>
<reactionToSexDiscovery>Uncaring</reactionToSexDiscovery>
@ -36,7 +34,6 @@
<Privacy_Please.SexActThoughtDef>
<defName>PartookInExhibitionism_Approved</defName>
<thoughtClass>Thought_Memory</thoughtClass>
<durationDays>2.0</durationDays>
<stackLimit>3</stackLimit>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
@ -53,7 +50,6 @@
<!-- Witness thoughts -->
<Privacy_Please.SexActThoughtDef>
<defName>SawExhibitionism_Disapproved</defName>
<thoughtClass>Thought_Memory</thoughtClass>
<durationDays>5.0</durationDays>
<stackLimit>3</stackLimit>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
@ -69,7 +65,6 @@
<Privacy_Please.SexActThoughtDef>
<defName>SawExhibitionism_Acceptable</defName>
<thoughtClass>Thought_Memory</thoughtClass>
<durationDays>0.5</durationDays>
<stackLimit>3</stackLimit>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
@ -77,7 +72,7 @@
<li>
<label>unfazed voyeur</label>
<description>Don't mind me, just passing through.</description>
<baseMoodEffect>0</baseMoodEffect>
<baseMoodEffect>0.01</baseMoodEffect>
</li>
</stages>
<reactionToSexDiscovery>Uncaring</reactionToSexDiscovery>
@ -85,7 +80,6 @@
<Privacy_Please.SexActThoughtDef>
<defName>SawExhibitionism_Approved</defName>
<thoughtClass>Thought_Memory</thoughtClass>
<durationDays>2.0</durationDays>
<stackLimit>3</stackLimit>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>

View File

@ -11,7 +11,7 @@
<stages>
<li>
<label>caught cheating</label>
<description>{1}, I'm so sorry. Please, forgive me...</description>
<description>I'm so sorry, my love. Please, forgive me...</description>
<baseMoodEffect>-20</baseMoodEffect>
</li>
</stages>
@ -25,8 +25,8 @@
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
<stages>
<li>
<label>caught cheating</label>
<description>Um, sorry, {1}. Please don't be too mad?</description>
<label>caught fooling around</label>
<description>Um, sorry, dear. Please don't be too mad?</description>
<baseMoodEffect>-10</baseMoodEffect>
</li>
</stages>
@ -40,9 +40,9 @@
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
<stages>
<li>
<label>caught lovin' by partner</label>
<label>seen lovin' by partner</label>
<description>Oh hey babe, you wanna join us?</description>
<baseMoodEffect>0</baseMoodEffect>
<baseMoodEffect>0.01</baseMoodEffect>
</li>
</stages>
<reactionToSexDiscovery>Acceptance</reactionToSexDiscovery>
@ -56,7 +56,7 @@
<stages>
<li>
<label>caught lovin' by partner</label>
<description>Heheh, I'm quite the slut, aren't I?</description>
<description>The look on their face... It just drives me wild!</description>
<baseMoodEffect>5</baseMoodEffect>
</li>
</stages>
@ -72,7 +72,7 @@
<stages>
<li>
<label>caught partner cheating</label>
<description>{1}! How could you do this to me?!</description>
<description>I feel numb inside.</description>
<baseMoodEffect>-20</baseMoodEffect>
</li>
</stages>
@ -86,8 +86,8 @@
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
<stages>
<li>
<label>caught partner cheating</label>
<description>Damn it, {1}! Aren't I enough for you?</description>
<label>caught partner fooling around</label>
<description>What, aren't I enough for you?</description>
<baseMoodEffect>-10</baseMoodEffect>
</li>
</stages>
@ -101,9 +101,9 @@
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
<stages>
<li>
<label>caught partner lovin'</label>
<description>Hey babe, save some of that energy for me later, OK?</description>
<baseMoodEffect>0</baseMoodEffect>
<label>saw partner got some lovin'</label>
<description>Hey you, save some of that energy for me later, OK?</description>
<baseMoodEffect>0.01</baseMoodEffect>
</li>
</stages>
<reactionToSexDiscovery>Acceptance</reactionToSexDiscovery>
@ -117,7 +117,7 @@
<stages>
<li>
<label>caught partner lovin'</label>
<description>Oh, {1}, you wicked thing! I'm gunna have to punish you for this later...</description>
<description>Oh, you wicked thing! I'm gunna have to punish you for this later...</description>
<baseMoodEffect>5</baseMoodEffect>
</li>
</stages>

View File

@ -75,7 +75,7 @@
</Privacy_Please.SexActThoughtDef>
<Privacy_Please.SexActThoughtDef>
<defName>SawNecrophilia_Honorable</defName>
<defName>SawNecrophilia_Approved</defName>
<durationDays>2</durationDays>
<stackLimit>3</stackLimit>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>

View File

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThoughtDef>
<defName>ExposeUnderwear</defName>
<workerClass>Privacy_Please.ThoughtWorker_ExposedUnderwear</workerClass>
<validWhileDespawned>true</validWhileDespawned>
<stages>
<li>
<label>exposed underwear</label>
<description>People can see my underwear. It's embarassing.</description>
<baseMoodEffect>-2</baseMoodEffect>
</li>
<li>
<label>visible underwear</label>
<description>So what? People need to grow up.</description>
<baseMoodEffect>0</baseMoodEffect>
</li>
<li>
<label>faunting underwear</label>
<description>How risque!</description>
<baseMoodEffect>1</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
</Defs>

View File

@ -6,13 +6,12 @@
<defName>SawHAR_AlienDating_Prohibited</defName>
<durationDays>30</durationDays>
<stackLimit>3</stackLimit>
<hediff>Indignant</hediff>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
<stages>
<li>
<label>horrified by xenophilia</label>
<description>Filthy degenerates!</description>
<baseMoodEffect>-20</baseMoodEffect>
<label>disturbed by xenophilia</label>
<description>Filthy degenerates.</description>
<baseMoodEffect>-15</baseMoodEffect>
</li>
</stages>
<nullifyingTraitDegrees>
@ -25,13 +24,12 @@
<defName>SawHAR_AlienDating_Horrible</defName>
<durationDays>20</durationDays>
<stackLimit>3</stackLimit>
<hediff>Disquiet</hediff>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
<stages>
<li>
<label>disturbed by xenophilia</label>
<description>Digusting.</description>
<baseMoodEffect>-15</baseMoodEffect>
<label>upset about xenophilia</label>
<description>Urgh. It's just not right...</description>
<baseMoodEffect>-10</baseMoodEffect>
</li>
</stages>
<nullifyingTraitDegrees>
@ -40,24 +38,6 @@
<reactionToSexDiscovery>Discomfort</reactionToSexDiscovery>
</Privacy_Please.SexActThoughtDef>
<Privacy_Please.SexActThoughtDef>
<defName>SawHAR_AlienDating_Disapproved</defName>
<durationDays>10</durationDays>
<stackLimit>3</stackLimit>
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
<stages>
<li>
<label>upset about xenophilia</label>
<description>It's just not right...</description>
<baseMoodEffect>-10</baseMoodEffect>
</li>
</stages>
<nullifyingTraits>
<li>Zoophile</li>
</nullifyingTraits>
<reactionToSexDiscovery>Discomfort</reactionToSexDiscovery>
</Privacy_Please.SexActThoughtDef>
<!-- It just counts as exhibitionism from this point on -->
<!--<Privacy_Please.SexActThoughtDef>

View File

@ -1,59 +0,0 @@
bool isXenophobe = pawn.HasTrait("Xenophobia") && pawn.story.traits.DegreeOfTrait(DefDatabase<TraitDef>.GetNamedSilentFail("Xenophobia")) > 0;
bool isXenophile = pawn.HasTrait("Xenophobia") && pawn.story.traits.DegreeOfTrait(DefDatabase<TraitDef>.GetNamedSilentFail("Xenophobia")) < 0;
public static ThoughtDef GetThoughtsAboutSexAct(Pawn pawn, JobDriver_Sex jobDriver, out Precept precept)
{
ThoughtDef thoughtDef = null;
precept = null;
if (pawn == null || jobDriver == null) return null;
if (BasicSettings.slavesIgnoreSex && (pawn.IsPrisoner || pawn.IsSlave)) return null;
if (BasicSettings.otherFactionsIgnoreSex && pawn.Faction.IsPlayer == false) return null;
if (BasicSettings.worryAboutNecro && sexIsNecro && xxx.is_necrophiliac(pawn) == false)
{
thoughtDef = xxx.is_necrophiliac(pawn) ? DefDatabase<ThoughtDef>.GetNamedSilentFail("SawNecrophilia_Honorable") :
pawn.HasPreceptForIssue("Necrophilia", out precept) ? DefDatabase<ThoughtDef>.GetNamedSilentFail("Saw" + precept.def.defName) :
DefDatabase<ThoughtDef>.GetNamedSilentFail("SawNecrophilia_Abhorrent");
}
else if (BasicSettings.worryAboutBeastiality && sexIsBeastial)
{
thoughtDef = xxx.is_zoophile(pawn) ? DefDatabase<ThoughtDef>.GetNamedSilentFail("SawBeastility_Honorable") :
pawn.HasPreceptForIssue("Beastility", out precept) ? DefDatabase<ThoughtDef>.GetNamedSilentFail("Saw" + precept.def.defName) :
DefDatabase<ThoughtDef>.GetNamedSilentFail("SawBeastility_Abhorrent");
}
else if (BasicSettings.worryAboutRape && BasicSettings.ignoreSlaveRape == false && sexIsSlaveRape)
{
thoughtDef = xxx.is_rapist(pawn) ? DefDatabase<ThoughtDef>.GetNamedSilentFail("SawRape_Honorable") :
pawn.HasPreceptForIssue("Rape", out precept) ? DefDatabase<ThoughtDef>.GetNamedSilentFail("Saw" + precept.def.defName) :
DefDatabase<ThoughtDef>.GetNamedSilentFail("SawRape_Abhorrent");
}
else if (BasicSettings.worryAboutRape && sexIsRape)
{
thoughtDef = xxx.is_rapist(pawn) ? DefDatabase<ThoughtDef>.GetNamedSilentFail("SawRape_Honorable") :
pawn.HasPreceptForIssue("Rape", out precept) ? DefDatabase<ThoughtDef>.GetNamedSilentFail("Saw" + precept.def.defName) :
DefDatabase<ThoughtDef>.GetNamedSilentFail("SawRape_Abhorrent");
}
else if (BasicSettings.worryAboutXeno && sexIsXeno)
{
thoughtDef = isXenophobe ? DefDatabase<ThoughtDef>.GetNamedSilentFail("SawHAR_AlienDating_Prohibited") :
isXenophile ? DefDatabase<ThoughtDef>.GetNamedSilentFail("SawHAR_AlienDating_Honorable") :
pawn.HasPreceptForIssue("HAR_AlienDating", out precept) ? DefDatabase<ThoughtDef>.GetNamedSilentFail("Saw" + precept.def.defName) :
DefDatabase<ThoughtDef>.GetNamedSilentFail("SawHAR_AlienDating_Acceptable");
}
else if (BasicSettings.worryAboutMasturbation && sexIsSolo)
{
thoughtDef = pawn.HasPreceptForIssue("Masturbation", out precept) ? DefDatabase<ThoughtDef>.GetNamedSilentFail("Saw" + precept.def.defName) :
DefDatabase<ThoughtDef>.GetNamedSilentFail("SawMasturbation_Disapproved");
}
DebugMode.Message("Sex job is: " + jobDriver + " Issue is: " + (precept?.def?.issue?.defName).ToStringSafe() + " Opinion is: " + (precept?.def?.defName).ToStringSafe() + " Thought is: " + (thoughtDef?.defName).ToStringSafe());
return thoughtDef;
}

View File

@ -6,46 +6,46 @@
<privacy_please_general>General Options</privacy_please_general>
<need_privacy> People will react to consensual sex</need_privacy>
<need_privacy_desc>Their reaction will depend on their Exhibitionism precept and whether they have the Voyeur RJW quirk.\n\nNon-exhibitionist couples will stop what they are doing when caught.</need_privacy_desc>
<worry_about_exhibitionism> People will react to exhibitionism</worry_about_exhibitionism>
<worry_about_exhibitionism_desc>Their reaction will depend on their Exhibitionism precept and whether they have the Voyeur RJW quirk.\n\nThose who are caught will stop their activities if the find the attention embarassing, or if the intruder is hostile.</worry_about_exhibitionism_desc>
<worry_about_masturbation> People will react to masturbation</worry_about_masturbation>
<worry_about_masturbation_desc>Their reaction will depend on their Exhibitionism precept and whether they have the Voyeur RJW quirk.\n\nNon-exhibitionists masturbators will stop what they are doing when caught.</worry_about_masturbation_desc>
<worry_about_masturbation_desc>Their reaction will depend on their Masturbation precept (requires Sexperience - Ideology).\n\nWill be treated as exhibitionism if this option is disabled.</worry_about_masturbation_desc>
<worry_about_infidelity> People will react to a cheating partner</worry_about_infidelity>
<worry_about_infidelity_desc>Their reaction will depend on their Lovin' precept, ignoring cheating if lovin' is 'free and approved'.\n\nWitnessing cheating may result in a random extreme reaction occuring.</worry_about_infidelity_desc>
<worry_about_infidelity_desc>Their reaction will depend on their Infidelity precept and whether they have the Cuckold RJW quirk.\n\nWill be treated as exhibitionism if this option is disabled.</worry_about_infidelity_desc>
<worry_about_beastiality> People will react to beastiality</worry_about_beastiality>
<worry_about_beastiality_desc>Their reaction will depend on their Bestiality precept (requires Sexperience - Ideology) and whether they have the Zoophile trait.\n\nWitnessing beastiality may result in panick.</worry_about_beastiality_desc>
<worry_about_beastiality_desc>Their reaction will depend on their Bestiality precept (requires Sexperience - Ideology) and whether they have the Zoophile trait.\n\nWill be treated as exhibitionism if this option is disabled.</worry_about_beastiality_desc>
<worry_about_rape> People will react to rape</worry_about_rape>
<worry_about_rape_desc>Their reaction will depend on their Rape precept (requires Sexperience - Ideology) and whether they have the Rapist trait.\n\nWitnessing rape may result in panick.</worry_about_rape_desc>
<worry_about_rape_desc>Their reaction will depend on their Rape precept (requires Sexperience - Ideology) and whether they have the Rapist trait.\n\nWill be treated as exhibitionism if this option is disabled.</worry_about_rape_desc>
<ignore_slave_rape> People will ignore a rape if the victim is a prisoner or slave</ignore_slave_rape>
<worry_about_necro> People will react to necrophilia</worry_about_necro>
<worry_about_necro_desc>Their reaction will depend on their Necrophilia precept (requires Sexperience - Ideology) and whether they have the Necrophile trait.\n\nWitnessing necrophilia may result in vomiting.</worry_about_necro_desc>
<worry_about_necro_desc>Their reaction will depend on their Necrophilia precept (requires Sexperience - Ideology) and whether they have the Necrophile trait.\n\nWill be treated as exhibitionism if this option is disabled.</worry_about_necro_desc>
<worry_about_xeno> People will react to couplings between humanoids of different species</worry_about_xeno>
<worry_about_xeno_desc>Their reaction will depend on their Alien Dating precept (requires Humanoid Alien Races) and whether they have the Xenophile or Xenophobe traits.\n\nWitnessing xenophilia as a Xenophobe may result in the lovin' couple being harrassed.</worry_about_xeno_desc>
<worry_about_incest> People will react to incest</worry_about_incest>
<worry_about_incest_desc>Their reaction will depend on their Incest precept (requires Sexperience - Ideology).\n\nWitnessing incest may result in harrassment.</worry_about_incest_desc>
<major_taboo_can_start_fights> Witnessing a major taboo may result in an extreme reactions</major_taboo_can_start_fights>
<major_taboo_can_start_fights_desc>Individuals who witness a sexual act that seriously upsets them may cause them to flee from, insult, or even attack the offender.</major_taboo_can_start_fights_desc>
<worry_about_xeno_desc>Their reaction will depend on their Alien Dating precept (requires Humanoid Alien Races) and whether they have the Xenophile or Xenophobe traits.\n\nNote that genetically modified individuals still count as 'human', Will be treated as exhibitionism if this option is disabled.</worry_about_xeno_desc>
<major_taboo_can_start_fights> Witnessing abhorrent acts can result in panic</major_taboo_can_start_fights>
<major_taboo_can_start_fights_desc>Individuals who witness a sexual act that they feel is abhorrent may cause them to panic and flee from the area.</major_taboo_can_start_fights_desc>
<ignore_ritual_and_party_sex> People will ignore sexual acts that are a part of a ritual or gathering</ignore_ritual_and_party_sex>
<ignore_ritual_and_party_sex_desc>The demands required by rituals and customs must be respected.</ignore_ritual_and_party_sex_desc>
<slaves_ignore_sex> Prisoners and slaves ignore sexual acts</slaves_ignore_sex>
<slaves_ignore_sex_desc>Prisoners and slaves have discovered that it is better to simply ignore what is occurring around them.</slaves_ignore_sex_desc>
<other_factions_ignore_sex> People belonging to other factions will ignore sexual acts</other_factions_ignore_sex>
<other_factions_ignore_sex_desc>Members of friendly factions will politely ignore any sexual acts occurring around them.\n\nHostile factions will always ignore such frivolities, regardless of this setting.</other_factions_ignore_sex_desc>
<rape_is_uninteruptable>Rape will not be interrupted by witnesses</rape_is_uninteruptable>
<rape_is_uninteruptable_desc>Rape will not be interrupted by witnesses</rape_is_uninteruptable_desc>
<whoring_is_uninteruptable>Whoring will not be interrupted by witnesses</whoring_is_uninteruptable>
<whoring_is_uninteruptable_desc>Whoring will not be interrupted by witnesses</whoring_is_uninteruptable_desc>
<ignore_ritual_and_party_sex_desc>Any distasteful occurrances during rituals and gatherings will not provoke any reactions from participants or onlookers.</ignore_ritual_and_party_sex_desc>
<slaves_ignore_sex> Prisoners and slaves will ignore the actions of colonists</slaves_ignore_sex>
<slaves_ignore_sex_desc>Prisoners and slaves have discovered that it is better to simply ignore what is occurring around them. They won't react to any sexual activities that take place near them.</slaves_ignore_sex_desc>
<colonists_ignore_slaves> Colonists will ignore the presence of prisoners and slaves</colonists_ignore_slaves>
<colonists_ignore_slaves_desc>Prisoners and slaves are beneath the notice of your colonists. Your colonists won't react to their presence during any sexual activities.</colonists_ignore_slaves_desc>
<other_factions_ignore_sex> Members of other factions will ignore the actions of colonists</other_factions_ignore_sex>
<other_factions_ignore_sex_desc>Members of friendly factions will politely ignore any sexual activities that occur nearby.\n\nFactions hostile to you will always ignore such frivolities, regardless of this setting.</other_factions_ignore_sex_desc>
<colonists_ignore_other_factions> Colonists will ignore the presence of other faction members</colonists_ignore_other_factions>
<colonists_ignore_other_factions_desc>Colonists are unfazed by the presence of friendly member during their sexual activities.\n\nHostile intruders will always interrupt sexual activities, regardless of this setting.</colonists_ignore_other_factions_desc>
<rape_is_uninteruptable> Rape is not interrupted by witnesses</rape_is_uninteruptable>
<rape_is_uninteruptable_desc>Rapists are shameless and will not let nearby witnesses interrupt them.</rape_is_uninteruptable_desc>
<whoring_is_uninteruptable> Whoring is not interrupted by witnesses</whoring_is_uninteruptable>
<whoring_is_uninteruptable_desc>Sex workers might be embarrassed by an ill-timed intrusion, but will carry on regardless.</whoring_is_uninteruptable_desc>
<chance_for_other_to_join_in_sex> People who are lovin' have a chance to invite passers-by to join them for some fun (default is 0.25)</chance_for_other_to_join_in_sex>
<chance_for_other_to_join_in_sex_desc>Note that setting this value to its maximum will not guarantee that this event will occur, it will just maximize the chance of an invitation being made.\n\nAll individuals involved must be attracted to and have a good opinion of each other, and the activity must not violate their traits or ideology.\n\nSet this value to zero to prevent these invitations being made.</chance_for_other_to_join_in_sex_desc>
<chance_for_other_to_join_in_sex_desc>Passers-by who aren't currently doing an important job can be invited to join in a sexual activity. There must be some attraction between those involved, and the activity must not violate their traits or ideology.\n\nNote that setting this value to its maximum will not guarantee that this event will occur, it will just maximize the chance of an invitation being made.\n\nSet this value to zero to prevent these invitations being made, however.</chance_for_other_to_join_in_sex_desc>
<privacy_please_clothing>Clothing options</privacy_please_clothing>
<underwear_sufficent_for_ideos> Underwear satisfies ideological needs for modesty</underwear_sufficent_for_ideos>
<underwear_sufficent_for_ideos_desc>If an ideology demands that certain body parts must be covered, wearing underwear (clothing that only covers the chest or groin) can help fulfill this requirement.\n\nYou may want to turn this setting off if you want ideologies to be more strict about what they consider to be 'modestly clothed'.\n\nIdeologies which prefer to wear fewer clothes than normal are not affected by this setting.</underwear_sufficent_for_ideos_desc>
<exposed_underwear_mood> People feel embarrassed if their underwear is showing</exposed_underwear_mood>
<exposed_underwear_mood_desc>It isn't as bad as being naked, but people would prefer to be fully clothed. Exhibitionists, however, seem to get a small thrill out of having their underwear exposed.\n\nClothing which only covers the chest or groin will be considered underwear.</exposed_underwear_mood_desc>
<privacy_please_debugging>Debugging options</privacy_please_debugging>
<debug_mode> Turn on debugging console messages</debug_mode>
<debug_mode_desc>Only required for debugging purposes.</debug_mode_desc>

View File

@ -2,13 +2,13 @@
<LanguageData>
<VoyeurQuirk><![CDATA[
{pawn} will sneakily spy upon others engaged in intimate acts.
{pawn} has a kink for watching others engaged in intimate acts.
]]></VoyeurQuirk>
<CuckoldQuirk><![CDATA[
{pawn} has a fetish for watching their partner having sex with other people.
]]></CuckoldQuirk>
<CuckolderQuirk><![CDATA[
{pawn} experiences a perverse pleasure when their partner catches them having sex with others.
{pawn} derives a perverse pleasure from having their partner catching them having sex with others.
]]></CuckolderQuirk>
</LanguageData>

View File

@ -23,14 +23,14 @@
<li Class="PatchOperationAdd">
<xpath>Defs/ThoughtDef[defName="CheatedOnMe"]/nullifyingPrecepts</xpath>
<value>
<li>Lovin_FreeApproved</li>
<li>Infidelity_Acceptable</li>
</value>
</li>
<li Class="PatchOperationAdd">
<xpath>Defs/ThoughtDef[defName="Affair"]/nullifyingPrecepts</xpath>
<value>
<li>Lovin_FreeApproved</li>
<li>Infidelity_Acceptable</li>
</value>
</li>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" ?>
<Patch>
<Operation Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationReplace">
<xpath>Defs/IssueDef[defName="Masturbation"]/iconPath</xpath>
<value>
<iconPath>UI/Issues/Masturbation</iconPath>
</value>
</li>
</operations>
</Operation>
</Patch>

View File

@ -1,32 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Patch>
<Operation Class="PatchOperationFindMod">
<mods>
<li>UnderWhere</li>
</mods>
<match Class="PatchOperationSequence">
<success>Normal</success>
<operations>
<li Class="PatchOperationReplace">
<xpath>Defs/ThingDef/apparel[layers/li="Underwear" and not(layers/li="UnderwearTop")]/bodyPartGroups</xpath>
<value>
<bodyPartGroups>
<li>GenitalsBPG</li>
</bodyPartGroups>
</value>
</li>
<li Class="PatchOperationReplace">
<xpath>Defs/ThingDef/apparel[layers/li="UnderwearTop" and not(layers/li="Underwear")]/bodyPartGroups</xpath>
<value>
<bodyPartGroups>
<li>ChestBPG</li>
</bodyPartGroups>
</value>
</li>
</operations>
</match>
</Operation>
</Patch>

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Patch>
<Operation Class="PatchOperationFindMod">
<mods>
<li>S16's Extension</li>
</mods>
<match Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationReplace">
<xpath>Defs/ThingDef/thingCategories[li="S16_Underwear"]/../apparel/bodyPartGroups</xpath>
<value>
<bodyPartGroups>
<li>GenitalsBPG</li>
</bodyPartGroups>
</value>
</li>
</operations>
</match>
</Operation>
</Patch>

Binary file not shown.

View File

@ -56,30 +56,31 @@ namespace Privacy_Please
JobDriver_Sex jobDriver = reactor.jobs.curDriver as JobDriver_Sex;
// Reactors who do not have thoughts applied to them
if (reactor.IsUnableToSenseSex() || reactor.RaceProps.Animal || reactor.RaceProps.IsMechanoid) return ReactionToSexDiscovery.Ignored;
if (reactor.IsUnableToSenseSex()) return ReactionToSexDiscovery.Ignored;
if (reactor.HostileTo(otherPawn)) return ReactionToSexDiscovery.StopSex;
if (reactor.RaceProps.Animal || reactor.RaceProps.IsMechanoid) return ReactionToSexDiscovery.Ignored;
if (otherPawn.RaceProps.Animal || otherPawn.RaceProps.IsMechanoid) return ReactionToSexDiscovery.Uncaring;
if (BasicSettings.slavesIgnoreSex && (reactor.IsPrisoner || reactor.IsSlave)) return ReactionToSexDiscovery.Uncaring;
if (BasicSettings.otherFactionsIgnoreSex && reactor.Faction.IsPlayer == false) return ReactionToSexDiscovery.Uncaring;
if (BasicSettings.copulatorsIgnoreSlaves && (otherPawn.IsPrisoner || otherPawn.IsSlave)) return ReactionToSexDiscovery.Uncaring;
if (BasicSettings.copulatorsIgnoreOtherFactions && otherPawn.Faction.IsPlayer == false) return ReactionToSexDiscovery.Uncaring;
if (BasicSettings.colonistsIgnoreSlaves && (otherPawn.IsPrisoner || otherPawn.IsSlave)) return ReactionToSexDiscovery.Uncaring;
if (BasicSettings.colonistsIgnoreOtherFactions && otherPawn.Faction.IsPlayer == false) return ReactionToSexDiscovery.Uncaring;
// Apply thoughtDef
SexActThoughtDef thoughtDef = GetThoughtDefForReactor(reactor, reaction, out Precept precept);
ReactionToSexDiscovery reactionToSexAct = thoughtDef.reactionToSexDiscovery;
if (applyThoughtDef)
{ reactor.needs.mood.thoughts.memories.TryGainMemory(thoughtDef, otherPawn, precept); }
var nullifyingTraits = ThoughtUtility.GetNullifyingTraits(thoughtDef)?.ToList();
if (thoughtDef.stages[0].baseMoodEffect < 0 && nullifyingTraits?.Any(x => x.HasTrait(reactor)) != true)
if (applyThoughtDef && thoughtDef.stages[0].baseMoodEffect < 0 && nullifyingTraits?.Any(x => x.HasTrait(reactor)) != true)
{ reactor.TryGetComp<CompPawnThoughtData>()?.TryToExclaim(); }
// Reactors who have their reactions changed after applying thoughtDefs
if (BasicSettings.whoringIsUninteruptable && jobDriver?.Sexprops.isWhoring == true) return ReactionToSexDiscovery.Uncaring;
if (BasicSettings.rapeIsUninteruptable && jobDriver?.Sexprops.isRape == true) return ReactionToSexDiscovery.Uncaring;
if (reactor.HostileTo(otherPawn)) return ReactionToSexDiscovery.StopSex;
if (BasicSettings.whoringIsUninteruptable && jobDriver?.Sexprops?.isWhoring == true) return ReactionToSexDiscovery.Uncaring;
if (BasicSettings.rapeIsUninteruptable && jobDriver?.Sexprops?.isRape == true) return ReactionToSexDiscovery.Uncaring;
return reactionToSexAct;
}

View File

@ -96,7 +96,7 @@ namespace Privacy_Please
public static bool IsLoverOfOther(this Pawn pawn, Pawn other)
{
if (pawn == null || other == null)
if (pawn?.relations?.DirectRelations == null || other?.relations?.DirectRelations == null)
{ return false; }
List<DirectPawnRelation> lovers = SpouseRelationUtility.GetLoveRelations(pawn, false);

View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using RimWorld;
using Verse;
namespace Privacy_Please
{
public class InteractionWorker_NullWorker : InteractionWorker
{
public InteractionWorker_NullWorker() { }
public override void Interacted(Pawn initiator, Pawn recipient, List<RulePackDef> extraSentencePacks, out string letterText, out string letterLabel, out LetterDef letterDef, out LookTargets lookTargets)
{
base.Interacted(initiator, recipient, extraSentencePacks, out letterText, out letterLabel, out letterDef, out lookTargets);
letterLabel = null;
letterText = null;
letterDef = null;
}
public override float RandomSelectionWeight(Pawn initiator, Pawn recipient)
{
return 0f;
}
}
}

View File

@ -37,9 +37,9 @@ namespace Privacy_Please
};
yield return FollowToil;
Toil SexToil = new Toil();
Toil SexToil = new Toil();
SexToil.defaultCompleteMode = ToilCompleteMode.Never;
SexToil.socialMode = RandomSocialMode.Off;
SexToil.defaultDuration = duration;
SexToil.handlingFacing = true;
SexToil.FailOn(() => (Partner.jobs.curDriver is JobDriver_SexBaseReciever) == false);
SexToil.initAction = delegate

View File

@ -37,7 +37,7 @@ namespace Privacy_Please
WatchToil.AddPreTickAction(delegate
{
if (pawn.IsHashIntervalTick(ticks_between_eyes))
{ ThrowMetaIconF(pawn.Position, pawn.Map, ModFleckDefOf.Eye); }
{ ThrowMetaIconF(pawn.Position, pawn.Map, ModFleckDefOf.EyeHeart); }
if (pawn?.needs?.TryGetNeed<Need_Sex>() != null)
{ pawn.needs.TryGetNeed<Need_Sex>().CurLevel += 0.5f / 2500f; }

View File

@ -25,6 +25,9 @@ namespace Privacy_Please
Quirk cuckold = new Quirk("Cuckold", "CuckoldQuirk");
Quirk.All.AddDistinct(cuckold);
Quirk cuckolder = new Quirk("Cuckolder", "CuckolderQuirk");
Quirk.All.AddDistinct(cuckolder);
DebugMode.Message("Added RJW quirks");
}
}

View File

@ -31,9 +31,11 @@ namespace Privacy_Please
foreach (Thing thing in GenRadial.RadialDistinctThingsAround(pawn.Position, pawn.Map, radius, true))
{
Pawn other = thing as Pawn;
if (other == null) continue;
if (other == null || pawn == other) continue;
DebugMode.Message("Checking " + other.LabelShort);
SexInteractionUtility.GetReactionsToSexDiscovery(pawn.jobs.curDriver as JobDriver_Sex, other, out ReactionToSexDiscovery reactionOfPawn, out ReactionToSexDiscovery reactionOfOther, false);
DebugMode.Message("Reaction: " + reactionOfOther);
// Find candidates to invite
if ((int)reactionOfOther >= (int)ReactionToSexDiscovery.Acceptance && SexInteractionUtility.PasserbyCanBePropositionedForSex(other, pawn.GetAllSexParticipants()))
@ -50,6 +52,7 @@ namespace Privacy_Please
pawn.GetSexInitiator().IsInBed(out Building bed);
DebugMode.Message(invitedPawn.NameShortColored + " was invited to join in sex");
pawn.interactions.TryInteractWith(invitedPawn, ModInteractionDefOf.InviteToHaveGroupSex);
Job job = new Job(DefDatabase<JobDef>.GetNamed("JoinInSex", false), pawn.GetSexPartner(), bed);
invitedPawn.jobs.TryTakeOrderedJob(job);

View File

@ -1,105 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using RimWorld;
using Verse;
using HarmonyLib;
namespace Privacy_Please
{
[HarmonyPatch(typeof(ThoughtWorker_Precept_GroinChestHairOrFaceUncovered), "HasUncoveredGroinChestHairOrFace")]
public static class HarmonyPatch_ThoughtWorker_Precept_GroinChestHairOrFaceUncovered
{
public static void Postfix(ref bool __result, Pawn p)
{
if (__result == false) return;
Pawn pawn = p;
if (BasicSettings.underwearSufficentForIdeos == false) return;
if (pawn?.apparel == null)
{ __result = false; return; }
if (pawn.apparel.WornApparel.NullOrEmpty())
{ __result = true; return; }
bool fullHeadCovered = pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.FullHead));
bool groinCovered = pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Legs) || x.def.apparel.bodyPartGroups.Contains(ModBodyPartGroupDefOf.GenitalsBPG));
bool chestCovered = pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Torso) || x.def.apparel.bodyPartGroups.Contains(ModBodyPartGroupDefOf.ChestBPG));
bool faceCovered = fullHeadCovered || pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Eyes));
bool hairCovered = fullHeadCovered || pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.UpperHead));
__result = !(groinCovered && chestCovered && faceCovered && hairCovered);
}
}
[HarmonyPatch(typeof(ThoughtWorker_Precept_GroinChestOrHairUncovered), "HasUncoveredGroinChestOrHair")]
public static class HarmonyPatch_ThoughtWorker_Precept_GroinChestOrHairUncovered
{
public static void Postfix(ref bool __result, Pawn p)
{
if (__result == false) return;
Pawn pawn = p;
if (BasicSettings.underwearSufficentForIdeos == false) return;
if (pawn?.apparel == null)
{ __result = false; return; }
if (pawn.apparel.WornApparel.NullOrEmpty())
{ __result = true; return; }
bool fullHeadCovered = pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.FullHead));
bool groinCovered = pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Legs) || x.def.apparel.bodyPartGroups.Contains(ModBodyPartGroupDefOf.GenitalsBPG));
bool chestCovered = pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Torso) || x.def.apparel.bodyPartGroups.Contains(ModBodyPartGroupDefOf.ChestBPG));
bool hairCovered = fullHeadCovered || pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.UpperHead));
__result = !(groinCovered && chestCovered && hairCovered);
}
}
[HarmonyPatch(typeof(ThoughtWorker_Precept_GroinOrChestUncovered), "HasUncoveredGroinOrChest")]
public static class HarmonyPatch_ThoughtWorker_Precept_HasUncoveredGroinOrChest
{
public static void Postfix(ref bool __result, Pawn p)
{
if (__result == false) return;
Pawn pawn = p;
if (BasicSettings.underwearSufficentForIdeos == false) return;
if (pawn?.apparel == null)
{ __result = false; return; }
if (pawn.apparel.WornApparel.NullOrEmpty())
{ __result = true; return; }
bool groinCovered = pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Legs) || x.def.apparel.bodyPartGroups.Contains(ModBodyPartGroupDefOf.GenitalsBPG));
bool chestCovered = pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Torso) || x.def.apparel.bodyPartGroups.Contains(ModBodyPartGroupDefOf.ChestBPG));
__result = !(groinCovered && chestCovered);
}
}
[HarmonyPatch(typeof(ThoughtWorker_Precept_GroinUncovered), "HasUncoveredGroin")]
public static class HarmonyPatch_ThoughtWorker_Precept_GroinUncovered
{
public static void Postfix(ref bool __result, Pawn p)
{
if (__result == false) return;
Pawn pawn = p;
if (BasicSettings.underwearSufficentForIdeos == false) return;
if (pawn?.apparel == null)
{ __result = false; return; }
if (pawn.apparel.WornApparel.NullOrEmpty())
{ __result = true; return; }
bool groinCovered = pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Legs) || x.def.apparel.bodyPartGroups.Contains(ModBodyPartGroupDefOf.GenitalsBPG));
__result = !groinCovered;
}
}
}

View File

@ -9,55 +9,51 @@ namespace Privacy_Please
{
public class BasicSettings : ModSettings
{
public static bool needPrivacy = true;
public static float chanceForOtherToJoinInSex = 0.25f;
public static bool debugMode = false;
public static bool worryAboutExhibitionism = true;
public static bool worryAboutMasturbation = true;
public static bool worryAboutInfidelity = true;
public static bool worryAboutBeastiality = true;
public static bool worryAboutRape = true;
public static bool worryAboutNecro = true;
public static bool worryAboutXeno = true;
public static bool worryAboutMasturbation = true;
public static bool worryAboutIncest = true;
public static bool majorTabooCanStartFights = false;
public static bool ignoreRitualAndPartySex = true;
public static bool slavesIgnoreSex = false;
public static bool otherFactionsIgnoreSex = false;
public static bool copulatorsIgnoreSlaves = false;
public static bool copulatorsIgnoreOtherFactions = false;
public static bool colonistsIgnoreSlaves = false;
public static bool colonistsIgnoreOtherFactions = false;
public static bool rapeIsUninteruptable = true;
public static bool whoringIsUninteruptable = true;
public static bool rapeIsUninteruptable = false;
public static bool whoringIsUninteruptable = false;
public static bool underwearSufficentForIdeos = true;
public static bool exposedUnderwearMood = true;
public static bool majorTabooCanCausePanic = true;
public static float chanceForOtherToJoinInSex = 0.25f;
public static bool debugMode = false;
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref needPrivacy, "needPrivacy", true);
Scribe_Values.Look(ref chanceForOtherToJoinInSex, "chanceForSexExtra", 0.25f);
Scribe_Values.Look(ref debugMode, "debugMode", false);
Scribe_Values.Look(ref worryAboutExhibitionism, "worryAboutExhibitionism", true);
Scribe_Values.Look(ref worryAboutMasturbation, "worryAboutMasturbation", true);
Scribe_Values.Look(ref worryAboutInfidelity, "worryAboutInfidelity", true);
Scribe_Values.Look(ref worryAboutBeastiality, "worryAboutBeastiality", true);
Scribe_Values.Look(ref worryAboutRape, "worryAboutRape", true);
Scribe_Values.Look(ref worryAboutNecro, "worryAboutNecro", true);
Scribe_Values.Look(ref worryAboutXeno, "worryAboutXeno", true);
Scribe_Values.Look(ref worryAboutMasturbation, "worryAboutMasturbation", true);
Scribe_Values.Look(ref worryAboutIncest, "worryAboutIncest", true);
Scribe_Values.Look(ref majorTabooCanStartFights, "majorTabooCanStartFights", false);
Scribe_Values.Look(ref ignoreRitualAndPartySex, "ignoreRitualAndPartySex", false);
Scribe_Values.Look(ref worryAboutXeno, "worryAboutXeno", true);
Scribe_Values.Look(ref ignoreRitualAndPartySex, "ignoreRitualAndPartySex", true);
Scribe_Values.Look(ref slavesIgnoreSex, "slavesIgnoreSex", false);
Scribe_Values.Look(ref otherFactionsIgnoreSex, "otherFactionsIgnoreSex", false);
Scribe_Values.Look(ref copulatorsIgnoreSlaves, "copulatorsIgnoreSlaves", false);
Scribe_Values.Look(ref copulatorsIgnoreOtherFactions, "copulatorsIgnoreOtherFactions", false);
Scribe_Values.Look(ref rapeIsUninteruptable, "slavesIgnoreSex", true);
Scribe_Values.Look(ref whoringIsUninteruptable, "otherFactionsIgnoreSex", true);
Scribe_Values.Look(ref underwearSufficentForIdeos, "underwearSufficentForIdeos", true);
Scribe_Values.Look(ref exposedUnderwearMood, "exposedUnderwearMood", true);
Scribe_Values.Look(ref colonistsIgnoreSlaves, "colonistsIgnoreSlaves", false);
Scribe_Values.Look(ref colonistsIgnoreOtherFactions, "colonistsIgnoreOtherFactions", false);
Scribe_Values.Look(ref rapeIsUninteruptable, "rapeIsUninteruptable", false);
Scribe_Values.Look(ref whoringIsUninteruptable, "whoringIsUninteruptable", false);
Scribe_Values.Look(ref majorTabooCanCausePanic, "majorTabooCanCausePanic", true);
Scribe_Values.Look(ref chanceForOtherToJoinInSex, "chanceForSexExtra", 0.25f);
Scribe_Values.Look(ref debugMode, "debugMode", false);
}
}
@ -101,7 +97,7 @@ namespace Privacy_Please
listingStandard.Label("privacy_please_general".Translate());
listingStandard.Gap(5f);
listingStandard.CheckboxLabeled("need_privacy".Translate(), ref BasicSettings.needPrivacy, "need_privacy_desc".Translate());
listingStandard.CheckboxLabeled("worry_about_exhibitionism".Translate(), ref BasicSettings.worryAboutExhibitionism, "worry_about_exhibitionism_desc".Translate());
listingStandard.CheckboxLabeled("worry_about_masturbation".Translate(), ref BasicSettings.worryAboutMasturbation, "worry_about_masturbation_desc".Translate());
listingStandard.CheckboxLabeled("worry_about_infidelity".Translate(), ref BasicSettings.worryAboutInfidelity, "worry_about_infidelity_desc".Translate());
listingStandard.CheckboxLabeled("worry_about_beastiality".Translate(), ref BasicSettings.worryAboutBeastiality, "worry_about_beastiality_desc".Translate());
@ -114,24 +110,17 @@ namespace Privacy_Please
listingStandard.CheckboxLabeled("ignore_ritual_and_party_sex".Translate(), ref BasicSettings.ignoreRitualAndPartySex, "ignore_ritual_and_party_sex_desc".Translate());
listingStandard.CheckboxLabeled("slaves_ignore_sex".Translate(), ref BasicSettings.slavesIgnoreSex, "slaves_ignore_sex_desc".Translate());
listingStandard.CheckboxLabeled("other_factions_ignore_sex".Translate(), ref BasicSettings.otherFactionsIgnoreSex, "other_factions_ignore_sex_desc".Translate());
listingStandard.CheckboxLabeled("copulators_ignore_slaves".Translate(), ref BasicSettings.copulatorsIgnoreSlaves, "copulators_ignore_slaves_desc".Translate());
listingStandard.CheckboxLabeled("copulators_ignore_other_factions".Translate(), ref BasicSettings.copulatorsIgnoreOtherFactions, "copulators_ignore_other_factions_desc".Translate());
listingStandard.CheckboxLabeled("major_taboo_can_start_fights".Translate(), ref BasicSettings.majorTabooCanStartFights, "major_taboo_can_start_fights_desc".Translate());
listingStandard.CheckboxLabeled("colonists_ignore_slaves".Translate(), ref BasicSettings.colonistsIgnoreSlaves, "colonists_ignore_slaves_desc".Translate());
listingStandard.CheckboxLabeled("colonists_ignore_other_factions".Translate(), ref BasicSettings.colonistsIgnoreOtherFactions, "colonists_ignore_other_factions_desc".Translate());
listingStandard.CheckboxLabeled("major_taboo_can_start_fights".Translate(), ref BasicSettings.majorTabooCanCausePanic, "major_taboo_can_start_fights_desc".Translate());
listingStandard.CheckboxLabeled("rape_is_uninteruptable".Translate(), ref BasicSettings.rapeIsUninteruptable, "rape_is_uninteruptable_desc".Translate());
listingStandard.CheckboxLabeled("whoring_is_uninteruptable".Translate(), ref BasicSettings.whoringIsUninteruptable, "whoring_is_uninteruptable".Translate());
listingStandard.CheckboxLabeled("whoring_is_uninteruptable".Translate(), ref BasicSettings.whoringIsUninteruptable, "whoring_is_uninteruptable_desc".Translate());
listingStandard.Gap(20f);
listingStandard.Label("chance_for_other_to_join_in_sex".Translate() + ": " + BasicSettings.chanceForOtherToJoinInSex.ToString("F"), -1f, "chance_for_other_to_join_in_sex_desc".Translate());
BasicSettings.chanceForOtherToJoinInSex = listingStandard.Slider(BasicSettings.chanceForOtherToJoinInSex, 0f, 1f);
listingStandard.Gap(10f);
listingStandard.Label("privacy_please_clothing".Translate());
listingStandard.Gap(5f);
listingStandard.CheckboxLabeled("underwear_sufficent_for_ideos".Translate(), ref BasicSettings.underwearSufficentForIdeos, "underwear_sufficent_for_ideos_desc".Translate());
listingStandard.CheckboxLabeled("exposed_underwear_mood".Translate(), ref BasicSettings.exposedUnderwearMood, "exposed_underwear_mood_desc".Translate());
listingStandard.Gap(15f);
listingStandard.Label("privacy_please_debugging".Translate());
listingStandard.Gap(5f);

View File

@ -1,38 +0,0 @@
using System;
using RimWorld;
using Verse;
using rjw;
namespace Privacy_Please
{
public class ThoughtWorker_ExposedUnderwear : ThoughtWorker
{
public static ThoughtState CurrentThoughtState(Pawn pawn)
{
if (xxx.has_quirk(pawn, "Exhibitionist") || pawn?.ideo?.Ideo.HasPrecept(ModPreceptDefOf.Exhibitionism_Approved) == true)
{ return ThoughtState.ActiveAtStage(2); }
if (pawn?.ideo?.Ideo.HasPrecept(ModPreceptDefOf.Exhibitionism_Acceptable) == true)
{ return ThoughtState.ActiveAtStage(1); }
return ThoughtState.ActiveAtStage(0);
}
protected override ThoughtState CurrentStateInternal(Pawn pawn)
{
if (BasicSettings.exposedUnderwearMood == false) return false;
if (pawn?.apparel?.WornApparel == null || pawn.apparel.WornApparel.NullOrEmpty()) return false;
if (pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(ModBodyPartGroupDefOf.GenitalsBPG)) &&
pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Legs)) == false)
{ return CurrentThoughtState(pawn); }
if (pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(ModBodyPartGroupDefOf.ChestBPG)) &&
pawn.apparel.WornApparel.Any(x => x.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.Torso)) == false)
{ return CurrentThoughtState(pawn); }
return ThoughtState.Inactive;
}
}
}

View File

@ -22,6 +22,20 @@ namespace Privacy_Please
[DefOf]
public static class ModFleckDefOf
{
public static FleckDef Eye;
public static FleckDef EyeHeart;
}
[DefOf]
public static class ModJobDefOf
{
public static JobDef WatchSex;
}
[DefOf]
public static class ModInteractionDefOf
{
public static InteractionDef InviteToHaveSex;
public static InteractionDef InviteToHaveGroupSex;
public static InteractionDef InviteVoyeurism;
}
}

View File

@ -15,14 +15,14 @@ namespace Privacy_Please
{
public static void PrivacyCheckForPawn(Pawn pawn, float radius)
{
if (pawn.IsHavingSex() == false && pawn.IsMasturbating() == false)
{ return; }
if (BasicSettings.ignoreRitualAndPartySex && pawn.IsPartOfRitualOrGathering())
{ return; }
if (pawn.IsHavingSex() == false && pawn.IsMasturbating() == false) return;
if (pawn.IsUnableToSenseSex() || pawn.RaceProps.Animal || pawn.RaceProps.IsMechanoid) return;
if (BasicSettings.ignoreRitualAndPartySex && pawn.IsPartOfRitualOrGathering()) return;
// Local variables
JobDriver_Sex jobDriver = pawn.jobs.curDriver as JobDriver_Sex;
if (jobDriver == null) return;
pawn.IsInBed(out Building bed);
foreach (Thing thing in GenRadial.RadialDistinctThingsAround(pawn.Position, pawn.Map, radius, true))
@ -40,15 +40,19 @@ namespace Privacy_Please
if ((int)reactionOfPawn >= (int)ReactionToSexDiscovery.Acceptance && (int)reactionOfWitness >= (int)ReactionToSexDiscovery.Acceptance && tryToPropositionTheWitness)
{
// Voyeurism
if (pawn.IsVoyeur() || (pawn.IsCuckold() && SexInteractionUtility.SexParticipantsIncludesACheatingPartner(witness, pawn.GetAllSexParticipants())))
if (witness.IsVoyeur() || (witness.IsCuckold() && SexInteractionUtility.SexParticipantsIncludesACheatingPartner(witness, pawn.GetAllSexParticipants())))
{
Job job = new Job(DefDatabase<JobDef>.GetNamed("WatchSex", false), pawn.GetSexReceiver(), bed);
witness.jobs.TryTakeOrderedJob(job);
pawn.interactions.TryInteractWith(witness, ModInteractionDefOf.InviteVoyeurism);
Job job = new Job(ModJobDefOf.WatchSex, pawn);
witness.jobs.TryTakeOrderedJob(job);
}
// Consensual sex
else if (pawn.IsMasturbating())
{
pawn.interactions.TryInteractWith(witness, ModInteractionDefOf.InviteToHaveSex);
if (bed == null)
{
Job job = new Job(xxx.quick_sex, pawn);
@ -65,6 +69,8 @@ namespace Privacy_Please
// Group sex
else
{
pawn.interactions.TryInteractWith(witness, ModInteractionDefOf.InviteToHaveGroupSex);
Job job = new Job(DefDatabase<JobDef>.GetNamed("JoinInSex", false), pawn.GetSexReceiver(), bed);
witness.jobs.TryTakeOrderedJob(job);
}

View File

@ -24,22 +24,21 @@ namespace Privacy_Please
return true;
}
public static bool PawnIsCheatingOnPartner(Pawn pawn, Pawn partner)
public static bool PawnIsCheatingOnPartner(Pawn cheater, Pawn victim)
{
List<Pawn> spouses = pawn.GetSpouses(false);
List<Pawn> spouses = cheater.GetSpouses(false);
if (BasicSettings.worryAboutInfidelity == false ||
partner.IsLoverOfOther(pawn) == false ||
pawn.HasTrait("Polygamous") ||
partner.HasTrait("Polygamous") ||
partner.IsMasturbating() ||
partner.IsHavingSex() == false ||
SexActIsXenophilia(partner.jobs.curDriver as JobDriver_Sex) ||
SexActIsBestiality(partner.jobs.curDriver as JobDriver_Sex) ||
partner.GetAllSexParticipants().Contains(pawn) ||
(spouses.NullOrEmpty() == false && partner.GetAllSexParticipants().Any(x => spouses.Contains(x))))
victim.IsLoverOfOther(cheater) == false ||
cheater.HasTrait("Polygamous") ||
victim.HasTrait("Polygamous") ||
cheater.IsHavingSex() == false ||
SexActIsNecrophilia(cheater.jobs.curDriver as JobDriver_Sex) ||
SexActIsBestiality(cheater.jobs.curDriver as JobDriver_Sex) ||
cheater.GetAllSexParticipants().Contains(victim) ||
(spouses.NullOrEmpty() == false && cheater.GetAllSexParticipants().Any(x => spouses.Contains(x))))
{ return false; }
return true;
}
@ -56,17 +55,20 @@ namespace Privacy_Please
public static bool PasserbyCanBePropositionedForSex(Pawn passerby, List<Pawn> participants)
{
if (passerby == null ||
participants.Contains(passerby) ||
participants.Any(x => x.CanSee(passerby) == false))
{ return false; }
if (passerby == null || participants.Contains(passerby))
{ DebugMode.Message("Cannot proposition " + passerby.NameShortColored + ": they are already involved in the activity"); return false; }
if (participants.Count > 2 ||
participants.Any(x => x.IsForbidden(passerby) ||
x.HostileTo(passerby)) ||
CasualSex_Helper.CanHaveSex(passerby) == false ||
xxx.IsTargetPawnOkay(passerby) == false)
{ return false; }
if (participants.Any(x => x.CanSee(passerby)) == false)
{ DebugMode.Message("Cannot proposition " + passerby.NameShortColored + ": no-one involved can see them"); return false; }
if (participants.Count > 2)
{ DebugMode.Message("Cannot proposition " + passerby.NameShortColored + ": max participants has been reached"); return false; }
if (participants.Any(x => x.IsForbidden(passerby) || x.HostileTo(passerby)))
{ DebugMode.Message("Cannot proposition " + passerby.NameShortColored + ": someone is forbidden or hostile"); return false; }
if (CasualSex_Helper.CanHaveSex(passerby) == false || xxx.IsTargetPawnOkay(passerby) == false)
{ DebugMode.Message("Cannot proposition " + passerby.NameShortColored + ": they cannot have sex"); return false; }
if (SexUtility.ReadyForHookup(passerby) &&
(passerby?.jobs?.curJob == null || (passerby.jobs.curJob.playerForced == false && CasualSex_Helper.quickieAllowedJobs.Contains(passerby.jobs.curJob.def))) &&
@ -74,16 +76,17 @@ namespace Privacy_Please
participants.All(x => SexAppraiser.would_fuck(x, passerby, false, false, true) > 0.1f && SexAppraiser.would_fuck(passerby, x, false, false, true) > 0.1f))
{ return true; }
DebugMode.Message("Cannot proposition " + passerby.NameShortColored + ": they are either too busy or not appealing");
return false;
}
public static void GetReactionsToSexDiscovery(JobDriver_Sex jobDriver, Pawn witness, out ReactionToSexDiscovery reactionOfPawn, out ReactionToSexDiscovery reactionOfWitness, bool applyThoughtDefs = false)
{
Pawn pawn = jobDriver.pawn;
reactionOfPawn = ReactionToSexDiscovery.Acceptance;
reactionOfWitness = ReactionToSexDiscovery.Acceptance;
reactionOfPawn = ReactionToSexDiscovery.Uncaring;
reactionOfWitness = ReactionToSexDiscovery.Uncaring;
// Determine if there are any issues with the sex event and the witness' morals and apply thoughtDefs as required
foreach (SexActReactionDef sexActReactionDef in DefDatabase<SexActReactionDef>.AllDefs)
{
@ -93,16 +96,19 @@ namespace Privacy_Please
{ DebugMode.Message("Method '" + sexActReactionDef.sexActCheck + "' was not found"); continue; }
if ((bool)methodInfo.Invoke(null, new object[] { jobDriver, witness }))
{ sexActReactionDef.DetermineReactionOfPawns(pawn, witness, out reactionOfPawn, out reactionOfWitness, applyThoughtDefs); }
{ sexActReactionDef.DetermineReactionOfPawns(pawn, witness, out reactionOfPawn, out reactionOfWitness, applyThoughtDefs); break; }
}
// Exit here if thoughtDefs are not being applied
if (applyThoughtDefs == false) return;
// Exit here if thoughtDefs are not being applied
if (applyThoughtDefs == false || BasicSettings.majorTabooCanCausePanic == false) return;
if (witness?.Drafted == true || witness?.mindState?.duty?.def.alwaysShowWeapon == true) return;
// Panic reaction
if (reactionOfWitness == ReactionToSexDiscovery.Panic)
{
Job job = JobMaker.MakeJob(JobDefOf.FleeAndCower, CellFinderLoose.GetFleeDest(witness, new List<Thing>() { pawn }, 24f), pawn);
witness.jobs.ClearQueuedJobs();
witness.jobs.EndCurrentJob(JobCondition.InterruptForced, false, false);
witness.jobs.StartJob(job);
}
@ -113,6 +119,7 @@ namespace Privacy_Please
Job jobVomit = JobMaker.MakeJob(JobDefOf.Vomit);
Job jobFlee = JobMaker.MakeJob(JobDefOf.FleeAndCower, CellFinderLoose.GetFleeDest(witness, new List<Thing>() { pawn }, 24f), pawn);
witness.jobs.ClearQueuedJobs();
witness.jobs.EndCurrentJob(JobCondition.InterruptForced, false, false);
if (Random.value <= 0.25f)
@ -128,22 +135,44 @@ namespace Privacy_Please
public static bool SexActIsNecrophilia(JobDriver_Sex jobDriver, Pawn witness = null)
{
return jobDriver.Partner != null && jobDriver.Partner.Dead;
return BasicSettings.worryAboutNecro && jobDriver.Partner != null && jobDriver.Partner.Dead;
}
public static bool SexActIsBestiality(JobDriver_Sex jobDriver, Pawn witness = null)
{
return jobDriver.Partner != null && jobDriver.Partner.RaceProps.Animal;
return BasicSettings.worryAboutBeastiality && jobDriver.Partner != null && jobDriver.Partner.RaceProps.Animal;
}
public static bool SexActIsBestialityWithOrdinaryAnimal(JobDriver_Sex jobDriver, Pawn witness = null)
{
if (BasicSettings.worryAboutBeastiality == false) return false;
if (jobDriver.Partner == null || jobDriver.Partner.RaceProps.Animal == false) return false;
if (jobDriver.pawn.Ideo.PreceptsListForReading.Any(x => x.def.defName == "Bestiality_BondOnly") && jobDriver.Partner.relations.GetFirstDirectRelationPawn(PawnRelationDefOf.Bond) != jobDriver.pawn) return true;
if (jobDriver.pawn.Ideo.PreceptsListForReading.Any(x => x.def.defName == "Bestiality_OnlyVenerated") && jobDriver.pawn.Ideo.IsVeneratedAnimal(jobDriver.Partner) == false) return true;
return false;
}
public static bool SexActIsBestialityWithSpecialAnimal(JobDriver_Sex jobDriver, Pawn witness = null)
{
if (BasicSettings.worryAboutBeastiality == false) return false;
if (jobDriver.Partner == null || jobDriver.Partner.RaceProps.Animal == false) return false;
if (jobDriver.pawn.Ideo.PreceptsListForReading.Any(x => x.def.defName == "Bestiality_BondOnly") && jobDriver.Partner.relations.GetFirstDirectRelationPawn(PawnRelationDefOf.Bond) == jobDriver.pawn) return true;
if (jobDriver.pawn.Ideo.PreceptsListForReading.Any(x => x.def.defName == "Bestiality_OnlyVenerated") && jobDriver.pawn.Ideo.IsVeneratedAnimal(jobDriver.Partner) == true) return true;
return false;
}
public static bool SexActIsRape(JobDriver_Sex jobDriver, Pawn witness = null)
{
return jobDriver is JobDriver_Rape || jobDriver is JobDriver_RapeEnemy || jobDriver is JobDriver_SexBaseRecieverRaped;
return BasicSettings.worryAboutRape && (jobDriver is JobDriver_Rape || jobDriver is JobDriver_RapeEnemy || jobDriver is JobDriver_SexBaseRecieverRaped);
}
public static bool SexActIsXenophilia(JobDriver_Sex jobDriver, Pawn witness = null)
{
return jobDriver.Partner != null && jobDriver.Partner.def.defName != jobDriver.pawn.def.defName;
return BasicSettings.worryAboutXeno && jobDriver.Partner != null && jobDriver.Partner.def.defName != jobDriver.pawn.def.defName;
}
public static bool SexActIsMasturbation(JobDriver_Sex jobDriver, Pawn witness = null)
@ -153,12 +182,12 @@ namespace Privacy_Please
public static bool SexActIsExhibitionism(JobDriver_Sex jobDriver, Pawn witness = null)
{
return jobDriver.pawn.IsHavingSex();
return BasicSettings.worryAboutExhibitionism && jobDriver.pawn.IsHavingSex();
}
public static bool SexActIsInfidelity(JobDriver_Sex jobDriver, Pawn witness = null)
{
return PawnIsCheatingOnPartner(jobDriver.pawn, witness);
return BasicSettings.worryAboutInfidelity && PawnIsCheatingOnPartner(jobDriver.pawn, witness);
}
}
}

View File

@ -41,13 +41,12 @@
<Compile Include="Scripts\Defs\SexActReactionDef.cs" />
<Compile Include="Scripts\Defs\SexActThoughtDef.cs" />
<Compile Include="Scripts\Extensions\PawnExtension.cs" />
<Compile Include="Scripts\InteractionWorkers\InteractionWorker_NullWorker.cs" />
<Compile Include="Scripts\JobDrivers\JobDriver_WatchSex.cs" />
<Compile Include="Scripts\JobDrivers\JobDriver_JoinInSex.cs" />
<Compile Include="Scripts\Patches\HarmonyPatch_PatchAll.cs" />
<Compile Include="Scripts\Patches\HarmonyPatch_RJW.cs" />
<Compile Include="Scripts\Patches\HarmonyPatch_ThoughtWorkers.cs" />
<Compile Include="Scripts\Settings\BasicSettings.cs" />
<Compile Include="Scripts\ThoughtWorkers\ThoughtWorker_ExposedUnderwear.cs" />
<Compile Include="Scripts\Utilities\DebugMode.cs" />
<Compile Include="Scripts\Utilities\Enums.cs" />
<Compile Include="Scripts\Utilities\ModDefOf.cs" />

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
7168a589dcb8c6bc69e172d8ed7c3d5766de561d
c0e6116b91709008b7d36d54e77d617d264e9150

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB