From a07b727e35eb9428448157d30a39560d54681cdf Mon Sep 17 00:00:00 2001
From: LollipopScythe <11764-LollipopScythe@users.noreply.gitgud.io>
Date: Wed, 15 Mar 2023 21:21:09 +0000
Subject: [PATCH] Enabled Pregnancy

---
 .../02-version/waiting-room.twee              |   4 +-
 .../03-compression/dictionaries.js            |   2 +-
 game/01-config/sugarcubeConfig.js             |   8 +-
 game/01-config/versionInfo.twee               |   4 +-
 .../04-Pregnancy/parentFunctions.js           | 154 +++++++++++
 game/03-JavaScript/04-Pregnancy/pregnancy.js  | 126 +++++----
 .../04-Pregnancy/pregnancyTypes.js            |  97 +++++--
 .../04-Pregnancy/storyFunctions.js            |  97 ++++---
 game/03-JavaScript/debugMenu.js               |  18 +-
 game/03-JavaScript/save.js                    |  26 +-
 game/04-Variables/feats.js                    |   2 +-
 game/04-Variables/pregnancyVar.twee           |   9 +
 .../04-Variables/variables-passageFooter.twee |   2 +-
 game/04-Variables/variables-start.twee        |   6 +-
 game/04-Variables/variables-static.twee       |  10 +-
 .../04-Variables/variables-versionUpdate.twee |  17 +-
 game/base-clothing/widgets.twee               |   3 +-
 game/base-combat/actions-anus.twee            |   3 +-
 game/base-combat/actions-penis.twee           |   3 +-
 game/base-combat/actions-speech.twee          |   3 +-
 game/base-combat/actions-vagina.twee          |   3 +-
 game/base-combat/beast-generation.twee        |   4 +
 game/base-combat/init.twee                    |   3 +-
 game/base-combat/npc-generation.twee          |   7 +-
 game/base-debug/clothesTesting.twee           |  16 +-
 game/base-system/attitudes.twee               |   2 +-
 game/base-system/feats.twee                   |   3 +-
 game/base-system/mirror.twee                  |  17 +-
 game/base-system/named-npcs.twee              |   3 +-
 game/base-system/orgasm.twee                  |  34 ++-
 .../base-system/overlays/characteristics.twee |   6 +-
 game/base-system/overlays/cheats.twee         |  71 +++--
 game/base-system/overlays/featsUI.twee        |   3 +-
 game/base-system/overlays/social.twee         |   5 +-
 game/base-system/overlays/statistics.twee     | 235 +++++++++--------
 game/base-system/persistent-npcs.twee         |   3 +-
 game/base-system/physicalAdjustments.twee     |   3 +
 game/base-system/pregnancy/children.twee      |  23 +-
 .../base-system/pregnancy/childrenEvents.twee |   5 +-
 game/base-system/pregnancy/events.twee        |  25 +-
 game/base-system/pregnancy/pregnancy.twee     | 245 +++++++++---------
 game/base-system/settings.twee                |  14 +-
 game/base-system/text.twee                    |   2 +
 game/base-system/time.twee                    |  28 +-
 game/overworld-forest/loc-asylum/widgets.twee |   3 +-
 game/overworld-forest/loc-cabin/main.twee     |   6 +-
 .../loc-churchyard/widgets.twee               |   2 +-
 game/overworld-forest/loc-forest/widgets.twee |   3 +-
 game/overworld-forest/loc-lake/widgets.twee   |   3 +-
 .../loc-tentacle-world/main.twee              |   3 +-
 .../loc-wolfpack/pregnancyEvents.twee         |  28 +-
 game/overworld-plains/loc-farm/widgets.twee   |   3 +-
 .../loc-livestock/widgets.twee                |   3 +-
 game/overworld-plains/loc-moor/abduction.twee |   6 +-
 game/overworld-plains/loc-moor/widgets.twee   |   3 +-
 .../overworld-town/loc-adultshop/widgets.twee |   3 +-
 game/overworld-town/loc-alley/widgets.twee    |   3 +-
 game/overworld-town/loc-arcade/widgets.twee   |   3 +-
 game/overworld-town/loc-beach/events.twee     |   3 +-
 game/overworld-town/loc-beach/widgets.twee    |   3 +-
 game/overworld-town/loc-bus/main.twee         |   2 +-
 game/overworld-town/loc-bus/widgets.twee      |   3 +-
 .../overworld-town/loc-docks/skulduggery.twee |   3 +-
 game/overworld-town/loc-docks/widgets.twee    |   3 +-
 game/overworld-town/loc-home/main.twee        |   3 +-
 game/overworld-town/loc-hospital/main.twee    |  12 +-
 .../overworld-town/loc-hospital/pharmacy.twee |  27 +-
 game/overworld-town/loc-landfill/widgets.twee |   3 +-
 game/overworld-town/loc-office/main.twee      |   6 +-
 game/overworld-town/loc-office/stairs.twee    |   6 +-
 game/overworld-town/loc-office/streak.twee    |   6 +-
 game/overworld-town/loc-park/widgets.twee     |   3 +-
 game/overworld-town/loc-prison/widgets.twee   |   3 +-
 game/overworld-town/loc-pub/fame.twee         |   3 +-
 game/overworld-town/loc-pub/main.twee         |   2 +-
 game/overworld-town/loc-pub/seduction.twee    |   2 +-
 game/overworld-town/loc-school/library.twee   |   6 +-
 game/overworld-town/loc-school/main.twee      |   3 +-
 game/overworld-town/loc-sea/widgets.twee      |   3 +-
 game/overworld-town/loc-shop/main.twee        |   3 +-
 game/overworld-town/loc-street/events.twee    |   3 +-
 game/overworld-town/loc-street/widgets.twee   |   9 +-
 game/overworld-town/loc-temple/widgets.twee   |   3 +-
 game/overworld-town/special-kylar/main.twee   |   1 -
 .../special-nightmares/widgets.twee           |   4 +-
 .../special-whitney/street.twee               |   8 +-
 .../loc-cave/widgets.twee                     |   3 +-
 .../loc-sewers/main.twee                      |   6 +-
 .../loc-sewers/widgets.twee                   |   3 +-
 89 files changed, 882 insertions(+), 692 deletions(-)
 create mode 100644 game/03-JavaScript/04-Pregnancy/parentFunctions.js

diff --git a/game/00-framework-tools/02-version/waiting-room.twee b/game/00-framework-tools/02-version/waiting-room.twee
index 094769cb75..719988c5d1 100644
--- a/game/00-framework-tools/02-version/waiting-room.twee
+++ b/game/00-framework-tools/02-version/waiting-room.twee
@@ -1,6 +1,6 @@
 :: Upgrade Waiting Room
 
-Welcome to Degrees of Lewdity <<print StartConfig.version>>. We're making a few changes to your game so it supports this latest version.
+Welcome to Degrees of Lewdity <<print StartConfig.version>><<if StartConfig.versionName>> <<print StartConfig.versionName>><</if>>. We're making a few changes to your game so it supports this latest version.
 
 Remember to update your save if things appear to be working.
 
@@ -18,7 +18,7 @@ Looks like we're done already.
 
 :: Downgrade Waiting Room
 
-Welcome back to Degrees of Lewdity <<- StartConfig.version>>.
+Welcome back to Degrees of Lewdity <<- StartConfig.version>><<if StartConfig.versionName>> <<print StartConfig.versionName>><</if>>.
 <br><br>
 You have switched to an older version of the game, from <<- $saveVersions.last()>>, so we just want to confirm you know what you're doing.
 <br><br>
