From 7292a9c91e21a0acf30adc6eb3c146fddefb0f17 Mon Sep 17 00:00:00 2001
From: Svornost <11434-svornost@users.noreply.gitgud.io>
Date: Thu, 29 Sep 2022 22:38:29 -0400
Subject: [PATCH] Simplify "chooses own job" system.  Remove two-pass system
 (and the "2" state for `slave.choosesOwnAssignment`) and global variable,
 consolidate job-printing logic, fix a few bugs, and improve error handling.

---
 js/003-data/gameVariableData.js               |  5 ---
 src/endWeek/reports/arcadeReport.js           | 10 +-----
 src/endWeek/reports/brothelReport.js          | 11 ++----
 src/endWeek/reports/cellblockReport.js        | 11 ++----
 src/endWeek/reports/clinicReport.js           | 11 ++----
 src/endWeek/reports/clubReport.js             | 11 ++----
 src/endWeek/reports/dairyReport.js            | 11 ++----
 src/endWeek/reports/farmyardReport.js         |  9 ++---
 src/endWeek/reports/masterSuiteReport.js      | 12 +++----
 src/endWeek/reports/nurseryReport.js          | 10 ++----
 src/endWeek/reports/penthouseReport.js        |  9 +++--
 src/endWeek/reports/schoolroomReport.js       | 19 ++++------
 src/endWeek/reports/servantsQuartersReport.js | 10 ++----
 src/endWeek/reports/spaReport.js              | 11 ++----
 src/endWeek/saChoosesOwnJob.js                | 35 +++++++++----------
 src/endWeek/saSharedVariables.js              |  7 +++-
 src/endWeek/slaveAssignmentReport.js          |  2 +-
 src/endWeek/standardSlaveReport.js            | 16 +++++++++
 18 files changed, 73 insertions(+), 137 deletions(-)

diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index bb5a6e949ce..1874d1b207d 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -1356,11 +1356,6 @@ App.Data.resetOnNGPlus = {
 		slave: 0
 	},
 	tempEventToggle: 0,
