From fe169b04850eb0fe7c04db464b8095ae1e975df8 Mon Sep 17 00:00:00 2001
From: ezsh <ezsh.junk@gmail.com>
Date: Sat, 31 Aug 2019 14:42:39 +0200
Subject: [PATCH] Refactor "remove all slaves" fragments

Introduce a widget and a function to do the work and use them in
facility passages.
---
 src/004-base/facility.js              |  2 +-
 src/facilities/farmyard/farmyard.tw   | 14 +-------------
 src/facilities/nursery/nursery.tw     | 14 +-------------
 src/facilities/widgets/misc.tw        | 17 +++++++++++++++++
 src/js/assignJS.js                    | 16 ++++++++++++++++
 src/uncategorized/arcade.tw           | 10 +---------
 src/uncategorized/brothel.tw          | 14 +-------------
 src/uncategorized/cellblock.tw        | 14 +-------------
 src/uncategorized/clinic.tw           | 14 +-------------
 src/uncategorized/club.tw             | 14 +-------------
 src/uncategorized/dairy.tw            | 14 +-------------
 src/uncategorized/masterSuite.tw      | 14 +-------------
 src/uncategorized/schoolroom.tw       | 14 +-------------
 src/uncategorized/servantsQuarters.tw | 14 +-------------
 src/uncategorized/spa.tw              | 14 +-------------
 15 files changed, 46 insertions(+), 153 deletions(-)
 create mode 100644 src/facilities/widgets/misc.tw

diff --git a/src/004-base/facility.js b/src/004-base/facility.js
index 4b8a2fb5c4e..3e685aa2e71 100644
--- a/src/004-base/facility.js
+++ b/src/004-base/facility.js
@@ -250,7 +250,7 @@ App.Entity.Facilities.ManagingJob = class extends App.Entity.Facilities.Job {
 	/** @returns {App.Entity.SlaveState} */
 	get currentEmployee() {
 		const obj = State.variables[capFirstChar(this.desc.position)];
-		return obj === undefined ? null : obj;
+		return obj === undefined  || obj === 0 ? null : obj;
 	}
 
 	/** @private */
diff --git a/src/facilities/farmyard/farmyard.tw b/src/facilities/farmyard/farmyard.tw
index 751eef03387..4dd5d7e0b04 100644
--- a/src/facilities/farmyard/farmyard.tw
+++ b/src/facilities/farmyard/farmyard.tw
@@ -85,19 +85,7 @@ $farmyardNameCaps is an oasis of growth in the midst of the jungle of steel and
 <</if>>
 
 <<if _FyL > 0>>
-	<<if $Farmer != 0>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = _FyL+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Farmyard">>
-		<<if $Farmer != 0>>
-			<<= assignJob($Farmer, "rest")>>
-		<</if>>
-		<<for $FarmyardiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$FarmyardiIDs[0]]], "rest")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "farmyard" "rest" "rest">>
 <</if>>
 
 <<set _Tmult0 = Math.trunc($farmyard*1000*$upgradeMultiplierArcology)>>
diff --git a/src/facilities/nursery/nursery.tw b/src/facilities/nursery/nursery.tw
index 8c31898bc24..1fadd82fe4b 100644
--- a/src/facilities/nursery/nursery.tw
+++ b/src/facilities/nursery/nursery.tw
@@ -89,19 +89,7 @@ $nurseryNameCaps
 <</if>>
 
 <<if _NL > 0>>
-	<<if $Matron>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = _NL+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Nursery">>
-		<<if $Matron>>
-			<<= assignJob($Matron, "rest")>>
-		<</if>>
-		<<for $NurseryiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$NurseryiIDs[0]]], "rest")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "nursery" "rest" "rest">>
 <</if>>
 
 <<set _Tmult0 = Math.trunc($nurseryNannies*1000*$upgradeMultiplierArcology)>>
diff --git a/src/facilities/widgets/misc.tw b/src/facilities/widgets/misc.tw
new file mode 100644
index 00000000000..4e815a937b9
--- /dev/null
+++ b/src/facilities/widgets/misc.tw
@@ -0,0 +1,17 @@
+:: FacilityMiscWidgets [nobr widget]
+
+/* Call as removeFacilityWorkers <facilityName>  <managerAssignment> <workerAssignment> */
+<<widget "removeFacilityWorkers">>
+	<<set _facility = App.Entity.facilities[$args[0]]>>
+	<<set _count = _facility.hostedSlaves + (_facility.manager && _facility.manager.currentEmployee ? 1 : 0)>>
+	<<set _NewPop = _count+$dormitoryPopulation>>
+	<<if _count > 0>>
+		<<set _passage = passage()>>
+		<<link "Remove all slaves" _passage>>
+			<<run App.Utils.moveFacilityWorkers(_facility, $args[1], $args[2])>>
+		<</link>>
+		<<if _NewPop > $dormitory>>
+			@@.red;Dormitory capacity will be exceeded.@@
+		<</if>>
+	<</if>>
+<</widget>>
diff --git a/src/js/assignJS.js b/src/js/assignJS.js
index 8a0a9a2d57f..0ee88183491 100644
--- a/src/js/assignJS.js
+++ b/src/js/assignJS.js
@@ -753,3 +753,19 @@ App.currentAgent = function() {
 		}
 	}
 };
