From 70badb6916c0b4d375d50e534e1a7259a2f5bee0 Mon Sep 17 00:00:00 2001
From: Svornost <11434-svornost@users.noreply.gitgud.io>
Date: Tue, 24 Dec 2019 18:14:59 -0800
Subject: [PATCH] Make rapists usually follow release rules, and punish them
 when they disobey.

---
 src/endWeek/saRules_old.js    | 15 +++++++++++++++
 src/js/utilJS.js              |  7 +++++--
 src/utility/saRulesWidgets.tw | 12 ++++++++++++
 3 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/src/endWeek/saRules_old.js b/src/endWeek/saRules_old.js
index 6e2f3084720..85ed0e37dc1 100644
--- a/src/endWeek/saRules_old.js
+++ b/src/endWeek/saRules_old.js
@@ -1081,6 +1081,11 @@
 								rival.counter.penetrative += fuckCount;
 								V.penetrativeTotal += fuckCount;
 							}
+
+							if (!App.Utils.sexAllowed(slave, rival)) {
+								r += `As the rules do not permit ${slave.slaveName} and ${rival.slaveName} to have sex, ${he} is <span class="yellow">severely punished.</span> `;
+								slave.trust -= 4;
+							}
 						}
 					}
 					SimpleSexAct.Slave(slave, 4);
@@ -1156,6 +1161,11 @@
 								rival.counter.penetrative += fuckCount;
 								V.penetrativeTotal += fuckCount;
 							}
+
+							if (!App.Utils.sexAllowed(slave, rival)) {
+								r += `As the rules do not permit ${slave.slaveName} and ${rival.slaveName} to have sex, ${he} is <span class="yellow">severely punished.</span> `;
+								slave.trust -= 4;
+							}
 						}
 					}
 					SimpleSexAct.Slave(slave, 4);
@@ -1201,6 +1211,11 @@
 							slave.rivalryTarget = rival.ID;
 							rival.rivalryTarget = slave.ID;
 							SimpleSexAct.Slave(rival, 4);
+
+							if (!App.Utils.sexAllowed(slave, rival)) {
+								r += `As the rules do not permit ${slave.slaveName} and ${rival.slaveName} to have sex, ${he} is <span class="yellow">severely punished.</span> `;
+								slave.trust -= 4;
+							}
 						}
 					}
 					SimpleSexAct.Slave(slave, 7);
diff --git a/src/js/utilJS.js b/src/js/utilJS.js
index 44b6cb949fc..bd73b7fa982 100644
--- a/src/js/utilJS.js
+++ b/src/js/utilJS.js
@@ -3244,6 +3244,8 @@ window.disobedience = function(slave) {
  * @returns {App.Entity.SlaveState | undefined}
  */
 window.randomRapeRivalryTarget = function(slave, predicate) {
+	const willIgnoreRules = disobedience(rapist) > jsRandom(0, 100);
+
 	function canBeARapeRival(s) {
 		return (s.devotion <= 95 && s.energy <= 95 && !s.rivalry && !s.fuckdoll && s.fetish !== "mindbroken");
 	}
@@ -3251,7 +3253,8 @@ window.randomRapeRivalryTarget = function(slave, predicate) {
 	function canRape(rapist, rapee) {
 		const opportunity = (assignmentVisible(rapist) && assignmentVisible(rapee)) || rapist.assignment === rapee.assignment;
 		const desire = !(rapist.relationship >= 3 && rapist.relationshipTarget === rapee.id);
-		return opportunity && desire;
+		const permission = willIgnoreRules || App.Utils.sexAllowed(rapist, rapee);
+		return opportunity && desire && permission;
 	}
 
 	if (typeof predicate !== 'function') {
@@ -3260,7 +3263,7 @@ window.randomRapeRivalryTarget = function(slave, predicate) {
 
 	const arr = V.slaves.filter((s) => { return canBeARapeRival(s) && canRape(slave, s); }).shuffle();
 	return arr.find(predicate);
-}
+};
 
 /**
  * Topological sorting algorithm
diff --git a/src/utility/saRulesWidgets.tw b/src/utility/saRulesWidgets.tw
index 9875b5bdd95..28932d0984f 100644
--- a/src/utility/saRulesWidgets.tw
+++ b/src/utility/saRulesWidgets.tw
@@ -447,6 +447,10 @@ and
 					<<set _fuckCount = random(1,3)>>
 					<<set _rival.counter.penetrative += _fuckCount, $penetrativeTotal += _fuckCount>>
 				<</if>>
+				<<if !App.Utils.sexAllowed($slaves[$i], _rival)>>
+					As the rules do not permit $slaves[$i].slaveName and _rival.slaveName to have sex, $he is @@.yellow;severely punished.@@
+					<<set $slaves[$i].trust -= 4>>
+				<</if>>
 			<</if>>
 		<</if>>
 		<<run SimpleSexAct.Slave($slaves[$i], 4)>>
@@ -502,6 +506,10 @@ and
 					<<set _fuckCount = random(1,3)>>
 					<<set _rival.counter.penetrative += _fuckCount, $penetrativeTotal += _fuckCount>>
 				<</if>>
+				<<if !App.Utils.sexAllowed($slaves[$i], _rival)>>
+					As the rules do not permit $slaves[$i].slaveName and _rival.slaveName to have sex, $he is @@.yellow;severely punished.@@
+					<<set $slaves[$i].trust -= 4>>
+				<</if>>
 			<</if>>
 		<</if>>
 		<<run SimpleSexAct.Slave($slaves[$i], 4)>>
@@ -538,6 +546,10 @@ and
 				$He repeatedly rapes a reluctant <<= SlaveFullName(_rival)>>; $he can't seem to keep $his hand<<if (hasBothArms($slaves[$i]) || !hasAnyArms($slaves[$i]))>>s<</if>><<if (!hasAnyArms($slaves[$i]))>> (so to speak)<</if>> off the poor slave, who can't avoid $him. Not surprisingly, _rival.slaveName resents this, and $slaves[$i].slaveName's ongoing sexual abuse @@.lightsalmon;starts a rivalry@@ between them.
 				<<set $slaves[$i].rivalry = 1, _rival.rivalry = 1, $slaves[$i].rivalryTarget = _rival.ID, _rival.rivalryTarget = $slaves[$i].ID>>
 				<<run SimpleSexAct.Slave(_rival, 4)>>
+				<<if !App.Utils.sexAllowed($slaves[$i], _rival)>>
+					As the rules do not permit $slaves[$i].slaveName and _rival.slaveName to have sex, $he is @@.yellow;severely punished.@@
+					<<set $slaves[$i].trust -= 4>>
+				<</if>>
 			<</if>>
 		<</if>>
 		<<run SimpleSexAct.Slave($slaves[$i], 7)>>
-- 
GitLab