From 63b86ee9f020368befa044b9b0a9343dc60382fe Mon Sep 17 00:00:00 2001
From: ezsh <ezsh.junk@gmail.com>
Date: Thu, 21 Mar 2019 13:28:11 +0100
Subject: [PATCH] Prepare clean-up functions for slave state refactoring

Add SlaveDataSchemeCleanup() which will handle SlaveState structural
changes and run cleanup functions on slaves, cribs, tanks, hero slaves,
and arcology leaders.

Also cleanup gene pool records from useless attributes.
---
 src/002-config/fc-js-init.js                |  1 +
 src/js/datatypeCleanupJS.js                 | 83 +++++++++++++++++++++
 src/uncategorized/BackwardsCompatibility.tw | 44 +++++++++--
 src/uncategorized/reRelativeRecruiter.tw    |  6 +-
 4 files changed, 126 insertions(+), 8 deletions(-)

diff --git a/src/002-config/fc-js-init.js b/src/002-config/fc-js-init.js
index e5d890dc402..8b8a2bec36c 100644
--- a/src/002-config/fc-js-init.js
+++ b/src/002-config/fc-js-init.js
@@ -9,5 +9,6 @@ var App = window.App || {};
 
 App.Debug = {};
 App.Entity = {};
+App.Entity.Utils = {};
 App.UI = {};
 App.Utils = {};
diff --git a/src/js/datatypeCleanupJS.js b/src/js/datatypeCleanupJS.js
index 47fbacfcd01..2608876e7c9 100644
--- a/src/js/datatypeCleanupJS.js
+++ b/src/js/datatypeCleanupJS.js
@@ -1,4 +1,21 @@
 /* eslint-disable no-undef */
+/**
+ * Applies data scheme updates to the slave object
+ *
+ * This function only handles data scheme changes (attribute renaming, other reorganzations)
+ * and in general pays no attention to the property values unless they need to be changed due
+ * to the schema change.
+ */
+App.Entity.Utils.SlaveDataSchemeCleanup = (function () {
+	"use strict";
+	return SlaveDataSchemeCleanup;
+
+	/** @param {App.Entity.SlaveState} slave */
+	function SlaveDataSchemeCleanup(slave) { // eslint-disable-line no-unused-vars
+
+	}
+})();
+
 /*
 	This function does not ensure values make sense. For example, it does not fix weird relations/relationships/rivalries/pregnancies/prosthetics.
 	It only makes sure most datatypes are correct, and sets to default if not. Number values are clamped to the correct bounds.
@@ -1662,3 +1679,69 @@ window.FacilityDatatypeCleanup = (function() {
 		}
 	}
 })();
+
+
+/**
+ * Cleans up a slave record assuming it is used for the gene pool.
+ *
+ * It removes all the unneded for the gene pool attributes.
+ * @todo remove after refactoring the slave state class
+ */
+App.Entity.Utils.GenePoolRecordCleanup = (function () {
+	"use strict";
+	return GenePoolRecordCleanup;
+
+	/** @param {App.Entity.SlaveState} slave */
+	function GenePoolRecordCleanup(slave) {
+		App.Entity.Utils.SlaveDataSchemeCleanup(slave);
+
+		// the following attributes are unneeded for gene pool records
+		[
+			"counters", "custom", "porn",
+			"prestige", "pornFeed", "pornFame", "pornFameSpending", "pornPrestige", "pornPrestigeDesc", "prestigeDesc",
+			"recruiter", "relation", "relationTarget", "subTarget", "relationship", "relationshipTarget", "rivalry", "rivalryTarget",
+			"pronoun", "possessive", "possessivePronoun", "objectReflexive", "object", "noun",
+			"weekAcquired", "HGExclude",
+			"daughters", "origin",
+			"canRecruit",
+			"choosesOwnAssignment", "assignment", "assignmentVisible",
+			"sentence", "training", "toyHole",
+			"indenture", "indentureRestrictions",
+			"minorInjury",
+			"oldTrust", "oldDevotion",
+			"eyewear", "earwear",
+			"preg", "pregSource", "pregType", "pregAdaptation", "labor",
+			"bellyAccessory",
+			"clitSetting",
+			"livingRules", "speechRules", "releaseRules", "relationshipRules", "lactationRules",
+			"standardPunishment", "standardReward",
+			"useRulesAssistant",
+			"diet", "dietCum", "dietMilk",
+			"tired",
+			"drugs", "curatives", "aphrodisiacs",
+			"choosesOwnClothes", "clothes", "collar", "shoes",
+			"makeup", "nails",
+			"vaginalAccessory", "dickAccessory", "legAccessory",
+			"buttplug", "buttplugAttachment",
+			"fetishKnown",
+			"rudeTitle",
+			"currentRules",
+			"induce",
+			"mpreg",
+			"inflation", "inflationType", "inflationMethod", "milkSource", "cumSource",
+			"burst",
+			"pregKnown", "pregWeek",
+			"belly", "bellyPreg", "bellyFluid", "bellyImplant", "bellySag", "bellySagPreg", "bellyPain",
+			"cervixImplant",
+			"birthsTotal",
+			"scars",
+			"choosesOwnChastity",
+			"pregControl",
+			"readyLimbs",
+			"death",
+			"onDiet",
+			"prematureBirth",
+			"slaveCost"
+		].forEach((s) => delete slave[s]);
+	}
+})();
diff --git a/src/uncategorized/BackwardsCompatibility.tw b/src/uncategorized/BackwardsCompatibility.tw
index f109f21dcac..08b55c84b27 100644
--- a/src/uncategorized/BackwardsCompatibility.tw
+++ b/src/uncategorized/BackwardsCompatibility.tw
@@ -3338,15 +3338,46 @@ Setting missing slave variables:
 	<</if>>
 <</if>>
 
