From f3236d1f0107b3795a0a08fcb2f21006d3ac32a3 Mon Sep 17 00:00:00 2001
From: Svornost <11434-svornost@users.noreply.gitgud.io>
Date: Wed, 29 Apr 2020 19:35:59 -0700
Subject: [PATCH] Remove Assign and Retreive transition passages in favor of
 javascript.  Remove $assignTo global variable.  Make assignment, transfer,
 and retrieval mechanisms operate on ID rather than slave index.

---
 src/004-base/facility.js                      | 63 +++++++--------
 .../penthouse/penthouseFramework.js           | 12 +--
 src/facilities/pit/pitFramework.js            |  2 +-
 src/interaction/slaveInteract.js              |  2 +-
 src/js/assignJS.js                            | 78 ++++++++++++++-----
 src/js/slaveListing.js                        | 12 ++-
 src/js/utilsFC.js                             |  9 ---
 src/npc/interaction/passage/matchmaking.tw    |  2 +-
 src/uncategorized/assign.tw                   | 32 --------
 src/uncategorized/coursingAssociation.tw      |  5 +-
 src/uncategorized/retrieve.tw                 | 12 ---
 src/uncategorized/slaveInteract.tw            |  2 +-
 12 files changed, 106 insertions(+), 125 deletions(-)
 delete mode 100644 src/uncategorized/assign.tw
 delete mode 100644 src/uncategorized/retrieve.tw

