diff --git a/devNotes/twine JS.txt b/devNotes/twine JS.txt
index 80cd464ea9020e74152972e8757df4bbc9973d25..7f3701b0f2663f354641df22c30765758ca6ab38 100644
--- a/devNotes/twine JS.txt	
+++ b/devNotes/twine JS.txt	
@@ -29286,50 +29286,6 @@ window.GetVignette = function GetVignette(slave) {
 
 /*:: Slave Generation JS [script]*/
 
-window.generateAge = function generateAge(slave) {
-	const V = State.variables;
-
-	if (V.activeSlaveOneTimeMaxAge > 998) {
-		V.activeSlaveOneTimeMaxAge = (V.pedo_mode === 1) ? 18 : 42;
-	} else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0 && V.activeSlaveOneTimeMaxAge > 18) {
-		V.activeSlaveOneTimeMaxAge = 18;
-	}
-	if (V.retirementAge < V.activeSlaveOneTimeMaxAge) {
-		V.activeSlaveOneTimeMaxAge = (V.retirementAge - 1);
-	}
-	if (V.activeSlaveOneTimeMinAge < V.minimumSlaveAge) {
-		V.activeSlaveOneTimeMinAge = V.minimumSlaveAge;
-	} else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0) {
-		V.activeSlaveOneTimeMinAge = V.minimumSlaveAge;
-	}
-	if (V.activeSlaveOneTimeMaxAge < V.activeSlaveOneTimeMinAge) {
-		V.activeSlaveOneTimeMaxAge = V.activeSlaveOneTimeMinAge;
-	}
-	if (V.activeSlaveOneTimeMaxAge >= 30 && V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.ageAdjustOverride !== 1) {
-		V.activeSlaveOneTimeMaxAge += 10;
-	}
-	slave.actualAge = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge);
-	const secondAgeRoll = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge);
-	if (V.arcologies[0].FSYouthPreferentialist !== "unset" && V.arcologies[0].FSYouthPreferentialist >= jsRandom(1, 100)) {
-		slave.actualAge = Math.min(slave.actualAge, secondAgeRoll);
-	} else if (V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.arcologies[0].FSMaturityPreferentialist >= jsRandom(1, 100)) {
-		slave.actualAge = Math.max(slave.actualAge, secondAgeRoll);
-	}
-	if (slave.actualAge >= V.retirementAge) {
-		slave.actualAge = (V.retirementAge - 2);
-	}
-	V.activeSlaveOneTimeMinAge = 0;
-	V.activeSlaveOneTimeMaxAge = 999;
-	V.one_time_age_overrides_pedo_mode = 0;
-	V.ageAdjustOverride = 0;
-	slave.visualAge = slave.actualAge;
-	slave.physicalAge = slave.actualAge;
-	slave.ovaryAge = slave.actualAge;
-	slave.age = slave.actualAge; /*compatibility*/
-	slave.pubertyAgeXX = V.fertilityAge;
-	slave.pubertyAgeXY = V.potencyAge;
-};
-
 window.nationalityToRace = function nationalityToRace(slave) {
 	slave.race = hashChoice(setup.raceSelector[slave.nationality] || setup.raceSelector[""]);
 };
@@ -30584,163 +30540,1785 @@ window.randomizeAttraction = function randomizeAttraction(slave) {
 	slave.attrXY = Math.clamp(slave.attrXY + jsRandom(-5, 5), 0, 100);
 };
 