-<<run SlaveDatatypeCleanup(_Slave)>>
+<<set $slaves[_bci] = _Slave>>
+<</for>>
 
-<<set _leaderIdx = $leaders.findIndex(function(s) { return s.ID === _Slave.ID; })>>
-<<if _leaderIdx !== -1>>
-	<<set $leaders[_leaderIdx] = _Slave>>
+<br> Checking and fixing slave records...
+<<for _Slave range $slaves>>
+	<<run App.Entity.Utils.SlaveDataSchemeCleanup(_Slave)>>
+	<<run SlaveDatatypeCleanup(_Slave)>>
+	<<set _leaderIdx = $leaders.findIndex(function(s) { return s.ID === _Slave.ID; })>>
+	<<if _leaderIdx !== -1>>
+		<<set $leaders[_leaderIdx] = _Slave>>
+	<</if>>
+<</for>>
+Done<br>
+
+<<if $tanks.length > 0>>
+	Checking and fixing records for incubator tanks...
+	<<for _Slave range $tanks>>
+		<<run App.Entity.Utils.SlaveDataSchemeCleanup(_Slave)>>
+		<<run SlaveDatatypeCleanup(_Slave)>>
+	<</for>>
+	Done<br>
 <</if>>
 
-<<set $slaves[_bci] = _Slave>>
-<</for>>
+<<if $cribs.length > 0>>
+	Checking and fixing records for nursery cribs...
+	<<for _Slave range $cribs>>
+		<<run App.Entity.Utils.SlaveDataSchemeCleanup(_Slave)>>
+		<<run ChildDatatypeCleanup(_Slave)>>
+	<</for>>
+	Done<br>
+<</if>>
+
+<<if $heroSlaves.length > 0>>
+	Checking and fixing special slave records...
+	<<for _Slave range $heroSlaves>>
+		<<run App.Entity.Utils.SlaveDataSchemeCleanup(_Slave)>>
+		/% No SlaveDatatypeCleanup() call as hero slaves are not SlaveState objects %/
+	<</for>>
+	Done<br>
+<</if>>
 
 <<set $slavesOriginal = []>> /* not used by pregmod */
 
@@ -3415,6 +3446,7 @@ Setting missing slave variables:
 		<</if>>
 	<</if>>
 
+	<<run App.Entity.Utils.GenePoolRecordCleanup(_Slave)>>
 	<<set $genePool[_bci] = _Slave>>
 <</for>>
 
diff --git a/src/uncategorized/reRelativeRecruiter.tw b/src/uncategorized/reRelativeRecruiter.tw
index a7404b9b037..347f7687f4c 100644
--- a/src/uncategorized/reRelativeRecruiter.tw
+++ b/src/uncategorized/reRelativeRecruiter.tw
@@ -7,6 +7,7 @@
 <<set $eventSlave = getSlave($recruiterSlave)>>
 <<set $activeSlave = BaseSlave()>>
 <<set $activeSlave = Object.assign($activeSlave, clone($genePool.find(function(o) { return o.ID == $eventSlave.ID; })))>>
+<<run generatePronouns($activeSlave)>>
 
 <span id="artFrame">
 /* 000-250-006 */
@@ -852,7 +853,9 @@ You look up the _relationType. _He2 costs <<print cashFormat($slaveCost)>>, a ba
 <<set $j = $genePool.findIndex(function(o) { return o.ID == $slaves[$i].ID; })>>
 
 <<set $eventSlave = $slaves[$i]>>
-<<set $activeSlave = clone($genePool[$j])>>
+<<set $activeSlave = BaseSlave()>>
+<<set $activeSlave = Object.assign($activeSlave, clone($genePool[$j]))>>
+<<run generatePronouns($activeSlave)>>
 <<run Enunciate($eventSlave)>>
 
 /* 000-250-006 */
@@ -1198,4 +1201,3 @@ You look up the $activeSlave.relation. _He2 costs <<print cashFormat($slaveCost)
 </span>
 
 <</if>> /* close extended family mode */
-
-- 
GitLab