diff --git a/game/00-framework-tools/03-compression/dictionaries.js b/game/00-framework-tools/03-compression/dictionaries.js
index eb25750b56..a8e3dbf2ea 100644
--- a/game/00-framework-tools/03-compression/dictionaries.js
+++ b/game/00-framework-tools/03-compression/dictionaries.js
@@ -236,7 +236,7 @@ const DoLCompressorDictionaries = (() => {
 		"baseDaysRng",
 		"baseNPC",
 		"baseNpcPregnancyChance",
-		"baseVaginalPregnancyChance",
+		"basePlayerPregnancyChance",
 		"beastMotherStatus",
 		"beastTypes",
 		"beastgenderoverride",
diff --git a/game/01-config/sugarcubeConfig.js b/game/01-config/sugarcubeConfig.js
index 51226f03b3..da8c5cd3c5 100644
--- a/game/01-config/sugarcubeConfig.js
+++ b/game/01-config/sugarcubeConfig.js
@@ -40,11 +40,13 @@ Save.onSave.add(save => {
 /* LinkNumberify and images will enable or disable the feature completely */
 /* debug will enable or disable the feature only for new games */
 /* sneaky will enable the Sneaky notice banner on the opening screen and save display */
+/* versionName will be displayed in the top right of the screen, leave as "" to not display anything */
 window.StartConfig = {
 	debug: false,
 	enableImages: true,
 	enableLinkNumberify: true,
-	version: "0.3.13.5",
+	version: "0.3.14.0",
+	versionName: "Pregnancy Test",
 	sneaky: false,
 };
 
@@ -125,11 +127,11 @@ function defaultSaveDetails(input) {
 		saveDetails.playTime = 0;
 		saveDetails.loadCount = 0;
 	}
-	if (saveDetails.f !== 1) {
+	if (!saveDetails.f || saveDetails.f < 1) {
 		saveDetails.f = 1;
 		saveDetails.playTime = 0;
 	}
-	if (saveDetails.f !== 3) {
+	if (saveDetails.f < 3) {
 		saveDetails.playTime = 0;
 		saveDetails.f = 3;
 	}
diff --git a/game/01-config/versionInfo.twee b/game/01-config/versionInfo.twee
index df570ceb81..371f30aeab 100644
--- a/game/01-config/versionInfo.twee
+++ b/game/01-config/versionInfo.twee
@@ -3,7 +3,9 @@
 	<br><br>
 
 	Degrees of Lewdity <<print StartConfig.version>>
-	<br><<if StartConfig.sneaky>>SNEAKY BUILD<</if>><br>
+	<<if StartConfig.versionName>><br><<print StartConfig.versionName>><</if>>
+	<<if StartConfig.sneaky>><br>SNEAKY BUILD<</if>>
+	<br><br>
 
 	"It's Planned" edition
 	<br><br>
diff --git a/game/03-JavaScript/04-Pregnancy/parentFunctions.js b/game/03-JavaScript/04-Pregnancy/parentFunctions.js
new file mode 100644
index 0000000000..b43f9657bf
--- /dev/null
+++ b/game/03-JavaScript/04-Pregnancy/parentFunctions.js
@@ -0,0 +1,154 @@
+/* eslint-disable jsdoc/require-returns-type */
+/* eslint-disable no-undef */
+// Format for storing the parents of a child.
+const parentList = {
+	mothers: [{ name: "pc", compressed: "none", births: 0, kids: 0, id: 0 }],
+	fathers: [{ name: "pc", compressed: "none", kids: 0, id: 0 }],
+};
+
+// basic constructor for the parent list.
+const parent = ({ name = null, compressed = null, kids = 0, id = null, births = undefined }) => {
+	return {
+		name,
+		compressed,
+		kids,
+		id,
+		births,
+	};
+};
+
+/**
+ * @description Finds the highest id within the passed parent type (mother or father).
+ * @param {number} parentType The part of the parent list that is being looked in. Use 0 for mothers  or 1 for fathers.
+ * @returns {number} The highest id value in the passed list type.
+ */
+function findMaxParentId(parentType = 0) {
+	let newId = -1;
+	const parent = parentType === 0 ? "mothers" : "fathers";
+	const pListLen = V.parentList[parent].length;
+
+	for (let i = 0; i < pListLen; i++) {
+		if (V.parentList[parent][i].id > newId) newId = V.parentList[parent][i].id;
+	}
+
+	return newId;
+}
+
+/**
+ * @description Looks for the passed parent's id in the passed list type.
+ * @param {number} parentId The id of the parent.
+ * @param {number} parentType The part of the parent list that is being looked in. Use 0 for mothers  or 1 for fathers. Defaults to mothers if no value is entered.
+ * @param {boolean} byName If true, then this function will return an array containing all mothers or fathers that have the passed name.
+ * @returns All of the information about the requested parent. Returns -1 if there was nothing to be found.
+ */
+function findParent(parentId, parentType = 0, byName = false) {
+	const parent = parentType === 0 ? "mothers" : "fathers";
+	const pListLen = V.parentList[parent].length;
+
+	if (byName) {
+		if (!isNaN(parentId)) return -1;
+		const list = [];
+
+		for (let i = 0; i < pListLen; i++) {
+			if (V.parentList[parent][i].name === parentId) {
+				list.push(V.parentList[parent][i]);
+			}
+		}
+
+		if (list.length > 0) return list;
+	} else {
+		if (isNaN(parentId) || parentId < 0) return -1;
+		for (let i = 0; i < pListLen; i++) {
+			if (V.parentList[parent][i].id === parentId) {
+				return V.parentList[parent][i];
+			}
+		}
+	}
+
+	return -1;
+}
+
+/**
+ * @description Finds the number of kids a passed parent has.
+ * @param {number} parentId The id of the parent.
+ * @param {number} parentType The part of the parent list that is being looked in. Use 0 for mothers  or 1 for fathers. Defaults to mothers if no value is entered.
+ * @param {boolean} byName If true, searches the parent list type using the name instead of the id. This will then return the first match.
+ * @returns Returns the number of kids the passed parent has.
+ */
+function totalKids(parentId, parentType = 0, byName = false) {
+	const parent = parentType === 0 ? "mothers" : "fathers";
+	const pListLen = V.parentList[parent].length;
+
+	if (!byName) {
+		if (parentId < 0) return -1;
+
+		for (let i = 0; i < pListLen; i++) {
+			if (V.parentList[parent][i].id === parentId) {
+				return V.parentList[parent][i].kids;
+			}
+		}
+	} else {
+		for (let i = 0; i < pListLen; i++) {
+			if (V.parentList[parent][i].name === parentId) {
+				return V.parentList[parent][i].kids;
+			}
+		}
+	}
+
+	return -1;
+}
+
+/**
+ * @description Adds a new parent to the parent list on the passed side.
+ * @param {string} name The name of the passed NPC.
+ * @param {object} npcObject The object containing the NPC's information.
+ * @param {number} parentType The part of the parent list that is being looked in. Use 0 for mothers  or 1 for fathers. Defaults to mothers if no value is entered.
+ * @param {number} passedID The id number of the NPC is they already have one. If the id is a duplicate, it will assign a new id.
+ */
+function addToParentList(name, npcObject, parentType = 0, passedID = null) {
+	let compressed = "none";
+	const births = parentType === 0 ? 0 : undefined;
+	const parent = parentType === 0 ? "mothers" : "fathers";
+	if (npcObject) compressed = npcCompressor(npcObject);
+	const idNum = passedID && findParent(passedID) === -1 ? passedID : findMaxParentId(parentType) + 1;
+
+	V.parentList[parent].push({ name, compressed, kids: 0, id: idNum, births });
+	return V.parentList[parent].last();
+}
+
+/**
+ * @description Increases the kid count of the passed parent.
+ * @param {number} parentId The id of the parent.
+ * @param {number} parentType The part of the parent list that is being looked in. Use 0 for mothers  or 1 for fathers. Defaults to mothers if no value is entered.
+ * @param {number} otherParentId The id of the other parent of the child. If passed a number, it will look in the other list for this parent and increase it's kid count as well.
+ */
+function increaseKids(parentId, parentType = 0, otherParentId = null) {
+	parentType = parentType === 0 ? "mothers" : "fathers";
+	if (V.parentList[parentType][parentId]) V.parentList[parentType][parentId].kids++;
+
+	if (otherParentId || otherParentId === 0) {
+		parentType = parentType === "fathers" ? "mothers" : "fathers";
+		if (V.parentList[parentType][otherParentId]) V.parentList[parentType][otherParentId].kids++;
+	}
+}
+
+/**
+ * @description Increases the kid count of the passed parent.
+ * @param {number} parentId The id of the parent.
+ * @param {number} parentType The part of the parent list that is being looked in. Use 0 for mothers  or 1 for fathers. Defaults to mothers if no value is entered.
+ */
+function increaseBirths(parentId, parentType = 0) {
+	parentType = parentType === 0 ? "mothers" : "fathers";
+	if (parentType === "mothers" && V.parentList[parentType][parentId]) V.parentList[parentType][parentId].births++;
+}
+
+window.parentFunction = {
+	parentList,
+	parent,
+	findMaxParentId,
+	findParent,
+	totalKids,
+	addToParentList,
+	increaseKids,
+	increaseBirths,
+};
diff --git a/game/03-JavaScript/04-Pregnancy/pregnancy.js b/game/03-JavaScript/04-Pregnancy/pregnancy.js
index 2916059557..1542a92359 100644
--- a/game/03-JavaScript/04-Pregnancy/pregnancy.js
+++ b/game/03-JavaScript/04-Pregnancy/pregnancy.js
@@ -75,7 +75,7 @@ window.spermObjectToArray = spermObjectToArray;
 /* V.pregnancytype === "fetish" uses this function */
 function fetishPregnancy({ genital = "vagina", target = null, spermOwner = null, spermType = null, rngModifier = 100, quantity = 1, forcePregnancy = false }) {
 	if (!["vagina", "anus"].includes(genital) || !target || !spermOwner || !spermType) return false;
-	const motherObject = npcPregObject(target);
+	const motherObject = npcPregObject(target, true);
 	const [pregnancy, fertility, magicTattoo] = pregPrep({ motherObject, genital });
 
 	// Check the cycle settings
@@ -101,7 +101,7 @@ function fetishPregnancy({ genital = "vagina", target = null, spermOwner = null,
 	}
 
 	if (pregnancy && pregnancy.type === null) {
-		const chance = 100 / (target === "pc" ? 100 - V.baseVaginalPregnancyChance : 20 - V.baseNpcPregnancyChance);
+		const chance = 100 / (target === "pc" ? 100 - V.basePlayerPregnancyChance : 20 - V.baseNpcPregnancyChance);
 
 		if (!forcePregnancy && chance * quantity * (rngModifier / 100) * (1 + fertility + magicTattoo) * multi < random(1, 100) - 15) return false;
 
@@ -119,12 +119,11 @@ function fetishPregnancy({ genital = "vagina", target = null, spermOwner = null,
 }
 
 /* Player pregnancy starts here */
-/* ToDo: Pregnancy - remove the ` || !V.pregnancyTesting` part of the check */
 /* V.pregnancytype === "realistic" uses this function */
 function playerPregnancyAttempt(baseMulti = 1, genital = "vagina") {
 	const pregnancy = V.sexStats[genital].pregnancy;
 
-	if (pregnancy.fetus.length || isNaN(baseMulti) || baseMulti < 1 || !V.pregnancyTesting || V.pregnancytype !== "realistic") return false;
+	if (pregnancy.fetus.length || isNaN(baseMulti) || baseMulti < 1 || V.pregnancytype !== "realistic") return false;
 
 	const [trackedNPCs, spermArray] = spermObjectToArray(V.sexStats[genital].sperm, true);
 
@@ -140,7 +139,7 @@ function playerPregnancyAttempt(baseMulti = 1, genital = "vagina") {
 	if (V.skin.pubic.pen === "magic" && V.skin.pubic.special === "pregnancy") {
 		fertilityBoost -= 0.4;
 	}
-	const baseChance = Math.floor((100 - V.baseVaginalPregnancyChance) * Math.clamp(fertilityBoost, 0.1, 1) * baseMulti);
+	const baseChance = Math.floor((100 - V.basePlayerPregnancyChance) * Math.clamp(fertilityBoost, 0.1, 1) * baseMulti);
 	const rng = random(0, spermArray.length - 1 > baseChance ? spermArray.length - 1 : baseChance);
 
 	if (spermArray[rng]) {
@@ -372,22 +371,7 @@ function npcPregnancyCycle() {
 							location = "wolf_cave";
 							break;
 					}
-					if (!birthLocation || !location) {
-						switch (pregnancy.type) {
-							case "human":
-								if (!birthLocation) birthLocation = "hospital";
-								if (!location) location = "home";
-								break;
-							case "wolf":
-								if (!birthLocation) birthLocation = "wolf_cave";
-								if (!location) location = "wolf_cave";
-								break;
-							default: /* Considered an invalid location when the above is not updated */
-								if (!birthLocation) birthLocation = "unknown";
-								if (!location) location = "unknown";
-								break;
-						}
-					}
+					[birthLocation, location] = defaultBirthLocations(pregnancy.type, birthLocation, location);
 					endNPCPregnancy(npcName, birthLocation, location);
 				} else {
 					/* Can deal with the npc in the next event */
@@ -547,7 +531,54 @@ window.endNpcPregnancyTest = (npcName, birthLocation, location) => {
 }; // V.pregnancyTesting Check should not be removed, debugging purposes only
 /* Named NPC pregnancy ends here */
 
-function giveBirthToChildren(mother, birthLocation, location) {
+function randomPregnancyProgress() {
+	if (!V || !V.storedNPCs) return false;
+	const toDelete = [];
+	Object.keys(V.storedNPCs).forEach(npcKey => {
+		const npc = V.storedNPCs[npcKey];
+		if (npc.pregnancy) {
+			let multiplier = 1;
+			switch (npc.pregnancy.type) {
+				case "human":
+					multiplier = 1 / ((1 / 9) * V.humanPregnancyMonths);
+					break;
+				case "wolf":
+					multiplier = 1 / ((1 / 12) * V.wolfPregnancyWeeks);
+					break;
+			}
+			npc.pregnancy.timer += parseFloat(multiplier.toFixed(3));
+			if (npc.pregnancy.timer >= npc.pregnancy.timerEnd) {
+				const npcDecompressed = npcDecompressor(npc.npc);
+				const [birthLocation, location] = defaultBirthLocations(npc.pregnancy.type);
+				giveBirthToChildren(npcDecompressed.fullDescription, birthLocation, location, npc.pregnancy);
+				toDelete.push(npcKey);
+			}
+		}
+	});
+	toDelete.forEach(npcKey => delete V.storedNPCs[npcKey]);
+	return true;
+}
+DefineMacro("randomPregnancyProgress", randomPregnancyProgress);
+
+function defaultBirthLocations(type, birthLocation, location) {
+	switch (type) {
+		case "human":
+			if (!birthLocation) birthLocation = "hospital";
+			if (!location) location = "home";
+			break;
+		case "wolf":
+			if (!birthLocation) birthLocation = "wolf_cave";
+			if (!location) location = "wolf_cave";
+			break;
+		default: /* Considered an invalid location when the above is not updated */
+			if (!birthLocation) birthLocation = "unknown";
+			if (!location) location = "unknown";
+			break;
+	}
+	return [birthLocation, location];
+}
+
+function giveBirthToChildren(mother, birthLocation, location, pregnancyOverride) {
 	let pregnancy;
 	if (mother === "pc") {
 		if (V.player.vaginaExist) {
@@ -557,53 +588,46 @@ function giveBirthToChildren(mother, birthLocation, location) {
 		}
 	} else if (C.npc[mother]) {
 		pregnancy = C.npc[mother].pregnancy;
+	} else {
+		pregnancy = pregnancyOverride;
 	}
 	if (!pregnancy || !pregnancy.fetus.length) return false;
-
-	const birthId = (mother + totalBirthEvents(mother)).replace(" ", "");
+	if (mother) {
+		let parentId = parentFunction.findParent(mother, 0, true);
+		if (parentId) {
+			if (Array.isArray(parentId)) parentId = parentId[0];
+			parentFunction.increaseBirths(parentId.id, 0);
+		}
+	}
 
 	pregnancy.fetus.forEach(childObject => {
 		pregnancy.givenBirth++;
-		const childId = (mother + totalBorn(mother)).replace(" ", "");
-		V.children[childId] = {
+		V.children[childObject.childId] = {
 			...childObject,
 			name: generateBabyName(childObject.name, childObject.gender, childObject.childId),
 			born: { day: clone(V.monthday), month: clone(V.month.toUpperFirst()), year: clone(V.year) },
-			childId,
 			location,
 			birthLocation,
 		};
-		if (!V.children[childId].birthId) V.children[childId].birthId = birthId;
 		if (childObject.mother === "pc") {
 			V.pregnancyStats.playerChildren++;
-			switch (childObject.type) {
-				case "human":
-					V.pregnancyStats.humanChildren++;
-					break;
-				case "wolf":
-					V.pregnancyStats.wolfChildren++;
-					break;
-			}
 		} else if (childObject.father === "pc") {
 			V.pregnancyStats.npcChildren++;
 		} else {
 			V.pregnancyStats.npcChildrenUnrelatedToPlayer++;
 		}
+		switch (childObject.type) {
+			case "human":
+				V.pregnancyStats.humanChildren++;
+				break;
+			case "wolf":
+				V.pregnancyStats.wolfChildren++;
+				break;
+		}
 	});
 	return true;
 }
 
-function totalBirthEvents(mother) {
-	if (mother === "pc") return V.sexStats.vagina.pregnancy.totalBirthEvents + V.sexStats.anus.pregnancy.totalBirthEvents;
-	if (C.npc[mother] && C.npc[mother].pregnancy) return C.npc[mother].pregnancy.totalBirthEvents || 0;
-}
-
-function totalBorn(mother) {
-	if (mother === "pc") return V.sexStats.vagina.pregnancy.givenBirth + V.sexStats.anus.pregnancy.givenBirth || 0;
-	if (C.npc[mother] && C.npc[mother].pregnancy) return C.npc[mother].pregnancy.givenBirth || 0;
-	return 0;
-}
-
 function recordSperm({
 	genital = "vagina",
 	target = null,
@@ -614,8 +638,7 @@ function recordSperm({
 	rngType,
 	quantity = 1,
 }) {
-	// ToDo: Pregnancy - remove the `V.pregnancyTesting` check
-	if (!V.pregnancyTesting) return null;
+	if (V.activeNightmare) return false; // Should not work if the player is in a nightmare
 	if (V.playerPregnancyHumanDisable === "t" && spermType === "human" && target === "pc") return false; // Human player pregnancy disabled
 	if (V.playerPregnancyBeastDisable === "t" && spermType !== "human" && target === "pc") return false; // Beast player pregnancy disabled
 	if (V.npcPregnancyDisable === "t" && target !== "pc") return false; // Npc pregnancy disabled
@@ -734,9 +757,6 @@ DefineMacro("recordAnusSperm", (target, spermOwner, spermType, daysTillRemovalOv
 
 // Period is `1 divided how many timers per day the function is run`
 function updateRecordedSperm(genital, target, period = 1) {
-	// ToDo: Pregnancy - remove the `V.pregnancyTesting` check
-	if (!V.pregnancyTesting) return null;
-
 	let sperm;
 	if (genital !== "vagina" && target !== "pc") return null;
 	if (target === "pc") {
@@ -826,7 +846,7 @@ function playerPregnancyPossibleWith(NPC) {
 			return false; // Check if the npc is valid
 		}
 	}
-	if (V.sexStats.vagina.pregnancy.fetus.length) {
+	if (getPregnancyObject().fetus.length) {
 		T.pregFalseReason = "playerPregnant";
 		return false; // Check if player is already pregnant
 	}
diff --git a/game/03-JavaScript/04-Pregnancy/pregnancyTypes.js b/game/03-JavaScript/04-Pregnancy/pregnancyTypes.js
index 263170d58a..7ecd6b4a59 100644
--- a/game/03-JavaScript/04-Pregnancy/pregnancyTypes.js
+++ b/game/03-JavaScript/04-Pregnancy/pregnancyTypes.js
@@ -27,20 +27,29 @@ function canBeMPregnant() {
 }
 window.canBeMPregnant = canBeMPregnant;
 
-function npcPregObject(person) {
+function npcPregObject(person, mother) {
 	let result = "Invalid input";
+	const parentType = mother ? 0 : 1;
 
 	if (typeof person === "string" || person instanceof String) {
+		let parentId = parentFunction.findParent(person, parentType, true);
+		if (parentId === -1) {
+			parentId = addToParentList(person, undefined, parentType);
+		}
 		if (person === "pc") {
 			// pregnancy isnt required for the player
 			result = {
 				name: "pc",
 				gender: V.player.gender,
+				type: "human",
+				parentId: Array.isArray(parentId) ? parentId[0] : parentId,
 			};
 		} else if (C.npc[person]) {
 			result = {
 				name: C.npc[person].nam,
-				pregnancy: clone(C.npc[person].pregnancy),
+				pregnancy: C.npc[person].pregnancy,
+				type: C.npc[person].type,
+				parentId: Array.isArray(parentId) ? parentId[0] : parentId,
 			};
 			if (C.npc[person].vagina !== "none" && C.npc[person].penis !== "none") {
 				result.gender = "h";
@@ -56,13 +65,21 @@ function npcPregObject(person) {
 			// No NPC found, likely found from sperm name string
 			return {
 				name: person,
+				type: "unknown",
+				parentId: Array.isArray(parentId) ? parentId[0] : parentId,
 			};
 		}
 	} else {
 		if (person.fullDescription) {
+			let parentId = parentFunction.findParent(person.fullDescription, parentType, true);
+			if (parentId === -1) {
+				parentId = addToParentList(person.fullDescription, C.npc[person.fullDescription] ? undefined : person, parentType);
+			}
 			result = {
 				name: person.fullDescription,
-				pregnancy: clone(person.fullDescription.pregnancy),
+				pregnancy: person.pregnancy,
+				type: person.type,
+				parentId: Array.isArray(parentId) ? parentId[0] : parentId,
 			};
 			if (person.vagina !== undefined && person.vagina !== "none" && person.penis !== undefined && person.penis !== "none") {
 				result.gender = "h";
@@ -80,7 +97,7 @@ function npcPregObject(person) {
 }
 
 // When adding new types, be sure to adjust related checks in other pregnancy code that check for "human","wolf","wolfboy","wolfgirl" etc
-function pregPrep({ motherObject, parasiteType = null, genital = null }) {
+function pregPrep({ motherObject, fatherObject, parasiteType = null, genital = null }) {
 	let pregnancy;
 	let fertility = 0;
 	let magicTattoo = 0;
@@ -110,21 +127,46 @@ function pregPrep({ motherObject, parasiteType = null, genital = null }) {
 		if (parasiteType && pregnancy.fetus.length >= maxParasites(genital)) return ["Player does not have room for more parasites"];
 
 		if (V.sexStats.pills.lastTaken.pregnancy === "fertility booster") {
-			fertility = V.sexStats.pills.pills["fertility booster"].doseTaken;
+			fertility += V.sexStats.pills.pills["fertility booster"].doseTaken;
 		}
 	} else if (!parasiteType) {
-		// Male NPC pregnancies unsupported right now
-		if (motherObject.gender === "m") return ["MPreg not supported for male NPCs"];
+		if (V.npcPregnancyDisable === "t") return ["NPC pregnancy disabled"];
 
-		pregnancy = motherObject.pregnancy;
+		// Male or Unknown NPC pregnancies unsupported right now
+		if (!motherObject.gender || motherObject.gender === "m") return ["Pregnancy not supported for NPC input"];
 
-		if (!pregnancy || !pregnancy.enabled) {
-			return ["Pregnancy not supported or disabled by the player"];
+		if (C.npc[motherObject.name]) {
+			pregnancy = motherObject.pregnancy;
+
+			if (!pregnancy || !pregnancy.enabled) {
+				return ["Pregnancy not supported or disabled by the player"];
+			}
+			if (pregnancy.pills === "fertility") {
+				fertility += 1;
+			}
+		} else {
+			// ToDo: Random npc pregnancy
+			pregnancy = {
+				type: motherObject.pregnancy === 0 ? null : motherObject.type,
+			};
 		}
-		if (pregnancy.pills === "fertility") {
-			fertility = 1;
+	}
+
+	if (fatherObject) {
+		if (fatherObject.name === "pc") {
+			if (V.skin.pubic.pen === "magic" && V.skin.pubic.special === "pregnancy") {
+				magicTattoo = 1;
+			}
+			if (V.sexStats.pills.lastTaken.pregnancy === "fertility booster") {
+				fertility += V.sexStats.pills.pills["fertility booster"].doseTaken;
+			}
+		} else if (C.npc[fatherObject.name]) {
+			if (fatherObject.pregnancy.pills === "fertility") {
+				fertility += 1;
+			}
 		}
 	}
+
 	return [pregnancy, fertility, magicTattoo];
 }
 
@@ -196,6 +238,8 @@ function hairColourCalc(name) {
 function skinColourCalc(name) {
 	if (name === "pc") {
 		return V.skinColor.natural;
+	} else if (name === "Ivory Wraith") {
+		return "ghostlyPale";
 	} else if (C.npc[name] && C.npc[name].skinColour) {
 		return C.npc[name].skinColour;
 	} else {
@@ -233,6 +277,7 @@ const babyBase = ({
 	father = null,
 	fatherKnown = false,
 	birthId = null,
+	childId = null,
 	type = null,
 	gender = "f",
 	identical = null,
@@ -268,8 +313,8 @@ const babyBase = ({
 		},
 		name: null,
 		// eslint-disable-next-line no-unneeded-ternary
-		birthId: !birthId && mother && totalBirthEvents(mother) !== undefined ? (mother + totalBirthEvents(mother)).replace(" ", "") : birthId,
-		childId: null,
+		birthId,
+		childId,
 		location: null,
 		birthLocation: null,
 		localVariables: {},
@@ -281,8 +326,7 @@ window.pregnancyGenerator = {
 		// Hard coded limit
 		const limit = Object.values(V.children).length;
 		if (limit >= 1000) return false;
-
-		const motherObject = npcPregObject(mother);
+		const motherObject = npcPregObject(mother, true);
 		const fatherObject = npcPregObject(father);
 		if (typeof motherObject === "string" || motherObject instanceof String) return motherObject;
 		if (typeof fatherObject === "string" || fatherObject instanceof String) return fatherObject;
@@ -305,7 +349,7 @@ window.pregnancyGenerator = {
 			return false;
 		}
 
-		const [pregnancy, fertility, magicTattoo] = pregPrep({ motherObject, genital });
+		const [pregnancy, fertility, magicTattoo] = pregPrep({ motherObject, fatherObject, genital });
 		if (typeof pregnancy === "string" || pregnancy instanceof String) {
 			return pregnancy;
 		} else if (pregnancy) {
@@ -324,10 +368,15 @@ window.pregnancyGenerator = {
 					result.fetus.push(result.fetus[0]);
 					continue;
 				}
+				const childId =
+					"m" + motherObject.parentId.id + "b" + motherObject.parentId.kids + "d" + fatherObject.parentId.id + "f" + fatherObject.parentId.kids;
+				const birthId = motherObject.parentId.births;
 				let gender = random(0, 100) > 50 ? "f" : "m";
 				if ((motherObject.gender === "h" || fatherObject.gender === "h") && (motherObject.name === fatherObject.name || random(0, 100) >= 75))
 					gender = "h";
 				const baby = babyBase({
+					childId,
+					birthId,
 					mother: motherObject.name,
 					father: fatherObject.name,
 					fatherKnown,
@@ -344,6 +393,8 @@ window.pregnancyGenerator = {
 				});
 				result.fetus.push(baby);
 
+				parentFunction.increaseKids(motherObject.parentId.id, 0, fatherObject.parentId.id);
+
 				// Hard coded limit
 				if (limit + result.fetus.length >= 1000) break;
 			}
@@ -358,7 +409,7 @@ window.pregnancyGenerator = {
 		const limit = Object.values(V.children).length;
 		if (limit >= 1000) return false;
 
-		const motherObject = npcPregObject(mother);
+		const motherObject = npcPregObject(mother, true);
 		const fatherObject = npcPregObject(father);
 		if (typeof motherObject === "string" || motherObject instanceof String) return motherObject;
 		if (typeof fatherObject === "string" || fatherObject instanceof String) return fatherObject;
@@ -381,7 +432,7 @@ window.pregnancyGenerator = {
 			return false;
 		}
 
-		const [pregnancy, fertility, magicTattoo] = pregPrep({ motherObject, genital });
+		const [pregnancy, fertility, magicTattoo] = pregPrep({ motherObject, fatherObject, genital });
 		if (typeof pregnancy === "string" || pregnancy instanceof String) return pregnancy;
 
 		if (pregnancy) {
@@ -391,11 +442,16 @@ window.pregnancyGenerator = {
 				furColour.concat(["black", "black", "black"]);
 			}
 			for (let i = 0; i < 8; i++) {
+				const childId =
+					"m" + motherObject.parentId.id + "b" + motherObject.parentId.kids + "d" + fatherObject.parentId.id + "f" + fatherObject.parentId.kids;
+				const birthId = motherObject.parentId.births;
 				let gender = random(0, 100) > 50 ? "f" : "m";
 				if ((motherObject.gender === "h" || fatherObject.gender === "h") && (motherObject.name === fatherObject.name || random(0, 100) >= 75))
 					gender = "h";
 				if ((mother === "pc" || father === "pc") && V.player.gender === "h" && random(0, 100) >= 75) gender = "h";
 				const baby = babyBase({
+					childId,
+					birthId,
 					mother: motherObject.name,
 					father: fatherObject.name,
 					fatherKnown,
@@ -407,6 +463,7 @@ window.pregnancyGenerator = {
 					hairColour: furColour[random(0, furColour.length - 1)],
 				});
 				result.fetus.push(baby);
+				parentFunction.increaseKids(motherObject.parentId.id, 0, fatherObject.parentId.id);
 				if (i > 4 && random(0, 100) > 100 - i * Math.clamp(4 - fertility, 0, 4) && !magicTattoo) break;
 
 				// Hard coded limit
@@ -419,7 +476,7 @@ window.pregnancyGenerator = {
 		return false;
 	},
 	parasite: ({ mother = null, parasiteType = null, hermParasite = null, genital = "anus" }) => {
-		const motherObject = npcPregObject(mother);
+		const motherObject = npcPregObject(mother, true);
 		if (typeof motherObject === "string" || motherObject instanceof String) return motherObject;
 
 		const [pregnancy /* , fertility, magicTattoo */] = pregPrep({ motherObject, parasiteType, genital });
diff --git a/game/03-JavaScript/04-Pregnancy/storyFunctions.js b/game/03-JavaScript/04-Pregnancy/storyFunctions.js
index 99d37626ba..bcfb4a32de 100644
--- a/game/03-JavaScript/04-Pregnancy/storyFunctions.js
+++ b/game/03-JavaScript/04-Pregnancy/storyFunctions.js
@@ -1,5 +1,19 @@
 /* eslint-disable no-undef */
 
+function getPregnancyObject(mother = "pc") {
+	if (mother === "pc") {
+		if (V.player.vaginaExist) {
+			return V.sexStats.vagina.pregnancy;
+		} else {
+			return V.sexStats.anus.pregnancy;
+		}
+	} else if (C.npc[mother] && C.npc[mother].pregnancy.enabled !== undefined) {
+		return C.npc[mother].pregnancy;
+	}
+	return {};
+}
+window.getPregnancyObject = getPregnancyObject;
+
 // Determins how used to being pregnant the player is
 function playerNormalPregnancyTotal() {
 	const result = Math.clamp(V.sexStats.vagina.pregnancy.totalBirthEvents + V.sexStats.anus.pregnancy.totalBirthEvents, 0, 50);
@@ -10,7 +24,6 @@ window.playerNormalPregnancyTotal = playerNormalPregnancyTotal;
 
 // `pregnancyOnly` is there intentially, please make use of it if you add to this function
 function playerBellySize(pregnancyOnly = false) {
-	if (!V.pregnancyTesting) return 0; // ToDo: Pregnancy, remove line
 	let bellySize = V.bellySizeDebug || 0;
 	const vpregnancy = V.sexStats.vagina.pregnancy;
 	const apregnancy = V.sexStats.anus.pregnancy;
@@ -42,8 +55,11 @@ function playerBellySize(pregnancyOnly = false) {
 				if (!apregnancy.gaveBirth) maxSize += 20 + Math.clamp(apregnancy.fetus.length / 2, 1, 4);
 				break;
 		}
-		bellySize += pregnancyProgress * Math.clamp(maxSize, 0, 24);
+		// The '+ 5' inflates the pregnancy belly size, meaning that the early stages of pregnancy will have no belly size increase due to it being reduced by the '- 5'
+		bellySize += Math.clamp(pregnancyProgress * Math.clamp(maxSize + 5, 0, 24 + 5) - 5, 0, 24);
 	}
+	if (V.daily.bloated && !pregnancyOnly) bellySize += Math.clamp(V.daily.bloated, 1, 2);
+
 	return Math.floor(Math.clamp(bellySize, 0, 24));
 }
 window.playerBellySize = playerBellySize;
@@ -51,7 +67,7 @@ window.playerBellySize = playerBellySize;
 function pregnancyBellyVisible(pregnancyOnly = false) {
 	const size = playerBellySize(pregnancyOnly);
 	if (size <= 7) return false;
-	if (size <= 12 && (V.worn.upper.name !== "naked" && !V.worn.upper.type.includes("bellyShow") || !V.worn.over_upper.type.includes("naked"))) return false;
+	if (size <= 12 && ((V.worn.upper.name !== "naked" && !V.worn.upper.type.includes("bellyShow")) || !V.worn.over_upper.type.includes("naked"))) return false;
 	if (size <= 17 && (V.worn.upper.type.includes("bellyHide") || !V.worn.over_upper.type.includes("naked"))) return false;
 
 	return true;
@@ -141,12 +157,9 @@ function playerNormalPregnancyType() {
 window.playerNormalPregnancyType = playerNormalPregnancyType;
 
 function wakingPregnancyEvent() {
-	let pregnancy;
-	if (V.player.vaginaExist) {
-		pregnancy = V.sexStats.vagina.pregnancy;
-	} else {
-		pregnancy = V.sexStats.anus.pregnancy;
-	}
+	const pregnancy = getPregnancyObject();
+	if (!pregnancy.fetus) return false;
+
 	const rng = random(0, 100);
 	const menstruation = V.sexStats.vagina.menstruation;
 	const pills = V.sexStats.pills;
@@ -166,7 +179,10 @@ function wakingPregnancyEvent() {
 		(random(0, 100) >= 105 - V.sciencetrait * 5 || playerNormalPregnancyTotal() >= 3)
 	) {
 		return "missedPeriod";
-	} else if (playerBellySize() >= 12 && ["genitals","under_upper","upper","under_lower","lower"].find(slot => V.worn[slot].type.includes("constricting"))) {
+	} else if (
+		playerBellySize() >= 12 &&
+		["genitals", "under_upper", "upper", "under_lower", "lower"].find(slot => V.worn[slot].type.includes("constricting"))
+	) {
 		return "clothesRemoval";
 	} else if (between(pregnancyStage, 0.9, 1)) {
 		wakingEffects = "nearBirthEvent";
@@ -232,12 +248,9 @@ function wakingPregnancyEvent() {
 window.wakingPregnancyEvent = wakingPregnancyEvent;
 
 function dailyPregnancyEvent() {
-	let pregnancy;
-	if (V.player.vaginaExist) {
-		pregnancy = V.sexStats.vagina.pregnancy;
-	} else {
-		pregnancy = V.sexStats.anus.pregnancy;
-	}
+	const pregnancy = getPregnancyObject();
+	if (!pregnancy.fetus) return false;
+
 	const rng = random(0, 100) + (V.daily.pregnancyEvent || 0);
 	const menstruation = V.sexStats.vagina.menstruation;
 	const pills = V.sexStats.pills;
@@ -329,23 +342,13 @@ function pregnancyNameCorrection(name, caps = false) {
 			name = caps ? "Yourself" : "yourself";
 			break;
 		default:
-			name = name[0] === name[0].toLowerCase() ? (caps ? "A" : "a") + (["a","e","i","o","u"].includes(name[0]) ? "n " : " ") + name : name;
+			name = name[0] === name[0].toLowerCase() ? (caps ? "A" : "a") + (["a", "e", "i", "o", "u"].includes(name[0]) ? "n " : " ") + name : name;
 			break;
 	}
 	return name;
 }
 window.pregnancyNameCorrection = pregnancyNameCorrection;
 
-function pregnancyUINameCorrection(name) {
-	switch (name) {
-		case "pc":
-			name = "You";
-			break;
-	}
-	return name;
-}
-window.pregnancyUINameCorrection = pregnancyUINameCorrection;
-
 function playerPregnancyRisk() {
 	if (V.playerPregnancyHumanDisable === "t" && V.playerPregnancyBeastDisable === "t") return 6; // Player Pregnancy Disabled
 	if (!V.player.vaginaExist && !canBeMPregnant()) return 6; // Player is male and can't become MPregnant
@@ -467,9 +470,7 @@ function playerAwareTheyCanBePregnant() {
 window.playerAwareTheyCanBePregnant = playerAwareTheyCanBePregnant;
 
 function playerAwareTheyArePregnant() {
-	if (V.player.vaginaExist && V.sexStats.vagina.pregnancy.awareOf) return true;
-	if (!V.player.vaginaExist && V.sexStats.anus.pregnancy.awareOf) return true;
-	return false;
+	return getPregnancyObject().awareOf;
 }
 window.playerAwareTheyArePregnant = playerAwareTheyArePregnant;
 
@@ -502,7 +503,7 @@ function pregnancyDaysEta(pregnancyObject) {
 }
 window.pregnancyDaysEta = pregnancyDaysEta;
 
-function knowsAboutPregnancy(motherOrId, whoToCheck) {
+function knowsAboutPregnancy(mother, whoToCheck, existingId) {
 	const awareOfBirthId = V.pregnancyStats.awareOfBirthId;
 	let birthId;
 	let whoToCheckConverted;
@@ -514,16 +515,12 @@ function knowsAboutPregnancy(motherOrId, whoToCheck) {
 		return false;
 	}
 
-	if (awareOfBirthId[motherOrId] && awareOfBirthId[motherOrId].includes(whoToCheckConverted)) return true;
+	if (existingId !== undefined && awareOfBirthId[mother + existingId] && awareOfBirthId[mother + existingId].includes(whoToCheckConverted)) return true;
 
-	if (motherOrId === "pc" && playerIsPregnant()) {
-		if (V.player.vaginaExist) {
-			birthId = V.sexStats.vagina.pregnancy.fetus[0].birthId;
-		} else {
-			birthId = V.sexStats.anus.pregnancy.fetus[0].birthId;
-		}
-	} else if (C.npc[motherOrId] && npcIsPregnant(motherOrId)) {
-		birthId = C.npc[motherOrId].pregnancy.fetus[0].birthId;
+	if (mother === "pc" && playerIsPregnant()) {
+		birthId = mother + getPregnancyObject().fetus[0].birthId;
+	} else if (C.npc[mother] && npcIsPregnant(mother)) {
+		birthId = mother + getPregnancyObject(mother).fetus[0].birthId;
 	}
 
 	if (birthId && awareOfBirthId[birthId] && awareOfBirthId[birthId].includes(whoToCheckConverted)) return true;
@@ -534,11 +531,11 @@ window.knowsAboutPregnancy = knowsAboutPregnancy;
 
 /*
 	<<setKnowsAboutPregnancy "pc" "Whitney">> - When whitney is aware of the pc's current pregnancy
-	<<setKnowsAboutPregnancy "pc1" "Whitney">> - When whitney is aware of the pc's first pregnancy
+	<<setKnowsAboutPregnancy "pc" "Whitney" 0>> - When whitney is aware of the pc's first pregnancy
 
 	Be sure to double check the usage when your providing an ID rather than "pc" or named npc's name
 */
-function setKnowsAboutPregnancy(motherOrId, whoNowKnows) {
+function setKnowsAboutPregnancy(mother, whoNowKnows, existingId) {
 	const awareOfBirthId = V.pregnancyStats.awareOfBirthId;
 	let birthId;
 	let whoNowKnowsConverted;
@@ -550,18 +547,14 @@ function setKnowsAboutPregnancy(motherOrId, whoNowKnows) {
 		return false;
 	}
 
-	if (awareOfBirthId[motherOrId]) {
-		birthId = motherOrId;
-	} else if (motherOrId === "pc") {
+	if (awareOfBirthId[mother + existingId]) {
+		birthId = mother + existingId;
+	} else if (mother === "pc") {
 		if (playerIsPregnant()) {
-			if (V.player.vaginaExist) {
-				birthId = V.sexStats.vagina.pregnancy.fetus[0].birthId;
-			} else {
-				birthId = V.sexStats.anus.pregnancy.fetus[0].birthId;
-			}
+			birthId = mother + getPregnancyObject().fetus[0].birthId;
 		}
-	} else if (C.npc[motherOrId]) {
-		if (npcIsPregnant(motherOrId)) birthId = C.npc[motherOrId].pregnancy.fetus[0].birthId;
+	} else if (C.npc[mother] && npcIsPregnant(mother)) {
+		birthId = mother + getPregnancyObject(mother).fetus[0].birthId;
 	}
 
 	if (birthId) {
diff --git a/game/03-JavaScript/debugMenu.js b/game/03-JavaScript/debugMenu.js
index 675105e449..47893be652 100644
--- a/game/03-JavaScript/debugMenu.js
+++ b/game/03-JavaScript/debugMenu.js
@@ -317,11 +317,11 @@ setup.debugMenu.eventList = {
 		},
 		{
 			text_only: `\nVaginal Pregnancy<br>(New Pregnancy will only occur if not pregnant)\n`,
-			condition() { return V.pregnancyTesting && V.player.penisExist === false },
+			condition() { return V.player.penisExist === false },
 		},
 		{
 			text_only: `Player is already pregnant\n`,
-			condition() { return V.pregnancyTesting && V.player.penisExist === false && V.sexStats.vagina.pregnancy.fetus.length !== 0 },
+			condition() { return V.player.penisExist === false && getPregnancyObject().fetus.length !== 0 },
 		},
 		{
 			link: [`Get Pregnant with humans`, stayOnPassageFn],
@@ -330,7 +330,7 @@ setup.debugMenu.eventList = {
 					return `<<playerPregnancy "Debug Man" "human" true "vagina" undefined true>>`;
 				},
 			],
-			condition() { return V.pregnancyTesting && V.player.penisExist === false && V.sexStats.vagina.pregnancy.fetus.length === 0},
+			condition() { return V.player.penisExist === false && getPregnancyObject().fetus.length === 0},
 		},
 		{
 			link: [`Get Pregnant with wolves`, stayOnPassageFn],
@@ -339,17 +339,17 @@ setup.debugMenu.eventList = {
 					return `<<playerPregnancy "Debug Wolf" "wolf" true "vagina" undefined true>>`;
 				},
 			],
-			condition() { return V.pregnancyTesting && V.player.penisExist === false && V.sexStats.vagina.pregnancy.fetus.length === 0 },
+			condition() { return V.player.penisExist === false && getPregnancyObject().fetus.length === 0 },
 		},
 		{
 			link: [`Progress Pregnancy to the end`, stayOnPassageFn],
 			widgets: [`<<set $sexStats.vagina.pregnancy.timer to $sexStats.vagina.pregnancy.timerEnd>>`],
-			condition() { return V.pregnancyTesting && V.player.penisExist === false && V.sexStats.vagina.pregnancy.fetus.length !== 0 },
+			condition() { return V.player.penisExist === false && getPregnancyObject().fetus.length !== 0 },
 		},
 		{
 			link: [`End pregnancy and send children to default locations`, stayOnPassageFn],
 			widgets: [() => {
-				switch(V.sexStats.vagina.pregnancy.type){
+				switch(getPregnancyObject().type){
 					case "human":
 						endPlayerPregnancy("hospital","home");
 					break;
@@ -362,25 +362,21 @@ setup.debugMenu.eventList = {
 				};
 				return '';
 			}],
-			condition() { return V.pregnancyTesting && V.player.penisExist === false && V.sexStats.vagina.pregnancy.fetus.length !== 0 },
+			condition() { return V.player.penisExist === false && getPregnancyObject().fetus.length !== 0 },
 		},
 		{
 			text_only: `\nNPC Pregnancies`,
-			condition() { return V.pregnancyTesting },
 		},
 		{
 			text_only: `(Each npc needs to be enabled for pregnancy in setup)\n`,
-			condition() { return V.pregnancyTesting },
 		},
 		{
 			link: [`Get Robin Pregnant with PCs children`, stayOnPassageFn],
 			widgets: [`<<namedNpcPregnancy "Robin" "pc" "human" true undefined true>>`],
-			condition() { return V.pregnancyTesting },
 		},
 		{
 			link: [`Get Bailey Pregnant with Black wolfs pups`, stayOnPassageFn],
 			widgets: [`<<namedNpcPregnancy "Bailey" "Black Wolf" "wolf" true undefined true>>`],
-			condition() { return V.pregnancyTesting },
 		},
 		{
 			link: [`Basic NPC Compression Test`, stayOnPassageFn],
diff --git a/game/03-JavaScript/save.js b/game/03-JavaScript/save.js
index 164391f7dd..c7523ad286 100644
--- a/game/03-JavaScript/save.js
+++ b/game/03-JavaScript/save.js
@@ -946,14 +946,16 @@ function settingsObjects(type) {
 				bottomsizemax: { min: 0, max: 9, decimals: 0 },
 				penissizemax: { min: -2, max: 4, decimals: 0 },
 				penissizemin: { min: -2, max: 0, decimals: 0 },
-				/* ToDo: Pregnancy, uncomment to properly enable, add defaults back to DolSettingsExport.json */
-				// baseVaginalPregnancyChance: { min: 0, max: 96, decimals: 0 },
-				// baseNpcPregnancyChance: { min: 0, max: 16, decimals: 0 },
-				// humanPregnancyMonths: { min: 1, max: 9, decimals: 0 },
-				// wolfPregnancyWeeks: { min: 2, max: 12, decimals: 0 },
-				// playerPregnancyHumanDisable: {boolLetter: true, bool: true},
-				// playerPregnancyBeastDisable: {boolLetter: true, bool: true},
-				// npcPregnancyDisable: {boolLetter: true, bool: true},
+				basePlayerPregnancyChance: { min: 0, max: 96, decimals: 0, randomize: "gameplay" },
+				baseNpcPregnancyChance: { min: 0, max: 16, decimals: 0, randomize: "gameplay" },
+				humanPregnancyMonths: { min: 1, max: 9, decimals: 0 },
+				wolfPregnancyWeeks: { min: 2, max: 12, decimals: 0 },
+				playerPregnancyHumanDisable: { boolLetter: true, bool: true },
+				playerPregnancyBeastDisable: { boolLetter: true, bool: true },
+				npcPregnancyDisable: { boolLetter: true, bool: true },
+				cycledisable: { boolLetter: true, bool: true },
+				pregnancytype: { strings: ["realistic", "fetish"] },
+				condomLvl: { min: 0, max: 3, decimals: 0, randomize: "gameplay" },
 				checkstyle: {
 					strings: ["percentage", "words", "skillname"],
 					randomize: "gameplay",
@@ -1009,10 +1011,10 @@ function settingsObjects(type) {
 					showDebugRenderer: { bool: true },
 					numpad: { bool: true },
 					traitOverlayFormat: { strings: ["table", "reducedTable", "list"] },
-					font: { strings: ["","Arial","Verdana","TimesNewRoman","Georgia","Garamond","CourierNew","LucidaConsole","Monaco","ComicSans"] },
-					passageLineHeight: {  strings: [0, 1, 1.25, 1.5, 1.75, 2] },
-					overlayLineHeight: {  strings: [0, 1, 1.25, 1.5, 1.75, 2] },
-					sidebarLineHeight: {  strings: [0, 1, 1.25, 1.5, 1.75, 2] },
+					font: { strings: ["", "Arial", "Verdana", "TimesNewRoman", "Georgia", "Garamond", "CourierNew", "LucidaConsole", "Monaco", "ComicSans"] },
+					passageLineHeight: { strings: [0, 1, 1.25, 1.5, 1.75, 2] },
+					overlayLineHeight: { strings: [0, 1, 1.25, 1.5, 1.75, 2] },
+					sidebarLineHeight: { strings: [0, 1, 1.25, 1.5, 1.75, 2] },
 					passageFontSize: { strings: [0, 10, 12, 14, 16, 18, 20] },
 					overlayFontSize: { strings: [0, 10, 12, 14, 16, 18, 20] },
 					sidebarFontSize: { strings: [0, 12, 14, 16, 18, 20] },
diff --git a/game/04-Variables/feats.js b/game/04-Variables/feats.js
index 143f2530a2..6784ef5a58 100644
--- a/game/04-Variables/feats.js
+++ b/game/04-Variables/feats.js
@@ -1446,7 +1446,7 @@ setup.feats = {
 	},
 	"Opened Pandoras Cocks": {
 		title: "Opened Pandora's Cocks",
-		desc: "The Adult Shop couldn't've done it without you.",
+		desc: "The Adult Shop couldn't have done it without you.",
 		difficulty: 3,
 		series: "Adult Shop",
 		filter: ["All", "Discoveries"],
diff --git a/game/04-Variables/pregnancyVar.twee b/game/04-Variables/pregnancyVar.twee
index 7cde8269bb..d92e65e92a 100644
--- a/game/04-Variables/pregnancyVar.twee
+++ b/game/04-Variables/pregnancyVar.twee
@@ -35,6 +35,15 @@
 		*/
 		<<set $pregnancyStats.awareOfBirthId to {}>>
 	<</if>>
+	<<if $pregnancyStats.childInteractions is undefined>>
+		<<set $pregnancyStats.childInteractions to 0>>
+		<<set $pregnancyStats.childBreastfedInteractions to 0>>
+		<<set $pregnancyStats.childBottlefedInteractions to 0>>
+		<<set $pregnancyStats.childFirstWordInteractions to 0>>
+		<<set $pregnancyStats.orphanageInteractions to 0>>
+		<<set $pregnancyStats.orphanageMilkBottles to 0>>
+		<<set $pregnancyStats.orphanageMilkBottlesTotal to 0>>
+	<</if>>
 <</widget>>
 
 <<widget "containersInit">>
diff --git a/game/04-Variables/variables-passageFooter.twee b/game/04-Variables/variables-passageFooter.twee
index 3f42c05748..0734f12638 100644
--- a/game/04-Variables/variables-passageFooter.twee
+++ b/game/04-Variables/variables-passageFooter.twee
@@ -9,7 +9,7 @@
 	<<if $options.playtime>>
 		Play Time: <<print msToTime(($saveDetails.playTime ? $saveDetails.playTime : 0) + ($saveDetails.loadTime ? new Date() - $saveDetails.loadTime : 0))>> |
 	<</if>>
-	<<print StartConfig.version>><<if StartConfig.sneaky>> SNEAKY<</if>>
+	<<print StartConfig.version>><<if StartConfig.versionName>> <<print StartConfig.versionName>><</if>><<if StartConfig.sneaky>> SNEAKY<</if>>
 </div>
 <div id="gameVersionDisplay2"><<print StartConfig.version.slice(1)>></div>
 <<if $passage isnot "Start">>
diff --git a/game/04-Variables/variables-start.twee b/game/04-Variables/variables-start.twee
index 5214bc9bdd..f5896a42fc 100644
--- a/game/04-Variables/variables-start.twee
+++ b/game/04-Variables/variables-start.twee
@@ -908,7 +908,11 @@
 			slot:{
 				count: 0,
 				dayCount: 0,
-			}
+			},
+			playTime: 0,
+			loadTime: new Date(),
+			loadCount: 0,
+			f: 3,
 		}>>
 		<<unset $lastExported>>
 	<</if>>
diff --git a/game/04-Variables/variables-static.twee b/game/04-Variables/variables-static.twee
index 3399a90aa6..85cd07e03a 100644
--- a/game/04-Variables/variables-static.twee
+++ b/game/04-Variables/variables-static.twee
@@ -777,9 +777,11 @@
 	/*Should match with $NPCNameList*/
 	/*FOR `canBePregnant` DO NOT REMOVE FROM LIST ONCE ENABLED FOR OFFICAL VERSIONS, IT WILL DELETE EXISTING PREGNANCIES FOR NPCS*/
 	<<set setup.pregnancy to {
-		canBePregnant:[],
-		canImpregnatePlayer:["Black Wolf"],
-		infertile:["Bailey"],
-		typesEnabled:["human" , "wolf", "wolfboy", "wolfgirl"]
+		canBePregnant: [],
+		canImpregnatePlayer: ["Black Wolf"],
+		infertile: ["Bailey", "Leighton"],
+		ignoresIncompeteCheck: ["Ivory Wraith"],
+		typesEnabled: ["human" , "wolf", "wolfboy", "wolfgirl"],
+		randomAlwaysKeep: ["wolf_cave"]
 	}>>
 <</widget>>
diff --git a/game/04-Variables/variables-versionUpdate.twee b/game/04-Variables/variables-versionUpdate.twee
index 5e1ce27a08..66fb32496a 100644
--- a/game/04-Variables/variables-versionUpdate.twee
+++ b/game/04-Variables/variables-versionUpdate.twee
@@ -2002,7 +2002,11 @@
 			slot:{
 				count: 0,
 				dayCount: 0,
-			}
+			},
+			playTime: 0,
+			loadTime: new Date(),
+			loadCount: 0,
+			f: 3,
 		}>>
 		<<unset $lastExported>>
 	<</if>>
@@ -2045,8 +2049,8 @@
 
 	<<childrenSetup>>
 	<<npcPregnancyUpdater>>
-	<<if $baseVaginalPregnancyChance is undefined>>
-		<<set $baseVaginalPregnancyChance to 50>>
+	<<if $basePlayerPregnancyChance is undefined>>
+		<<set $basePlayerPregnancyChance to 50>>
 		<<set $humanPregnancyMonths to 3>>
 		<<set $wolfPregnancyWeeks to 4>>
 		<<set $playerPregnancyHumanDisable to "f">>
@@ -3482,7 +3486,7 @@
 	<</if>>
 
 	<!-- To update the player and named npc pregnancy objects from numbers to a single array -->
-	<<if $sexStats.vagina.pregnancy.fetus is undefined or $sexStats.anus.pregnancy.fetus is undefined or $sexStats.anus.pregnancy.type is undefined or $sexStats.anus.pregnancy.nonCycleRng is undefined or !Array.isArray($sexStats.vagina.sperm)>>
+	<<if $sexStats.vagina.pregnancy.fetus is undefined or $sexStats.anus.pregnancy.fetus is undefined or $sexStats.anus.pregnancy.type is undefined or $sexStats.anus.pregnancy.nonCycleRng is undefined or !Array.isArray($sexStats.vagina.sperm) or !$parentList>>
 		<<physicalAdjustmentsInit>>
 	<</if>>
 
@@ -3498,6 +3502,11 @@
 		<</if>>
 	<</if>>
 
+	<<if $baseVaginalPregnancyChance>>
+		<<set $basePlayerPregnancyChance to $baseVaginalPregnancyChance>>
+		<<unset $baseVaginalPregnancyChance>>
+	<</if>>
+
 	<<if $insecurity_pregnancy is undefined>>
 		<<set $insecurity_pregnancy to 0>>
 		<<set $acceptance_pregnancy to 0>>
diff --git a/game/base-clothing/widgets.twee b/game/base-clothing/widgets.twee
index 0dcc808086..107fdcbb6c 100644
--- a/game/base-clothing/widgets.twee
+++ b/game/base-clothing/widgets.twee
@@ -1679,8 +1679,7 @@
 <</widget>>
 
 <<widget "condomsSidebar">>
-	/*ToDo: Pregnancy, remove first variable check in statement to properly enable*/
-	<<if $pregnancyTesting and $condomLvl gte 1 and $options.condomsDisplay isnot "none" and $condoms isnot undefined>>
+	<<if $condomLvl gte 1 and $options.condomsDisplay isnot "none" and $condoms isnot undefined>>
 		<div id="condoms-sidebar" class="condoms-sidebar">
 			<img src="img/ui/condom.png">
 		</div>
diff --git a/game/base-combat/actions-anus.twee b/game/base-combat/actions-anus.twee
index 6fb5e3c192..fd2db86470 100644
--- a/game/base-combat/actions-anus.twee
+++ b/game/base-combat/actions-anus.twee
@@ -183,8 +183,7 @@
 	<<if ($consensual is 0 or ($promiscuity gte 55 and $enemytype is "man") or ($deviancy gte 55 and $enemytype isnot "man")) and $analskill gte 800>>
 		<<set _anusaction["Edge " + $NPCList[$anustarget].pronouns.him] to "penisEdging">>
 	<</if>>
-	/*ToDo: Pregnancy, remove 'and $pregnancyTesting'*/
-	<<if !playerIsPregnant() and canBeMPregnant() and !$player.vaginaExist and playerPregnancyPossibleWith($NPCList[$anustarget]) and $enemyarousal gte $enemyarousalmax and $demon gte 6 and $demonbuild gte 90 and $pregnancyTesting>>
+	<<if !playerIsPregnant() and canBeMPregnant() and !$player.vaginaExist and playerPregnancyPossibleWith($NPCList[$anustarget]) and $enemyarousal gte $enemyarousalmax and $demon gte 6 and $demonbuild gte 90>>
 		<<if playerAwareTheyCanBePregnant()>>
 			<<set _anusaction["Force Impregnation"] to "forceImpregnation">>
 		<<else>>
diff --git a/game/base-combat/actions-penis.twee b/game/base-combat/actions-penis.twee
index 2c4944b76d..7696e9327a 100644
--- a/game/base-combat/actions-penis.twee
+++ b/game/base-combat/actions-penis.twee
@@ -200,8 +200,7 @@
 	<<else>>
 		<<set _penisaction["Fuck"] to "cooperate">>
 	<</if>>
-	/*ToDo: Pregnancy, remove 'and $pregnancyTesting'*/
-	<<if !npcIsPregnant($NPCList[$penistarget].fullDescription) and NPCPregnancyPossibleWithPlayer($NPCList[$penistarget]) and $arousal gte $arousalmax - 1000 and $demon gte 6 and $demonbuild gte 90 and $pregnancyTesting>>
+	<<if !npcIsPregnant($NPCList[$penistarget].fullDescription) and NPCPregnancyPossibleWithPlayer($NPCList[$penistarget]) and $arousal gte $arousalmax - 1000 and $demon gte 6 and $demonbuild gte 90>>
 		<<set _penisaction["Force Impregnation"] to "forceImpregnation">>
 	<</if>>
 	<<if ($consensual is 0 or ($enemytype is "man" ? $promiscuity : $deviancy) gte 55) and $penileskill gte 800>>
diff --git a/game/base-combat/actions-speech.twee b/game/base-combat/actions-speech.twee
index ce27877ec5..c1b4c2592f 100644
--- a/game/base-combat/actions-speech.twee
+++ b/game/base-combat/actions-speech.twee
@@ -91,8 +91,7 @@
 		<<if $consensual is 1 and $masochism_level gte 1 or $masochism_level gte 3>>
 			<<set _askActions["to be more rough"] to "askrough">>
 		<</if>>
-		/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-		<<if $enemytype is "man" and !$NPCList[$mouthtarget].condomAsk and $pregnancyTesting and $condomLvl gte 2 and !$abomination and $NPCList[$mouthtarget].fullDescription isnot "Ivory Wraith">>
+		<<if $enemytype is "man" and !$NPCList[$mouthtarget].condomAsk and $condomLvl gte 2 and !$abomination and $NPCList[$mouthtarget].fullDescription isnot "Ivory Wraith">>
 			<<if ($NPCList[$mouthtarget].penis is "none" or $NPCList[$mouthtarget].penisdesc.includes("strap-on")) and (!$player.penisExist or $crossdressing gte 1)>>
 				/*Prevent condoms in situations where none can be equipped*/
 			<<else>>
diff --git a/game/base-combat/actions-vagina.twee b/game/base-combat/actions-vagina.twee
index 1524bf2164..2b63a1e42d 100644
--- a/game/base-combat/actions-vagina.twee
+++ b/game/base-combat/actions-vagina.twee
@@ -239,8 +239,7 @@
 	<<if ($consensual is 0 or ($promiscuity gte 55 and $enemytype is "man") or ($deviancy gte 55 and $enemytype isnot "man")) and $vaginalskill gte 800>>
 		<<set _vaginaaction["Edge " + $NPCList[$vaginatarget].pronouns.him] to "penisEdging">>
 	<</if>>
-	/*ToDo: Pregnancy, remove 'and $pregnancyTesting'*/
-	<<if !playerIsPregnant() and playerPregnancyPossibleWith($NPCList[$vaginatarget]) and $enemyarousal gte $enemyarousalmax and $demon gte 6 and $demonbuild gte 90 and $pregnancyTesting>>
+	<<if !playerIsPregnant() and playerPregnancyPossibleWith($NPCList[$vaginatarget]) and $enemyarousal gte $enemyarousalmax and $demon gte 6 and $demonbuild gte 90>>
 		<<set _vaginaaction["Force Impregnation"] to "forceImpregnation">>
 	<</if>>
 	<<if $vaginaldoubledisable is "f" and _secondtarget is true and ($anususe is 0 or ($anususe isnot 0 and $anususe isnot "penisdouble")) and $awareness gte 300>>
diff --git a/game/base-combat/beast-generation.twee b/game/base-combat/beast-generation.twee
index 336c730945..92e19759a2 100644
--- a/game/base-combat/beast-generation.twee
+++ b/game/base-combat/beast-generation.twee
@@ -40,6 +40,10 @@
 		head: 0,
 		genitals: 0,
 	}>>
+	
+	<<if $NPCList[_n].pregnancy is undefined>>
+		<<set $NPCList[_n].pregnancy to 0>>
+	<</if>>
 
 	<<if $enemyno lt 6>><<set $enemyno += 1>><</if>>
 
diff --git a/game/base-combat/init.twee b/game/base-combat/init.twee
index d24a184509..0b021061da 100644
--- a/game/base-combat/init.twee
+++ b/game/base-combat/init.twee
@@ -54,8 +54,7 @@
 		<<set $monster to 0>>
 	<</if>>
 
-	/*ToDo: Pregnancy, remove to properly enable*/
-	<<if $pregnancyTesting and $condomLvl gte 2>>
+	<<if $condomLvl gte 2>>
 		<<for _i to 0; _i lt $enemyno; _i++>>
 			<<if $condomLvl is 2 and $NPCList[_i].condom and pregnancyCompatible($NPCList[_i]) is false>>
 				<<set $NPCList[_i].condom.willUse to false>>
diff --git a/game/base-combat/npc-generation.twee b/game/base-combat/npc-generation.twee
index 9c35abdf33..49415b1c6e 100644
--- a/game/base-combat/npc-generation.twee
+++ b/game/base-combat/npc-generation.twee
@@ -968,8 +968,7 @@
 		<<set $NPCList[_n].type to "human">>
 	<</if>>
 
-	/*ToDo: Pregnancy, remove to properly enable*/
-	<<if $pregnancyTesting and $condomLvl gte 2 and !_condomIgnore>>
+	<<if $condomLvl gte 2 and !_condomIgnore>>
 		<<if $NPCList[_n].pregnancyAvoidance gte (100 - $condomChance)>>
 			<<set $NPCList[_n].condom to {
 				willUse: random(0,100),
@@ -988,7 +987,9 @@
 			}>>
 		<</if>>
 	<</if>>
-	<<set $NPCList[_n].pregnancy to 0>>
+	<<if $NPCList[_n].pregnancy is undefined>>
+		<<set $NPCList[_n].pregnancy to 0>>
+	<</if>>
 <</widget>>
 
 <<widget "npcstrapon">>
diff --git a/game/base-debug/clothesTesting.twee b/game/base-debug/clothesTesting.twee
index d7870cbf14..7578c166ae 100644
--- a/game/base-debug/clothesTesting.twee
+++ b/game/base-debug/clothesTesting.twee
@@ -316,13 +316,10 @@
 	<</for>>
 	<br><br>
 
-	/*ToDo: Pregnancy - remove $pregnancyTesting check*/
-	<<if $pregnancyTesting>>
-		<span class="gold">Belly Size</span>
-		<br>
-		<<numberslider "$characterViewer.bodyState.bellySize" $characterViewer.bodyState.bellySize 0 20 1>>
-		<br><br>
-	<</if>>
+	<span class="gold">Belly Size</span>
+	<br>
+	<<numberslider "$characterViewer.bodyState.bellySize" $characterViewer.bodyState.bellySize 0 20 1>>
+	<br><br>
 
 	<span class="gold">Vagina Cum</span>
 	<br>
@@ -724,10 +721,7 @@
 	<<set _modeloptions.penis_size to $characterViewer.bodyState.penisSize !== "none" ? $characterViewer.bodyState.penisSize : "">>
 	<<set _modeloptions.balls to $characterViewer.bodyState.ballsExist>>
 
-	/*ToDo: Pregnancy - remove $pregnancyTesting check*/
-	<<if $pregnancyTesting>>
-		<<set _modeloptions.belly to $characterViewer.bodyState.bellySize>>
-	<</if>>
+	<<set _modeloptions.belly to $characterViewer.bodyState.bellySize>>
 
 	/*Skin & tan*/
 	<<set _modeloptions.skin_type to $characterViewer.skinColour.type>>
diff --git a/game/base-system/attitudes.twee b/game/base-system/attitudes.twee
index 9e6eef7d14..ffca40dfbe 100644
--- a/game/base-system/attitudes.twee
+++ b/game/base-system/attitudes.twee
@@ -386,7 +386,7 @@
 		<<set _feet["Rub their pussy"] to "vaginagrabrub">>
 	<</if>>
 	<<if (_args[0] is false and ($promiscuity gte 35 or $deviancy gte 35)) or (_args[0] is true and ($promiscuity gte 95 or $deviancy gte 95))>>
-		<<set _feet["Leg Lock them"] to "legLocked">>
+		<<set _feet["Leg Lock them"] to "legLock">>
 	<</if>>
 
 	<<set _mouth to {
diff --git a/game/base-system/feats.twee b/game/base-system/feats.twee
index 6c18456a30..43610aa8f5 100644
--- a/game/base-system/feats.twee
+++ b/game/base-system/feats.twee
@@ -583,8 +583,7 @@
 			<<if $sadism_level gte 4>>
 				<<earnFeat "Served Hot">>
 			<</if>>
-			<!-- ToDo: Pregnancy, remove $pregnancyTesting to properly enable -->
-			<<if $fame.sex lte 29 and $fame.prostitution lte 29 and $fame.rape lte 29 and $fame.bestiality lte 29 and $fame.exhibitionism lte 29 and (!$pregnancyTesting or $fame.pregnancy lte 29)
+			<<if $fame.sex lte 29 and $fame.prostitution lte 29 and $fame.rape lte 29 and $fame.bestiality lte 29 and $fame.exhibitionism lte 29 and $fame.pregnancy lte 29
 			and $fame.scrap gte 1000 and $fame.good gte 1000 and $fame.business gte 1000 and $fame.social gte 1000 and $fame.model gte 1000 /* and $fame.pimp gte 1000 */>>
 				<<earnFeat "Shining Reputation">>
 			<</if>>
diff --git a/game/base-system/mirror.twee b/game/base-system/mirror.twee
index fd72ad68cc..63f585af54 100644
--- a/game/base-system/mirror.twee
+++ b/game/base-system/mirror.twee
@@ -40,12 +40,7 @@
 <<widget "mirrorDisplay">>
 	<<switch $mirrorMenu>>
 		<<case "appearance">>
-			<<if $player.vaginaExist>>
-				<<set $_pregnancy to $sexStats.vagina.pregnancy>>
-			<<else>>
-				<<set $_pregnancy to $sexStats.anus.pregnancy>>
-			<</if>>
-			<<if pregnancyBellyVisible(true) and !$_pregnancy.awareOf>>
+			<<if pregnancyBellyVisible(true) and !playerAwareTheyArePregnant()>>
 				<<mirrorAppearancePregnancy>>
 			<<else>>
 				<<mirrorAppearance>>
@@ -783,12 +778,7 @@
 	<</type>>
 	<<arousal 300>><<stress 10>>
 	
-	<<if $player.vaginaExist>>
-		<<set $_pregnancy to $sexStats.vagina.pregnancy>>
-	<<else>>
-		<<set $_pregnancy to $sexStats.anus.pregnancy>>
-	<</if>>
-	<<set $_pregnancy.awareOf to true>>
+	<<set getPregnancyObject().awareOf to true>>
 <</widget>>
 
 <<widget "mirrorSkin">>
@@ -976,8 +966,7 @@
 			<</if>>
 		<</if>>
 	<</if>>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if ($player.vaginaExist or ($sexStats.anus.pregnancy.awareOf or $sexStats.anus.pregnancy.givenBirth gte 1)) and $promiscuity gte 75 and $pregnancyTesting>>
+	<<if ($player.vaginaExist or ($sexStats.anus.pregnancy.awareOf or $sexStats.anus.pregnancy.givenBirth gte 1)) and $promiscuity gte 75>>
 		<<set _bodyWritingOptions.Pregnancy to {}>>
 		<<set _bodyWritingOptions.Pregnancy["Brood mother"] to "brood_mother">>
 		<<set _bodyWritingOptions.Pregnancy["Inseminate me"] to "inseminate_me">>
diff --git a/game/base-system/named-npcs.twee b/game/base-system/named-npcs.twee
index 8b330de133..3d805b7af8 100644
--- a/game/base-system/named-npcs.twee
+++ b/game/base-system/named-npcs.twee
@@ -900,8 +900,7 @@ Zohar
 	<<set $NPCList[_npcno].condom to false>>
 	<<set $NPCList[_npcno].pregnancyAvoidance to $NPCName[_i].pregnancyAvoidance>>
 
-	<!-- ToDo: Pregnancy, remove $pregnancyTesting to properly enable -->
-	<<if $pregnancyTesting and $condomLvl gte 2>>
+	<<if $condomLvl gte 2>>
 		<!-- 50 is the threshold for named NPCs bringing their own condoms, do not change -->
 		<<if ($NPCList[_npcno].pregnancyAvoidance gte 50 and !_condomIgnore)>>
 			<<set $NPCList[_npcno].condom to {
diff --git a/game/base-system/orgasm.twee b/game/base-system/orgasm.twee
index 0d0db625a4..55adf00dfb 100644
--- a/game/base-system/orgasm.twee
+++ b/game/base-system/orgasm.twee
@@ -42,8 +42,40 @@
 						<<purity -1>><<internalejac>><<creampie "npc" "vagina">>
 						<<if $abomination is 1>>
 							/*ToDo: Pregnancy, figure out how the Wraith, plantpeople, etc will handle pregnancy.*/
-						<<else>>
+						<<elseif $npcrow.includes($_i)>>
 							<<recordSperm `{target: $NPCList[$_i].fullDescription, spermOwner: "pc", spermType: "human", rngModifier: 100}`>>
+						<<elseif $NPCList[$_i].pregnancy is 0 and $consensual is 1>>
+							/* Pregnancy Count */
+							<<set $_count to Object.values($storedNPCs).reduce((prev, curr) => {
+								if(curr.pregnancy) return prev + 1;
+								return prev;
+							},0)>>
+							/* Pregnancy chance checks */
+							<<set $_impregnatedChance to 200 / (20 - $baseNpcPregnancyChance)>>
+							<<if V.sexStats.pills.pills["fertility booster"].doseTaken gt 0>>
+								<<set $_impregnatedChance to Math.ceil($_impregnatedChance * (1 + (V.sexStats.pills.pills["fertility booster"].doseTaken * 0.5)))>>
+							<</if>>
+							<<if V.sexStats.pills.pills["contraceptive"].doseTaken gt 0>>
+								<<set $_impregnatedChance to Math.ceil($_impregnatedChance * 0.1)>>
+							<</if>>
+							/*If random NPC is impregnated, compress NPC and fetus*/
+							<<if ($_impregnatedChance gte random(0,200) or _npcForceImpregnation) and $_count lte 10>>
+								<<switch $NPCList[$_i].type>>
+									<<case "human">><<set $_pregnancy to pregnancyGenerator.human(V.NPCList[$_i], "pc", true)>>
+									<<case "wolf">><<set $_pregnancy to pregnancyGenerator.wolf(V.NPCList[$_i], "pc", true, "vagina", false)>>
+									<<case "wolfgirl" "wolfboy">><<set $_pregnancy to pregnancyGenerator.wolf(V.NPCList[$_i], "pc", true, "vagina", true)>>
+								<</switch>>
+								<<if $_pregnancy and !(typeof $_pregnancy is "string" || $_pregnancy instanceof String)>>
+									<<if random(0,2) is 0 or setup.pregnancy.randomAlwaysKeep.includes($location)>>
+										<<compressNPC $_i "pregnancy">>
+										<<set $storedNPCs[_lastCompressedName].pregnancy to $_pregnancy>>
+										/* ToDo: Uncomment when compression when is ready */
+										/*<<run $storedNPCs[_lastCompressedName].pregnancy.fetus.forEach((child, index, array) => array[index] to childCompressor(child, false))>>*/
+									<</if>>
+									<<if $pregnancytype is "fetish">><<set _npcIsNowPregnant to $NPCList[$_i].fullDescription>><</if>>
+									<<set $NPCList[$_i].pregnancy to 1>>
+								<</if>>
+							<</if>>
 						<</if>>
 					<<elseif $NPCList[$_i].vagina is "penisimminent" or $NPCList[$_i].vagina is "penisentrance">>
 						<<personselect $_i>>
diff --git a/game/base-system/overlays/characteristics.twee b/game/base-system/overlays/characteristics.twee
index 2780dddb38..ebfc367c30 100644
--- a/game/base-system/overlays/characteristics.twee
+++ b/game/base-system/overlays/characteristics.twee
@@ -118,11 +118,7 @@
 	<br><br>
 
 	<!--Pregnancy Details-->
-	<<if $player.vaginaExist>>
-		<<set $_pregnancy to $sexStats.vagina.pregnancy>>
-	<<else>>
-		<<set $_pregnancy to $sexStats.anus.pregnancy>>
-	<</if>>
+	<<set $_pregnancy to getPregnancyObject()>>
 	<<set $_menstruation to $sexStats.vagina.menstruation>>
 	<<set $_pills to $sexStats.pills>>
 	<<set $_lastPregPill to clone($_pills.lastTaken.pregnancy)>>
diff --git a/game/base-system/overlays/cheats.twee b/game/base-system/overlays/cheats.twee
index c153685179..fb3cdf96d3 100644
--- a/game/base-system/overlays/cheats.twee
+++ b/game/base-system/overlays/cheats.twee
@@ -1908,25 +1908,22 @@
 	| <<link ">>">><<famebestiality 100 "none" true>><<fameclamp>><<replace "#statsfamebestiality">><<print Math.trunc($fame.bestiality)>><</replace>><</link>>
 	| <<link ">>>">><<famebestiality 1000 "none" true>><<fameclamp>><<replace "#statsfamebestiality">><<print Math.trunc($fame.bestiality)>><</replace>><</link>>
 	<br>
-	/*ToDo: Pregnancy, remove check to properly enable*/
-	<<if $pregnancyTesting>>
-		<<link "<<<">><<famepregnancy -1000 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>> |
-		<<link "<<">><<famepregnancy -100 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>> |
-		<<link "<">><<famepregnancy -10 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>> |
-		Pregnancy: <span id="statsfamepregnancy"><<print Math.trunc($fame.pregnancy)>></span>
-		| <<link ">">><<famepregnancy 10 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>>
-		| <<link ">>">><<famepregnancy 100 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>>
-		| <<link ">>>">><<famepregnancy 1000 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>>
-		<br>
-		<<link "<<<">><<fameimpreg -1000 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>> |
-		<<link "<<">><<fameimpreg -100 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>> |
-		<<link "<">><<fameimpreg -10 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>> |
-		impreg: <span id="statsfameimpreg"><<print Math.trunc($fame.impreg)>></span>
-		| <<link ">">><<fameimpreg 10 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>>
-		| <<link ">>">><<fameimpreg 100 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>>
-		| <<link ">>>">><<fameimpreg 1000 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>>
-		<br>
-	<</if>>
+	<<link "<<<">><<famepregnancy -1000 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>> |
+	<<link "<<">><<famepregnancy -100 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>> |
+	<<link "<">><<famepregnancy -10 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>> |
+	Pregnancy: <span id="statsfamepregnancy"><<print Math.trunc($fame.pregnancy)>></span>
+	| <<link ">">><<famepregnancy 10 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>>
+	| <<link ">>">><<famepregnancy 100 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>>
+	| <<link ">>>">><<famepregnancy 1000 "none" true>><<fameclamp>><<replace "#statsfamepregnancy">><<print Math.trunc($fame.pregnancy)>><</replace>><</link>>
+	<br>
+	<<link "<<<">><<fameimpreg -1000 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>> |
+	<<link "<<">><<fameimpreg -100 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>> |
+	<<link "<">><<fameimpreg -10 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>> |
+	impreg: <span id="statsfameimpreg"><<print Math.trunc($fame.impreg)>></span>
+	| <<link ">">><<fameimpreg 10 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>>
+	| <<link ">>">><<fameimpreg 100 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>>
+	| <<link ">>>">><<fameimpreg 1000 "none" true>><<fameclamp>><<replace "#statsfameimpreg">><<print Math.trunc($fame.impreg)>><</replace>><</link>>
+	<br>
 
 	<<link "<<<">><<fameexhibitionism -1000 "none" true>><<fameclamp>><<replace "#statsfameexhibitionism">><<print Math.trunc($fame.exhibitionism)>><</replace>><</link>> |
 	<<link "<<">><<fameexhibitionism -100 "none" true>><<fameclamp>><<replace "#statsfameexhibitionism">><<print Math.trunc($fame.exhibitionism)>><</replace>><</link>> |
@@ -2171,8 +2168,7 @@
 	<</if>>
 	<br>
 
-	/* ToDo: remove $pregnancyTesting to correctly enable */
-	<<if $pregnancyTesting and ($playerPregnancyBeastDisable == "f" or $playerPregnancyHumanDisable == "f")>>
+	<<if ($playerPregnancyBeastDisable is "f" or $playerPregnancyHumanDisable is "f")>>
 		<span class="gold">Pregnancy Cheats</span>
 		<div id="cheatsPregnancyOptions"><<cheatsPregnancyOptions>></div>
 	<</if>>
@@ -2264,7 +2260,7 @@
 	<<if $player.vaginaExist or canBeMPregnant()>>
 		<<set _womb to $player.vaginaExist ? "vagina" : "anus">>
 		<<set _menstruation to $sexStats[_womb].menstruation>>
-		<<set _pregnancy to $sexStats[_womb].pregnancy>>
+		<<set $_pregnancy to $sexStats[_womb].pregnancy>>
 		<<if !playerIsPregnant() and $cycledisable == "f">>
 			You aren't pregnant:
 			<br>
@@ -2279,23 +2275,24 @@
 		<<if playerIsPregnant()>>
 			You are pregnant:
 			<br>
-			<<link "<<">><<set _pregnancy.timer to Math.clamp(_pregnancy.timer - _pregnancy.timerEnd * 0.05, 0, _pregnancy.timerEnd)>><<replace "#cheatPregnancyProgress">><<print Math.round(Math.clamp(_pregnancy.timer / _pregnancy.timerEnd * 100, 0, 100))>>%<</replace>><</link>> |
-			<<link "<">><<set _pregnancy.timer to Math.clamp(_pregnancy.timer - _pregnancy.timerEnd * 0.01, 0, _pregnancy.timerEnd)>><<replace "#cheatPregnancyProgress">><<print Math.round(Math.clamp(_pregnancy.timer / _pregnancy.timerEnd * 100, 0, 100))>>%<</replace>><</link>> |
-			Pregnancy progress: <span id="cheatPregnancyProgress"><<print Math.round(Math.clamp(_pregnancy.timer / _pregnancy.timerEnd * 100, 0, 100))>>%</span>
-			| <<link ">">><<set _pregnancy.timer to Math.clamp(_pregnancy.timer + _pregnancy.timerEnd * 0.01, 0, _pregnancy.timerEnd * .99)>><<replace "#cheatPregnancyProgress">><<print Math.round(Math.clamp(_pregnancy.timer / _pregnancy.timerEnd * 100, 0, 100))>>%<</replace>><</link>>
-			| <<link ">>">><<set _pregnancy.timer to Math.clamp(_pregnancy.timer + _pregnancy.timerEnd * 0.05, 0, _pregnancy.timerEnd * .99)>><<replace "#cheatPregnancyProgress">><<print Math.round(Math.clamp(_pregnancy.timer / _pregnancy.timerEnd * 100, 0, 100))>>%<</replace>><</link>>
+			<<link "<<">><<set $_pregnancy.timer to Math.clamp($_pregnancy.timer - $_pregnancy.timerEnd * 0.05, 0, $_pregnancy.timerEnd)>><<replace "#cheatPregnancyProgress">><<print Math.round(Math.clamp($_pregnancy.timer / $_pregnancy.timerEnd * 100, 0, 100))>>%<</replace>><</link>> |
+			<<link "<">><<set $_pregnancy.timer to Math.clamp($_pregnancy.timer - $_pregnancy.timerEnd * 0.01, 0, $_pregnancy.timerEnd)>><<replace "#cheatPregnancyProgress">><<print Math.round(Math.clamp($_pregnancy.timer / $_pregnancy.timerEnd * 100, 0, 100))>>%<</replace>><</link>> |
+			Pregnancy progress: <span id="cheatPregnancyProgress"><<print Math.round(Math.clamp($_pregnancy.timer / $_pregnancy.timerEnd * 100, 0, 100))>>%</span>
+			| <<link ">">><<set $_pregnancy.timer to Math.clamp($_pregnancy.timer + $_pregnancy.timerEnd * 0.01, 0, $_pregnancy.timerEnd * .99)>><<replace "#cheatPregnancyProgress">><<print Math.round(Math.clamp($_pregnancy.timer / $_pregnancy.timerEnd * 100, 0, 100))>>%<</replace>><</link>>
+			| <<link ">>">><<set $_pregnancy.timer to Math.clamp($_pregnancy.timer + $_pregnancy.timerEnd * 0.05, 0, $_pregnancy.timerEnd * .99)>><<replace "#cheatPregnancyProgress">><<print Math.round(Math.clamp($_pregnancy.timer / $_pregnancy.timerEnd * 100, 0, 100))>>%<</replace>><</link>>
 			<br><br>
 			<<link [[Clear current pregnancy|$passage]]>>
-				<<set _pregnancy.type to null>>
-				<<set _pregnancy.fetus to []>>
-				<<set _pregnancy.waterBreaking to false>>
-				<<set _pregnancy.waterBreakingTimer to null>>
-				<<set _pregnancy.timer to null>>
-				<<set _pregnancy.timerEnd to null>>
-				<<set _pregnancy.awareOf to null>>
-				<<set _pregnancy.awareOfDetails to null>>
-				<<set _pregnancy.potentialFathers to []>>
-				<<set _pregnancy.sperm to []>>
+				<<set _pregnancyClear to $sexStats[_womb].pregnancy>>
+				<<set _pregnancyClear.type to null>>
+				<<set _pregnancyClear.fetus to []>>
+				<<set _pregnancyClear.waterBreaking to false>>
+				<<set _pregnancyClear.waterBreakingTimer to null>>
+				<<set _pregnancyClear.timer to null>>
+				<<set _pregnancyClear.timerEnd to null>>
+				<<set _pregnancyClear.awareOf to null>>
+				<<set _pregnancyClear.awareOfDetails to null>>
+				<<set _pregnancyClear.potentialFathers to []>>
+				<<set _pregnancyClear.sperm to []>>
 				<<set _menstruation.currentDay to .5>>
 				<<menstruationCycle>>
 			<</link>>
diff --git a/game/base-system/overlays/featsUI.twee b/game/base-system/overlays/featsUI.twee
index 77696676fe..f1d2fd09bd 100644
--- a/game/base-system/overlays/featsUI.twee
+++ b/game/base-system/overlays/featsUI.twee
@@ -453,8 +453,7 @@
 	<<if _featsTattooOptions is undefined>>
 		<<set _featsTattooOptions to []>>
 		<<for _value range setup.bodywriting>>
-			/*ToDo: Pregnancy, remove `or _value.special is "pregnancy"` to properly enable*/
-			<<if _value.featSkip is true or _value.special is "pregnancy">>
+			<<if _value.featSkip is true>>
 				<<continue>>
 			<</if>>
 			<<run _featsTattooOptions.push(_value.writing)>>
diff --git a/game/base-system/overlays/social.twee b/game/base-system/overlays/social.twee
index ee9994ad70..220693dd46 100644
--- a/game/base-system/overlays/social.twee
+++ b/game/base-system/overlays/social.twee
@@ -457,10 +457,7 @@
 			<<if $fame.model gte 1>>
 				<<relation-box-simple _modelFameBoxConfig>>
 			<</if>>
-			/*ToDo: Pregnancy, remove check to properly enable*/
-			<<if $pregnancyTesting>>
-				<<relation-box-simple _pregnancyFameBoxConfig>>
-			<</if>>
+			<<relation-box-simple _pregnancyFameBoxConfig>>
 			<<relation-box-simple _combatFameBoxConfig>>
 			<<relation-box-simple _kindnessFameBoxConfig>>
 			<<relation-box-simple _businessFameBoxConfig>>
diff --git a/game/base-system/overlays/statistics.twee b/game/base-system/overlays/statistics.twee
index e75807b950..7d74982204 100644
--- a/game/base-system/overlays/statistics.twee
+++ b/game/base-system/overlays/statistics.twee
@@ -314,30 +314,41 @@
 		<br>
 	<</foldout>>
 
-	/*ToDo: Pregnancy, remove check to properly enable*/
-	<<if $pregnancyTesting>>
-		<<foldout false "_pregnancyFoldout">>
-			<span class="gold">Pregnancy</span>
-			Times given birth: <<print $sexStats.vagina.pregnancy.totalBirthEvents + $sexStats.anus.pregnancy.totalBirthEvents>>
-			<br>
-			Total number of children: <<print $pregnancyStats.playerChildren>>
-			<br>
-			Total number of human children: <<print $pregnancyStats.humanChildren>>
-			<br>
-			Total number of wolf children: <<print $pregnancyStats.wolfChildren>>
-			<br>
-			After Morning pills taken: <<print $pregnancyStats.aftermorningpills>>
-			<br>
-			Pregnancy tests taken: <<print $pregnancyStats.pregnancyTestsTaken>>
+	<<foldout false "_pregnancyFoldout">>
+		<span class="gold">Pregnancy</span>
+		Times given birth: <<print $sexStats.vagina.pregnancy.totalBirthEvents + $sexStats.anus.pregnancy.totalBirthEvents>>
+		<br>
+		Total number of children you gave birth to: <<print $pregnancyStats.playerChildren>>
+		<br>
+		Total number of children you konw you fathered: <<print $pregnancyStats.npcChildren>>
+		<br>
+		Total number of human children: <<print $pregnancyStats.humanChildren>>
+		<br>
+		Total number of wolf children: <<print $pregnancyStats.wolfChildren>>
+		<br>
+		Children interactions: <<print $pregnancyStats.childInteractions>>
+		<br>
+		<!-- ToDo: Pregnancy - Move outside of commented area when interactions are added
+		Breastfed interactions: <<print $pregnancyStats.childBreastfedInteractions>>
+		<br>
+		Bottlefed interactions: <<print $pregnancyStats.childBottlefedInteractions>>
+		<br>
+		First Word interaction: <<print $pregnancyStats.childFirstWordInteractions>>
+		<br>
+		-->
+		Bottles of milk given to the orphanage: <<print $pregnancyStats.orphanageMilkBottlesTotal>>
+		<br>
+		After Morning pills taken: <<print $pregnancyStats.aftermorningpills>>
+		<br>
+		Pregnancy tests taken: <<print $pregnancyStats.pregnancyTestsTaken>>
+		<br>
+		<<if $player.vaginaExist>>
+			Vaginal Parasite Born: <<print $sexStats.vagina.pregnancy.parasiteBirthEvents>>
 			<br>
-			<<if $player.vaginaExist>>
-				Vaginal Parasite Born: <<print $sexStats.vagina.pregnancy.parasiteBirthEvents>>
-				<br>
-			<</if>>
-			Anal Parasite Born: <<print $sexStats.anus.pregnancy.parasiteBirthEvents>>
-			<br><br>
-		<</foldout>>
-	<</if>>
+		<</if>>
+		Anal Parasite Born: <<print $sexStats.anus.pregnancy.parasiteBirthEvents>>
+		<br><br>
+	<</foldout>>
 
 	<<foldout false "_gamblingFoldout">>
 		<span class="gold">Gambling</span>
@@ -383,15 +394,6 @@
 		<br>
 		Passed out: $passoutstat
 		<br>
-		/*ToDo: Pregnancy, remove the duplicate stat*/
-		<<if $parasitepregdisable is "f">>
-			<<if $player.vaginaExist>>
-			Vaginal Pregnancy Births: <<print $sexStats.vagina.pregnancy.parasiteBirthEvents>>
-			<br>
-			<</if>>
-			Anal Pregnancy Births: <<print $sexStats.anus.pregnancy.parasiteBirthEvents>>
-			<br>
-		<</if>>
 		Crime History: $crimehistory
 		<br>
 		Distinctions won: $distinction_stat
@@ -681,12 +683,10 @@
 			<br>
 			Exhibitionism fame: <<print Math.trunc($fame.exhibitionism)>>
 			<br>
-			<<if $pregnancyTesting>> <!-- ToDo: pregnancy, remove to properly enable -->
-				Pregnancy fame: <<print Math.trunc($fame.pregnancy)>>
-				<br>
-				Impregnation fame: <<print Math.trunc($fame.impreg)>>
-				<br>
-			<</if>>
+			Pregnancy fame: <<print Math.trunc($fame.pregnancy)>>
+			<br>
+			Impregnation fame: <<print Math.trunc($fame.impreg)>>
+			<br>
 			Combat fame: <<print Math.trunc($fame.scrap)>>
 			<br>
 			Kindness fame: <<print Math.trunc($fame.good)>>
@@ -805,36 +805,65 @@
 				<</if>>
 			<</if>>
 		<</foldout>>
-		<!-- ToDo: Pregnancy - remove $pregnancyTesting check-->
-		<<if $pregnancyTesting>>
-			<<if $cycledisable is "f">>
-				<<set $_menstruation to $sexStats.vagina.menstruation>>
-				<<foldout false "_menstruationFoldout">>
-					<span class="gold">Menstruation cycle</span>
-					Running: <<print $_menstruation.running ? "true" : "false">>
-					<<if $_menstruation.running>>
-						<br>
-						Current Day in cycle: <<print $_menstruation.currentDay>>
-						<br>
-						Last day in cycle: <<print $_menstruation.currentDaysMax>>
+		<<if $cycledisable is "f">>
+			<<set $_menstruation to $sexStats.vagina.menstruation>>
+			<<foldout false "_menstruationFoldout">>
+				<span class="gold">Menstruation cycle</span>
+				Running: <<print $_menstruation.running ? "true" : "false">>
+				<<if $_menstruation.running>>
+					<br>
+					Current Day in cycle: <<print $_menstruation.currentDay>>
+					<br>
+					Last day in cycle: <<print $_menstruation.currentDaysMax>>
+					<br>
+					Most risky days: <<print $_menstruation.stages[2]>>
+				<</if>>
+				<br>
+			<</foldout>>
+		<</if>>
+		<<foldout false "_pregnancyFoldout">>
+			<span class="gold">Pregnancy</span>
+			<<if canBeMPregnant()>>
+			<<elseif !$player.vaginaExist>>
+				Can not currently get pregnant.
+			<<elseif $_vPregnancy.type is "parasite">>
+				Parasites in the womb are preventing normal pregnancy from occuring.
+			<<elseif $_vPregnancy.type isnot null>>
+				Currently pregnant with: <<print $_vPregnancy.fetus.length>>
+					<<extraStatisticsPregnancyType $_vPregnancy.type>>
+				<br>
+				<<set $_days to pregnancyDaysEta($_vPregnancy)>>
+				<<if $_days lt 1>>
+					ETA: Anytime.
+				<<elseif $_days>>
+					ETA: <<print $_days>> day<<if $_days isnot 1>>s<</if>>.
+				<</if>>
+				<br>
+			<<else>>
+				Not currently pregnant.
+				<br>
+				<<if $pregnancytype is "realistic">>
+					<<set [_trackedNPCs, _spermArray] to spermObjectToArray($sexStats.vagina.sperm)>>
+					Number of sources of sperm that can get you pregnant: <<print _spermArray.length>>.
+					<<if _trackedNPCs.length>>
 						<br>
-						Most risky days: <<print $_menstruation.stages[2]>>
+						Those who's sperm you have inside you currently:
+						<ul>
+							<<for _name range _trackedNPCs>>
+								<li><<print pregnancyNameCorrection(_name.source)>></li>
+							<</for>>
+						</ul>
 					<</if>>
-					<br>
-				<</foldout>>
-			<</if>>
-			<<foldout false "_pregnancyFoldout">>
-				<span class="gold">Pregnancy</span>
-				<<if canBeMPregnant()>>
-				<<elseif !$player.vaginaExist>>
-					Can not currently get pregnant.
-				<<elseif $_vPregnancy.type is "parasite">>
+				<</if>>
+			<</if>>
+			<<if canBeMPregnant()>>
+				<<if $_aPregnancy.type is "parasite">>
 					Parasites in the womb are preventing normal pregnancy from occuring.
-				<<elseif $_vPregnancy.type isnot null>>
-					Currently pregnant with: <<print $_vPregnancy.fetus.length>>
-						<<extraStatisticsPregnancyType $_vPregnancy.type>>
+				<<elseif $_aPregnancy.type isnot null>>
+					Currently pregnant with: <<print $_aPregnancy.fetus.length>>
+					<<extraStatisticsPregnancyType $_aPregnancy.type>>
 					<br>
-					<<set $_days to pregnancyDaysEta($_vPregnancy)>>
+					<<set $_days to pregnancyDaysEta($_aPregnancy)>>
 					<<if $_days lt 1>>
 						ETA: Anytime.
 					<<elseif $_days>>
@@ -845,7 +874,7 @@
 					Not currently pregnant.
 					<br>
 					<<if $pregnancytype is "realistic">>
-						<<set [_trackedNPCs, _spermArray] to spermObjectToArray($sexStats.vagina.sperm)>>
+						<<set [_trackedNPCs, _spermArray] to spermObjectToArray($sexStats.anus.sperm)>>
 						Number of sources of sperm that can get you pregnant: <<print _spermArray.length>>.
 						<<if _trackedNPCs.length>>
 							<br>
@@ -858,63 +887,31 @@
 						<</if>>
 					<</if>>
 				<</if>>
-				<<if canBeMPregnant()>>
-					<<if $_aPregnancy.type is "parasite">>
-						Parasites in the womb are preventing normal pregnancy from occuring.
-					<<elseif $_aPregnancy.type isnot null>>
-						Currently pregnant with: <<print $_aPregnancy.fetus.length>>
-						<<extraStatisticsPregnancyType $_aPregnancy.type>>
-						<br>
-						<<set $_days to pregnancyDaysEta($_aPregnancy)>>
-						<<if $_days lt 1>>
-							ETA: Anytime.
-						<<elseif $_days>>
-							ETA: <<print $_days>> day<<if $_days isnot 1>>s<</if>>.
-						<</if>>
-						<br>
-					<<else>>
-						Not currently pregnant.
-						<br>
-						<<if $pregnancytype is "realistic">>
-							<<set [_trackedNPCs, _spermArray] to spermObjectToArray($sexStats.anus.sperm)>>
-							Number of sources of sperm that can get you pregnant: <<print _spermArray.length>>.
-							<<if _trackedNPCs.length>>
-								<br>
-								Those who's sperm you have inside you currently:
-								<ul>
-									<<for _name range _trackedNPCs>>
-										<li><<print pregnancyNameCorrection(_name.source)>></li>
-									<</for>>
-								</ul>
+			<</if>>
+		<</foldout>>
+		<<if $NPCName.find(npc => npc.pregnancy and npc.pregnancy.enabled isnot undefined)>>
+			<<foldout false "_npcPregnancyFoldout">>
+				<span class="gold">NPC Pregnancy</span>
+				<<for $_npc range $NPCName.filter(npc => npc.pregnancy and npc.pregnancy.enabled isnot undefined)>>
+					<div>
+						<<print $_npc.nam>>:
+						<<if !$_npc.pregnancy.enabled and !$_npc.pregnancy.fetus.length>>
+							Pregnancy for NPC disabled by the player.
+						<<elseif !$_npc.pregnancy.fetus.length>>
+							Not Pregnant.
+						<<elseif $_npc.pregnancy.fetus.length>>
+							Pregnant with <<print $_npc.pregnancy.fetus.length>>
+							<<extraStatisticsPregnancyType $_npc.pregnancy.type>>
+							<<set $_days to pregnancyDaysEta($_npc.pregnancy)>>
+							<<if $_days lt 1>>
+								ETA: Anytime.
+							<<elseif $_days>>
+								ETA: <<print $_days>> day<<if $_days isnot 1>>s<</if>>.
 							<</if>>
 						<</if>>
-					<</if>>
-				<</if>>
+					</div>
+				<</for>>
 			<</foldout>>
-			<<if $NPCName.find(npc => npc.pregnancy and npc.pregnancy.enabled isnot undefined)>>
-				<<foldout false "_npcPregnancyFoldout">>
-					<span class="gold">NPC Pregnancy</span>
-					<<for $_npc range $NPCName.filter(npc => npc.pregnancy and npc.pregnancy.enabled isnot undefined)>>
-						<div>
-							<<print $_npc.nam>>:
-							<<if !$_npc.pregnancy.enabled and !$_npc.pregnancy.fetus.length>>
-								Pregnancy for NPC disabled by the player.
-							<<elseif !$_npc.pregnancy.fetus.length>>
-								Not Pregnant.
-							<<elseif $_npc.pregnancy.fetus.length>>
-								Pregnant with <<print $_npc.pregnancy.fetus.length>>
-								<<extraStatisticsPregnancyType $_npc.pregnancy.type>>
-								<<set $_days to pregnancyDaysEta($_npc.pregnancy)>>
-								<<if $_days lt 1>>
-									ETA: Anytime.
-								<<elseif $_days>>
-									ETA: <<print $_days>> day<<if $_days isnot 1>>s<</if>>.
-								<</if>>
-							<</if>>
-						</div>
-					<</for>>
-				<</foldout>>
-			<</if>>
 		<</if>>
 	</div>
 <</widget>>
diff --git a/game/base-system/persistent-npcs.twee b/game/base-system/persistent-npcs.twee
index 0dd6795b5f..67d48bc4cf 100644
--- a/game/base-system/persistent-npcs.twee
+++ b/game/base-system/persistent-npcs.twee
@@ -97,8 +97,9 @@
 		<<set $_slot to _args[0]>>
 		<<if EventSystem.isSlotTaken($_slot)>>
 			<<set $storedNPCs[$_name] to {
-				/*ToDo: Pregnancy, call NPC compression function here*/
+				npc: npcCompressor($NPCList[$_slot]),
 			}>>
+			<<set _lastCompressedName to $_name>>
 		<<else>>
 			<<run Errors.report(`saveNPCPreg called with invalid or empty NPCList slot (${$_slot})`,
 			{
diff --git a/game/base-system/physicalAdjustments.twee b/game/base-system/physicalAdjustments.twee
index d1269d2822..110e3819e3 100644
--- a/game/base-system/physicalAdjustments.twee
+++ b/game/base-system/physicalAdjustments.twee
@@ -266,6 +266,9 @@
 		<</if>>
 	<</if>>
 	<<menstruationCycleState>>
+	<<if $parentList is undefined>>
+		<<set $parentList to parentFunction.parentList>>
+	<</if>>
 <</widget>>
 
 :: Widgets physicalAdjustments [widget]
diff --git a/game/base-system/pregnancy/children.twee b/game/base-system/pregnancy/children.twee
index 70c1be5077..42c91be7bf 100644
--- a/game/base-system/pregnancy/children.twee
+++ b/game/base-system/pregnancy/children.twee
@@ -158,6 +158,8 @@ args[3] - "both" to include unrelated children or "only" to exclude the player c
 	<</if>>
 	<<if _id>>
 		<<set $children[_id].localVariables.interactions = $children[_id].localVariables.interactions ? $children[_id].localVariables.interactions + 1 : 1>>
+		<<set $pregnancyStats.childInteractions++>>
+		<<if $location is "home">><<set $pregnancyStats.orphanageInteractions++>><</if>>
 	<</if>>
 <</silently>><</widget>>
 
@@ -577,13 +579,13 @@ args[3] - "both" to include unrelated children or "only" to exclude the player c
 		<div @id="'childViewerHidden-'+_args[0]" @class="'childViewerHidden' + (_args[1] ? '' : ' hidden')">
 			Mother:
 			<<if $children[_args[0]].motherKnown>>
-				<<print pregnancyUINameCorrection($children[_args[0]].mother)>>
+				<<print pregnancyNameCorrection($children[_args[0]].mother, true)>>
 			<<else>>
 				????
 			<</if>>
 			| Father:
 			<<if $children[_args[0]].fatherKnown>>
-				<<print pregnancyUINameCorrection($children[_args[0]].father)>>
+				<<print pregnancyNameCorrection($children[_args[0]].father, true)>>
 			<<else>>
 				????
 			<</if>>
@@ -591,9 +593,9 @@ args[3] - "both" to include unrelated children or "only" to exclude the player c
 			Born: <<print $children[_args[0]].born.day + " " + $children[_args[0]].born.month + " " + $children[_args[0]].born.year>> |
 			Age: <<childAge _args[0] "full">>
 			<br>
-			Size: <<print $children[_args[0]].features.size>> | Hair Colour: <<print $children[_args[0]].features.hairColour>>
+			Size: <<print $children[_args[0]].features.size>> | Hair Colour: <<hairmapcolourtext $children[_args[0]].features.hairColour>>
 			<<if $children[_args[0]].features.skinColour>>
-				| Skin Colour: <<print $children[_args[0]].features.skinColour>>
+				| Skin Colour: <<skinColourName $children[_args[0]].features.skinColour>>
 			<</if>>
 			<br>
 			<<if $children[_args[0]].features.identical>>
@@ -625,7 +627,7 @@ args[3] - "both" to include unrelated children or "only" to exclude the player c
 <<widget "childViewerHiddenElementsUnhide">>
 	<<capture _args>>
 		<<if _args[0]>>
-			<<toggleclass `'#childViewerHidden-'+_args[0]` "hidden">>
+			<<toggleclass `'#childViewerHidden-' + _args[0]` "hidden">>
 		<</if>>
 	<</capture>>
 <</widget>>
@@ -978,3 +980,14 @@ args[3] - "both" to include unrelated children or "only" to exclude the player c
 		<<print $children[_args[0]].localVariables.activity>>
 <</switch>>
 <</widget>>
+
+<<widget "skinColourName">><<silently>>
+<<switch _args[0]>>
+	<<case "ylight">><<set $_text_output to "light">>
+	<<case "ymedium">><<set $_text_output to "medium">>
+	<<case "ydark">><<set $_text_output to "dark">>
+	<<case "ghostlyPale">><<set $_text_output to "ghostly pale">>
+	<<default>><<set $_text_output to _args[0]>>
+<</switch>>
+<</silently>><<print $_text_output>>
+<</widget>>
diff --git a/game/base-system/pregnancy/childrenEvents.twee b/game/base-system/pregnancy/childrenEvents.twee
index bfbb65e917..30a574077f 100644
--- a/game/base-system/pregnancy/childrenEvents.twee
+++ b/game/base-system/pregnancy/childrenEvents.twee
@@ -87,7 +87,7 @@
 
 :: childBreastFeed
 
-<<breastfeed>>
+<<breastfeed>><<set $pregnancyStats.childBreastfedInteractions++>>
 <<if $worn.over_upper.name isnot "naked" or $worn.upper.name isnot "naked" or $worn.upper.name isnot "naked">>
 	You adjust your clothes to give <<childhim>> access to your <<breasts>>.
 <</if>>
@@ -141,9 +141,6 @@
 
 :: Childrens Home Toys
 
-<<switch $location>>
-	<<case "wolf_cave">><<set _transferToys to "wolf">>
-<</switch>>
 <<set _selectedCurrentToy to 0>>
 <<set _selectedLocationToy to 0>>
 
diff --git a/game/base-system/pregnancy/events.twee b/game/base-system/pregnancy/events.twee
index 8e1fc69697..89f5e3fe07 100644
--- a/game/base-system/pregnancy/events.twee
+++ b/game/base-system/pregnancy/events.twee
@@ -517,15 +517,11 @@ Player gets on the bed, midwife checking the player over and helping to prepare.
 Midwife give the ok to push
 <br><br>
 
-<<if $player.vaginaExist>>
-	<<set $_pregnancy to $sexStats.vagina.pregnancy>>
-<<else>>
-	<<set $_pregnancy to $sexStats.anus.pregnancy>>
-<</if>>
-<<if $_pregnancy.totalBirthEvents gte 5>>
+<<set _pregnancy to getPregnancyObject()>>
+<<if _pregnancy.totalBirthEvents gte 5>>
 	<<set _min to 15>>
 	<<set _max to 60>>
-<<elseif $_pregnancy.totalBirthEvents gte 3>>
+<<elseif _pregnancy.totalBirthEvents gte 3>>
 	<<set _min to 30>>
 	<<set _max to 120>>
 <<else>>
@@ -533,8 +529,8 @@ Midwife give the ok to push
 	<<set _max to 180>>
 <</if>>
 
-<<set _max to Math.floor(_max * (1 + Math.floor($_pregnancy.fetus.length * 0.2)))>>
-<<set _min to Math.floor(_min * (1 + Math.floor($_pregnancy.fetus.length * 0.2)))>>
+<<set _max to Math.floor(_max * (1 + Math.floor(_pregnancy.fetus.length * 0.2)))>>
+<<set _min to Math.floor(_min * (1 + Math.floor(_pregnancy.fetus.length * 0.2)))>>
 
 <<set $timeCalc to random(_min, _max)>>
 <<set _hours to Math.floor($timeCalc / 60)>>
@@ -686,10 +682,10 @@ The packaging said to wait 3 minutes, but it feels like an eternity passes. <<gs
 <<widget "pregnancyTest">>
 	<<if _args[0]>>
 		<<if $pregnancyTest gt 0>>
-			<<if $sexStats.vagina.pregnancy.awareOf isnot true>>
+			<<if getPregnancyObject().awareOf isnot true>>
 				<<link [[Take a pregnancy test (00:05)|pregnancyTest]]>><<pass 5>><<set $lastPassage to _args[0]>><</link>>
 				<br>
-			<<elseif $sexStats.vagina.pregnancy.awareOf is true>>
+			<<elseif getPregnancyObject().awareOf is true>>
 				<span class="lewd">You have a pregnancy test, but you already know you're pregnant.</span>
 				<br>
 			<</if>>
@@ -725,11 +721,7 @@ A technician enters the room and asks you to lie down and remove your outerwear.
 <<set $outside to 0>><<set $location to "hospital">><<effects>>
 
 You strip and lie down.
-<<if $player.vaginaExist>>
-	<<set _pregnancy to $sexStats.vagina.pregnancy>>
-<<else>>
-	<<set _pregnancy to $sexStats.anus.pregnancy>>
-<</if>>
+<<set _pregnancy to getPregnancyObject()>>
 <<if _pregnancy.timer lte _pregnancy.timerEnd * 0.3>>
 	"You're not far along enough for an abdominal ultrasound," the technician remarks. "But we can use the doppler to listen for cardiac activity."
 	The technician picks up a small handheld instrument, twists a dial and begins pressing a small circular wand against your lower abdomen.<br>
@@ -756,7 +748,6 @@ You strip and lie down.
 	Finally, she turns to you and asks if you'd like to see the pictures now.<br>
 	You nod nervously, and the technician swings the monitor toward your face.
 
-	/*<<set $_pregnancy to $sexStats.vagina.pregnancy>> */
 	<<if _pregnancy.fetus.length gt 1>>
 		<<set _multiple to true>>
 	<<else>>
diff --git a/game/base-system/pregnancy/pregnancy.twee b/game/base-system/pregnancy/pregnancy.twee
index c3553115fd..4a2cd2774c 100644
--- a/game/base-system/pregnancy/pregnancy.twee
+++ b/game/base-system/pregnancy/pregnancy.twee
@@ -174,7 +174,7 @@
 						/*Check for pregnancy at a reduced chance for a few days after*/
 						<<if _menstruation.currentDay lte _menstruation.stages[3] + 4>>
 							<<set $_multi = Math.clamp(Math.ceil(6 * (1 + _menstruation.currentDay - _menstruation.stages[3])),6,30)>>
-							<<playerPregnancyAttempt $_multi $_pregLocation`>>
+							<<playerPregnancyAttempt $_multi $_pregLocation>>
 						<</if>>
 						<<if _pills.pills["fertility booster"].doseTaken gte 2>>
 							<<set _menstruation.currentDay += 0.5>>
@@ -293,27 +293,18 @@
 
 /* Used for the passage where the player has given birth in */
 <<widget "playerPrebirth">>
-	<<if $player.vaginaExist>>
-		<<set $_pregnancy to $sexStats.vagina.pregnancy>>
-	<<else>>
-		<<set $_pregnancy to $sexStats.anus.pregnancy>>
-	<</if>>
-	<<set $_pregnancy.gaveBirth to true>>
+	<<set getPregnancyObject().gaveBirth to true>>
 <</widget>>
 
 /*args[0] - mother, args[1] - birth location, args[2] - location of where the clildren should go to, _args[3] - next passage, _args[4] - time passage*/
 /*args[0] - birth location, args[1] - location of where the clildren should go to, _args[2] - next passage, _args[3] - time passage*/
 <<widget "birthUi">>
 	<<if _args[0] is "pc">>
-		<<if $player.vaginaExist>>
-			<<set _pregnancyBirth to $sexStats.vagina.pregnancy>>
-		<<else>>
-			<<set _pregnancyBirth to $sexStats.anus.pregnancy>>
-		<</if>>
-	<<elseif C.npc[_args[0]] and C.npc[_args[0]].pregnancy>>
-		<<set _pregnancyBirth to C.npc[_args[0]].pregnancy>>
+		<<set _pregnancyBirth to getPregnancyObject()>>
+	<<elseif C.npc[_args[0]]>>
+		<<set _pregnancyBirth to getPregnancyObject(_args[0])>>
 	<</if>>
-	<<if _pregnancyBirth>>
+	<<if _pregnancyBirth and _pregnancyBirth.fetus>>
 		<div id="birthUi">
 			<<for _i to 0; _i lt _pregnancyBirth.fetus.length; _i++>>
 				<<capture _i>>
@@ -338,7 +329,7 @@
 			<</if>>
 		<</link>>
 	<<else>>
-
+		Error Pregnancy Object not found in the passage '<<print $passage>>'.
 	<</if>>
 <</widget>>
 
@@ -357,20 +348,20 @@
 			<br>
 			Mother:
 			<<if _pregnancyBirth.fetus[_args[1]].motherKnown>>
-				<<print pregnancyUINameCorrection(_pregnancyBirth.fetus[_args[1]].mother)>>
+				<<print pregnancyNameCorrection(_pregnancyBirth.fetus[_args[1]].mother, true)>>
 			<<else>>
 				????
 			<</if>>
 			| Father:
 			<<if _pregnancyBirth.fetus[_args[1]].fatherKnown>>
-				<<print pregnancyUINameCorrection(_pregnancyBirth.fetus[_args[1]].father)>>
+				<<print pregnancyNameCorrection(_pregnancyBirth.fetus[_args[1]].father, true)>>
 			<<else>>
 				????
 			<</if>>
 			<br>
-			Size: <<print _pregnancyBirth.fetus[_args[1]].features.size>> | Hair Colour: <<print _pregnancyBirth.fetus[_args[1]].features.hairColour>>
+			Size: <<print _pregnancyBirth.fetus[_args[1]].features.size>> | Hair Colour: <<hairmapcolourtext _pregnancyBirth.fetus[_args[1]].features.hairColour>>
 			<<if _pregnancyBirth.fetus[_args[1]].features.skinColour>>
-				| Skin Colour: <<print _pregnancyBirth.fetus[_args[1]].features.skinColour>>
+				| Skin Colour: <<skinColourName _pregnancyBirth.fetus[_args[1]].features.skinColour>>
 			<</if>>
 			<br>
 			<<if _pregnancyBirth.fetus[_args[1]].features.identical>>
@@ -407,14 +398,9 @@
 <</widget>>
 
 <<widget "wakingEffects">><<silently>>
-	/*ToDo: Pregnancy, remove 'or $pregnancyTesting' to properly enable*/
-	<<if !$sexStats.vagina.menstruation.running or $pregnancyTesting is undefined>>
+	<<if !$sexStats.vagina.menstruation.running>>
 	<<elseif _args[0] and $sexStats.vagina.menstruation.currentState is "pregnant" or ($sexStats.vagina.menstruation.currentState is "normal" and ($playerPregnancyHumanDisable is "f" or $playerPregnancyBeastDisable is "f"))>>
-		<<if $player.vaginaExist>>
-			<<set $_pregnancy to $sexStats.vagina.pregnancy>>
-		<<else>>
-			<<set $_pregnancy to $sexStats.anus.pregnancy>>
-		<</if>>
+		<<set $_pregnancy to getPregnancyObject()>>
 		<<set _wakingEffect to wakingPregnancyEvent()>>
 		<<if Array.isArray(_wakingEffect)>>
 			<<set _wakingEffect to _wakingEffect[random(0,_wakingEffect.length - 1)]>>
@@ -436,6 +422,7 @@
 				<<set $_text_output to "You wake to your <<breasts>> feeling more tender than normal. Thankfully, it passes.">>
 			<<case "bloated">>
 				<<set $_text_output to "You wake feeling a little bloated.">>
+				<<set $daily.bloated to random(1,2)>>
 			<<case "lightHeaded">>
 				<<set $_text_output to "You wake feeling a little lightheaded for a moment.">>
 			<<case "dizzy">>
@@ -539,6 +526,7 @@
 				<<set $_text_output to "You feel some cramping near your vagina.<<stress 5>><<gstress>><<pain 5>><<gpain>>">>
 			<<case "bloated">>
 				<<set $_text_output to "You feel a little bloated.<<stress 3>><<gstress>>">>
+				<<set $daily.bloated to random(1,2)>>
 			<<case "lightHeaded">>
 				<<set $_text_output to "You feel a little lightheaded for a moment.">>
 			<<case "dizzy">>
@@ -572,101 +560,102 @@
 
 /*ToDo: Pregnancy Story Content: Lacks content, small unique events for when the player's stress passes out due to their pregnancy*/
 <<widget "pregnancyWatersBrokenPassout">>
-	<<if $player.vaginaExist>>
-		<<set $_pregnancy to $sexStats.vagina.pregnancy>>
-	<<else>>
-		<<set $_pregnancy to $sexStats.anus.pregnancy>>
-	<</if>>
-	<<set $_pregnancy.waterBreaking to false>>
-	/*ToDo: Pregnancy - fill out for specific pregnancy passout events*/
-	/*Area specific passout text for alternative pregnancy birth events*/
-	<<switch _args[0]>>
-		<<case "asylum">>
-		<<case "forest">>
-			<<if $_pregnancy.type is "wolf">>
-				/*wolves help you if the pc is pregnant with wolves?*/
-			<<else>>
+	<<set $_pregnancy to getPregnancyObject()>>
+	<<if $_pregnancy.fetus>>
+		<<set $_pregnancy.waterBreaking to false>>
+		/*ToDo: Pregnancy - fill out for specific pregnancy passout events*/
+		/*Area specific passout text for alternative pregnancy birth events*/
+		<<switch _args[0]>>
+			<<case "asylum">>
+			<<case "forest">>
+				<<if $_pregnancy.type is "wolf">>
+					/*wolves help you if the pc is pregnant with wolves?*/
+				<<else>>
 
-			<</if>>
-		<<case "lake">>
-		<<case "tentacleworld">>
-			<<if $tentacleEntrance is "mirror">>
-				/*Entered vie the players bedroom mirror*/
-			<<else>>
-				/*Entered vie the asylum*/
-			<</if>>
-		<<case "farmroad">>
-			<<if $location is "farm" and $_pregnancy.potentialFathers.find(father => father.source === "Alex")>>
-				/*Alex can help here*/
-			<<else>>
+				<</if>>
+			<<case "lake">>
+			<<case "tentacleworld">>
+				<<if $tentacleEntrance is "mirror">>
+					/*Entered vie the players bedroom mirror*/
+				<<else>>
+					/*Entered vie the asylum*/
+				<</if>>
+			<<case "farmroad">>
+				<<if $location is "farm" and $_pregnancy.potentialFathers.find(father => father.source === "Alex")>>
+					/*Alex can help here*/
+				<<else>>
 
-			<</if>>
-		<<case "remy">>
-		<<case "remyAbduction">>
-		<<case "moor">>
-		<<case "alley">>
-		<<case "arcade">>
-		<<case "beach">>
-		<<case "bus">>
-		<<case "docksSneak">>
-		<<case "docks">>
-		<<case "home">>
-		<<case "hospital">>
-		<<case "trash">>
-		<<case "sea">>
-		<<case "shop">>
-		<<case "monsterTower">>
-		<<case "street">>
-		<<case "compound">>
-		<<case "temple">>
-		<<case "cave">>
-		<<case "prison">>
-		<<case "edencabin">>
-			<<if $_pregnancy.potentialFathers.find(father => father.source === "Eden")>>
-				/*Eden thinks it's his child?*/
-			<<else>>
+				<</if>>
+			<<case "remy">>
+			<<case "remyAbduction">>
+			<<case "moor">>
+			<<case "alley">>
+			<<case "arcade">>
+			<<case "beach">>
+			<<case "bus">>
+			<<case "docksSneak">>
+			<<case "docks">>
+			<<case "home">>
+			<<case "hospital">>
+			<<case "trash">>
+			<<case "sea">>
+			<<case "shop">>
+			<<case "monsterTower">>
+			<<case "street">>
+			<<case "compound">>
+			<<case "temple">>
+			<<case "cave">>
+			<<case "prison">>
+			<<case "edencabin">>
+				<<if $_pregnancy.potentialFathers.find(father => father.source === "Eden")>>
+					/*Eden thinks it's his child?*/
+				<<else>>
 
-			<</if>>
-		<<case "drain">>
-		<<case "school">>
-		<<case "schoolLibrarian">>
-			/*Wake up while being put in an ambulance?*/
-		<<case "adultShop">>
-		<<default>>
-			With your waters broken, you're too stressed to continue.
-	<</switch>>
-	<br><br>
-	/*Link for alternative pregnancy birth events*/
-	<<switch _args[0]>>
-		<<case "forest">>
-			<<if $_pregnancy.type is "wolf">>
-				/*wolves help you if the pc is pregnant with wolves?*/
-				<<link [[Next|Pregnancy Birth Hospital Wolf 3]]>><<set $stress -= 5000>><<endevent>><</link>>
-			<<else>>
-				<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
-			<</if>>
-		<<case "edencabin">>
-			<<if $_pregnancy.potentialFathers.find(father => father.source === "Eden")>>
-				/*Alternative place to give birth?*/
-				<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
-			<<else>>
-				<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
-			<</if>>
-		<<case "remy" "remyAbduction">>
-			/*Alternative place to give birth?*/
-			<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
-		<<case "farmroad">>
-			<<if $location is "farm" and $_pregnancy.potentialFathers.find(father => father.source === "Alex")>>
+				<</if>>
+			<<case "drain">>
+			<<case "school">>
+			<<case "schoolLibrarian">>
+				/*Wake up while being put in an ambulance?*/
+			<<case "adultShop">>
+			<<case "office">>
+			<<default>>
+				With your waters broken, you're too stressed to continue.
+		<</switch>>
+		<br><br>
+		/*Link for alternative pregnancy birth events*/
+		<<switch _args[0]>>
+			<<case "forest">>
+				<<if $_pregnancy.type is "wolf">>
+					/*wolves help you if the pc is pregnant with wolves?*/
+					<<link [[Next|Pregnancy Birth Hospital Wolf 3]]>><<set $stress -= 5000>><<endevent>><</link>>
+				<<else>>
+					<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
+				<</if>>
+			<<case "edencabin">>
+				<<if $_pregnancy.potentialFathers.find(father => father.source === "Eden")>>
+					/*Alternative place to give birth?*/
+					<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
+				<<else>>
+					<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
+				<</if>>
+			<<case "remy" "remyAbduction">>
 				/*Alternative place to give birth?*/
 				<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
-			<<else>>
+			<<case "farmroad">>
+				<<if $location is "farm" and $_pregnancy.potentialFathers.find(father => father.source === "Alex")>>
+					/*Alternative place to give birth?*/
+					<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
+				<<else>>
+					<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
+				<</if>>
+			<<case "hospital">>
+				<<link [[Next|Pregnancy Birth Hospital]]>><<set $stress -= 5000>><<endevent>><</link>>
+			<<default>>
 				<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
-			<</if>>
-		<<case "hospital">>
-			<<link [[Next|Pregnancy Birth Hospital]]>><<set $stress -= 5000>><<endevent>><</link>>
-		<<default>>
-			<<link [[Next|Pregnancy Birth Hospital Passout]]>><<set $stress -= 5000>><<endevent>><</link>>
-	<</switch>>
+		<</switch>>
+	<<else>>
+		Error Pregnancy Object not found in the passage '<<print $passage>>'.
+	<</if>>
 <</widget>>
 
 <<widget "pregnancyMorningAfterPill">>
@@ -692,13 +681,13 @@
 <</widget>>
 
 <<widget "pregnancyGendersText">><<silently>>
-	<<set _pregnancy to $sexStats.vagina.pregnancy>>
-	<<set _pregnancy.genderKnown to true>>
+	<<set $_pregnancy to getPregnancyObject()>>
+	<<set $_pregnancy.genderKnown to true>>
 	<<set $_genders to {m:0,f:0,h:0}>>
-	<<run _pregnancy.fetus.forEach(b => $_genders[b.gender]++)>>
-	<<if _pregnancy.fetus[0].features.identical is true>>
-		<<set $_text_output to "Doctor Harper thinks they are all identical <<if _pregnancy.fetus.length is 3>>triplets<<else>>twins<</if>> due to them all being the same gender and their facial features being similar.">>
-	<<elseif ($_genders.m is _pregnancy.fetus.length or $_genders.f is _pregnancy.fetus.length or $_genders.h is _pregnancy.fetus.length) and _pregnancy.fetus.length gt 1>>
+	<<run $_pregnancy.fetus.forEach(b => $_genders[b.gender]++)>>
+	<<if $_pregnancy.fetus[0].features.identical is true>>
+		<<set $_text_output to "Doctor Harper thinks they are all identical <<if $_pregnancy.fetus.length is 3>>triplets<<else>>twins<</if>> due to them all being the same gender and their facial features being similar.">>
+	<<elseif ($_genders.m is $_pregnancy.fetus.length or $_genders.f is $_pregnancy.fetus.length or $_genders.h is $_pregnancy.fetus.length) and $_pregnancy.fetus.length gt 1>>
 		<<set $_text_output to "Despite all being the same gender, Doctor Harper thinks they are not identical due to having slightly different facial features.">>
 	<<else>>
 		<<set $_text_output to "You have">>
@@ -794,9 +783,9 @@
 			<<set $NPCName[$NPCNameList.indexOf($_name)].pregnancy to {}>>
 		<</if>>
 		<<set $_pregnancy to $NPCName[$NPCNameList.indexOf($_name)].pregnancy>>
-		<<if !setup.pregnancy.infertile.includes($_name) and
-		setup.pregnancy.typesEnabled.includes($NPCName[$NPCNameList.indexOf($_name)].type) and
-		(($incompletePregnancyDisable is "f" and $NPCName[$NPCNameList.indexOf($_name)].pregnancy.enabled is undefined) or (setup.pregnancy.canBePregnant.includes($_name) and $NPCName[$NPCNameList.indexOf($_name)].pregnancy.enabled is undefined))>>
+		<<if !setup.pregnancy.infertile.includes($_name) and setup.pregnancy.typesEnabled.includes($NPCName[$NPCNameList.indexOf($_name)].type) and
+		(($incompletePregnancyDisable is "f" and $NPCName[$NPCNameList.indexOf($_name)].pregnancy.enabled is undefined and !setup.pregnancy.ignoresIncompeteCheck.includes($_name)) or 
+		(setup.pregnancy.canBePregnant.includes($_name) and $NPCName[$NPCNameList.indexOf($_name)].pregnancy.enabled is undefined))>>
 			<<set $_pregnancy.fetus to []>>
 			<<set $_pregnancy.givenBirth to 0>>
 			<<set $_pregnancy.totalBirthEvents to 0>>
@@ -846,7 +835,7 @@
 			<<default>><<set $_type to _args[1] ? 'babies' : 'baby'>>
 		<</switch>>
 		<<set $_babiesText to _args[1] ? `to some beautiful ${$_type}` : `to a beautiful ${$_type}`>>
-		<<if $parasite.left_ear.name is "slime" and $parasite.right_ear.name is "slime" or true>>
+		<<if $parasite.left_ear.name is "slime" and $parasite.right_ear.name is "slime">>
 			<span class="green">A fulfilled warmth fills you.</span>
 			You almost forget the strife of the world. You can tell it's the slimes in your ears, rewarding you for giving birth <<print $_babiesText>>.
 			<<lllcorruption>><<lltrauma>><<llstress>><<trauma -24>><<stress -24>><<corruption `Math.floor($corruption_slime * -0.4)`>>
@@ -863,7 +852,7 @@
 <<widget "fetishPregnancyImg">>
 	<<if _playerIsNowPregnant or _npcIsNowPregnant>>
 		<div class="impregnatedGrid">
-			<<if _playerIsPregnant>>
+			<<if _playerIsNowPregnant>>
 				<div @class="$options.images is 1 ? 'impregnated' : ''">
 					<div>
 						<<if _playerIsNowPregnant is "pc">>
@@ -884,7 +873,7 @@
 			<</if>>
 			<<if _npcIsNowPregnant>>
 				<div @class="$options.images is 1 ? 'impregnated' : ''">
-					<div><span class="lewd">You just impregnated <<print pregnancyNameCorrection(_npcIsNowPregnant, true)>>.</span></div>
+					<div><span class="lewd">You just impregnated <<print pregnancyNameCorrection(_npcIsNowPregnant)>>.</span></div>
 					<<if $options.images is 1>><img class="fertilization" src="img/sex/fertilization/fert6.gif"><</if>>
 				</div>
 			<</if>>
diff --git a/game/base-system/settings.twee b/game/base-system/settings.twee
index e17a7e3423..0332119908 100644
--- a/game/base-system/settings.twee
+++ b/game/base-system/settings.twee
@@ -69,7 +69,7 @@
 	<<set $clothesPriceSchool to 1>>
 	<<set $clothesPriceLewd to 1>>
 	<<set $furniturePriceFactor to 1>>
-	<<set $baseVaginalPregnancyChance to 80>>
+	<<set $basePlayerPregnancyChance to 80>>
 	<<set $baseNpcPregnancyChance to 8>>
 	<<set $humanPregnancyMonths to 3>>
 	<<set $wolfPregnancyWeeks to 4>>
@@ -934,10 +934,6 @@
 		<label><div class="settingsToggle">
 		<<checkbox "$parasitedisable" "t" "f" autocheck>> Enable parasites
 		</div></label>
-		/*ToDo: Pregnancy, remove duplicate option once enabled*/
-		<label><div class="settingsToggle">
-		<<checkbox "$parasitepregdisable" "t" "f" autocheck>> Enable parasitic pregnancy
-		</div></label>
 		<label><div class="settingsToggle">
 		<<checkbox "$tentacledisable" "t" "f" autocheck>> Enable tentacles
 		</div></label>
@@ -1150,13 +1146,13 @@
 	<div class="solidBorderContainer settings-container">
 		<span class="bold gold">Pregnancy Settings</span>
 		<div class="numberslider-group">
-			<div class="numberslider-inline basevaginalpregnancychance-container">
-				<span class="gold">Base Vaginal Pregnancy Chance</span>
+			<div class="numberslider-inline basePlayerPregnancyChance-container">
+				<span class="gold">Base Player Pregnancy Chance</span>
 				<div class="small-description">Chance of conceiving when only being inseminated once at the right time. Some events may leave you with more than one helping of cum. Other effects may modify the base chance, to both increase and decrease the chance of pregnancy.</div>
-				<<numberslider "$baseVaginalPregnancyChance" $baseVaginalPregnancyChance 0 96 4>>
+				<<numberslider "$basePlayerPregnancyChance" $basePlayerPregnancyChance 0 96 4>>
 			</div>
 		</div>
-		<<run $(() => { $('.basevaginalpregnancychance-container input').on('input change', e => {
+		<<run $(() => { $('.basePlayerPregnancyChance-container input').on('input change', e => {
 			let valSpan = $(e.currentTarget).siblings().first();
 			let value = valSpan.text();
 
diff --git a/game/base-system/text.twee b/game/base-system/text.twee
index 4330325c17..f6f2016dca 100644
--- a/game/base-system/text.twee
+++ b/game/base-system/text.twee
@@ -61,6 +61,8 @@
 <<widget "hairmapcolourtext">>
 	<<if _args[0] in setup.colours.hair_map>>
 		<<print setup.colours.hair_map[_args[0]].name>>
+	<<elseif _args[0] and !_colour>>
+		<<print _args[0]>>
 	<<else>>
 		<<print _colour>>
 	<</if>>
diff --git a/game/base-system/time.twee b/game/base-system/time.twee
index 1a61ff2062..754a544fe2 100644
--- a/game/base-system/time.twee
+++ b/game/base-system/time.twee
@@ -1325,15 +1325,12 @@
 				<</if>>
 			<</for>>
 		<</if>>
-
-		/*ToDo: Pregnancy, remove check to properly enable*/
-		<<if $pregnancyTesting>>
-			<<menstruationCycle "daily">>
-			<<pregnancyProgress>>
-			<<pregnancyProgress "anus">>
-			<<rutCycle>>
-			<<npcPregnancyCycle>>
-		<</if>>
+		<<menstruationCycle "daily">>
+		<<pregnancyProgress>>
+		<<pregnancyProgress "anus">>
+		<<rutCycle>>
+		<<npcPregnancyCycle>>
+		<<randomPregnancyProgress>>
 
 		<<if $robinPilloryFail>>
 			<<unset $robinPilloryFail>>
@@ -1381,12 +1378,9 @@
 	<<if $lake_ice_broken lte 0>>
 		<<unset $lake_ice_broken>>
 	<</if>>
-	/*ToDo: Pregnancy, remove check to properly enable*/
-	<<if $pregnancyTesting>>
-		<<menstruationCycle>>
-		<<pregnancyProgress>>
-		<<pregnancyProgress "anus">>
-	<</if>>
+	<<menstruationCycle>>
+	<<pregnancyProgress>>
+	<<pregnancyProgress "anus">>
 	<<unset $birdSleep>>
 	<<unset $glideScared>>
 	<<unset $edenbed>>
@@ -1466,9 +1460,7 @@
 			<<set $wolfevent to 1>>
 		<</if>>
 
-		/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-		<<if $pregnancyTesting is undefined>>
-		<<elseif $sexStats.vagina.menstruation.running and ($sexStats.vagina.menstruation.currentState is "pregnant" or ($sexStats.vagina.menstruation.currentState is "normal" and ($playerPregnancyHumanDisable is "f" or $playerPregnancyBeastDisable is "f")))>>
+		<<if $sexStats.vagina.menstruation.running and ($sexStats.vagina.menstruation.currentState is "pregnant" or ($sexStats.vagina.menstruation.currentState is "normal" and ($playerPregnancyHumanDisable is "f" or $playerPregnancyBeastDisable is "f")))>>
 			<<set $pregnancyDailyEvent to true>>
 		<</if>>
 		<<playerEndWaterProgress>>
diff --git a/game/overworld-forest/loc-asylum/widgets.twee b/game/overworld-forest/loc-asylum/widgets.twee
index dc243f6fdf..2828472496 100644
--- a/game/overworld-forest/loc-asylum/widgets.twee
+++ b/game/overworld-forest/loc-asylum/widgets.twee
@@ -499,8 +499,7 @@
 <</widget>>
 
 <<widget "passoutasylum">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "asylum">>
 	<<else>>
 		<<passout>>
diff --git a/game/overworld-forest/loc-cabin/main.twee b/game/overworld-forest/loc-cabin/main.twee
index 729d35f1e0..0f9801f9ed 100644
--- a/game/overworld-forest/loc-cabin/main.twee
+++ b/game/overworld-forest/loc-cabin/main.twee
@@ -27,8 +27,7 @@ You are in Eden's cabin.
 
 <<if $stress gte $stressmax and !$possessed>>
 	<br><br>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "edencabin">>
 	<<else>>
 		<<link [[Everything fades to black...|Eden Cabin Passout]]>><</link>>
@@ -1202,8 +1201,7 @@ You are in the clearing outside Eden's cabin. The surrounding trees are so huge
 	<br>
 	<<link [[Just say you removed it|Eden Collar Remove]]>><</link>>
 <<elseif $stress gte $stressmax>>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "edencabin">>
 	<<else>>
 		<<link [[Everything fades to black...|Eden Cabin Passout]]>><</link>>
diff --git a/game/overworld-forest/loc-churchyard/widgets.twee b/game/overworld-forest/loc-churchyard/widgets.twee
index 82923f452b..95c0e64103 100644
--- a/game/overworld-forest/loc-churchyard/widgets.twee
+++ b/game/overworld-forest/loc-churchyard/widgets.twee
@@ -398,7 +398,7 @@
 <</widget>>
 
 <<widget "passoutcatacombs">>
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "catacombs">>
 		<<if $worn.face.type.includes("blindfold")>>
 			<<set $worn.face.type.push("broken")>>
diff --git a/game/overworld-forest/loc-forest/widgets.twee b/game/overworld-forest/loc-forest/widgets.twee
index 9c50cb7df7..e291cb3a3e 100644
--- a/game/overworld-forest/loc-forest/widgets.twee
+++ b/game/overworld-forest/loc-forest/widgets.twee
@@ -976,8 +976,7 @@
 
 
 <<widget "passoutforest">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "forest">>
 	<<else>>
 		You've pushed yourself too much.
diff --git a/game/overworld-forest/loc-lake/widgets.twee b/game/overworld-forest/loc-lake/widgets.twee
index 711b96c8a2..0635976f16 100644
--- a/game/overworld-forest/loc-lake/widgets.twee
+++ b/game/overworld-forest/loc-lake/widgets.twee
@@ -57,8 +57,7 @@
 <</widget>>
 
 <<widget "passoutlake">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "lake">>
 	<<else>>
 		You've pushed yourself too much.
diff --git a/game/overworld-forest/loc-tentacle-world/main.twee b/game/overworld-forest/loc-tentacle-world/main.twee
index 22bad14453..68b19fe1c2 100644
--- a/game/overworld-forest/loc-tentacle-world/main.twee
+++ b/game/overworld-forest/loc-tentacle-world/main.twee
@@ -1,7 +1,6 @@
 :: Widgets Tentacle World [widget]
 <<widget "passouttentacleworld">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "tentacleworld">>
 	<<else>>
 		<<passout>>
diff --git a/game/overworld-forest/loc-wolfpack/pregnancyEvents.twee b/game/overworld-forest/loc-wolfpack/pregnancyEvents.twee
index 5d526e6ede..9db1439952 100644
--- a/game/overworld-forest/loc-wolfpack/pregnancyEvents.twee
+++ b/game/overworld-forest/loc-wolfpack/pregnancyEvents.twee
@@ -129,7 +129,7 @@
 	<<else>>
 		You draw closer to Black Wolf and reach out to touch them. <<bHe>> pulls back in anger at your show of pity towards <<bhim>>.
 		<br><br>
-		You rest your hand on Black Wolf's head and pat <<bhim>>.<<bHe's>> reluctant at first, but slowly eases into your touch. You catch a small glimpse of what may be <<bhis>> tail wagging.
+		You rest your hand on Black Wolf's head and pat <<bhim>>.<<bHe>>'s reluctant at first, but slowly eases into your touch. You catch a small glimpse of what may be <<bhis>> tail wagging.
 		<br><br>
 		You continue stroking <<bhis>> fur, before <<bhe>> shifts away. <<bHe>> must have had enough. You stand up and walk out of the cave, giving the wolf some peace.
 	<</if>>
@@ -173,22 +173,17 @@ You sit and wait at the cave entrance, with only the sound of whimpering to acco
 
 Having named your children, you hand them back to the Black Wolf. <<bHe>> remains in the cave for now, tenderly looking after the newborns.
 <br><br>
-<<silently>><<set $eventskip to 1>><<set $wolfevent to 0>><<endevent>><</silently>>
-<<destinationwolfcave>>
+<<link [[Next|Wolf Cave]]>><<set $eventskip to 1>><<set $wolfevent to 0>><<endevent>><</link>>
 
 /* Player Wolf Cave Pregnancy */
 :: Pregnancy Birth Wolf Cave 1
 <<set $outside to 0>><<set $location to "wolf_cave">><<effects>>
 
-<<if $player.vaginaExist>>
-	<<set $_pregnancy to $sexStats.vagina.pregnancy>>
-<<else>>
-	<<set $_pregnancy to $sexStats.anus.pregnancy>>
-<</if>>
-<<if $_pregnancy.totalBirthEvents gte 5>>
+<<set _pregnancy to getPregnancyObject()>>
+<<if _pregnancy.totalBirthEvents gte 5>>
 	<<set _min to 15>>
 	<<set _max to 60>>
-<<elseif $_pregnancy.totalBirthEvents gte 3>>
+<<elseif _pregnancy.totalBirthEvents gte 3>>
 	<<set _min to 30>>
 	<<set _max to 120>>
 <<else>>
@@ -196,8 +191,8 @@ Having named your children, you hand them back to the Black Wolf. <<bHe>> remain
 	<<set _max to 180>>
 <</if>>
 
-<<set _max to Math.floor(_max * (1 + Math.floor($_pregnancy.fetus.length * 0.2)))>>
-<<set _min to Math.floor(_min * (1 + Math.floor($_pregnancy.fetus.length * 0.2)))>>
+<<set _max to Math.floor(_max * (1 + Math.floor(_pregnancy.fetus.length * 0.2)))>>
+<<set _min to Math.floor(_min * (1 + Math.floor(_pregnancy.fetus.length * 0.2)))>>
 
 <<set $timeCalc to random(_min, _max)>>
 <<set _hours to Math.floor($timeCalc / 60)>>
@@ -286,17 +281,12 @@ Perhaps from your connection to them, the excruciating pain of delivery, or mayb
 <</if>>
 Having named them, you gather your children and carry them with the others. A secluded spot in the cave houses all the young and newborn pups from the pack. Your own children are quickly accepted into the group by the pups, as well as the <<wolf_cave_plural>> who look after them.
 <br><br>
-<<silently>><<clotheson>><<set $eventskip to 1>><<set $wolfevent to 0>><<endevent>><</silently>>
-<<destinationwolfcave>>
+<<link [[Next|Wolf Cave]]>><<clotheson>><<set $eventskip to 1>><<set $wolfevent to 0>><<endevent>><</link>>
 
 :: Player Presents Pregnancy To Black Wolf
 <<set $outside to 0>><<set $location to "wolf_cave">><<effects>>
 
-<<if $player.vaginaExist>>
-	<<set _pregnancy to $sexStats.vagina.pregnancy>>
-<<else>>
-	<<set _pregnancy to $sexStats.anus.pregnancy>>
-<</if>>
+<<set _pregnancy to getPregnancyObject()>>
 <<npc "Black Wolf">>
 <<setKnowsAboutPregnancy "pc" "Black Wolf">>
 
diff --git a/game/overworld-plains/loc-farm/widgets.twee b/game/overworld-plains/loc-farm/widgets.twee
index 63b0b09955..cb3e3754a4 100644
--- a/game/overworld-plains/loc-farm/widgets.twee
+++ b/game/overworld-plains/loc-farm/widgets.twee
@@ -71,8 +71,7 @@
 <</widget>>
 
 <<widget "passoutfarmroad">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "farmroad">>
 	<<else>>
 		<<passout>>
diff --git a/game/overworld-plains/loc-livestock/widgets.twee b/game/overworld-plains/loc-livestock/widgets.twee
index e89831831e..13081fca2f 100644
--- a/game/overworld-plains/loc-livestock/widgets.twee
+++ b/game/overworld-plains/loc-livestock/widgets.twee
@@ -232,8 +232,7 @@
 <</widget>>
 
 <<widget "passoutremy">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "remy">>
 	<<else>>
 		<<passout>>
diff --git a/game/overworld-plains/loc-moor/abduction.twee b/game/overworld-plains/loc-moor/abduction.twee
index 665bf01eee..4a05c89268 100644
--- a/game/overworld-plains/loc-moor/abduction.twee
+++ b/game/overworld-plains/loc-moor/abduction.twee
@@ -181,8 +181,7 @@ You are alone in a tent, tied to a chain buried in the earth. You hear snoring o
 <br><br>
 
 <<if $stress gte $stressmax>>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "remyAbduction">>
 	<<else>>
 		It's too much for you. You pass out.
@@ -258,8 +257,7 @@ You're marched across the moor, enduring the ogling stares of your captors.
 	<<moor_binding_text>>
 	<br><br>
 	<<if $stress gte $stressmax>>
-		/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-		<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+		<<if isPlayerNonparasitePregnancyEnding()>>
 			<<pregnancyWatersBrokenPassout "remyAbduction">>
 		<<else>>
 			It's too much for you. Your vision fades.
diff --git a/game/overworld-plains/loc-moor/widgets.twee b/game/overworld-plains/loc-moor/widgets.twee
index fe6eba7590..8a89fac30d 100644
--- a/game/overworld-plains/loc-moor/widgets.twee
+++ b/game/overworld-plains/loc-moor/widgets.twee
@@ -827,8 +827,7 @@
 <</widget>>
 
 <<widget "passout_moor">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "moor">>
 	<<else>>
 		<<passout>>
diff --git a/game/overworld-town/loc-adultshop/widgets.twee b/game/overworld-town/loc-adultshop/widgets.twee
index 04076699fd..c3b7e09048 100644
--- a/game/overworld-town/loc-adultshop/widgets.twee
+++ b/game/overworld-town/loc-adultshop/widgets.twee
@@ -682,8 +682,7 @@
 <</widget>>
 
 <<widget "passoutadultshop">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "adultShop">>
 	<<else>>
 		<<link [[Everything fades to black...|Adult Shop Passout Bondage]]>><</link>>
diff --git a/game/overworld-town/loc-alley/widgets.twee b/game/overworld-town/loc-alley/widgets.twee
index d43abc551f..619d5b438f 100644
--- a/game/overworld-town/loc-alley/widgets.twee
+++ b/game/overworld-town/loc-alley/widgets.twee
@@ -1,8 +1,7 @@
 :: Widgets Passout Alley [widget]
 
 <<widget "passoutalley">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "alley">>
 	<<else>>
 		<<link [[Everything fades to black...->Passout alley]]>><</link>>
diff --git a/game/overworld-town/loc-arcade/widgets.twee b/game/overworld-town/loc-arcade/widgets.twee
index a075181567..f7ce7a9aef 100644
--- a/game/overworld-town/loc-arcade/widgets.twee
+++ b/game/overworld-town/loc-arcade/widgets.twee
@@ -1,7 +1,6 @@
 :: Widgets Arcade [widget]
 <<widget "passoutarcade">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "arcade">>
 	<<else>>
 		<<link [[Everything fades to black...|Passout Arcade]]>><</link>>
diff --git a/game/overworld-town/loc-beach/events.twee b/game/overworld-town/loc-beach/events.twee
index 92d49ee685..45b00dd010 100644
--- a/game/overworld-town/loc-beach/events.twee
+++ b/game/overworld-town/loc-beach/events.twee
@@ -634,8 +634,7 @@ You wrap a towel around your nether regions, creating a makeshift skirt.
 <<link [[Next|Beach]]>><</link>>
 
 :: Passout Beach
-/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+<<if isPlayerNonparasitePregnancyEnding()>>
 	<<pregnancyWatersBrokenPassout "beach">>
 <<else>>
 	You've pushed yourself too much.
diff --git a/game/overworld-town/loc-beach/widgets.twee b/game/overworld-town/loc-beach/widgets.twee
index 18d0c971b9..ee9334a3a8 100644
--- a/game/overworld-town/loc-beach/widgets.twee
+++ b/game/overworld-town/loc-beach/widgets.twee
@@ -258,8 +258,7 @@
 :: Widgets Passout Beach [widget]
 
 <<widget "passoutbeach">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "beach">>
 	<<else>>
 		<<link [[Everything fades to black...->Passout Beach]]>><</link>>
diff --git a/game/overworld-town/loc-bus/main.twee b/game/overworld-town/loc-bus/main.twee
index 41b1d21caa..eaf9ae9acd 100644
--- a/game/overworld-town/loc-bus/main.twee
+++ b/game/overworld-town/loc-bus/main.twee
@@ -942,7 +942,7 @@ You give the <<person>> a patient smile and pat your baby bump.
 <<if $danger gte (9900 - $allure) and $rng gte 90>>
 	"Always wanted to fuck a pregnant <<girl>>," <<he>> says plainly. You quickly look away. <<stress 3>><<gstress>>
 <<else>>
-	<<set _pregnancy to $sexStats.vagina.pregnancy>>
+	<<set _pregnancy to getPregnancyObject()>>
 	<<His>> eyes light up, and he gently places <<his>> hand on your belly.
 	<<if between(Math.clamp(_pregnancy.timer / _pregnancy.timerEnd), 0.7, 1)>>
 		You feel your <<pregnancyBabyText 'pc'>> kick lightly. <<He>> feels it too. <<He>> gazes with a smile.
diff --git a/game/overworld-town/loc-bus/widgets.twee b/game/overworld-town/loc-bus/widgets.twee
index dfe822f71e..ea0579dd63 100644
--- a/game/overworld-town/loc-bus/widgets.twee
+++ b/game/overworld-town/loc-bus/widgets.twee
@@ -7,8 +7,7 @@
 :: Widget Passout Bus [widget]
 
 <<widget "passoutbus">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "bus">>
 	<<else>>
 		<<link [[Everything fades to black...->Passout bus]]>><</link>>
diff --git a/game/overworld-town/loc-docks/skulduggery.twee b/game/overworld-town/loc-docks/skulduggery.twee
index 3c1f243086..e61f9091e7 100644
--- a/game/overworld-town/loc-docks/skulduggery.twee
+++ b/game/overworld-town/loc-docks/skulduggery.twee
@@ -35,8 +35,7 @@ You successfully pick the lock, and sneak into restricted area of the docks.
 You are on the docks.
 
 <<if $stress gte $stressmax>>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "docksSneak">>
 	<<else>>
 		You've pushed yourself too much.
diff --git a/game/overworld-town/loc-docks/widgets.twee b/game/overworld-town/loc-docks/widgets.twee
index 1a6eac1f09..d7ad86a203 100644
--- a/game/overworld-town/loc-docks/widgets.twee
+++ b/game/overworld-town/loc-docks/widgets.twee
@@ -59,8 +59,7 @@
 <<widget "dockwork">>
 	<<set $dockhours += 1>>
 	<<if $stress gte $stressmax>>
-		/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-		<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+		<<if isPlayerNonparasitePregnancyEnding()>>
 			<<pregnancyWatersBrokenPassout "docks">>
 		<<else>>
 			You've pushed yourself too much.
diff --git a/game/overworld-town/loc-home/main.twee b/game/overworld-town/loc-home/main.twee
index acad48729a..1d1db48835 100644
--- a/game/overworld-town/loc-home/main.twee
+++ b/game/overworld-town/loc-home/main.twee
@@ -2712,8 +2712,7 @@ The warmth feels wonderful on your bare skin.
 
 :: Widget Passout Home [widget]
 <<widget "passouthome">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "home">>
 	<<else>>
 		<<link [[Everything fades to black...->Passout home]]>><</link>>
diff --git a/game/overworld-town/loc-hospital/main.twee b/game/overworld-town/loc-hospital/main.twee
index 1ba34ab069..5091fa7b98 100644
--- a/game/overworld-town/loc-hospital/main.twee
+++ b/game/overworld-town/loc-hospital/main.twee
@@ -92,8 +92,7 @@ You are inside the hospital foyer. <<if $psych is 1>>You see a sign directing to
 			<</if>>
 			<br>
 		<</if>>
-		/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-		<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+		<<if isPlayerNonparasitePregnancyEnding()>>
 			<<link [[Say that your waters have broken|Pregnancy Birth Hospital]]>><</link>>
 			<br>
 		<</if>>
@@ -138,11 +137,7 @@ You are inside the hospital foyer. <<if $psych is 1>>You see a sign directing to
 				<br>
 			<</if>>
 		<</if>>
-		<<if $player.vaginaExist>>
-			<<set _pregnancy to $sexStats.vagina.pregnancy>>
-		<<else>>
-			<<set _pregnancy to $sexStats.anus.pregnancy>>
-		<</if>>
+		<<set _pregnancy to getPregnancyObject()>>
 		<<if _pregnancy.awareOf is true and !$daily.ultrasoundDone and between(_pregnancy.timer / _pregnancy.timerEnd, 0.1, 1)>>
 			<<link [[Inquire about getting an ultrasound (0:10)|Pregnancy ultrasound]]>><<pass 10>><<set $daily.ultrasoundDone to true>><</link>>
 			<br>
@@ -359,8 +354,7 @@ You've pushed yourself too much.
 
 :: Widgets Passout Hospital [widget]
 <<widget "passouthospital">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "hospital">>
 	<<else>>
 		<<link [[Everything fades to black...->Passout hospital]]>><</link>>
diff --git a/game/overworld-town/loc-hospital/pharmacy.twee b/game/overworld-town/loc-hospital/pharmacy.twee
index c9637047bf..afa85aea0e 100644
--- a/game/overworld-town/loc-hospital/pharmacy.twee
+++ b/game/overworld-town/loc-hospital/pharmacy.twee
@@ -60,23 +60,20 @@
 	<br><br>
 	<<link [[Tube of anti-parasite cream|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["Anti-Parasite Cream"]>><</link>>
 	<br><br>
-	/*ToDo: Pregnancy, remove check to properly enable*/
-	<<if $pregnancyTesting>>
-		<<link [[Breast Pump|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["breast_pump"]>><</link>>
-		<br><br>
-		<<if $condomLvl gte 1>>
-			<<link [[Pack of 3 condoms|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["condoms"]>><</link>>
-			<br>
-		<</if>>
-		<<link [[Pack of 2 pregnancy tests|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["pregnancy_test"]>><</link>>
-		<br>
-		<<link [[Pack of 14 fertility pills|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["fertility_pills"]>><</link>>
-		<br>
-		<<link [[Pack of 14 contraceptive pills|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["contraceptive_pills"]>><</link>>
+	<<link [[Breast Pump|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["breast_pump"]>><</link>>
+	<br><br>
+	<<if $condomLvl gte 1>>
+		<<link [[Pack of 3 condoms|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["condoms"]>><</link>>
 		<br>
-		<<link [[Ask for the morning-after-pill|Pharmacy Morning After pill]]>><<set $pharmacyItem to setup.pharmacyItems["Morning_After_pill"]>><</link>>
-		<br><br>
 	<</if>>
+	<<link [[Pack of 2 pregnancy tests|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["pregnancy_test"]>><</link>>
+	<br>
+	<<link [[Pack of 14 fertility pills|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["fertility_pills"]>><</link>>
+	<br>
+	<<link [[Pack of 14 contraceptive pills|Pharmacy Sale]]>><<set $pharmacyItem to setup.pharmacyItems["contraceptive_pills"]>><</link>>
+	<br>
+	<<link [[Ask for the morning-after-pill|Pharmacy Morning After pill]]>><<set $pharmacyItem to setup.pharmacyItems["Morning_After_pill"]>><</link>>
+	<br><br>
 	<<link [[Take a look at the contact lenses display|Pharmacy Lenses]]>><</link>>
 	<<if !($daily.pharm.impatient gte 3) and $lenses_ordered.length gt 0>>
 		<br><<link [[Ask if your custom contact lenses arrived|Pharmacy Ask If Lenses Delivered]]>><</link>>
diff --git a/game/overworld-town/loc-landfill/widgets.twee b/game/overworld-town/loc-landfill/widgets.twee
index f573d1df52..f01c8c063d 100644
--- a/game/overworld-town/loc-landfill/widgets.twee
+++ b/game/overworld-town/loc-landfill/widgets.twee
@@ -164,8 +164,7 @@
 <</widget>>
 
 <<widget "passouttrash">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "trash">>
 	<<else>>
 		<<passout>>
diff --git a/game/overworld-town/loc-office/main.twee b/game/overworld-town/loc-office/main.twee
index a46519fdc6..e8ebb9ae1b 100644
--- a/game/overworld-town/loc-office/main.twee
+++ b/game/overworld-town/loc-office/main.twee
@@ -3,7 +3,11 @@
 The large building houses the offices of various businesses. You are in the lobby.
 <<if $stress gte $stressmax>>
 	<br><br>
-	<<officepassout>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
+		<<pregnancyWatersBrokenPassout "office">>
+	<<else>>
+		<<officepassout>>
+	<</if>>
 <<else>>
 	There is a large koi pond in the center of the room, in front of the security desk. Behind it are four glass lifts that travel to the upper floors.
 	<br>
diff --git a/game/overworld-town/loc-office/stairs.twee b/game/overworld-town/loc-office/stairs.twee
index cb6161835c..f0c0dceb0d 100644
--- a/game/overworld-town/loc-office/stairs.twee
+++ b/game/overworld-town/loc-office/stairs.twee
@@ -5,7 +5,11 @@ You are in the stairwell on <<checkfloor>>. Besides the sound of the AC fan blow
 As the stairwell doors lock from the inside, the only exit is in the lobby, <<number $officeFloor>> floors below.
 
 <<if $stress gte $stressmax>>
-	<<officepassout>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
+		<<pregnancyWatersBrokenPassout "office">>
+	<<else>>
+		<<officepassout>>
+	<</if>>
 <<else>>
 	<br><br>
 	<<link [[Rest (0:05)|Office Stairwell Rest]]>><<pass 5>><<tiredness -2>><</link>><<ltiredness>>
diff --git a/game/overworld-town/loc-office/streak.twee b/game/overworld-town/loc-office/streak.twee
index b9b1f58652..fba89d3826 100644
--- a/game/overworld-town/loc-office/streak.twee
+++ b/game/overworld-town/loc-office/streak.twee
@@ -5,7 +5,11 @@
 You are on <<checkfloor>>. You duck into an empty cubicle, hoping no one can see your <<lewdness>>.
 <<if $stress gte $stressmax>>
 	<br><br>
-	<<officepassout>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
+		<<pregnancyWatersBrokenPassout "office">>
+	<<else>>
+		<<officepassout>>
+	<</if>>
 <<else>>
 	The lifts are close, but the risk of someone seeing you is high.
 	<br>
diff --git a/game/overworld-town/loc-park/widgets.twee b/game/overworld-town/loc-park/widgets.twee
index f4f0941392..553aa39ded 100644
--- a/game/overworld-town/loc-park/widgets.twee
+++ b/game/overworld-town/loc-park/widgets.twee
@@ -1,7 +1,6 @@
 :: Widgets Park [widget]
 <<widget "passoutpark">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "park">>
 	<<else>>
 		<<link [[Everything fades to black...->Passout park]]>><</link>>
diff --git a/game/overworld-town/loc-prison/widgets.twee b/game/overworld-town/loc-prison/widgets.twee
index d7b15b1c88..a825051002 100644
--- a/game/overworld-town/loc-prison/widgets.twee
+++ b/game/overworld-town/loc-prison/widgets.twee
@@ -1477,8 +1477,7 @@
 <</silently>><<print _text_output>><</widget>>
 
 <<widget "passout_prison">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "prison">>
 	<<else>>
 		<<link [[Everything fades to black...->Passout Prison]]>><</link>>
diff --git a/game/overworld-town/loc-pub/fame.twee b/game/overworld-town/loc-pub/fame.twee
index 3854d7f042..512ede7f54 100644
--- a/game/overworld-town/loc-pub/fame.twee
+++ b/game/overworld-town/loc-pub/fame.twee
@@ -132,8 +132,7 @@
 	<<if $photo_known gte 2>>
 		<<set _pubfameOptions["Modelling fame"] to "model">>
 	<</if>>
-	<!-- ToDo: Pregnancy, remove $pregnancyTesting to properly enable -->
-	<<if $pregnancyTesting and ($sexStats.vagina.pregnancy.totalBirthEvents + $sexStats.anus.pregnancy.totalBirthEvents) gt 0>>
+	<<if $sexStats.vagina.pregnancy.totalBirthEvents + $sexStats.anus.pregnancy.totalBirthEvents gt 0>>
 		<<set _pubfameOptions["Pregnancy fame"] to "pregnancy">>
 	<</if>>
 
diff --git a/game/overworld-town/loc-pub/main.twee b/game/overworld-town/loc-pub/main.twee
index b4a8ebbd1a..3ad6d810ce 100644
--- a/game/overworld-town/loc-pub/main.twee
+++ b/game/overworld-town/loc-pub/main.twee
@@ -126,7 +126,7 @@
 	<<else>>
 		<<ind>><<link [[Ask for Landry|Pub Landry]]>><<endevent>><</link>>
 		<br>
-		<<if $sexStats.vagina.pregnancy.awareOf or $sexStats.anus.pregnancy.awareOf>>
+		<<if playerAwareTheyArePregnant()>>
 			You can't bring yourself to drink while you know you're with child.
 			<br>
 		<<else>>
diff --git a/game/overworld-town/loc-pub/seduction.twee b/game/overworld-town/loc-pub/seduction.twee
index 7ed596101d..190d17fc5d 100644
--- a/game/overworld-town/loc-pub/seduction.twee
+++ b/game/overworld-town/loc-pub/seduction.twee
@@ -73,7 +73,7 @@ You sit near the <<person>> and smile at <<him>>.
 		<<link [[Seduce (0:01)|Pub Seduce]]>><<pass 1>><</link>><<promiscuous2>>
 		<br>
 	<</if>>
-	<<if $sexStats.vagina.pregnancy.awareOf or $sexStats.anus.pregnancy.awareOf>>
+	<<if playerAwareTheyArePregnant()>>
 		You can't bring yourself to drink while you know you're with child.
 		<br>
 	<<else>>
diff --git a/game/overworld-town/loc-school/library.twee b/game/overworld-town/loc-school/library.twee
index be6d2a2f56..022b6699a9 100644
--- a/game/overworld-town/loc-school/library.twee
+++ b/game/overworld-town/loc-school/library.twee
@@ -645,8 +645,7 @@ You follow <<him>> down the corridor toward the entrance. "H-here," <<he>> says
 		Your consciousness is already slipping away, however.
 		<br><br>
 		<<endevent>>
-		/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-		<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+		<<if isPlayerNonparasitePregnancyEnding()>>
 			<<pregnancyWatersBrokenPassout "schoolLibrarian">>
 		<<else>>
 			<<ambulance>>
@@ -655,8 +654,7 @@ You follow <<him>> down the corridor toward the entrance. "H-here," <<he>> says
 		You try to speak, but instead burst into tears. You feel the librarian's arms around you as you pass out.
 		<br><br>
 		<<endevent>>
-		/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-		<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+		<<if isPlayerNonparasitePregnancyEnding()>>
 			<<pregnancyWatersBrokenPassout "schoolLibrarian">>
 		<<else>>
 			<<ambulance>>
diff --git a/game/overworld-town/loc-school/main.twee b/game/overworld-town/loc-school/main.twee
index 498c2f0ee5..683f38f4e6 100644
--- a/game/overworld-town/loc-school/main.twee
+++ b/game/overworld-town/loc-school/main.twee
@@ -628,9 +628,8 @@ You haul yourself over the fence and drop down on the other side.
 <br>
 
 :: School Passout
-/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
 <<sydneySchedule>>
-<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+<<if isPlayerNonparasitePregnancyEnding()>>
 	<<pregnancyWatersBrokenPassout "school">>
 <<elseif _sydney_location is "library" and ($NPCName[$NPCNameList.indexOf("Sydney")].init isnot 1 or ($sydneySeen and !$sydneySeen.includes("libRescue")) or $rng gte 20)>>
 	<<pass 1 hour>>
diff --git a/game/overworld-town/loc-sea/widgets.twee b/game/overworld-town/loc-sea/widgets.twee
index e51e3601f4..e8f4937064 100644
--- a/game/overworld-town/loc-sea/widgets.twee
+++ b/game/overworld-town/loc-sea/widgets.twee
@@ -361,8 +361,7 @@
 <</widget>>
 
 <<widget "passoutsea">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "sea">>
 	<<else>>
 		<<link [[Everything fades to black|Passout Sea]]>><</link>>
diff --git a/game/overworld-town/loc-shop/main.twee b/game/overworld-town/loc-shop/main.twee
index 6a503b5a1b..3a9129ca10 100644
--- a/game/overworld-town/loc-shop/main.twee
+++ b/game/overworld-town/loc-shop/main.twee
@@ -160,8 +160,7 @@
 
 :: Widgets Passout Shop [widget]
 <<widget "passoutshop">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "shop">>
 	<<else>>
 		<<link [[Everything fades to black...|Passout Shop]]>><</link>>
diff --git a/game/overworld-town/loc-street/events.twee b/game/overworld-town/loc-street/events.twee
index 9193b760d4..1b09e72a82 100644
--- a/game/overworld-town/loc-street/events.twee
+++ b/game/overworld-town/loc-street/events.twee
@@ -4577,8 +4577,7 @@ You are in a <<if $NPCList[0].monster is "monster">>strange, monstrous <<if $NPC
 :: Passout Monster Tower
 <<set $bus to "elk">><<set $outside to 0>><<effects>>
 <<endevent>>
-/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+<<if isPlayerNonparasitePregnancyEnding()>>
 	<<pregnancyWatersBrokenPassout "monsterTower">>
 <<else>>
 	<<passout>>
diff --git a/game/overworld-town/loc-street/widgets.twee b/game/overworld-town/loc-street/widgets.twee
index dadd8bec26..6b58bd6705 100644
--- a/game/overworld-town/loc-street/widgets.twee
+++ b/game/overworld-town/loc-street/widgets.twee
@@ -2251,8 +2251,7 @@
 
 :: Widget Passout Street [widget]
 <<widget "passoutstreet">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "street">>
 	<<else>>
 		<<link [[Everything fades to black...->Passout street]]>><</link>>
@@ -2497,8 +2496,7 @@
 <</widget>>
 
 <<widget "passoutcompound">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "compound">>
 	<<else>>
 		You've pushed yourself too much. You black out.
@@ -3118,8 +3116,7 @@
 			<<elseif $dangerevent lte 200>>
 				<<streetstray>>
 			<<elseif $dangerevent lte 210>>
-				/*ToDo: Pregnancy, remove first variable check to properly enable*/
-				<<if $pregnancyTesting and $condomLvl gte 1 and ["wolf", "nightingale", "cliff", "starfish", "high"].includes($bus) and $days gte 4>>
+				<<if $condomLvl gte 1 and ["wolf", "nightingale", "cliff", "starfish", "high"].includes($bus) and $days gte 4>>
 					<<streetabstinence>>
 				<<else>>
 					<<eventsstreetday>>
diff --git a/game/overworld-town/loc-temple/widgets.twee b/game/overworld-town/loc-temple/widgets.twee
index 05073e1b48..d9e59a5dde 100644
--- a/game/overworld-town/loc-temple/widgets.twee
+++ b/game/overworld-town/loc-temple/widgets.twee
@@ -281,8 +281,7 @@
 <</widget>>
 
 <<widget "passouttemple">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "temple">>
 	<<else>>
 		You've pushed yourself too much.
diff --git a/game/overworld-town/special-kylar/main.twee b/game/overworld-town/special-kylar/main.twee
index cf6ffd0870..f679aa8237 100644
--- a/game/overworld-town/special-kylar/main.twee
+++ b/game/overworld-town/special-kylar/main.twee
@@ -4352,7 +4352,6 @@ When <<he>> finishes, <<he>> opens <<his>> mouth to say something. You turn away
 :: Kylar Parasites Feed
 <<set $outside to 0>><<set $location to "home">><<effects>>
 <<set _container to $container[$location]>>
-<<set _pregnancy to $sexStats.anus.pregnancy>>
 
 Nothing seems to be amiss, until you check in on <<print ($pregnancyStats.namesParasitesChild is true ? "your children" : "the parasites")>>.
 <br><br>
diff --git a/game/overworld-town/special-nightmares/widgets.twee b/game/overworld-town/special-nightmares/widgets.twee
index aef28289ce..dfc881f29e 100644
--- a/game/overworld-town/special-nightmares/widgets.twee
+++ b/game/overworld-town/special-nightmares/widgets.twee
@@ -66,7 +66,7 @@
 	<<set $real_transformationParts to clone($transformationParts)>>
 	<<set $real_purity to $purity>>
 
-	/*ToDo: Pregnancy, make sure toggle is temporarily disabled for nightmares*/
+	/*Note: Normal Pregnancy is diabled by directly checking for $activeNightmare*/
 	<<set $real_rebuy to $clothingrebuy>>
 	<<set $clothingrebuy to 0>>
 	<<set $real_parasitepregdisable to $parasitepregdisable>>
@@ -118,7 +118,7 @@
 	<<set $worn to clone($real_worn)>><<unset $real_worn>>
 	<<set $skin to clone($real_skin)>><<unset $real_skin>>
 
-	/*ToDo: Pregnancy, make sure toggle is re-enabled after nightmares if applicable*/
+	/*Note: Normal Pregnancy is diabled by directly checking for $activeNightmare*/
 	<<set $clothingrebuy to $real_rebuy>><<unset $real_rebuy>>
 	<<set $parasitepregdisable to $real_parasitepregdisable>><<unset $real_parasitepregdisable>>
 
diff --git a/game/overworld-town/special-whitney/street.twee b/game/overworld-town/special-whitney/street.twee
index 02a3e13617..584a548b30 100644
--- a/game/overworld-town/special-whitney/street.twee
+++ b/game/overworld-town/special-whitney/street.twee
@@ -791,8 +791,12 @@
 	<<if $submissive gte 1150>>
 		You give Whitney a pleading look over your shoulder. <<He>> glares, but relents, sending you away with a shove. You scurry onwards.
 	<<elseif $submissive lte 850>>
-		/*ToDo: Pregnancy, account for Whitney being preggers(?)*/
-		You jab your elbow into Whitney's gut. <<He>> releases you with a wheeze. <<He>> shoots you a sour look before leading <<his>> friends away.
+		<<if npcBellySize("Whitney") gte 8>>
+			You push Whitney away. <<He>> instinctively releases you.
+		<<else>>
+			You jab your elbow into Whitney's gut. <<He>> releases you with a wheeze.
+		<</if>>
+		<<He>> shoots you a sour look before leading <<his>> friends away.
 	<<else>>
 		You twist out of Whitney's grasp. <<He>> makes another grab for you, but you duck under <<his>> arm and hurry ahead. <<He>> doesn't follow.
 	<</if>>
diff --git a/game/overworld-underground/loc-cave/widgets.twee b/game/overworld-underground/loc-cave/widgets.twee
index 69749303f1..77ff722f44 100644
--- a/game/overworld-underground/loc-cave/widgets.twee
+++ b/game/overworld-underground/loc-cave/widgets.twee
@@ -397,8 +397,7 @@
 <</widget>>
 
 <<widget "passoutcave">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "cave">>
 	<<else>>
 		It's too much. You pass out.
diff --git a/game/overworld-underground/loc-sewers/main.twee b/game/overworld-underground/loc-sewers/main.twee
index 145283ecca..1e40a3f960 100644
--- a/game/overworld-underground/loc-sewers/main.twee
+++ b/game/overworld-underground/loc-sewers/main.twee
@@ -172,8 +172,7 @@ You can access several parts of town from here.
 <<set $eventskip to 0>>
 
 :: Passout Drain
-/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+<<if isPlayerNonparasitePregnancyEnding()>>
 	<<pregnancyWatersBrokenPassout "drain">>
 <<else>>
 	You've pushed yourself too much.
@@ -696,8 +695,7 @@ The water pulls you further along the tunnel.
 :: Drain Water Passout
 
 <<effects>>
-/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+<<if isPlayerNonparasitePregnancyEnding()>>
 	<<pregnancyWatersBrokenPassout "drain">>
 <<else>>
 	<<passout>>
diff --git a/game/overworld-underground/loc-sewers/widgets.twee b/game/overworld-underground/loc-sewers/widgets.twee
index 4b5dc63014..e14d6ca4ca 100644
--- a/game/overworld-underground/loc-sewers/widgets.twee
+++ b/game/overworld-underground/loc-sewers/widgets.twee
@@ -55,8 +55,7 @@
 :: Widgets Passout Drain [widget]
 
 <<widget "passoutdrain">>
-	/*ToDo: Pregnancy, remove $pregnancyTesting to properly enable*/
-	<<if isPlayerNonparasitePregnancyEnding() and $pregnancyTesting>>
+	<<if isPlayerNonparasitePregnancyEnding()>>
 		<<pregnancyWatersBrokenPassout "drain">>
 	<<else>>
 		<<link [[Everything fades to black...->Passout Drain]]>><</link>>
-- 
GitLab