From be4f624ac99c6cb469e85b8bf0bca53d0b3e74a6 Mon Sep 17 00:00:00 2001
From: Svornost <11434-svornost@users.noreply.gitgud.io>
Date: Wed, 25 Dec 2019 14:53:07 -0800
Subject: [PATCH] Make the RA work with new release rules

---
 devTools/FC.d.ts                | 10 ++++-
 src/js/DefaultRules.js          | 24 ++++++-----
 src/js/releaseRules.js          | 34 ++++++++--------
 src/js/rulesAssistant.js        | 13 +++++-
 src/js/rulesAssistantOptions.js | 70 +++++++++++++++++++++++++++------
 5 files changed, 112 insertions(+), 39 deletions(-)

diff --git a/devTools/FC.d.ts b/devTools/FC.d.ts
index a1089334617..c348d54bf8b 100644
--- a/devTools/FC.d.ts
+++ b/devTools/FC.d.ts
@@ -89,8 +89,16 @@ declare namespace App {
 			intensity: number;
 		}
 
+		class RuleReleaseSetters {
+			masturbation: number;
+			partner: number;
+			family: number;
+			slaves: number;
+			master: number;
+		}
+
 		class RuleSetters {
-			releaseRules: string;
+			releaseRules: RuleReleaseSetters;
 			toyHole: string;
 			clitSetting: string;
 			clitSettingXY: number;
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index 22f9974b641..eb91cb40374 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -1939,16 +1939,22 @@ window.DefaultRules = (function() {
 	 * @param {object} rule
 	 */
 	function ProcessRelease(slave, rule) {
-		// FIXME: rule.releaseRules is currently a string - slave.rules.release isn't!
 		if ((rule.releaseRules !== undefined) && (rule.releaseRules !== null)) {
-			let release = 0;
-			if (!App.Utils.hasNonassignmentSex(slave) &&
-				!(["be a subordinate slave", "be confined in the arcade", "be your Head Girl", "get milked", "please you", "serve in the club", "serve in the master suite", "serve the public", "whore", "work a glory hole", "work as a farmhand", "work in the brothel", "work in the dairy"].contains(slave.assignment))) {
-				release = 1;
-			}
-			if ((release !== 1) && (slave.rules.release !== rule.releaseRules)) {
-				slave.rules.release = rule.releaseRules;
-				r += `<br>${slave.slaveName}'s release rules have been set to: ${App.Utils.releaseSummaryLong}.`;
+			let changed = false;
+			let processReleaseProp = (property) => {
+				if (rule.releaseRules[property] !== undefined && rule.releaseRules[property] !== null) { 
+					slave.rules.release[property] = rule.releaseRules[property];
+					return true;
+				}
+				return false;
+			};
+			changed |= processReleaseProp('masturbation');
+			changed |= processReleaseProp('partner');
+			changed |= processReleaseProp('family');
+			changed |= processReleaseProp('slaves');
+			changed |= processReleaseProp('master');
+			if (changed) {
+				r += `<br>${slave.slaveName}'s release rules have been set to: ${App.Utils.releaseSummaryLong(slave)}.`;
 			}
 		}
 	}
diff --git a/src/js/releaseRules.js b/src/js/releaseRules.js
index 07f353a444c..18e55663bbd 100644
--- a/src/js/releaseRules.js
+++ b/src/js/releaseRules.js
@@ -102,15 +102,15 @@ App.Utils.releaseSummaryShort = function releaseSummaryShort(slave) {
 App.Utils.releaseSummaryLong = function releaseSummaryLong(slave) {
 	const rel = slave.rules.release;
 	const includeFamily = (rel.family === 1) && (V.seeIncest === 1);
-	if (rel.masturbation === 0 && rel.partner === 0 && includeFamily === 0 && rel.slaves === 0 && rel.master === 0) {
+	if (rel.masturbation === 0 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
 		return "chastity";
-	} else if (rel.masturbation === 1 && rel.partner === 0 && includeFamily === 0 && rel.slaves === 0 && rel.master === 0) {
+	} else if (rel.masturbation === 1 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
 		return "masturbation only";
-	} else if (rel.masturbation === 0 && rel.partner === 1 && includeFamily === 0 && rel.slaves === 0 && rel.master === 0) {
+	} else if (rel.masturbation === 0 && rel.partner === 1 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
 		return "partner only";
-	} else if (rel.masturbation === 0 && rel.partner === 0 && includeFamily === 1 && rel.slaves === 0 && rel.master === 0) {
+	} else if (rel.masturbation === 0 && rel.partner === 0 && includeFamily && rel.slaves === 0 && rel.master === 0) {
 		return "family only";
-	} else if (rel.masturbation === 0 && rel.partner === 0 && includeFamily === 0 && rel.slaves === 0 && rel.master === 1) {
+	} else if (rel.masturbation === 0 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 1) {
 		return "you only";
 	} else if (rel.slaves === 1) {
 		let ret = "permissive";
@@ -118,7 +118,7 @@ App.Utils.releaseSummaryLong = function releaseSummaryLong(slave) {
 		if (rel.partner === 0) {
 			exceptions.push("partner");
 		}
-		if (includeFamily === 0) {
+		if (!includeFamily) {
 			exceptions.push("family");
 		}
 		if (rel.master === 0) {
@@ -139,7 +139,7 @@ App.Utils.releaseSummaryLong = function releaseSummaryLong(slave) {
 		if (rel.partner === 1) {
 			permissions.push("partner");
 		}
-		if (includeFamily === 1) {
+		if (includeFamily) {
 			permissions.push("family");
 		}
 		if (rel.master === 1) {
@@ -160,26 +160,26 @@ App.Desc.releaseDesc = function releaseDesc(slave) {
 	const includeFamily = (rel.family === 1) && (V.seeIncest === 1);
 	let r = "and ";
 	let appendFrequency = false;
-	if (rel.masturbation === 0 && rel.partner === 0 && includeFamily === 0 && rel.slaves === 0 && rel.master === 0) {
+	if (rel.masturbation === 0 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
 		r += "$he is to remain completely chaste.";
-	} else if (rel.masturbation === 1 && rel.partner === 0 && includeFamily === 0 && rel.slaves === 0 && rel.master === 0) {
+	} else if (rel.masturbation === 1 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
 		r += "$he is only allowed to masturbate";
 		if (slave.energy > 95) {
 			r += ", which $he is constantly doing.";
 		} else {
 			r += ".";
 		}
-	} else if (rel.masturbation === 0 && rel.partner === 1 && includeFamily === 0 && rel.slaves === 0 && rel.master === 0) {
+	} else if (rel.masturbation === 0 && rel.partner === 1 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
 		r += "$he is not allowed to masturbate or proposition ";
 		if (slave.rules.relationship === "permissive" && slave.relationship >= 3) {
 			r += `slaves other than $his ${relationshipTerm(slave)}.`;
 		} else {
 			r += "other slaves; $he must find sexual release in $his duties.";
 		}
-	} else if (rel.masturbation === 0 && rel.partner === 0 && includeFamily === 1 && rel.slaves === 0 && rel.master === 0) {
+	} else if (rel.masturbation === 0 && rel.partner === 0 && includeFamily && rel.slaves === 0 && rel.master === 0) {
 		r += "$he is not allowed to masturbate. $He is only allowed to achieve sexual release with close family members,";
 		appendFrequency = true;
-	} else if (rel.masturbation === 0 && rel.partner === 0 && includeFamily === 0 && rel.slaves === 0 && rel.master === 1) {
+	} else if (rel.masturbation === 0 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 1) {
 		r += "$he is not allowed to masturbate. $He must find you if $he wants sexual release,";
 		appendFrequency = true;
 	} else if (rel.slaves === 1) {
@@ -195,11 +195,11 @@ App.Desc.releaseDesc = function releaseDesc(slave) {
 		}
 
 		const exceptPartner = (rel.partner === 0) && (slave.rules.relationship === "permissive") && (slave.relationship >= 3);
-		if (exceptPartner && includeFamily === 0) {
+		if (exceptPartner && !includeFamily) {
 			r += ` except for $his ${relationshipTerm(slave)} and close family members,`;
 		} else if (exceptPartner) {
 			r += ` except for $his ${relationshipTerm(slave)},`;
-		} else if (includeFamily === 0) {
+		} else if (!includeFamily) {
 			r += ` except for $his close family members,`;
 		}
 
@@ -212,13 +212,13 @@ App.Desc.releaseDesc = function releaseDesc(slave) {
 		}
 
 		const showPartner = (rel.partner === 1) && (slave.rules.relationship === "permissive") && (slave.relationship >= 3);
-		if (includeFamily === 1 && showPartner) {
+		if (includeFamily && showPartner) {
 			r += `have sex with $his ${relationshipTerm(slave)} and close family members,`;
 		} else if (showPartner) {
 			r += `fuck $his ${relationshipTerm(slave)} as much as he wants,`;
-		} else if (includeFamily === 1 && rel.master === 1) {
+		} else if (includeFamily && rel.master === 1) {
 			r += `proposition sex from $his close family members and you,`;
-		} else if (includeFamily === 1) {
+		} else if (includeFamily) {
 			r += `proposition sex from $his close family members,`;
 		} else { // should mean rel.master === 1
 			r += `find you for sexual relief,`;
diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js
index 2419b46e237..2e2a2961d33 100644
--- a/src/js/rulesAssistant.js
+++ b/src/js/rulesAssistant.js
@@ -257,7 +257,7 @@ App.RA.newRule = function() {
 	/** @returns {App.RA.RuleSetters} */
 	function emptySetters() {
 		return {
-			releaseRules: null,
+			releaseRules: emptyRelease(),
 			toyHole: null,
 			clitSetting: null,
 			clitSettingXY: null,
@@ -372,6 +372,17 @@ App.RA.newRule = function() {
 		};
 	}
 
+	/** @returns {App.RA.RuleReleaseSetters} */
+	function emptyRelease() {
+		return {
+			masturbation: null,
+			partner: null,
+			family: null,
+			slaves: null,
+			master: null
+		};
+	}
+
 	/** @returns {App.RA.RuleGrowthSetters} */
 	function emptyGrowth() {
 		return {
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index 222bd5dc661..515740cc651 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -1606,7 +1606,11 @@ window.rulesAssistantOptions = (function() {
 			this.appendChild(new LivingStandardList());
 			this.appendChild(new PunishmentList());
 			this.appendChild(new RewardList());
-			this.appendChild(new ReleaseList());
+			this.appendChild(new ReleaseMasturbationSwitch());
+			this.appendChild(new ReleasePartnerSwitch());
+			this.appendChild(new ReleaseFamilySwitch());
+			this.appendChild(new ReleaseSlavesSwitch());
+			this.appendChild(new ReleaseMasterSwitch());
 			this.appendChild(new ToyHoleList());
 			this.appendChild(new SmartFetishList());
 			this.appendChild(new SmartXYAttractionList());
@@ -2777,19 +2781,63 @@ window.rulesAssistantOptions = (function() {
 		}
 	}
 
-	// FIXME: update for new release rules (slave.rules.release)
-	class ReleaseList extends ListSelector {
+	class ReleaseMasturbationSwitch extends RadioSelector {
 		constructor() {
 			const pairs = [
-				["permissive"],
-				["sapphic"],
-				["masturbation"],
-				["restrictive"],
-				["chastity"]
+				["Allowed", 1],
+				["Forbidden", 0],
 			];
-			super("Release rules", pairs);
-			this.setValue(current_rule.set.releaseRules);
-			this.onchange = (value) => current_rule.set.releaseRules = value;
+			super("Masturbation", pairs);
+			this.setValue(current_rule.set.releaseRules.masturbation);
+			this.onchange = (value) => current_rule.set.releaseRules.masturbation = value;
+		}
+	}
+
+	class ReleasePartnerSwitch extends RadioSelector {
+		constructor() {
+			const pairs = [
+				["Allowed", 1],
+				["Forbidden", 0],
+			];
+			super("Sex with partner", pairs);
+			this.setValue(current_rule.set.releaseRules.partner);
+			this.onchange = (value) => current_rule.set.releaseRules.partner = value;
+		}
+	}
+
+	class ReleaseFamilySwitch extends RadioSelector {
+		constructor() {
+			const pairs = [
+				["Allowed", 1],
+				["Forbidden", 0],
+			];			
+			super("Sex with family", pairs);
+			this.setValue(current_rule.set.releaseRules.family);
+			this.onchange = (value) => current_rule.set.releaseRules.family = value;
+		}
+	}
+
+	class ReleaseSlavesSwitch extends RadioSelector {
+		constructor() {
+			const pairs = [
+				["Allowed", 1],
+				["Forbidden", 0],
+			];			
+			super("Sex with other slaves", pairs);
+			this.setValue(current_rule.set.releaseRules.slaves);
+			this.onchange = (value) => current_rule.set.releaseRules.slaves = value;
+		}
+	}
+
+	class ReleaseMasterSwitch extends RadioSelector {
+		constructor() {
+			const pairs = [
+				["Granted", 1],
+				["Denied", 0],
+			];			
+			super(`Routine sex with ${properMaster()}`, pairs);
+			this.setValue(current_rule.set.releaseRules.master);
+			this.onchange = (value) => current_rule.set.releaseRules.master = value;
 		}
 	}
 
-- 
GitLab