diff --git a/devTools/types/assistant.d.ts b/devTools/types/assistant.d.ts
index 717f871a2552d985ba393272e9484065b3dd2163..96908bd520cb5ff31d162d07a501f68bc2dd0b1a 100644
--- a/devTools/types/assistant.d.ts
+++ b/devTools/types/assistant.d.ts
@@ -11,6 +11,8 @@ interface assistant {
 		aggressiveness: number;
 	};
 	main: number;
+	Extra1: 1 | 0;
+	Extra2: 1 | 0;
 }
 
 interface appearance {
diff --git a/src/facilities/nursery/nurseryDatatypeCleanup.js b/src/facilities/nursery/nurseryDatatypeCleanup.js
index 7aa10f1ed660db95517cf025b6402315e2a2ffd3..6521f32e9daa8649e77424cfc61dbb1aaf8b2bd7 100644
--- a/src/facilities/nursery/nurseryDatatypeCleanup.js
+++ b/src/facilities/nursery/nurseryDatatypeCleanup.js
@@ -26,10 +26,10 @@ App.Facilities.Nursery.ChildDatatypeCleanup = function(child) {
 	function childAgeDatatypeCleanup(child) {
 		child.birthWeek = Math.clamp(+child.birthWeek, 0, 51) || 0;
 		if (child.age > 0) {
-			child.actualAge = Math.clamp(+child.actualAge, V.minimumChildAge, Infinity) || child.age; /* if undefined, this sets to child.age */
+			child.actualAge = Math.clamp(+child.actualAge, 0, Infinity) || child.age; /* if undefined, this sets to child.age */
 			delete child.age;
 		} else {
-			child.actualAge = Math.clamp(+child.actualAge, V.minimumChildAge, Infinity) || 3;
+			child.actualAge = Math.clamp(+child.actualAge, 0, Infinity) || 3;
 		}
 		child.visualAge = Math.max(+child.visualAge, 0) || child.actualAge;
 		child.physicalAge = Math.max(+child.physicalAge, 0) || child.actualAge;
@@ -39,8 +39,8 @@ App.Facilities.Nursery.ChildDatatypeCleanup = function(child) {
 	}
 
 	function childPhysicalDatatypeCleanup(child) {
-		if (typeof child.nationality !== "string") {
-			child.nationality = "child";
+		if (typeof child.nationality !== "string" || child.nationality === "child") {
+			child.nationality = "slave";
 		}
 		if (typeof child.race !== "string") {
 			nationalityToRace(child);
@@ -526,6 +526,9 @@ App.Facilities.Nursery.InfantDatatypeCleanup = function(child) {
 	originDatatypeCleanup(child);
 	generatePronouns(child);
 
+	child.premature = Math.clamp(+child.premature, 0, 1) || 0;
+	child.addict = Math.max(+child.addict, 0) || 0;
+
 	// old versions of FC assign overlapping IDs to infants and other slaves, which needs to be fixed
 	// deconflict IDs between infants and older children/tank babies/adults by reassigning the infant's ID
 	if (V.cribs.find((s) => s.ID === child.ID && (s.birthWeek !== child.birthWeek || s.actualAge !== child.actualAge)) !== undefined
@@ -535,12 +538,12 @@ App.Facilities.Nursery.InfantDatatypeCleanup = function(child) {
 
 	function ageDatatypeCleanup(child) {
 		child.birthWeek = Math.clamp(+child.birthWeek, 0, 51) || 0;
-		child.actualAge = Math.clamp(+child.actualAge, V.minimumChildAge, Infinity) || 0;
+		child.actualAge = Math.clamp(+child.actualAge, 0, Infinity) || 0;
 	}
 
 	function physicalDatatypeCleanup(child) {
-		if (typeof child.nationality !== "string") {
-			child.nationality = "child";
+		if (typeof child.nationality !== "string" || child.nationality === "child") {
+			child.nationality = "slave";
 		}
 		if (typeof child.race !== "string") {
 			nationalityToRace(child);
@@ -573,6 +576,7 @@ App.Facilities.Nursery.InfantDatatypeCleanup = function(child) {
 	function relationDatatypeCleanup(child) {
 		child.mother = +child.mother || 0;
 		child.father = +child.father || 0;
+		child.cloneID = +child.cloneID || 0;
 	}
 
 	function originDatatypeCleanup(child) {
diff --git a/src/facilities/nursery/utils/nurseryUtils.js b/src/facilities/nursery/utils/nurseryUtils.js
index 0e6fd6b14352ee5473d0f77d1517769f79d749e2..65fdb9233beec8fc2e2260fc779f8e66cc3b5c92 100644
--- a/src/facilities/nursery/utils/nurseryUtils.js
+++ b/src/facilities/nursery/utils/nurseryUtils.js
@@ -70,7 +70,6 @@ App.Facilities.Nursery.childList = function childList() {
 App.Facilities.Nursery.infantToChild = function infantToChild(child) {
 	child.abortionTat = -1;
 	child.accent = 0;
-	child.addict = 0;
 	child.ageImplant = 0;
 	child.arm = {
 		left: new App.Entity.LimbState(),
@@ -129,7 +128,6 @@ App.Facilities.Nursery.infantToChild = function infantToChild(child) {
 	child.choosesOwnClothes = 0;
 	child.clit = jsRandom(0, 2);
 	child.clitPiercing = 0;
-	child.clone = 0;
 	child.clothes = "no clothing";
 	child.collar = "none";
 	child.corsetPiercing = 0;
@@ -289,7 +287,6 @@ App.Facilities.Nursery.infantToChild = function infantToChild(child) {
 	child.pregSource = 0;
 	child.pregType = 0;
 	child.pregWeek = 0;
-	child.premature = 0;
 	child.prematureBirth = 0;
 	child.prestige = 0;
 	child.prostate = 0;
@@ -343,12 +340,11 @@ App.Facilities.Nursery.infantToChild = function infantToChild(child) {
 	child.rules.punishment = "situational";
 	child.rules.reward = "situational";
 	if (child.race !== "catgirl") {
-	child.tailColor = "none";
-	child.tailShape = "none";
-	}
-	if (child.race === "catgirl") {
-	child.tailColor = child.hColor;
-	child.tailShape = "neko";
+		child.tailColor = "none";
+		child.tailShape = "none";
+	} else {
+		child.tailColor = child.hColor;
+		child.tailShape = "neko";
 	}
 	child.tastes = 0;
 	child.teeth = "baby";
diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index a9dd7a345efed957a09f1cdbce41699880c9783b..2f1b28b3721f0a80e6d318d0a78824fad418cf85 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -973,7 +973,6 @@ App.Entity.SlaveState = class SlaveState {
 		/**
 		 * nipple are pierced
 		 * @type {FC.PiercingType}
-		 * @default 0
 		 * 0: none; 1: yes; 2: heavily */
 		this.nipplesPiercing = 0;
 		/** what accessory, if any, or on her nipples */
@@ -984,7 +983,6 @@ App.Entity.SlaveState = class SlaveState {
 		this.areolae = 0;
 		/** edge of areolae are pierced
 		 * @type {FC.PiercingType}
-		 * @default 0
 		 * 0: none; 1: yes; 2: heavy */
 		this.areolaePiercing = 0;
 		/** slave areolae shape ("heart"; "star"; "circle") */
@@ -2085,7 +2083,8 @@ App.Entity.SlaveState = class SlaveState {
 		 * *if energy > 95 and either attrXX or attrXY > 95, slave will be nymphomaniac*
 		 */
 		this.attrXY = 0;
-		/** 0: no; 1: yes */
+		/** 0: no; 1: yes
+		 * @type {FC.Bool} */
 		this.attrKnown = 0;
 		/**
 		 * * "none"
diff --git a/src/npc/children/ChildState.js b/src/npc/children/ChildState.js
index 9c4a77803e2ad830bf5f883e98fbb59a0daf034d..edcbb7ec0b58e1a9f5798007286290734cc169f4 100644
--- a/src/npc/children/ChildState.js
+++ b/src/npc/children/ChildState.js
@@ -7,14 +7,15 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		/** Child's current name */
 		this.slaveName = "blank";
 		/** Child's current surname
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.slaveSurname = 0;
 		/** Child's original name */
 		this.birthName = "blank";
 		/** Child's original surname
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.birthSurname = 0;
-		/** Slave sex ("XX", "XY") */
+		/** Slave sex ("XX", "XY")
+		 * @type {FC.GenderGenes} */
 		this.genes = "XX";
 		/** @type {number} */
 		this.pronoun = App.Data.Pronouns.Kind.female;
@@ -23,10 +24,10 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * _0: Obtained prior to game start / at game start_ */
 		this.weekAcquired = 0;
 		/** Child's origin
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.origin = "$He was born and raised in your arcology.";
 		/** Career prior to enslavement
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.career = 0;
 		/** Child's ID */
 		this.ID = 0;
@@ -42,6 +43,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * 3: friends with benefits with relationshipTarget
 		 * * 4: lover with relationshipTarget
 		 * * 5: relationshipTarget 's slave wife
+		 * @type {FC.RelationShipKind}
 		 */
 		this.relationship = 0;
 		/** Target of relationship (ID) */
@@ -52,6 +54,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * 1: dislikes rivalryTarget
 		 * * 2: rival of rivalryTarget
 		 * * 3: bitterly hates rivalryTarget
+		 * @type {FC.RivalryType}
 		 */
 		this.rivalry = 0;
 		/** Target of rival (ID) */
@@ -86,7 +89,8 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		this.physicalAge = 18;
 		/** How old her ovaries are. (used to trick menopause) */
 		this.ovaryAge = 18;
-		/** Has had facial surgery to reduce age. 0: no, 1: yes */
+		/** Has had facial surgery to reduce age. 0: no, 1: yes
+		 * @type {FC.Bool} */
 		this.ageImplant = 0;
 		this.health = {
 			/**
@@ -126,7 +130,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		};
 		/**
 		 * slave has a minor injury ("black eye", "bruise", "split lip")
-		 * @type {number | string}
+		 * @type {FC.MinorInjury}
 		 */
 		this.minorInjury = 0;
 		/**
@@ -193,9 +197,11 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		this.heightImplant = 0;
 		/** Child's nationality */
 		this.nationality = "slave";
-		/** Child's race */
+		/** Child's race
+		 * @type {FC.Race} */
 		this.race = "white";
-		/** Child's original race */
+		/** Child's original race
+		 * @type {FC.Race} */
 		this.origRace = "white";
 		/**
 		 * slave markings
@@ -203,6 +209,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "birthmark"
 		 * * "freckles"
 		 * * "heavily freckled"
+		 * @type {FC.Markings}
 		 */
 		this.markings = "none";
 		/**
@@ -213,7 +220,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		/** "none", "glasses", "blurring glasses", "corrective glasses", "blurring contacts", "corrective contacts" */
 		this.eyewear = "none";
 		/** Slave hearing
-		 *
+		 * @type {FC.Hearing}
 		 * -2: deaf; -1: hard of hearing; 0: normal */
 		this.hears = 0;
 		/** "none", "hearing aids", "muffling ear plugs", "deafening ear plugs" */
@@ -248,6 +255,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * Does she have a tail interface installed
 		 * * 0: no
 		 * * 1: yes
+		 * @type {FC.Bool}
 		 */
 		this.PTail = 0;
 		/** The current shape of their modular tail
@@ -287,6 +295,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "tapered"
 		 * * "thick"
 		 * * "bushy"
+		 * @type {FC.EyebrowThickness}
 		 */
 		this.eyebrowFullness = "natural";
 		/** Hair style */
@@ -308,7 +317,8 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * -96-: absurd
 		 */
 		this.waist = 0;
-		/** Series of rings up the back that can be tied together. 0: no, 1: yes */
+		/** Series of rings up the back that can be tied together. 0: no, 1: yes
+		 * @type {FC.Bool} */
 		this.corsetPiercing = 0;
 		/**
 		 * What level of prosthetic interface she has installed
@@ -358,7 +368,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * 0: no; 1: yes, high; -1: yes, low */
 		this.voiceImplant = 0;
 		/** Has cybernetic voicebox
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.electrolarynx = 0;
 		/**
@@ -442,6 +452,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "fillable"
 		 * * "advanced fillable"
 		 * * "hyper fillable"
+		 * @type {FC.SizingImplantType}
 		 */
 		this.boobsImplantType = "none";
 		/**
@@ -452,6 +463,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "torpedo-shaped"
 		 * * "downward-facing"
 		 * * "wide-set"
+		 * @type {FC.BreastShape}
 		 */
 		this.boobShape = "normal";
 		/**
@@ -463,11 +475,12 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "cute"
 		 * * "partially inverted"
 		 * * "fuckable"
+		 * @type {FC.NippleShape}
 		 */
 		this.nipples = "cute";
 		/**
 		 * nipple are pierced
-		 * @default 0
+		 * @type {FC.PiercingType}
 		 * 0: none; 1: yes; 2: heavily */
 		this.nipplesPiercing = 0;
 		/** What accessory, if any, or on her nipples */
@@ -477,7 +490,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * 0: normal; 1: large; 2: unusually wide; 3: huge, 4: massive */
 		this.areolae = 0;
 		/** Edge of areolae are pierced
-		 * @default 0
+		 * @type {FC.PiercingType}
 		 * 0: none; 1: yes; 2: heavy */
 		this.areolaePiercing = 0;
 		/** Slave areolae shape ("heart"; "star"; "circle") */
@@ -497,7 +510,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string | number}
+		 * @type {FC.Zeroable<string>}
 		 */
 		this.boobsTat = 0;
 		/** Slave lactation
@@ -566,6 +579,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "fillable"
 		 * * "advanced fillable"
 		 * * "hyper fillable"
+		 * @type {FC.SizingImplantType}
 		 */
 		this.buttImplantType = "none";
 		/**
@@ -585,7 +599,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.buttTat = 0;
 		/**
 		 * face attractiveness
@@ -637,7 +651,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		this.lipsImplant = 0;
 		/**
 		 * lips pierced
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.lipsPiercing = 0;
 		/**
@@ -656,7 +670,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.lipsTat = 0;
 		/**
 		 * teeth type
@@ -668,11 +682,12 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "pointy"
 		 * * "baby"
 		 * * "mixed"
+		 * @type {FC.TeethType}
 		 */
 		this.teeth = "normal";
 		/**
 		 * has tongue piercing
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.tonguePiercing = 0;
 		/**
@@ -691,7 +706,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * 0: dry; 1: wet; 2: soaking wet */
 		this.vaginaLube = 0;
 		/** Has vagina piercing
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.vaginaPiercing = 0;
 		/**
@@ -711,7 +726,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.vaginaTat = 0;
 		/**
 		 * pregnancy time or state.See Pregnancy Control section for more.
@@ -773,7 +788,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		this.wombImplant = "none";
 		/**
 		 * Menstrual cycle known variable. To be used for fert cycle discover and things like pregnancy without a first period
-		 *
+		 * @type {FC.Bool}
 		 * * 0: no
 		 * * 1: yes
 		 */
@@ -857,6 +872,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * 1: yes
 		 * * 2: heavy
 		 * * 3: smart
+		 * @type {FC.ClitoralPiercingType}
 		 */
 		this.clitPiercing = 0;
 		/**
@@ -877,6 +893,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "dom"
 		 * * "masochist"
 		 * * "sadist"
+		 * @type {FC.SmartPiercingSetting}
 		 */
 		this.clitSetting = "vanilla";
 		/** 0: circumcised; 1+:uncut, also affects foreskin size */
@@ -913,6 +930,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * 0: no
 		 * * 1: yes
 		 * * 2: heavy
+		 * @type {FC.PiercingType}
 		 */
 		this.dickPiercing = 0;
 		/**
@@ -932,7 +950,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.dickTat = 0;
 		/**
 		 * does the slave have a prostate?
@@ -967,11 +985,11 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 */
 		this.scrotum = 0;
 		/** Has ovaries
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.ovaries = 0;
 		/** Has anus piercing
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.anusPiercing = 0;
 		/**
@@ -990,7 +1008,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.anusTat = 0;
 		/**
 		 * has makeup
@@ -1024,19 +1042,19 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * @type {Object.<string, string>} */
 		this.brand = {};
 		/** Has pierced ears
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.earPiercing = 0;
 		/** Has pierced nose
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.nosePiercing = 0;
 		/** Has eyebrow piercing
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.eyebrowPiercing = 0;
 		/** Has navel piercing
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.navelPiercing = 0;
 		/**
@@ -1056,7 +1074,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.shouldersTat = 0;
 		/**
 		 * arm tattoo
@@ -1075,7 +1093,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.armsTat = 0;
 		/**
 		 * leg tattoo
@@ -1094,7 +1112,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 *  @type {string|number} */
+		 *  @type {FC.Zeroable<string>} */
 		this.legsTat = 0;
 		/**
 		 * back tattoo
@@ -1113,7 +1131,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.backTat = 0;
 		/**
 		 * tramp stamp
@@ -1132,12 +1150,12 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.stampTat = 0;
 		/** rules */
 		this.rules = new App.Entity.RuleState();
 		/** Follows rules or is exempt from them
-		 *
+		 * @type {FC.Bool}
 		 * 0: exempt; 1: obeys */
 		this.useRulesAssistant = 1;
 		/**
@@ -1152,6 +1170,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "cum production"
 		 * * "cleansing"
 		 * * "fertility"
+		 * @type {FC.Diet}
 		 */
 		this.diet = "healthy";
 		/** How much of her diet is cum
@@ -1202,6 +1221,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "butt redistributors"
 		 * * "sag-B-gone"
 		 * * "growth stimulants"
+		 * @type {FC.Drug}
 		 */
 		this.drugs = "no drugs";
 		/**
@@ -1220,15 +1240,15 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 */
 		this.aphrodisiacs = "none";
 		/**
-		 * TODO:
-		 * how addict to aphrodisiacs slave is
+		 * how addicted to aphrodisiacs slave is - inherited at birth
 		 * * 0: not
 		 * * 1-2: new addict
 		 * * 3-9: confirmed addict
 		 * * 10+: dependent
 		 */
 		this.addict = 0;
-		/** 0: no; 1: yes */
+		/** 0: no; 1: yes
+		 * @type {FC.Bool} */
 		this.choosesOwnClothes = 0;
 		/**
 		 * may accept strings, use at own risk
@@ -1313,18 +1333,21 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * whether the slave has a chastity device on their anus
 		 * 0 - no
 		 * 1 - yes
+		 * @type {FC.Bool}
 		 */
 		this.chastityAnus = 0;
 		/**
 		 * whether the slave has a chastity device on their penis
 		 * 0 - no
 		 * 1 - yes
+		 * @type {FC.Bool}
 		 */
 		this.chastityPenis = 0;
 		/**
 		 * whether the slave has a chastity device on their vagina
 		 * 0 - no
 		 * 1 - yes
+		 * @type {FC.Bool}
 		 */
 		this.chastityVagina = 0;
 		/**
@@ -1435,7 +1458,8 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * *if energy > 95 and either attrXX or attrXY > 95, slave will be nymphomaniac*
 		 */
 		this.attrXY = 0;
-		/** 0: no; 1: yes */
+		/** 0: no; 1: yes
+		 * @type {FC.Bool} */
 		this.attrKnown = 0;
 		/**
 		 * * "none"
@@ -1449,6 +1473,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "masochist"
 		 * * "dom"
 		 * * "pregnancy"
+		 * @type {FC.Fetish}
 		 */
 		this.fetish = "none";
 		/** How strong her fetish is (10-100)
@@ -1456,7 +1481,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * 10+: enjoys fetish; 60+: likes fetish; 95+: loves fetish */
 		this.fetishStrength = 70;
 		/** Is fetish known to player
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.fetishKnown = 0;
 		/**
@@ -1470,6 +1495,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "anorexic": dislikes eating and being forced to eat, loses weight
 		 * * "devout": resistance through religious faith
 		 * * "liberated": believes slavery is wrong
+		 * @type {FC.BehavioralFlaw}
 		 */
 		this.behavioralFlaw = "none";
 		/**
@@ -1483,6 +1509,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "insecure": defines herself on the thoughts of others
 		 * * "sinful": breaks cultural norms
 		 * * "advocate": advocates slavery
+		 * @type {FC.BehavioralQuirk}
 		 */
 		this.behavioralQuirk = "none";
 		/**
@@ -1505,6 +1532,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "malicious": loves causing pain and suffering
 		 * * "self hating": hates herself
 		 * * "breeder": addicted to being pregnant
+		 * @type {FC.SexualFlaw}
 		 */
 		this.sexualFlaw = "none";
 		/**
@@ -1518,10 +1546,12 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "caring": enjoys bring her partners to orgasm
 		 * * "unflinching": willing to do anything
 		 * * "size queen": prefers big cocks
+		 * @type {FC.SexualQuirk}
 		 */
 		this.sexualQuirk = "none";
 		/** 0: does not have; 1: carrier; 2: active
 		 * * heterochromia is an exception. String = active
+		 * @type {FC.GeneticQuirks}
 		 */
 		this.geneticQuirks = {
 			/** Oversized breasts. Increased growth rate, reduced shrink rate. Breasts try to return to oversized state if reduced. */
@@ -1538,12 +1568,23 @@ App.Facilities.Nursery.ChildState = class ChildState {
 			hyperFertility: 0,
 			/** Pregnancy does not block ovulation, slave can become pregnant even while pregnant */
 			superfetation: 0,
+			/** abnormal production of amniotic fluid
+			 *  only affects fetuses */
+			polyhydramnios: 0,
 			/** Pleasurable pregnancy and orgasmic birth. Wider hips, looser and wetter vagina. High pregadaptation and low birth damage. */
 			uterineHypersensitivity: 0,
+			/** inappropriate lactation*/
+			galactorrhea: 0,
 			/** Is abnormally tall. gigantism + dwarfism - is very average*/
 			gigantism: 0,
 			/** Is abnormally short. gigantism + dwarfism - is very average*/
 			dwarfism: 0,
+			/** retains childlike characteristics*/
+			neoteny: 0,
+			/** rapid aging
+			 *
+			 * **neoteny + progeria** - progeria wins, not that she'll make it to the point that neoteny really kicks in */
+			progeria: 0,
 			/** Has a flawless face. pFace + uFace - Depends on carrier status, may swing between average and above/below depending on it */
 			pFace: 0,
 			/** Has a hideous face. pFace + uFace - Depends on carrier status, may swing between average and above/below depending on it */
@@ -1576,7 +1617,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		/** Values provided by players */
 		this.custom = new App.Entity.ChildCustomAddonsState();
 		/** Does this slave refer to you rudely?
-		 *
+		 * @type {FC.Bool}
 		 * 0: not being rude; 1: insists on calling you a rude title */
 		this.rudeTitle = 0;
 		/** @type {string[]} */
@@ -1586,7 +1627,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "a heart"
 		 * * "a star"
 		 * * "a butterfly"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.bellyTat = 0;
 		/**
 		 * Child has a series of tattoos to denote how many abortions she has had.
@@ -1625,6 +1666,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "curative"
 		 * * "tightener"
 		 * * "urine"
+		 * @type {FC.InflationLiquid}
 		 */
 		this.inflationType = "none";
 		/**
@@ -1640,11 +1682,11 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		/** If inflationMethod 3, ID of the slave filling her with cum. */
 		this.cumSource = 0;
 		/** Child's internals have ruptured. Used with poor health and overinflation.
-		 *
+		 * @type {FC.Bool}
 		 * 1: true; 0: false */
 		this.burst = 0;
 		/** Do you and the slave know she is pregnant.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.pregKnown = 0;
 		/** How long she has been pregnant
@@ -1743,13 +1785,13 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		/** Target .physicalAge for female puberty to occur. */
 		this.pubertyAgeXX = 13;
 		/** Has the slave gone through female puberty.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.pubertyXX = 0;
 		/** Target .physicalAge for male puberty to occur. */
 		this.pubertyAgeXY = 13;
 		/** Has the slave gone through male puberty.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.pubertyXY = 0;
 		/**
@@ -1765,15 +1807,15 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		this.scars = 0;
 		/**
 		 * In a eugenics society, this slave is a designated breeder.
-		 *
+		 * @type {FC.Bool}
 		 * 1: yes; 0: no */
 		this.breedingMark = 0;
 		/**  Is the PC permitted to fuck this slave pregnant.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.PCExclude = 0;
 		/**  Is the Head Girl permitted to fuck this slave pregnant.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.HGExclude = 0;
 		/**
@@ -1784,6 +1826,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "pig"
 		 * * "horse"
 		 * * "cow"
+		 * @type {FC.SpermType}
 		 */
 		this.ballType = "human";
 		/**
@@ -1793,6 +1836,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "pig"
 		 * * "horse"
 		 * * "cow"
+		 * @type {FC.AnimalKind}
 		 */
 		this.eggType = "human";
 		/** Eugenics variable. Is the slave allowed to choose to wear chastity.
@@ -1805,6 +1849,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 * * "slow gestation"
 		 * * "speed up"
 		 * * "labor suppressors"
+		 * @type {FC.WithNone<FC.GestationDrug>}
 		 */
 		this.pregControl = "none";
 		/**
@@ -1817,7 +1862,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		/**  */
 		this.ageAdjust = 0;
 		/** Child has undergone hair removal surgery
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.bald = 0;
 		/** Child is in original body.
@@ -1849,31 +1894,31 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 */
 		this.hormoneBalance = 0;
 		/** Whether a slave is permitted to eat Hedonistic Decadence's specialized slave food.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.onDiet = 0;
 		/** Does the slave have the breast shape maintaining mesh implant.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.breastMesh = 0;
 		/** Used to denote a slave giving birth prematurely.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.prematureBirth = 0;
 		/** Was the slave born prematurely?
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.premature = 0;
 		/** Has the slave had a vasectomy?
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.vasectomy = 0;
 		/** Is the Child's hair under constant maintenance?
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.haircuts = 0;
 		/** Used to tell if the slave is from this game or a previous.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.newGamePlus = 0;
 		/** Her skills */
@@ -1882,18 +1927,26 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		 *
 		 * 0: no; 1: yes, comforting; 2: yes, terrifying */
 		this.tankBaby = 0;
-		/** */
+		/** Is the slave a clone? If so, what is the original slave's name?
+		 * @type {FC.Zeroable<string>}
+		 * 0: no; 1: yes */
 		this.clone = 0;
+		/** ID she was cloned from */
+		this.cloneID = 0;
 		/**  */
 		this.geneMods = {
 			/** Does slave have induced NCS?
-			 *
+			 * @type {FC.Bool}
 			 * 0: no; 1: yes */
 			NCS: 0,
 			/** Has the slave undergone the elasticity (plasticity) treatment?
-			 *
+			 * @type {FC.Bool}
+			 * 0: no; 1: yes */
+			rapidCellGrowth: 0,
+			/** Is the slave immortal?
+			 * @type {FC.Bool}
 			 * 0: no; 1: yes */
-			rapidCellGrowth: 0
+			immortality: 0
 		};
 		/* eslint-disable camelcase*/
 		this.NCSyouthening = 0;
diff --git a/src/npc/generate/generateGenetics.js b/src/npc/generate/generateGenetics.js
index 2d08e8ada9e42fe362c112eb67a5c16a9b8dce31..ac091e37ab16e4f9d619e15e2c83b8afb5e94f59 100644
--- a/src/npc/generate/generateGenetics.js
+++ b/src/npc/generate/generateGenetics.js
@@ -1246,8 +1246,7 @@ globalThis.generateChild = function(mother, ovum, incubator=false) {
 			child.earTColor = "hairless";
 			child.tailColor = "none";
 			child.tailShape = "none";
-		}
-		else {
+		} else {
 			child.earImplant = 1;
 			child.earShape = "none";
 			child.earT = "neko";
@@ -1319,8 +1318,7 @@ globalThis.generateChild = function(mother, ovum, incubator=false) {
 			child.earTColor = "hairless";
 			child.tailColor = "none";
 			child.tailShape = "none";
-		}
-		else {
+		} else {
 			child.earImplant = 1;
 			child.earShape = "none";
 			child.earT = "neko";
diff --git a/src/npc/infants/InfantState.js b/src/npc/infants/InfantState.js
index 59c599c4ef890e0b9cc10efca5585196b13634ba..01f76e0fd2f99f4ec17a72acd8ee97366c509f5b 100644
--- a/src/npc/infants/InfantState.js
+++ b/src/npc/infants/InfantState.js
@@ -4,17 +4,21 @@
  */
 App.Facilities.Nursery.InfantState = class InfantState {
 	constructor() {
-		/** Child's current name */
+		/** Child's current name
+		 * @type {FC.Zeroable<string>} */
 		this.slaveName = "blank";
 		/** Child's current surname
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.slaveSurname = 0;
+		/** @type {FC.GenderGenes} */
 		this.genes = "XX";
 		this.pronoun = App.Data.Pronouns.Kind.female;
 		/** game week child was acquired.
 		 *
 		 * _0: Obtained prior to game start / at game start_ */
 		this.weekAcquired = 0;
+		/** Child's ID */
+		this.ID = 0;
 		this.father = 0;
 		this.mother = 0;
 		this.daughters = 0;
@@ -27,16 +31,18 @@ App.Facilities.Nursery.InfantState = class InfantState {
 		this.visualAge = 18;
 		/** How old her body is. */
 		this.physicalAge = 18;
-		/** child's race */
+		/** child's race
+		 * @type {FC.Race} */
 		this.race = "white";
 		/** child's nationality */
-		this.nationality = "Stateless";
+		this.nationality = "slave";
 		/**
 		 * child markings
 		 * * "beauty mark"
 		 * * "birthmark"
 		 * * "freckles"
 		 * * "heavily freckled"
+		 * @type {FC.Markings}
 		 */
 		this.markings = "none";
 		/**
@@ -81,6 +87,14 @@ App.Facilities.Nursery.InfantState = class InfantState {
 		 * * "feline" (catmod exclusive content)
 		 */
 		this.faceShape = "normal";
+		/**
+		 * how addicted to aphrodisiacs slave is - inherited at birth
+		 * * 0: not
+		 * * 1-2: new addict
+		 * * 3-9: confirmed addict
+		 * * 10+: dependent
+		 */
+		this.addict = 0;
 		/**
 		 * child intelligence
 		 * * -100 - -96: borderline retarded
@@ -104,6 +118,7 @@ App.Facilities.Nursery.InfantState = class InfantState {
 		 * * "masochist"
 		 * * "dom"
 		 * * "pregnancy"
+		 * @type {FC.Fetish}
 		 */
 		this.fetish = "none";
 		/**
@@ -117,6 +132,7 @@ App.Facilities.Nursery.InfantState = class InfantState {
 		 * * "anorexic": dislikes eating and being forced to eat, loses weight
 		 * * "devout": resistance through religious faith
 		 * * "liberated": believes slavery is wrong
+		 * @type {FC.BehavioralFlaw}
 		 */
 		this.behavioralFlaw = "none";
 		/**
@@ -139,10 +155,12 @@ App.Facilities.Nursery.InfantState = class InfantState {
 		 * * "malicious": loves causing pain and suffering
 		 * * "self hating": hates herself
 		 * * "breeder": addicted to being pregnant
+		 * @type {FC.SexualFlaw}
 		 */
 		this.sexualFlaw = "none";
 		/** 0: does not have; 1: carrier; 2: active
 		 * * heterochromia is an exception. String = active
+		 * @type {FC.GeneticQuirks}
 		 */
 		this.geneticQuirks = {
 			/** Oversized breasts. Increased growth rate, reduced shrink rate. Breasts try to return to oversized state if reduced. */
@@ -159,12 +177,23 @@ App.Facilities.Nursery.InfantState = class InfantState {
 			hyperFertility: 0,
 			/** pregnancy does not block ovulation, child can become pregnant even while pregnant */
 			superfetation: 0,
+			/** abnormal production of amniotic fluid
+			 *  only affects fetuses */
+			polyhydramnios: 0,
 			/** Pleasurable pregnancy and orgasmic birth. Wider hips, looser and wetter vagina. High pregadaptation and low birth damage. */
 			uterineHypersensitivity: 0,
-			/** is abnormally tall. gigantism + dwarfism - is very average*/
+			/** inappropriate lactation*/
+			galactorrhea: 0,
+			/** Is abnormally tall. gigantism + dwarfism - is very average*/
 			gigantism: 0,
-			/** is abnormally short. gigantism + dwarfism - is very average*/
+			/** Is abnormally short. gigantism + dwarfism - is very average*/
 			dwarfism: 0,
+			/** retains childlike characteristics*/
+			neoteny: 0,
+			/** rapid aging
+			 *
+			 * **neoteny + progeria** - progeria wins, not that she'll make it to the point that neoteny really kicks in */
+			progeria: 0,
 			/** has a flawless face. pFace + uFace - Depends on carrier status, may swing between average and above/below depending on it */
 			pFace: 0,
 			/** has a hideous face. pFace + uFace - Depends on carrier status, may swing between average and above/below depending on it */
@@ -183,6 +212,10 @@ App.Facilities.Nursery.InfantState = class InfantState {
 			wLoss: 0,
 			/** body attempts to normalize to an androgynous state */
 			androgyny: 0,
+			/** Constantly gains muscle mass, easier to gain muscle. mGain + mLoss - muscle gain/loss amplified, passively lose muscle unless building */
+			mGain: 0,
+			/** Constantly loses muscle mass, easier to gain muscle. mGain + mLoss - muscle gain/loss amplified, passively lose muscle unless building */
+			mLoss: 0,
 			/** child can only ever birth girls */
 			girlsOnly: 0
 		};
@@ -190,6 +223,18 @@ App.Facilities.Nursery.InfantState = class InfantState {
 		this.spermY = 50;
 		/** how many weeks until the child is ready for release */
 		this.growTime = 156;
+		/** Was the slave born prematurely?
+		 * @type {FC.Bool}
+		 * 0: no; 1: yes */
+		this.premature = 0;
+		/** Is the slave a clone? If so, what is the original slave's name?
+		 * @type {FC.Zeroable<string>}
+		 * 0: no; 1: yes */
+		this.clone = 0;
+		/** ID she was cloned from */
+		this.cloneID = 0;
+		/** @type {{skin:string, eyeColor:string, hColor:string}} */
+		this.albinismOverride = null;
 		/** Slave's inbreeding coefficient */
 		this.inbreedingCoeff = 0;
 	}
diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js
index 37909030c9ef0ab37613e3559b2a58bc5692b25a..19771fff92a825753109e9dad2715b193360cb49 100644
--- a/src/player/js/PlayerState.js
+++ b/src/player/js/PlayerState.js
@@ -246,12 +246,12 @@ App.Entity.PlayerState = class PlayerState {
 		/** Player's current name */
 		this.slaveName = "Anonymous";
 		/** Player's current surname
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.slaveSurname = 0;
 		/** Player's original name */
 		this.birthName = "Anonymous";
 		/** Player's original surname
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.birthSurname = "";
 		/** Player sex ("XX", "XY")
 		 * @type {FC.GenderGenes} */
@@ -323,7 +323,7 @@ App.Entity.PlayerState = class PlayerState {
 		/** Player's prestige */
 		this.prestige = 0;
 		/** reason for prestige
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.prestigeDesc = 0;
 		this.relationships = new App.Entity.PlayerRelationshipsState();
 		this.father = 0;
@@ -340,7 +340,8 @@ App.Entity.PlayerState = class PlayerState {
 		this.physicalAge = 35;
 		/** How old your ovaries are. (used to trick menopause) */
 		this.ovaryAge = 35;
-		/** has had facial surgery to reduce age. 0: no, 1: yes */
+		/** has had facial surgery to reduce age. 0: no, 1: yes
+ 		 * @type {FC.Bool} */
 		this.ageImplant = 0;
 		/** compatibility **/
 		this.devotion = 0;
@@ -382,7 +383,7 @@ App.Entity.PlayerState = class PlayerState {
 		};
 		/**
 		 * you have a minor injury ("black eye", "bruise", "split lip")
-		 * @type {number | string}
+		 * @type {FC.MinorInjury}
 		 */
 		this.minorInjury = 0;
 		/**
@@ -439,6 +440,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "birthmark"
 		 * * "freckles"
 		 * * "heavily freckled"
+		 * @type {FC.Markings}
 		 */
 		this.markings = "none";
 		/** "none", "glasses", "corrective glasses", "corrective contacts" */
@@ -448,12 +450,13 @@ App.Entity.PlayerState = class PlayerState {
 		 */
 		this.eye = new App.Entity.PlayerEyeState();
 		/** your hearing
-		 *
+		 * @type {FC.Hearing}
 		 * -2: deaf; -1: hard of hearing; 0: normal */
 		this.hears = 0;
 		/** "none", "hearing aids", "muffling ear plugs", "deafening ear plugs" */
 		this.earwear = "none";
 		/** is there an inner ear implant device
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.earImplant = 0;
 		/** the shape of your outer ears
@@ -522,6 +525,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "tapered"
 		 * * "thick"
 		 * * "bushy"
+		 * @type {FC.EyebrowThickness}
 		 */
 		this.eyebrowFullness = "natural";
 		/** hair style */
@@ -543,7 +547,8 @@ App.Entity.PlayerState = class PlayerState {
 		 * * -96-: absurd
 		 */
 		this.waist = 0;
-		/** series of rings up the back that can be tied together. 0: no, 1: yes */
+		/** series of rings up the back that can be tied together. 0: no, 1: yes
+ 		 * @type {FC.Bool} */
 		this.corsetPiercing = 0;
 		/**
 		 * What level of prosthetic interface you have installed
@@ -567,7 +572,7 @@ App.Entity.PlayerState = class PlayerState {
 			right: new App.Entity.LimbState()
 		};
 		/** are your heels clipped
-		 *
+		 * @type {FC.Bool}
 		 * 0: no, 1: yes */
 		this.heels = 0;
 		/** your voice
@@ -579,7 +584,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * 0: no; 1: yes, high; -1: yes, low */
 		this.voiceImplant = 0;
 		/** have cybernetic voicebox
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.electrolarynx = 0;
 		/**
@@ -665,6 +670,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "fillable"
 		 * * "advanced fillable"
 		 * * "hyper fillable"
+		 * @type {FC.SizingImplantType}
 		 */
 		this.boobsImplantType = "none";
 		/**
@@ -675,6 +681,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "torpedo-shaped"
 		 * * "downward-facing"
 		 * * "wide-set"
+		 * @type {FC.BreastShape}
 		 */
 		this.boobShape = "perky";
 		/**
@@ -686,11 +693,12 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "cute"
 		 * * "partially inverted"
 		 * * "fuckable"
+		 * @type {FC.NippleShape}
 		 */
 		this.nipples = "cute";
 		/**
 		 * nipple are pierced
-		 * @default 0
+		 * @type {FC.PiercingType}
 		 * 0: none; 1: yes; 2: heavily */
 		this.nipplesPiercing = 0;
 		/** what accessory, if any, are on your nipples */
@@ -700,7 +708,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * 0: normal; 1: large; 2: unusually wide; 3: huge, 4: massive */
 		this.areolae = 0;
 		/** edge of areolae are pierced
-		 * @default 0
+		 * @type {FC.PiercingType}
 		 * 0: none; 1: yes; 2: heavy */
 		this.areolaePiercing = 0;
 		/** your areolae shape ("heart"; "star"; "circle") */
@@ -720,7 +728,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string | number}
+		 * @type {FC.Zeroable<string>}
 		 */
 		this.boobsTat = 0;
 		/** your lactation
@@ -789,7 +797,8 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "fillable"
 		 * * "advanced fillable"
 		 * * "hyper fillable"
-		 */
+ 		 * @type {FC.SizingImplantType}
+ 		 */
 		this.buttImplantType = "none";
 		/**
 		 * butt tattoo
@@ -808,7 +817,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.buttTat = 0;
 		/**
 		 * face attractiveness
@@ -859,7 +868,7 @@ App.Entity.PlayerState = class PlayerState {
 		this.lipsImplant = 0;
 		/**
 		 * lips pierced
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.lipsPiercing = 0;
 		/**
@@ -878,7 +887,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.lipsTat = 0;
 		/**
 		 * teeth type
@@ -890,11 +899,12 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "pointy"
 		 * * "baby"
 		 * * "mixed"
+		 * @type {FC.TeethType}
 		 */
 		this.teeth = "normal";
 		/**
 		 * have tongue piercing
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.tonguePiercing = 0;
 		/**
@@ -909,7 +919,7 @@ App.Entity.PlayerState = class PlayerState {
 		 */
 		this.vagina = -1;
 		/** have has your vagina improved
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes; */
 		this.newVag = 0;
 		/** exclusive variable
@@ -918,7 +928,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * 0: dry; 1: wet; 2: soaking wet */
 		this.vaginaLube = 0;
 		/** have vagina piercing
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.vaginaPiercing = 0;
 		/**
@@ -938,7 +948,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.vaginaTat = 0;
 		/**
 		 * pregnancy time or state.See Pregnancy Control section for more.
@@ -1012,7 +1022,7 @@ App.Entity.PlayerState = class PlayerState {
 		this.wombImplant = "none";
 		/**
 		 * Menstrual cycle known variable. To be used for fert cycle discover and things like pregnancy without a first period
-		 *
+		 * @type {FC.Bool}
 		 * * 0: no
 		 * * 1: yes
 		 */
@@ -1097,6 +1107,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * 1: yes
 		 * * 2: heavy
 		 * * 3: smart
+		 * @type {FC.ClitoralPiercingType}
 		 */
 		this.clitPiercing = 0;
 		/** 0: circumcised; 1+:uncut, also affects foreskin size */
@@ -1133,6 +1144,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * 0: no
 		 * * 1: yes
 		 * * 2: heavy
+		 * @type {FC.PiercingType}
 		 */
 		this.dickPiercing = 0;
 		/**
@@ -1152,7 +1164,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.dickTat = 0;
 		/**
 		 * does the slave have a prostate?
@@ -1192,11 +1204,11 @@ App.Entity.PlayerState = class PlayerState {
 		 */
 		this.scrotum = 4;
 		/** has ovaries
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.ovaries = 0;
 		/** has anus piercing
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.anusPiercing = 0;
 		/**
@@ -1215,7 +1227,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.anusTat = 0;
 		/**
 		 * has makeup
@@ -1250,19 +1262,19 @@ App.Entity.PlayerState = class PlayerState {
 		 * @type {Object.<string, string>} */
 		this.brand = {};
 		/** has pierced ears
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.earPiercing = 0;
 		/** has pierced nose
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.nosePiercing = 0;
 		/** has eyebrow piercing
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.eyebrowPiercing = 0;
 		/** has navel piercing
-		 *
+		 * @type {FC.PiercingType}
 		 * 0: no; 1: yes; 2: heavy */
 		this.navelPiercing = 0;
 		/**
@@ -1282,7 +1294,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.shouldersTat = 0;
 		/**
 		 * arm tattoo
@@ -1301,7 +1313,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.armsTat = 0;
 		/**
 		 * leg tattoo
@@ -1320,7 +1332,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.legsTat = 0;
 		/**
 		 * back tattoo
@@ -1339,7 +1351,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.backTat = 0;
 		/**
 		 * tramp stamp
@@ -1358,7 +1370,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "Sacrilege"
 		 * * "Possessive"
 		 * * "Paternalist"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.stampTat = 0;
 		/**
 		 * * "healthy"
@@ -1372,6 +1384,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "cum production"
 		 * * "cleansing"
 		 * * "fertility"
+		 * @type {FC.Diet}
 		 */
 		this.diet = "healthy";
 		/**
@@ -1450,18 +1463,21 @@ App.Entity.PlayerState = class PlayerState {
 		 * whether the slave has a chastity device on their anus
 		 * 0 - no
 		 * 1 - yes
+		 * @type {FC.Bool}
 		 */
 		this.chastityAnus = 0;
 		/**
 		 * whether the slave has a chastity device on their penis
 		 * 0 - no
 		 * 1 - yes
+		 * @type {FC.Bool}
 		 */
 		this.chastityPenis = 0;
 		/**
 		 * whether the slave has a chastity device on their vagina
 		 * 0 - no
 		 * 1 - yes
+		 * @type {FC.Bool}
 		 */
 		this.chastityVagina = 0;
 		/**
@@ -1601,6 +1617,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "masochist"
 		 * * "dom"
 		 * * "pregnancy"
+		 * @type {FC.Fetish}
 		 */
 		this.fetish = "none";
 		/** how strong your fetish is (10-100)
@@ -1618,6 +1635,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "anorexic": dislikes eating and being forced to eat, loses weight
 		 * * "devout": resistance through religious faith
 		 * * "liberated": believes slavery is wrong
+		 * @type {FC.BehavioralFlaw}
 		 */
 		this.behavioralFlaw = "none";
 		/**
@@ -1631,6 +1649,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "insecure": defines herself on the thoughts of others
 		 * * "sinful": breaks cultural norms
 		 * * "advocate": advocates slavery
+		 * @type {FC.BehavioralQuirk}
 		 */
 		this.behavioralQuirk = "none";
 		/**
@@ -1653,6 +1672,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "malicious": loves causing pain and suffering
 		 * * "self hating": hates herself
 		 * * "breeder": addicted to being pregnant
+		 * @type {FC.SexualFlaw}
 		 */
 		this.sexualFlaw = "none";
 		/**
@@ -1666,6 +1686,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "caring": enjoys bring her partners to orgasm
 		 * * "unflinching": willing to do anything
 		 * * "size queen": prefers big cocks
+		 * @type {FC.SexualQuirk}
 		 */
 		this.sexualQuirk = "none";
 		/** 0: does not have; 1: carrier; 2: active
@@ -1740,7 +1761,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "a heart"
 		 * * "a star"
 		 * * "a butterfly"
-		 * @type {string|number} */
+		 * @type {FC.Zeroable<string>} */
 		this.bellyTat = 0;
 		/**
 		 * You have a series of tattoos to denote how many abortions you've had.
@@ -1757,11 +1778,11 @@ App.Entity.PlayerState = class PlayerState {
 		 */
 		this.birthsTat = -1;
 		/** You will give birth this week.
-		 *
+		 * @type {FC.Bool}
 		 * 1: true; 0: false */
 		this.induce = 0;
 		/** You have an anal womb and can get pregnant.
-		 *
+		 * @type {FC.Bool}
 		 * 1: true; 0: false */
 		this.mpreg = 0;
 		/** How much fluid is distending your middle.
@@ -1794,11 +1815,11 @@ App.Entity.PlayerState = class PlayerState {
 		/** If inflationMethod 3, ID of the slave filling you with cum. */
 		this.cumSource = 0;
 		/** Your internals have ruptured. Used with poor health and overinflation.
-		 *
+		 * @type {FC.Bool}
 		 * 1: true; 0: false */
 		this.burst = 0;
 		/** Do you know you are pregnant.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.pregKnown = 0;
 		/** How long you have been pregnant
@@ -1897,13 +1918,13 @@ App.Entity.PlayerState = class PlayerState {
 		/** Target .physicalAge for female puberty to occur. */
 		this.pubertyAgeXX = 13;
 		/** Have you gone through female puberty.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.pubertyXX = 1;
 		/** Target .physicalAge for male puberty to occur. */
 		this.pubertyAgeXY = 13;
 		/** Have you slave gone through male puberty.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.pubertyXY = 1;
 		/**
@@ -1915,7 +1936,7 @@ App.Entity.PlayerState = class PlayerState {
 		this.scar = {};
 		/**
 		 * In a eugenics society, you are a designated breeder.
-		 *
+		 * @type {FC.Bool}
 		 * 1: yes; 0: no */
 		this.breedingMark = 0;
 		/**
@@ -1926,6 +1947,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "pig"
 		 * * "horse"
 		 * * "cow"
+		 * @type {FC.SpermType}
 		 */
 		this.ballType = "human";
 		/**
@@ -1935,12 +1957,13 @@ App.Entity.PlayerState = class PlayerState {
 		 * * "pig"
 		 * * "horse"
 		 * * "cow"
+		 * @type {FC.AnimalKind}
 		 */
 		this.eggType = "human";
 		/** */
 		this.ageAdjust = 0;
 		/** You are bald
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.bald = 0;
 		/** You are in your original body.
@@ -1970,19 +1993,19 @@ App.Entity.PlayerState = class PlayerState {
 		 */
 		this.hormoneBalance = 0;
 		/** Do you have the breast shape maintaining mesh implant.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.breastMesh = 0;
 		/** Used to denote you are giving birth prematurely.
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.prematureBirth = 0;
 		/** Were you born prematurely?
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.premature = 0;
 		/** Have you had a vasectomy?
-		 *
+		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
 		this.vasectomy = 0;
 		/** Your skills */
@@ -1999,15 +2022,15 @@ App.Entity.PlayerState = class PlayerState {
 		/** */
 		this.geneMods = {
 			/** Do you have induced NCS?
-			 *
+			 * @type {FC.Bool}
 			 * 0: no; 1: yes */
 			NCS: 0,
 			/** Have you undergone the elasticity (plasticity) treatment?
-			 *
+			 * @type {FC.Bool}
 			 * 0: no; 1: yes */
 			rapidCellGrowth: 0,
 			/** Are you immortal?
-			 *
+			 * @type {FC.Bool}
 			 * 0: no; 1: yes */
 			immortality: 0
 		};