+
+/**
+ * Remove all workers from the facility changing their assignments
+ * @param {App.Entity.Facilities.Facility} facility
+ * @param {string} [managerAssignment="rest"] new assignment for the facility manager
+ * @param {string} [workerAssignment="rest"] new assignment for the facility workers
+*/
+App.Utils.moveFacilityWorkers = function(facility, managerAssignment = "rest", workerAssignment = "rest") {
+	if (facility.manager && facility.manager.currentEmployee) {
+		assignJob(facility.manager.currentEmployee, managerAssignment);
+	}
+
+	for (const w of facility.employees()) {
+		assignJob(w, workerAssignment);
+	}
+};
diff --git a/src/uncategorized/arcade.tw b/src/uncategorized/arcade.tw
index 6d78fe70a23..11316e788c1 100644
--- a/src/uncategorized/arcade.tw
+++ b/src/uncategorized/arcade.tw
@@ -83,15 +83,7 @@ $arcadeNameCaps
 <</if>>
 
 <<if _AL > 0>>
-	<<set _NewPop = _AL+$dormitoryPopulation>>
-	<<link "Remove all slaves" "Arcade">>
-		<<for $ArcadeiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$ArcadeiIDs[0]]], "work a glory hole")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "arcade" "" "work a glory hole">>
 <</if>>
 
 <br>It can support $arcade inmates. There <<if _AL == 1>>is<<else>>are<</if>> currently _AL slave<<if _AL != 1>>s<</if>> incarcerated in $arcadeName.
diff --git a/src/uncategorized/brothel.tw b/src/uncategorized/brothel.tw
index 711d45a26b1..d39040b8d81 100644
--- a/src/uncategorized/brothel.tw
+++ b/src/uncategorized/brothel.tw
@@ -153,19 +153,7 @@ $brothelNameCaps
 <</if>>
 
 <<if _BL > 0>>
-	<<if $Madam != 0>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = _BL+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Brothel">>
-		<<if $Madam != 0>>
-			<<= assignJob($Madam, "rest")>>
-		<</if>>
-		<<for $BrothiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$BrothiIDs[0]]], "whore")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "brothel" "rest" "whore">>
 <</if>>
 
 <<set _Tmult0 = Math.trunc($brothel*1000*$upgradeMultiplierArcology)>>
diff --git a/src/uncategorized/cellblock.tw b/src/uncategorized/cellblock.tw
index 75ccd6a0fcb..d04f79ce104 100644
--- a/src/uncategorized/cellblock.tw
+++ b/src/uncategorized/cellblock.tw
@@ -78,19 +78,7 @@ $cellblockNameCaps
 <</if>>
 
 <<if _CL > 0>>
-	<<if $Wardeness != 0>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = _CL+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Cellblock">>
-		<<if $Wardeness != 0>>
-			<<= assignJob($Wardeness, "rest")>>
-		<</if>>
-		<<for $CellBiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$CellBiIDs[0]]], "stay confined")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "cellblock" "rest" "stay confined">>
 <</if>>
 
 <<set _Tmult0 = Math.trunc($cellblock*1000*$upgradeMultiplierArcology)>>
diff --git a/src/uncategorized/clinic.tw b/src/uncategorized/clinic.tw
index 3cd55f2b0af..56b283461c0 100644
--- a/src/uncategorized/clinic.tw
+++ b/src/uncategorized/clinic.tw
@@ -78,19 +78,7 @@ $clinicNameCaps
 <</if>>
 
 <<if _CL > 0>>
-	<<if $Nurse != 0>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = _CL+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Clinic">>
-		<<if $Nurse != 0>>
-			<<= assignJob($Nurse, "rest")>>
-		<</if>>
-		<<for $CliniciIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$CliniciIDs[0]]], "rest")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "clinic" "rest" "rest">>
 <</if>>
 
 <<set _Tmult0 = Math.trunc($clinic*1000*$upgradeMultiplierArcology)>>
diff --git a/src/uncategorized/club.tw b/src/uncategorized/club.tw
index e8c366f6d75..6efe471d720 100644
--- a/src/uncategorized/club.tw
+++ b/src/uncategorized/club.tw
@@ -154,19 +154,7 @@ $clubNameCaps
 <</if>>
 
 <<if _CL > 0>>
-	<<if $DJ != 0>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = _CL+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Club">>
-		<<if $DJ != 0>>
-			<<= assignJob($DJ, "rest")>>
-		<</if>>
-		<<for $ClubiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$ClubiIDs[0]]], "serve the public")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "club" "rest" "serve the public">>
 <</if>>
 
 <<if _CL > 2>>