diff --git a/src/004-base/facility.js b/src/004-base/facility.js
index 465475f9839..e7ee3b917e0 100644
--- a/src/004-base/facility.js
+++ b/src/004-base/facility.js
@@ -123,29 +123,29 @@ App.Entity.Facilities.Job = class {
 
 	/**
 	 * Returns link text for the penthouse assignment
-	 * @param {number} i slave index
+	 * @param {number} ID slave ID
 	 * @param {string} [passage] passage to go to
 	 * @param {linkCallback} [callback]
 	 * @param {string} [linkText]
 	 * @returns {string}
 	 */
-	assignmentLink(i, passage, callback, linkText) {
+	assignmentLink(ID, passage, callback, linkText) {
 		linkText = linkText || this.desc.position;
 		const linkAction = callback !== undefined ? callback(this.desc.assignment) : '';
-		return `<<link "${linkText}"${passage !== undefined ? ' "' + passage + '"' : ''}>><<= assignJob(${App.Utils.slaveRefString(i)}, "${this.desc.assignment}")>>${linkAction}<</link>>`;
+		return `<<link "${linkText}"${passage !== undefined ? ' "' + passage + '"' : ''}>><<= assignJob(slaveStateById(${ID}), "${this.desc.assignment}")>>${linkAction}<</link>>`;
 	}
 
 	/**
 	 * Returns link text for the penthouse assignment
-	 * @param {number} i slave index
+	 * @param {number} ID slave ID
 	 * @param {string} [passage] passage to go to
 	 * @param {assignmentCallback} [callback]
 	 * @param {string} [linkText]
 	 * @returns {HTMLAnchorElement}
 	 */
-	assignmentLinkElement(i, passage, callback, linkText) {
+	assignmentLinkElement(ID, passage, callback, linkText) {
 		linkText = linkText || this.desc.position;
-		return App.UI.DOM.assignmentLink(State.variables.slaves[i], this.desc.assignment, passage, callback, linkText);
+		return App.UI.DOM.assignmentLink(slaveStateById(ID), this.desc.assignment, passage, callback, linkText);
 	}
 
 	/**
@@ -408,15 +408,15 @@ App.Entity.Facilities.Facility = class {
 
 	/**
 	 * Returns link text for the job assignments
-	 * @param {number} i slave index
+	 * @param {number} ID slave ID
 	 * @param {string} [job] generate link only for this job
 	 * @param {string} [passage]
 	 * @param {linkCallback} callback
 	 * @returns {string[]}
 	 */
-	assignmentLinks(i, job, passage, callback) {
+	assignmentLinks(ID, job, passage, callback) {
 		/** @type {App.Entity.SlaveState} */
-		const slave = App.Utils.slaveByIndex(i);
+		const slave = slaveStateById(ID);
 		const jobs = job === undefined ? this._jobs : {job: this._jobs[job]};
 
 		let res = [];
@@ -424,7 +424,7 @@ App.Entity.Facilities.Facility = class {
 			const j = jobs[jn];
 			let rejects = j.canEmploy(slave);
 			if (rejects.length === 0) {
-				res.push(j.assignmentLink(i, passage, callback));
+				res.push(j.assignmentLink(ID, passage, callback));
 			} else {
 				res.push(App.UI.disabledLink(j.desc.position, rejects));
 			}
@@ -434,15 +434,15 @@ App.Entity.Facilities.Facility = class {
 
 	/**
 	 * Returns link text for the job assignments
-	 * @param {number} i slave index
+	 * @param {number} ID slave ID
 	 * @param {string} [job] generate link only for this job
 	 * @param {string} [passage]
 	 * @param {assignmentCallback} callback
 	 * @returns {HTMLElement[]}
 	 */
-	assignmentLinkElements(i, job, passage, callback) {
+	assignmentLinkElements(ID, job, passage, callback) {
 		/** @type {App.Entity.SlaveState} */
-		const slave = App.Utils.slaveByIndex(i);
+		const slave = slaveStateById(ID);
 		const jobs = job === undefined ? this._jobs : {job: this._jobs[job]};
 
 		let res = [];
@@ -450,7 +450,7 @@ App.Entity.Facilities.Facility = class {
 			const j = jobs[jn];
 			let rejects = j.canEmploy(slave);
 			if (rejects.length === 0) {
-				res.push(j.assignmentLinkElement(i, passage, callback));
+				res.push(j.assignmentLinkElement(ID, passage, callback));
 			} else {
 				res.push(App.UI.DOM.disabledLink(j.desc.position, rejects));
 			}
@@ -460,28 +460,28 @@ App.Entity.Facilities.Facility = class {
 
 	/**
 	 * Returns link text for the facility transfer
-	 * @param {number} i slave index
+	 * @param {number} ID slave ID
 	 * @param {string} [job] transfer to this job (uses default job if this is undefined)
 	 * @param {string} [passage]
 	 * @param {linkCallback} [callback]
 	 * @returns {string}
 	 */
-	transferLink(i, job, passage, callback) {
+	transferLink(ID, job, passage, callback) {
 		job = job || this.desc.defaultJob;
-		return this._jobs[job].assignmentLink(i, passage, callback, this.genericName);
+		return this._jobs[job].assignmentLink(ID, passage, callback, this.genericName);
 	}
 
 	/**
 	 * Returns link text for the facility transfer
-	 * @param {number} i slave index
+	 * @param {number} ID slave ID
 	 * @param {string} [job] transfer to this job (uses default job if this is undefined)
 	 * @param {string} [passage]
-	 * @param {linkCallback} [callback]
+	 * @param {assignmentCallback} [callback]
 	 * @returns {HTMLElement}
 	 */
-	transferLinkElement(i, job, passage, callback) {
+	transferLinkElement(ID, job, passage, callback) {
 		job = job || this.desc.defaultJob;
-		return this._jobs[job].assignmentLinkElement(i, passage, callback, this.genericName);
+		return this._jobs[job].assignmentLinkElement(ID, passage, callback, this.genericName);
 	}
 
 	/**
@@ -533,38 +533,33 @@ App.Entity.Facilities.Facility = class {
 App.Entity.Facilities.FacilitySingleJob = class extends App.Entity.Facilities.Job {
 	/**
 	 * Returns link text for the penthouse assignment
-	 * @param {number} i slave index
-	 * @param {string} [passage] passage to go to
+	 * @param {number} ID slave ID
+	 * @param {string} [targetPassage] passage to go to
 	 * @param {linkCallback} [callback]
 	 * @param {string} [linkText]
 	 * @returns {string}
 	 */
-	assignmentLink(i, passage, callback, linkText) {
+	assignmentLink(ID, targetPassage, callback, linkText) {
 		linkText = linkText || this.facility.genericName;
 		const linkAction = callback !== undefined ? callback(this.desc.assignment) : '';
-		const psg = passage === undefined ? '' : `, $returnTo = "${passage}"`;
-		return `<<link "${linkText}" "Assign">><<set $assignTo = "${this.facility.genericName}", $i = ${i}${psg}>>${linkAction}<</link>>`;
+		return `<<link "${linkText}">>${linkAction}<<run assignmentTransition(slaveStateById(${ID}), "${this.facility.genericName}", "${targetPassage || passage()}")>><</link>>`;
 	}
 
 	/**
-	 * @param {number} i slave index
+	 * @param {number} ID slave ID
 	 * @param {string} [targetPassage] passage to go to
 	 * @param {assignmentCallback} [callback]
 	 * @param {string} [linkText]
 	 * @returns {HTMLAnchorElement}
 	 */
-	assignmentLinkElement(i, targetPassage, callback, linkText) {
+	assignmentLinkElement(ID, targetPassage, callback, linkText) {
 		linkText = linkText || this.desc.position;
-		return App.UI.DOM.assignmentLink(State.variables.slaves[i], this.desc.assignment, "Assign",
+		return App.UI.DOM.assignmentLink(slaveStateById(ID), this.desc.assignment, "",
 			(slave, assignment) => {
 				if (callback) {
 					callback(slave, assignment);
 				}
-				// Set up environment for the "Assign" passage
-				V.i = V.slaveIndices[slave.ID];
-				V.activeSlave = slave;
-				V.assignTo = this.facility.genericName;
-				V.returnTo = targetPassage ? targetPassage : passage();
+				assignmentTransition(slave, assignment, targetPassage || passage());
 			}, linkText);
 	}
 
diff --git a/src/facilities/penthouse/penthouseFramework.js b/src/facilities/penthouse/penthouseFramework.js
index f53f20fd1d3..821d06e5410 100644
--- a/src/facilities/penthouse/penthouseFramework.js
+++ b/src/facilities/penthouse/penthouseFramework.js
@@ -160,21 +160,21 @@ App.Entity.Facilities.PenthouseJobs = {
 			return r;
 		}
 
-		assignmentLink(i, passage, callback, linkText) {
-			return super.assignmentLink(i, "Subordinate Targeting",
+		assignmentLink(ID, passage, callback, linkText) {
+			return super.assignmentLink(ID, "Subordinate Targeting",
 				(assignment) => {
-					return `<<run App.Utils.setActiveSlaveByIndex(${i})>>` + (callback !== undefined ? callback(assignment) : '');
+					return `<<set $activeSlave = slaveStateById(${ID})>>` + (callback !== undefined ? callback(assignment) : '');
 				}, linkText);
 		}
 
-		assignmentLinkElement(i, passage, callback, linkText) {
+		assignmentLinkElement(ID, passage, callback, linkText) {
 			linkText = linkText || this.desc.position;
-			return App.UI.DOM.assignmentLink(V.slaves[i], this.desc.assignment, "Subordinate Targeting",
+			return App.UI.DOM.assignmentLink(slaveStateById(ID), this.desc.assignment, "Subordinate Targeting",
 				(slave, assignment) => {
 					if (callback) {
 						callback(slave, assignment);
 					}
-					App.Utils.setActiveSlaveByIndex(i);
+					V.activeSlave = slave;
 					V.returnTo = passage;
 				}, linkText);
 		}
diff --git a/src/facilities/pit/pitFramework.js b/src/facilities/pit/pitFramework.js
index ac0d8927024..40a848ffee4 100644
--- a/src/facilities/pit/pitFramework.js
+++ b/src/facilities/pit/pitFramework.js
@@ -4,7 +4,7 @@ App.Data.Facilities.pit = {
 	jobs: {
 		fighter: {
 			position: "fighter",
-			assignment: "",
+			assignment: "Pit", /* pseudo-assignment for addJob/RemoveJob */
 			publicSexUse: false,
 			fuckdollAccepted: false,
 			partTime: true
diff --git a/src/interaction/slaveInteract.js b/src/interaction/slaveInteract.js
index 880731c7c7a..0f76886ea32 100644
--- a/src/interaction/slaveInteract.js
+++ b/src/interaction/slaveInteract.js
@@ -222,7 +222,7 @@ App.UI.SlaveInteract.assignmentBlock = function(blockId, slave) {
 	links.className = "choices";
 	links.appendChild(
 		App.UI.jobLinks.assignmentsFragment(
-			V.slaveIndices[slave.ID], passage(),
+			slave.ID, passage(),
 			(slave, assignment) => {
 				assignJob(slave, assignment);
 				V.activeSlave = slave;
diff --git a/src/js/assignJS.js b/src/js/assignJS.js
index 8fae2294b23..b47391a9c4d 100644
--- a/src/js/assignJS.js
+++ b/src/js/assignJS.js
@@ -770,21 +770,21 @@ App.UI.jobLinks = function() {
 
 	/**
 	 * Generates assignment links
-	 * @param {number} index in the slaves array or -1 for the activeSlave
+	 * @param {number} ID slave ID
 	 * @param {string} [passage] optional next passage to go to
 	 * @param {linkCallback} [callback]
 	 * @returns {string}
 	 */
-	function assignmentLinks(index, passage, callback) {
-		let penthouseJobs = App.Entity.facilities.penthouse.assignmentLinks(index, undefined, passage, callback);
-		const slave = App.Utils.slaveByIndex(index);
+	function assignmentLinks(ID, passage, callback) {
+		let penthouseJobs = App.Entity.facilities.penthouse.assignmentLinks(ID, undefined, passage, callback);
+		const slave = slaveStateById(ID);
 		const sp = getPronouns(slave);
 
 		if (slave.fuckdoll === 0) {
 			const assignment = "choose her own job";
 			if (slave.assignment !== assignment) {
 				const linkAction = callback !== undefined ? callback(assignment) : '';
-				penthouseJobs.push(`<<link "Let ${sp.object} choose" ${passage !== undefined ? `"${passage}"` : ''}>><<= assignJob(${App.Utils.slaveRefString(index)}, "${assignment}")>>${linkAction}<</link>>`);
+				penthouseJobs.push(`<<link "Let ${sp.object} choose" ${passage !== undefined ? `"${passage}"` : ''}>><<= assignJob(slaveStateById(${ID}), "${assignment}")>>${linkAction}<</link>>`);
 			}
 		} else {
 			penthouseJobs.push(App.UI.disabledLink(`Let ${sp.object} choose`, ["Fuckdolls can't choose their job"]));
@@ -793,16 +793,16 @@ App.UI.jobLinks = function() {
 		return penthouseJobs.join("&thinsp;|&thinsp;");
 	}
 
-	function transferLinks(index) {
+	function transferLinks(ID) {
 		/** @type {string[]} */
 		const transfers = [];
-		const slave = App.Utils.slaveByIndex(index);
+		const slave = slaveStateById(ID);
 
 		for (const f of facilitiesOrder) {
 			if (!f.established) { continue; }
 			const rejects = f.canHostSlave(slave);
 			if (rejects.length === 0) {
-				transfers.push(f.transferLink(index, undefined, passage()));
+				transfers.push(f.transferLink(ID, undefined, passage()));
 			} else {
 				transfers.push(App.UI.disabledLink(f.genericName, rejects));
 			}
@@ -813,22 +813,20 @@ App.UI.jobLinks = function() {
 
 	/**
 	 *
-	 * @param {number} index
+	 * @param {number} ID
 	 * @param {string} passage
 	 * @param {assignmentCallback} [callback]
 	 * @returns {DocumentFragment}
 	 */
-	function assignmentsFragment(index, passage, callback) {
-		let penthouseJobs = App.Entity.facilities.penthouse.assignmentLinkElements(index, undefined, passage, callback);
-		const slave = App.Utils.slaveByIndex(index);
+	function assignmentsFragment(ID, passage, callback) {
+		let penthouseJobs = App.Entity.facilities.penthouse.assignmentLinkElements(ID, undefined, passage, callback);
+		const slave = slaveStateById(ID);
 		const sp = getPronouns(slave);
 
 		if (slave.fuckdoll === 0) {
 			const assignment = "choose her own job";
 			if (slave.assignment !== assignment) {
-				penthouseJobs.push(
-					App.UI.DOM.assignmentLink(State.variables.slaves[index],
-						assignment, passage, callback, `Let ${sp.object} choose`));
+				penthouseJobs.push(App.UI.DOM.assignmentLink(slave, assignment, passage, callback, `Let ${sp.object} choose`));
 			}
 		} else {
 			penthouseJobs.push(App.UI.DOM.disabledLink(`Let ${sp.object} choose`, ["Fuckdolls can't choose their job"]));
@@ -843,16 +841,16 @@ App.UI.jobLinks = function() {
 		return res;
 	}
 
-	function transfersFragment(index, callback) {
+	function transfersFragment(ID, callback) {
 		/** @type {HTMLElement[]} */
 		const transfers = [];
-		const slave = App.Utils.slaveByIndex(index);
+		const slave = slaveStateById(ID);
 
 		for (const f of facilitiesOrder) {
 			if (!f.established) { continue; }
 			const rejects = f.canHostSlave(slave);
 			if (rejects.length === 0) {
-				transfers.push(f.transferLinkElement(index, undefined, passage(), callback));
+				transfers.push(f.transferLinkElement(ID, undefined, passage(), callback));
 			} else {
 				transfers.push(App.UI.DOM.disabledLink(f.genericName, rejects));
 			}
@@ -932,3 +930,47 @@ App.Utils.jobForAssignment = function() {
 	}
 	return getJob;
 }();
+
+/** Assign a slave, play the appropriate assignment scene if necessary, and redirect to a destination passage.
+ * @param {App.Entity.SlaveState} slave
+ * @param {string} assignTo
+ * @param {string} passage
+ */
+globalThis.assignmentTransition = function(slave, assignTo, passage) {
+	/** @param {string} scene */
+	function detourThroughScene(scene) {
+		V.returnTo = passage;
+		Engine.play(scene);
+	}
+
+	V.activeSlave = slave; // might be needed by the passage we're transitioning to (TODO: get rid of this)
+	switch (assignTo) {
+		case "Pit": {
+			V.fighterIDs.push(slave.ID);
+			Engine.play(passage);
+			break;
+		}
+		case "Coursing Association": {
+			debugger;
+			V.LurcherID = slave.ID;
+			Engine.play(passage);
+			break;
+		}
+		default: {
+			assignJob(slave, assignTo);
+			if (V.showAssignToScenes === 1 && slave.fetish !== "mindbroken") {
+				if (assignTo === "Dairy" && ((V.dairyStimulatorsSetting >= 2) || (V.dairyFeedersSetting >= 2) || (V.dairyPregSetting >= 2))) {
+					detourThroughScene("Industrial Dairy Assignment Scene");
+				} else if (assignTo === "Dairy" && (V.dairyRestraintsSetting === 0 && V.activeSlave.devotion > 0)) {
+					detourThroughScene("Free Range Dairy Assignment Scene");
+				} else if (assignTo === "Brothel") {
+					detourThroughScene("Brothel Assignment Scene");
+				} else {
+					Engine.play(passage);
+				}
+			} else {
+				Engine.play(passage);
+			}
+		}
+	}
+};
diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js
index 2423d1aefa9..c21b3f7f083 100644
--- a/src/js/slaveListing.js
+++ b/src/js/slaveListing.js
@@ -52,7 +52,6 @@ App.UI.SlaveList.render = function() {
 	function listDOM(indices, rejectedSlaves, interactionLink, postNote) {
 		passageName = passage();
 		slaves = V.slaves;
-		V.assignTo = passageName; // would be passed to the "Assign" passage
 
 		let res = document.createDocumentFragment();
 
@@ -320,12 +319,12 @@ App.UI.SlaveList.render = function() {
 		res.appendChild(document.createTextNode(' '));
 
 		if ((V.displayAssignments === 1) && (passageName === "Main") && (slave.ID !== V.HeadGirl.ID) && (slave.ID !== V.Recruiter.ID) && (slave.ID !== V.Bodyguard.ID)) {
-			res.appendChild(App.UI.jobLinks.assignmentsFragment(index, "Main", (slave, assignment) => { App.UI.SlaveList.ScrollPosition.record(); assignJob(slave, assignment); }));
+			res.appendChild(App.UI.jobLinks.assignmentsFragment(slave.ID, "Main", (slave, assignment) => { App.UI.SlaveList.ScrollPosition.record(); assignJob(slave, assignment); }));
 		}
 		if (showTransfers) {
 			res.appendChild(document.createElement("br"));
 			res.appendChild(document.createTextNode('Transfer to: '));
-			res.appendChild(App.UI.jobLinks.transfersFragment(index, (slave, assignment) => { App.UI.SlaveList.ScrollPosition.record(); assignJob(slave, assignment); }));
+			res.appendChild(App.UI.jobLinks.transfersFragment(slave.ID, (slave, assignment) => { App.UI.SlaveList.ScrollPosition.record(); assignJob(slave, assignment); }));
 		}
 
 		res.appendChild(App.UI.SlaveSummary.render(slave));
@@ -652,8 +651,8 @@ App.UI.SlaveList.listSJFacilitySlaves = function(facility, facilityPassage, show
 		SlaveSort.indices(facilitySlaves);
 		r += App.UI.tabbar.makeTab("remove", App.UI.SlaveList.render.listMarkup(facilitySlaves, [],
 			App.UI.SlaveList.SlaveInteract.stdInteract,
-			(slave, index) => App.UI.DOM.passageLink(`Retrieve ${getPronouns(slave).object} from ${facility.name}`, "Retrieve",
-				() => { variables().i = index; })));
+			(slave) => App.UI.DOM.link(`Retrieve ${getPronouns(slave).object} from ${facility.name}`, () => removeJob(slave, job.desc.assignment), [], facilityPassage)
+			));
 	} else {
 		r += App.UI.tabbar.makeTab("remove", `<em>${capFirstChar(facility.name)} is empty for the moment</em>`);
 	}
@@ -677,8 +676,7 @@ App.UI.SlaveList.listSJFacilitySlaves = function(facility, facilityPassage, show
 		}, []);
 		return App.UI.SlaveList.render.listMarkup(passedSlaves, rejectedSlaves,
 			App.UI.SlaveList.SlaveInteract.stdInteract,
-			(slave, index) => App.UI.DOM.passageLink(`Send ${getPronouns(slave).object} to ${facility.name}`, "Assign",
-				() => { variables().i = index; }));
+			(slave) => App.UI.DOM.link(`Send ${getPronouns(slave).object} to ${facility.name}`, () => { assignmentTransition(slave, job.desc.assignment, facilityPassage); }));
 	}
 	if (facility.hasFreeSpace) {
 		const assignableSlaveIdxs = job.desc.partTime ?
diff --git a/src/js/utilsFC.js b/src/js/utilsFC.js
index 57e70dbb96a..77881bb343e 100644
--- a/src/js/utilsFC.js
+++ b/src/js/utilsFC.js
@@ -2667,15 +2667,6 @@ App.Utils.slaveRefString = function(i) {
 	return i >= 0 ? `$slaves[${i}]` : '$activeSlave';
 };
 
-/**
- * Returns slave by index in the slave array, Accepts -1 for the activeSlave
- * @param {number} i slave array index or -1 for activeSlave
- * @returns {App.Entity.SlaveState}
- */
-App.Utils.slaveByIndex = function(i) {
-	return i === -1 ? V.activeSlave : V.slaves[i];
-};
-
 /**
  * Sets active slave to the slave with the given index. Does nothing if index < 0
  * @param {number} index
diff --git a/src/npc/interaction/passage/matchmaking.tw b/src/npc/interaction/passage/matchmaking.tw
index 8bc46162494..ab1a90294aa 100644
--- a/src/npc/interaction/passage/matchmaking.tw
+++ b/src/npc/interaction/passage/matchmaking.tw
@@ -41,7 +41,7 @@ Their relationship would probably be somewhat artificial at first, and they'd ha
 	s => s.devotion >= 100 && s.relationship === $activeSlave.relationship && s.ID !== $activeSlave.ID,
 	App.UI.SlaveList.SlaveInteract.stdInteract,
 	null,
-	(s, i) => App.UI.DOM.passageLink('Match them', 'Matchmaking', () => { variables().subSlave = App.Utils.slaveByIndex(i); })
+	(s) => App.UI.DOM.passageLink('Match them', 'Matchmaking', () => { variables().subSlave = s; })
 )>>
 </span>
 
diff --git a/src/uncategorized/assign.tw b/src/uncategorized/assign.tw
deleted file mode 100644
index 8476f10e7bf..00000000000
--- a/src/uncategorized/assign.tw
+++ /dev/null
@@ -1,32 +0,0 @@
-:: Assign [nobr]
-
-<<if $i >= 0 && $i < $slaves.length && ((ndef $activeSlave) || $activeSlave.ID != $slaves[$i].ID)>> /* don't overwrite activeSlave unnecessarily */
-	<<set $activeSlave = $slaves[$i]>>
-<</if>>
-<<if (ndef $activeSlave)>>
-	@@.red;ERROR: $activeSlave undefined in Assign.tw, $$i = $i, previous passage was '<<print previous()>>'@@ <<link "Continue">><<goto $returnTo>><</link>>
-<<else>>
-	<<switch $assignTo>>
-	<<case "Pit">>
-		<<set $fighterIDs.push($activeSlave.ID)>>
-		<<goto $returnTo>>
-	<<case "Coursing Association">>
-		<<set $LurcherID = $activeSlave.ID>>
-		<<goto $returnTo>>
-	<<default>>
-		<<= assignJob($activeSlave, $assignTo)>>
-		<<if ($showAssignToScenes == 1) && ($activeSlave.fetish != "mindbroken")>>
-			<<if ($assignTo == "Dairy") && (($dairyStimulatorsSetting >= 2) || ($dairyFeedersSetting >= 2) || ($dairyPregSetting >= 2))>>
-				<<goto "Industrial Dairy Assignment Scene">>
-			<<elseif ($assignTo == "Dairy") && ($dairyRestraintsSetting == 0 && $activeSlave.devotion > 0)>>
-				<<goto "Free Range Dairy Assignment Scene">>
-			<<elseif ($assignTo == "Brothel")>>
-				<<goto "Brothel Assignment Scene">>
-			<<else>>
-				<<goto $returnTo>>
-			<</if>>
-		<<else>>
-			<<goto $returnTo>>
-		<</if>>
-	<</switch>>
-<</if>>
diff --git a/src/uncategorized/coursingAssociation.tw b/src/uncategorized/coursingAssociation.tw
index 5eed13c2ebe..11eabbdcc61 100644
--- a/src/uncategorized/coursingAssociation.tw
+++ b/src/uncategorized/coursingAssociation.tw
@@ -17,13 +17,12 @@ The chasing slaves are known as lurchers, the term once used for the sighthounds
 <<if $LurcherID != 0>>
 	<br><br>''Fire your Lurcher:''
 	<<= App.UI.SlaveList.render.listMarkup([App.Utils.slaveIndexForId($LurcherID)], [],
-		(slave, index) => App.UI.DOM.passageLink(SlaveFullName(slave), 'Retrieve',
-		() => { $i = App.Utils.slaveIndexForId($LurcherID) }))>>
+		(slave) => App.UI.DOM.passageLink(SlaveFullName(slave), 'Coursing Association', () => removeJob(slave, "Coursing Association")))>>
 <</if>>
 
 <br><br>''Select a slave to course as a Lurcher:''
 <br><br>
 <<= App.UI.SlaveList.slaveSelectionList(
 		s => $LurcherID !== s.ID && canWalk(s) && canHold(s) && (canSee(s) || canHear(s)) && s.fuckdoll === 0 && isSlaveAvailable(s),
-		(slave, index) => App.UI.DOM.passageLink(SlaveFullName(slave), 'Assign', () => { variables().i = index; })
+		(slave) => App.UI.DOM.link(SlaveFullName(slave), () => assignmentTransition(slave, "Coursing Association", "Coursing Association"))
 	)>>
diff --git a/src/uncategorized/retrieve.tw b/src/uncategorized/retrieve.tw
deleted file mode 100644
index b9c423b16be..00000000000
--- a/src/uncategorized/retrieve.tw
+++ /dev/null
@@ -1,12 +0,0 @@
-:: Retrieve [silently]
-
-<<switch $returnTo>>
-<<case "Pit">>
-	<<set $fighterIDs.delete($slaves[$i].ID)>>
-<<case "Coursing Association">>
-	<<set $LurcherID = 0>>
-<<default>>
-	<<= removeJob($slaves[$i], $slaves[$i].assignment)>>
-<</switch>>
-
-<<goto $returnTo>>
diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw
index b2842a8b890..d5b3c0d1fec 100644
--- a/src/uncategorized/slaveInteract.tw
+++ b/src/uncategorized/slaveInteract.tw
@@ -208,7 +208,7 @@
 					<<set _numFacilities = $brothel+$club+$dairy+$farmyard+$servantsQuarters+$masterSuite+$spa+$nursery+$clinic+$schoolroom+$cellblock+$arcade+$HGSuite>>
 
 					<<if _numFacilities > 0>>
-						Transfer to: <<= App.UI.jobLinks.transfers(-1)>>
+						Transfer to: <<= App.UI.jobLinks.transfers(V.activeSlave.ID)>>
 					<</if>> /* closes _numFacilities */
 
 					<div id="fucktoypref"></div>
-- 
GitLab