-	/**
-	 * Assignments texts for slaves who choose their own assignment, set at during the first pass in App.SlaveAssignment.choosesOwnJob()
-	 * @type {Object.<number, string>}
-	 */
-	choosesOwnAssignmentText: {},
 	favorites: [],
 	/**
 	 * Any loans the player has taken out.
diff --git a/src/endWeek/reports/arcadeReport.js b/src/endWeek/reports/arcadeReport.js
index 28d89c48b80..ac525bb6afb 100644
--- a/src/endWeek/reports/arcadeReport.js
+++ b/src/endWeek/reports/arcadeReport.js
@@ -87,14 +87,7 @@ App.EndWeek.arcadeReport = function() {
 			const {He} = getPronouns(slave);
 			const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-
-			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-			if (slave.choosesOwnAssignment) {
-				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-			} else {
-				slaveEntry.append(`is confined in ${V.arcadeName}.`);
-			}
-			App.Events.addNode(slaveEntry, r);
+			slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is confined in ${V.arcadeName}.`));
 
 			App.Events.addNode(
 				slaveEntry,
@@ -108,7 +101,6 @@ App.EndWeek.arcadeReport = function() {
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			// discard return values silently
-			App.SlaveAssignment.choosesOwnJob(slave);
 			App.SlaveAssignment.workAGloryHole(slave);
 		}
 		profits += V.cash - oldCash;
diff --git a/src/endWeek/reports/brothelReport.js b/src/endWeek/reports/brothelReport.js
index 91f1928c02f..f35c44f0632 100644
--- a/src/endWeek/reports/brothelReport.js
+++ b/src/endWeek/reports/brothelReport.js
@@ -269,7 +269,7 @@ App.EndWeek.brothelReport = function() {
 		if (V.showEWD) {
 			const madamEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", madamEntry);
-			madamEntry.append(App.SlaveAssignment.saSlaveName(madam), `is serving as the Madam.`);
+			madamEntry.append(App.SlaveAssignment.saSlaveIntro(madam, `is serving as the Madam.`));
 			madamEntry.append(App.SlaveAssignment.standardSlaveReport(madam, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, madam);
 		} else {
@@ -328,13 +328,7 @@ App.EndWeek.brothelReport = function() {
 				const {He} = getPronouns(slave);
 				const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 				const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-				slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-
-				if (slave.choosesOwnAssignment) {
-					$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-				} else {
-					slaveEntry.append(`is working out of ${V.brothelName}.`);
-				}
+				slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is working out of ${V.brothelName}.`));
 
 				App.Events.addNode(
 					slaveEntry,
@@ -349,7 +343,6 @@ App.EndWeek.brothelReport = function() {
 				App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 			} else {
 				// discard return values silently
-				App.SlaveAssignment.choosesOwnJob(slave);
 				App.SlaveAssignment.whore(slave);
 				App.SlaveAssignment.standardSlaveReport(slave, true);
 			}
diff --git a/src/endWeek/reports/cellblockReport.js b/src/endWeek/reports/cellblockReport.js
index 802e2e182c0..131fad1448a 100644
--- a/src/endWeek/reports/cellblockReport.js
+++ b/src/endWeek/reports/cellblockReport.js
@@ -182,7 +182,7 @@ App.EndWeek.cellblockReport = function() {
 		if (V.showEWD !== 0) {
 			const wardenessEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report");
 			const artSpan = App.UI.DOM.appendNewElement("span", wardenessEntry);
-			wardenessEntry.append(App.SlaveAssignment.saSlaveName(slave), `is serving as the Wardeness in ${V.cellblockName}.`);
+			wardenessEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is serving as the Wardeness in ${V.cellblockName}.`));
 			wardenessEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
@@ -295,13 +295,7 @@ App.EndWeek.cellblockReport = function() {
 		if (V.showEWD) {
 			const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-
-			if (slave.choosesOwnAssignment) {
-				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-			} else {
-				slaveEntry.append(`is confined in ${V.cellblockName}.`);
-			}
+			slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is confined in ${V.cellblockName}.`));
 
 			confinedResults = App.SlaveAssignment.stayConfined(slave);
 			App.Events.addNode(slaveEntry, [He, confinedResults.text], "div", "indent");
@@ -313,7 +307,6 @@ App.EndWeek.cellblockReport = function() {
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			// discard return values silently
-			App.SlaveAssignment.choosesOwnJob(slave);
 			confinedResults = App.SlaveAssignment.stayConfined(slave);
 			if (confinedResults.broken) {
 				brokenSlaves++;
diff --git a/src/endWeek/reports/clinicReport.js b/src/endWeek/reports/clinicReport.js
index e6b9f9a1d60..884d2836e15 100644
--- a/src/endWeek/reports/clinicReport.js
+++ b/src/endWeek/reports/clinicReport.js
@@ -258,7 +258,7 @@ App.EndWeek.clinicReport = function() {
 		if (V.showEWD !== 0) {
 			const nurseEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", nurseEntry);
-			nurseEntry.append(App.SlaveAssignment.saSlaveName(S.Nurse), `is serving as the clinical nurse.`);
+			nurseEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is serving as the clinical nurse.`));
 			nurseEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
@@ -405,13 +405,7 @@ App.EndWeek.clinicReport = function() {
 		if (V.showEWD !== 0) {
 			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-
-			if (slave.choosesOwnAssignment) {
-				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-			} else {
-				slaveEntry.append(`is receiving treatment in ${V.clinicName}.`);
-			}
+			slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is receiving treatment in ${V.clinicName}.`));
 
 			let r = [];
 			r.push(He, App.SlaveAssignment.rest(slave));
@@ -423,7 +417,6 @@ App.EndWeek.clinicReport = function() {
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			// discard return values silently
-			App.SlaveAssignment.choosesOwnJob(slave);
 			App.SlaveAssignment.rest(slave);
 			App.SlaveAssignment.standardSlaveReport(slave, true);
 		}
diff --git a/src/endWeek/reports/clubReport.js b/src/endWeek/reports/clubReport.js
index ed32c689c12..c491aa5b064 100644
--- a/src/endWeek/reports/clubReport.js
+++ b/src/endWeek/reports/clubReport.js
@@ -147,7 +147,7 @@ App.EndWeek.clubReport = function() {
 		if (V.showEWD !== 0) {
 			const DJEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", DJEntry);
-			DJEntry.append(App.SlaveAssignment.saSlaveName(dj), `is performing as the DJ in ${V.clubName}.`);
+			DJEntry.append(App.SlaveAssignment.saSlaveIntro(dj, `is performing as the DJ in ${V.clubName}.`));
 			DJEntry.append(App.SlaveAssignment.standardSlaveReport(dj, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, dj);
 		} else {
@@ -187,13 +187,7 @@ App.EndWeek.clubReport = function() {
 			if (V.showEWD) {
 				const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 				const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-				slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-
-				if (slave.choosesOwnAssignment) {
-					$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-				} else {
-					slaveEntry.append(`is serving in ${V.clubName}.`);
-				}
+				slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is serving in ${V.clubName}.`));
 
 				const {He} = getPronouns(slave);
 				App.Events.addNode(
@@ -209,7 +203,6 @@ App.EndWeek.clubReport = function() {
 				App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 			} else {
 				// discard return values silently
-				App.SlaveAssignment.choosesOwnJob(slave);
 				App.SlaveAssignment.serveThePublic(slave);
 				App.SlaveAssignment.standardSlaveReport(slave, true);
 			}
diff --git a/src/endWeek/reports/dairyReport.js b/src/endWeek/reports/dairyReport.js
index 8ae82f326f4..58793f04762 100644
--- a/src/endWeek/reports/dairyReport.js
+++ b/src/endWeek/reports/dairyReport.js
@@ -355,7 +355,7 @@ App.EndWeek.dairyReport = function() {
 		if (V.showEWD !== 0) {
 			const milkMaidEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", milkMaidEntry);
-			milkMaidEntry.append(App.SlaveAssignment.saSlaveName(slave), `is serving as your Milkmaid.`);
+			milkMaidEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is serving as your Milkmaid.`));
 			milkMaidEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
@@ -455,13 +455,7 @@ App.EndWeek.dairyReport = function() {
 		if (V.showEWD !== 0) {
 			const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-
-			if (slave.choosesOwnAssignment) {
-				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-			} else {
-				slaveEntry.append(`is serving as a cow in ${V.dairyName}.`);
-			}
+			slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is serving as a cow in ${V.dairyName}.`));
 
 			const {He} = getPronouns(slave);
 			App.Events.addNode(
@@ -477,7 +471,6 @@ App.EndWeek.dairyReport = function() {
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			// discard return values silently
-			App.SlaveAssignment.choosesOwnJob(slave);
 			App.SlaveAssignment.standardSlaveReport(slave, true);
 		}
 
diff --git a/src/endWeek/reports/farmyardReport.js b/src/endWeek/reports/farmyardReport.js
index b53c30f4cc2..6ea06f82aa0 100644
--- a/src/endWeek/reports/farmyardReport.js
+++ b/src/endWeek/reports/farmyardReport.js
@@ -29,7 +29,7 @@ App.EndWeek.farmyardReport = function farmyardReport() {
 		if (V.showEWD) {
 			const farmerEntry = App.UI.DOM.appendNewElement("div", frag, null, ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", farmerEntry);
-			App.Events.addNode(farmerEntry, [App.SlaveAssignment.saSlaveName(Farmer), `is serving as the Farmer.`, farmerText()]);
+			App.Events.addNode(farmerEntry, [App.SlaveAssignment.saSlaveIntro(Farmer, `is serving as the Farmer.`), farmerText()]);
 			farmerEntry.append(App.SlaveAssignment.standardSlaveReport(Farmer));
 			App.SlaveAssignment.appendSlaveArt(artSpan, Farmer);
 		} else {
@@ -52,12 +52,7 @@ App.EndWeek.farmyardReport = function farmyardReport() {
 			if (V.showEWD) {
 				const slaveEntry = App.UI.DOM.appendNewElement("div", frag, null, ["slave-report"]);
 				const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-				slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-				if (slave.choosesOwnAssignment) {
-					$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-				} else {
-					slaveEntry.append(`is working out of ${V.farmyardName}.`);
-				}
+				slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is working out of ${V.farmyardName}.`));
 
 				farmhandLivingRules(slave);
 				farmhandHealth(slave);
diff --git a/src/endWeek/reports/masterSuiteReport.js b/src/endWeek/reports/masterSuiteReport.js
index bae08cbd9c5..ee505e1731f 100644
--- a/src/endWeek/reports/masterSuiteReport.js
+++ b/src/endWeek/reports/masterSuiteReport.js
@@ -10,7 +10,8 @@ App.EndWeek.masterSuiteReport = function() {
 		const frag = new DocumentFragment();
 		let r = [];
 		const {He, he, his, him, himself} = getPronouns(S.Concubine);		
-		r.push(App.SlaveAssignment.saSlaveName(S.Concubine), `is serving as your concubine in ${V.masterSuiteName}. More than any other slave, ${his} sexual brilliance and physical appeal are <span class="green">critical</span> to your reputation.`);
+		r.push(App.SlaveAssignment.saSlaveIntro(S.Concubine, `is serving as your concubine in ${V.masterSuiteName}.`));
+		r.push(`More than any other slave, ${his} sexual brilliance and physical appeal are <span class="green">critical</span> to your reputation.`);
 
 		if (S.Concubine.prestigeDesc === "You bankrupted and enslaved $him in revenge for $his part in the attack on your arcology by the Daughters of Liberty." && S.Concubine.newGamePlus === 0) {
 			r.push(`${He} was once your rival, and your relationship is widely thought to be <span class="green">the perfect modern romance.</span>`);
@@ -100,12 +101,8 @@ App.EndWeek.masterSuiteReport = function() {
 	 */
 	function nonConcubineText(slave) {
 		const frag = new DocumentFragment();
-		frag.append(App.SlaveAssignment.saSlaveName(slave));
-		if (slave.choosesOwnAssignment) {
-			$(frag).append(App.SlaveAssignment.choosesOwnJob(slave));
-		} else {
-			frag.append(`sees to your pleasure in ${V.masterSuiteName}.`);
-		}
+		frag.append(App.SlaveAssignment.saSlaveIntro(slave, `sees to your pleasure in ${V.masterSuiteName}.`));
+
 		/* Perform facility based rule changes - FIXME - dev/trust living condition changes probably should be in saRules; there's no text reporting these changes here */
 		if (V.masterSuiteUpgradeLuxury === 1) {
 			slave.rules.living = "luxurious";
@@ -348,7 +345,6 @@ App.EndWeek.masterSuiteReport = function() {
 			], "div", ["indent"]);
 		} else {
 			// discard return values silently
-			App.SlaveAssignment.choosesOwnJob(slave);
 			App.SlaveAssignment.pleaseYou(slave);
 			if (V.servantMilkers === 1 && slave.lactation > 0 && slave.fuckdoll === 0 && slave.fetish !== "mindbroken" && canMove(slave) && slave.intelligence + slave.intelligenceImplant >= -90) {
 				App.SlaveAssignment.getMilked(slave, 0.25);
diff --git a/src/endWeek/reports/nurseryReport.js b/src/endWeek/reports/nurseryReport.js
index 1fdbb61619d..0b7690e487f 100644
--- a/src/endWeek/reports/nurseryReport.js
+++ b/src/endWeek/reports/nurseryReport.js
@@ -138,7 +138,7 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() {
 		if (V.showEWD) {
 			const matronEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", matronEntry);
-			App.Events.addNode(matronEntry, [App.SlaveAssignment.saSlaveName(slave), `is serving as the Madam.`, matronText()]);
+			App.Events.addNode(matronEntry, [App.SlaveAssignment.saSlaveIntro(slave, `is serving as your Matron.`), matronText()]);
 			matronEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
@@ -194,13 +194,7 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() {
 			const {He} = getPronouns(slave);
 			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-
-			if (slave.choosesOwnAssignment) {
-				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-			} else {
-				slaveEntry.append(`is working out of ${V.nurseryName}.`);
-			}
+			slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is working out of ${V.nurseryName}.`));
 
 			App.Events.addNode(slaveEntry, [He, App.SlaveAssignment.nanny(slave)], "div", ["indent"]);
 			slaveEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js
index 4a0fcd51b86..7cc99c17e45 100644
--- a/src/endWeek/reports/penthouseReport.js
+++ b/src/endWeek/reports/penthouseReport.js
@@ -32,9 +32,9 @@ App.EndWeek.penthouseReport = function() {
 			if (penthouseArtRenderer) {
 				App.UI.DOM.drawOneSlaveRight(hgSlaveEntry, hgSlave, penthouseArtRenderer);
 			}
-			r.push(App.SlaveAssignment.saSlaveName(hgSlave));
+			r.push(App.SlaveAssignment.saSlaveIntro(hgSlave, ''));
 			if (hgSlave.choosesOwnAssignment) {
-				r.push(App.SlaveAssignment.choosesOwnJob(hgSlave), ` ${He2}`);
+				r.push(He2); // starts new sentence
 			}
 			r.push(App.SlaveAssignment.liveWithHG(hgSlave));
 
@@ -62,10 +62,9 @@ App.EndWeek.penthouseReport = function() {
 		let r = [];
 		let milkResults;
 		
-		r.push(App.SlaveAssignment.saSlaveName(slave));
+		r.push(App.SlaveAssignment.saSlaveIntro(slave, ''));
 		if (slave.choosesOwnAssignment) {
-			r.push(App.SlaveAssignment.choosesOwnJob(slave));
-			r.push(He);
+			r.push(He); // starts new sentence
 		}
 
 		switch (slave.assignment) {
diff --git a/src/endWeek/reports/schoolroomReport.js b/src/endWeek/reports/schoolroomReport.js
index 8f1ea58b847..6ec84de5bba 100644
--- a/src/endWeek/reports/schoolroomReport.js
+++ b/src/endWeek/reports/schoolroomReport.js
@@ -155,7 +155,7 @@ App.EndWeek.schoolroomReport = function() {
 		if (V.showEWD !== 0) {
 			const schoolteacherEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
 			const artSpan = App.UI.DOM.appendNewElement("span", schoolteacherEntry);
-			schoolteacherEntry.append(App.SlaveAssignment.saSlaveName(slave), `is serving as your Schoolteacher.`);
+			schoolteacherEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is serving as your Schoolteacher.`));
 			App.Events.addNode(schoolteacherEntry, [schoolteacherText()], "div", ["indent"]);
 			schoolteacherEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
@@ -235,26 +235,19 @@ App.EndWeek.schoolroomReport = function() {
 			const {He} = getPronouns(slave);
 			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-
-			if (slave.choosesOwnAssignment) {
-				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-			} else {
-				let leaderTraining = '';
-				for (const role of Object.keys(V.slaveTutor)) {
-					if (V.slaveTutor[role].includes(slave.ID)) {
-						leaderTraining = ` on being a ${role}`; break;
-					}
+			let leaderTraining = '';
+			for (const role of Object.keys(V.slaveTutor)) {
+				if (V.slaveTutor[role].includes(slave.ID)) {
+					leaderTraining = ` on being a ${role}`; break;
 				}
-				slaveEntry.append(`is studying in ${V.schoolroomName}${leaderTraining}.`);
 			}
+			slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is studying in ${V.schoolroomName}${leaderTraining}.`));
 
 			App.Events.addNode(slaveEntry, [He, App.SlaveAssignment.takeClasses(slave)], "div", ["indent"]);
 			slaveEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			// discard return values silently
-			App.SlaveAssignment.choosesOwnJob(slave);
 			App.SlaveAssignment.takeClasses(slave);
 			App.SlaveAssignment.standardSlaveReport(slave, true);
 		}
diff --git a/src/endWeek/reports/servantsQuartersReport.js b/src/endWeek/reports/servantsQuartersReport.js
index 5c5730bf077..44bf43b1e08 100644
--- a/src/endWeek/reports/servantsQuartersReport.js
+++ b/src/endWeek/reports/servantsQuartersReport.js
@@ -243,7 +243,7 @@ App.EndWeek.servantsQuartersReport = function() {
 		if (V.showEWD) {
 			const stewardessEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
 			const artSpan = App.UI.DOM.appendNewElement("span", stewardessEntry);
-			stewardessEntry.append(App.SlaveAssignment.saSlaveName(slave), `is serving as your Stewardess.`);
+			stewardessEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is serving as your Stewardess.`));
 			App.Events.addNode(stewardessEntry, [stewardessText()], "div", ["indent"])
 			stewardessEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
@@ -317,12 +317,7 @@ App.EndWeek.servantsQuartersReport = function() {
 			const {He} = getPronouns(slave);
 			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-			if (slave.choosesOwnAssignment) {
-				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-			} else {
-				slaveEntry.append(`is working out of ${V.servantsQuartersName}.`);
-			}
+			slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is working out of ${V.servantsQuartersName}.`));
 			App.Events.addNode(slaveEntry, [He, App.SlaveAssignment.servant(slave, stewardessBonus)], "div", ["indent"]);
 			if (V.servantMilkers === 1 && slave.lactation > 0) {
 				const milkResults = App.SlaveAssignment.getMilked(slave, 0.5);
@@ -334,7 +329,6 @@ App.EndWeek.servantsQuartersReport = function() {
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			// discard return values silently
-			App.SlaveAssignment.choosesOwnJob(slave);
 			App.SlaveAssignment.servant(slave, stewardessBonus);
 			if (V.servantMilkers === 1 && slave.lactation > 0) {
 				const milkResults = App.SlaveAssignment.getMilked(slave, 0.5);
diff --git a/src/endWeek/reports/spaReport.js b/src/endWeek/reports/spaReport.js
index 7bf56b54094..57c54fe61e1 100644
--- a/src/endWeek/reports/spaReport.js
+++ b/src/endWeek/reports/spaReport.js
@@ -293,7 +293,7 @@ App.EndWeek.spaReport = function() {
 		if (V.showEWD !== 0) {
 			const attendantEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report");
 			const artSpan = App.UI.DOM.appendNewElement("span", attendantEntry);
-			attendantEntry.append(App.SlaveAssignment.saSlaveName(slave), `is serving as the Attendant in ${V.spaName}.`);
+			attendantEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is serving as the Attendant in ${V.spaName}.`));
 			attendantEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
@@ -372,13 +372,7 @@ App.EndWeek.spaReport = function() {
 		if (V.showEWD !== 0) {
 			const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
-
-			if (slave.choosesOwnAssignment) {
-				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-			} else {
-				slaveEntry.append(`is resting in ${V.spaName}.`);
-			}
+			slaveEntry.append(App.SlaveAssignment.saSlaveIntro(slave, `is resting in ${V.spaName}.`));
 
 			r = [];
 			r.push(He);
@@ -400,7 +394,6 @@ App.EndWeek.spaReport = function() {
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			// discard return values silently
-			App.SlaveAssignment.choosesOwnJob(slave);
 			App.SlaveAssignment.standardSlaveReport(slave, true);
 		}
 	}
diff --git a/src/endWeek/saChoosesOwnJob.js b/src/endWeek/saChoosesOwnJob.js
index 4f8c9677f8f..48d99989e35 100644
--- a/src/endWeek/saChoosesOwnJob.js
+++ b/src/endWeek/saChoosesOwnJob.js
@@ -1,4 +1,6 @@
 /**
+ * This function is the old "first pass", which actually picks the job.
+ * The slaves' reasoning is saved in saVars for later use.
  * @param {App.Entity.SlaveState} slave
  * @returns {string}
  */
@@ -21,27 +23,25 @@ App.SlaveAssignment.choosesOwnJob = function saChoosesOwnJob(slave) {
 		He, he, him, his, himself, girl,
 	} = getPronouns(slave);
 
-	/*
-	"I suspect something might be awry with that too" - Pregmodder - 2021-09-26
-	*/
-	if (slave.choosesOwnAssignment === 0 || slave.fuckdoll > 0 || slave.fetish === Fetish.MINDBROKEN) {
-		// nothing to do
-	} else if (slave.choosesOwnAssignment === 2) {
-		// second pass happens visibly during weekly report for the location where this slave decided to go (or stay)
-		// display text but don't change assignment (already done)
-		r.push(V.choosesOwnAssignmentText[slave.ID]);
-		delete V.choosesOwnAssignmentText[slave.ID];
-		slave.choosesOwnAssignment = 1;
-		// continue cycle for next week
+	if (slave.fuckdoll > 0 || slave.fetish === Fetish.MINDBROKEN) {
+		// deal with slaves who are incapable of actually choosing their own assignment
+		r.push(`was assigned to ${slave.assignment}. ${He}'s allowed to choose ${his} own job, but is <span style="warning">mentally incapable</span> of doing so,`);
+		if (slave.assignment === Job.CHOICE) {
+			r.push(`and <span class="job change">rests for the week</span> instead.`);
+			removeJob(slave, slave.assignment);
+		} else {
+			r.push(`and just keeps doing the same thing this week.`);
+		}
+		slave.choosesOwnAssignment = 0;
+		App.EndWeek.saVars.choosesOwnAssignmentText[slave.ID] = r.join(' ');
 	} else {
-		// first pass happens silently before all reports: give stats bonus, construct decision string for display during second pass, actually change assignment
+		// give stats bonus, construct decision string for display during slave report, and actually change the assignment
 		slave.devotion++;
 		slave.trust++;
-		V.choosesOwnAssignmentText[slave.ID] = jobSelection(slave);
+		App.EndWeek.saVars.choosesOwnAssignmentText[slave.ID] = jobSelection(slave);
 	}
 
-	return r.join(" ");
-
+	return;
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
@@ -554,8 +554,7 @@ App.SlaveAssignment.choosesOwnJob = function saChoosesOwnJob(slave) {
 			}
 		}
 
-		slave.choosesOwnAssignment = 2;
-		// ready for second pass
+		slave.choosesOwnAssignment = 1; // removeJob may have cleared this, but we want it to stay
 
 		return choice.join(" ");
 	}
diff --git a/src/endWeek/saSharedVariables.js b/src/endWeek/saSharedVariables.js
index 3b7255854e8..c44ea157ee4 100644
--- a/src/endWeek/saSharedVariables.js
+++ b/src/endWeek/saSharedVariables.js
@@ -38,7 +38,12 @@ App.EndWeek.SASharedVariables = class {
 		 *  @type {Set<number>}
 		 *  @see App.EndWeek.getFLSex
 		 */
-		this.flSex = new Set();
+		this.flSex = new Set();	
+		/**
+		 * Assignments texts for slaves who choose their own assignment, set in App.SlaveAssignment.choosesOwnJob()
+		 * @type {Object.<number, string>}
+		 */
+		this.choosesOwnAssignmentText = {};
 	}
 
 	/** Compute shared subslave ratio (subslaves per ordinary slave) */
diff --git a/src/endWeek/slaveAssignmentReport.js b/src/endWeek/slaveAssignmentReport.js
index 501ff08f446..22c821c75c6 100644
--- a/src/endWeek/slaveAssignmentReport.js
+++ b/src/endWeek/slaveAssignmentReport.js
@@ -38,7 +38,7 @@ App.EndWeek.slaveAssignmentReport = function() {
 		// fire unqualified special slaves
 		_ensureEmployeeMeetsJobRequirements(slave);
 
-		// first pass on choosesOwnJob is silent
+		// allow slaves to choose their jobs for later output
 		if (slave.choosesOwnAssignment === 1) {
 			App.SlaveAssignment.choosesOwnJob(slave);
 		}
diff --git a/src/endWeek/standardSlaveReport.js b/src/endWeek/standardSlaveReport.js
index 370f6dd48a7..11250a4184d 100644
--- a/src/endWeek/standardSlaveReport.js
+++ b/src/endWeek/standardSlaveReport.js
@@ -61,3 +61,19 @@ App.SlaveAssignment.saSlaveName = function(slave) {
 	);
 	return frag;
 };
+
+/**
+ * Render linkified slave name with job assignment statement.
+ * @param {App.Entity.SlaveState} slave
+ * @param {string} def - this statement will be used if the slave ISN'T choosing her own job.  Generally, something like "is <verb>ing in <facility>."  Note that penthouse jobs do not have a default job statement, instead leading directly into the job text if the slave is not choosing her own job.
+ */
+App.SlaveAssignment.saSlaveIntro = function(slave, def) {
+	const frag = this.saSlaveName(slave);
+	const choice = App.EndWeek.saVars.choosesOwnAssignmentText[slave.ID];
+	if (slave.choosesOwnAssignment && choice) {
+		$(frag).append(choice);
+	} else {
+		$(frag).append(def);
+	}
+	return frag;
+}
-- 
GitLab