diff --git a/src/uncategorized/dairy.tw b/src/uncategorized/dairy.tw
index f99ca7c1c83..be27cb391c1 100644
--- a/src/uncategorized/dairy.tw
+++ b/src/uncategorized/dairy.tw
@@ -321,19 +321,7 @@
 <</if>>
 
 <<if _DL > 0>>
-	<<if $Milkmaid != 0>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = _DL+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Dairy">>
-		<<if $Milkmaid != 0>>
-			<<= assignJob($Milkmaid, "rest")>>
-		<</if>>
-		<<for $DairyiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$DairyiIDs[0]]], "get milked")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "dairy" "rest" "get milked">>
 <</if>>
 
 <<set _Tmult0 = Math.trunc($dairy*1000*$upgradeMultiplierArcology)>>
diff --git a/src/uncategorized/masterSuite.tw b/src/uncategorized/masterSuite.tw
index 7ddf6ee5796..849830dd6cd 100644
--- a/src/uncategorized/masterSuite.tw
+++ b/src/uncategorized/masterSuite.tw
@@ -324,19 +324,7 @@ $masterSuiteNameCaps is furnished
 <</if>>
 
 <<if _MsL > 0>>
-	<<if $Concubine != 0>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = _MsL+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Master Suite">>
-		<<if $Concubine != 0>>
-			<<= assignJob($Concubine, "rest")>>
-		<</if>>
-		<<for $MastSiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$MastSiIDs[0]]], "please you")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "masterSuite" "rest" "please you">>
 <</if>>
 
 <<if $seePreg != 0>>
diff --git a/src/uncategorized/schoolroom.tw b/src/uncategorized/schoolroom.tw
index 27b84cab897..eb63e853336 100644
--- a/src/uncategorized/schoolroom.tw
+++ b/src/uncategorized/schoolroom.tw
@@ -80,19 +80,7 @@ $schoolroomNameCaps is well-equipped, with wallscreens to display lessons. These
 <</if>>
 
 <<if $SchlRiIDs.length > 0>>
-	<<if $Schoolteacher != 0>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = $SchlRiIDs.length+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Schoolroom">>
-		<<if $Schoolteacher != 0>>
-			<<= assignJob($Schoolteacher, "rest")>>
-		<</if>>
-		<<for $SchlRiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$SchlRiIDs[0]]], "take classes")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "schoolroom" "rest" "take classes">>
 <</if>>
 
 <<set _Tmult0 = Math.trunc($schoolroom*1000*$upgradeMultiplierArcology)>>
diff --git a/src/uncategorized/servantsQuarters.tw b/src/uncategorized/servantsQuarters.tw
index c8607ae55cc..b0ab1201b9c 100644
--- a/src/uncategorized/servantsQuarters.tw
+++ b/src/uncategorized/servantsQuarters.tw
@@ -78,19 +78,7 @@ $servantsQuartersNameCaps
 <</if>>
 
 <<if $ServQiIDs.length > 0>>
-	<<if $Stewardess != 0>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = $ServQiIDs.length+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Servants' Quarters">>
-		<<if $Schoolteacher != 0>>
-			<<= assignJob($Stewardess, "rest")>>
-		<</if>>
-		<<for $ServQiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$ServQiIDs[0]]], "be a servant")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "servantsQuarters" "rest" "be a servant">>
 <</if>>
 
 <<set _Tmult0 = Math.trunc($servantsQuarters*1000*$upgradeMultiplierArcology)>>
diff --git a/src/uncategorized/spa.tw b/src/uncategorized/spa.tw
index 6b495140ada..a4043af398c 100644
--- a/src/uncategorized/spa.tw
+++ b/src/uncategorized/spa.tw
@@ -79,19 +79,7 @@ $spaNameCaps
 <</if>>
 
 <<if $SpaiIDs.length > 0>>
-	<<if $Attendant != 0>><<set _X = 1>><<else>><<set _X = 0>><</if>>
-	<<set _NewPop = $SpaiIDs.length+$dormitoryPopulation+_X>>
-	<<link "Remove all slaves" "Spa">>
-		<<if $Attendant != 0>>
-			<<= assignJob($Attendant, "rest")>>
-		<</if>>
-		<<for $SpaiIDs.length > 0>>
-			<<= assignJob($slaves[$slaveIndices[$SpaiIDs[0]]], "rest")>>
-		<</for>>
-	<</link>>
-	<<if _NewPop > $dormitory>>
-		@@.red;Dormitory capacity will be exceeded.@@
-	<</if>>
+	<<removeFacilityWorkers "spa" "rest" "rest">>
 <</if>>
 
 <<set _Tmult0 = Math.trunc($spa*1000*$upgradeMultiplierArcology)>>
-- 
GitLab