diff --git a/devTools/FC.d.ts b/devTools/FC.d.ts
index b7c8bba5af347186763c1e01580cbb1251250b37..8a570c30a6217226617d1415c0615415f8522b1b 100644
--- a/devTools/FC.d.ts
+++ b/devTools/FC.d.ts
@@ -345,11 +345,192 @@ declare namespace FC {
 	// black magic to make TypeScript understand that App.Entity.SlaveState is a type
 	type SlaveState = InstanceType<typeof App.Entity.SlaveState>;
 
-	enum NoSlave {
-		value = 0
+	type FSPolicy = number | "unset";
+
+	interface ArcologyState {
+		name: string;
+		direction: number;
+		government: string;
+		leaderID: number;
+		honeymoon: number;
+		prosperity: number;
+		ownership: number;
+		minority: number;
+		PCminority: number;
+		demandFactor: number;
+		FSSupremacist: FSPolicy;
+		FSSupremacistRace: FSPolicy;
+		FSSubjugationist: FSPolicy;
+		FSSubjugationistRace: FSPolicy;
+		FSGenderRadicalist: FSPolicy;
+		FSGenderFundamentalist: FSPolicy;
+		FSPaternalist: FSPolicy;
+		FSDegradationist: FSPolicy;
+		FSBodyPurist: FSPolicy;
+		FSTransformationFetishist: FSPolicy;
+		FSYouthPreferentialist: FSPolicy;
+		FSMaturityPreferentialist: FSPolicy;
+		FSSlimnessEnthusiast: FSPolicy;
+		FSAssetExpansionist: FSPolicy;
+		FSPastoralist: FSPolicy;
+		FSPhysicalIdealist: FSPolicy;
+		FSChattelReligionist: FSPolicy;
+		FSRomanRevivalist: FSPolicy;
+		FSAztecRevivalist: FSPolicy;
+		FSEgyptianRevivalist: FSPolicy;
+		FSEdoRevivalist: FSPolicy;
+		FSArabianRevivalist: FSPolicy;
+		FSChineseRevivalist: FSPolicy;
+		FSNull: FSPolicy;
+		embargo: number;
+		embargoTarget: number;
+		influenceTarget: number;
+		influenceBonus: number;
+		CyberEconomic: number;
+		CyberEconomicTarget: number;
+		CyberReputation: number;
+		CyberReputationTarget: number;
+		rival: number;
+		FSRestart: FSPolicy;
+		FSRepopulationFocus: FSPolicy;
+		FSHedonisticDecadence: FSPolicy;
+		FSIntellectualDependency: FSPolicy;
+		FSSlaveProfessionalism: FSPolicy;
+		FSPetiteAdmiration: FSPolicy;
+		FSStatuesqueGlorification: FSPolicy;
+		FSCummunism: FSPolicy;
+		FSIncestFetishist: FSPolicy;
+		FSGenderRadicalistResearch: number;
+		FSGenderFundamentalistResearch: number;
+		FSPaternalistResearch: number;
+		FSDegradationistResearch: number;
+		FSBodyPuristResearch: number;
+		FSTransformationFetishistResearch: number;
+		FSYouthPreferentialistResearch: number;
+		FSMaturityPreferentialistResearch: number;
+		FSSlimnessEnthusiastResearch: number;
+		FSAssetExpansionistResearch: number;
+		FSPastoralistResearch: number;
+		FSPhysicalIdealistResearch: number;
+		FSRepopulationFocusResearch: number;
+		FSRestartResearch: number;
+		FSHedonisticDecadenceResearch: number;
+		FSHedonisticDecadenceDietResearch: number;
+		FSIntellectualDependencyResearch: number;
+		FSSlaveProfessionalismResearch: number;
+		FSPetiteAdmirationResearch: number;
+		FSStatuesqueGlorificationResearch: number;
+		FSCummunismResearch: number;
+		FSIncestFetishistResearch: number;
+		FSSupremacistDecoration: number;
+		FSSubjugationistDecoration: number;
+		FSGenderRadicalistDecoration: number;
+		FSGenderFundamentalistDecoration: number;
+		FSPaternalistDecoration: number;
+		FSDegradationistDecoration: number;
+		FSBodyPuristDecoration: number;
+		FSTransformationFetishistDecoration: number;
+		FSYouthPreferentialistDecoration: number;
+		FSMaturityPreferentialistDecoration: number;
+		FSSlimnessEnthusiastDecoration: number;
+		FSAssetExpansionistDecoration: number;
+		FSPastoralistDecoration: number;
+		FSPhysicalIdealistDecoration: number;
+		FSChattelReligionistDecoration: number;
+		FSRomanRevivalistDecoration: number;
+		FSAztecRevivalistDecoration: number;
+		FSEgyptianRevivalistDecoration: number;
+		FSEdoRevivalistDecoration: number;
+		FSArabianRevivalistDecoration: number;
+		FSChineseRevivalistDecoration: number;
+		FSRepopulationFocusDecoration: number;
+		FSRestartDecoration: number;
+		FSHedonisticDecadenceDecoration: number;
+		FSIntellectualDependencyDecoration: number;
+		FSSlaveProfessionalismDecoration: number;
+		FSPetiteAdmirationDecoration: number;
+		FSStatuesqueGlorificationDecoration: number;
+		FSCummunismDecoration: number;
+		FSIncestFetishistDecoration: number;
+		FSSupremacistLawME: number;
+		FSSupremacistSMR: number;
+		FSSubjugationistLawME: number;
+		FSSubjugationistSMR: number;
+		FSGenderRadicalistLawFuta: number;
+		FSGenderRadicalistLawBeauty: number;
+		FSGenderFundamentalistLawBimbo: number;
+		FSGenderFundamentalistSMR: number;
+		FSGenderFundamentalistLawBeauty: number;
+		FSPaternalistLaw: number;
+		FSPaternalistSMR: number;
+		FSDegradationistLaw: number;
+		FSDegradationistSMR: number;
+		FSBodyPuristLaw: number;
+		FSBodyPuristSMR: number;
+		FSTransformationFetishistSMR: number;
+		FSYouthPreferentialistLaw: number;
+		FSYouthPreferentialistSMR: number;
+		FSMaturityPreferentialistLaw: number;
+		FSMaturityPreferentialistSMR: number;
+		FSSlimnessEnthusiastSMR: number;
+		FSSlimnessEnthusiastLaw: number;
+		FSAssetExpansionistSMR: number;
+		FSPastoralistLaw: number;
+		FSPastoralistSMR: number;
+		FSPhysicalIdealistSMR: number;
+		FSPhysicalIdealistLaw: number;
+		FSPhysicalIdealistStrongFat: number;
+		FSChattelReligionistLaw: number;
+		FSChattelReligionistSMR: number;
+		FSChattelReligionistCreed: number;
+		FSRomanRevivalistLaw: number;
+		FSRomanRevivalistSMR: number;
+		FSAztecRevivalistLaw: number;
+		FSAztecRevivalistSMR: number;
+		FSEgyptianRevivalistLaw: number;
+		FSEgyptianRevivalistSMR: number;
+		FSEdoRevivalistLaw: number;
+		FSEdoRevivalistSMR: number;
+		FSArabianRevivalistLaw: number;
+		FSArabianRevivalistSMR: number;
+		FSChineseRevivalistLaw: number;
+		FSChineseRevivalistSMR: number;
+		FSRepopulationFocusLaw: number;
+		FSRepopulationFocusSMR: number;
+		FSRestartLaw: number;
+		FSRestartSMR: number;
+		FSHedonisticDecadenceLaw: number;
+		FSHedonisticDecadenceLaw2: number;
+		FSHedonisticDecadenceStrongFat: number;
+		FSHedonisticDecadenceSMR: number;
+		FSIntellectualDependencyLaw: number;
+		FSIntellectualDependencyLawBeauty: number;
+		FSIntellectualDependencySMR: number;
+		FSSlaveProfessionalismLaw: number;
+		FSSlaveProfessionalismSMR: number;
+		FSPetiteAdmirationLaw: number;
+		FSPetiteAdmirationLaw2: number;
+		FSPetiteAdmirationSMR: number;
+		FSStatuesqueGlorificationLaw: number;
+		FSStatuesqueGlorificationLaw2: number;
+		FSStatuesqueGlorificationSMR: number;
+		FSRestartResearchPassed: number;
+		FSEgyptianRevivalistIncestPolicy: number;
+		FSEgyptianRevivalistInterest: number;
+		FSRepopulationFocusPregPolicy: number;
+		FSRepopulationFocusMilfPolicy: number;
+		FSRepopulationFocusInterest: number;
+		FSEugenicsChastityPolicy: number;
+		FSEugenicsSterilizationPolicy: number;
+		FSEugenicsInterest: number;
+		childhoodFertilityInducedNCSResearch: number;
+		hackingEconomic: number;
+		hackingEconomicTarget: number;
+		hackingReputationTarget: number;
+		hackingReputation: number;
 	}
 
-	type SlaveStateOrZero = SlaveState | NoSlave;
+	type SlaveStateOrZero = SlaveState | 0;
 
 	type DefaultGameStateVariables = typeof App.Data.defaultGameStateVariables;
 	type ResetOnNGPVariables = typeof App.Data.resetOnNGPlus;
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index ab9f61c9c0ceabad1afcf5c84b22df9fad874178..f8a874ca32a346d390341dc6c2119047d06965b0 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -574,17 +574,20 @@ App.Data.resetOnNGPlus = {
 	rulesCost: 0,
 	modCost: 0,
 	surgeryCost: 0,
+	/** @type {FC.ArcologyState[]} */
 	arcologies: [],
 	HackingSkillMultiplier: 0,
 	upgradeMultiplierArcology: 0,
 	upgradeMultiplierMedicine: 0,
 	upgradeMultiplierTrade: 0,
 	nationalities: {},
+	/** @type {Object.<string, number[]>} */
 	JobIDArray: {},
 	averageTrust: 0,
 	averageDevotion: 0,
 	enduringTrust: 0,
 	enduringDevotion: 0,
+	/** @type {App.RA.Rule[]} */
 	defaultRules: [],
 
 	REFeminizationCheckinIDs: [],
@@ -1012,7 +1015,7 @@ App.Data.resetOnNGPlus = {
 
 	weddingPlanned: 0,
 	personalAttention: "sex",
-	/** @type {FC.SlaveStateOrZero} */
+	/** @type {FC.SlaveStateOrZero}  */
 	HeadGirl: 0,
 	HGTimeInGrade: 0,
 	HGEnergy: 0,
diff --git a/src/js/assayJS.js b/src/js/assayJS.js
index 7d14770af206a9f0a9c9e452f7d6c198a9d9451e..7952797bbcd4cf793cf957f87ac255ac0f22a2f7 100644
--- a/src/js/assayJS.js
+++ b/src/js/assayJS.js
@@ -239,7 +239,7 @@ globalThis.newSlave = function(slave) {
 	/* special case for dulling intelligence via drugs in slave acquisition */
 	if (slave.dullIntelligence) {
 		slave.intelligence = -100;
-		slave.dullIntelligence = null;
+		delete slave.dullIntelligence;
 	}
 
 	if (slave.assignment) {
diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js
index 3f763f9f18a1beb3884f3ecb643bfab68675d7bf..8d8c6e232db9e6930e95caababa6ba48dddefa3a 100644
--- a/src/js/slaveSummaryHelpers.js
+++ b/src/js/slaveSummaryHelpers.js
@@ -191,9 +191,13 @@ App.UI.SlaveSummaryImpl = function() {
 			return s.charAt(0).toUpperCase() + s.charAt(1) + s.charAt(2);
 		}
 
+		/**
+		 * @param {FC.ArcologyState} arcology
+		 */
 		function syncFSData(arcology) {
 			arcology = arcology || V.arcologies[0];
 			for (const fsp of App.Data.misc.FutureSocieties) {
+				/** @type {FC.FSPolicy} */
 				const policy = arcology[fsp];
 				const p = fsp.slice(2);
 				FSData.policy[p] = {
diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js
index 9ad2c095648f8c4bcae5fc6cd06ac1b37f18401f..a4e164f4b5b78184c147bd750533030f89995935 100644
--- a/src/js/statsChecker/statsChecker.js
+++ b/src/js/statsChecker/statsChecker.js
@@ -38,7 +38,7 @@ globalThis.SlaveStatsChecker = (function() {
 
 	/* call as SlaveStatsChecker.checkForLisp() */
 	function hasLisp(slave) {
-		if (State.variables.disableLisping === 1 || !canTalk(slave)) {
+		if (V.disableLisping === 1 || !canTalk(slave)) {
 			return false;
 		}
 		return (slave.lips > 70 || (slave.lipsPiercing + slave.tonguePiercing > 2) || slave.teeth === "gapped");
@@ -245,7 +245,7 @@ globalThis.SlaveStatsChecker = (function() {
  */
 globalThis.isSlim = function(slave) {
 	let slim = false;
-	const ArcologyZero = State.variables.arcologies[0];
+	const ArcologyZero = V.arcologies[0];
 
 	if (ArcologyZero.FSSlimnessEnthusiastLaw === 1) {
 		return (slimLawPass(slave) === 1);
diff --git a/src/js/utilsFC.js b/src/js/utilsFC.js
index f4de4b5aab932f2d16c346a8e5e2d3c7cce5dca1..f9755534ef33b849004afefcc3cfa70dea41fa7a 100644
--- a/src/js/utilsFC.js
+++ b/src/js/utilsFC.js
@@ -647,9 +647,9 @@ globalThis.Height = (function() {
 
 	/**
 	 * @param {string|{nationality: string, race: string, genes: string, physicalAge: number, birthWeek: number}} nationality
-	 * @param {string} race
-	 * @param {string} genes
-	 * @param {number} age
+	 * @param {string} [race]
+	 * @param {string} [genes]
+	 * @param {number} [age]
 	 * @returns {number}
 	 */
 	const _meanHeight = function(nationality, race, genes, age) {