-window.disabilityRoll = function disabilityRoll(slave) {
-	const V = State.variables;
-	let disList = [];
-	disList.push("hearNot");
-	disList.push("seeNot");
-	disList.push("speakNot");
-	let disableCount = 0;
-	if (V.oneTimeDisableDisability === 0) {
-		while (disList.length > 0) {
-			let rolled = jsEither(disList);
-			switch (rolled) {
-			case "hearNot":
-				if ((jsRandom(1,100)-(disableCount*2)) > 90) {
-					slave.hears = -2;
+window.BaseSlave = function BaseSlave() {
+	State.variables.activeSlave = {
+		slaveName: "blank",
+		slaveSurname: 0,
+		birthName: "blank",
+		birthSurname: 0,
+		genes: "XX",
+		pronoun: "she",
+		possessive: "her",
+		possessivePronoun: "hers",
+		objectReflexive: "herself",
+		object: "her",
+		noun: "girl",
+		weekAcquired: 0,
+		origin: 0,
+		career: 0,
+		ID: 0,
+		prestige: 0,
+		pornFeed: 0,
+		pornFame: 0,
+		pornFameSpending: 0,
+		pornPrestige: 0,
+		pornPrestigeDesc: 0,
+		pornFameType: "none",
+		pornFocus: "none",
+		pornTypeGeneral: 0,
+		pornTypeFuckdoll: 0,
+		pornTypeRape: 0,
+		pornTypePreggo: 0,
+		pornTypeBBW: 0,
+		pornTypeGainer: 0,
+		pornTypeStud: 0,
+		pornTypeLoli: 0,
+		pornTypeDeepThroat: 0,
+		pornTypeStruggleFuck: 0,
+		pornTypePainal: 0,
+		pornTypeTease: 0,
+		pornTypeRomantic: 0,
+		pornTypePervert: 0,
+		pornTypeCaring: 0,
+		pornTypeUnflinching: 0,
+		pornTypeSizeQueen: 0,
+		pornTypeNeglectful: 0,
+		pornTypeCumAddict: 0,
+		pornTypeAnalAddict: 0,
+		pornTypeAttentionWhore: 0,
+		pornTypeBreastGrowth: 0,
+		pornTypeAbusive: 0,
+		pornTypeMalicious: 0,
+		pornTypeSelfHating: 0,
+		pornTypeBreeder: 0,
+		pornTypeSub: 0,
+		pornTypeCumSlut: 0,
+		pornTypeAnal: 0,
+		pornTypeHumiliation: 0,
+		pornTypeBoobs: 0,
+		pornTypeDom: 0,
+		pornTypeSadist: 0,
+		pornTypeMasochist: 0,
+		pornTypePregnancy: 0,
+		prestigeDesc: 0,
+		recruiter: 0,
+		relation: 0,
+		relationTarget: 0,
+		relationship: 0,
+		relationshipTarget: 0,
+		rivalry: 0,
+		rivalryTarget: 0,
+		subTarget: 0,
+		father: 0,
+		mother: 0,
+		daughters: 0,
+		sisters: 0,
+		canRecruit: 0,
+		choosesOwnAssignment: 0,
+		assignment: "rest",
+		assignmentVisible: 1,
+		sentence: 0,
+		training: 0,
+		toyHole: "all her holes",
+		indenture: -1,
+		indentureRestrictions: 0,
+		birthWeek: random(0,51),
+		actualAge: 18,
+		visualAge: 18,
+		physicalAge: 18,
+		ovaryAge: 18,
+		ageImplant: 0,
+		health: 0,
+		minorInjury: 0,
+		trust: 0,
+		oldTrust: 0,
+		devotion: 0,
+		oldDevotion: 0,
+		weight: 0,
+		muscles: 0,
+		height: 170,
+		heightImplant: 0,
+		nationality: "slave",
+		race: "white",
+		origRace: "white",
+		markings: "none",
+		eyes: 1,
+		eyeColor: "brown",
+		origEye: "brown",
+		pupil: "circular",
+		sclerae: "white",
+		eyewear: "none",
+		hears: 0,
+		earwear: "none",
+		earImplant: 0,
+		origHColor: "brown",
+		hColor: "brown",
+		pubicHColor: "brown",
+		underArmHColor: "brown",
+		eyebrowHColor: "brown",
+		origSkin: "light",
+		skin: "light",
+		hLength: 60,
+		eyebrowFullness: "natural",
+		hStyle: "short",
+		pubicHStyle: "neat",
+		underArmHStyle: "neat",
+		eyebrowHStyle: "natural",
+		waist: 0,
+		corsetPiercing: 0,
+		PLimb: 0,
+		amp: 0,
+		heels:0,
+		voice: 2,
+		voiceImplant: 0,
+		accent: 0,
+		shoulders: 0,
+		shouldersImplant: 0,
+		boobs: 0,
+		boobsImplant: 0,
+		boobsImplantType: 0,
+		boobShape: "normal",
+		nipples: "cute",
+		nipplesPiercing: 0,
+		nipplesAccessory: 0,
+		areolae: 0,
+		areolaePiercing: 0,
+		areolaeShape: "circle",
+		boobsTat: 0,
+		lactation: 0,
+		lactationAdaptation: 0,
+		milk: 0,
+		cum: 0,
+		hips: 0,
+		hipsImplant: 0,
+		butt: 0,
+		buttImplant: 0,
+		buttImplantType: 0,
+		buttTat: 0,
+		face: 0,
+		faceImplant: 0,
+		faceShape: "normal",
+		lips: 15,
+		lipsImplant: 0,
+		lipsPiercing: 0,
+		lipsTat: 0,
+		teeth: "normal",
+		tonguePiercing: 0,
+		vagina: 0,
+		vaginaLube: 0,
+		vaginaPiercing: 0,
+		vaginaTat: 0,
+		preg: -1,
+		pregSource: 0,
+		pregType: 0,
+		pregAdaptation: 50,
+		superfetation: 0,
+		ovaImplant: 0,
+		broodmother: 0,
+		broodmotherFetuses: 0,
+		broodmotherOnHold: 0,
+		broodmotherCountDown: 0,
+		labor: 0,
+		births: 0,
+		cSec: 0,
+		bellyAccessory: "none",
+		labia: 0,
+		clit: 0,
+		clitPiercing: 0,
+		clitSetting: "vanilla",
+		foreskin: 0,
+		anus: 0,
+		dick: 0,
+		analArea: 1,
+		dickPiercing: 0,
+		dickTat: 0,
+		prostate: 0,
+		balls: 0,
+		scrotum: 0,
+		ovaries: 0,
+		anusPiercing: 0,
+		anusTat: 0,
+		makeup: 0,
+		nails: 0,
+		brand: 0,
+		brandLocation: 0,
+		earPiercing: 0,
+		nosePiercing: 0,
+		eyebrowPiercing: 0,
+		navelPiercing: 0,
+		shouldersTat: 0,
+		armsTat: 0,
+		legsTat: 0,
+		backTat: 0,
+		stampTat: 0,
+		vaginalSkill: 0,
+		oralSkill: 0,
+		analSkill: 0,
+		whoreSkill: 0,
+		entertainSkill: 0,
+		combatSkill: 0,
+		livingRules: "spare",
+		speechRules: "restrictive",
+		releaseRules: "restrictive",
+		relationshipRules: "restrictive",
+		standardPunishment: "situational",
+		standardReward: "situational",
+		useRulesAssistant: 1,
+		diet: "healthy",
+		dietCum: 0,
+		dietMilk: 0,
+		tired: 0,
+		hormones: 0,
+		drugs: "no drugs",
+		curatives: 0,
+		chem: 0,
+		aphrodisiacs: 0,
+		addict: 0,
+		fuckdoll: 0,
+		choosesOwnClothes: 0,
+		clothes: "no clothing",
+		collar: "none",
+		shoes: "none",
+		vaginalAccessory: "none",
+		dickAccessory: "none",
+		legAccessory: "none",
+		buttplug: "none",
+		buttplugAttachment: "none",
+		intelligence: 0,
+		intelligenceImplant: 0,
+		energy: 50,
+		need: 0,
+		attrXX: 0,
+		attrXY: 0,
+		attrKnown: 0,
+		fetish: "none",
+		fetishStrength: 70,
+		fetishKnown: 0,
+		behavioralFlaw: "none",
+		behavioralQuirk: "none",
+		sexualFlaw: "none",
+		sexualQuirk: "none",
+		oralCount: 0,
+		vaginalCount: 0,
+		analCount: 0,
+		mammaryCount: 0,
+		penetrativeCount: 0,
+		publicCount: 0,
+		pitKills: 0,
+		customTat: "",
+		customLabel: "",
+		customDesc: "",
+		customTitle: "",
+		customTitleLisp: "",
+		rudeTitle: 0,
+		customImage: 0,
+		currentRules: [],
+		bellyTat: 0,
+		induce: 0,
+		mpreg: 0,
+		inflation: 0,
+		inflationType: "none",
+		inflationMethod: 0,
+		milkSource: 0,
+		cumSource: 0,
+		burst: 0,
+		pregKnown: 0,
+		pregWeek: 0,
+		belly: 0,
+		bellyPreg: 0,
+		bellyFluid: 0,
+		bellyImplant: -1,
+		bellySag: 0,
+		bellySagPreg: 0,
+		bellyPain: 0,
+		cervixImplant: 0,
+		birthsTotal: 0,
+		pubertyAgeXX: 13,
+		pubertyAgeXY: 13,
+		scars: 0,
+		breedingMark: 0,
+		bodySwap: 0,
+		HGExclude: 0,
+		ballType: "human",
+		eggType: "human",
+		reservedChildren: 0,
+		reservedChildrenNursery: 0,
+		choosesOwnChastity: 0,
+		pregControl: "none",
+		readyLimbs: [],
+		ageAdjust: 0,
+		bald: 0,
+		origBodyOwner: "",
+		origBodyOwnerID: 0,
+		death: "",
+		hormoneBalance: 0,
+		onDiet: 0,
+		breastMesh: 0,
+		slavesFathered: 0,
+		PCChildrenFathered: 0,
+		slavesKnockedUp: 0,
+		PCKnockedUp: 0,
+		prematureBirth: 0,
+		premature: 0,
+		origSkin: "white",
+		vasectomy: 0,
+		haircuts: 0,
+		newGamePlus: 0,
+		skillHG: 0,
+		skillRC: 0,
+		skillBG: 0,
+		skillMD: 0,
+		skillDJ: 0,
+		skillNU: 0,
+		skillTE: 0,
+		skillAT: 0,
+		skillMT: 0,
+		skillST: 0,
+		skillMM: 0,
+		skillWA: 0,
+		skillS: 0,
+		skillE: 0,
+		skillW: 0,
+		tankBaby: 0,
+		inducedNCS: 0,
+		NCSyouthening: 0,
+		override_Race: 0,
+		override_Skin: 0,
+		override_Eye_Color: 0,
+		override_H_Color: 0,
+		override_Pubic_H_Color: 0,
+		override_Arm_H_Color: 0,
+		override_Brow_H_Color: 0,
+		missingEyes: 0,
+		missingArms: 0,
+		missingLegs: 0
+	};
+};
+
+window.generatePronouns = function generatePronouns(slave) {
+	if (slave.fuckdoll > 0) {
+		slave.pronoun = "it";
+		slave.possessivePronoun = "its";
+		slave.possessive = "its";
+		slave.object = "it";
+		slave.objectReflexive = "itself";
+		slave.noun = "toy";
+	} else if (slave.dick > 0 && slave.vagina == -1 && State.variables.diversePronouns == 1) {
+		slave.pronoun = "he";
+		slave.possessivePronoun = "his";
+		slave.possessive = "his";
+		slave.object = "him";
+		slave.objectReflexive = "himself";
+		slave.noun = "boy";
+	} else {
+		slave.pronoun = "she";
+		slave.possessivePronoun = "hers";
+		slave.possessive = "her";
+		slave.object = "her";
+		slave.objectReflexive = "herself";
+		slave.noun = "girl";	
+	}
+};
+
+/*:: Generate New Slave JS [script]*/
+
+window.GenerateNewSlave = (function(){
+	'use strict';
+	let V, slave;
+
+	function GenerateNewSlave(sex) {
+		V = State.variables;
+		BaseSlave();
+		slave = V.activeSlave;
+
+		preGenCombinedStats();
+		if (!sex) {
+			if (jsRandom(0,99) < V.seeDicks) {
+				GenerateXYSlave();
+			} else if (V.seeDicks > 0) {
+				var femaleSlaveGen = 80;
+				if (V.arcologies[0].FSGenderFundamentalistSMR == 1 || V.arcologies[0].FSRepopulationFocusSMR == 1) {
+					femaleSlaveGen = 90;
+				} else if (V.arcologies[0].FSGenderRadicalist != "unset") {
+					femaleSlaveGen = 50;
+				}
+				if (jsRandom(1,100) > femaleSlaveGen && jsRandom(0,99) < V.seeDicks) {
+					GenerateXYSlave();
+				} else {
+					GenerateXXSlave();
 				}
-				disList.delete("hearNot");
-				disableCount++;
+			} else {
+				GenerateXXSlave();
+			}
+		} else if (sex == "XY") {
+			GenerateXYSlave();
+		} else {
+			GenerateXXSlave();
+		}
+
+		postGenCleanup();
+	};
+
+	function preGenCombinedStats() {
+		slave.ID = V.IDNumber++;
+		slave.weekAcquired = V.week;
+		slave.canRecruit = 1;
+		slave.devotion = jsRandom(-90,-60);
+		slave.trust = jsRandom(-45,-25);
+		slave.weight = jsRandom(-100,180);
+		slave.health = jsRandom(-50,50);
+		
+		WombInit(slave);
+		generateAge();
+		generateIntelligence();
+		generateCareer();
+		generateNationality(); /* includes race selection */
+		generateAccent();
+		nationalityToName(slave);
+		generateRacialTraits();
+	};
+
+	function postGenCleanup() {
+		generateBoobTweaks(); /* split this up for female vs. male? */
+		generateSkills();
+		generateDisabilities();
+		generatePronouns(slave);
+		if (passage() == "Slave Markets" && V.slaveMarket == "corporate" && V.captureUpgradeRace != "unselected" && V.captureUpgradeRace != "none") {
+			slave.race = V.captureUpgradeRace;
+		}
+	};
+
+	function GenerateXXSlave() {
+		slave.ovaries = 1;
+		slave.pubertyXY = 0;
+		slave.energy = jsRandom(1,85);
+		/* Superfetation as rare genetic disorder 1 from 100, not active for now. 
+		if (jsRandom(0,99) < 1) {
+			slave.superfetation = 1;
+		}
+		*/
+		
+		generateXXBodyProportions();
+		generateVagina();
+		generateXXPreferences();
+		generateXXButt();
+		generateXXBoobs();
+		generateXXFace();
+		generateXXPregAdaptation();
+		generateXXVoice();
+		generateXXTeeth();
+		generateXXMods();
+		generateXXBodyHair();
+		generateXXPuberty();
+	};
+
+	function GenerateXYSlave() {		
+		slave.genes = "XY";
+		slave.hLength = 10;
+		slave.prostate = 1;
+		slave.pubertyXX = 0;
+		slave.energy = jsRandom(15,90);
+		
+		generateXYBodyProportions();
+		generateDick();
+		generateCircumcision();
+		generateXYPreferences(); /* must happen after genitalia generation */
+		generateXYButt(); /* must happen after preferences */
+		generateXYBoobs();
+		generateXYFace();
+		generateXYPregAdaptation();
+		generateXYVoice();
+		generateXYTeeth();
+		generateXYMods();
+		generateXYBodyHair();
+		generateXYPuberty();
+	};
+
+	function generateXXBodyProportions() {
+		slave.height = Math.round(Height.random(slave));
+		if (slave.height >= Height.mean(slave) * 170/162.5) {
+			slave.hips = jsEither([-1, 0, 0, 1, 1, 2, 2]);
+			slave.shoulders = jsEither([-1, -1, 0, 0, 0, 1]);
+		} else {
+			slave.hips = jsEither([-1, 0, 0, 0, 1, 1, 2]);
+			slave.shoulders = jsEither([-2, -1, -1, 0, 0, 1]);
+		}
+		if (slave.physicalAge <= 11) {
+			slave.hips = jsEither([-2, -2, -1, -1, 0]);
+		} else if (slave.physicalAge <= 13) {
+			slave.hips = jsEither([-2, -1, -1, 0, 1]);
+		}
+		if (slave.weight < -30) {
+			slave.waist = jsRandom(-55,0);
+		} else if (slave.physicalAge < 13) {
+			slave.waist = jsRandom(-25,25);
+		} else if (slave.weight <= 30) {
+			slave.waist = jsRandom(-45,45);
+		} else if (slave.weight <= 160) {
+			slave.waist = jsRandom(0,55);
+		} else {
+			slave.waist = jsRandom(50,100);
+		}
+	};
+
+	function generateXYBodyProportions() {
+		slave.height = Math.round(Height.random(slave));
+		if (slave.physicalAge <= 13) {
+			if (slave.height > Height.mean(slave) * 170/172.5) {
+				slave.hips = jsEither(-2, -1, -1, 0, 1);
+				slave.shoulders = jsEither(-1, -1, 0, 0, 0, 1);
+			} else {
+				slave.hips = jsEither(-2, -2, -1, -1, 0);
+				slave.shoulders = jsEither(-2, -1, -1, 0, 0, 1);
+			}
+		} else {
+			if (slave.height > Height.mean(slave) * 170/172.5) {
+				slave.hips = jsEither(-2, -1, -1, 0, 1);
+				slave.shoulders = jsEither(-1, 0, 1, 1, 2, 2);
+			} else {
+				slave.hips = jsEither(-2, -2, -1, -1, 0);
+				slave.shoulders = jsEither(-1, 0, 0, 1, 1, 2);
+			}
+		}
+		if (slave.physicalAge < 13) {
+			slave.waist = jsRandom(-15,25);
+		} else if (slave.weight < -30) {
+			slave.waist = jsRandom(-45,45);
+		} else if (slave.weight <= 30) {
+			slave.waist = jsRandom(-15,65);
+		} else if (slave.weight <= 160) {
+			slave.waist = jsRandom(5,100);
+		} else {
+			slave.waist = jsRandom(50,100);
+		}
+	};
+
+	function generateVagina() {
+		if (slave.physicalAge <= 13) {
+			slave.vagina = jsEither([0, 0, 0, 0, 0, 0, 0, 1]);
+		} else if (slave.physicalAge <= 15) {
+			slave.vagina = jsEither([0, 0, 0, 0, 0, 0, 1, 1]);
+		} else if (slave.physicalAge <= 17) {
+			slave.vagina = jsEither([0, 0, 0, 0, 0, 1, 1, 1]);
+		} else if (slave.physicalAge < 20) {
+			slave.vagina = jsEither([0, 1]);
+		} else if (slave.physicalAge > 30) {
+			slave.vagina = jsEither([1, 1, 1, 1, 2]);
+		} else {
+			slave.vagina = jsEither([0, 0, 1, 1, 1]);
+		}
+		
+		if (slave.physicalAge <= 11) {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 0, 1]);
+		} else if (slave.physicalAge <= 13) {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 1]);
+		} else if (slave.physicalAge <= 15) {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 2]);
+		} else {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 1, 1, 2]);
+		}
+		
+		if (slave.physicalAge <= 11) {
+			slave.labia = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 1]);
+		} else if (slave.physicalAge <= 12) {
+			slave.labia = jsEither([0, 0, 0, 0, 0, 0, 1, 1, 1]);
+		} else if (slave.physicalAge <= 13) {
+			slave.labia = jsEither([0, 0, 0, 0, 0, 1, 1, 1, 1]);
+		} else if (slave.physicalAge <= 14) {
+			slave.labia = jsEither([0, 0, 0, 0, 1, 1, 1, 1, 2]);
+		} else if (slave.physicalAge <= 15) {
+			slave.labia = jsEither([0, 0, 0, 1, 1, 1, 1, 2, 2]);
+		} else {
+			slave.labia = jsEither([0, 0, 0, 1, 1, 1, 1, 2, 2, 3]);
+		}
+		
+		if (slave.energy < random(1,80)) {
+			slave.vaginaLube = 0;
+		} else if ( slave.physicalAge > random(35,60)) {
+			slave.vaginaLube = 0;
+		} else {
+			slave.vaginaLube = 1;
+		}		
+		slave.foreskin = jsRandom(0,4);
+	};
+
+	function generateDick() {
+		slave.vagina = -1;
+		slave.clit = 0;
+		slave.preg = 0;
+		
+		if (slave.physicalAge <= 13) {
+			slave.dick = jsEither([1, 1, 1, 1, 2, 2, 2, 3]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3]);
+			} else {
+				slave.balls = jsEither([1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3]);
+			}
+			slave.scrotum = slave.balls;
+		} else if (slave.physicalAge <= 15) {
+			slave.dick = jsEither([1, 1, 1, 2, 2, 2, 3]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4]);
+			} else {
+				slave.balls = jsEither([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4]);
+			}
+			slave.scrotum = slave.balls;
+		} else if (slave.physicalAge <= 17) {
+			slave.dick = jsEither([1, 1, 2, 2, 3, 3]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5]);
+			} else {
+				slave.balls = jsEither([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5]);
+			}
+			slave.scrotum = slave.balls;
+		} else {
+			slave.dick = jsEither([1, 2, 2, 2, 3, 3, 3, 4, 4, 5]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5]);
+			} else {
+				slave.balls = jsEither([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5]);
+			}
+			if (slave.balls != 0) {
+				slave.scrotum = slave.balls + jsEither([0, 0, 1]);
+			} else {
+				slave.scrotum = 0;
+			}
+			if (jsRandom(1,100) < 3) {
+				slave.vasectomy = 1;
+			}
+		}
+	};
+
+	function generateCircumcision() {
+		/* The default rate of 50* is wildly unrepresentative, and there is extreme regional variation. */
+		/*
+		 What we want is the prevalence among newborns, since this game
+		 happens about 20 years in the future, but we'll use this lacking
+		 something better.
+		 https://pophealthmetrics.biomedcentral.com/articles/10.1186/s12963-016-0073-5
+		 Right now we mostly just break it down by country.
+		 It would be better to break it down by both country
+		 and race if statistics are available.
+		*/
+		if (V.seeCircumcision == 0) {
+			slave.foreskin = slave.dick + jsRandom(0,1);
+		} else {
+			/* Temporarily use activeSlave.foreskin to store the chance of circumcision. */
+			switch (slave.nationality) {
+				case "Afghan":
+				case "Iranian":
+				case "Moroccan":
+				case "Palestinian":
+				case "Sahrawi":
+				case "Tunisian":
+					slave.foreskin = 100;
+					break;
+				case "Comorian":
+				case "Gabonese":
+				case "Iraqi":
+				case "Jordanian":
+				case "Kurdish":
+				case "Mauritanian":
+				case "Nigerian":
+				case "Tajik":
+				case "Turkish":
+				case "Yemeni":
+					slave.foreskin = 99;
+					break;
+				case "Algerian":
+				case "Azerbaijani":
+				case "Liberian":
+				case "Maldivian":
+					slave.foreskin = 98;
+					break;
+				case "Djiboutian":
+				case "Eritrean":
+				case "Ivorian":
+				case "Libyan":
+				case "Saudi":
+				case "Uzbek":
+					slave.foreskin = 97;
+					break;
+				case "Nigerien":
+				case "Pakistani":
+				case "Sierra Leonean":
+				case "Turkmen":
+				case "Zairian":
+					slave.foreskin = 96;
+					break;
+				case "a Cook Islander":
+				case "Egyptian":
+				case "Gambian":
+				case "Guamanian":
+				case "Malagasy":
+				case "Nauruan":
+				case "Ni-Vanuatu":
+				case "Niuean":
+				case "Palauan":
+				case "Samoan":
+				case "a Solomon Islander":
+				case "Togolese":
+				case "Tongan":
+				case "Tuvaluan":
+					slave.foreskin = 95;
+					break;
+				case "Cameroonian":
+				case "Senegalese":
+				case "Somali":
+					slave.foreskin = 94;
+					break;
+				case "Bangladeshi":
+				case "Beninese":
+				case "Bissau-Guinean":
+				case "Indonesian":
+				case "Syrian":
+					slave.foreskin = 93;
+					break;
+				case "Ethiopian":
+				case "Filipina":
+				case "Ghanan":
+				case "Israeli":
+				case "Kosovan":
+					slave.foreskin = 92;
+					break;
+				case "Kenyan":
+				case "Kyrgyz":
+					slave.foreskin = 91;
+					break;
+				case "Burkinabé":
+				case "Omani":
+					slave.foreskin = 88;
+					break;
+				case "Equatoguinean":
+					slave.foreskin = 87;
+					break;
+				case "Kuwaiti":
+				case "Malian":
+					slave.foreskin = 86;
+					break;
+				case "Guinean":
+					slave.foreskin = 84;
+					break;
+				case "Bahraini":
+					slave.foreskin = 81;
+					break;
+				case "French Polynesian":
+					slave.foreskin = 78;
+					break;
+				case "American":
+				case "Qatari":
+					slave.foreskin = 77;
+					break;
+				case "Emirati":
+					slave.foreskin = 76;
+					break;
+				case "Chadian":
+					slave.foreskin = 74;
+					break;
+				case "Tanzanian":
+					slave.foreskin = 72;
+					break;
+				case "Congolese":
+					slave.foreskin = 70;
+					break;
+				case "Central African":
+					slave.foreskin = 63;
+					break;
+				case "Burundian":
+				case "Malaysian":
+					slave.foreskin = 61;
+					break;
+				case "Lebanese":
+					slave.foreskin = 60;
+					break;
+				case "Angolan":
+					slave.foreskin = 58;
+					break;
+				case "Fijian":
+				case "Kazakh":
+					slave.foreskin = 56;
+					break;
+				case "Bruneian":
+				case "Korean":
+				case "Mosotho":
+					/* Population-weighted average of South Korea and North Korea. */
+					slave.foreskin = 52;
+					break;
+				case "New Caledonian":
+					slave.foreskin = 50;
+					break;
+				case "Albanian":
+					slave.foreskin = 48;
+					break;
+				case "Mozambican":
+					slave.foreskin = 47;
+					break;
+				case "South African":
+					slave.foreskin = 45;
+					break;
+				case "Dominican":
+					slave.foreskin = 43;
+					break;
+				case "Bosnian":
+					slave.foreskin = 42;
+					break;
+				case "Sudanese":
+					slave.foreskin = 39;
+					break;
+				case "Mexican":
+					slave.foreskin = 38;
+					break;
+				case "Macedonian":
+					slave.foreskin = 34;
+					break;
+				case "a New Zealander":
+					slave.foreskin = 33;
+					break;
+				case "Canadian":
+					slave.foreskin = 32;
+					break;
+				case "Scottish":
+					slave.foreskin = 28;
+					break;
+				case "Australian":
+				case "Ugandan":
+					slave.foreskin = 27;
+					break;
+				case "Namibian":
+					slave.foreskin = 26;
+					break;
+				case "South Sudanese":
+					slave.foreskin = 24;
+					break;
+				case "Belgian":
+				case "Cypriot":
+				case "Thai":
+					slave.foreskin = 23;
+					break;
+				case "Malawian":
+					slave.foreskin = 22;
+					break;
+				case "British":
+					slave.foreskin = 21;
+					break;
+				case "Puerto Rican":
+					slave.foreskin = 20;
+					break;
+				case "Montenegrin":
+					slave.foreskin = 19;
+					break;
+				case "Mauritian":
+					slave.foreskin = 17;
+					break;
+				case "Motswana":
+				case "Singaporean":
+				case "Surinamese":
+					slave.foreskin = 15;
+					break;
+				case "Chinese":
+				case "French":
+				case "Indian":
+				case "Jamaican":
+					slave.foreskin = 14;
+					break;
+				case "Bulgarian":
+				case "Rwandan":
+				case "Zambian":
+					slave.foreskin = 13;
+					break;
+				case "French Guianan":
+				case "Guyanese":
+				case "Russian":
+					slave.foreskin = 12;
+					break;
+				case "German":
+					slave.foreskin = 11;
+					break;
+				case "Belarusian":
+				case "Georgian":
+				case "Papua New Guinean":
+					slave.foreskin = 10;
+					break;
+				case "Japanese":
+				case "Zimbabwean":
+					slave.foreskin = 9;
+					break;
+				case "Slovene":
+				case "Sri Lankan":
+				case "Swazi":
+				case "Taiwanese":
+					slave.foreskin = 8;
+					break;
+				case "Catalan":
+				case "Haitian":
+				case "Spanish":
+					slave.foreskin = 7;
+					break;
+				case "Austrian":
+				case "Dutch":
+				case "East Timorese":
+				case "Swiss":
+				case "Trinidadian":
+					slave.foreskin = 6;
+					break;
+				case "Danish":
+				case "Greek":
+				case "a Liechtensteiner":
+				case "Swedish":
+					slave.foreskin = 5;
+					break;
+				case "Burmese":
+				case "Cambodian":
+				case "Mongolian":
+				case "Nepalese":
+				case "Peruvian":
+				case "Serbian":
+					slave.foreskin = 4;
+					break;
+				case "Argentinian":
+				case "Italian":
+				case "Norwegian":
+					slave.foreskin = 3;
+					break;
+				case "Luxembourgian":
+				case "Tibetan":
+				case "Ukrainian":
+				case "Vincentian":
+					slave.foreskin = 2;
+					break;
+				case "Andorran":
+				case "Barbadian":
+				case "Bermudian":
+				case "Bhutanese":
+				case "Brazilian":
+				case "Croatian":
+				case "Finnish":
+				case "Hungarian":
+				case "Irish":
+				case "Moldovan":
+				case "Monégasque":
+				case "Panamanian":
+				case "Portuguese":
+				case "Seychellois":
+				case "Uruguayan":
+					slave.foreskin = 1;
+					break;
+				case "Antiguan":
+				case "Armenian":
+				case "Bahamian":
+				case "Belizean":
+				case "Bolivian":
+				case "Cape Verdean":
+				case "Chilean":
+				case "Colombian":
+				case "Costa Rican":
+				case "Cuban":
+				case "Czech":
+				case "Dominiquais":
+				case "Ecuadorian":
+				case "Estonian":
+				case "Greenlandic":
+				case "Grenadian":
+				case "Guatemalan":
+				case "Honduran":
+				case "I-Kiribati":
+				case "Icelandic":
+				case "Kittitian":
+				case "Laotian":
+				case "Latvian":
+				case "Lithuanian":
+				case "Maltese":
+				case "Marshallese":
+				case "Micronesian":
+				case "Nicaraguan":
+				case "Paraguayan":
+				case "Polish":
+				case "Romanian":
+				case "Saint Lucian":
+				case "Salvadoran":
+				case "Sammarinese":
+				case "São Toméan":
+				case "Slovak":
+				case "Vatican":
+				case "Venezuelan":
+				case "Vietnamese":
+					slave.foreskin = 0;
+					break;
+				default:
+					/* Some overlooked country, or possibly stateless. Use global average. */
+					slave.foreskin = 38;
+			}
+			/* Second pass for minorities in other countries. */
+			if (slave.race == "middle eastern" && slave.foreskin < 76) {
+				slave.foreskin = 76;
+			}
+			if (slave.race == "semitic" && slave.foreskin < 90) {
+				slave.foreskin = 90;
+			}
+			/* Chance activeSlave.foreskin back to the normal meaning. */
+			if (jsRandom(0,99) < slave.foreskin) {
+				slave.foreskin = 0;
+			} else {
+				slave.foreskin = slave.dick + jsRandom(0,1);
+			}
+		}
+	};
+
+	function generateXXPreferences() {
+		randomizeAttraction(slave);
+		slave.fetishStrength = jsRandom(0,90);
+		slave.fetish = jsEither(["none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "submissive", "submissive", "cumslut", "humiliation", "humiliation", "buttslut", "boobs", "pregnancy", "dom", "sadist", "masochist"]);
+		slave.behavioralFlaw = jsEither(["none", "none", "none", "arrogant", "bitchy", "odd", "hates men", "hates women", "hates women", "anorexic", "gluttonous", "devout", "liberated"]);
+		
+		if (slave.behavioralFlaw == "devout") {
+			slave.sexualFlaw = jsEither(["none", "repressed", "shamefast", "apathetic", "crude", "judgemental"]);
+		} else {
+			slave.sexualFlaw = jsEither(["none", "none", "none", "none", "hates oral", "hates anal", "hates penetration", "repressed", "idealistic", "shamefast", "apathetic", "crude", "judgemental"]);
+		}
+		if (slave.behavioralFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.behavioralQuirk = jsEither(["confident", "cutting", "funny", "adores women", "adores men", "fitness", "insecure", "sinful", "advocate"]);
+		}
+		if (slave.sexualFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.sexualQuirk = jsEither(["gagfuck queen", "painal queen", "strugglefuck queen", "tease", "romantic", "perverted", "caring", "unflinching", "size queen"]);
+		}
+	};
+
+	function generateXYPreferences() {
+		randomizeAttraction(slave);
+		slave.fetishStrength = jsRandom(0,90);
+		slave.fetish = jsEither(["none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "submissive", "cumslut", "humiliation", "buttslut", "buttslut", "boobs", "dom", "sadist", "masochist"]);
+		slave.behavioralFlaw = jsEither(["none", "none", "none", "arrogant", "bitchy", "odd", "hates men", "hates men", "hates men", "hates women", "anorexic", "gluttonous", "devout", "liberated"]);
+		
+		if (slave.behavioralFlaw == "devout") {
+			slave.sexualFlaw = jsEither(["none", "repressed", "shamefast", "apathetic", "crude", "judgemental"]);
+		} else {
+			slave.sexualFlaw = jsEither(["none", "none", "none", "none", "hates oral", "hates anal", "hates anal", "repressed", "idealistic", "shamefast", "apathetic", "crude", "judgemental"]);
+		}
+		if (slave.behavioralFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.behavioralQuirk = jsEither(["confident", "cutting", "funny", "adores women", "adores men", "fitness", "insecure", "sinful", "advocate"]);
+		}
+		if (slave.sexualFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.sexualQuirk = jsEither(["gagfuck queen", "painal queen", "strugglefuck queen", "tease", "romantic", "perverted", "caring", "unflinching", "size queen"]);
+		}
+	};
+
+	function generateXXButt() {
+		if (slave.physicalAge <= 11) {
+			slave.butt = jsEither([1, 1, 1, 1, 1, 1, 1]);
+		} else if (slave.physicalAge <= 12) {
+			slave.butt = jsEither([1, 1, 1, 1, 1, 2, 2]);
+		} else if (slave.physicalAge <= 13) {
+			slave.butt = jsEither([1, 1, 1, 1, 2, 2, 2]);
+		} else if (slave.physicalAge <= 14) {
+			slave.butt = jsEither([1, 1, 1, 2, 2, 2, 3]);
+		} else if (slave.physicalAge <= 15) {
+			slave.butt = jsEither([1, 1, 2, 2, 2, 2, 3]);
+		} else {
+			switch (slave.race) {
+				case "black":
+					slave.butt = jsEither([1, 2, 2, 3, 3, 4, 4]);
+					break;
+				case "indo-aryan":
+				case "malay":
+				case "pacific islander":
+				case "amerindian":
+				case "asian":
+				case "middle eastern": 
+				case "semitic":
+				case "southern european":
+					slave.butt = jsEither([1, 2, 2, 3, 3]);
+					break;
+				default:
+					slave.butt = jsEither([1, 2, 2, 3, 3, 4]);
+			}
+		}
+		if (V.weightAffectsAssets != 0) {
+			if (slave.weight < -10 && slave.butt > 1) {
+				slave.butt -= 1;
+			} else if (slave.weight > 100 && slave.butt < 6) {
+				slave.butt += jsRandom(1,2);
+			} else if (slave.weight > 10 && slave.butt < 4) {
+				slave.butt += 1;
+			}
+		}
+		slave.anus = jsEither([0, 0, 1, 1, 2]);
+		slave.analArea = slave.anus + jsEither([0, 0, 0, 1]);
+	};
+
+	function generateXYButt() {
+		if (slave.physicalAge <= 13) {
+			slave.butt = jsEither([1, 1, 1, 2, 2, 3, 3, 4]);
+		} else {
+			slave.butt = jsEither([1, 1, 2, 3]);
+		}
+		if (V.weightAffectsAssets != 0) {
+			if (slave.weight < -10 && slave.butt > 1) {
+				slave.butt -= 1;
+			} else if (slave.weight > 100 && slave.butt < 6) {
+				slave.butt += jsRandom(1,2);
+			} else if (slave.weight > 10 && slave.butt < 4) {
+				slave.butt += 1;
+			}
+		}
+		if (slave.attrXY > 0) {
+			slave.anus = jsEither([0, 1, 2]);
+		} else {
+			if (slave.physicalAge <= 13) {
+				slave.anus = jsEither([0, 0, 0, 0, 0, 1]);
+			} else if (slave.physicalAge <= 15) {
+				slave.anus = jsEither([0, 0, 0, 0, 1, 1, 1]);
+			} else if (slave.physicalAge <= 17) {
+				slave.anus = jsEither([0, 0, 0, 1, 1, 1]);
+			} else {
+				slave.anus = jsEither([0, 0, 1, 1, 2]);
+			}
+		}
+		slave.analArea = slave.anus + jsEither([0, 0, 0, 1]);
+	};
+
+	function generateXXBoobs() {
+		if (slave.physicalAge <= 10) {
+			slave.boobs = 100;
+		} else if (slave.physicalAge == 11) {
+			slave.boobs = jsEither([100, 100, 150, 150, 150, 300]);
+		} else if (slave.physicalAge == 12) {
+			slave.boobs = jsEither([100, 100, 150, 150, 150, 200, 200, 300]);
+		} else if (slave.physicalAge == 13) {
+			slave.boobs = jsEither([100, 150, 200, 200, 300, 300, 300, 400]);
+		} else if (slave.physicalAge == 14) {
+			slave.boobs = jsEither([100, 150, 200, 300, 300, 300, 350, 400, 400]);
+		} else if (slave.physicalAge == 15) {
+			slave.boobs = jsEither([150, 200, 300, 300, 300, 350, 350, 350, 400, 400, 450, 450]);
+		} else {
+			switch (slave.race) {
+				case "black":
+					slave.boobs = BoobGenerator.rollBreast(150);
+					break;
+				case "white":
+					slave.boobs = BoobGenerator.rollBreast(50);
+					break;
+				case "asian":
+					slave.boobs = BoobGenerator.rollBreast(-100);
+					break;
+				default:
+					slave.boobs = BoobGenerator.rollBreast(0);
+			}
+		}
+	};
+
+	function generateXYBoobs() {
+		slave.boobs = jsEither([100, 200, 200, 300, 300, 400, 500]);
+	};
+
+	function generateXXFace() {
+		slave.face = jsRandom(-60,60);
+		if (jsRandom(0,2) == 0) {
+			slave.face = jsRandom(-10,10);
+		}
+		if (slave.physicalAge > 40) {
+			slave.face -= jsRandom(0,20);
+		} else if (slave.physicalAge > 35) {
+			slave.face -= jsRandom(0,10);
+		} else if (slave.physicalAge <= 20) {
+			slave.face += jsRandom(0,20);
+		} else if (slave.physicalAge <= 25) {
+			slave.face += jsRandom(0,10);
+		}
+		if (slave.physicalAge > 10) {
+			slave.faceShape = jsEither(["androgynous", "cute", "sensual", "exotic", "normal", "normal"]);
+		} else {
+			slave.faceShape = jsEither(["androgynous", "androgynous", "cute", "cute", "sensual", "exotic", "normal", "normal"]);
+		}
+		switch (slave.faceShape) {
+			case "sensual":
+			case "cute":
+				slave.face += jsRandom(0,20);
 				break;
-			case "seeNot":
-				if ((jsRandom(1,100)-(disableCount*2)) > 90) {
-					slave.eyes = -2;
-				}
-				disList.delete("seeNot");
-				disableCount++;
+			case "exotic":
+			case "androgynous":
+				slave.face += jsRandom(-10,10);
 				break;
-			case "speakNot":
-				if ((jsRandom(1,100)-(disableCount*2)) > 90) {
-					slave.voice = 0;
-				}
-				disList.delete("speakNot");
-				disableCount++;
+			case "masculine":
+				slave.face += jsRandom(-10,0);
+		}
+	};
+
+	function generateXYFace() {
+		slave.face = jsRandom(-70,20);
+		if (jsRandom(0,2) == 0) {
+			slave.face = jsRandom(-40,-10);
+		}
+		if (slave.physicalAge > 40) {
+			slave.face -= jsRandom(0,20);
+		} else if (slave.physicalAge > 35) {
+			slave.face -= jsRandom(0,10);
+		} else if (slave.physicalAge <= 20) {
+			slave.face += jsRandom(0,20);
+		} else if (slave.physicalAge <= 25) {
+			slave.face += jsRandom(0,10);
+		}
+		if (slave.physicalAge >= 17) {
+			slave.faceShape = jsEither(["masculine", "masculine", "masculine", "androgynous"]);
+		} else if (slave.physicalAge >= 15) {
+			slave.faceShape = jsEither(["masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "androgynous", "sensual", "exotic", "normal"]);
+		} else if (slave.physicalAge >= 13) {
+			slave.faceShape = jsEither(["masculine", "masculine", "masculine", "androgynous", "cute", "sensual", "exotic", "normal"]);
+		} else if (slave.physicalAge >= 11) {
+			slave.faceShape = jsEither(["masculine", "androgynous", "cute", "sensual", "exotic", "normal", "normal"]);
+		} else {
+			slave.faceShape = jsEither(["androgynous", "androgynous", "cute", "cute", "sensual", "exotic", "normal", "normal"]);
+		}
+		switch (slave.faceShape) {
+			case "sensual":
+			case "cute":
+				slave.face += jsRandom(0,20);
+				break;
+			case "exotic":
+			case "androgynous":
+				slave.face += jsRandom(-10,10);
 				break;
+			case "masculine":
+				slave.face += jsRandom(-10,0);
+		}
+	};
+
+	function generateXXPregAdaptation() {
+		if (slave.physicalAge <= 6) {
+			slave.pregAdaptation = 5;
+		} else if (slave.physicalAge <= 11) {
+			slave.pregAdaptation = slave.physicalAge - 1;
+		} else if (slave.physicalAge <= 14) {
+			slave.pregAdaptation = 4*(slave.physicalAge - 12) + 14;
+		} else if (slave.physicalAge <= 15) {
+			slave.pregAdaptation = 28;
+		} else if (slave.physicalAge <= 16) {
+			slave.pregAdaptation = 34;
+		} else if (slave.physicalAge <= 17) {
+			slave.pregAdaptation = 42;
+		} else {
+			slave.pregAdaptation = 50;
+		}
+	};
+
+	function generateXYPregAdaptation() {
+		if (slave.physicalAge <= 6) {
+			slave.pregAdaptation = 5;
+		} else if (slave.physicalAge <= 11) {
+			slave.pregAdaptation = slave.physicalAge - 1;
+		} else if (slave.physicalAge <= 15) {
+			slave.pregAdaptation = 2*(slave.physicalAge - 12) + 12;
+		} else {
+			slave.pregAdaptation = 20;
+		}
+	};
+
+	function generateXXVoice() {
+		if (slave.physicalAge <= 13) {
+			slave.voice = jsEither([2, 2, 2, 3, 3, 3, 3, 3, 3]);
+		} else if (slave.physicalAge <= 16) {
+			slave.voice = jsEither([2, 2, 2, 2, 2, 3, 3, 3, 3]);
+		} else {
+			slave.voice = jsEither([1, 2, 2, 2, 2, 2, 2, 3, 3, 3]);
+		}
+	};
+
+	function generateXYVoice() {
+		if (slave.physicalAge <= 11) {
+			slave.voice = jsEither([2, 2, 2, 3, 3, 3, 3, 3, 3]);
+		} else if (slave.physicalAge <= 13) {
+			slave.voice = jsEither([1, 1, 2, 2, 2, 2, 2, 3, 3]);
+		} else if (slave.physicalAge <= 16) {
+			slave.voice = jsEither([1, 1, 1, 2, 2, 2, 2, 2, 3]);
+		} else {
+			if (slave.balls > 2) {
+				slave.voice = 1;
+			} else if (slave.balls > 0) {
+				slave.voice = jsEither([1, 1, 2]);
+			} else {
+				slave.voice = jsEither([1, 2, 2]);
 			}
 		}
-	}
-	V.oneTimeDisableDisability = 0;
-};
+	};
 
-window.generateNationality = function generateNationality(slave) {
-	const V = State.variables;
+	function generateXXTeeth() {
+		var femaleCrookedTeethGen = slave.intelligence+slave.intelligenceImplant;
+		if ("American" == slave.nationality) {
+			femaleCrookedTeethGen += 20;
+		} else if (["Andorran", "Antiguan", "Argentinian", "Aruban", "Australian", "Austrian", "Bahamian", "Bahraini", "Barbadian", "Belarusian", "Belgian", "Bermudian", "Brazilian", "British", "Bruneian", "Bulgarian", "Canadian", "Catalan", "Chilean", "a Cook Islander", "Croatian", "Czech", "Cypriot", "Danish", "Dutch", "Emirati", "Estonian", "Finnish", "French", "German", "Greek", "Greenlandic", "Guamanian", "Hungarian", "Icelandic", "Irish", "Israeli", "Italian", "Japanese", "Kazakh", "Korean", "Kuwaiti", "Latvian", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Malaysian", "Maltese", "Mauritian", "Monégasque", "Montenegrin", "New Caledonian", "a New Zealander", "Niuean", "Norwegian", "Omani", "Palauan", "Panamanian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Sammarinese", "Saudi", "Seychellois", "Singaporean", "Slovak", "Slovene", "Spanish", "Swedish", "Swiss", "Taiwanese", "Trinidadian", "Uruguayan", "Vatican"].includes(slave.nationality)) {
+			/* do nothing */
+		} else {
+			femaleCrookedTeethGen -= 20;
+		}
+		
+		if (jsRandom(0, femaleCrookedTeethGen) <= 15 && slave.physicalAge >= 12) {
+			slave.teeth = "crooked";
+		}
+		
+		if (slave.physicalAge < 6) {
+			slave.teeth = "baby";
+		} else if (slave.physicalAge < 12) {
+			slave.teeth = "mixed";
+		}
+	};
 
-	if (V.fixedRace == 0) {
-		if (V.fixedNationality == 0) {
-			slave.nationality = hashChoice(V.nationalities);
+	function generateXYTeeth() {
+		var maleCrookedTeethGen = slave.intelligence+slave.intelligenceImplant;
+		if ("American" == slave.nationality) {
+			maleCrookedTeethGen += 22;
+		} else if (["Andorran", "Antiguan", "Argentinian", "Aruban", "Australian", "Austrian", "Bahamian", "Bahraini", "Barbadian", "Belarusian", "Belgian", "Bermudian", "Brazilian", "British", "Bruneian", "Bulgarian", "Canadian", "Catalan", "Chilean", "a Cook Islander", "Croatian", "Czech", "Cypriot", "Danish", "Dutch", "Emirati", "Estonian", "Finnish", "French", "German", "Greek", "Greenlandic", "Guamanian", "Hungarian", "Icelandic", "Irish", "Israeli", "Italian", "Japanese", "Kazakh", "Korean", "Kuwaiti", "Latvian", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Malaysian", "Maltese", "Mauritian", "Monégasque", "Montenegrin", "New Caledonian", "a New Zealander", "Niuean", "Norwegian", "Omani", "Palauan", "Panamanian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Sammarinese", "Saudi", "Seychellois", "Singaporean", "Slovak", "Slovene", "Spanish", "Swedish", "Swiss", "Taiwanese", "Trinidadian", "Uruguayan", "Vatican"].includes(slave.nationality)) {
+			/* do nothing */
 		} else {
-			slave.nationality = V.fixedNationality;
-			V.fixedNationality = 0;
+			maleCrookedTeethGen -= 20;
+		}
+		
+		if (jsRandom(0, maleCrookedTeethGen) <= 15 && slave.physicalAge >= 12) {
+			slave.teeth = "crooked";
 		}
-		nationalityToRace(slave);
 		
-		if (passage() == "Corporate Market" && (V.captureUpgradeRace != "unselected") && (V.captureUpgradeRace != "none")) {
-			if (V.captureUpgradeRace == "mixed race") {
-				slave.race = "mixed race";
+		if (slave.physicalAge < 6) {
+			slave.teeth = "baby";
+		} else if (slave.physicalAge < 12) {
+			slave.teeth = "mixed";
+		}
+	};
+
+	function generateXXMods() {
+		if (passage() != "Starting Girls") {
+			slave.earPiercing = jsEither([0,1]);
+			slave.nosePiercing = jsEither([0,0,0,1]);
+			slave.eyebrowPiercing = jsEither([0,0,0,0,0,1]);
+			slave.clitPiercing = jsEither([0,0,0,0,0,1]);
+			slave.lipsPiercing = jsEither([0,0,0,0,0,1]);
+			slave.navelPiercing = jsEither([0,0,0,1]);
+			slave.nipplesPiercing = jsEither([0,0,0,0,1]);
+		}
+		if (slave.anus != 0 && Math.random() < 0.25) {
+			slave.anusTat = "bleached";
+		}
+	};
+
+	function generateXYMods() {
+		if (passage() != "Starting Girls") {
+			slave.earPiercing = jsEither([0,0,0,1]);
+			slave.nosePiercing = jsEither([0,0,0,0,1]);
+			slave.eyebrowPiercing = jsEither([0,0,0,0,0,1]);
+			slave.clitPiercing = jsEither([0,0,0,0,0,1]);
+			slave.lipsPiercing = jsEither([0,0,0,0,0,1]);
+			slave.navelPiercing = jsEither([0,0,0,0,1]);
+			slave.nipplesPiercing = jsEither([0,0,0,0,1]);
+		}
+		if (slave.anus != 0 && Math.random() < 0.25) {
+			slave.anusTat = "bleached";
+		}
+	};
+
+	function generateXXBodyHair() {
+		slave.pubicHColor = slave.hColor;
+		slave.underArmHColor = slave.hColor;
+		slave.pubicHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "waxed", "waxed", "in a strip", "in a strip", "in a strip", "in a strip", "in a strip", "neat", "neat", "neat", "neat", "neat", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy", "bushy", "bushy", "bushy", "bushy", "very bushy", "very bushy"]);
+		slave.underArmHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "shaved", "shaved", "shaved", "shaved", "shaved", "neat", "neat", "neat", "neat", "neat", "bushy", "bushy", "bushy"]);
+		if ((slave.pubicHStyle == "hairless" || slave.underArmHStyle == "hairless") && Math.random() > 0.4) {
+			slave.pubicHStyle = "hairless";
+			slave.underArmHStyle = "hairless";
+		}
+		if (slave.hColor == "blonde" && Math.random() > 0.85) {
+			slave.eyebrowHColor = jsEither(["brown", "brown", "brown", "brown", "black"]);
+			slave.override_Brow_H_Color = 1;
+		} else {
+			slave.eyebrowHColor = slave.hColor;
+		}
+		slave.eyebrowHStyle = jsEither(["bald", "shaved", "shaved", "straight", "straight", "straight", "straight", "straight", "straight", "rounded", "rounded", "rounded", "rounded", "rounded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "slanted inwards", "slanted inwards", "slanted outwards", "slanted outwards", "high-arched", "high-arched", "high-arched", "elongated", "elongated", "elongated", "shortened", "shortened", "shortened", "curved", "curved", "curved", "curved", "curved", "curved", "curved"]);
+		slave.eyebrowFullness = jsEither(["pencil-thin", "pencil-thin", "thin", "thin", "thin", "threaded", "threaded", "threaded", "threaded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "tapered", "tapered", "tapered", "tapered", "thick", "thick", "thick", "bushy", "bushy"]);
+	};
+
+	function generateXYBodyHair() {
+		slave.pubicHColor = slave.hColor;
+		slave.underArmHColor = slave.hColor;
+		slave.pubicHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "waxed", "waxed", "in a strip", "in a strip", "in a strip", "neat", "neat", "neat", "neat", "neat", "neat", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "very bushy", "very bushy"]);
+		slave.underArmHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "shaved", "shaved", "shaved", "shaved", "shaved", "neat", "neat", "neat", "neat", "neat", "neat", "neat", "bushy", "bushy", "bushy", "bushy", "bushy"]);
+		if ((slave.pubicHStyle == "hairless" || slave.underArmHStyle == "hairless") && Math.random() > 0.4) {
+			slave.pubicHStyle = "hairless";
+			slave.underArmHStyle = "hairless";
+		}
+		if (slave.hColor == "blonde" && Math.random() > 0.85) {
+			slave.eyebrowHColor = jsEither(["brown", "brown", "brown", "brown", "black"]);
+			slave.override_Brow_H_Color = 1;
+		} else {
+			slave.eyebrowHColor = slave.hColor;
+		}
+		slave.eyebrowHStyle = jsEither(["bald", "shaved", "shaved", "straight", "straight", "straight", "straight", "straight", "straight", "rounded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "slanted inwards", "slanted outwards", "high-arched", "elongated", "shortened", "curved", "curved", "curved", "curved", "curved"]);
+		slave.eyebrowFullness = jsEither(["pencil-thin", "thin", "thin", "threaded", "threaded", "threaded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "tapered", "tapered", "tapered", "thick", "thick", "bushy"]);
+	};
+
+	function generateXXPuberty() {
+		if (slave.physicalAge >= slave.pubertyAgeXX) {
+			slave.pubertyXX = 1;
+		} else {
+			slave.pubertyXX = 0;
+		}
+	}
+
+	function generateXYPuberty() {
+		if (slave.balls > 0) {
+			if (slave.physicalAge >= slave.pubertyAgeXY) {
+				slave.pubertyXY = 1;
 			} else {
-				const capUpgradeCheck = setup[V.captureUpgradeRace.toLowerCase().replace(/[ -]/g, '')+'Nationalities'];
-				const keys = Object.keys(capUpgradeCheck);
-				var capUpgradeNationalities = {};
-				for (var i = 0; i < keys.length; i++) {
-					if (keys[i] in V.nationalities) {
-						capUpgradeNationalities[keys[i]] = capUpgradeCheck[keys[i]];
-					}
+				slave.pubertyXY = 0;
+			}
+		} else {
+			slave.pubertyXY = 0;
+		}
+	};
+
+	function generateAge() {
+		if (V.activeSlaveOneTimeMaxAge > 998) {
+			V.activeSlaveOneTimeMaxAge = (V.pedo_mode === 1) ? 18 : 42;
+		} else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0 && V.activeSlaveOneTimeMaxAge > 18) {
+			V.activeSlaveOneTimeMaxAge = 18;
+		}
+		if (V.retirementAge < V.activeSlaveOneTimeMaxAge) {
+			V.activeSlaveOneTimeMaxAge = (V.retirementAge - 1);
+		}
+		if (V.activeSlaveOneTimeMinAge < V.minimumSlaveAge) {
+			V.activeSlaveOneTimeMinAge = V.minimumSlaveAge;
+		} else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0) {
+			V.activeSlaveOneTimeMinAge = V.minimumSlaveAge;
+		}
+		if (V.activeSlaveOneTimeMaxAge < V.activeSlaveOneTimeMinAge) {
+			V.activeSlaveOneTimeMaxAge = V.activeSlaveOneTimeMinAge;
+		}
+		if (V.activeSlaveOneTimeMaxAge >= 30 && V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.ageAdjustOverride !== 1) {
+			V.activeSlaveOneTimeMaxAge += 10;
+		}
+		slave.actualAge = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge);
+		const secondAgeRoll = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge);
+		if (V.arcologies[0].FSYouthPreferentialist !== "unset" && V.arcologies[0].FSYouthPreferentialist >= jsRandom(1, 100)) {
+			slave.actualAge = Math.min(slave.actualAge, secondAgeRoll);
+		} else if (V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.arcologies[0].FSMaturityPreferentialist >= jsRandom(1, 100)) {
+			slave.actualAge = Math.max(slave.actualAge, secondAgeRoll);
+		}
+		if (slave.actualAge >= V.retirementAge) {
+			slave.actualAge = (V.retirementAge - 2);
+		}
+		V.activeSlaveOneTimeMinAge = 0;
+		V.activeSlaveOneTimeMaxAge = 999;
+		V.one_time_age_overrides_pedo_mode = 0;
+		V.ageAdjustOverride = 0;
+		slave.visualAge = slave.actualAge;
+		slave.physicalAge = slave.actualAge;
+		slave.ovaryAge = slave.actualAge;
+		slave.age = slave.actualAge; /*compatibility*/
+		slave.pubertyAgeXX = V.fertilityAge;
+		slave.pubertyAgeXY = V.potencyAge;
+	};
+
+	function generateIntelligence() {
+		const gaussian = gaussianPair();
+		slave.intelligence = Intelligence.random();
+		if (V.AgePenalty == 1 && slave.actualAge <= 24) {
+			if (gaussian[0] < gaussian[1] + slave.intelligence/29 + (slave.actualAge - 24)/8 - 0.35) {
+				slave.intelligenceImplant = 15;
+				if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) {
+					slave.intelligenceImplant = 30;
 				}
-				if (Object.keys(capUpgradeNationalities).length > 0) {
-					slave.nationality = hashChoice(capUpgradeNationalities);
+			}
+		} else {
+			if (gaussian[0] < gaussian[1] + slave.intelligence/29 - 0.35) { /* 40.23% chance if intelligence is 0, 99.26% chance if intelligence is 100 */
+				slave.intelligenceImplant = 15;
+				if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) {
+					slave.intelligenceImplant = 30;
+				}
+			}
+		}
+	};
+
+	function generateCareer() {
+		if (V.AgePenalty == 1) {
+			if (slave.actualAge < 16) {
+				slave.career = setup.veryYoungCareers.random();
+			} else if (slave.actualAge <= 24) {
+				slave.career = setup.youngCareers.random();
+			} else if (slave.intelligenceImplant >= 15) {
+				slave.career = setup.educatedCareers.random();
+			} else {
+				slave.career = setup.uneducatedCareers.random();
+			}
+		} else {
+			if (slave.actualAge < 16) {
+				slave.career = setup.veryYoungCareers.random();
+			} else if (slave.intelligenceImplant >= 15) {
+				slave.career = setup.educatedCareers.random();
+			} else if (slave.actualAge <= 24) {
+				slave.career = setup.youngCareers.random();
+			} else {
+				slave.career = setup.uneducatedCareers.random();
+			}
+		}
+	};
+
+	function generateNationality() {
+		if (V.fixedRace == 0) {
+			if (V.fixedNationality == 0) {
+				slave.nationality = hashChoice(V.nationalities);
+			} else {
+				slave.nationality = V.fixedNationality;
+				V.fixedNationality = 0;
+			}
+			nationalityToRace(slave);
+
+			if (passage() == "Corporate Market" && (V.captureUpgradeRace != "unselected") && (V.captureUpgradeRace != "none")) {
+				if (V.captureUpgradeRace == "mixed race") {
+					slave.race = "mixed race";
 				} else {
-					slave.nationality = hashChoice(capUpgradeCheck);
+					const capUpgradeCheck = setup[V.captureUpgradeRace.toLowerCase().replace(/[ -]/g, '')+'Nationalities'];
+					const keys = Object.keys(capUpgradeCheck);
+					var capUpgradeNationalities = {};
+					for (var i = 0; i < keys.length; i++) {
+						if (keys[i] in V.nationalities) {
+							capUpgradeNationalities[keys[i]] = capUpgradeCheck[keys[i]];
+						}
+					}
+					if (Object.keys(capUpgradeNationalities).length > 0) {
+						slave.nationality = hashChoice(capUpgradeNationalities);
+					} else {
+						slave.nationality = hashChoice(capUpgradeCheck);
+					}
+					slave.race = V.captureUpgradeRace;
 				}
-				slave.race = V.captureUpgradeRace;
 			}
+
+		} else {
+			switch (V.fixedRace) {
+				case "white":
+					slave.nationality = hashChoice(setup.whiteNationalities);
+					break;
+				case "asian":
+					slave.nationality = hashChoice(setup.asianNationalities);
+					break;
+				case "latina":
+					slave.nationality = hashChoice(setup.latinaNationalities);
+					break;
+				case "black":
+					slave.nationality = hashChoice(setup.blackNationalities);
+					break;
+				case "pacific islander":
+					slave.nationality = hashChoice(setup.pacificislanderNationalities);
+					break;
+				case "southern european":
+					slave.nationality = hashChoice(setup.southerneuropeanNationalities);
+					break;
+				case "amerindian":
+					slave.nationality = hashChoice(setup.amerindianNationalities);
+					break;
+				case "semitic":
+					slave.nationality = hashChoice(setup.semiticNationalities);
+					break;
+				case "middle eastern":
+					slave.nationality = hashChoice(setup.middleeasternNationalities);
+					break;
+				case "indo-aryan":
+					slave.nationality = hashChoice(setup.indoaryanNationalities);
+					break;
+				case "malay":
+					slave.nationality = hashChoice(setup.malayNationalities);
+					break;
+				default:
+					slave.nationality = hashChoice(V.nationalities);
+			}
+			slave.race = V.fixedRace;
+			V.fixedRace = 0;
 		}
+	};
 
-	} else {
-		switch (V.fixedRace) {
-			case "white":
-				slave.nationality = hashChoice(setup.whiteNationalities);
+	function generateAccent() {
+		nationalityToAccent(slave);
+		if ((slave.intelligenceImplant >= 15 || slave.intelligence > 95) && slave.accent >= 3 && slave.intelligence > jsRandom(0,100)) {
+			slave.accent -= 1;
+		}
+	};
+
+	function generateRacialTraits() {
+		switch (slave.race) {
+			case "black":
+				slave.lips = jsRandom(5,30);
+				slave.skin = jsEither(["black", "dark brown", "brown"]);
+				slave.hColor = jsEither(["black", "black", "black", "brown"]);
+				slave.hStyle = jsEither(["neat", "crinkled"]);
 				break;
-			case "asian":
-				slave.nationality = hashChoice(setup.asianNationalities);
+			case "white":
+				slave.lips = jsRandom(5,25);
+				if (slave.nationality == "German") {
+					slave.skin = jsEither(["pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "blue", "blue", "brown", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "blonde", "blonde", "red", "brown"]);
+				} else if (slave.nationality == "Icelandic") {
+					slave.skin = jsEither(["pale", "pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "blue", "blue", "brown", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "blonde", "blonde", "red", "brown"]);
+				} else if (slave.nationality == "Irish") {
+					slave.skin = jsEither(["pale", "pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "brown", "green", "green", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "red", "red", "red", "brown"]);
+				} else if (slave.nationality == "Scottish") {
+					slave.skin = jsEither(["pale", "fair", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "brown", "brown", "green", "green", "green"]);
+					slave.hColor = jsEither(["black", "black", "blonde", "red", "red", "red", "brown"]);
+				} else {
+					slave.skin = jsEither(["pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "brown", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "red", "brown"]);
+				}
+				slave.hStyle = "neat";
 				break;
 			case "latina":
-				slave.nationality = hashChoice(setup.latinaNationalities);
-				break;
-			case "black":
-				slave.nationality = hashChoice(setup.blackNationalities);
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["light olive", "brown", "dark brown", "tanned", "dark olive"]);
+				slave.hColor = jsEither(["black", "brown"]);
+				slave.hStyle = "neat";
 				break;
+			case "indo-aryan":
+			case "malay":
 			case "pacific islander":
-				slave.nationality = hashChoice(setup.pacificislanderNationalities);
-				break;
-			case "southern european":
-				slave.nationality = hashChoice(setup.southerneuropeanNationalities);
-				break;
 			case "amerindian":
-				slave.nationality = hashChoice(setup.amerindianNationalities);
-				break;
-			case "semitic":
-				slave.nationality = hashChoice(setup.semiticNationalities);
-				break;
-			case "middle eastern":
-				slave.nationality = hashChoice(setup.middleeasternNationalities);
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["dark", "light"]);
+				slave.hColor = "black";
+				slave.hStyle = "neat";
 				break;
-			case "indo-aryan":
-				slave.nationality = hashChoice(setup.indoaryanNationalities);
+			case "asian":
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["light olive", "dark olive", "light"]);
+				slave.hColor = "black";
+				slave.hStyle = "neat";
 				break;
-			case "malay":
-				slave.nationality = hashChoice(setup.malayNationalities);
+			case "middle eastern": 
+			case "semitic":
+			case "southern european":
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["fair", "light olive", "tanned", "light"]);
+				slave.hColor = "black";
+				slave.hStyle = "neat";
 				break;
 			default:
-				slave.nationality = hashChoice(V.nationalities);
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["pale", "dark", "light"]);
+				slave.hColor = jsEither(["black", "black", "black", "black", "brown", "brown", "blonde", "red"]);
+				slave.hStyle = "neat";
 		}
-		slave.race = V.fixedRace;
-		V.fixedRace = 0;
-	}
-};
-
-window.generateIntelligence = function generateIntelligence(slave) {
-	const gaussian = gaussianPair();
-	slave.intelligence = Intelligence.random();
-	if (State.variables.AgePenalty == 1 && slave.actualAge <= 24) {
-		if (gaussian[0] < gaussian[1] + slave.intelligence/29 + (slave.actualAge - 24)/8 - 0.35) {
-			slave.intelligenceImplant = 15;
-			if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) {
-				slave.intelligenceImplant = 30;
+		if (slave.skin == "pale" || slave.skin == "fair") {
+			if (jsRandom(1,4) == 1) {
+				slave.markings = jsEither(["freckles", "freckles", "freckles", "heavily freckled", "beauty mark", "beauty mark", "birthmark", "birthmark"]);
 			}
+		} else if (jsRandom(1,8) == 1) {
+			slave.markings = jsEither(["beauty mark", "birthmark"]);
 		}
-	} else {
-		if (gaussian[0] < gaussian[1] + slave.intelligence/29 - 0.35) { /* 40.23% chance if intelligence is 0, 99.26% chance if intelligence is 100 */
-			slave.intelligenceImplant = 15;
-			if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) {
-				slave.intelligenceImplant = 30;
+	};
+
+	function generateBoobTweaks() {
+		if (V.weightAffectsAssets != 0) {
+			if (slave.weight < -10 && slave.boobs > 200) {
+				slave.boobs -= 100;
+			} else if (slave.weight > 190 && slave.boobs < 3000) {
+				slave.boobs += (jsRandom(3,8)*100);
+			} else if (slave.weight > 160 && slave.boobs < 1500) {
+				slave.boobs += (jsRandom(2,6)*100);
+			} else if (slave.weight > 130 && slave.boobs < 1500) {
+				slave.boobs += (jsRandom(1,4)*100);
+			} else if (slave.weight > 95 && slave.boobs < 1200) {
+				slave.boobs += (jsRandom(1,3)*100);
+			} else if (slave.weight > 30 && slave.boobs < 1000) {
+				slave.boobs += 100;
 			}
 		}
-	}
-};
 
-window.generateCareer = function generateCareer(slave) {
-	if (State.variables.AgePenalty == 1) {
-		if (slave.actualAge < 16) {
-			slave.career = setup.veryYoungCareers.random();
-		} else if (slave.actualAge <= 24) {
-			slave.career = setup.youngCareers.random();
-		} else if (slave.intelligenceImplant >= 15) {
-			slave.career = setup.educatedCareers.random();
-		} else {
-			slave.career = setup.uneducatedCareers.random();
+		var BoobShapeGen = [];
+		if (slave.boobs > 250 && slave.boobs < 800) {
+			BoobShapeGen.push("perky");
+			BoobShapeGen.push("downward-facing");
 		}
-	} else {
-		if (slave.actualAge < 16) {
-			slave.career = setup.veryYoungCareers.random();
-		} else if (slave.intelligenceImplant >= 15) {
-			slave.career = setup.educatedCareers.random();
-		} else if (slave.actualAge <= 24) {
-			slave.career = setup.youngCareers.random();
+		if (slave.boobs > 400 && slave.boobs < 1200) {
+			BoobShapeGen.push("torpedo-shaped");
+			BoobShapeGen.push("wide-set");
+		}
+		if (slave.boobs > 800 && slave.physicalAge > jsRandom(10,50)) {
+			BoobShapeGen.push("saggy");
+		}
+		if (BoobShapeGen.length == 1) {
+			if (Math.random() < 0.5) {
+				slave.boobShape = jsEither(BoobShapeGen);
+			}
+		} else if (BoobShapeGen.length > 1) {
+			if (jsRandom(1,3) != 1) {
+				slave.boobShape = jsEither(BoobShapeGen);
+			}
+		}
+		
+		if (slave.boobs < 250) {
+			slave.nipples = jsEither(["tiny", "tiny", "tiny", "tiny", "cute", "cute", "puffy", "partially inverted"]);
+		} else if (slave.boobs < 500) {
+			slave.nipples = jsEither(["tiny", "cute", "cute", "cute", "puffy", "partially inverted"]);
+		} else if (slave.boobs < 1000) {
+			slave.nipples = jsEither(["tiny", "cute", "cute", "cute", "puffy", "puffy", "partially inverted", "inverted"]);
 		} else {
-			slave.career = setup.uneducatedCareers.random();
+			slave.nipples = jsEither(["cute", "puffy", "partially inverted", "inverted", "huge"]);
 		}
-	}
-};
+	};
+
+	function generateSkills() {
+		slave.vaginalSkill = (slave.vagina == 0 ? 0 : jsRandom(0,15));
+		slave.analSkill = (slave.anus == 0 ? 0 : jsRandom(0,15));
+		slave.oralSkill = jsRandom(0,15);
+		slave.entertainSkill = jsRandom(0,15);
+		slave.whoreSkill = jsRandom(0,15);
+	};
+
+	function generateDisabilities() {
+		if (slave.physicalAge >= jsRandom(0,100)) {
+			slave.eyes = -1;
+		} 
+		if (slave.physicalAge >= jsRandom(30,100)) {
+			slave.hears = -1;
+		}
+		if (V.seeExtreme == 1) {
+			let disList = [];
+			disList.push("hearNot");
+			disList.push("seeNot");
+			disList.push("speakNot");
+			let disableCount = 0;
+			if (V.oneTimeDisableDisability === 0) {
+				while (disList.length > 0) {
+					let rolled = jsEither(disList);
+					switch (rolled) {
+					case "hearNot":
+						if ((jsRandom(1,100)-(disableCount*2)) > 90) {
+							slave.hears = -2;
+						}
+						disList.delete("hearNot");
+						disableCount++;
+						break;
+					case "seeNot":
+						if ((jsRandom(1,100)-(disableCount*2)) > 90) {
+							slave.eyes = -2;
+						}
+						disList.delete("seeNot");
+						disableCount++;
+						break;
+					case "speakNot":
+						if ((jsRandom(1,100)-(disableCount*2)) > 90) {
+							slave.voice = 0;
+						}
+						disList.delete("speakNot");
+						disableCount++;
+						break;
+					}
+				}
+			}
+			V.oneTimeDisableDisability = 0;
+		}
+	};
+
+	return GenerateNewSlave;
+})();
 
 /*SecForceEX JS*/
 window.SFC = function() {
diff --git a/src/js/generateNewSlaveJS.tw b/src/js/generateNewSlaveJS.tw
new file mode 100644
index 0000000000000000000000000000000000000000..056ca833fe772f0b7752984e005d090cfc8f99cf
--- /dev/null
+++ b/src/js/generateNewSlaveJS.tw
@@ -0,0 +1,1399 @@
+:: Generate New Slave JS [script]
+
+window.GenerateNewSlave = (function(){
+	'use strict';
+	let V, slave;
+
+	function GenerateNewSlave(sex) {
+		V = State.variables;
+		BaseSlave();
+		slave = V.activeSlave;
+
+		preGenCombinedStats();
+		if (!sex) {
+			if (jsRandom(0,99) < V.seeDicks) {
+				GenerateXYSlave();
+			} else if (V.seeDicks > 0) {
+				var femaleSlaveGen = 80;
+				if (V.arcologies[0].FSGenderFundamentalistSMR == 1 || V.arcologies[0].FSRepopulationFocusSMR == 1) {
+					femaleSlaveGen = 90;
+				} else if (V.arcologies[0].FSGenderRadicalist != "unset") {
+					femaleSlaveGen = 50;
+				}
+				if (jsRandom(1,100) > femaleSlaveGen && jsRandom(0,99) < V.seeDicks) {
+					GenerateXYSlave();
+				} else {
+					GenerateXXSlave();
+				}
+			} else {
+				GenerateXXSlave();
+			}
+		} else if (sex == "XY") {
+			GenerateXYSlave();
+		} else {
+			GenerateXXSlave();
+		}
+
+		postGenCleanup();
+	};
+
+	function preGenCombinedStats() {
+		slave.ID = V.IDNumber++;
+		slave.weekAcquired = V.week;
+		slave.canRecruit = 1;
+		slave.devotion = jsRandom(-90,-60);
+		slave.trust = jsRandom(-45,-25);
+		slave.weight = jsRandom(-100,180);
+		slave.health = jsRandom(-50,50);
+		
+		WombInit(slave);
+		generateAge();
+		generateIntelligence();
+		generateCareer();
+		generateNationality(); /* includes race selection */
+		generateAccent();
+		nationalityToName(slave);
+		generateRacialTraits();
+	};
+
+	function postGenCleanup() {
+		generateBoobTweaks(); /* split this up for female vs. male? */
+		generateSkills();
+		generateDisabilities();
+		generatePronouns(slave);
+		if (passage() == "Slave Markets" && V.slaveMarket == "corporate" && V.captureUpgradeRace != "unselected" && V.captureUpgradeRace != "none") {
+			slave.race = V.captureUpgradeRace;
+		}
+	};
+
+	function GenerateXXSlave() {
+		slave.ovaries = 1;
+		slave.pubertyXY = 0;
+		slave.energy = jsRandom(1,85);
+		/* Superfetation as rare genetic disorder 1 from 100, not active for now. 
+		if (jsRandom(0,99) < 1) {
+			slave.superfetation = 1;
+		}
+		*/
+		
+		generateXXBodyProportions();
+		generateVagina();
+		generateXXPreferences();
+		generateXXButt();
+		generateXXBoobs();
+		generateXXFace();
+		generateXXPregAdaptation();
+		generateXXVoice();
+		generateXXTeeth();
+		generateXXMods();
+		generateXXBodyHair();
+		generateXXPuberty();
+	};
+
+	function GenerateXYSlave() {		
+		slave.genes = "XY";
+		slave.hLength = 10;
+		slave.prostate = 1;
+		slave.pubertyXX = 0;
+		slave.energy = jsRandom(15,90);
+		
+		generateXYBodyProportions();
+		generateDick();
+		generateCircumcision();
+		generateXYPreferences(); /* must happen after genitalia generation */
+		generateXYButt(); /* must happen after preferences */
+		generateXYBoobs();
+		generateXYFace();
+		generateXYPregAdaptation();
+		generateXYVoice();
+		generateXYTeeth();
+		generateXYMods();
+		generateXYBodyHair();
+		generateXYPuberty();
+	};
+
+	function generateXXBodyProportions() {
+		slave.height = Math.round(Height.random(slave));
+		if (slave.height >= Height.mean(slave) * 170/162.5) {
+			slave.hips = jsEither([-1, 0, 0, 1, 1, 2, 2]);
+			slave.shoulders = jsEither([-1, -1, 0, 0, 0, 1]);
+		} else {
+			slave.hips = jsEither([-1, 0, 0, 0, 1, 1, 2]);
+			slave.shoulders = jsEither([-2, -1, -1, 0, 0, 1]);
+		}
+		if (slave.physicalAge <= 11) {
+			slave.hips = jsEither([-2, -2, -1, -1, 0]);
+		} else if (slave.physicalAge <= 13) {
+			slave.hips = jsEither([-2, -1, -1, 0, 1]);
+		}
+		if (slave.weight < -30) {
+			slave.waist = jsRandom(-55,0);
+		} else if (slave.physicalAge < 13) {
+			slave.waist = jsRandom(-25,25);
+		} else if (slave.weight <= 30) {
+			slave.waist = jsRandom(-45,45);
+		} else if (slave.weight <= 160) {
+			slave.waist = jsRandom(0,55);
+		} else {
+			slave.waist = jsRandom(50,100);
+		}
+	};
+
+	function generateXYBodyProportions() {
+		slave.height = Math.round(Height.random(slave));
+		if (slave.physicalAge <= 13) {
+			if (slave.height > Height.mean(slave) * 170/172.5) {
+				slave.hips = jsEither(-2, -1, -1, 0, 1);
+				slave.shoulders = jsEither(-1, -1, 0, 0, 0, 1);
+			} else {
+				slave.hips = jsEither(-2, -2, -1, -1, 0);
+				slave.shoulders = jsEither(-2, -1, -1, 0, 0, 1);
+			}
+		} else {
+			if (slave.height > Height.mean(slave) * 170/172.5) {
+				slave.hips = jsEither(-2, -1, -1, 0, 1);
+				slave.shoulders = jsEither(-1, 0, 1, 1, 2, 2);
+			} else {
+				slave.hips = jsEither(-2, -2, -1, -1, 0);
+				slave.shoulders = jsEither(-1, 0, 0, 1, 1, 2);
+			}
+		}
+		if (slave.physicalAge < 13) {
+			slave.waist = jsRandom(-15,25);
+		} else if (slave.weight < -30) {
+			slave.waist = jsRandom(-45,45);
+		} else if (slave.weight <= 30) {
+			slave.waist = jsRandom(-15,65);
+		} else if (slave.weight <= 160) {
+			slave.waist = jsRandom(5,100);
+		} else {
+			slave.waist = jsRandom(50,100);
+		}
+	};
+
+	function generateVagina() {
+		if (slave.physicalAge <= 13) {
+			slave.vagina = jsEither([0, 0, 0, 0, 0, 0, 0, 1]);
+		} else if (slave.physicalAge <= 15) {
+			slave.vagina = jsEither([0, 0, 0, 0, 0, 0, 1, 1]);
+		} else if (slave.physicalAge <= 17) {
+			slave.vagina = jsEither([0, 0, 0, 0, 0, 1, 1, 1]);
+		} else if (slave.physicalAge < 20) {
+			slave.vagina = jsEither([0, 1]);
+		} else if (slave.physicalAge > 30) {
+			slave.vagina = jsEither([1, 1, 1, 1, 2]);
+		} else {
+			slave.vagina = jsEither([0, 0, 1, 1, 1]);
+		}
+		
+		if (slave.physicalAge <= 11) {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 0, 1]);
+		} else if (slave.physicalAge <= 13) {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 1]);
+		} else if (slave.physicalAge <= 15) {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 2]);
+		} else {
+			slave.clit = jsEither([0, 0, 0, 0, 0, 0, 1, 1, 2]);
+		}
+		
+		if (slave.physicalAge <= 11) {
+			slave.labia = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 1]);
+		} else if (slave.physicalAge <= 12) {
+			slave.labia = jsEither([0, 0, 0, 0, 0, 0, 1, 1, 1]);
+		} else if (slave.physicalAge <= 13) {
+			slave.labia = jsEither([0, 0, 0, 0, 0, 1, 1, 1, 1]);
+		} else if (slave.physicalAge <= 14) {
+			slave.labia = jsEither([0, 0, 0, 0, 1, 1, 1, 1, 2]);
+		} else if (slave.physicalAge <= 15) {
+			slave.labia = jsEither([0, 0, 0, 1, 1, 1, 1, 2, 2]);
+		} else {
+			slave.labia = jsEither([0, 0, 0, 1, 1, 1, 1, 2, 2, 3]);
+		}
+		
+		if (slave.energy < random(1,80)) {
+			slave.vaginaLube = 0;
+		} else if ( slave.physicalAge > random(35,60)) {
+			slave.vaginaLube = 0;
+		} else {
+			slave.vaginaLube = 1;
+		}		
+		slave.foreskin = jsRandom(0,4);
+	};
+
+	function generateDick() {
+		slave.vagina = -1;
+		slave.clit = 0;
+		slave.preg = 0;
+		
+		if (slave.physicalAge <= 13) {
+			slave.dick = jsEither([1, 1, 1, 1, 2, 2, 2, 3]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3]);
+			} else {
+				slave.balls = jsEither([1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3]);
+			}
+			slave.scrotum = slave.balls;
+		} else if (slave.physicalAge <= 15) {
+			slave.dick = jsEither([1, 1, 1, 2, 2, 2, 3]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4]);
+			} else {
+				slave.balls = jsEither([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4]);
+			}
+			slave.scrotum = slave.balls;
+		} else if (slave.physicalAge <= 17) {
+			slave.dick = jsEither([1, 1, 2, 2, 3, 3]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5]);
+			} else {
+				slave.balls = jsEither([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5]);
+			}
+			slave.scrotum = slave.balls;
+		} else {
+			slave.dick = jsEither([1, 2, 2, 2, 3, 3, 3, 4, 4, 5]);
+			if (V.seeExtreme == 1) {
+				slave.balls = jsEither([0, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5]);
+			} else {
+				slave.balls = jsEither([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5]);
+			}
+			if (slave.balls != 0) {
+				slave.scrotum = slave.balls + jsEither([0, 0, 1]);
+			} else {
+				slave.scrotum = 0;
+			}
+			if (jsRandom(1,100) < 3) {
+				slave.vasectomy = 1;
+			}
+		}
+	};
+
+	function generateCircumcision() {
+		/* The default rate of 50* is wildly unrepresentative, and there is extreme regional variation. */
+		/*
+		 What we want is the prevalence among newborns, since this game
+		 happens about 20 years in the future, but we'll use this lacking
+		 something better.
+		 https://pophealthmetrics.biomedcentral.com/articles/10.1186/s12963-016-0073-5
+		 Right now we mostly just break it down by country.
+		 It would be better to break it down by both country
+		 and race if statistics are available.
+		*/
+		if (V.seeCircumcision == 0) {
+			slave.foreskin = slave.dick + jsRandom(0,1);
+		} else {
+			/* Temporarily use activeSlave.foreskin to store the chance of circumcision. */
+			switch (slave.nationality) {
+				case "Afghan":
+				case "Iranian":
+				case "Moroccan":
+				case "Palestinian":
+				case "Sahrawi":
+				case "Tunisian":
+					slave.foreskin = 100;
+					break;
+				case "Comorian":
+				case "Gabonese":
+				case "Iraqi":
+				case "Jordanian":
+				case "Kurdish":
+				case "Mauritanian":
+				case "Nigerian":
+				case "Tajik":
+				case "Turkish":
+				case "Yemeni":
+					slave.foreskin = 99;
+					break;
+				case "Algerian":
+				case "Azerbaijani":
+				case "Liberian":
+				case "Maldivian":
+					slave.foreskin = 98;
+					break;
+				case "Djiboutian":
+				case "Eritrean":
+				case "Ivorian":
+				case "Libyan":
+				case "Saudi":
+				case "Uzbek":
+					slave.foreskin = 97;
+					break;
+				case "Nigerien":
+				case "Pakistani":
+				case "Sierra Leonean":
+				case "Turkmen":
+				case "Zairian":
+					slave.foreskin = 96;
+					break;
+				case "a Cook Islander":
+				case "Egyptian":
+				case "Gambian":
+				case "Guamanian":
+				case "Malagasy":
+				case "Nauruan":
+				case "Ni-Vanuatu":
+				case "Niuean":
+				case "Palauan":
+				case "Samoan":
+				case "a Solomon Islander":
+				case "Togolese":
+				case "Tongan":
+				case "Tuvaluan":
+					slave.foreskin = 95;
+					break;
+				case "Cameroonian":
+				case "Senegalese":
+				case "Somali":
+					slave.foreskin = 94;
+					break;
+				case "Bangladeshi":
+				case "Beninese":
+				case "Bissau-Guinean":
+				case "Indonesian":
+				case "Syrian":
+					slave.foreskin = 93;
+					break;
+				case "Ethiopian":
+				case "Filipina":
+				case "Ghanan":
+				case "Israeli":
+				case "Kosovan":
+					slave.foreskin = 92;
+					break;
+				case "Kenyan":
+				case "Kyrgyz":
+					slave.foreskin = 91;
+					break;
+				case "Burkinabé":
+				case "Omani":
+					slave.foreskin = 88;
+					break;
+				case "Equatoguinean":
+					slave.foreskin = 87;
+					break;
+				case "Kuwaiti":
+				case "Malian":
+					slave.foreskin = 86;
+					break;
+				case "Guinean":
+					slave.foreskin = 84;
+					break;
+				case "Bahraini":
+					slave.foreskin = 81;
+					break;
+				case "French Polynesian":
+					slave.foreskin = 78;
+					break;
+				case "American":
+				case "Qatari":
+					slave.foreskin = 77;
+					break;
+				case "Emirati":
+					slave.foreskin = 76;
+					break;
+				case "Chadian":
+					slave.foreskin = 74;
+					break;
+				case "Tanzanian":
+					slave.foreskin = 72;
+					break;
+				case "Congolese":
+					slave.foreskin = 70;
+					break;
+				case "Central African":
+					slave.foreskin = 63;
+					break;
+				case "Burundian":
+				case "Malaysian":
+					slave.foreskin = 61;
+					break;
+				case "Lebanese":
+					slave.foreskin = 60;
+					break;
+				case "Angolan":
+					slave.foreskin = 58;
+					break;
+				case "Fijian":
+				case "Kazakh":
+					slave.foreskin = 56;
+					break;
+				case "Bruneian":
+				case "Korean":
+				case "Mosotho":
+					/* Population-weighted average of South Korea and North Korea. */
+					slave.foreskin = 52;
+					break;
+				case "New Caledonian":
+					slave.foreskin = 50;
+					break;
+				case "Albanian":
+					slave.foreskin = 48;
+					break;
+				case "Mozambican":
+					slave.foreskin = 47;
+					break;
+				case "South African":
+					slave.foreskin = 45;
+					break;
+				case "Dominican":
+					slave.foreskin = 43;
+					break;
+				case "Bosnian":
+					slave.foreskin = 42;
+					break;
+				case "Sudanese":
+					slave.foreskin = 39;
+					break;
+				case "Mexican":
+					slave.foreskin = 38;
+					break;
+				case "Macedonian":
+					slave.foreskin = 34;
+					break;
+				case "a New Zealander":
+					slave.foreskin = 33;
+					break;
+				case "Canadian":
+					slave.foreskin = 32;
+					break;
+				case "Scottish":
+					slave.foreskin = 28;
+					break;
+				case "Australian":
+				case "Ugandan":
+					slave.foreskin = 27;
+					break;
+				case "Namibian":
+					slave.foreskin = 26;
+					break;
+				case "South Sudanese":
+					slave.foreskin = 24;
+					break;
+				case "Belgian":
+				case "Cypriot":
+				case "Thai":
+					slave.foreskin = 23;
+					break;
+				case "Malawian":
+					slave.foreskin = 22;
+					break;
+				case "British":
+					slave.foreskin = 21;
+					break;
+				case "Puerto Rican":
+					slave.foreskin = 20;
+					break;
+				case "Montenegrin":
+					slave.foreskin = 19;
+					break;
+				case "Mauritian":
+					slave.foreskin = 17;
+					break;
+				case "Motswana":
+				case "Singaporean":
+				case "Surinamese":
+					slave.foreskin = 15;
+					break;
+				case "Chinese":
+				case "French":
+				case "Indian":
+				case "Jamaican":
+					slave.foreskin = 14;
+					break;
+				case "Bulgarian":
+				case "Rwandan":
+				case "Zambian":
+					slave.foreskin = 13;
+					break;
+				case "French Guianan":
+				case "Guyanese":
+				case "Russian":
+					slave.foreskin = 12;
+					break;
+				case "German":
+					slave.foreskin = 11;
+					break;
+				case "Belarusian":
+				case "Georgian":
+				case "Papua New Guinean":
+					slave.foreskin = 10;
+					break;
+				case "Japanese":
+				case "Zimbabwean":
+					slave.foreskin = 9;
+					break;
+				case "Slovene":
+				case "Sri Lankan":
+				case "Swazi":
+				case "Taiwanese":
+					slave.foreskin = 8;
+					break;
+				case "Catalan":
+				case "Haitian":
+				case "Spanish":
+					slave.foreskin = 7;
+					break;
+				case "Austrian":
+				case "Dutch":
+				case "East Timorese":
+				case "Swiss":
+				case "Trinidadian":
+					slave.foreskin = 6;
+					break;
+				case "Danish":
+				case "Greek":
+				case "a Liechtensteiner":
+				case "Swedish":
+					slave.foreskin = 5;
+					break;
+				case "Burmese":
+				case "Cambodian":
+				case "Mongolian":
+				case "Nepalese":
+				case "Peruvian":
+				case "Serbian":
+					slave.foreskin = 4;
+					break;
+				case "Argentinian":
+				case "Italian":
+				case "Norwegian":
+					slave.foreskin = 3;
+					break;
+				case "Luxembourgian":
+				case "Tibetan":
+				case "Ukrainian":
+				case "Vincentian":
+					slave.foreskin = 2;
+					break;
+				case "Andorran":
+				case "Barbadian":
+				case "Bermudian":
+				case "Bhutanese":
+				case "Brazilian":
+				case "Croatian":
+				case "Finnish":
+				case "Hungarian":
+				case "Irish":
+				case "Moldovan":
+				case "Monégasque":
+				case "Panamanian":
+				case "Portuguese":
+				case "Seychellois":
+				case "Uruguayan":
+					slave.foreskin = 1;
+					break;
+				case "Antiguan":
+				case "Armenian":
+				case "Bahamian":
+				case "Belizean":
+				case "Bolivian":
+				case "Cape Verdean":
+				case "Chilean":
+				case "Colombian":
+				case "Costa Rican":
+				case "Cuban":
+				case "Czech":
+				case "Dominiquais":
+				case "Ecuadorian":
+				case "Estonian":
+				case "Greenlandic":
+				case "Grenadian":
+				case "Guatemalan":
+				case "Honduran":
+				case "I-Kiribati":
+				case "Icelandic":
+				case "Kittitian":
+				case "Laotian":
+				case "Latvian":
+				case "Lithuanian":
+				case "Maltese":
+				case "Marshallese":
+				case "Micronesian":
+				case "Nicaraguan":
+				case "Paraguayan":
+				case "Polish":
+				case "Romanian":
+				case "Saint Lucian":
+				case "Salvadoran":
+				case "Sammarinese":
+				case "São Toméan":
+				case "Slovak":
+				case "Vatican":
+				case "Venezuelan":
+				case "Vietnamese":
+					slave.foreskin = 0;
+					break;
+				default:
+					/* Some overlooked country, or possibly stateless. Use global average. */
+					slave.foreskin = 38;
+			}
+			/* Second pass for minorities in other countries. */
+			if (slave.race == "middle eastern" && slave.foreskin < 76) {
+				slave.foreskin = 76;
+			}
+			if (slave.race == "semitic" && slave.foreskin < 90) {
+				slave.foreskin = 90;
+			}
+			/* Chance activeSlave.foreskin back to the normal meaning. */
+			if (jsRandom(0,99) < slave.foreskin) {
+				slave.foreskin = 0;
+			} else {
+				slave.foreskin = slave.dick + jsRandom(0,1);
+			}
+		}
+	};
+
+	function generateXXPreferences() {
+		randomizeAttraction(slave);
+		slave.fetishStrength = jsRandom(0,90);
+		slave.fetish = jsEither(["none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "submissive", "submissive", "cumslut", "humiliation", "humiliation", "buttslut", "boobs", "pregnancy", "dom", "sadist", "masochist"]);
+		slave.behavioralFlaw = jsEither(["none", "none", "none", "arrogant", "bitchy", "odd", "hates men", "hates women", "hates women", "anorexic", "gluttonous", "devout", "liberated"]);
+		
+		if (slave.behavioralFlaw == "devout") {
+			slave.sexualFlaw = jsEither(["none", "repressed", "shamefast", "apathetic", "crude", "judgemental"]);
+		} else {
+			slave.sexualFlaw = jsEither(["none", "none", "none", "none", "hates oral", "hates anal", "hates penetration", "repressed", "idealistic", "shamefast", "apathetic", "crude", "judgemental"]);
+		}
+		if (slave.behavioralFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.behavioralQuirk = jsEither(["confident", "cutting", "funny", "adores women", "adores men", "fitness", "insecure", "sinful", "advocate"]);
+		}
+		if (slave.sexualFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.sexualQuirk = jsEither(["gagfuck queen", "painal queen", "strugglefuck queen", "tease", "romantic", "perverted", "caring", "unflinching", "size queen"]);
+		}
+	};
+
+	function generateXYPreferences() {
+		randomizeAttraction(slave);
+		slave.fetishStrength = jsRandom(0,90);
+		slave.fetish = jsEither(["none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "submissive", "cumslut", "humiliation", "buttslut", "buttslut", "boobs", "dom", "sadist", "masochist"]);
+		slave.behavioralFlaw = jsEither(["none", "none", "none", "arrogant", "bitchy", "odd", "hates men", "hates men", "hates men", "hates women", "anorexic", "gluttonous", "devout", "liberated"]);
+		
+		if (slave.behavioralFlaw == "devout") {
+			slave.sexualFlaw = jsEither(["none", "repressed", "shamefast", "apathetic", "crude", "judgemental"]);
+		} else {
+			slave.sexualFlaw = jsEither(["none", "none", "none", "none", "hates oral", "hates anal", "hates anal", "repressed", "idealistic", "shamefast", "apathetic", "crude", "judgemental"]);
+		}
+		if (slave.behavioralFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.behavioralQuirk = jsEither(["confident", "cutting", "funny", "adores women", "adores men", "fitness", "insecure", "sinful", "advocate"]);
+		}
+		if (slave.sexualFlaw == "none" && jsRandom(1,10) == 1) {
+			slave.sexualQuirk = jsEither(["gagfuck queen", "painal queen", "strugglefuck queen", "tease", "romantic", "perverted", "caring", "unflinching", "size queen"]);
+		}
+	};
+
+	function generateXXButt() {
+		if (slave.physicalAge <= 11) {
+			slave.butt = jsEither([1, 1, 1, 1, 1, 1, 1]);
+		} else if (slave.physicalAge <= 12) {
+			slave.butt = jsEither([1, 1, 1, 1, 1, 2, 2]);
+		} else if (slave.physicalAge <= 13) {
+			slave.butt = jsEither([1, 1, 1, 1, 2, 2, 2]);
+		} else if (slave.physicalAge <= 14) {
+			slave.butt = jsEither([1, 1, 1, 2, 2, 2, 3]);
+		} else if (slave.physicalAge <= 15) {
+			slave.butt = jsEither([1, 1, 2, 2, 2, 2, 3]);
+		} else {
+			switch (slave.race) {
+				case "black":
+					slave.butt = jsEither([1, 2, 2, 3, 3, 4, 4]);
+					break;
+				case "indo-aryan":
+				case "malay":
+				case "pacific islander":
+				case "amerindian":
+				case "asian":
+				case "middle eastern": 
+				case "semitic":
+				case "southern european":
+					slave.butt = jsEither([1, 2, 2, 3, 3]);
+					break;
+				default:
+					slave.butt = jsEither([1, 2, 2, 3, 3, 4]);
+			}
+		}
+		if (V.weightAffectsAssets != 0) {
+			if (slave.weight < -10 && slave.butt > 1) {
+				slave.butt -= 1;
+			} else if (slave.weight > 100 && slave.butt < 6) {
+				slave.butt += jsRandom(1,2);
+			} else if (slave.weight > 10 && slave.butt < 4) {
+				slave.butt += 1;
+			}
+		}
+		slave.anus = jsEither([0, 0, 1, 1, 2]);
+		slave.analArea = slave.anus + jsEither([0, 0, 0, 1]);
+	};
+
+	function generateXYButt() {
+		if (slave.physicalAge <= 13) {
+			slave.butt = jsEither([1, 1, 1, 2, 2, 3, 3, 4]);
+		} else {
+			slave.butt = jsEither([1, 1, 2, 3]);
+		}
+		if (V.weightAffectsAssets != 0) {
+			if (slave.weight < -10 && slave.butt > 1) {
+				slave.butt -= 1;
+			} else if (slave.weight > 100 && slave.butt < 6) {
+				slave.butt += jsRandom(1,2);
+			} else if (slave.weight > 10 && slave.butt < 4) {
+				slave.butt += 1;
+			}
+		}
+		if (slave.attrXY > 0) {
+			slave.anus = jsEither([0, 1, 2]);
+		} else {
+			if (slave.physicalAge <= 13) {
+				slave.anus = jsEither([0, 0, 0, 0, 0, 1]);
+			} else if (slave.physicalAge <= 15) {
+				slave.anus = jsEither([0, 0, 0, 0, 1, 1, 1]);
+			} else if (slave.physicalAge <= 17) {
+				slave.anus = jsEither([0, 0, 0, 1, 1, 1]);
+			} else {
+				slave.anus = jsEither([0, 0, 1, 1, 2]);
+			}
+		}
+		slave.analArea = slave.anus + jsEither([0, 0, 0, 1]);
+	};
+
+	function generateXXBoobs() {
+		if (slave.physicalAge <= 10) {
+			slave.boobs = 100;
+		} else if (slave.physicalAge == 11) {
+			slave.boobs = jsEither([100, 100, 150, 150, 150, 300]);
+		} else if (slave.physicalAge == 12) {
+			slave.boobs = jsEither([100, 100, 150, 150, 150, 200, 200, 300]);
+		} else if (slave.physicalAge == 13) {
+			slave.boobs = jsEither([100, 150, 200, 200, 300, 300, 300, 400]);
+		} else if (slave.physicalAge == 14) {
+			slave.boobs = jsEither([100, 150, 200, 300, 300, 300, 350, 400, 400]);
+		} else if (slave.physicalAge == 15) {
+			slave.boobs = jsEither([150, 200, 300, 300, 300, 350, 350, 350, 400, 400, 450, 450]);
+		} else {
+			switch (slave.race) {
+				case "black":
+					slave.boobs = BoobGenerator.rollBreast(150);
+					break;
+				case "white":
+					slave.boobs = BoobGenerator.rollBreast(50);
+					break;
+				case "asian":
+					slave.boobs = BoobGenerator.rollBreast(-100);
+					break;
+				default:
+					slave.boobs = BoobGenerator.rollBreast(0);
+			}
+		}
+	};
+
+	function generateXYBoobs() {
+		slave.boobs = jsEither([100, 200, 200, 300, 300, 400, 500]);
+	};
+
+	function generateXXFace() {
+		slave.face = jsRandom(-60,60);
+		if (jsRandom(0,2) == 0) {
+			slave.face = jsRandom(-10,10);
+		}
+		if (slave.physicalAge > 40) {
+			slave.face -= jsRandom(0,20);
+		} else if (slave.physicalAge > 35) {
+			slave.face -= jsRandom(0,10);
+		} else if (slave.physicalAge <= 20) {
+			slave.face += jsRandom(0,20);
+		} else if (slave.physicalAge <= 25) {
+			slave.face += jsRandom(0,10);
+		}
+		if (slave.physicalAge > 10) {
+			slave.faceShape = jsEither(["androgynous", "cute", "sensual", "exotic", "normal", "normal"]);
+		} else {
+			slave.faceShape = jsEither(["androgynous", "androgynous", "cute", "cute", "sensual", "exotic", "normal", "normal"]);
+		}
+		switch (slave.faceShape) {
+			case "sensual":
+			case "cute":
+				slave.face += jsRandom(0,20);
+				break;
+			case "exotic":
+			case "androgynous":
+				slave.face += jsRandom(-10,10);
+				break;
+			case "masculine":
+				slave.face += jsRandom(-10,0);
+		}
+	};
+
+	function generateXYFace() {
+		slave.face = jsRandom(-70,20);
+		if (jsRandom(0,2) == 0) {
+			slave.face = jsRandom(-40,-10);
+		}
+		if (slave.physicalAge > 40) {
+			slave.face -= jsRandom(0,20);
+		} else if (slave.physicalAge > 35) {
+			slave.face -= jsRandom(0,10);
+		} else if (slave.physicalAge <= 20) {
+			slave.face += jsRandom(0,20);
+		} else if (slave.physicalAge <= 25) {
+			slave.face += jsRandom(0,10);
+		}
+		if (slave.physicalAge >= 17) {
+			slave.faceShape = jsEither(["masculine", "masculine", "masculine", "androgynous"]);
+		} else if (slave.physicalAge >= 15) {
+			slave.faceShape = jsEither(["masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "androgynous", "sensual", "exotic", "normal"]);
+		} else if (slave.physicalAge >= 13) {
+			slave.faceShape = jsEither(["masculine", "masculine", "masculine", "androgynous", "cute", "sensual", "exotic", "normal"]);
+		} else if (slave.physicalAge >= 11) {
+			slave.faceShape = jsEither(["masculine", "androgynous", "cute", "sensual", "exotic", "normal", "normal"]);
+		} else {
+			slave.faceShape = jsEither(["androgynous", "androgynous", "cute", "cute", "sensual", "exotic", "normal", "normal"]);
+		}
+		switch (slave.faceShape) {
+			case "sensual":
+			case "cute":
+				slave.face += jsRandom(0,20);
+				break;
+			case "exotic":
+			case "androgynous":
+				slave.face += jsRandom(-10,10);
+				break;
+			case "masculine":
+				slave.face += jsRandom(-10,0);
+		}
+	};
+
+	function generateXXPregAdaptation() {
+		if (slave.physicalAge <= 6) {
+			slave.pregAdaptation = 5;
+		} else if (slave.physicalAge <= 11) {
+			slave.pregAdaptation = slave.physicalAge - 1;
+		} else if (slave.physicalAge <= 14) {
+			slave.pregAdaptation = 4*(slave.physicalAge - 12) + 14;
+		} else if (slave.physicalAge <= 15) {
+			slave.pregAdaptation = 28;
+		} else if (slave.physicalAge <= 16) {
+			slave.pregAdaptation = 34;
+		} else if (slave.physicalAge <= 17) {
+			slave.pregAdaptation = 42;
+		} else {
+			slave.pregAdaptation = 50;
+		}
+	};
+
+	function generateXYPregAdaptation() {
+		if (slave.physicalAge <= 6) {
+			slave.pregAdaptation = 5;
+		} else if (slave.physicalAge <= 11) {
+			slave.pregAdaptation = slave.physicalAge - 1;
+		} else if (slave.physicalAge <= 15) {
+			slave.pregAdaptation = 2*(slave.physicalAge - 12) + 12;
+		} else {
+			slave.pregAdaptation = 20;
+		}
+	};
+
+	function generateXXVoice() {
+		if (slave.physicalAge <= 13) {
+			slave.voice = jsEither([2, 2, 2, 3, 3, 3, 3, 3, 3]);
+		} else if (slave.physicalAge <= 16) {
+			slave.voice = jsEither([2, 2, 2, 2, 2, 3, 3, 3, 3]);
+		} else {
+			slave.voice = jsEither([1, 2, 2, 2, 2, 2, 2, 3, 3, 3]);
+		}
+	};
+
+	function generateXYVoice() {
+		if (slave.physicalAge <= 11) {
+			slave.voice = jsEither([2, 2, 2, 3, 3, 3, 3, 3, 3]);
+		} else if (slave.physicalAge <= 13) {
+			slave.voice = jsEither([1, 1, 2, 2, 2, 2, 2, 3, 3]);
+		} else if (slave.physicalAge <= 16) {
+			slave.voice = jsEither([1, 1, 1, 2, 2, 2, 2, 2, 3]);
+		} else {
+			if (slave.balls > 2) {
+				slave.voice = 1;
+			} else if (slave.balls > 0) {
+				slave.voice = jsEither([1, 1, 2]);
+			} else {
+				slave.voice = jsEither([1, 2, 2]);
+			}
+		}
+	};
+
+	function generateXXTeeth() {
+		var femaleCrookedTeethGen = slave.intelligence+slave.intelligenceImplant;
+		if ("American" == slave.nationality) {
+			femaleCrookedTeethGen += 20;
+		} else if (["Andorran", "Antiguan", "Argentinian", "Aruban", "Australian", "Austrian", "Bahamian", "Bahraini", "Barbadian", "Belarusian", "Belgian", "Bermudian", "Brazilian", "British", "Bruneian", "Bulgarian", "Canadian", "Catalan", "Chilean", "a Cook Islander", "Croatian", "Czech", "Cypriot", "Danish", "Dutch", "Emirati", "Estonian", "Finnish", "French", "German", "Greek", "Greenlandic", "Guamanian", "Hungarian", "Icelandic", "Irish", "Israeli", "Italian", "Japanese", "Kazakh", "Korean", "Kuwaiti", "Latvian", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Malaysian", "Maltese", "Mauritian", "Monégasque", "Montenegrin", "New Caledonian", "a New Zealander", "Niuean", "Norwegian", "Omani", "Palauan", "Panamanian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Sammarinese", "Saudi", "Seychellois", "Singaporean", "Slovak", "Slovene", "Spanish", "Swedish", "Swiss", "Taiwanese", "Trinidadian", "Uruguayan", "Vatican"].includes(slave.nationality)) {
+			/* do nothing */
+		} else {
+			femaleCrookedTeethGen -= 20;
+		}
+		
+		if (jsRandom(0, femaleCrookedTeethGen) <= 15 && slave.physicalAge >= 12) {
+			slave.teeth = "crooked";
+		}
+		
+		if (slave.physicalAge < 6) {
+			slave.teeth = "baby";
+		} else if (slave.physicalAge < 12) {
+			slave.teeth = "mixed";
+		}
+	};
+
+	function generateXYTeeth() {
+		var maleCrookedTeethGen = slave.intelligence+slave.intelligenceImplant;
+		if ("American" == slave.nationality) {
+			maleCrookedTeethGen += 22;
+		} else if (["Andorran", "Antiguan", "Argentinian", "Aruban", "Australian", "Austrian", "Bahamian", "Bahraini", "Barbadian", "Belarusian", "Belgian", "Bermudian", "Brazilian", "British", "Bruneian", "Bulgarian", "Canadian", "Catalan", "Chilean", "a Cook Islander", "Croatian", "Czech", "Cypriot", "Danish", "Dutch", "Emirati", "Estonian", "Finnish", "French", "German", "Greek", "Greenlandic", "Guamanian", "Hungarian", "Icelandic", "Irish", "Israeli", "Italian", "Japanese", "Kazakh", "Korean", "Kuwaiti", "Latvian", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Malaysian", "Maltese", "Mauritian", "Monégasque", "Montenegrin", "New Caledonian", "a New Zealander", "Niuean", "Norwegian", "Omani", "Palauan", "Panamanian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Sammarinese", "Saudi", "Seychellois", "Singaporean", "Slovak", "Slovene", "Spanish", "Swedish", "Swiss", "Taiwanese", "Trinidadian", "Uruguayan", "Vatican"].includes(slave.nationality)) {
+			/* do nothing */
+		} else {
+			maleCrookedTeethGen -= 20;
+		}
+		
+		if (jsRandom(0, maleCrookedTeethGen) <= 15 && slave.physicalAge >= 12) {
+			slave.teeth = "crooked";
+		}
+		
+		if (slave.physicalAge < 6) {
+			slave.teeth = "baby";
+		} else if (slave.physicalAge < 12) {
+			slave.teeth = "mixed";
+		}
+	};
+
+	function generateXXMods() {
+		if (passage() != "Starting Girls") {
+			slave.earPiercing = jsEither([0,1]);
+			slave.nosePiercing = jsEither([0,0,0,1]);
+			slave.eyebrowPiercing = jsEither([0,0,0,0,0,1]);
+			slave.clitPiercing = jsEither([0,0,0,0,0,1]);
+			slave.lipsPiercing = jsEither([0,0,0,0,0,1]);
+			slave.navelPiercing = jsEither([0,0,0,1]);
+			slave.nipplesPiercing = jsEither([0,0,0,0,1]);
+		}
+		if (slave.anus != 0 && Math.random() < 0.25) {
+			slave.anusTat = "bleached";
+		}
+	};
+
+	function generateXYMods() {
+		if (passage() != "Starting Girls") {
+			slave.earPiercing = jsEither([0,0,0,1]);
+			slave.nosePiercing = jsEither([0,0,0,0,1]);
+			slave.eyebrowPiercing = jsEither([0,0,0,0,0,1]);
+			slave.clitPiercing = jsEither([0,0,0,0,0,1]);
+			slave.lipsPiercing = jsEither([0,0,0,0,0,1]);
+			slave.navelPiercing = jsEither([0,0,0,0,1]);
+			slave.nipplesPiercing = jsEither([0,0,0,0,1]);
+		}
+		if (slave.anus != 0 && Math.random() < 0.25) {
+			slave.anusTat = "bleached";
+		}
+	};
+
+	function generateXXBodyHair() {
+		slave.pubicHColor = slave.hColor;
+		slave.underArmHColor = slave.hColor;
+		slave.pubicHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "waxed", "waxed", "in a strip", "in a strip", "in a strip", "in a strip", "in a strip", "neat", "neat", "neat", "neat", "neat", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy", "bushy", "bushy", "bushy", "bushy", "very bushy", "very bushy"]);
+		slave.underArmHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "shaved", "shaved", "shaved", "shaved", "shaved", "neat", "neat", "neat", "neat", "neat", "bushy", "bushy", "bushy"]);
+		if ((slave.pubicHStyle == "hairless" || slave.underArmHStyle == "hairless") && Math.random() > 0.4) {
+			slave.pubicHStyle = "hairless";
+			slave.underArmHStyle = "hairless";
+		}
+		if (slave.hColor == "blonde" && Math.random() > 0.85) {
+			slave.eyebrowHColor = jsEither(["brown", "brown", "brown", "brown", "black"]);
+			slave.override_Brow_H_Color = 1;
+		} else {
+			slave.eyebrowHColor = slave.hColor;
+		}
+		slave.eyebrowHStyle = jsEither(["bald", "shaved", "shaved", "straight", "straight", "straight", "straight", "straight", "straight", "rounded", "rounded", "rounded", "rounded", "rounded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "slanted inwards", "slanted inwards", "slanted outwards", "slanted outwards", "high-arched", "high-arched", "high-arched", "elongated", "elongated", "elongated", "shortened", "shortened", "shortened", "curved", "curved", "curved", "curved", "curved", "curved", "curved"]);
+		slave.eyebrowFullness = jsEither(["pencil-thin", "pencil-thin", "thin", "thin", "thin", "threaded", "threaded", "threaded", "threaded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "tapered", "tapered", "tapered", "tapered", "thick", "thick", "thick", "bushy", "bushy"]);
+	};
+
+	function generateXYBodyHair() {
+		slave.pubicHColor = slave.hColor;
+		slave.underArmHColor = slave.hColor;
+		slave.pubicHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "waxed", "waxed", "in a strip", "in a strip", "in a strip", "neat", "neat", "neat", "neat", "neat", "neat", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "very bushy", "very bushy"]);
+		slave.underArmHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "shaved", "shaved", "shaved", "shaved", "shaved", "neat", "neat", "neat", "neat", "neat", "neat", "neat", "bushy", "bushy", "bushy", "bushy", "bushy"]);
+		if ((slave.pubicHStyle == "hairless" || slave.underArmHStyle == "hairless") && Math.random() > 0.4) {
+			slave.pubicHStyle = "hairless";
+			slave.underArmHStyle = "hairless";
+		}
+		if (slave.hColor == "blonde" && Math.random() > 0.85) {
+			slave.eyebrowHColor = jsEither(["brown", "brown", "brown", "brown", "black"]);
+			slave.override_Brow_H_Color = 1;
+		} else {
+			slave.eyebrowHColor = slave.hColor;
+		}
+		slave.eyebrowHStyle = jsEither(["bald", "shaved", "shaved", "straight", "straight", "straight", "straight", "straight", "straight", "rounded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "slanted inwards", "slanted outwards", "high-arched", "elongated", "shortened", "curved", "curved", "curved", "curved", "curved"]);
+		slave.eyebrowFullness = jsEither(["pencil-thin", "thin", "thin", "threaded", "threaded", "threaded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "tapered", "tapered", "tapered", "thick", "thick", "bushy"]);
+	};
+
+	function generateXXPuberty() {
+		if (slave.physicalAge >= slave.pubertyAgeXX) {
+			slave.pubertyXX = 1;
+		} else {
+			slave.pubertyXX = 0;
+		}
+	}
+
+	function generateXYPuberty() {
+		if (slave.balls > 0) {
+			if (slave.physicalAge >= slave.pubertyAgeXY) {
+				slave.pubertyXY = 1;
+			} else {
+				slave.pubertyXY = 0;
+			}
+		} else {
+			slave.pubertyXY = 0;
+		}
+	};
+
+	function generateAge() {
+		if (V.activeSlaveOneTimeMaxAge > 998) {
+			V.activeSlaveOneTimeMaxAge = (V.pedo_mode === 1) ? 18 : 42;
+		} else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0 && V.activeSlaveOneTimeMaxAge > 18) {
+			V.activeSlaveOneTimeMaxAge = 18;
+		}
+		if (V.retirementAge < V.activeSlaveOneTimeMaxAge) {
+			V.activeSlaveOneTimeMaxAge = (V.retirementAge - 1);
+		}
+		if (V.activeSlaveOneTimeMinAge < V.minimumSlaveAge) {
+			V.activeSlaveOneTimeMinAge = V.minimumSlaveAge;
+		} else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0) {
+			V.activeSlaveOneTimeMinAge = V.minimumSlaveAge;
+		}
+		if (V.activeSlaveOneTimeMaxAge < V.activeSlaveOneTimeMinAge) {
+			V.activeSlaveOneTimeMaxAge = V.activeSlaveOneTimeMinAge;
+		}
+		if (V.activeSlaveOneTimeMaxAge >= 30 && V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.ageAdjustOverride !== 1) {
+			V.activeSlaveOneTimeMaxAge += 10;
+		}
+		slave.actualAge = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge);
+		const secondAgeRoll = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge);
+		if (V.arcologies[0].FSYouthPreferentialist !== "unset" && V.arcologies[0].FSYouthPreferentialist >= jsRandom(1, 100)) {
+			slave.actualAge = Math.min(slave.actualAge, secondAgeRoll);
+		} else if (V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.arcologies[0].FSMaturityPreferentialist >= jsRandom(1, 100)) {
+			slave.actualAge = Math.max(slave.actualAge, secondAgeRoll);
+		}
+		if (slave.actualAge >= V.retirementAge) {
+			slave.actualAge = (V.retirementAge - 2);
+		}
+		V.activeSlaveOneTimeMinAge = 0;
+		V.activeSlaveOneTimeMaxAge = 999;
+		V.one_time_age_overrides_pedo_mode = 0;
+		V.ageAdjustOverride = 0;
+		slave.visualAge = slave.actualAge;
+		slave.physicalAge = slave.actualAge;
+		slave.ovaryAge = slave.actualAge;
+		slave.age = slave.actualAge; /*compatibility*/
+		slave.pubertyAgeXX = V.fertilityAge;
+		slave.pubertyAgeXY = V.potencyAge;
+	};
+
+	function generateIntelligence() {
+		const gaussian = gaussianPair();
+		slave.intelligence = Intelligence.random();
+		if (V.AgePenalty == 1 && slave.actualAge <= 24) {
+			if (gaussian[0] < gaussian[1] + slave.intelligence/29 + (slave.actualAge - 24)/8 - 0.35) {
+				slave.intelligenceImplant = 15;
+				if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) {
+					slave.intelligenceImplant = 30;
+				}
+			}
+		} else {
+			if (gaussian[0] < gaussian[1] + slave.intelligence/29 - 0.35) { /* 40.23% chance if intelligence is 0, 99.26% chance if intelligence is 100 */
+				slave.intelligenceImplant = 15;
+				if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) {
+					slave.intelligenceImplant = 30;
+				}
+			}
+		}
+	};
+
+	function generateCareer() {
+		if (V.AgePenalty == 1) {
+			if (slave.actualAge < 16) {
+				slave.career = setup.veryYoungCareers.random();
+			} else if (slave.actualAge <= 24) {
+				slave.career = setup.youngCareers.random();
+			} else if (slave.intelligenceImplant >= 15) {
+				slave.career = setup.educatedCareers.random();
+			} else {
+				slave.career = setup.uneducatedCareers.random();
+			}
+		} else {
+			if (slave.actualAge < 16) {
+				slave.career = setup.veryYoungCareers.random();
+			} else if (slave.intelligenceImplant >= 15) {
+				slave.career = setup.educatedCareers.random();
+			} else if (slave.actualAge <= 24) {
+				slave.career = setup.youngCareers.random();
+			} else {
+				slave.career = setup.uneducatedCareers.random();
+			}
+		}
+	};
+
+	function generateNationality() {
+		if (V.fixedRace == 0) {
+			if (V.fixedNationality == 0) {
+				slave.nationality = hashChoice(V.nationalities);
+			} else {
+				slave.nationality = V.fixedNationality;
+				V.fixedNationality = 0;
+			}
+			nationalityToRace(slave);
+
+			if (passage() == "Corporate Market" && (V.captureUpgradeRace != "unselected") && (V.captureUpgradeRace != "none")) {
+				if (V.captureUpgradeRace == "mixed race") {
+					slave.race = "mixed race";
+				} else {
+					const capUpgradeCheck = setup[V.captureUpgradeRace.toLowerCase().replace(/[ -]/g, '')+'Nationalities'];
+					const keys = Object.keys(capUpgradeCheck);
+					var capUpgradeNationalities = {};
+					for (var i = 0; i < keys.length; i++) {
+						if (keys[i] in V.nationalities) {
+							capUpgradeNationalities[keys[i]] = capUpgradeCheck[keys[i]];
+						}
+					}
+					if (Object.keys(capUpgradeNationalities).length > 0) {
+						slave.nationality = hashChoice(capUpgradeNationalities);
+					} else {
+						slave.nationality = hashChoice(capUpgradeCheck);
+					}
+					slave.race = V.captureUpgradeRace;
+				}
+			}
+
+		} else {
+			switch (V.fixedRace) {
+				case "white":
+					slave.nationality = hashChoice(setup.whiteNationalities);
+					break;
+				case "asian":
+					slave.nationality = hashChoice(setup.asianNationalities);
+					break;
+				case "latina":
+					slave.nationality = hashChoice(setup.latinaNationalities);
+					break;
+				case "black":
+					slave.nationality = hashChoice(setup.blackNationalities);
+					break;
+				case "pacific islander":
+					slave.nationality = hashChoice(setup.pacificislanderNationalities);
+					break;
+				case "southern european":
+					slave.nationality = hashChoice(setup.southerneuropeanNationalities);
+					break;
+				case "amerindian":
+					slave.nationality = hashChoice(setup.amerindianNationalities);
+					break;
+				case "semitic":
+					slave.nationality = hashChoice(setup.semiticNationalities);
+					break;
+				case "middle eastern":
+					slave.nationality = hashChoice(setup.middleeasternNationalities);
+					break;
+				case "indo-aryan":
+					slave.nationality = hashChoice(setup.indoaryanNationalities);
+					break;
+				case "malay":
+					slave.nationality = hashChoice(setup.malayNationalities);
+					break;
+				default:
+					slave.nationality = hashChoice(V.nationalities);
+			}
+			slave.race = V.fixedRace;
+			V.fixedRace = 0;
+		}
+	};
+
+	function generateAccent() {
+		nationalityToAccent(slave);
+		if ((slave.intelligenceImplant >= 15 || slave.intelligence > 95) && slave.accent >= 3 && slave.intelligence > jsRandom(0,100)) {
+			slave.accent -= 1;
+		}
+	};
+
+	function generateRacialTraits() {
+		switch (slave.race) {
+			case "black":
+				slave.lips = jsRandom(5,30);
+				slave.skin = jsEither(["black", "dark brown", "brown"]);
+				slave.hColor = jsEither(["black", "black", "black", "brown"]);
+				slave.hStyle = jsEither(["neat", "crinkled"]);
+				break;
+			case "white":
+				slave.lips = jsRandom(5,25);
+				if (slave.nationality == "German") {
+					slave.skin = jsEither(["pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "blue", "blue", "brown", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "blonde", "blonde", "red", "brown"]);
+				} else if (slave.nationality == "Icelandic") {
+					slave.skin = jsEither(["pale", "pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "blue", "blue", "brown", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "blonde", "blonde", "red", "brown"]);
+				} else if (slave.nationality == "Irish") {
+					slave.skin = jsEither(["pale", "pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "brown", "green", "green", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "red", "red", "red", "brown"]);
+				} else if (slave.nationality == "Scottish") {
+					slave.skin = jsEither(["pale", "fair", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "brown", "brown", "green", "green", "green"]);
+					slave.hColor = jsEither(["black", "black", "blonde", "red", "red", "red", "brown"]);
+				} else {
+					slave.skin = jsEither(["pale", "light", "fair"]);
+					slave.eyeColor = jsEither(["blue", "brown", "green"]);
+					slave.hColor = jsEither(["black", "blonde", "red", "brown"]);
+				}
+				slave.hStyle = "neat";
+				break;
+			case "latina":
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["light olive", "brown", "dark brown", "tanned", "dark olive"]);
+				slave.hColor = jsEither(["black", "brown"]);
+				slave.hStyle = "neat";
+				break;
+			case "indo-aryan":
+			case "malay":
+			case "pacific islander":
+			case "amerindian":
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["dark", "light"]);
+				slave.hColor = "black";
+				slave.hStyle = "neat";
+				break;
+			case "asian":
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["light olive", "dark olive", "light"]);
+				slave.hColor = "black";
+				slave.hStyle = "neat";
+				break;
+			case "middle eastern": 
+			case "semitic":
+			case "southern european":
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["fair", "light olive", "tanned", "light"]);
+				slave.hColor = "black";
+				slave.hStyle = "neat";
+				break;
+			default:
+				slave.lips = jsRandom(5,25);
+				slave.skin = jsEither(["pale", "dark", "light"]);
+				slave.hColor = jsEither(["black", "black", "black", "black", "brown", "brown", "blonde", "red"]);
+				slave.hStyle = "neat";
+		}
+		if (slave.skin == "pale" || slave.skin == "fair") {
+			if (jsRandom(1,4) == 1) {
+				slave.markings = jsEither(["freckles", "freckles", "freckles", "heavily freckled", "beauty mark", "beauty mark", "birthmark", "birthmark"]);
+			}
+		} else if (jsRandom(1,8) == 1) {
+			slave.markings = jsEither(["beauty mark", "birthmark"]);
+		}
+	};
+
+	function generateBoobTweaks() {
+		if (V.weightAffectsAssets != 0) {
+			if (slave.weight < -10 && slave.boobs > 200) {
+				slave.boobs -= 100;
+			} else if (slave.weight > 190 && slave.boobs < 3000) {
+				slave.boobs += (jsRandom(3,8)*100);
+			} else if (slave.weight > 160 && slave.boobs < 1500) {
+				slave.boobs += (jsRandom(2,6)*100);
+			} else if (slave.weight > 130 && slave.boobs < 1500) {
+				slave.boobs += (jsRandom(1,4)*100);
+			} else if (slave.weight > 95 && slave.boobs < 1200) {
+				slave.boobs += (jsRandom(1,3)*100);
+			} else if (slave.weight > 30 && slave.boobs < 1000) {
+				slave.boobs += 100;
+			}
+		}
+
+		var BoobShapeGen = [];
+		if (slave.boobs > 250 && slave.boobs < 800) {
+			BoobShapeGen.push("perky");
+			BoobShapeGen.push("downward-facing");
+		}
+		if (slave.boobs > 400 && slave.boobs < 1200) {
+			BoobShapeGen.push("torpedo-shaped");
+			BoobShapeGen.push("wide-set");
+		}
+		if (slave.boobs > 800 && slave.physicalAge > jsRandom(10,50)) {
+			BoobShapeGen.push("saggy");
+		}
+		if (BoobShapeGen.length == 1) {
+			if (Math.random() < 0.5) {
+				slave.boobShape = jsEither(BoobShapeGen);
+			}
+		} else if (BoobShapeGen.length > 1) {
+			if (jsRandom(1,3) != 1) {
+				slave.boobShape = jsEither(BoobShapeGen);
+			}
+		}
+		
+		if (slave.boobs < 250) {
+			slave.nipples = jsEither(["tiny", "tiny", "tiny", "tiny", "cute", "cute", "puffy", "partially inverted"]);
+		} else if (slave.boobs < 500) {
+			slave.nipples = jsEither(["tiny", "cute", "cute", "cute", "puffy", "partially inverted"]);
+		} else if (slave.boobs < 1000) {
+			slave.nipples = jsEither(["tiny", "cute", "cute", "cute", "puffy", "puffy", "partially inverted", "inverted"]);
+		} else {
+			slave.nipples = jsEither(["cute", "puffy", "partially inverted", "inverted", "huge"]);
+		}
+	};
+
+	function generateSkills() {
+		slave.vaginalSkill = (slave.vagina == 0 ? 0 : jsRandom(0,15));
+		slave.analSkill = (slave.anus == 0 ? 0 : jsRandom(0,15));
+		slave.oralSkill = jsRandom(0,15);
+		slave.entertainSkill = jsRandom(0,15);
+		slave.whoreSkill = jsRandom(0,15);
+	};
+
+	function generateDisabilities() {
+		if (slave.physicalAge >= jsRandom(0,100)) {
+			slave.eyes = -1;
+		} 
+		if (slave.physicalAge >= jsRandom(30,100)) {
+			slave.hears = -1;
+		}
+		if (V.seeExtreme == 1) {
+			let disList = [];
+			disList.push("hearNot");
+			disList.push("seeNot");
+			disList.push("speakNot");
+			let disableCount = 0;
+			if (V.oneTimeDisableDisability === 0) {
+				while (disList.length > 0) {
+					let rolled = jsEither(disList);
+					switch (rolled) {
+					case "hearNot":
+						if ((jsRandom(1,100)-(disableCount*2)) > 90) {
+							slave.hears = -2;
+						}
+						disList.delete("hearNot");
+						disableCount++;
+						break;
+					case "seeNot":
+						if ((jsRandom(1,100)-(disableCount*2)) > 90) {
+							slave.eyes = -2;
+						}
+						disList.delete("seeNot");
+						disableCount++;
+						break;
+					case "speakNot":
+						if ((jsRandom(1,100)-(disableCount*2)) > 90) {
+							slave.voice = 0;
+						}
+						disList.delete("speakNot");
+						disableCount++;
+						break;
+					}
+				}
+			}
+			V.oneTimeDisableDisability = 0;
+		}
+	};
+
+	return GenerateNewSlave;
+})();
diff --git a/src/js/slaveGenerationJS.tw b/src/js/slaveGenerationJS.tw
index 49d8ebb991c7db82e3389fa6f547355b8e6eb8b3..4951b7b74e0a05363020ef72deff68a10e60ad8d 100644
--- a/src/js/slaveGenerationJS.tw
+++ b/src/js/slaveGenerationJS.tw
@@ -1,49 +1,5 @@
 :: Slave Generation JS [script]
 
-window.generateAge = function generateAge(slave) {
-	const V = State.variables;
-
-	if (V.activeSlaveOneTimeMaxAge > 998) {
-		V.activeSlaveOneTimeMaxAge = (V.pedo_mode === 1) ? 18 : 42;
-	} else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0 && V.activeSlaveOneTimeMaxAge > 18) {
-		V.activeSlaveOneTimeMaxAge = 18;
-	}
-	if (V.retirementAge < V.activeSlaveOneTimeMaxAge) {
-		V.activeSlaveOneTimeMaxAge = (V.retirementAge - 1);
-	}
-	if (V.activeSlaveOneTimeMinAge < V.minimumSlaveAge) {
-		V.activeSlaveOneTimeMinAge = V.minimumSlaveAge;
-	} else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0) {
-		V.activeSlaveOneTimeMinAge = V.minimumSlaveAge;
-	}
-	if (V.activeSlaveOneTimeMaxAge < V.activeSlaveOneTimeMinAge) {
-		V.activeSlaveOneTimeMaxAge = V.activeSlaveOneTimeMinAge;
-	}
-	if (V.activeSlaveOneTimeMaxAge >= 30 && V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.ageAdjustOverride !== 1) {
-		V.activeSlaveOneTimeMaxAge += 10;
-	}
-	slave.actualAge = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge);
-	const secondAgeRoll = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge);
-	if (V.arcologies[0].FSYouthPreferentialist !== "unset" && V.arcologies[0].FSYouthPreferentialist >= jsRandom(1, 100)) {
-		slave.actualAge = Math.min(slave.actualAge, secondAgeRoll);
-	} else if (V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.arcologies[0].FSMaturityPreferentialist >= jsRandom(1, 100)) {
-		slave.actualAge = Math.max(slave.actualAge, secondAgeRoll);
-	}
-	if (slave.actualAge >= V.retirementAge) {
-		slave.actualAge = (V.retirementAge - 2);
-	}
-	V.activeSlaveOneTimeMinAge = 0;
-	V.activeSlaveOneTimeMaxAge = 999;
-	V.one_time_age_overrides_pedo_mode = 0;
-	V.ageAdjustOverride = 0;
-	slave.visualAge = slave.actualAge;
-	slave.physicalAge = slave.actualAge;
-	slave.ovaryAge = slave.actualAge;
-	slave.age = slave.actualAge; /*compatibility*/
-	slave.pubertyAgeXX = V.fertilityAge;
-	slave.pubertyAgeXY = V.potencyAge;
-};
-
 window.nationalityToRace = function nationalityToRace(slave) {
 	slave.race = hashChoice(setup.raceSelector[slave.nationality] || setup.raceSelector[""]);
 };
@@ -1298,160 +1254,382 @@ window.randomizeAttraction = function randomizeAttraction(slave) {
 	slave.attrXY = Math.clamp(slave.attrXY + jsRandom(-5, 5), 0, 100);
 };
 
-window.disabilityRoll = function disabilityRoll(slave) {
-	const V = State.variables;
-	let disList = [];
-	disList.push("hearNot");
-	disList.push("seeNot");
-	disList.push("speakNot");
-	let disableCount = 0;
-	if (V.oneTimeDisableDisability === 0) {
-		while (disList.length > 0) {
-			let rolled = jsEither(disList);
-			switch (rolled) {
-			case "hearNot":
-				if ((jsRandom(1,100)-(disableCount*2)) > 90) {
-					slave.hears = -2;
-				}
-				disList.delete("hearNot");
-				disableCount++;
-				break;
-			case "seeNot":
-				if ((jsRandom(1,100)-(disableCount*2)) > 90) {
-					slave.eyes = -2;
-				}
-				disList.delete("seeNot");
-				disableCount++;
-				break;
-			case "speakNot":
-				if ((jsRandom(1,100)-(disableCount*2)) > 90) {
-					slave.voice = 0;
-				}
-				disList.delete("speakNot");
-				disableCount++;
-				break;
-			}
-		}
-	}
-	V.oneTimeDisableDisability = 0;
+window.BaseSlave = function BaseSlave() {
+	State.variables.activeSlave = {
+		slaveName: "blank",
+		slaveSurname: 0,
+		birthName: "blank",
+		birthSurname: 0,
+		genes: "XX",
+		pronoun: "she",
+		possessive: "her",
+		possessivePronoun: "hers",
+		objectReflexive: "herself",
+		object: "her",
+		noun: "girl",
+		weekAcquired: 0,
+		origin: 0,
+		career: 0,
+		ID: 0,
+		prestige: 0,
+		pornFeed: 0,
+		pornFame: 0,
+		pornFameSpending: 0,
+		pornPrestige: 0,
+		pornPrestigeDesc: 0,
+		pornFameType: "none",
+		pornFocus: "none",
+		pornTypeGeneral: 0,
+		pornTypeFuckdoll: 0,
+		pornTypeRape: 0,
+		pornTypePreggo: 0,
+		pornTypeBBW: 0,
+		pornTypeGainer: 0,
+		pornTypeStud: 0,
+		pornTypeLoli: 0,
+		pornTypeDeepThroat: 0,
+		pornTypeStruggleFuck: 0,
+		pornTypePainal: 0,
+		pornTypeTease: 0,
+		pornTypeRomantic: 0,
+		pornTypePervert: 0,
+		pornTypeCaring: 0,
+		pornTypeUnflinching: 0,
+		pornTypeSizeQueen: 0,
+		pornTypeNeglectful: 0,
+		pornTypeCumAddict: 0,
+		pornTypeAnalAddict: 0,
+		pornTypeAttentionWhore: 0,
+		pornTypeBreastGrowth: 0,
+		pornTypeAbusive: 0,
+		pornTypeMalicious: 0,
+		pornTypeSelfHating: 0,
+		pornTypeBreeder: 0,
+		pornTypeSub: 0,
+		pornTypeCumSlut: 0,
+		pornTypeAnal: 0,
+		pornTypeHumiliation: 0,
+		pornTypeBoobs: 0,
+		pornTypeDom: 0,
+		pornTypeSadist: 0,
+		pornTypeMasochist: 0,
+		pornTypePregnancy: 0,
+		prestigeDesc: 0,
+		recruiter: 0,
+		relation: 0,
+		relationTarget: 0,
+		relationship: 0,
+		relationshipTarget: 0,
+		rivalry: 0,
+		rivalryTarget: 0,
+		subTarget: 0,
+		father: 0,
+		mother: 0,
+		daughters: 0,
+		sisters: 0,
+		canRecruit: 0,
+		choosesOwnAssignment: 0,
+		assignment: "rest",
+		assignmentVisible: 1,
+		sentence: 0,
+		training: 0,
+		toyHole: "all her holes",
+		indenture: -1,
+		indentureRestrictions: 0,
+		birthWeek: random(0,51),
+		actualAge: 18,
+		visualAge: 18,
+		physicalAge: 18,
+		ovaryAge: 18,
+		ageImplant: 0,
+		health: 0,
+		minorInjury: 0,
+		trust: 0,
+		oldTrust: 0,
+		devotion: 0,
+		oldDevotion: 0,
+		weight: 0,
+		muscles: 0,
+		height: 170,
+		heightImplant: 0,
+		nationality: "slave",
+		race: "white",
+		origRace: "white",
+		markings: "none",
+		eyes: 1,
+		eyeColor: "brown",
+		origEye: "brown",
+		pupil: "circular",
+		sclerae: "white",
+		eyewear: "none",
+		hears: 0,
+		earwear: "none",
+		earImplant: 0,
+		origHColor: "brown",
+		hColor: "brown",
+		pubicHColor: "brown",
+		underArmHColor: "brown",
+		eyebrowHColor: "brown",
+		origSkin: "light",
+		skin: "light",
+		hLength: 60,
+		eyebrowFullness: "natural",
+		hStyle: "short",
+		pubicHStyle: "neat",
+		underArmHStyle: "neat",
+		eyebrowHStyle: "natural",
+		waist: 0,
+		corsetPiercing: 0,
+		PLimb: 0,
+		amp: 0,
+		heels:0,
+		voice: 2,
+		voiceImplant: 0,
+		accent: 0,
+		shoulders: 0,
+		shouldersImplant: 0,
+		boobs: 0,
+		boobsImplant: 0,
+		boobsImplantType: 0,
+		boobShape: "normal",
+		nipples: "cute",
+		nipplesPiercing: 0,
+		nipplesAccessory: 0,
+		areolae: 0,
+		areolaePiercing: 0,
+		areolaeShape: "circle",
+		boobsTat: 0,
+		lactation: 0,
+		lactationAdaptation: 0,
+		milk: 0,
+		cum: 0,
+		hips: 0,
+		hipsImplant: 0,
+		butt: 0,
+		buttImplant: 0,
+		buttImplantType: 0,
+		buttTat: 0,
+		face: 0,
+		faceImplant: 0,
+		faceShape: "normal",
+		lips: 15,
+		lipsImplant: 0,
+		lipsPiercing: 0,
+		lipsTat: 0,
+		teeth: "normal",
+		tonguePiercing: 0,
+		vagina: 0,
+		vaginaLube: 0,
+		vaginaPiercing: 0,
+		vaginaTat: 0,
+		preg: -1,
+		pregSource: 0,
+		pregType: 0,
+		pregAdaptation: 50,
+		superfetation: 0,
+		ovaImplant: 0,
+		broodmother: 0,
+		broodmotherFetuses: 0,
+		broodmotherOnHold: 0,
+		broodmotherCountDown: 0,
+		labor: 0,
+		births: 0,
+		cSec: 0,
+		bellyAccessory: "none",
+		labia: 0,
+		clit: 0,
+		clitPiercing: 0,
+		clitSetting: "vanilla",
+		foreskin: 0,
+		anus: 0,
+		dick: 0,
+		analArea: 1,
+		dickPiercing: 0,
+		dickTat: 0,
+		prostate: 0,
+		balls: 0,
+		scrotum: 0,
+		ovaries: 0,
+		anusPiercing: 0,
+		anusTat: 0,
+		makeup: 0,
+		nails: 0,
+		brand: 0,
+		brandLocation: 0,
+		earPiercing: 0,
+		nosePiercing: 0,
+		eyebrowPiercing: 0,
+		navelPiercing: 0,
+		shouldersTat: 0,
+		armsTat: 0,
+		legsTat: 0,
+		backTat: 0,
+		stampTat: 0,
+		vaginalSkill: 0,
+		oralSkill: 0,
+		analSkill: 0,
+		whoreSkill: 0,
+		entertainSkill: 0,
+		combatSkill: 0,
+		livingRules: "spare",
+		speechRules: "restrictive",
+		releaseRules: "restrictive",
+		relationshipRules: "restrictive",
+		standardPunishment: "situational",
+		standardReward: "situational",
+		useRulesAssistant: 1,
+		diet: "healthy",
+		dietCum: 0,
+		dietMilk: 0,
+		tired: 0,
+		hormones: 0,
+		drugs: "no drugs",
+		curatives: 0,
+		chem: 0,
+		aphrodisiacs: 0,
+		addict: 0,
+		fuckdoll: 0,
+		choosesOwnClothes: 0,
+		clothes: "no clothing",
+		collar: "none",
+		shoes: "none",
+		vaginalAccessory: "none",
+		dickAccessory: "none",
+		legAccessory: "none",
+		buttplug: "none",
+		buttplugAttachment: "none",
+		intelligence: 0,
+		intelligenceImplant: 0,
+		energy: 50,
+		need: 0,
+		attrXX: 0,
+		attrXY: 0,
+		attrKnown: 0,
+		fetish: "none",
+		fetishStrength: 70,
+		fetishKnown: 0,
+		behavioralFlaw: "none",
+		behavioralQuirk: "none",
+		sexualFlaw: "none",
+		sexualQuirk: "none",
+		oralCount: 0,
+		vaginalCount: 0,
+		analCount: 0,
+		mammaryCount: 0,
+		penetrativeCount: 0,
+		publicCount: 0,
+		pitKills: 0,
+		customTat: "",
+		customLabel: "",
+		customDesc: "",
+		customTitle: "",
+		customTitleLisp: "",
+		rudeTitle: 0,
+		customImage: 0,
+		currentRules: [],
+		bellyTat: 0,
+		induce: 0,
+		mpreg: 0,
+		inflation: 0,
+		inflationType: "none",
+		inflationMethod: 0,
+		milkSource: 0,
+		cumSource: 0,
+		burst: 0,
+		pregKnown: 0,
+		pregWeek: 0,
+		belly: 0,
+		bellyPreg: 0,
+		bellyFluid: 0,
+		bellyImplant: -1,
+		bellySag: 0,
+		bellySagPreg: 0,
+		bellyPain: 0,
+		cervixImplant: 0,
+		birthsTotal: 0,
+		pubertyAgeXX: 13,
+		pubertyAgeXY: 13,
+		scars: 0,
+		breedingMark: 0,
+		bodySwap: 0,
+		HGExclude: 0,
+		ballType: "human",
+		eggType: "human",
+		reservedChildren: 0,
+		reservedChildrenNursery: 0,
+		choosesOwnChastity: 0,
+		pregControl: "none",
+		readyLimbs: [],
+		ageAdjust: 0,
+		bald: 0,
+		origBodyOwner: "",
+		origBodyOwnerID: 0,
+		death: "",
+		hormoneBalance: 0,
+		onDiet: 0,
+		breastMesh: 0,
+		slavesFathered: 0,
+		PCChildrenFathered: 0,
+		slavesKnockedUp: 0,
+		PCKnockedUp: 0,
+		prematureBirth: 0,
+		premature: 0,
+		origSkin: "white",
+		vasectomy: 0,
+		haircuts: 0,
+		newGamePlus: 0,
+		skillHG: 0,
+		skillRC: 0,
+		skillBG: 0,
+		skillMD: 0,
+		skillDJ: 0,
+		skillNU: 0,
+		skillTE: 0,
+		skillAT: 0,
+		skillMT: 0,
+		skillST: 0,
+		skillMM: 0,
+		skillWA: 0,
+		skillS: 0,
+		skillE: 0,
+		skillW: 0,
+		tankBaby: 0,
+		inducedNCS: 0,
+		NCSyouthening: 0,
+		override_Race: 0,
+		override_Skin: 0,
+		override_Eye_Color: 0,
+		override_H_Color: 0,
+		override_Pubic_H_Color: 0,
+		override_Arm_H_Color: 0,
+		override_Brow_H_Color: 0,
+		missingEyes: 0,
+		missingArms: 0,
+		missingLegs: 0
+	};
 };
 
-window.generateNationality = function generateNationality(slave) {
-	const V = State.variables;
-
-	if (V.fixedRace == 0) {
-		if (V.fixedNationality == 0) {
-			slave.nationality = hashChoice(V.nationalities);
-		} else {
-			slave.nationality = V.fixedNationality;
-			V.fixedNationality = 0;
-		}
-		nationalityToRace(slave);
-		
-		if (passage() == "Corporate Market" && (V.captureUpgradeRace != "unselected") && (V.captureUpgradeRace != "none")) {
-			if (V.captureUpgradeRace == "mixed race") {
-				slave.race = "mixed race";
-			} else {
-				const capUpgradeCheck = setup[V.captureUpgradeRace.toLowerCase().replace(/[ -]/g, '')+'Nationalities'];
-				const keys = Object.keys(capUpgradeCheck);
-				var capUpgradeNationalities = {};
-				for (var i = 0; i < keys.length; i++) {
-					if (keys[i] in V.nationalities) {
-						capUpgradeNationalities[keys[i]] = capUpgradeCheck[keys[i]];
-					}
-				}
-				if (Object.keys(capUpgradeNationalities).length > 0) {
-					slave.nationality = hashChoice(capUpgradeNationalities);
-				} else {
-					slave.nationality = hashChoice(capUpgradeCheck);
-				}
-				slave.race = V.captureUpgradeRace;
-			}
-		}
-
-	} else {
-		switch (V.fixedRace) {
-			case "white":
-				slave.nationality = hashChoice(setup.whiteNationalities);
-				break;
-			case "asian":
-				slave.nationality = hashChoice(setup.asianNationalities);
-				break;
-			case "latina":
-				slave.nationality = hashChoice(setup.latinaNationalities);
-				break;
-			case "black":
-				slave.nationality = hashChoice(setup.blackNationalities);
-				break;
-			case "pacific islander":
-				slave.nationality = hashChoice(setup.pacificislanderNationalities);
-				break;
-			case "southern european":
-				slave.nationality = hashChoice(setup.southerneuropeanNationalities);
-				break;
-			case "amerindian":
-				slave.nationality = hashChoice(setup.amerindianNationalities);
-				break;
-			case "semitic":
-				slave.nationality = hashChoice(setup.semiticNationalities);
-				break;
-			case "middle eastern":
-				slave.nationality = hashChoice(setup.middleeasternNationalities);
-				break;
-			case "indo-aryan":
-				slave.nationality = hashChoice(setup.indoaryanNationalities);
-				break;
-			case "malay":
-				slave.nationality = hashChoice(setup.malayNationalities);
-				break;
-			default:
-				slave.nationality = hashChoice(V.nationalities);
-		}
-		slave.race = V.fixedRace;
-		V.fixedRace = 0;
-	}
-};
-
-window.generateIntelligence = function generateIntelligence(slave) {
-	const gaussian = gaussianPair();
-	slave.intelligence = Intelligence.random();
-	if (State.variables.AgePenalty == 1 && slave.actualAge <= 24) {
-		if (gaussian[0] < gaussian[1] + slave.intelligence/29 + (slave.actualAge - 24)/8 - 0.35) {
-			slave.intelligenceImplant = 15;
-			if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) {
-				slave.intelligenceImplant = 30;
-			}
-		}
+window.generatePronouns = function generatePronouns(slave) {
+	if (slave.fuckdoll > 0) {
+		slave.pronoun = "it";
+		slave.possessivePronoun = "its";
+		slave.possessive = "its";
+		slave.object = "it";
+		slave.objectReflexive = "itself";
+		slave.noun = "toy";
+	} else if (slave.dick > 0 && slave.vagina == -1 && State.variables.diversePronouns == 1) {
+		slave.pronoun = "he";
+		slave.possessivePronoun = "his";
+		slave.possessive = "his";
+		slave.object = "him";
+		slave.objectReflexive = "himself";
+		slave.noun = "boy";
 	} else {
-		if (gaussian[0] < gaussian[1] + slave.intelligence/29 - 0.35) { /* 40.23% chance if intelligence is 0, 99.26% chance if intelligence is 100 */
-			slave.intelligenceImplant = 15;
-			if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) {
-				slave.intelligenceImplant = 30;
-			}
-		}
-	}
-};
-
-window.generateCareer = function generateCareer(slave) {
-	if (State.variables.AgePenalty == 1) {
-		if (slave.actualAge < 16) {
-			slave.career = setup.veryYoungCareers.random();
-		} else if (slave.actualAge <= 24) {
-			slave.career = setup.youngCareers.random();
-		} else if (slave.intelligenceImplant >= 15) {
-			slave.career = setup.educatedCareers.random();
-		} else {
-			slave.career = setup.uneducatedCareers.random();
-		}
-	} else {
-		if (slave.actualAge < 16) {
-			slave.career = setup.veryYoungCareers.random();
-		} else if (slave.intelligenceImplant >= 15) {
-			slave.career = setup.educatedCareers.random();
-		} else if (slave.actualAge <= 24) {
-			slave.career = setup.youngCareers.random();
-		} else {
-			slave.career = setup.uneducatedCareers.random();
-		}
+		slave.pronoun = "she";
+		slave.possessivePronoun = "hers";
+		slave.possessive = "her";
+		slave.object = "her";
+		slave.objectReflexive = "herself";
+		slave.noun = "girl";	
 	}
 };
diff --git a/src/uncategorized/generateNewSlave.tw b/src/uncategorized/generateNewSlave.tw
index 7e5e2fd2f80615b7f4c35091bc5457d98ee61931..f77773d4deee5b90ff13d5d21f8f48481ccd7915 100644
--- a/src/uncategorized/generateNewSlave.tw
+++ b/src/uncategorized/generateNewSlave.tw
@@ -1,25 +1,3 @@
 :: Generate New Slave [nobr]
 
-<<if (random(0,99) < $seeDicks)>>
-	<<include "Generate XY Slave">>
-<<elseif ($seeDicks > 0)>>
-	<<if ($arcologies[0].FSGenderFundamentalistSMR == 1 || $arcologies[0].FSRepopulationFocusSMR == 1)>>
-		<<set _femaleSlaveGen = 90>>
-	<<elseif ($arcologies[0].FSGenderRadicalist != "unset")>>
-		<<set _femaleSlaveGen = 50>>
-	<<else>>
-		<<set _femaleSlaveGen = 80>>
-	<</if>>
-	<<if (random(1,100) > _femaleSlaveGen) && (random(0,99) < $seeDicks)>>
-		<<include "Generate XY Slave">>
-	<<else>>
-		<<include "Generate XX Slave">>
-	<</if>>
-<<else>>
-	<<include "Generate XX Slave">>
-<</if>>
-/* Superfetation as rare genetic disorder 1 from 100, not active for now.
-<<if (random(0,99) <= 1)>> 
-	<<set $activeSlave.superfetation = 1>>
-<</if>>
-*/
+<<run GenerateNewSlave()>>
diff --git a/src/uncategorized/generateXXSlave.tw b/src/uncategorized/generateXXSlave.tw
index b84d7aad72dfaf190119ee7f28959328e8ccdd14..a9e3ec9200c3b87a2c11a5ea380dfa78697061f0 100644
--- a/src/uncategorized/generateXXSlave.tw
+++ b/src/uncategorized/generateXXSlave.tw
@@ -1,454 +1,3 @@
 :: Generate XX Slave [nobr]
 
-<<BaseSlave>>
-/*missed variables - getting tired of this shit */
-<<set WombInit($activeSlave)>>
-<<set $activeSlave.vaginaLube = 1, $activeSlave.ovaries = 1, $activeSlave.canRecruit = 1>>
-
-<<run generateAge($activeSlave)>>
-
-<<if $activeSlave.physicalAge < 6>>
-	<<set $activeSlave.teeth = "baby">>
-<<elseif $activeSlave.physicalAge < 12>>
-	<<set $activeSlave.teeth = "mixed">>
-<</if>>
-
-<<if $activeSlave.ovaries == 1>>
-	<<if $activeSlave.physicalAge >= $activeSlave.pubertyAgeXX>>
-		<<set $activeSlave.pubertyXX = 1>>
-	<<else>>
-		<<set $activeSlave.pubertyXX = 0>>
-	<</if>>
-<<else>>
-	<<set $activeSlave.pubertyXX = 0>>
-<</if>>
-<<set $activeSlave.pubertyXY = 0>>
-
-<<set $activeSlave.ID = $IDNumber++>>
-<<set $activeSlave.weekAcquired = $week>>
-
-<<run generateIntelligence($activeSlave)>>
-<<run generateCareer($activeSlave)>>
-
-<<set $activeSlave.vaginalSkill = random(0,15)>>
-<<set $activeSlave.analSkill = random(0,15)>>
-<<set $activeSlave.oralSkill = random(0,15)>>
-<<set $activeSlave.entertainSkill = random(0,15)>>
-<<set $activeSlave.whoreSkill = random(0,15)>>
-
-<<set $activeSlave.energy = random(1,85)>>
-<<run randomizeAttraction($activeSlave)>>
-<<set $activeSlave.fetishStrength = random(0,90)>>
-<<set $activeSlave.fetish = either("none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "submissive", "submissive", "cumslut", "humiliation", "humiliation", "buttslut", "boobs", "pregnancy", "dom", "sadist", "masochist")>>
-
-<<set $activeSlave.behavioralFlaw = either("none", "none", "none", "arrogant", "bitchy", "odd", "hates men", "hates women", "hates women", "anorexic", "gluttonous", "devout", "liberated")>>
-<<if ($activeSlave.behavioralFlaw == "devout")>>
-	<<set $activeSlave.sexualFlaw = either("none", "repressed", "shamefast", "apathetic", "crude", "judgemental")>>
-<<else>>
-	<<set $activeSlave.sexualFlaw = either("none", "none", "none", "none", "hates oral", "hates anal", "hates penetration", "repressed", "idealistic", "shamefast", "apathetic", "crude", "judgemental")>>
-<</if>>
-<<if ($activeSlave.behavioralFlaw == "none") && random(1,10) == 1>>
-	<<set $activeSlave.behavioralQuirk = either("confident", "cutting", "funny", "adores women", "adores men", "fitness", "insecure", "sinful", "advocate")>>
-<</if>>
-<<if ($activeSlave.sexualFlaw == "none") && random(1,10) == 1>>
-	<<set $activeSlave.sexualQuirk = either("gagfuck queen", "painal queen", "strugglefuck queen", "tease", "romantic", "perverted", "caring", "unflinching", "size queen")>>
-<</if>>
-
-<<set $activeSlave.health = random(-50,50)>>
-
-<<set $activeSlave.devotion = random(-90,-60)>>
-<<set $activeSlave.trust = random(-45,-25)>>
-
-/% Begin height replacement section. %/
-/% Since we use nationality for height effects we need to initialize it now instead of later on like in vanilla Free Cities. %/
-<<run generateNationality($activeSlave)>> /* includes race selection */
-<<run nationalityToName($activeSlave)>>
-<<run nationalityToAccent($activeSlave)>>
-
-<<set $activeSlave.height = Math.round(Height.random($activeSlave))>>
-
-<<if $activeSlave.height >= Height.mean($activeSlave) * 170/162.5>>
-	<<set $activeSlave.hips = either(-1, 0, 0, 1, 1, 2, 2)>>
-	<<set $activeSlave.shoulders = either(-1, -1, 0, 0, 0, 1)>>
-<<else>>
-	<<set $activeSlave.hips = either(-1, 0, 0, 0, 1, 1, 2)>>
-	<<set $activeSlave.shoulders = either(-2, -1, -1, 0, 0, 1)>>
-<</if>>
-/% End height replacement section. %/
-
-<<set $activeSlave.weight = random(-100,180)>>
-<<if ($activeSlave.weight < -30)>>
-	<<set $activeSlave.waist = random(-55,0)>>
-<<elseif $activeSlave.physicalAge < 13>>
-	<<set $activeSlave.waist = random(-25,25)>>
-<<elseif ($activeSlave.weight <= 30)>>
-	<<set $activeSlave.waist = random(-45,45)>>
-<<elseif ($activeSlave.weight <= 160)>>
-	<<set $activeSlave.waist = random(0,55)>>
-<<else>>
-	<<set $activeSlave.waist = random(50,100)>>
-<</if>>
-
-<<if ($activeSlave.physicalAge > random(0,100))>>
-	<<set $activeSlave.eyes = -1>>
-<</if>>
-<<if ($activeSlave.physicalAge > random(30,100))>>
-	<<set $activeSlave.hears = -1>>
-<</if>>
-
-
-<<if ($activeSlave.intelligenceImplant >= 15 || $activeSlave.intelligence > 95) && ($activeSlave.accent >= 3) && ($activeSlave.intelligence) > random(0,100)>>
-	<<set $activeSlave.accent -= 1>>
-<</if>>
-
-<<set _femaleCrookedTeethGen = $activeSlave.intelligence+$activeSlave.intelligenceImplant>>
-<<if "American" == $activeSlave.nationality>>
-	<<set _femaleCrookedTeethGen += 20>>
-<<elseif ["Andorran", "Antiguan", "Argentinian", "Aruban", "Australian", "Austrian", "Bahamian", "Bahraini", "Barbadian", "Belarusian", "Belgian", "Bermudian", "Brazilian", "British", "Bruneian", "Bulgarian", "Canadian", "Catalan", "Chilean", "a Cook Islander", "Croatian", "Czech", "Cypriot", "Danish", "Dutch", "Emirati", "Estonian", "Finnish", "French", "German", "Greek", "Greenlandic", "Guamanian", "Hungarian", "Icelandic", "Irish", "Israeli", "Italian", "Japanese", "Kazakh", "Korean", "Kuwaiti", "Latvian", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Malaysian", "Maltese", "Mauritian", "Monégasque", "Montenegrin", "New Caledonian", "a New Zealander", "Niuean", "Norwegian", "Omani", "Palauan", "Panamanian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Sammarinese", "Saudi", "Seychellois", "Singaporean", "Slovak", "Slovene", "Spanish", "Swedish", "Swiss", "Taiwanese", "Trinidadian", "Uruguayan", "Vatican"].includes($activeSlave.nationality)>>
-<<else>>
-	<<set _femaleCrookedTeethGen -= 20>>
-<</if>>
-<<if random(0,_femaleCrookedTeethGen) <= 15 && $activeSlave.physicalAge >= 12>>
-	<<set $activeSlave.teeth = "crooked">>
-<</if>>
-
-<<switch $activeSlave.race>>
-<<case "black">>
-	<<set $activeSlave.butt = either(1, 2, 2, 3, 3, 4, 4)>>
-	<<set $activeSlave.boobs = BoobGenerator.rollBreast(150)>>
-	<<set $activeSlave.lips = random(5,30)>>
-	<<set $activeSlave.skin = either("black", "dark brown", "brown")>>
-	<<set $activeSlave.hColor = either("black", "black", "black", "brown")>>
-	<<set $activeSlave.hStyle = either("neat", "crinkled")>>
-<<case "white">>
-	<<set $activeSlave.butt = either(1, 2, 2, 3, 3, 4)>>
-	<<set $activeSlave.boobs = BoobGenerator.rollBreast(50)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<if $activeSlave.nationality == "German">>
-		<<set $activeSlave.skin = either("pale", "light", "fair")>>
-		<<set $activeSlave.eyeColor = either("blue", "blue", "blue", "brown", "green")>>
-		<<set $activeSlave.hColor = either("black", "blonde", "blonde", "blonde", "red", "brown")>>
-	<<elseif $activeSlave.nationality == "Icelandic">>
-		<<set $activeSlave.skin = either("pale", "pale", "light", "fair")>>
-		<<set $activeSlave.eyeColor = either("blue", "blue", "blue", "brown", "green")>>
-		<<set $activeSlave.hColor = either("black", "blonde", "blonde", "blonde", "red", "brown")>>
-	<<elseif $activeSlave.nationality == "Irish">>
-		<<set $activeSlave.skin = either("pale", "pale", "light", "fair")>>
-		<<set $activeSlave.eyeColor = either("blue", "brown", "green", "green", "green")>>
-		<<set $activeSlave.hColor = either("black", "blonde", "red", "red", "red", "brown")>>
-	<<elseif $activeSlave.nationality == "Scottish">>
-		<<set $activeSlave.skin = either("pale", "fair", "light", "fair")>>
-		<<set $activeSlave.eyeColor = either("blue", "brown", "brown", "green", "green", "green")>>
-		<<set $activeSlave.hColor = either("black", "black", "blonde", "red", "red", "red", "brown")>>
-	<<else>>
-		<<set $activeSlave.skin = either("pale", "light", "fair")>>
-		<<set $activeSlave.eyeColor = either("blue", "brown", "green")>>
-		<<set $activeSlave.hColor = either("black", "blonde", "red", "brown")>>
-	<</if>>
-	<<set $activeSlave.hStyle = "neat">>
-<<case "latina">>
-	<<set $activeSlave.butt = either(1, 2, 2, 3, 3, 4)>>
-	<<set $activeSlave.boobs = BoobGenerator.rollBreast(0)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<set $activeSlave.skin = either("light olive", "brown", "dark brown", "tanned", "dark olive")>>
-	<<set $activeSlave.hColor = either("black", "black", "brown", "brown")>>
-	<<set $activeSlave.hStyle = "neat">>
-<<case "indo-aryan" "malay" "pacific islander" "amerindian">>
-	<<set $activeSlave.butt = either(1, 2, 2, 3, 3)>>
-	<<set $activeSlave.boobs = BoobGenerator.rollBreast(0)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<set $activeSlave.skin = either("dark", "light")>>
-	<<set $activeSlave.hColor = either("black")>>
-	<<set $activeSlave.hStyle = "neat">>
-<<case "asian">>
-	<<set $activeSlave.butt = either(1, 2, 2, 3, 3)>>
-	<<set $activeSlave.boobs = BoobGenerator.rollBreast(-100)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<set $activeSlave.skin = either("light olive", "dark olive", "light")>>
-	<<set $activeSlave.hColor = either("black")>>
-	<<set $activeSlave.hStyle = "neat">>
-<<case "middle eastern" "semitic" "southern european">>
-	<<set $activeSlave.butt = either(1, 2, 2, 3, 3)>>
-	<<set $activeSlave.boobs = BoobGenerator.rollBreast(0)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<set $activeSlave.skin = either("fair", "light olive", "tanned", "light")>>
-	<<set $activeSlave.hColor = either("black")>>
-	<<set $activeSlave.hStyle = "neat">>
-<<default>>
-	<<set $activeSlave.butt = either(1, 2, 2, 3, 3, 4)>>
-	<<set $activeSlave.boobs = BoobGenerator.rollBreast(0)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<set $activeSlave.skin = either("pale", "dark", "light")>>
-	<<set $activeSlave.hColor = either("black", "black", "black", "black", "brown", "brown", "blonde", "red")>>
-	<<set $activeSlave.hStyle = "neat">>
-<</switch>>
-<<if ($activeSlave.skin == "pale") || ($activeSlave.skin == "fair")>>
-	<<if random(1,4) == 1>>
-	<<set $activeSlave.markings = either("freckles", "freckles", "freckles", "heavily freckled", "beauty mark", "beauty mark", "birthmark", "birthmark")>>
-	<</if>>
-<<elseif random(1,8) == 1>>
-	<<set $activeSlave.markings = either("beauty mark", "birthmark")>>
-<</if>>
-
-<<set $activeSlave.origRace = $activeSlave.race>>
-<<set $activeSlave.origEye = $activeSlave.eyeColor>>
-<<set $activeSlave.origHColor = $activeSlave.hColor>>
-<<set $activeSlave.origSkin = $activeSlave.skin>>
-<<set $activeSlave.pubicHColor = $activeSlave.hColor>>
-<<set $activeSlave.pubicHStyle = either("hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "waxed", "waxed", "in a strip", "in a strip", "in a strip", "in a strip", "in a strip", "neat", "neat", "neat", "neat", "neat", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy", "bushy", "bushy", "bushy", "bushy", "very bushy", "very bushy")>>
-<<set $activeSlave.underArmHColor = $activeSlave.hColor>>
-<<set $activeSlave.underArmHStyle = either("hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "shaved", "shaved", "shaved", "shaved", "shaved", "neat", "neat", "neat", "neat", "neat", "bushy", "bushy", "bushy")>>
-<<if ($activeSlave.pubicHStyle == "hairless" || $activeSlave.underArmHStyle == "hairless") && random(1,100) > 40>>
-	<<set $activeSlave.pubicHStyle = "hairless", $activeSlave.underArmHStyle = "hairless">>
-<</if>>
-<<if ($activeSlave.hColor == "blonde" && random(1,20) > 17)>>
-	<<set $activeSlave.eyebrowHColor = either("brown", "brown", "brown", "brown", "black")>>
-	<<set $activeSlave.override_Brow_H_Color = 1>>
-<<else>>
-	<<set $activeSlave.eyebrowHColor = $activeSlave.hColor>>
-<</if>>
-<<set $activeSlave.eyebrowHStyle = either("bald", "shaved", "shaved", "straight", "straight", "straight", "straight", "straight", "straight", "rounded", "rounded", "rounded", "rounded", "rounded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "slanted inwards", "slanted inwards", "slanted outwards", "slanted outwards", "high-arched", "high-arched", "high-arched", "elongated", "elongated", "elongated", "shortened", "shortened", "shortened", "curved", "curved", "curved", "curved", "curved", "curved", "curved")>>
-<<set $activeSlave.eyebrowFullness = either("pencil-thin", "pencil-thin", "thin", "thin", "thin", "threaded", "threaded", "threaded", "threaded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "tapered", "tapered", "tapered", "tapered", "thick", "thick", "thick", "bushy", "bushy")>>
-
-/*LM*/
-<<if ($activeSlave.physicalAge <= 10)>>
-	<<set $activeSlave.boobs = either(100)>>
-<<elseif ($activeSlave.physicalAge == 11)>>
-	<<set $activeSlave.boobs = either(100, 100, 150, 150, 150, 300)>>
-<<elseif ($activeSlave.physicalAge == 12)>>
-	<<set $activeSlave.boobs = either(100, 100, 150, 150, 150, 200, 200, 300)>>
-<<elseif ($activeSlave.physicalAge == 13)>>
-	<<set $activeSlave.boobs = either(100, 150, 200, 200, 300, 300, 300, 400)>>
-<<elseif ($activeSlave.physicalAge == 14)>>
-	<<set $activeSlave.boobs = either(100 ,150, 200, 300, 300, 300, 350, 400, 400)>>
-<<elseif ($activeSlave.physicalAge == 15)>>
-	<<set $activeSlave.boobs = either(150 ,200, 300, 300, 300, 350, 350, 350, 400, 400, 450, 450)>>
-<</if>>
-
-<<if ($activeSlave.physicalAge <= 11)>>
-	<<set $activeSlave.butt = either(1, 1, 1, 1, 1, 1, 1)>>
-<<elseif ($activeSlave.physicalAge <= 12)>>
-	<<set $activeSlave.butt = either(1, 1, 1, 1, 1, 2, 2)>>
-<<elseif ($activeSlave.physicalAge <= 13)>>
-	<<set $activeSlave.butt = either(1, 1, 1, 1, 2, 2, 2)>>
-<<elseif ($activeSlave.physicalAge <= 14)>>
-	<<set $activeSlave.butt = either(1, 1, 1, 2, 2, 2, 3)>>
-<<elseif ($activeSlave.physicalAge <= 15)>>
-	<<set $activeSlave.butt = either(1, 1, 2, 2, 2, 2, 3)>>
-<</if>>
-/*end LM*/
-
-<<if ($weightAffectsAssets != 0)>>
-	<<if $activeSlave.weight < -10 && $activeSlave.butt > 1>>
-		<<set $activeSlave.butt -= 1>>
-	<<elseif $activeSlave.weight > 100 && $activeSlave.butt < 6>>
-		<<set $activeSlave.butt += random(1,2)>>
-	<<elseif $activeSlave.weight > 10 && $activeSlave.butt < 4>>
-		<<set $activeSlave.butt += 1>>
-	<</if>>
-
-	<<if $activeSlave.weight < -10 && $activeSlave.boobs > 200>>
-		<<set $activeSlave.boobs -= 100>>
-	<<elseif $activeSlave.weight > 190 && $activeSlave.boobs < 3000>>
-		<<set $activeSlave.boobs += (random(3,8)*100)>>
-	<<elseif $activeSlave.weight > 160 && $activeSlave.boobs < 1500>>
-		<<set $activeSlave.boobs += (random(2,6)*100)>>
-	<<elseif $activeSlave.weight > 130 && $activeSlave.boobs < 1500>>
-		<<set $activeSlave.boobs += (random(1,4)*100)>>
-	<<elseif $activeSlave.weight > 95 && $activeSlave.boobs < 1200>>
-		<<set $activeSlave.boobs += (random(1,3)*100)>>
-	<<elseif $activeSlave.weight > 30 && $activeSlave.boobs < 1000>>
-		<<set $activeSlave.boobs += 100>>
-	<</if>>
-<</if>>
-
-<<set _femaleBoobShapeGen = []>>
-<<if $activeSlave.boobs > 250 && $activeSlave.boobs < 800>>
-	<<set _femaleBoobShapeGen.push("perky")>>
-	<<set _femaleBoobShapeGen.push("downward-facing")>>
-<</if>>
-<<if $activeSlave.boobs > 400 && $activeSlave.boobs < 1200>>
-	<<set _femaleBoobShapeGen.push("torpedo-shaped")>>
-	<<set _femaleBoobShapeGen.push("wide-set")>>
-<</if>>
-<<if $activeSlave.boobs > 800 && $activeSlave.physicalAge > random(10,50)>>
-	<<set _femaleBoobShapeGen.push("saggy")>>
-<</if>>
-<<if _femaleBoobShapeGen.length == 1>>
-	<<if random(1,2) != 1>>
-	<<set $activeSlave.boobShape = _femaleBoobShapeGen.random()>>
-	<</if>>
-<<elseif _femaleBoobShapeGen.length > 1>>
-	<<if random(1,3) != 1>>
-	<<set $activeSlave.boobShape = _femaleBoobShapeGen.random()>>
-	<</if>>
-<</if>>
-
-<<if passage() != "Starting Girls">>
-	<<set $activeSlave.earPiercing = either(0,1)>>
-	<<set $activeSlave.nosePiercing = either(0,0,0,1)>>
-	<<set $activeSlave.eyebrowPiercing = either(0,0,0,0,0,1)>>
-	<<set $activeSlave.clitPiercing = either(0,0,0,0,0,1)>>
-	<<set $activeSlave.lipsPiercing = either(0,0,0,0,0,1)>>
-	<<set $activeSlave.navelPiercing = either(0,0,0,1)>>
-	<<set $activeSlave.nipplesPiercing = either(0,0,0,0,1)>>
-<</if>>
-
-<<set $activeSlave.face = random(-60,60)>>
-<<if random(0,2) == 1>><<set $activeSlave.face = random(-10,10)>><</if>>
-<<if $activeSlave.physicalAge > 40>>
-	<<set $activeSlave.face -= random(0,20)>>
-<<elseif $activeSlave.physicalAge > 35>>
-	<<set $activeSlave.face -= random(0,10)>>
-<<elseif $activeSlave.physicalAge <= 20>>
-	<<set $activeSlave.face += random(0,20)>>
-<<elseif $activeSlave.physicalAge <= 25>>
-	<<set $activeSlave.face += random(0,10)>>
-<</if>>
-<<if $activeSlave.physicalAge > 10>>
-	<<set $activeSlave.faceShape = either("androgynous", "cute", "sensual", "exotic", "normal", "normal")>>
-<<else>>
-	<<set $activeSlave.faceShape = either("androgynous", "androgynous", "cute", "cute", "sensual", "exotic", "normal", "normal")>>
-<</if>>
-<<switch $activeSlave.faceShape>>
-<<case "sensual" "cute">>
-	<<set $activeSlave.face += random(0,20)>>
-<<case "exotic" "androgynous">>
-	<<set $activeSlave.face += random(-10,10)>>
-<<case "masculine">>
-	<<set $activeSlave.face += random(-10,0)>>
-<</switch>>
-
-<<if $activeSlave.boobs < 250>>
-	<<set $activeSlave.nipples = either("tiny", "tiny", "tiny", "tiny", "cute", "cute", "puffy", "partially inverted")>>
-<<elseif $activeSlave.boobs < 500>>
-	<<set $activeSlave.nipples = either("tiny", "cute", "cute", "cute", "puffy", "partially inverted")>>
-<<elseif $activeSlave.boobs < 1000>>
-	<<set $activeSlave.nipples = either("tiny", "cute", "cute", "cute", "puffy", "puffy", "partially inverted", "inverted")>>
-<<else>>
-	<<set $activeSlave.nipples = either("cute", "puffy", "partially inverted", "inverted", "huge")>>
-<</if>>
-
-<<set $activeSlave.vagina = either(0, 0, 1, 1, 1)>>
-<<if $activeSlave.actualAge < 20>>
-	<<set $activeSlave.vagina = either(0, 1)>>
-<</if>>
-<<if $activeSlave.actualAge > 30>>
-	<<set $activeSlave.vagina = either(1, 1, 1, 1, 2)>>
-<</if>>
-<<if $activeSlave.vagina == 0>>
-	<<set $activeSlave.vaginalSkill = 0>>
-<</if>>
-<<if $activeSlave.energy < random(1,80)>>
-	<<set $activeSlave.vaginaLube = 0>>
-<<elseif $activeSlave.physicalAge > random(35,60)>>
-	<<set $activeSlave.vaginaLube = 0>>
-<</if>>
-
-<<set $activeSlave.clit = either(0, 0, 0, 0, 0, 0, 1, 1, 2)>>
-<<set $activeSlave.labia = either(0, 0, 0, 1, 1, 1, 1, 2, 2, 3)>>
-<<set $activeSlave.foreskin = random(0,4)>>
-
-<<set $activeSlave.voice = either(1, 2, 2, 2, 2, 2, 2, 3, 3, 3)>>
-
-<<set $activeSlave.anus = either(0, 0, 1, 1, 2)>>
-<<set $activeSlave.analArea = $activeSlave.anus + either(0, 0, 0, 1)>>
-
-<<if $activeSlave.anus == 0>>
-	<<set $activeSlave.analSkill = 0>>
-<<elseif random(1,4) == 1>>
-	<<set $activeSlave.anusTat = "bleached">>
-<</if>>
-
-/%pedoshit%/
-<<if $activeSlave.physicalAge <= 11>>
-	<<set $activeSlave.hips = either(-2, -2, -1, -1, 0)>>
-<<elseif $activeSlave.physicalAge <= 13>>
-	<<set $activeSlave.hips = either(-2, -1, -1, 0, 1)>>
-<</if>>
-<<if $activeSlave.physicalAge <= 13>>
-	<<set $activeSlave.vagina = either(0, 0, 0, 0, 0, 0, 0, 1)>>
-<<elseif $activeSlave.physicalAge <= 15>>
-	<<set $activeSlave.vagina = either(0, 0, 0, 0, 0, 1, 1)>>
-<<elseif $activeSlave.physicalAge <= 17>>
-	<<set $activeSlave.vagina = either(0, 0, 0, 1, 1, 1)>>
-<</if>>
-
-<<if $activeSlave.vagina == 0>>
-	<<set $activeSlave.vaginalSkill = 0>>
-<</if>>
-
-<<if ($activeSlave.physicalAge <= 11)>>
-	<<set $activeSlave.clit = either(0, 0, 0, 0, 0, 0, 0, 0, 1)>>
-<<elseif ($activeSlave.physicalAge <= 13)>>
-	<<set $activeSlave.clit = either(0, 0, 0, 0, 0, 0, 0, 1, 1)>>
-<<elseif ($activeSlave.physicalAge <= 15)>>
-	<<set $activeSlave.clit = either(0, 0, 0, 0, 0, 0, 0, 1, 2)>>
-<</if>>
-
-<<if ($activeSlave.physicalAge <= 11)>>
-	<<set $activeSlave.labia = either(0, 0, 0, 0, 0, 0, 0, 1, 1)>>
-<<elseif ($activeSlave.physicalAge <= 12)>>
-	<<set $activeSlave.labia = either(0, 0, 0, 0, 0, 0, 1, 1, 1)>>
-<<elseif ($activeSlave.physicalAge <= 13)>>
-	<<set $activeSlave.labia = either(0, 0, 0, 0, 0, 1, 1, 1, 1)>>
-<<elseif ($activeSlave.physicalAge <= 14)>>
-	<<set $activeSlave.labia = either(0, 0, 0, 0, 1, 1, 1, 1, 2)>>
-<<elseif ($activeSlave.physicalAge <= 15)>>
-	<<set $activeSlave.labia = either(0, 0, 0, 1, 1, 1, 1, 2, 2)>>
-<</if>>
-
-<<if ($activeSlave.physicalAge <= 13)>>
-	<<set $activeSlave.voice = either(2, 2, 2, 3, 3, 3, 3, 3, 3)>>
-<<elseif ($activeSlave.physicalAge <= 16)>>
-	<<set $activeSlave.voice = either(2, 2, 2, 2, 2, 3, 3, 3, 3)>>
-<</if>>
-
-<<if $activeSlave.physicalAge <= 6>>
-	<<set $activeSlave.pregAdaptation = 5>>
-<<elseif $activeSlave.physicalAge <= 7>>
-	<<set $activeSlave.pregAdaptation = 6>>
-<<elseif $activeSlave.physicalAge <= 8>>
-	<<set $activeSlave.pregAdaptation = 7>>
-<<elseif $activeSlave.physicalAge <= 9>>
-	<<set $activeSlave.pregAdaptation = 8>>
-<<elseif $activeSlave.physicalAge <= 10>>
-	<<set $activeSlave.pregAdaptation = 9>>
-<<elseif $activeSlave.physicalAge <= 11>>
-	<<set $activeSlave.pregAdaptation = 10>>
-<<elseif $activeSlave.physicalAge <= 12>>
-	<<set $activeSlave.pregAdaptation = 14>>
-<<elseif $activeSlave.physicalAge <= 13>>
-	<<set $activeSlave.pregAdaptation = 18>>
-<<elseif $activeSlave.physicalAge <= 14>>
-	<<set $activeSlave.pregAdaptation = 22>>
-<<elseif $activeSlave.physicalAge <= 15>>
-	<<set $activeSlave.pregAdaptation = 28>>
-<<elseif $activeSlave.physicalAge <= 16>>
-	<<set $activeSlave.pregAdaptation = 34>>
-<<elseif $activeSlave.physicalAge <= 17>>
-	<<set $activeSlave.pregAdaptation = 42>>
-<<else>>
-	<<set $activeSlave.pregAdaptation = 50>>
-<</if>>
-
-<<if $activeSlave.fuckdoll > 0>>
-	<<set $activeSlave.pronoun = "it", $activeSlave.possessivePronoun = "its", $activeSlave.possessive = "its", $activeSlave.object = "it", $activeSlave.objectReflexive = "itself", $activeSlave.noun = "toy">>
-<<elseif $activeSlave.dick > 0 && $activeSlave.vagina == -1 && $diversePronouns == 1>>
-	<<set $activeSlave.pronoun = "he", $activeSlave.possessivePronoun = "his", $activeSlave.possessive = "his", $activeSlave.object = "him", $activeSlave.objectReflexive = "himself", $activeSlave.noun = "boy">>
-<<else>>
-	<<set $activeSlave.pronoun = "she", $activeSlave.possessivePronoun = "hers", $activeSlave.possessive = "her", $activeSlave.object = "her", $activeSlave.objectReflexive = "herself", $activeSlave.noun = "girl">>
-<</if>>
-
-<<if passage() == "Slave Markets" && $slaveMarket == "corporate">>
-	<<if ($captureUpgradeRace != "unselected") && ($captureUpgradeRace != "none")>>
-	<<if $activeSlave.race != $captureUpgradeRace>>
-		<<set $slaveMarket = "corporate">>
-		<<goto "Slave Markets">>
-	<</if>>
-	<</if>>
-<</if>>
-
-<<if $seeExtreme == 1>>
-	<<run disabilityRoll($activeSlave)>>
-<</if>>
+<<run GenerateNewSlave("XX")>>
diff --git a/src/uncategorized/generateXYSlave.tw b/src/uncategorized/generateXYSlave.tw
index 8810d3fa11c183725c6c014318243b96adfa384e..c7d29889638e3c61bb6464f1a6878d7f67725ab5 100644
--- a/src/uncategorized/generateXYSlave.tw
+++ b/src/uncategorized/generateXYSlave.tw
@@ -1,614 +1,3 @@
 :: Generate XY Slave [nobr]
 
-<<BaseSlave>>
-/% Defaults that differ from the old template %/
-<<set WombInit($activeSlave)>>
-<<set $activeSlave.genes = "XY", $activeSlave.hLength = 10, $activeSlave.prostate = 1, $activeSlave.canRecruit = 1>>
-
-<<run generateAge($activeSlave)>>
-
-<<if $activeSlave.physicalAge < 6>>
-	<<set $activeSlave.teeth = "baby">>
-<<elseif $activeSlave.physicalAge < 12>>
-	<<set $activeSlave.teeth = "mixed">>
-<</if>>
-
-<<if $activeSlave.ovaries == 1>>
-	<<if $activeSlave.physicalAge >= $activeSlave.pubertyAgeXX>>
-		<<set $activeSlave.pubertyXX = 1>>
-	<<else>>
-		<<set $activeSlave.pubertyXX = 0>>
-	<</if>>
-<<else>>
-	<<set $activeSlave.pubertyXX = 0>>
-<</if>>
-
-<<set $activeSlave.ID = $IDNumber++>>
-<<set $activeSlave.weekAcquired = $week>>
-
-<<run generateIntelligence($activeSlave)>>
-<<run generateCareer($activeSlave)>>
-
-<<set $activeSlave.vaginalSkill = 0>>
-<<set $activeSlave.analSkill = random(0,15)>>
-<<set $activeSlave.oralSkill = random(0,15)>>
-<<set $activeSlave.entertainSkill = random(0,15)>>
-<<set $activeSlave.whoreSkill = random(0,15)>>
-
-<<set $activeSlave.energy = random(15,90)>>
-<<run randomizeAttraction($activeSlave)>>
-<<set $activeSlave.fetishStrength = random(0,90)>>
-<<set $activeSlave.fetish = either("none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "submissive", "cumslut", "humiliation", "buttslut", "buttslut", "boobs", "dom", "sadist", "masochist")>>
-
-<<set $activeSlave.behavioralFlaw = either("none", "none", "none", "arrogant", "bitchy", "odd", "hates men", "hates men", "hates men", "hates women", "anorexic", "gluttonous", "devout", "liberated")>>
-<<if ($activeSlave.behavioralFlaw == "devout")>>
-	<<set $activeSlave.sexualFlaw = either("none", "repressed", "shamefast", "apathetic", "crude", "judgemental")>>
-<<else>>
-	<<set $activeSlave.sexualFlaw = either("none", "none", "none", "none", "hates oral", "hates anal", "hates anal", "repressed", "idealistic", "shamefast", "apathetic", "crude", "judgemental")>>
-<</if>>
-<<if ($activeSlave.behavioralFlaw == "none") && random(1,10) == 1>>
-	<<set $activeSlave.behavioralQuirk = either("confident", "cutting", "funny", "adores women", "adores men", "fitness", "insecure", "sinful", "advocate")>>
-<</if>>
-<<if ($activeSlave.sexualFlaw == "none") && random(1,10) == 1>>
-	<<set $activeSlave.sexualQuirk = either("gagfuck queen", "painal queen", "strugglefuck queen", "tease", "romantic", "perverted", "caring", "unflinching", "size queen")>>
-<</if>>
-
-<<set $activeSlave.health = random(-50,50)>>
-
-<<set $activeSlave.devotion = random(-90,-60)>>
-<<set $activeSlave.trust = random(-45,-25)>>
-
-<<if ($activeSlave.physicalAge > random(0,100))>>
-	<<set $activeSlave.eyes = -1>>
-<</if>>
-<<if ($activeSlave.physicalAge > random(30,100))>>
-	<<set $activeSlave.hears = -1>>
-<</if>>
-
-/% Begin height replacement section. %/
-/% Since we use nationality for height effects we need to initialize it now instead of later on like in vanilla Free Cities. %/
-<<run generateNationality($activeSlave)>> /* includes race selection */
-<<run nationalityToName($activeSlave)>>
-<<run nationalityToAccent($activeSlave)>>
-
-<<set $activeSlave.height = Math.round(Height.random($activeSlave))>>
-<<if $activeSlave.physicalAge <= 13>>
-	<<if $activeSlave.height > Height.mean($activeSlave) * 170/172.5>>
-		<<set $activeSlave.hips = either(-2, -1, -1, 0, 1)>>
-		<<set $activeSlave.shoulders = either(-1, -1, 0, 0, 0, 1)>>
-	<<else>>
-		<<set $activeSlave.hips = either(-2, -2, -1, -1, 0)>>
-		<<set $activeSlave.shoulders = either(-2, -1, -1, 0, 0, 1)>>
-	<</if>>
-<<else>>
-	<<if $activeSlave.height >= Height.mean($activeSlave) * 170/172.5>>
-		<<set $activeSlave.hips = either(-2, -1, -1, 0, 1)>>
-		<<set $activeSlave.shoulders = either(-1, 0, 1, 1, 2, 2)>>
-	<<else>>
-		<<set $activeSlave.hips = either(-2, -2, -1, -1, 0)>>
-		<<set $activeSlave.shoulders = either(-1, 0, 0, 1, 1, 2)>>
-	<</if>>
-<</if>>
-/% End height replacement section. %/
-
-<<set $activeSlave.weight = random(-100, 180)>>
-<<if $activeSlave.physicalAge < 13>>
-	<<set $activeSlave.waist = random(-15,25)>>
-<<elseif ($activeSlave.weight < -30)>>
-	<<set $activeSlave.waist = random(-45,45)>>
-<<elseif ($activeSlave.weight <= 30)>>
-	<<set $activeSlave.waist = random(-15,65)>>
-<<elseif ($activeSlave.weight <= 160)>>
-	<<set $activeSlave.waist = random(5,100)>>
-<<else>>
-	<<set $activeSlave.waist = random(50,100)>>
-<</if>>
-
-<<if ($activeSlave.intelligenceImplant >= 15 || $activeSlave.intelligence > 95) && ($activeSlave.accent >= 3) && ($activeSlave.intelligence) > random(0,100)>>
-	<<set $activeSlave.accent -= 1>>
-<</if>>
-
-<<set _maleCrookedTeethGen = $activeSlave.intelligence+$activeSlave.intelligenceImplant>>
-<<if "American" == $activeSlave.nationality>>
-	<<set _maleCrookedTeethGen += 22>>
-<<elseif ["Andorran", "Antiguan", "Argentinian", "Aruban", "Australian", "Austrian", "Bahamian", "Bahraini", "Barbadian", "Belarusian", "Belgian", "Bermudian", "Brazilian", "British", "Bruneian", "Bulgarian", "Canadian", "Catalan", "Chilean", "a Cook Islander", "Croatian", "Czech", "Cypriot", "Danish", "Dutch", "Emirati", "Estonian", "Finnish", "French", "German", "Greek", "Greenlandic", "Guamanian", "Hungarian", "Icelandic", "Irish", "Israeli", "Italian", "Japanese", "Kazakh", "Korean", "Kuwaiti", "Latvian", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Malaysian", "Maltese", "Mauritian", "Monégasque", "Montenegrin", "New Caledonian", "a New Zealander", "Niuean", "Norwegian", "Omani", "Palauan", "Panamanian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Sammarinese", "Saudi", "Seychellois", "Singaporean", "Slovak", "Slovene", "Spanish", "Swedish", "Swiss", "Taiwanese", "Trinidadian", "Uruguayan", "Vatican"].includes($activeSlave.nationality)>>
-<<else>>
-	<<set _maleCrookedTeethGen -= 20>>
-<</if>>
-<<if random(0,_maleCrookedTeethGen) <= 15 && $activeSlave.physicalAge >= 12>>
-	<<set $activeSlave.teeth = "crooked">>
-<</if>>
-
-<<switch $activeSlave.race>>
-<<case "black">>
-	<<set $activeSlave.butt = either(1, 1, 2, 3)>>
-	<<set $activeSlave.boobs = either(100, 200, 200, 300, 300, 400, 500)>>
-	<<set $activeSlave.lips = random(5,30)>>
-	<<set $activeSlave.skin = either("black", "dark brown", "brown")>>
-	<<set $activeSlave.hColor = either("black", "black", "black", "brown")>>
-	<<set $activeSlave.hStyle = either("neat", "crinkled")>>
-<<case "white">>
-	<<set $activeSlave.butt = either(1, 1, 2, 3)>>
-	<<set $activeSlave.boobs = either(100, 200, 200, 300, 300, 400, 500)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<if $activeSlave.nationality == "German">>
-		<<set $activeSlave.skin = either("pale", "light", "fair")>>
-		<<set $activeSlave.eyeColor = either("blue", "blue", "blue", "brown", "green")>>
-		<<set $activeSlave.hColor = either("black", "blonde", "blonde", "blonde", "red", "brown")>>
-	<<elseif $activeSlave.nationality == "Icelandic">>
-		<<set $activeSlave.skin = either("pale", "pale", "light", "fair")>>
-		<<set $activeSlave.eyeColor = either("blue", "blue", "blue", "brown", "green")>>
-		<<set $activeSlave.hColor = either("black", "blonde", "blonde", "blonde", "red", "brown")>>
-	<<elseif $activeSlave.nationality == "Irish">>
-		<<set $activeSlave.skin = either("pale", "pale", "light", "fair")>>
-		<<set $activeSlave.eyeColor = either("blue", "brown", "green", "green", "green")>>
-		<<set $activeSlave.hColor = either("black", "blonde", "red", "red", "red", "brown")>>
-	<<elseif $activeSlave.nationality == "Scottish">>
-		<<set $activeSlave.skin = either("pale", "fair", "light", "fair")>>
-		<<set $activeSlave.eyeColor = either("blue", "brown", "brown", "green", "green", "green")>>
-		<<set $activeSlave.hColor = either("black", "black", "blonde", "red", "red", "red", "brown")>>
-	<<else>>
-		<<set $activeSlave.skin = either("pale", "light", "fair")>>
-		<<set $activeSlave.eyeColor = either("blue", "brown", "green")>>
-		<<set $activeSlave.hColor = either("black", "blonde", "red", "brown")>>
-	<</if>>
-	<<set $activeSlave.hStyle = "neat">>
-<<case "latina">>
-	<<set $activeSlave.butt = either(1, 1, 2, 3)>>
-	<<set $activeSlave.boobs = either(100, 200, 200, 300, 300, 400, 500)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<set $activeSlave.skin = either("light olive", "brown", "dark brown", "tanned", "dark olive")>>
-	<<set $activeSlave.hColor = either("black", "black", "brown", "brown")>>
-	<<set $activeSlave.hStyle = "neat">>
-<<case "indo-aryan" "malay" "pacific islander" "amerindian">>
-	<<set $activeSlave.butt = either(1, 1, 2, 3)>>
-	<<set $activeSlave.boobs = either(100, 200, 200, 300, 300, 400, 500)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<set $activeSlave.skin = either("dark", "light")>>
-	<<set $activeSlave.hColor = either("black")>>
-	<<set $activeSlave.hStyle = "neat">>
-<<case "asian">>
-	<<set $activeSlave.butt = either(1, 1, 2, 3)>>
-	<<set $activeSlave.boobs = either(100, 200, 200, 300, 300, 400, 500)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<set $activeSlave.skin = either("light olive", "dark olive", "light")>>
-	<<set $activeSlave.hColor = either("black")>>
-	<<set $activeSlave.hStyle = "neat">>
-<<case "middle eastern" "semitic" "southern european">>
-	<<set $activeSlave.butt = either(1, 1, 2, 3)>>
-	<<set $activeSlave.boobs = either(100, 200, 200, 300, 300, 400, 500)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<set $activeSlave.skin = either("fair", "light olive", "tanned", "light")>>
-	<<set $activeSlave.hColor = either("black")>>
-	<<set $activeSlave.hStyle = "neat">>
-<<default>>
-	<<set $activeSlave.butt = either(1, 1, 2, 3)>>
-	<<set $activeSlave.boobs = either(100, 200, 200, 300, 300, 400, 500)>>
-	<<set $activeSlave.lips = random(5,25)>>
-	<<set $activeSlave.skin = either("pale", "dark", "light")>>
-	<<set $activeSlave.hColor = either("black", "black", "black", "black", "brown", "brown", "blonde", "red")>>
-	<<set $activeSlave.hStyle = "neat">>
-<</switch>>
-<<if $activeSlave.physicalAge > 55>>
-	<<if random(1,100) > 40>>
-		<<set $activeSlave.hStyle = "bald", $activeSlave.bald = 1>>
-	<</if>>
-<</if>>
-<<if ($activeSlave.skin == "pale") || ($activeSlave.skin == "fair")>>
-	<<if random(1,4) == 1>>
-	<<set $activeSlave.markings = either("freckles", "freckles", "freckles", "heavily freckled", "beauty mark", "beauty mark", "birthmark", "birthmark")>>
-	<</if>>
-<<elseif random(1,8) == 1>>
-	<<set $activeSlave.markings = either("beauty mark", "birthmark")>>
-<</if>>
-
-<<set $activeSlave.origRace = $activeSlave.race>>
-<<set $activeSlave.origEye = $activeSlave.eyeColor>>
-<<set $activeSlave.origHColor = $activeSlave.hColor>>
-<<set $activeSlave.origSkin = $activeSlave.skin>>
-<<set $activeSlave.pubicHColor = $activeSlave.hColor>>
-<<set $activeSlave.pubicHStyle = either("hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "waxed", "waxed", "in a strip", "in a strip", "in a strip", "neat", "neat", "neat", "neat", "neat", "neat", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "very bushy", "very bushy")>>
-<<set $activeSlave.underArmHColor = $activeSlave.hColor>>
-<<set $activeSlave.underArmHStyle = either("hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "shaved", "shaved", "shaved", "shaved", "shaved", "neat", "neat", "neat", "neat", "neat", "neat", "neat", "bushy", "bushy", "bushy", "bushy", "bushy")>>
-<<if ($activeSlave.pubicHStyle == "hairless" || $activeSlave.underArmHStyle == "hairless") && random(1,100) > 40>>
-	<<set $activeSlave.pubicHStyle = "hairless", $activeSlave.underArmHStyle = "hairless">>
-<</if>>
-<<if ($activeSlave.hColor == "blonde" && random(1,20) > 17)>>
-	<<set $activeSlave.eyebrowHColor = either("brown", "brown", "brown", "brown", "black")>>
-	<<set $activeSlave.override_Brow_H_Color = 1>>
-<<else>>
-	<<set $activeSlave.eyebrowHColor = $activeSlave.hColor>>
-<</if>>
-<<set $activeSlave.eyebrowHStyle = either("bald", "shaved", "shaved", "straight", "straight", "straight", "straight", "straight", "straight", "rounded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "slanted inwards", "slanted outwards", "high-arched", "elongated", "shortened", "curved", "curved", "curved", "curved", "curved")>>
-<<set $activeSlave.eyebrowFullness = either("pencil-thin", "thin", "thin", "threaded", "threaded", "threaded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "tapered", "tapered", "tapered", "thick", "thick", "bushy")>>
-
-
-<<if ($weightAffectsAssets != 0)>>
-	<<if $activeSlave.weight < -10 && $activeSlave.butt > 1>>
-		<<set $activeSlave.butt -= 1>>
-	<<elseif $activeSlave.weight > 100 && $activeSlave.butt < 6>>
-		<<set $activeSlave.butt += random(1,2)>>
-	<<elseif $activeSlave.weight > 10 && $activeSlave.butt < 4>>
-		<<set $activeSlave.butt += 1>>
-	<</if>>
-
-	<<if $activeSlave.weight < -10 && $activeSlave.boobs > 200>>
-		<<set $activeSlave.boobs -= 100>>
-	<<elseif $activeSlave.weight > 190 && $activeSlave.boobs < 3000>>
-		<<set $activeSlave.boobs += (random(3,8)*100)>>
-	<<elseif $activeSlave.weight > 160 && $activeSlave.boobs < 1500>>
-		<<set $activeSlave.boobs += (random(2,6)*100)>>
-	<<elseif $activeSlave.weight > 130 && $activeSlave.boobs < 1500>>
-		<<set $activeSlave.boobs += (random(1,4)*100)>>
-	<<elseif $activeSlave.weight > 95 && $activeSlave.boobs < 1200>>
-		<<set $activeSlave.boobs += (random(1,3)*100)>>
-	<<elseif $activeSlave.weight > 30 && $activeSlave.boobs < 1000>>
-		<<set $activeSlave.boobs += 100>>
-	<</if>>
-<</if>>
-
-<<set _maleBoobShapeGen = []>>
-<<if $activeSlave.boobs > 250 && $activeSlave.boobs < 800>>
-	<<set _maleBoobShapeGen.push("perky")>>
-	<<set _maleBoobShapeGen.push("downward-facing")>>
-<</if>>
-<<if $activeSlave.boobs > 400 && $activeSlave.boobs < 1200>>
-	<<set _maleBoobShapeGen.push("torpedo-shaped")>>
-	<<set _maleBoobShapeGen.push("wide-set")>>
-<</if>>
-<<if $activeSlave.boobs > 800 && $activeSlave.physicalAge > random(10,50)>>
-	<<set _maleBoobShapeGen.push("saggy")>>
-<</if>>
-<<if _maleBoobShapeGen.length == 1>>
-	<<if random(1,2) != 1>>
-	<<set $activeSlave.boobShape = _maleBoobShapeGen.random()>>
-	<</if>>
-<<elseif _maleBoobShapeGen.length > 1>>
-	<<if random(1,3) != 1>>
-	<<set $activeSlave.boobShape = _maleBoobShapeGen.random()>>
-	<</if>>
-<</if>>
-
-<<if passage() != "Starting Girls">>
-	<<set $activeSlave.earPiercing = either(0,0,0,1)>>
-	<<set $activeSlave.nosePiercing = either(0,0,0,0,1)>>
-	<<set $activeSlave.eyebrowPiercing = either(0,0,0,0,0,1)>>
-	<<set $activeSlave.dickPiercing = either(0,0,0,0,0,1)>>
-	<<set $activeSlave.lipsPiercing = either(0,0,0,0,0,1)>>
-	<<set $activeSlave.navelPiercing = either(0,0,0,0,1)>>
-	<<set $activeSlave.nipplesPiercing = either(0,0,0,0,1)>>
-<</if>>
-
-<<set $activeSlave.face = random(-70,20)>>
-<<if random(0,2) == 1>><<set $activeSlave.face = random(-40,-10)>><</if>>
-<<if $activeSlave.physicalAge > 40>>
-	<<set $activeSlave.face -= random(0,20)>>
-<<elseif $activeSlave.physicalAge > 35>>
-	<<set $activeSlave.face -= random(0,10)>>
-<<elseif $activeSlave.physicalAge <= 20>>
-	<<set $activeSlave.face += random(0,20)>>
-<<elseif $activeSlave.physicalAge <= 25>>
-	<<set $activeSlave.face += random(0,10)>>
-<</if>>
-<<if $activeSlave.physicalAge >= 17>>
-	<<set $activeSlave.faceShape = either("masculine", "masculine", "masculine", "androgynous")>>
-<<elseif $activeSlave.physicalAge >= 15>>
-	<<set $activeSlave.faceShape = either("masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "androgynous", "sensual", "exotic", "normal")>>
-<<elseif $activeSlave.physicalAge >= 13>>
-	<<set $activeSlave.faceShape = either("masculine", "masculine", "masculine", "androgynous", "cute", "sensual", "exotic", "normal")>>
-<<elseif $activeSlave.physicalAge >= 11>>
-	<<set $activeSlave.faceShape = either("masculine", "androgynous", "cute", "sensual", "exotic", "normal", "normal")>>
-<<else>>
-	<<set $activeSlave.faceShape = either("androgynous", "androgynous", "cute", "cute", "sensual", "exotic", "normal", "normal")>>
-<</if>>
-<<switch $activeSlave.faceShape>>
-<<case "sensual" "cute">>
-	<<set $activeSlave.face += random(0,20)>>
-<<case "exotic" "androgynous">>
-	<<set $activeSlave.face += random(-10,10)>>
-<<case "masculine">>
-	<<set $activeSlave.face += random(-10,0)>>
-<</switch>>
-
-<<if $activeSlave.boobs < 250>>
-	<<set $activeSlave.nipples = either("tiny", "tiny", "tiny", "tiny", "cute", "cute", "puffy", "partially inverted")>>
-<<elseif $activeSlave.boobs < 500>>
-	<<set $activeSlave.nipples = either("tiny", "cute", "cute", "cute", "puffy", "partially inverted")>>
-<<elseif $activeSlave.boobs < 1000>>
-	<<set $activeSlave.nipples = either("tiny", "cute", "cute", "cute", "puffy", "puffy", "partially inverted", "inverted")>>
-<<else>>
-	<<set $activeSlave.nipples = either("cute", "puffy", "partially inverted", "inverted", "huge")>>
-<</if>>
-
-<<set $activeSlave.vagina = -1>>
-<<set $activeSlave.clit = 0>>
-<<set $activeSlave.preg = 0>>
-
-<<set $activeSlave.dick = either(1, 2, 2, 2, 3, 3, 3, 4, 4, 5)>>
-<<if $seeExtreme == 1>>
-	<<set $activeSlave.balls = either(0, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5)>>
-<<else>>
-	<<set $activeSlave.balls = either(1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5)>>
-<</if>>
-<<set $activeSlave.scrotum = $activeSlave.balls>>
-
-<<if $activeSlave.balls > 0>>
-	<<if $activeSlave.physicalAge >= $activeSlave.pubertyAgeXY>>
-		<<set $activeSlave.pubertyXY = 1>>
-	<<else>>
-		<<set $activeSlave.pubertyXY = 0>>
-	<</if>>
-<<else>>
-	<<set $activeSlave.pubertyXY = 0>>
-<</if>>
-
-/% Begin circumcision rate replacement section. %/
-/% The default rate of 50% is wildly unrepresentative, and there is extreme regional variation. %/
-/%
- What we want is the prevalence among newborns, since this game
- happens about 20 years in the future, but we'll use this lacking
- something better.
- https://pophealthmetrics.biomedcentral.com/articles/10.1186/s12963-016-0073-5
- Right now we mostly just break it down by country.
- It would be better to break it down by both country
- and race if statistics are available.
-%/
-<<if ($seeCircumcision == 0)>>
-	<<set $activeSlave.foreskin = $activeSlave.dick + random(0,1)>>
-<<else>>
-	/% Temporarily use activeSlave.foreskin to store the chance of circumcision. %/
-	<<switch $activeSlave.nationality>>
-	<<case "Afghan" "Iranian" "Moroccan" "Palestinian" "Sahrawi" "Tunisian">>
-		<<set $activeSlave.foreskin = 100>>
-	<<case "Comorian" "Gabonese" "Iraqi" "Jordanian" "Kurdish" "Mauritanian" "Nigerian" "Tajik" "Turkish" "Yemeni">>
-		<<set $activeSlave.foreskin = 99>>
-	<<case "Algerian" "Azerbaijani" "Liberian" "Maldivian">>
-		<<set $activeSlave.foreskin = 98>>
-	<<case "Djiboutian" "Eritrean" "Ivorian" "Libyan" "Saudi" "Uzbek">>
-		<<set $activeSlave.foreskin = 97>>
-	<<case "Nigerien" "Pakistani" "Sierra Leonean" "Turkmen" "Zairian">>
-		<<set $activeSlave.foreskin = 96>>
-	<<case "a Cook Islander" "Egyptian" "Gambian" "Guamanian" "Malagasy" "Nauruan" "Ni-Vanuatu" "Niuean" "Palauan" "Samoan" "a Solomon Islander" "Togolese" "Tongan" "Tuvaluan">>
-		<<set $activeSlave.foreskin = 95>>
-	<<case "Cameroonian" "Senegalese" "Somali">>
-		<<set $activeSlave.foreskin = 94>>
-	<<case "Bangladeshi" "Beninese" "Bissau-Guinean" "Indonesian" "Syrian">>
-		<<set $activeSlave.foreskin = 93>>
-	<<case "Ethiopian" "Filipina" "Ghanan" "Israeli" "Kosovan">>
-		<<set $activeSlave.foreskin = 92>>
-	<<case "Kenyan" "Kyrgyz">>
-		<<set $activeSlave.foreskin = 91>>
-	<<case "Burkinabé" "Omani">>
-		<<set $activeSlave.foreskin = 88>>
-	<<case "Equatoguinean">>
-		<<set $activeSlave.foreskin = 87>>
-	<<case "Kuwaiti" "Malian">>
-		<<set $activeSlave.foreskin = 86>>
-	<<case "Guinean">>
-		<<set $activeSlave.foreskin = 84>>
-	<<case "Bahraini">>
-		<<set $activeSlave.foreskin = 81>>
-	<<case "French Polynesian">>
-		<<set $activeSlave.foreskin = 78>>
-	<<case "American" "Qatari">>
-		<<set $activeSlave.foreskin = 77>>
-	<<case "Emirati">>
-		<<set $activeSlave.foreskin = 76>>
-	<<case "Chadian">>
-		<<set $activeSlave.foreskin = 74>>
-	<<case "Tanzanian">>
-		<<set $activeSlave.foreskin = 72>>
-	<<case "Congolese">>
-		<<set $activeSlave.foreskin = 70>>
-	<<case "Central African">>
-		<<set $activeSlave.foreskin = 63>>
-	<<case "Burundian" "Malaysian">>
-		<<set $activeSlave.foreskin = 61>>
-	<<case "Lebanese">>
-		<<set $activeSlave.foreskin = 60>>
-	<<case "Angolan">>
-		<<set $activeSlave.foreskin = 58>>
-	<<case "Fijian" "Kazakh">>
-		<<set $activeSlave.foreskin = 56>>
-	<<case "Bruneian" "Korean" "Mosotho">>
-		/% Population-weighted average of South Korea and North Korea. %/
-		<<set $activeSlave.foreskin = 52>>
-	<<case "New Caledonian">>
-		<<set $activeSlave.foreskin = 50>>
-	<<case "Albanian">>
-		<<set $activeSlave.foreskin = 48>>
-	<<case "Mozambican">>
-		<<set $activeSlave.foreskin = 47>>
-	<<case "South African">>
-		<<set $activeSlave.foreskin = 45>>
-	<<case "Dominican">>
-		<<set $activeSlave.foreskin = 43>>
-	<<case "Bosnian">>
-		<<set $activeSlave.foreskin = 42>>
-	<<case "Sudanese">>
-		<<set $activeSlave.foreskin = 39>>
-	<<case "Mexican">>
-		<<set $activeSlave.foreskin = 38>>
-	<<case "Macedonian">>
-		<<set $activeSlave.foreskin = 34>>
-	<<case "a New Zealander">>
-		<<set $activeSlave.foreskin = 33>>
-	<<case "Canadian">>
-		<<set $activeSlave.foreskin = 32>>
-	<<case "Scottish">>
-		<<set $activeSlave.foreskin = 28>>
-	<<case "Australian" "Ugandan">>
-		<<set $activeSlave.foreskin = 27>>
-	<<case "Namibian">>
-		<<set $activeSlave.foreskin = 26>>
-	<<case "South Sudanese">>
-		<<set $activeSlave.foreskin = 24>>
-	<<case "Belgian" "Cypriot" "Thai">>
-		<<set $activeSlave.foreskin = 23>>
-	<<case "Malawian">>
-		<<set $activeSlave.foreskin = 22>>
-	<<case "British">>
-		<<set $activeSlave.foreskin = 21>>
-	<<case "Puerto Rican">>
-		<<set $activeSlave.foreskin = 20>>
-	<<case "Montenegrin">>
-		<<set $activeSlave.foreskin = 19>>
-	<<case "Mauritian">>
-		<<set $activeSlave.foreskin = 17>>
-	<<case "Motswana" "Singaporean" "Surinamese">>
-		<<set $activeSlave.foreskin = 15>>
-	<<case "Chinese" "French" "Indian" "Jamaican">>
-		<<set $activeSlave.foreskin = 14>>
-	<<case "Bulgarian" "Rwandan" "Zambian">>
-		<<set $activeSlave.foreskin = 13>>
-	<<case "French Guianan" "Guyanese" "Russian">>
-		<<set $activeSlave.foreskin = 12>>
-	<<case "German">>
-		<<set $activeSlave.foreskin = 11>>
-	<<case "Belarusian" "Georgian" "Papua New Guinean">>
-		<<set $activeSlave.foreskin = 10>>
-	<<case "Japanese" "Zimbabwean">>
-		<<set $activeSlave.foreskin = 9>>
-	<<case "Slovene" "Sri Lankan" "Swazi" "Taiwanese">>
-		<<set $activeSlave.foreskin = 8>>
-	<<case "Catalan" "Haitian" "Spanish">>
-		<<set $activeSlave.foreskin = 7>>
-	<<case "Austrian" "Dutch" "East Timorese" "Swiss" "Trinidadian">>
-		<<set $activeSlave.foreskin = 6>>
-	<<case "Danish" "Greek" "a Liechtensteiner" "Swedish">>
-		<<set $activeSlave.foreskin = 5>>
-	<<case "Burmese" "Cambodian" "Mongolian" "Nepalese" "Peruvian" "Serbian">>
-		<<set $activeSlave.foreskin = 4>>
-	<<case "Argentinian" "Italian" "Norwegian">>
-		<<set $activeSlave.foreskin = 3>>
-	<<case "Luxembourgian" "Tibetan" "Ukrainian" "Vincentian">>
-		<<set $activeSlave.foreskin = 2>>
-	<<case "Andorran" "Barbadian" "Bermudian" "Bhutanese" "Brazilian" "Croatian" "Finnish" "Hungarian" "Irish" "Moldovan" "Monégasque" "Panamanian" "Portuguese" "Seychellois" "Uruguayan">>
-			<<set $activeSlave.foreskin = 1>>
-	<<case "Antiguan" "Armenian" "Bahamian" "Belizean" "Bolivian" "Cape Verdean" "Chilean" "Colombian" "Costa Rican" "Cuban" "Czech" "Dominiquais" "Ecuadorian" "Estonian" "Greenlandic" "Grenadian" "Guatemalan" "Honduran" "I-Kiribati" "Icelandic" "Kittitian" "Laotian" "Latvian" "Lithuanian" "Maltese" "Marshallese" "Micronesian" "Nicaraguan" "Paraguayan" "Polish" "Romanian" "Saint Lucian" "Salvadoran" "Sammarinese" "São Toméan" "Slovak" "Vatican" "Venezuelan" "Vietnamese">>
-		<<set $activeSlave.foreskin = 0>>
-	<<default>>
-		/% Some overlooked country, or possibly stateless. Use global average. %/
-		<<set $activeSlave.foreskin = 38>>
-	<</switch>>
-	/% Second pass for minorities in other countries. %/
-	<<if ($activeSlave.race == "middle eastern") && ($activeSlave.foreskin < 76)>>
-		<<set $activeSlave.foreskin = 76>>
-	<</if>>
-	<<if ($activeSlave.race == "semitic") && ($activeSlave.foreskin < 90)>>
-		<<set $activeSlave.foreskin = 90>>
-	<</if>>
-	/% Chance activeSlave.foreskin back to the normal meaning. %/
-	<<if (random(0,99) < $activeSlave.foreskin)>>
-		<<set $activeSlave.foreskin = 0>>
-	<<else>>
-		<<set $activeSlave.foreskin = $activeSlave.dick + random(0,1)>>
-	<</if>>
-<</if>>
-/% End circumcision rate replacement section. %/
-<<if $activeSlave.balls == 0>>
-	<<if random(0,1) == 1 && $activeSlave.faceShape == "masculine">>
-		<<set $activeSlave.faceShape = either("androgynous", "cute")>>
-	<</if>>
-<<else>>
-	<<set $activeSlave.scrotum = $activeSlave.balls + either(0, 0, 1)>>
-<</if>>
-
-<<if $activeSlave.balls > 2>>
-	<<set $activeSlave.voice = 1>>
-<<elseif $activeSlave.balls > 0>>
-	<<set $activeSlave.voice = either(1, 1, 2)>>
-<<else>>
-	<<set $activeSlave.voice = either(1, 2, 2)>>
-<</if>>
-
-<<if $activeSlave.attrXY > 0>>
-	<<set $activeSlave.anus = either(0, 1, 2)>>
-<<else>>
-	<<set $activeSlave.anus = either(0, 0, 0, 1, 1, 2)>>
-<</if>>
-<<set $activeSlave.analArea = $activeSlave.anus + either(0, 0, 0, 1)>>
-
-<<if $activeSlave.anus == 0>>
-	<<set $activeSlave.analSkill = 0>>
-<<elseif random(1,4) == 1>>
-	<<set $activeSlave.anusTat = "bleached">>
-<</if>>
-
-/%pedoshit%/
-<<if $activeSlave.physicalAge <= 13>>
-	<<set $activeSlave.dick = either(1, 1, 1, 1, 2, 2, 2, 3)>>
-	<<set $activeSlave.balls = either(0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3)>>
-	<<set $activeSlave.scrotum = $activeSlave.balls>>
-	<<set $activeSlave.anus = either(0, 0, 0, 0, 0, 1)>>
-<<elseif $activeSlave.physicalAge <= 15>>
-	<<set $activeSlave.dick = either(1, 1, 1, 2, 2, 2, 3)>>
-	<<set $activeSlave.balls = either(0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4)>>
-	<<set $activeSlave.scrotum = $activeSlave.balls>>
-	<<set $activeSlave.anus = either(0, 0, 0, 0, 1, 1, 1)>>
-<<elseif $activeSlave.physicalAge <= 17>>
-	<<set $activeSlave.dick = either(1, 1, 2, 2, 3, 3)>>
-	<<set $activeSlave.balls = either(0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5)>>
-	<<set $activeSlave.scrotum = $activeSlave.balls>>
-	<<set $activeSlave.anus = either(0, 0, 0, 1, 1, 1)>>
-<</if>>
-
-<<if ($activeSlave.physicalAge <= 13)>>
-	<<set $activeSlave.butt = either(1, 1, 1, 2, 2, 3, 3, 4)>>
-<</if>>
-
-<<if ($activeSlave.physicalAge <= 11)>>
-	<<set $activeSlave.voice = either(2, 2, 2, 3, 3, 3, 3, 3, 3)>>
-<<elseif ($activeSlave.physicalAge <= 13)>>
-	<<set $activeSlave.voice = either(1, 1, 2, 2, 2, 2, 2, 3, 3)>>
-<<elseif ($activeSlave.physicalAge <= 16)>>
-	<<set $activeSlave.voice = either(1, 1, 1, 2, 2, 2, 2, 2, 3)>>
-<</if>>
-
-<<if $activeSlave.actualAge >= 18 && random(1,100) < 3>>
-	<<set $activeSlave.vasectomy = 1>>
-<</if>>
-
-<<if $activeSlave.physicalAge <= 6>>
-	<<set $activeSlave.pregAdaptation = 5>>
-<<elseif $activeSlave.physicalAge <= 7>>
-	<<set $activeSlave.pregAdaptation = 6>>
-<<elseif $activeSlave.physicalAge <= 8>>
-	<<set $activeSlave.pregAdaptation = 7>>
-<<elseif $activeSlave.physicalAge <= 9>>
-	<<set $activeSlave.pregAdaptation = 8>>
-<<elseif $activeSlave.physicalAge <= 10>>
-	<<set $activeSlave.pregAdaptation = 9>>
-<<elseif $activeSlave.physicalAge <= 11>>
-	<<set $activeSlave.pregAdaptation = 10>>
-<<elseif $activeSlave.physicalAge <= 12>>
-	<<set $activeSlave.pregAdaptation = 12>>
-<<elseif $activeSlave.physicalAge <= 13>>
-	<<set $activeSlave.pregAdaptation = 14>>
-<<elseif $activeSlave.physicalAge <= 14>>
-	<<set $activeSlave.pregAdaptation = 16>>
-<<elseif $activeSlave.physicalAge <= 15>>
-	<<set $activeSlave.pregAdaptation = 18>>
-<<else>>
-	<<set $activeSlave.pregAdaptation = 20>>
-<</if>>
-
-<<if $activeSlave.fuckdoll > 0>>
-	<<set $activeSlave.pronoun = "it", $activeSlave.possessivePronoun = "its", $activeSlave.possessive = "its", $activeSlave.object = "it", $activeSlave.objectReflexive = "itself", $activeSlave.noun = "toy">>
-<<elseif $activeSlave.dick > 0 && $activeSlave.vagina == -1 && $diversePronouns == 1>>
-	<<set $activeSlave.pronoun = "he", $activeSlave.possessivePronoun = "his", $activeSlave.possessive = "his", $activeSlave.object = "him", $activeSlave.objectReflexive = "himself", $activeSlave.noun = "boy">>
-<<else>>
-	<<set $activeSlave.pronoun = "she", $activeSlave.possessivePronoun = "hers", $activeSlave.possessive = "her", $activeSlave.object = "her", $activeSlave.objectReflexive = "herself", $activeSlave.noun = "girl">>
-<</if>>
-
-<<if passage() == "Slave Markets" && $slaveMarket == "corporate">>
-	<<if ($captureUpgradeRace != "unselected") && ($captureUpgradeRace != "none")>>
-	<<if $activeSlave.race != $captureUpgradeRace>>
-		<<set $activeSlave.race = $captureUpgradeRace>>
-	<</if>>
-	<</if>>
-<</if>>
-
-<<if $seeExtreme == 1>>
-	<<run disabilityRoll($activeSlave)>>
-<</if>>
+<<run GenerateNewSlave("XY")>>
diff --git a/src/utility/slaveCreationWidgets.tw b/src/utility/slaveCreationWidgets.tw
index b7a95914ff1a9e082c0417df074fe307b0fc24da..2efb15c8c95055745af4794d79f7105cad626f79 100644
--- a/src/utility/slaveCreationWidgets.tw
+++ b/src/utility/slaveCreationWidgets.tw
@@ -6,7 +6,7 @@
 	Called from Gen XX, Gen XY, CheatMode DB, InitNationalities.
 %/
 <<widget "BaseSlave">>
-	<<set $activeSlave = {slaveName: "blank", slaveSurname: 0, birthName: "blank", birthSurname: 0, genes: "XX", pronoun: "she", possessive: "her", possessivePronoun: "hers", objectReflexive: "herself", object: "her", noun: "girl", weekAcquired: 0, origin: 0, career: 0, ID: 0, prestige: 0, pornFeed: 0, pornFame: 0, pornFameSpending: 0, pornPrestige: 0, pornPrestigeDesc: 0, pornFameType: "none", pornFocus: "none", pornTypeGeneral: 0, pornTypeFuckdoll: 0, pornTypeRape: 0, pornTypePreggo: 0, pornTypeBBW: 0, pornTypeGainer: 0, pornTypeStud: 0, pornTypeLoli: 0, pornTypeDeepThroat: 0, pornTypeStruggleFuck: 0, pornTypePainal: 0, pornTypeTease: 0, pornTypeRomantic: 0, pornTypePervert: 0, pornTypeCaring: 0, pornTypeUnflinching: 0, pornTypeSizeQueen: 0, pornTypeNeglectful: 0, pornTypeCumAddict: 0, pornTypeAnalAddict: 0, pornTypeAttentionWhore: 0, pornTypeBreastGrowth: 0, pornTypeAbusive: 0, pornTypeMalicious: 0, pornTypeSelfHating: 0, pornTypeBreeder: 0, pornTypeSub: 0, pornTypeCumSlut: 0, pornTypeAnal: 0, pornTypeHumiliation: 0, pornTypeBoobs: 0, pornTypeDom: 0, pornTypeSadist: 0, pornTypeMasochist: 0, pornTypePregnancy: 0, prestigeDesc: 0, recruiter: 0, relation: 0, relationTarget: 0, relationship: 0, relationshipTarget: 0, rivalry: 0, rivalryTarget: 0, subTarget: 0, father: 0, mother: 0, daughters: 0, sisters: 0, canRecruit: 0, choosesOwnAssignment: 0, assignment: "rest", assignmentVisible: 1, sentence: 0, training: 0, toyHole: "all her holes", indenture: -1, indentureRestrictions: 0, birthWeek: random(0,51), actualAge: 18, visualAge: 18, physicalAge: 18, ovaryAge: 18, ageImplant: 0, health: 0, minorInjury: 0, trust: 0, oldTrust: 0, devotion: 0, oldDevotion: 0, weight: 0, muscles: 0, height: 170, heightImplant: 0, nationality: "slave", race: "white", origRace: "white", markings: "none", eyes: 1, eyeColor: "brown", origEye: "brown", pupil: "circular", sclerae: "white", eyewear: "none", hears: 0, earwear: "none", earImplant: 0, origHColor: "brown", hColor: "brown", pubicHColor: "brown", underArmHColor: "brown", eyebrowHColor: "brown", origSkin: "light", skin: "light", hLength: 60, eyebrowFullness: "natural", hStyle: "short", pubicHStyle: "neat", underArmHStyle: "neat", eyebrowHStyle: "natural", waist: 0, corsetPiercing: 0, PLimb: 0, amp: 0, heels:0, voice: 2, voiceImplant: 0, accent: 0, shoulders: 0, shouldersImplant: 0, boobs: 0, boobsImplant: 0, boobsImplantType: 0, boobShape: "normal", nipples: "cute", nipplesPiercing: 0, nipplesAccessory: 0, areolae: 0, areolaePiercing: 0, areolaeShape: "circle", boobsTat: 0, lactation: 0, lactationAdaptation: 0, milk: 0, cum: 0, hips: 0, hipsImplant: 0, butt: 0, buttImplant: 0, buttImplantType: 0, buttTat: 0, face: 0, faceImplant: 0, faceShape: "normal", lips: 15, lipsImplant: 0, lipsPiercing: 0, lipsTat: 0, teeth: "normal", tonguePiercing: 0, vagina: 0, vaginaLube: 0, vaginaPiercing: 0, vaginaTat: 0, preg: -1, pregSource: 0, pregType: 0, pregAdaptation: 50, superfetation: 0, ovaImplant: 0, broodmother: 0, broodmotherFetuses: 0, broodmotherOnHold: 0, broodmotherCountDown: 0, labor: 0, births: 0, cSec: 0, bellyAccessory: "none", labia: 0, clit: 0, clitPiercing: 0, clitSetting: "vanilla", foreskin: 0, anus: 0, dick: 0, analArea: 1, dickPiercing: 0, dickTat: 0, prostate: 0, balls: 0, scrotum: 0, ovaries: 0, anusPiercing: 0, anusTat: 0, makeup: 0, nails: 0, brand: 0, brandLocation: 0, earPiercing: 0, nosePiercing: 0, eyebrowPiercing: 0, navelPiercing: 0, shouldersTat: 0, armsTat: 0, legsTat: 0, backTat: 0, stampTat: 0, vaginalSkill: 0, oralSkill: 0, analSkill: 0, whoreSkill: 0, entertainSkill: 0, combatSkill: 0, livingRules: "spare", speechRules: "restrictive", releaseRules: "restrictive", relationshipRules: "restrictive", standardPunishment: "situational", standardReward: "situational", useRulesAssistant: 1, diet: "healthy", dietCum: 0, dietMilk: 0, tired: 0, hormones: 0, drugs: "no drugs", curatives: 0, chem: 0, aphrodisiacs: 0, addict: 0, fuckdoll: 0, choosesOwnClothes: 0, clothes: "no clothing", collar: "none", shoes: "none", vaginalAccessory: "none", dickAccessory: "none", legAccessory: "none", buttplug: "none", buttplugAttachment: "none", intelligence: 0, intelligenceImplant: 0, energy: 50, need: 0, attrXX: 0, attrXY: 0, attrKnown: 0, fetish: "none", fetishStrength: 70, fetishKnown: 0, behavioralFlaw: "none", behavioralQuirk: "none", sexualFlaw: "none", sexualQuirk: "none", oralCount: 0, vaginalCount: 0, analCount: 0, mammaryCount: 0, penetrativeCount: 0, publicCount: 0, pitKills: 0, customTat: "", customLabel: "", customDesc: "", customTitle: "", customTitleLisp: "", rudeTitle: 0, customImage: 0, currentRules: [], bellyTat: 0, induce: 0, mpreg: 0, inflation: 0, inflationType: "none", inflationMethod: 0, milkSource: 0, cumSource: 0, burst: 0, pregKnown: 0, pregWeek: 0, belly: 0, bellyPreg: 0, bellyFluid: 0, bellyImplant: -1, bellySag: 0, bellySagPreg: 0, bellyPain: 0, cervixImplant: 0, birthsTotal: 0, pubertyAgeXX: 13, pubertyAgeXY: 13, scars: 0, breedingMark: 0, bodySwap: 0, HGExclude: 0, ballType: "human", eggType: "human", reservedChildren: 0, reservedChildrenNursery: 0, choosesOwnChastity: 0, pregControl: "none", readyLimbs: [], ageAdjust: 0, bald: 0, origBodyOwner: "", origBodyOwnerID: 0, death: "", hormoneBalance: 0, onDiet: 0, breastMesh: 0, slavesFathered: 0, PCChildrenFathered: 0, slavesKnockedUp: 0, PCKnockedUp: 0, prematureBirth: 0, premature: 0, origSkin: "white", vasectomy: 0, haircuts: 0, newGamePlus: 0, skillHG: 0, skillRC: 0, skillBG: 0, skillMD: 0, skillDJ: 0, skillNU: 0, skillTE: 0, skillAT: 0, skillMT: 0, skillST: 0, skillMM: 0, skillWA: 0, skillS: 0, skillE: 0, skillW: 0, tankBaby: 0, inducedNCS: 0, NCSyouthening: 0, override_Race: 0, override_Skin: 0, override_Eye_Color: 0, override_H_Color: 0, override_Pubic_H_Color: 0, override_Arm_H_Color: 0, override_Brow_H_Color: 0, missingEyes: 0, missingArms: 0, missingLegs: 0}>>
+	<<run BaseSlave()>>
 <</widget>>
 
 /%