code:
App.EndWeek.Player.hormones = function(PC, selfManufactured, hormonePower) {
	const r = [];

	const gigantomastiaMod = PC.geneticQuirks.gigantomastia === 2 ? (PC.geneticQuirks.macromastia === 2 ? 3 : 2) : 1;
	const rearLipedemaMod = PC.geneticQuirks.rearLipedema === 2 ? 1 : 0;
	const boobSize = PC.boobs - PC.boobsImplant - PC.boobsMilk;
	const buttSize = PC.butt - PC.buttImplant;
	let normBreasts;
	let normButt;
	const faceValue = PC.face - PC.faceImplant;
	const effects = [];
	let faceShape = 0;
	let faceInc = 0;

	hormoneBalance();
	if (V.hormoneUpgradeMood === 0 || !selfManufactured) {
		moodConflict();
	}
	if (PC.physicalAge >= 18 || V.loliGrow === 0 || PC.geneMods.NCS === 1) {
		hormonesEffects();
	}

	return r.join(" ");

	function hormoneBalance() {
		if (PC.hormoneBalance <= -400) {
			r.push(`You are overflowing with masculine hormones`);
			if (PC.hormones === 1) {
				r.push(`and taking female ones in an attempt to balance things out.`);
			} else if (PC.hormones === -1) {
				r.push(r.pop() + `, supported through your continued use of artificial ones.`);
			} else {
				r.push(r.pop() + `, but lack the means to maintain such a state and will slowly regress to a more normal balance over time.`);
			}
		} else if (PC.hormoneBalance <= -300) {
			r.push(`Your system is completely flooded with male hormones`);
		} else if (PC.hormoneBalance <= -200) {
			r.push(`Your body is awash with masculine hormones`);
		} else if (PC.hormoneBalance <= -100) {
			r.push(`Your hormone balance is overly masculine.`);
		} else if (PC.hormoneBalance < -20) {
			if (PC.hormones === 0 && PC.genes === "XY") {
				r.push(`Your hormone balance is normal.`);
			} else {
				r.push(`You have a masculine hormone balance`);
				if (PC.hormones === 1) {
					r.push(r.pop() + `, but are taking female ones in an attempt to become feminine.`);
				} else if (PC.hormones === -1) {
					r.push(`being supplemented by your use of artificial hormones.`);
				} else {
					r.push(r.pop() + `.`);
				}
			}
		} else if (PC.hormoneBalance >= 400) {
			r.push(`You are overflowing with feminine hormones`);
			if (PC.hormones === -1) {
				r.push(`and taking male ones in an attempt to balance things out.`);
			} else if (PC.hormones === 1) {
				r.push(r.pop() + `, supported through your continued use of artificial ones.`);
			} else {
				r.push(r.pop() + `, but lack the means to maintain such a state and will slowly regress to a more normal balance over time.`);
			}
		} else if (PC.hormoneBalance >= 300) {
			r.push(`Your system is completely flooded with female hormones`);
		} else if (PC.hormoneBalance >= 200) {
			r.push(`Your body is awash with feminine hormones`);
		} else if (PC.hormoneBalance >= 100) {
			r.push(`Your hormone balance is overly feminine.`);
		} else if (PC.hormoneBalance > 20) {
			if (PC.hormones === 0 && PC.genes === "XX") {
				r.push(`Your hormone balance is normal.`);
			} else {
				r.push(`You have a feminine hormone balance`);
				if (PC.hormones === -1) {
					r.push(r.pop() + `, but are taking male ones in an attempt to become more masculine.`);
				} else if (PC.hormones === 1) {
					r.push(`being supplemented by your use of artificial hormones.`);
				} else {
					r.push(r.pop() + `.`);
				}
			}
		} else {
			r.push(`Your hormone balance is very androgynous`);
			if (PC.hormones === 1) {
				r.push(r.pop() + `, but are taking male hormones in an attempt to become more masculine.`);
			} else if (PC.hormones === -1) {
				r.push(r.pop() + `, but are taking female hormones in an attempt to become more feminine.`);
			} else {
				r.push(r.pop() + `.`);
			}
		}
		if (PC.hormoneBalance > -400 && PC.hormoneBalance <= -100) {
			if (PC.hormones === 1) {
				r.push(r.pop() + `, but you are taking female ones in an attempt to balance things out.`);
			} else if (PC.hormones === -1) {
				r.push(`and further bolstered by your use of artificial ones.`);
			} else {
				r.push(r.pop() + `, but will slowly regress to a more normal balance unless supplemented.`);
			}
		} else if (PC.hormoneBalance < 400 && PC.hormoneBalance >= 100) {
			if (PC.hormones === -1) {
				r.push(r.pop() + `, but you are taking male ones in an attempt to balance things out.`);
			} else if (PC.hormones === 1) {
				r.push(`and further bolstered by your use of artificial ones.`);
			} else {
				r.push(r.pop() + `, but will slowly regress to a more normal balance unless supplemented.`);
			}
		}
	}

	function moodConflict() {
		if ((PC.hormoneBalance > 20 && PC.genes === "XY" && PC.balls !== 0 && PC.ballType !== "sterile") || (PC.hormoneBalance < -20 && PC.genes === "XX" && (PC.ovaries !== 0 || PC.mpreg !== 0))) {
			r.push(`Your altered hormonal balance conflicts with your natural hormones, causing occasional moodiness.`);
			if (PC.energy > 10) {
				r.push(`These clashing hormones also have the frustrating effect of <span class="libido dec">disrupting your sex drive.</span>`);
				PC.energy--;
			}
		}
	}

	function hormonesEffects() {
		if (Math.abs(PC.hormoneBalance) >= 50) {
			if (PC.hormoneBalance > 30 && PC.geneMods.NCS !== 1) {
				/* 'Expected' breast size based on weight for feminine-bodied player. Masculine-bodied takes a small hit. */
				normBreasts = Math.trunc((100 + (PC.weight + 100) * 5 + 2 * PC.lactationAdaptation) * (0.85 + PC.hormoneBalance / 400) * gigantomastiaMod / Math.max(PC.title * 1.25,  1));
				normButt = ((PC.weight + 100) * 0.025 * (0.9 + PC.hormoneBalance / 600) * (rearLipedemaMod / 2 + 1) / Math.max(PC.title * 1.10,  1));
			}

			if (PC.hormoneBalance >= 350) {
				if (PC.geneMods.NCS === 1) {
					if ((PC.shoulders + Math.abs(PC.shouldersImplant)) > -1 && PC.shoulders > -2 && random(1, 100) < (40 + (20 * hormonePower))) {
						effects.push(`<span class="change positive">shoulders to narrow`);
						PC.shoulders--;
					}
				} else if (PC.physicalAge < 25) {
					if (PC.shoulders + Math.abs(PC.shouldersImplant) > -1 && PC.shoulders > -2 && random(1, 100) < 20 + (10 * hormonePower)) {
						effects.push(`<span class="change positive">shoulders to narrow`);
						PC.shoulders--;
					}
					if (PC.geneMods.NCS === 0 && PC.hips - (Math.abs(PC.hipsImplant)) < 1 && PC.hips < 2 && random(1, 100) <= 20 + (10 * hormonePower)) {
						effects.push(`<span class="change positive">hips to widen`);
						PC.hips++;
					}
				}

				if (PC.faceImplant < 5) {
					if (PC.faceShape === "masculine") {
						faceShape = "androgynous";
					} else if (PC.faceShape === "androgynous" && PC.geneticQuirks.androgyny !== 2) {
						faceShape = "normal";
					} else if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.faceShape === "normal") {
						faceShape = "cute";
					}
				}
				if (faceValue < 50 && PC.face < 75) {
					effects.push(`<span class="change positive">facial structure to soften`);
					faceInc = 1 + hormonePower;
					if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
						faceInc *= 2;
					}
					faceIncreaseAction(PC, faceInc);
				}

				if (PC.voice.isBetween(0, 3)) {
					effects.push(`<span class="change positive">voice to heighten`);
					PC.voice++;
				}

				if (PC.muscles > 10 && PC.diet !== "muscle building" && PC.drugs !== "steroids" && (PC.geneticQuirks.mGain !== 2 || PC.geneticQuirks.mLoss === 2)) {
					effects.push(`<span class="change negative">muscles to lose mass`);
					PC.muscles -= 2 + hormonePower + PC.geneticQuirks.mLoss;
					if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
						PC.muscles -= 2 + hormonePower + PC.geneticQuirks.mLoss;
					}
				}
				if (PC.waist > -30) {
					effects.push(`<span class="change positive">waist to narrow`);
					PC.waist = Math.clamp(PC.waist - (2 + hormonePower), -30, 100);
				}

				if (PC.geneMods.NCS === 0) {
					if (boobSize < 0.9 * normBreasts) {
						/* Grow to 90% of normBreasts */
						effects.push(`<span class="change positive">breasts to slightly grow`);
						PC.boobs += 25;
					}
					if (PC.nipples === "tiny") {
						effects.push(`<span class="change positive">tiny nipples to enlarge`);
						PC.nipples = "cute";
					}
					if (buttSize < Math.trunc(4.5 * normButt) / 5) {
						/* 90% of normButt, rounded down to the next increment of .2 */
						effects.push(`<span class="change positive">butt to swell`);
						PC.butt += 0.2;
					}
				}
				if (PC.vagina > -1 && PC.ovaries !== 0 && PC.vaginaLube < 2) {
					effects.push(`<span class="change positive">pussy to produce more lubricant`);
					PC.vaginaLube++;
				}

				if (V.hormoneUpgradeShrinkage === 0 || !selfManufactured) {
					if (PC.dick > 1) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.dick > 2) {
							effects.push(`<span class="change negative">dick to greatly shrink`);
							PC.dick -= 1;
						} else {
							effects.push(`<span class="change negative">dick to shrink`);
						}
						PC.dick--;
					}
					if (PC.balls > 1) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.balls > 2) {
							effects.push(`<span class="change negative">testicles to heavily atrophy`);
							PC.balls -= 1;
						} else {
							effects.push(`<span class="change negative">testicles to atrophy`);
						}
						PC.balls--;
					}
					if (PC.clit > 0) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.clit > 1) {
							effects.push(`<span class="change negative">clit to greatly shrink`);
							PC.clit -= 1;
						} else {
							effects.push(`<span class="change negative">clit to shrink`);
						}
						PC.clit--;
					}
				}
			} else if (PC.hormoneBalance >= 300) {
				if (PC.faceImplant < 5) {
					if (PC.faceShape === "masculine") {
						faceShape = "androgynous";
					} else if (PC.faceShape === "androgynous" && PC.geneticQuirks.androgyny !== 2) {
						faceShape = "normal";
					} else if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.faceShape === "normal") {
						faceShape = "cute";
					}
				}
				if (faceValue < 30 && PC.face < 60) {
					effects.push(`<span class="change positive">facial structure to soften`);
					faceInc = 1 + hormonePower;
					if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
						faceInc *= 2;
					}
					faceIncreaseAction(PC, faceInc);
				}

				if (PC.voice.isBetween(0, 3)) {
					effects.push(`<span class="change positive">voice to heighten`);
					PC.voice++;
				}

				if (PC.muscles > 30 && PC.diet !== "muscle building" && PC.drugs !== "steroids" && (PC.geneticQuirks.mGain !== 2 || PC.geneticQuirks.mLoss === 2)) {
					effects.push(`<span class="change negative">muscles to lose mass`);
					PC.muscles -= 2 + hormonePower + PC.geneticQuirks.mLoss;
					if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
						PC.muscles -= 2 + hormonePower + PC.geneticQuirks.mLoss;
					}
				}
				if (PC.waist > -10) {
					effects.push(`<span class="change positive">waist to narrow`);
					PC.waist = Math.clamp(PC.waist - (2 + hormonePower), -10, 100);
				}

				if (PC.geneMods.NCS === 0) {
					if (boobSize < 0.8 * normBreasts) {
						/* Grow to 80% of expected */
						effects.push(`<span class="change positive">breasts to slightly grow`);
						PC.boobs += 25;
					}
					if (PC.nipples === "tiny") {
						effects.push(`<span class="change positive">tiny nipples to enlarge`);
						PC.nipples = "cute";
					}
					if (buttSize < Math.trunc(4 * normButt) / 5) {
						/* 80% of normButt, rounded down to the next increment of .2 */
						effects.push(`<span class="change positive">butt to swell`);
						PC.butt += 0.2;
					}
				}
				if (PC.vagina > -1 && PC.ovaries !== 0 && PC.vaginaLube < 2) {
					effects.push(`<span class="change positive">pussy to produce more lubricant`);
					PC.vaginaLube++;
				}

				if (V.hormoneUpgradeShrinkage === 0) {
					if (PC.dick > 1) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.dick > 2) {
							effects.push(`<span class="change negative">dick to greatly shrink`);
							PC.dick -= 1;
						} else {
							effects.push(`<span class="change negative">dick to shrink`);
						}
						PC.dick--;
					}
					if (PC.balls > 1) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.balls > 2) {
							effects.push(`<span class="change negative">testicles to heavily atrophy`);
							PC.balls -= 1;
						} else {
							effects.push(`<span class="change negative">testicles to atrophy`);
						}
						PC.balls--;
					}
					if (PC.clit > 0) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.clit > 1) {
							effects.push(`<span class="change negative">clit to greatly shrink`);
							PC.clit -= 1;
						} else {
							effects.push(`<span class="change negative">clit to shrink`);
						}
						PC.clit--;
					}
				}
			} else if (PC.hormoneBalance >= 250) {
				if (PC.faceImplant < 5) {
					if (PC.faceShape === "masculine") {
						faceShape = "androgynous";
					} else if (PC.faceShape === "androgynous" && PC.geneticQuirks.androgyny !== 2) {
						faceShape = "normal";
					} else if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.faceShape === "normal") {
						faceShape = "cute";
					}
				}
				if (faceValue < 10 && PC.face < 30) {
					effects.push(`<span class="change positive">facial structure to soften`);
					faceInc = 1 + hormonePower;
					if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
						faceInc *= 2;
					}
					faceIncreaseAction(PC, faceInc);
				}

				if (PC.voice.isBetween(0, 2)) {
					effects.push(`<span class="change positive">voice to heighten`);
					PC.voice++;
				}

				if (PC.muscles > 30 && PC.diet !== "muscle building" && PC.drugs !== "steroids" && (PC.geneticQuirks.mGain !== 2 || PC.geneticQuirks.mLoss === 2)) {
					effects.push(`<span class="change negative">muscles to lose mass`);
					PC.muscles -= 2 + hormonePower + PC.geneticQuirks.mLoss;
					if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
						PC.muscles -= 2 + hormonePower + PC.geneticQuirks.mLoss;
					}
				}
				if (PC.waist > 0) {
					effects.push(`<span class="change positive">waist to narrow`);
					PC.waist = Math.clamp(PC.waist - (2 + hormonePower), 0, 100);
				}

				if (PC.geneMods.NCS === 0) {
					if (boobSize < 0.7 * normBreasts) {
						/* Grow to 70% of expected */
						effects.push(`<span class="change positive">breasts to slightly grow`);
						PC.boobs += 25;
					}
					if (PC.nipples === "tiny") {
						effects.push(`<span class="change positive">tiny nipples to enlarge`);
						PC.nipples = "cute";
					}
					if (buttSize < Math.trunc(3.5 * normButt) / 5) {
						/* 70% of normButt, rounded down to the next increment of .2 */
						effects.push(`<span class="change positive">butt to swell`);
						PC.butt += 0.2;
					}
				}
				if (PC.vagina > -1 && PC.ovaries !== 0 && PC.vaginaLube < 1) {
					effects.push(`<span class="change positive">pussy to produce more lubricant`);
					PC.vaginaLube++;
				}

				if (V.hormoneUpgradeShrinkage === 0 || !selfManufactured) {
					if (PC.dick > 2) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">dick to greatly shrink`);
							PC.dick -= 1;
						} else {
							effects.push(`<span class="change negative">dick to shrink`);
						}
						PC.dick--;
					}
					if (PC.balls > 2) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">testicles to heavily atrophy`);
							PC.balls -= 1;
						} else {
							effects.push(`<span class="change negative">testicles to atrophy`);
						}
						PC.balls--;
					}
					if (PC.clit > 1) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">clit to greatly shrink`);
							PC.clit -= 1;
						} else {
							effects.push(`<span class="change negative">clit to shrink`);
						}
						PC.clit--;
					}
				}
			} else if (PC.hormoneBalance >= 200) {
				if (PC.faceImplant < 5) {
					if (PC.faceShape === "masculine") {
						faceShape = "androgynous";
					} else if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.faceShape === "androgynous" && PC.geneticQuirks.androgyny !== 2) {
						faceShape = "normal";
					}
				}
				if (faceValue < 0 && PC.face < 0) {
					r.push(`<span class="change positive">facial structure to soften`);
					faceInc = 1 + hormonePower;
					if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
						faceInc *= 2;
					}
					faceIncreaseAction(PC, faceInc);
				}

				if (PC.voice.isBetween(0, 2)) {
					r.push(`<span class="change positive">voice to heighten`);
					PC.voice++;
				}

				if (PC.muscles > 30 && PC.diet !== "muscle building" && PC.drugs !== "steroids" && (PC.geneticQuirks.mGain !== 2 || PC.geneticQuirks.mLoss === 2)) {
					r.push(`<span class="change negative">muscles to lose mass`);
					PC.muscles -= 2 + hormonePower + PC.geneticQuirks.mLoss;
					if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
						PC.muscles -= 2 + hormonePower + PC.geneticQuirks.mLoss;
					}
				}
				if (PC.waist > 10) {
					r.push(`<span class="change positive">waist to narrow`);
					PC.waist = Math.clamp(PC.waist - (2 + hormonePower), 10, 100);
				}

				if (PC.geneMods.NCS === 0) {
					if (boobSize < 0.6 * normBreasts) {
						/* Grow to 60% of expected */
						effects.push(`<span class="change positive">breasts to slightly grow`);
						PC.boobs += 25;
					}
					if (PC.nipples === "tiny") {
						effects.push(`<span class="change positive">tiny nipples to enlarge`);
						PC.nipples = "cute";
					}
					if (buttSize < Math.trunc(3 * normButt) / 5) {
						/* 60% of normButt, rounded down to the next increment of .2 */
						effects.push(`<span class="change positive">butt to swell`);
						PC.butt += 0.2;
					}
				}
				if (PC.vagina > -1 && PC.ovaries !== 0 && PC.vaginaLube < 1) {
					effects.push(`<span class="change positive">pussy to produce more lubricant`);
					PC.vaginaLube++;
				}

				if (V.hormoneUpgradeShrinkage === 0 || !selfManufactured) {
					if (PC.dick > 3) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">dick to greatly shrink`);
							PC.dick -= 1;
						} else {
							effects.push(`<span class="change negative">dick to shrink`);
							PC.dick--;
						}
					}
					if (PC.balls > 3) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">testicles to heavily atrophy`);
							PC.balls -= 1;
						} else {
							effects.push(`<span class="change negative">testicles to atrophy`);
						}
						PC.balls--;
					}
					if (PC.clit > 2) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">clit to greatly shrink`);
							PC.clit -= 1;
						} else {
							effects.push(`<span class="change negative">clit to shrink`);
						}
						PC.clit--;
					}
				}
			} else if (PC.hormoneBalance >= 100) {
				if (PC.faceImplant < 5) {
					if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && PC.faceShape === "masculine") {
						faceShape = "androgynous";
					}
				}

				if (PC.geneMods.NCS === 0) {
					if (boobSize < 0.5 * normBreasts) {
						/* Grow to 50% of expected */
						r.push(`<span class="change positive">breasts to slightly grow`);
						PC.boobs += 25;
					}
				}
			} else if (PC.hormoneBalance >= 50) {
				// possible attraction stuff here
			} else if (PC.hormoneBalance <= -350) {
				if (PC.geneMods.NCS === 1) {
					if (PC.hips + Math.abs(PC.hipsImplant) > -1 && PC.hips > -2 && (random(1, 100) <= 20 + (10 * hormonePower))) {
						effects.push(`<span class="change positive">hips to narrow`);
						PC.hips--;
					}
				} else if (PC.physicalAge < 25) {
					if ((PC.shoulders - (Math.abs(PC.shouldersImplant)) < 1) && (PC.shoulders < 2) && (random(1, 100) < 20 + (10 * hormonePower))) {
						effects.push(`<span class="change positive">shoulders to widen`);
						PC.shoulders++;
					}
					if ((PC.hips + (Math.abs(PC.hipsImplant)) > -1) && (PC.hips > -2) && (random(1, 100) <= 20 + (10 * hormonePower))) {
						effects.push(`<span class="change positive">hips to narrow`);
						PC.hips--;
					}
				}

				if (PC.geneMods.NCS === 0) {
					if (PC.faceImplant < 5) {
						if (PC.geneticQuirks.androgyny !== 2) {
							if (PC.faceShape === "androgynous") {
								faceShape = "masculine";
							} else if (PC.faceShape !== "masculine") {
								faceShape = "androgynous";
							}
						}
					}
					if (faceValue.isBetween(0, 100)) {
						effects.push(`<span class="change positive">facial structure to harden`);
						faceDec = 1 + hormonePower;
						PC.face = Math.clamp(PC.face - faceDec, -100, 100);
					}
					if (PC.voice > 1) {
						effects.push(`<span class="change positive">voice to deepen`);
						PC.voice--;
					}
				}

				if (V.hormoneUpgradeShrinkage === 0 || !selfManufactured) {
					if (buttSize > 1 && rearLipedemaMod !== 2) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && buttSize > 2) {
							effects.push(`<span class="change negative">butt to greatly diminish`);
							PC.butt--;
						} else {
							effects.push(`<span class="change negative">butt to diminish`);
						}
						PC.butt--;
					}
					if (boobSize > 100 * gigantomastiaMod && gigantomastiaMod !== 3) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && boobSize > 200) {
							effects.push(`<span class="change negative">breasts to shrink`);
							PC.boobs -= 10 + (15 * hormonePower);
						} else {
							effects.push(`<span class="change negative">breasts to slightly shrink`);
						}
						PC.boobs -= 10 + (15 * hormonePower);
					}
				}
				if (PC.geneMods.NCS === 1 && PC.nipples === "tiny") {
					/* nothing, just don't advance to cute */
				} else if (PC.nipples !== "tiny" && PC.nipples !== "fuckable" && PC.nipples !== "flat") {
					effects.push(`<span class="change positive">nipples to become more masculine`);
					PC.nipples = "tiny";
				}

				if (PC.geneMods.NCS === 0) {
					if (PC.dick.isBetween(0, 5)) {
						effects.push(`<span class="change positive">dick to swell`);
						PC.dick++;
					}
					if (PC.balls.isBetween(0, 5)) {
						effects.push(`<span class="change positive">balls to grow`);
						PC.balls++;
					}

					if (PC.clit < 5 && PC.dick === 0 && PC.vagina >= 0) {
						effects.push(`<span class="change positive">clit to swell`);
						PC.clit++;
					}
					if (PC.vagina > -1 && PC.vaginaLube > 0) {
						effects.push(`<span class="change negative">vagina to dry out`);
						PC.vaginaLube--;
					}

					if (PC.muscles <= 50 && PC.diet !== "slimming") {
						effects.push(`<span class="change negative">muscles to gain mass`);
						PC.muscles += 2 + hormonePower + PC.geneticQuirks.mGain;
					}
					if (PC.waist < 80) {
						effects.push(`<span class="change positive">waist to broaden`);
						PC.waist = Math.clamp(PC.waist + 2 + hormonePower, -100, 80);
					}
				}
			} else if (PC.hormoneBalance <= -300) {
				if (PC.geneMods.NCS === 0) {
					if (PC.faceImplant < 5) {
						if (PC.geneticQuirks.androgyny !== 2) {
							if (PC.faceShape === "androgynous") {
								faceShape = "masculine";
							} else if (PC.faceShape !== "masculine") {
								faceShape = "androgynous";
							}
						}
					}

					if (PC.voice > 1) {
						effects.push(`<span class="change positive">voice to deepen`);
						PC.voice--;
					}
				}

				if (V.hormoneUpgradeShrinkage === 0 || !selfManufactured) {
					if (buttSize > 1 && rearLipedemaMod !== 2) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50 && buttSize > 2) {
							effects.push(`<span class="change negative">butt to greatly diminish`);
							PC.butt--;
						} else {
							effects.push(`<span class="change negative">butt to diminish`);
						}
						PC.butt--;
					}
					if (boobSize > 300 * gigantomastiaMod && gigantomastiaMod !== 3) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">breasts to shrink`);
							PC.boobs -= 10 + (15 * hormonePower);
						} else {
							effects.push(`<span class="change negative">breasts to slightly shrink`);
						}
						PC.boobs -= 10 + (15 * hormonePower);
					}
				}
				if (PC.geneMods.NCS === 1 && PC.nipples === "tiny") {
					/* nothing, just don't advance to cute */
				} else if (PC.nipples !== "tiny" && PC.nipples !== "fuckable" && PC.nipples !== "flat") {
					effects.push(`<span class="change positive">nipples to become more masculine`);
					PC.nipples = "tiny";
				}

				if (PC.geneMods.NCS === 0) {
					if (PC.dick.isBetween(0, 5)) {
						effects.push(`<span class="change positive">dick to swell`);
						PC.dick++;
					}
					if (PC.balls.isBetween(0, 5) && PC.ballType !== "sterile") {
						effects.push(`<span class="change positive">balls to grow`);
						PC.balls++;
					}

					if (PC.clit < 4 && PC.dick === 0 && PC.vagina >= 0) {
						effects.push(`<span class="change positive">clit to swell`);
						PC.clit++;
					}
					if (PC.vagina > -1 && PC.vaginaLube > 0) {
						effects.push(`<span class="change negative">vagina to dry out`);
						PC.vaginaLube--;
					}

					if (PC.muscles <= 50 && PC.diet !== "slimming") {
						effects.push(`<span class="change negative">muscles to gain mass`);
						PC.muscles += 2 + hormonePower + PC.geneticQuirks.mGain;
					}
					if (PC.waist < 40) {
						effects.push(`<span class="change positive">waist to broaden`);
						PC.waist = Math.clamp(PC.waist + 2 + hormonePower, -100, 40);
					}
				}
			} else if (PC.hormoneBalance <= -250) {
				if (PC.geneMods.NCS === 0) {
					if (PC.faceImplant < 5) {
						if (PC.faceShape !== "masculine" && PC.faceShape !== "androgynous") {
							faceShape = "androgynous";
						}
					}

					if (PC.voice > 1) {
						effects.push(`<span class="change positive">voice to deepen`);
						PC.voice--;
					}
				}

				if (V.hormoneUpgradeShrinkage === 0 || !selfManufactured) {
					if (buttSize > 2 && rearLipedemaMod !== 2) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">butt to greatly diminish`);
							PC.butt--;
						} else {
							effects.push(`<span class="change negative">butt to diminish`);
						}
						PC.butt--;
					}
					if (boobSize > 400 * gigantomastiaMod && gigantomastiaMod !== 3) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">breasts to shrink`);
							PC.boobs -= 10 + (15 * hormonePower);
						} else {
							effects.push(`<span class="change negative">breasts to slightly shrink`);
						}
						PC.boobs -= 10 + (15 * hormonePower);
					}
				}
				if (PC.geneMods.NCS === 1 && PC.nipples === "tiny") {
					/* nothing, just don't advance to cute */
				} else if (PC.nipples !== "tiny" && PC.nipples !== "fuckable" && PC.nipples !== "flat") {
					effects.push(`<span class="change positive">nipples to become more masculine`);
					PC.nipples = "tiny";
				}

				if (PC.geneMods.NCS === 0) {
					if (PC.dick.isBetween(0, 4)) {
						effects.push(`<span class="change positive">dick to swell`);
						PC.dick++;
					}
					if (PC.balls.isBetween(0, 4) && PC.ballType !== "sterile") {
						effects.push(`<span class="change positive">balls to grow`);
						PC.balls++;
					}

					if (PC.clit < 3 && PC.dick === 0 && PC.vagina >= 0) {
						effects.push(`<span class="change positive">clit to swell`);
						PC.clit++;
					}
					if (PC.vagina > -1 && PC.vaginaLube > 0) {
						effects.push(`<span class="change negative">vagina to dry out`);
						PC.vaginaLube--;
					}

					if (PC.muscles <= 35 && PC.diet !== "slimming") {
						effects.push(`<span class="change negative">muscles to gain mass`);
						PC.muscles += 2 + hormonePower + PC.geneticQuirks.mGain;
					}
					if (PC.waist < 25) {
						effects.push(`<span class="change positive">waist to broaden`);
						PC.waist = Math.clamp(PC.waist + 2 + hormonePower, -100, 25);
					}
				}
			} else if (PC.hormoneBalance <= -200) {
				if (PC.geneMods.NCS === 0) {
					if (PC.faceImplant < 5) {
						if (PC.faceShape !== "masculine" && PC.faceShape !== "androgynous") {
							faceShape = "androgynous";
						}
					}

					if (PC.voice > 2) {
						effects.push(`<span class="change positive">voice to deepen`);
						PC.voice--;
					}
				}

				if (V.hormoneUpgradeShrinkage === 0 || !selfManufactured) {
					if (buttSize > 3 && rearLipedemaMod !== 2) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">butt to greatly diminish`);
							PC.butt--;
						} else {
							effects.push(`<span class="change negative">butt to diminish`);
						}
						PC.butt--;
					}
					if (boobSize > 600 * gigantomastiaMod && gigantomastiaMod !== 3) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">breasts to shrink`);
							PC.boobs -= 10 + (15 * hormonePower);
						} else {
							effects.push(`<span class="change negative">breasts to slightly shrink`);
						}
						PC.boobs -= 10 + (15 * hormonePower);
					}
				}
				if (PC.nipples === "huge" || PC.nipples === "puffy") {
					effects.push(`<span class="change positive">nipples to become more masculine`);
					PC.nipples = "cute";
				}

				if (PC.geneMods.NCS === 0) {
					if (PC.dick.isBetween(0, 3)) {
						effects.push(`<span class="change positive">dick to swell`);
						PC.dick++;
					}
					if (PC.balls.isBetween(0, 3) && PC.ballType !== "sterile") {
						effects.push(`<span class="change positive">balls to grow`);
						PC.balls++;
					}

					if (PC.clit < 2 && PC.dick === 0 && PC.vagina >= 0) {
						effects.push(`<span class="change positive">clit to swell`);
						PC.clit++;
					}
					if (PC.vagina > -1 && PC.vaginaLube > 0) {
						effects.push(`<span class="change negative">vagina to dry out`);
						PC.vaginaLube--;
					}

					if (PC.muscles <= 15 && PC.diet !== "slimming") {
						effects.push(`<span class="change negative">muscles to gain mass`);
						PC.muscles += 2 + hormonePower + PC.geneticQuirks.mGain;
					}
					if (PC.waist < 9) {
						effects.push(`<span class="change positive">waist to broaden`);
						PC.waist = Math.clamp(PC.waist + 2 + hormonePower, -100, 9);
					}
				}
			} else if (PC.hormoneBalance <= -100) {
				if (PC.geneMods.NCS === 0) {
					if (PC.voice > 2) {
						effects.push(`<span class="change positive">voice to deepen`);
						PC.voice--;
					}
				}

				if (V.hormoneUpgradeShrinkage === 0 || !selfManufactured) {
					if (buttSize > 4 && rearLipedemaMod !== 2) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">butt to greatly diminish`);
							PC.butt--;
						} else {
							effects.push(`<span class="change negative">butt to diminish`);
						}
						PC.butt--;
					}
					if (boobSize > 800 * gigantomastiaMod && gigantomastiaMod !== 3) {
						if (PC.geneMods.NCS === 1 && random(1, 100) > 50) {
							effects.push(`<span class="change negative">breasts to shrink`);
							PC.boobs -= 10 + (15 * hormonePower);
						} else {
							effects.push(`<span class="change negative">breasts to slightly shrink`);
						}
						PC.boobs -= 10 + (15 * hormonePower);
					}
				}

				if (PC.geneMods.NCS === 0) {
					if (PC.muscles < 0 && PC.diet !== "slimming") {
						effects.push(`<span class="change negative">muscles to gain mass`);
						PC.muscles += 2 + hormonePower + PC.geneticQuirks.mGain;
					}

					if (PC.waist < 0) {
						effects.push(`<span class="change positive">waist to broaden`);
						PC.waist = Math.clamp(PC.waist + 2 + hormonePower, -100, 0);
					}

					if (PC.dick.isBetween(0, 2)) {
						effects.push(`<span class="change positive">dick to grow`);
						PC.dick++;
					}
					if (PC.balls.isBetween(0, 2)) {
						effects.push(`<span class="change positive">balls to drop`);
						PC.balls++;
					}

					if (PC.clit < 1 && PC.dick === 0) {
						effects.push(`<span class="change positive">clit to swell`);
						PC.clit++;
					}
					if (PC.vagina > -1 && PC.vaginaLube > 1) {
						effects.push(`<span class="change negative">vagina to dry out`);
						PC.vaginaLube--;
					}
				}
			} else if (PC.hormoneBalance <= -50) {
				// possible attraction stuff here
			}
		}

		if (effects.length > 0) {
			r.push(`Hormonal effects cause your`);
			r.push(effectsListToText(effectsList));
			r.push(`${r.pop()}.</span>`);
		}
		if (faceShape !== 0) {
			if (effecs.length > 0) {
				r.push(`More importantly, they cause`);
			} else {
				r.push(`Hormonal effects cause`);
			}
			if (PC.faceShape === "masculine" && faceShape === "androgynous") {
				r.push(`<span class="change positive">your face to soften into a state of`);
				if (PC.geneMods.NCS === 1) {
					r.push(`childlike`);
				}
				r.push(`androgyny.</span>`);
			} else if (PC.faceShape === "androgynous" && faceShape === "normal") {
				r.push(`<span class="change positive">your face to soften into`);
				if (PC.geneMods.NCS === 1) {
					r.push(`childlike normalcy.</span>`);
				} else {
					r.push(`femininity.</span>`);
				}
			} else if (PC.faceShape === "androgynous" && faceShape === "masculine") {
				r.push(`<span class="change negative">your face to harden into masculinity.</span>`);
			} else if (PC.faceShape === "normal" && faceShape === "cute") {
				r.push(`<span class="change positive">your face to soften into a state of sheer cuteness.</span>`);
			} else if (PC.faceShape !== "masculine" && PC.faceShape !== "androgynous" && faceShape === "androgynous") {
				r.push(`<span class="change negative">your face to harden into a state of androgyny.</span>`);
			}
			PC.faceShape = faceShape;
		}
		if ((faceValue >= 50 || PC.face >= 75) && faceInc !== 0) {
			r.push(`Your face is has become quite beautiful, though hormonal treatments <span class="noteworthy">are unlikely to be able to improve it further.</span>`);
		}
	}

	function effectsListToText(effectsList) {
		return effectsList.reduce((res, ch, i, arr) => res + (i === arr.length - 1 ? '</span> and ' : ',</span> ') + ch);
	}
};

repo_name: Fanatey/fc

license: mit


code:
App.EndWeek.Player.inflation = function(PC = V.PC) {
	const r = [];

	const gigantomastiaMod = PC.geneticQuirks.gigantomastia === 2 ? (PC.geneticQuirks.macromastia === 2 ? 3 : 2) : 1;
	const rearQuirk = PC.geneticQuirks.rearLipedema === 2 ? 2 : 0;
	const boobSize = PC.boobs - PC.boobsImplant - PC.boobsMilk;
	const buttSize = PC.butt - PC.buttImplant;
	const rearQuirkDivider = rearLipedemaMod === 0 ? 1 : rearQuirk;
	const dairyL = App.Entity.facilities.dairy.employeesIDs().size;
	let distensionTerm;
	let quantityTerm;
	let stateTerm;
	let cow;
	let harvest;

	if (cow.inflationMethod === 3) {
		cow = PC.inflationType === "milk" ? getSlave(PC.milkSource) : getSlave(PC.cumSource);
	}

	inflationCancellation();
	if (PC.inflation > 0) {
		fillUp();
	}
	if (PC.inflationType === "milk" || PC.inflationType === "food") {
		foodMeansFat();
	}
	if (PC.cervixImplant >= 2) {
		cervixImplantFluidConversion();
	}

	return r.join(" ");

	function inflationCancellation() {
		if (PC.inflationType === "milk" && (PC.inflationMethod === 1 || PC.inflationMethod === 2) && (dairyL === 0 || V.dairy === 0) && V.arcologies[0].FSPastoralistLaw !== 1) {
			r.push(`You no longer have a functional dairy. <span class="yellow">You are unable continue to inflate yourself by this means.</span>`);
			deflate(PC);
		} else if (PC.inflationType === "milk" && PC.inflationMethod === 3 && cow.lactation === 0) {
			r.push(`${cow.slaveName} is no longer lactating and thus can no longer satisfy your predilections. <span class="yellow">You are unable continue to inflate yourself by this means.</span>`);
			deflate(PC);
		} else if (PC.inflationType === "cum" && (PC.inflationMethod === 1 || PC.inflationMethod === 2) && (dairyL === 0 || cumSlaves().length === 0 || V.dairy === 0) && V.arcologies[0].FSPastoralistLaw !== 1) {
			r.push(`You no longer have a functional cum dairy. <span class="yellow">You are unable continue to inflate yourself by this means.</span>`);
			deflate(PC);
		} else if (PC.inflationType === "cum" && PC.inflationMethod === 3 && cow.balls === 0) {
			r.push(`${cow.slaveName} no longer has testicles and thus can no longer satisfy your predilections. <span class="yellow">You are unable continue to inflate yourself by this means.</span>`);
			deflate(PC);
		} else if (PC.bellyImplant >= 1500 || PC.bellyPreg >= 1500) {
			if (PC.inflationType === "undigested food") {
				if (PC.diet !== "weaning") {
					deflate(PC);
				} else {
					r.push(`You were already feeling full before your diet started backing up inside you; <span class="health dec">now it's just agonizing.</span>`);
					healthDamage(PC, 5);
				}
			} else if (PC.inflation > 1) {
				r.push(`You feel a bit too full already to inflate yourself as large as you'd like, so <span class="yellow">you'll have to settle for a lesser filling.</span>`);
				PC.inflation = 1;
				SetBellySize(PC);
			} else {
				PC.bellyFluid = 2000;
				SetBellySize(PC);
			}
		} else if ((PC.inflationType === "milk" || PC.inflationType === "cum") && PC.inflationMethod === 3) {
			harvest = (PC.inflationType === "milk") ? Math.trunc(milkAmount(cow) / 14) : Math.trunc(cumAmount(cow) / 70);
			if (PC.inflation === 3 && harvest < 8) {
				r.push(`${cow.slaveName} is having trouble producing enough ${PC.inflationType} to satisfy`);
				if (harvest < 2) {
					r.push(`you at all. <span class="yellow">You are unable continue to inflate yourself by this means.</span>`);
				} else if (harvest < 4) {
					r.push(`you, so you'll have to settle for a meager two liters of the stuff.`);
				} else {
					r.push(`you, so you'll have to settle for a mere four liters of the stuff.`);
				}
			} else if (PC.inflation === 2 && harvest < 4) {
				if (harvest < 2) {
					r.push(`you at all. <span class="yellow">You are unable continue to inflate yourself by this means.</span>`);
				} else {
					r.push(`you, so you'll have to settle for a mere two liters of the stuff.`);
				}
			} else if (PC.inflation === 1 && harvest < 2) {
				r.push(`you at all. <span class="yellow">You are unable continue to inflate yourself by this means.</span>`);
			}
		} else if (PC.inflationType === "undigested food" && PC.diet !== "weaning") {
			r.push(`Since you started eating slave food again, the food backing up in your system has broken down, once again <span class="yellow">leaving you with a flat belly.</span>`);
			deflate(PC);
			PC.weaningDuration = 0;
		}
	}

	function fillUp() { // weaning food is not handled here!
		if (PC.inflation === 3) {
			distensionTerm = `leaving you looking ready to burst`;
			quantityTerm = `two gallons`;
			stateTerm = `<span class="health dec">It's painful,</span> yet satisfying, to be so full.`;
		} else if (PC.inflation === 2) {
			distensionTerm = `leaving you looking pregnant`;
			quantityTerm = `four liters`;
			stateTerm = `You're so full, the contents of your distended belly wobble heavily with your every motion.`;
		} else {
			distensionTerm = `leaving your belly noticeably distended`;
			quantityTerm = `two liters`;
			stateTerm = `You feel swollen and heavy, but it's not very visible to others.`;
		}

		switch (PC.inflationType) {
			case "water":
			case "urine":
				r.push(`You fill your rear with nearly ${quantityTerm} of ${PC.inflationType} to sate your predilections, ${distensionTerm}, whenever you have the chance. ${stateTerm}`);
				if (PC.inflation === 3) {
					healthDamage(PC, 10);
				}
				break;
			case "aphrodisiac":
				r.push(`You fill your rear with nearly ${quantityTerm} of an aphrodisiac solution, ${distensionTerm},`);
				if (PC.addict > 0) {
					r.push(`sating your addictive itch for now.`);
				} else {
					r.push(`whenever you have the chance.`);
				}
				r.push(stateTerm);
				if (PC.inflation === 3) {
					r.push(`Having your body packed full of aphrodisiacs speeds up your absorption of them,`);
					healthDamage(PC, 10);
				} else if (PC.inflation === 2) {
					r.push(`Being bloated with aphrodisiacs helps to amplify their effects,`);
				} else if (PC.inflation === 1) {
					r.push(`Allowing your body to direcly absorb aphrodisiacs amplifies their effects,`);
				}
				if (PC.energy <= 95) {
					r.push(`<span class="libido inc">sending your sex drive into overdrive.</span>`);
					PC.energy += 5 * PC.inflation;
				} else if (canAchieveErection(PC)) {
					r.push(`leaving you with an insatiable erection and the inability to think of things other than fucking.`);
				} else {
					r.push(`leaving you insatiably horny and unable to think of anything other than sex.`);
				}
				if (V.arcologies[0].FSBodyPuristLaw === 0 && V.healthyDrugsUpgrade === 0) {
					r.push(`Maintaining such a high dosage <span class="health dec">isn't healthy for you.</span>`);
					healthDamage(PC, 5);
				}
				PC.chem += 2 * PC.inflation;
				if (PC.geneticQuirks.galactorrhea === 2 && random(1, 100) < PC.hormoneBalance && PC.lactation === 0) {
					PC.inappropriateLactation = 1;
				}
				if (PC.addict > 0) {
					PC.addict += PC.inflation * 3;
				} else if (jsRandom(1, 100) < 40 + (20 * PC.inflation)) {
					r.push(`One thing is clear now; you need to keep doing this. <span class="cyan">You are now an aphrodisiac addict!</span>`);
					PC.addict = 1;
				}
				break;
			case "milk":
				if (PC.inflationMethod === 1) {
					r.push(`You chug nearly`);
				} else if (PC.inflationMethod === 2) {
					r.push(`You fill your rear with nearly`);
				} else if (PC.inflationMethod === 3) {
					r.push(`You suckle from ${cow.slaveName} until you've drank nearly`);
					cow.lactationDuration = 2;
					cow.boobs -= cow.boobsMilk;
					cow.boobsMilk = 0;
				}
				r.push(`${quantityTerm} of ${PC.inflationType} to sate your predilections, ${distensionTerm}, whenever you get the chance. ${stateTerm}`);
				if (PC.inflation === 3) {
					healthDamage(PC, 10);
				}
				break;
			case "cum":
				if (PC.inflationMethod === 1) {
					r.push(`You guzzle nearly`);
				} else if (PC.inflationMethod === 2) {
					r.push(`You pump your rear full of nearly`);
				} else if (PC.inflationMethod === 3) {
					r.push(`You suck ${cow.slaveName} off until you've guzzled nearly`);
				}
				r.push(`${quantityTerm} of ${PC.inflationType} to sate your predilections, ${distensionTerm}, whenever you get the chance. ${stateTerm}`);
				if (PC.inflation === 3) {
					healthDamage(PC, 10);
				}
				break;
			case "food":
				r.push(`You gorge yourself whenever you feel your gut`);
				if (PC.inflation === 3) {
					r.push(`isn't stuffed to bursting with enough food to sate your predilections. ${stateTerm}`);
					healthDamage(PC, 10);
				} else if (PC.inflation === 2) {
					r.push(`isn't stuffed with enough food`);
					// gender overhaul stuff
					if (PC.vagina >= 0) { // female appearance
						r.push(`to give you a prominent food baby to sate your predilections.`);
					} else {
						r.push(`to bulge prominently ahead of you to sate your predilections.`);
					}
					r.push(`You're so full, your distended belly groans angrily as it struggles to digest all that you've eaten.`);
				} else if (PC.inflation === 1) {
					r.push(`isn't stuffed with enough food to be noticeably distended to sate your predilections. ${stateTerm}`);
				}
				break;
		}
	}

	function foodMeansFat() {
		if (PC.inflationType === "milk") {
			if (PC.weight < 200) {
				r.push(`Your body <span class="lime">grows a little softer</span> as it absorbs the milk contained in your digestive track.`);
				PC.weight += 2;
				if (PC.weightDirection === 1) {
					PC.weight += 2;
				}
			}
			if (jsRandom(1, 100) > 50 / gigantomastiaMod && boobSize < 3000 * gigantomastiaMod) {
				r.push(`Your breasts <span class="lime">swell</span> with added fat as you digest the milk you've consumed.`);
				PC.boobs += 200;
			}
			if (jsRandom(1, 100) > (50 / rearQuirkDivider) && buttSize < 7 + ((7 / 2) * rearLipedemaMod)) {
				r.push(`Your butt <span class="lime">swells</span> with added fat as you digest the milk you've consumed.`);
				PC.butt += 1;
			}
		} else if (PC.inflationType === "food") {
			if (PC.weight < 200) {
				r.push(`It should surprise nobody that you <span class="lime">rapidly gain weight</span> with all the binge eating.`);
				PC.weight += 4;
				if (PC.weightDirection === 1) {
					PC.weight += 2;
				}
			}
			if (jsRandom(1, 100) > 50 / gigantomastiaMod && boobSize < 3000 * gigantomastiaMod) {
				r.push(`Your breasts <span class="lime">swell</span> with added fat as your body attempts to handle all the food inside you.`);
				PC.boobs += 200;
			}
			if (jsRandom(1, 100) > (50 / rearQuirkDivider) && buttSize < 7 + ((7 / 2) * rearLipedemaMod)) {
				r.push(`Your butt <span class="lime">swells</span> with added fat as your body attempts to handle all the food inside you.`);
				PC.butt += 1;
			}
		}
	}

	function cervixImplantFluidConversion() {
		if (PC.inflationMethod === 2) {
			r.push(`Your rectal micropump implant filters out some fluid from the ${PC.inflationType} you're holding inside you during the week, adding it to your abdominal implant.`);
			PC.bellyImplant += 200;
		}
	}
};


code:
App.EndWeek.Player.longTermEffects = function(PC = V.PC) {
	const r = [];

	const gigantomastiaMod = PC.geneticQuirks.gigantomastia === 2 ? (PC.geneticQuirks.macromastia === 2 ? 3 : 2) : 1;
	const rearQuirk = PC.geneticQuirks.rearLipedema === 2 ? 2 : 0;
	const uterineHypersensitivityMod = PC.geneticQuirks.uterineHypersensitivity === 2 ? 2 : 1;
	const oldEnergy = PC.energy;

	asexualOvariesBurnout();
	piercingEffects();
	if (PC.lactation >= 2 || (PC.lactation > 0 && PC.lactationAdaptation >= 100)) {
		heavyLactationEffects();
	}
	implantEffects();
	hormoneBalance();
	if (PC.pubertyXX === 0 || PC.pubertyXY === 0) {
		puberty();
	}
	r.push(App.EndWeek.Player.pregnancy());
	if (PC.bellyFluid >= 1500) {
		r.push(App.EndWeek.Player.inflation());
	}
	bellySagging();
	r.push(App.EndWeek.Player.longTermPhysicalEffects());
	anaphrodisiacEffects(PC, oldEnergy); // must come after all .energy gains!
	if (PC.preg > PC.pregData.normalBirth / 8) {
		mainLaborTriggers();
	}
	endWeekHealthDamage(PC); // contained in healthFunctions.js
	slaveDeath(); // We can't die just yet.
	if (!["bob cut", "buzzcut", "pixie cut", "shaved", "trimmed"].includes(PC.hStyle) && PC.bald !== 1 && PC.haircuts === 0) {
		hairGrowth();
	}

	const frag = document.createDocumentFragment();
	$(frag).append(...App.Events.spaceSentences(r));
	return frag;

	function boobSize(PC) {
		return PC.boobs - PC.boobsImplant - PC.boobsMilk;
	}

	function asexualOvariesBurnout() { // This block needs to be reflected in PC.need generation.
		if (PC.ovaImplant === "asexual" && isFertile(PC) && (PC.preg === 0 || (PC.preg >= 0 && PC.geneticQuirks.superfetation === 2))) {
			r.push(`The frequent climaxes brought about by your ovarian modification's internal ejaculations keep you sexually sated.`);
			if (PC.energy >= 10) {
				r.push(`However, the constant self-gratification <span class="libido dec">leaves sex less satisfying.</span>`);
				PC.energy -= 10;
			}
			PC.need = 0;
		}
	}

	function piercingEffects() {
		if (PC.piercing.vagina.weight > 1) {
			if (PC.vagina > -1 && PC.labia < 2 && random(1, 100) > 90) {
				r.push(`The amount of weight hangning from your labia <span class="change positive">stretches out your pussylips a bit.</span>`);
				PC.labia += 1;
			}
		}
		if (PC.piercing.nipple.weight === 1) {
			if (PC.nipples === "tiny") {
				if (random(1, 100) > 95) {
					r.push(`Your piercings keep your nipples half-hard all the time, and <span class="change positive">eventually they just stay that way.</span>`);
					PC.nipples = "cute";
				}
			} else if (PC.nipples === "partially inverted") {
				if (random(1, 100) > 70) {
					r.push(`Your piercings keep your nipples half-hard all the time, which <span class="change positive">eventually protrudes them permanently.</span>`);
					if (random(1, 2) === 1) {
						r.push(`It turns out they're kind of cute.`);
						PC.nipples = "cute";
					} else {
						r.push(`It turns out they're really puffy.`);
						PC.nipples = "puffy";
					}
				}
			} else if (PC.nipples === "inverted") {
				if (random(1, 100) > 90) {
					r.push(`Your piercings keep your nipples half-hard all the time, which eventually <span class="change positive">eventually protrudes them permanently.</span>`);
					if (random(1, 2) === 1) {
						r.push(`It turns out they're kind of cute.`);
						PC.nipples = "cute";
					} else {
						r.push(`It turns out they're really puffy.`);
						PC.nipples = "puffy";
					}
				}
			} else if (PC.nipples === "flat") {
				if (random(1, 100) > 90) {
					r.push(`Your piercings tug at your nipples constantly, eventually <span class="change positive">preventing the fat nubs from flattening out again.</span>`);
					PC.nipples = "huge";
				}
			}
		} else if (PC.piercing.nipple.weight === 2) {
			if (PC.nipples === "tiny") {
				if (random(1, 100) > 80) {
					r.push(`The piercings in your nipples are so extensive and heavy that the weight <span class="change positive">stretches and lengthens them.</span>`);
					PC.nipples = "cute";
				}
			} else if (PC.nipples === "partially inverted") {
				if (random(1, 100) > 50) {
					r.push(`The piercings in your nipples are so extensive and heavy that the weight <span class="change positive">permanently protrudes them.</span>`);
					if (random(1, 2) === 1) {
						r.push(`It turns out they're kind of cute.`);
						PC.nipples = "cute";
					} else {
						r.push(`It turns out they're really puffy.`);
						PC.nipples = "puffy";
					}
				}
			} else if (PC.nipples === "inverted") {
				if (random(1, 100) > 70) {
					r.push(`The piercings in your nipples are so extensive that they are kept <span class="change positive">permanently protruded.</span>`);
					if (random(1, 2) === 1) {
						r.push(`It turns out they're as massive as the metal hanging from them.`);
						PC.nipples = "huge";
					} else {
						r.push(`It turns out they're really puffy.`);
						PC.nipples = "puffy";
					}
				}
			} else if (PC.nipples === "flat") {
				if (random(1, 100) > 50) {
					r.push(`The piercings in your nipples are so extensive that they eventually <span class="change positive">stretch out into huge nubs.</span>`);
					PC.nipples = "huge";
				}
			}
		}
	}

	function heavyLactationEffects() {
		if (PC.nipples !== "huge" && PC.nipples !== "fuckable") {
			if (PC.nipples === "tiny") {
				if (random(1, 100) > 70) {
					r.push(`Your tiny nipples are unable to keep up with the output demanded by your heavy lactation, <span class="change positive">stretching and engorging</span> painfully until your milk can flow properly.`);
					PC.nipples = "cute";
				}
			} else if (PC.nipples === "cute") {
				if (random(1, 100) > 80) {
					r.push(`Your nipples are constantly swollen from your heavy lactation, and as they become accustomed to the flow of milk, <span class="change positive">grow puffy</span> and engorged.`);
					PC.nipples = "puffy";
				}
			} else if (PC.nipples === "partially inverted" || PC.nipples === "inverted") {
				if (random(1, 100) > 80) {
					r.push(`You lactate so much that your nipples never get a chance to retreat back to their inverted state. Lactation has permanently protruded them, leaving them engorged and puffy.`);
					PC.nipples = "puffy";
				}
			} else if (PC.nipples === "flat") {
				if (random(1, 100) > 50) {
					r.push(`You lactate so much that your nipples just can't stay flattened. Lactation has <span class="change positive">permanently engorged them,</span> leaving them positively massive.`);
					PC.nipples = "huge";
				}
			} else {
				if (random(1, 100) > 90) {
					r.push(`Lactation has <span class="change positive">swollen your nipples</span> to an absurd size, giving you milky teats worthy of the cow you are.`);
					PC.nipples = "huge";
				}
			}
		}
	}

	function implantEffects() {
		let implantsSwellBoobs = 0;
		let effect;
		if (PC.boobsImplantType === "string") {
			r.push(`String implants absorb fluid, and yours are no exception; they're <span class="change positive">slightly larger</span> than last week.`);
			PC.boobsImplant += 50;
			PC.boobs += 50;
			effect = random(1, 10);
			if (PC.boobs > 50000) {
				r.push(`Your breasts just cannot handle them growing any larger, so some serum is drained from them.`);
				PC.boobs -= 100;
				PC.boobsImplant -= 100;
			} else if (PC.boobsImplant > 25000 && effect >= 2) {
				r.push(`Their growth <span class="health dec">is painful,</span> as they greatly irritate the tissue of your breasts in order to produce the large amount of fluid needed to continue swelling.`);
				healthDamage(PC, 20);
			} else if (PC.boobsImplant > 15000 && effect >= 3) {
				r.push(`Their growth <span class="health dec">is a bit painful,</span> as they irritate the tissue of your breasts in order to produce the large amount of fluid needed to continue swelling.`);
				healthDamage(PC, 10);
			} else if (PC.boobsImplant > 10000 && effect >= 4) {
				r.push(`Their growth <span class="health dec">is a bit painful,</span> as they irritate the tissue of your breasts in order to produce the large amount of fluid needed to continue swelling.`);
				healthDamage(PC, 10);
			} else if (PC.boobsImplant > 8000 && effect >= 5) {
				r.push(`Their growth <span class="health dec">is a bit painful,</span> as they irritate the tissue of your breasts in order to produce the fluid needed to swell.`);
				healthDamage(PC, 10);
			} else if (PC.boobsImplant > 6000 && effect >= 6) {
				r.push(`Their growth <span class="health dec">is a bit painful,</span> as they irritate the tissue of your breasts in order to produce the fluid needed to swell.`);
				healthDamage(PC, 10);
			} else if (PC.boobsImplant > 4500 && effect >= 7) {
				r.push(`Their growth <span class="health dec">is a bit painful,</span> as they irritate the tissue of your breasts in order to produce the fluid needed to swell.`);
				healthDamage(PC, 10);
			} else if (PC.boobsImplant > 3000 && effect >= 8) {
				r.push(`Their growth <span class="health dec">is uncomfortable,</span> as they irritate the tissue of your breasts in order to produce the fluid needed to swell.`);
				healthDamage(PC, 7);
			} else if (PC.boobsImplant > 2000 && effect >= 9) {
				r.push(`Their growth <span class="health dec">is a bit uncomfortable,</span> as they irritate the tissue of your breasts in order to produce the fluid needed to swell.`);
				healthDamage(PC, 5);
			} else if (PC.boobsImplant > 1000 && effect > 9) {
				r.push(`Their growth <span class="health dec">is a bit uncomfortable,</span> as they irritate the tissue of your breasts in order to produce the fluid needed to swell.`);
				healthDamage(PC, 3);
			}
		}
		if (PC.boobsImplant >= PC.boobs + PC.boobsMilk && PC.boobsImplant > 0) {
			/* catch in case breast implants get larger than boobs */
			r.push(`Your breast tissue has naturally <span class="change positive">stretched and grown</span> to better accommodate your implants.`);
			PC.boobs = PC.boobsImplant + PC.boobsMilk + 10;
		} else if (PC.boobsImplant > 1000) {
			if (PC.boobs - PC.boobsImplant < 1000) {
				if (random(1, 100) > 60) {
					implantsSwellBoobs = 1;
				}
			}
		} else if (PC.boobsImplant > 600) {
			if (PC.boobs - PC.boobsImplant < 500) {
				if (random(1, 100) > 60) {
					implantsSwellBoobs = 1;
				}
			}
		} else if (PC.boobsImplant > 0) {
			if (PC.boobs - PC.boobsImplant < 300) {
				if (random(1, 100) > 60) {
					implantsSwellBoobs = 1;
				}
			}
		}
		if (implantsSwellBoobs === 1) {
			r.push(`Your breast tissue has naturally <span class="change positive">stretched and grown</span> to better accommodate your implants.`);
			PC.boobs += 50;
		}
		if (PC.buttImplantType === "string") {
			r.push(`Your string implants absorb fluid <span class="change positive">slowly swelling your ass</span> week to week.`);
			PC.buttImplant += .25;
			PC.butt += .25;
			if (PC.butt + PC.buttImplant > 10 && PC.buttImplant > 1) {
				r.push(`Your body is unable to handle them at their current size, so some serum is drained from them.`);
				PC.butt -= 1;
				PC.buttImplant -= 1;
			}
			effect = random(1, 8);
			if (PC.buttImplant > 7 && effect >= 2) {
				r.push(`Their growth <span class="health dec">is painful,</span> as they greatly irritate the tissue of your cheeks in order to produce the large amount of fluid needed to continue swelling.`);
				healthDamage(PC, 20);
			} else if (PC.buttImplant > 6 && effect >= 2) {
				r.push(`Their growth <span class="health dec">is painful,</span> as they greatly irritate the tissue of your cheeks in order to produce the large amount of fluid needed to continue swelling.`);
				healthDamage(PC, 20);
			} else if (PC.buttImplant > 5 && effect >= 3) {
				r.push(`Their growth <span class="health dec">is a bit painful,</span> as they irritate the tissue of your cheeks in order to produce the large amount of fluid needed to continue swelling.`);
				healthDamage(PC, 10);
			} else if (PC.buttImplant > 4 && effect >= 4) {
				r.push(`Their growth <span class="health dec">is a bit painful,</span> as they irritate the tissue of your cheeks in order to produce the large amount of fluid needed to continue swelling.`);
				healthDamage(PC, 10);
			} else if (PC.buttImplant > 3 && effect >= 5) {
				r.push(`Their growth <span class="health dec">is uncomfortable,</span> as they irritate the tissue of your cheeks in order to produce the fluid needed to swell.`);
				healthDamage(PC, 5);
			} else if (PC.buttImplant > 2 && effect >= 6) {
				r.push(`Their growth <span class="health dec">is uncomfortable,</span> as they irritate the tissue of your cheeks in order to produce the fluid needed to swell.`);
				healthDamage(PC, 5);
			} else if (PC.buttImplant > 1 && effect >= 7) {
				r.push(`Their growth <span class="health dec">is a bit uncomfortable,</span> as they irritate the tissue of your cheeks in order to produce the fluid needed to swell.`);
				healthDamage(PC, 3);
			} else if (PC.buttImplant > 0 && effect > 7) {
				r.push(`Their growth <span class="health dec">is a bit uncomfortable,</span> as they irritate the tissue of your cheeks in order to produce the fluid needed to swell.`);
				healthDamage(PC, 3);
			}
		}
	}

	function hormoneBalance() {
		const selfManufactured = V.consumerDrugs;
		const hormonePower = selfManufactured ? V.hormoneUpgradePower : 1; // Prescribed ones are better to match their base price.
		if (PC.diet === "XX") {
			PC.hormoneBalance += 4;
		} else if (PC.diet === "XXY") {
			if (PC.hormoneBalance > 0) {
				PC.hormoneBalance -= 8;
			} else if (PC.hormoneBalance < 0) {
				PC.hormoneBalance += 8;
			}
		} else if (PC.diet === "XY") {
			PC.hormoneBalance -= 4;
		}
		if (PC.drugs === "fertility drugs") {
			PC.hormoneBalance += 4;
		} else if (PC.drugs === "female hormone injections") {
			PC.hormoneBalance += 20;
		} else if (PC.drugs === "male hormone injections") {
			PC.hormoneBalance -= 20;
		} else if (PC.drugs === "testicle enhancement") {
			PC.hormoneBalance -= 4;
		} else if (PC.drugs === "steroids") {
			PC.hormoneBalance -= 4;
		} else if (PC.drugs === "super fertility drugs") {
			PC.hormoneBalance += 8;
		} else if (PC.drugs === "hyper testicle enhancement") {
			PC.hormoneBalance -= 12;
		}
		if (PC.hormones === 1) {
			PC.hormoneBalance += 4 + (hormonePower * 2);
		} else if (PC.hormones === -1) {
			PC.hormoneBalance -= 4 + (hormonePower * 2);
		}
		if (PC.drugs === "hormone enhancers") {
			if (PC.hormones === 1) {
				PC.hormoneBalance += 4 + (hormonePower * 2);
			} else if (PC.hormones === -1) {
				PC.hormoneBalance -= 4 + (hormonePower * 2);
			} else {
				PC.drugs = "no drugs";
				r.push(`You aren't taking hormones, so there's really no reason to take hormone enhancers, is there?`);
			}
		}
		/* NCS helps primary sexual maturity */
		if (PC.geneMods.NCS === 1) {
			if (PC.genes === "XX" && PC.hormoneBalance > 0 && PC.pubertyXX === 0) {
				PC.hormoneBalance = Math.clamp(PC.hormoneBalance * 1.5, -400, 400);
			} else if (PC.genes === "XY" && PC.hormoneBalance < 0 && PC.pubertyXY === 0) {
				PC.hormoneBalance = Math.clamp(PC.hormoneBalance * 1.5, -400, 400);
			} else if ((PC.ovaries === 1 || PC.mpreg === 1) && PC.pubertyXX === 0) {
				PC.hormoneBalance += 20;
			} else if (PC.balls > 0 && PC.pubertyXY === 0) {
				PC.hormoneBalance -= 20;
			} else if (PC.genes === "XX") {
				PC.hormoneBalance += 5;
			} else if (PC.genes === "XY") {
				PC.hormoneBalance -= 5;
			}
		}
		/* androgyny really wants to sit around 0 and will fight changes to do so */
		if (PC.geneticQuirks.androgyny === 2) {
			if (PC.hormoneBalance > 6) {
				PC.hormoneBalance -= 10;
			} else if (PC.hormoneBalance < -6) {
				PC.hormoneBalance += 10;
			}
		}
		if (PC.drugs !== "hormone blockers") {
			r.push(App.EndWeek.Player.hormones(PC, selfManufactured, hormonePower));
		} else if (PC.drugs === "hormone blockers") {
			r.push(`The hormone blockers you're on suppress your hormones, natural or not.`);
			if (PC.energy > 20) {
				r.push(`You sex drive is similarly <span class="stat drop">suppressed.</span>`);
				PC.energy--;
			}
			if (PC.hormoneBalance > 0) {
				PC.hormoneBalance -= 5;
			} else if (PC.hormoneBalance < 0) {
				PC.hormoneBalance += 5;
			}
		}

		if (PC.genes === "XX") {
			if ((PC.ovaries === 1 || PC.mpreg === 1) && PC.pubertyXX > 0) {
				if (PC.balls > 0 && PC.ballType !== "sterile" && PC.pubertyXY > 0) {
					if (PC.hormoneBalance > 10) {
						PC.hormoneBalance -= Math.ceil((PC.hormoneBalance - 10) / 40);
					} else if (PC.hormoneBalance < 10) {
						PC.hormoneBalance += Math.ceil((10 - PC.hormoneBalance) / 40);
					}
				} else {
					if (PC.hormoneBalance > 50) {
						PC.hormoneBalance -= Math.ceil((PC.hormoneBalance - 50) / 40);
					} else if (PC.hormoneBalance < 50) {
						PC.hormoneBalance += Math.ceil((50 - PC.hormoneBalance) / 40);
					}
				}
			} else {
				if (PC.balls > 0 && PC.ballType !== "sterile" && PC.pubertyXY > 0) {
					if (PC.hormoneBalance > -30) {
						PC.hormoneBalance -= Math.ceil((PC.hormoneBalance + 30) / 40);
					} else if (PC.hormoneBalance < -30) {
						PC.hormoneBalance += Math.ceil((-30 - PC.hormoneBalance) / 40);
					}
				} else {
					if (PC.hormoneBalance > 10) {
						PC.hormoneBalance -= Math.ceil((PC.hormoneBalance - 10) / 40);
					} else if (PC.hormoneBalance < 10) {
						PC.hormoneBalance += Math.ceil((10 - PC.hormoneBalance) / 40);
					}
				}
			}
		} else if (PC.genes === "XY") {
			if ((PC.ovaries === 1 || PC.mpreg === 1) && PC.pubertyXX > 0) {
				if (PC.balls > 0 && PC.ballType !== "sterile" && PC.pubertyXY > 0) {
					if (PC.hormoneBalance > -10) {
						PC.hormoneBalance -= Math.ceil((PC.hormoneBalance + 10) / 40);
					} else if (PC.hormoneBalance < -10) {
						PC.hormoneBalance += Math.ceil((-10 - PC.hormoneBalance) / 40);
					}
				} else {
					if (PC.hormoneBalance > 30) {
						PC.hormoneBalance -= Math.ceil((PC.hormoneBalance - 30) / 40);
					} else if (PC.hormoneBalance < 30) {
						PC.hormoneBalance += Math.ceil((30 - PC.hormoneBalance) / 40);
					}
				}
			} else {
				if (PC.balls > 0 && PC.ballType !== "sterile" && PC.pubertyXY > 0) {
					if (PC.hormoneBalance > -50) {
						PC.hormoneBalance -= Math.ceil((PC.hormoneBalance + 50) / 40);
					} else if (PC.hormoneBalance < -50) {
						PC.hormoneBalance += Math.ceil((-50 - PC.hormoneBalance) / 40);
					}
				} else {
					if (PC.hormoneBalance > -10) {
						PC.hormoneBalance -= Math.ceil((PC.hormoneBalance + 10) / 40);
					} else if (PC.hormoneBalance < -10) {
						PC.hormoneBalance += Math.ceil((-10 - PC.hormoneBalance) / 40);
					}
				}
			}
		}
		PC.hormoneBalance = Math.clamp(PC.hormoneBalance, -500, 500);
		if (PC.geneticQuirks.galactorrhea === 2 && random(1, 100) < PC.hormoneBalance && PC.lactation === 0) {
			PC.inappropriateLactation = 1;
		}
	}

	function puberty() {
		if (V.precociousPuberty === 1) {
			let earlyPubertyFlag = 0;
			let precocious = 0;
			if (PC.physicalAge < PC.pubertyAgeXX && (PC.ovaries === 1 || PC.mpreg === 1) && PC.pubertyXX === 0) { // Female type
				/* Just having NCS speeds precocious Puberty, but also hormonal puberty affects are
				* increased while secondary growth is suppressed
				*/
				if (PC.geneMods.NCS === 1) {
					precocious -= 0.8;
				}
				if (PC.diet === "XX" || PC.diet === "XXY") {
					precocious -= 0.1;
				} else if (PC.diet === "fertility") {
					precocious -= 0.1;
				}
				if (PC.drugs === "fertility drugs") {
					precocious -= 0.1;
				} else if (PC.drugs === "female hormone injections") {
					precocious -= 1;
				} else if (PC.drugs === "male hormone injections") {
					precocious += 1;
				} else if (PC.drugs === "testicle enhancement") {
					precocious += 0.1;
				} else if (PC.drugs === "steroids") {
					precocious += 0.2;
				} else if (PC.drugs === "super fertility drugs") {
					precocious -= 0.5;
					if (PC.geneMods.NCS === 0) {
						r.push(`You feel an <span class="change positive">unusually warm sensation</span> in your lower belly and chest.`);
						if (boobSize(PC) < 400 * gigantomastiaMod && random(1, 100) < 30) {
							r.push(`Your <span class="change positive">breasts are budding.</span>`);
							PC.boobs += 50;
						}
						if (PC.hips < 2 && random(1, 100) < 10 * uterineHypersensitivityMod) {
							r.push(`Oddly, <span class="change positive">your hips have widened.</span>`);
							PC.hips += 1;
						}
						if (PC.butt < 4 && random(1, 100) < 10 + (5 * rearQuirk)) {
							r.push(`There's no mistaking that <span class="change positive">your butt has gotten bigger.</span>`);
							PC.butt += 1;
						}
					}
				} else if (PC.drugs === "hyper testicle enhancement") {
					precocious += .5;
				}
				if (PC.hormones === 1) {
					precocious -= 0.1;
				} else if (PC.hormones === -1) {
					precocious += 0.2;
				}
				if (PC.drugs === "hormone enhancers") {
					if (PC.hormones === 1) {
						precocious -= 0.1;
					} else if (PC.hormones === -1) {
						precocious += 0.1;
					}
				} else if (PC.drugs === "hormone blockers") {
					precocious += 1;
				}
				if (PC.geneticQuirks.neoteny >= 2) {
					precocious += 0.1;
				}
				if (PC.geneMods.NCS === 1) {
					precocious *= 2;
				}
				if (PC.geneticQuirks.progeria === 2) {
					precocious -= 10;
				}
				PC.pubertyAgeXX += precocious;
				if (PC.physicalAge < PC.pubertyAgeXX && PC.physicalAge > PC.pubertyAgeXX - 3 && PC.pubertyAgeXX < V.fertilityAge) {
					earlyPubertyFlag = 1;
				}
			}
			if (PC.physicalAge < PC.pubertyAgeXY && PC.balls >= 1 && PC.pubertyXY === 0) { // Male type
				precocious = 0;
				/* Just having NCS speeds precocious Puberty, but also hormonal puberty affects are increased while secondary growth is suppressed */
				if (PC.geneMods.NCS === 1) {
					precocious -= 0.8;
				}
				if (PC.diet === "XY" || PC.diet === "XXY") {
					precocious -= 0.1;
				}
				if (PC.drugs === "fertility drugs") {
					precocious += 0.2;
				} else if (PC.drugs === "female hormone injections") {
					precocious += 1;
				} else if (PC.drugs === "male hormone injections") {
					precocious -= 1;
				} else if (PC.drugs === "testicle enhancement") {
					precocious -= 0.1;
				} else if (PC.drugs === "steroids") {
					precocious -= 0.2;
				} else if (PC.drugs === "hyper testicle enhancement") {
					precocious -= 0.5;
					if (PC.geneMods.NCS === 0) {
						r.push(`You feel an <span class="change positive">unusual heat</span> in your groin. It feels good to touch.`);
						if (PC.dick < 4 && random(1, 100) < 30) {
							r.push(`You penis has grown <span class="change positive">heavy, hot and oversensitive.</span>`);
							PC.dick += 1;
						}
						if (PC.balls < 4 && random(1, 100) < 30) {
							r.push(`Not only are your balls <span class="change positive">heavy and tingling,</span> but you feel like you've been leaking a little.`);
							PC.balls += 1;
						}
					}
				} else if (PC.drugs === "super fertility drugs") {
					precocious -= 1;
				}
				if (PC.hormones === 1) {
					precocious += 0.2;
				} else if (PC.hormones === -1) {
					precocious -= 0.1;
				}
				if (PC.drugs === "hormone enhancers") {
					if (PC.hormones === 1) {
						precocious += 0.1;
					} else if (PC.hormones === -1) {
						precocious -= 0.1;
					}
				} else if (PC.drugs === "hormone blockers") {
					precocious += 1;
				}
				if (PC.geneticQuirks.neoteny >= 2) {
					precocious += 0.1;
				}
				if (PC.geneMods.NCS === 1) {
					precocious *= 2;
				}
				if (PC.geneticQuirks.progeria === 2) {
					precocious -= 10;
				}
				PC.pubertyAgeXY += precocious;
				if (PC.physicalAge < PC.pubertyAgeXY && PC.physicalAge > PC.pubertyAgeXY - 3 && PC.pubertyAgeXY < V.potencyAge && earlyPubertyFlag !== 1) {
					earlyPubertyFlag = 1;
				}
			}
			if (earlyPubertyFlag === 1) {
				r.push(`It looks like you are <span class="puberty">beginning to go through puberty,</span> if a bit early.`);
			}
		}
		if (PC.ovaries === 1 || PC.mpreg === 1) {
			if (PC.pubertyXX === 0) {
				if (PC.physicalAge >= PC.pubertyAgeXX) {
					PC.pubertyXX = 1;
					// in the future, improve this to hide puberty up until period?
					r.push(`After several days of unrelenting pain in your stomach, you have your first period.`);
					if (PC.genes === "XX") {
						r.push(`<span class="puberty">You're a woman now.</span>`);
					} else {
						r.push(`<span class="puberty">Your ladyparts have matured</span> and are now fully functional.`);
					}
					if (PC.geneticQuirks.gigantomastia === 3 && random(1, 100) < PC.hormoneBalance) {
						PC.geneticQuirks.gigantomastia = 2;
					}
					if (PC.geneticQuirks.macromastia === 3 && random(1, 100) < PC.hormoneBalance) {
						PC.geneticQuirks.macromastia = 2;
					}
					if (PC.geneticQuirks.galactorrhea === 3) {
						PC.geneticQuirks.galactorrhea = 2;
						if (random(1, 100) < PC.hormoneBalance && PC.lactation === 0) {
							PC.inappropriateLactation = 1;
						}
					}
				}
			}
		}
		if (PC.balls > 0 && PC.ballType !== "sterile") {
			if (PC.pubertyXY === 0) {
				if (PC.physicalAge >= PC.pubertyAgeXY) {
					PC.pubertyXY = 1;
					r.push(`You wake up from a wonderful dream only to discover you've wet the bed.`);
					if (S.Concubine && fuckSlavesLength() >= 1) {
						r.push(`Your giggling bedslaves coddle and caress you before enlightening your sleep-fogged mind as to just what happened the best way they know how.`);
						if (PC.genes === "XY") {
							r.push(`<span class="puberty">You became a man that night.</span>`);
						} else {
							r.push(`<span class="puberty">You know what it feels like to be a man now.</span>`);
						}
					} else {
						r.push(`You've been feeling very amorous lately, and this only solidifies that ${(PC.genes === "XY") ? "you're becoming a man" : "your maleness has reached maturity"}. Luckily for you, you're living the ideal life to satisfy your newfound needs.`);
					}

					if (PC.geneticQuirks.galactorrhea === 3) {
						PC.geneticQuirks.galactorrhea = 2;
						if (random(1, 100) < PC.hormoneBalance && PC.lactation === 0) {
							PC.inappropriateLactation = 1;
						}
					}
				}
			}
		}
	}

	function bellySagging() {
		if (PC.belly >= 1000000) {
			if (PC.bellySag < 50) {
				PC.bellySag += 1;
				if (PC.preg > 0) {
					PC.bellySagPreg += 1;
				}
			} else if (PC.preg > 0 && PC.bellySagPreg < 50) {
				PC.bellySagPreg += 1;
			}
			if (PC.geneMods.rapidCellGrowth === 1) {
				PC.bellySag += 3;
				if (PC.preg > 0) {
					PC.bellySagPreg += 3;
				}
			}
		} else if (PC.belly >= 750000) {
			if (PC.bellySag < 30) {
				PC.bellySag += 0.7;
				if (PC.preg > 0) {
					PC.bellySagPreg += 0.7;
				}
			} else if (PC.preg > 0 && PC.bellySagPreg < 30) {
				PC.bellySagPreg += 0.7;
			}
			if (PC.geneMods.rapidCellGrowth === 1) {
				PC.bellySag += 1;
				if (PC.preg > 0) {
					PC.bellySagPreg += 1;
				}
			}
		} else if (PC.belly >= 600000) {
			if (PC.bellySag < 20) {
				PC.bellySag += 0.5;
				if (PC.preg > 0) {
					PC.bellySagPreg += 0.5;
				}
			} else if (PC.preg > 0 && PC.bellySagPreg < 20) {
				PC.bellySagPreg += 0.5;
			}
			if (PC.geneMods.rapidCellGrowth === 1) {
				PC.bellySag += 1;
				if (PC.preg > 0) {
					PC.bellySagPreg += 1;
				}
			}
		} else if (PC.belly >= 450000) {
			if (PC.bellySag < 15) {
				PC.bellySag += 0.4;
				if (PC.preg > 0) {
					PC.bellySagPreg += 0.4;
				}
			} else if (PC.preg > 0 && PC.bellySagPreg < 15) {
				PC.bellySagPreg += 0.4;
			}
			if (PC.geneMods.rapidCellGrowth === 1) {
				PC.bellySag += 0.5;
				if (PC.preg > 0) {
					PC.bellySagPreg += 0.5;
				}
			}
		} else if (PC.belly >= 300000) {
			if (PC.bellySag < 10) {
				PC.bellySag += 0.3;
				if (PC.preg > 0) {
					PC.bellySagPreg += 0.3;
				}
			} else if (PC.preg > 0 && PC.bellySagPreg < 10) {
				PC.bellySagPreg += 0.3;
			}
			if (PC.geneMods.rapidCellGrowth === 1) {
				PC.bellySag += 0.5;
				if (PC.preg > 0) {
					PC.bellySagPreg += 0.5;
				}
			}
		} else if (PC.belly >= 100000) {
			if (PC.bellySag < 10) {
				PC.bellySag += 0.2;
				if (PC.preg > 0) {
					PC.bellySagPreg += 0.2;
				}
			} else if (PC.preg > 0 && PC.bellySagPreg < 10) {
				PC.bellySagPreg += 0.2;
			}
			if (PC.geneMods.rapidCellGrowth === 1) {
				PC.bellySag += 0.3;
				if (PC.preg > 0) {
					PC.bellySagPreg += 0.3;
				}
			}
		} else if (PC.bellyPreg >= 10000 || PC.bellyImplant >= 10000) {
			if (PC.bellySag < 5) {
				PC.bellySag += 0.1;
				if (PC.preg > 0) {
					PC.bellySagPreg += 0.1;
				}
			} else if (PC.preg > 0 && PC.bellySagPreg < 5) {
				PC.bellySagPreg += 0.1;
			}
			if (PC.geneMods.rapidCellGrowth === 1) {
				PC.bellySag += 0.2;
				if (PC.preg > 0) {
					PC.bellySagPreg += 0.2;
				}
			}
		}
		if (PC.bellySagPreg > PC.bellySag) {
			PC.bellySagPreg = PC.bellySag;
		}

		if (PC.bellySag > 0 && PC.belly < 1500 && PC.geneMods.rapidCellGrowth !== 1) {
			let bellySagReduction = 0;
			if (PC.muscles > 95) {
				if (random(1, 100) > 1) {
					r.push(`Your loose, yet still visible, abdominals <span class="change positive">are eager to get back in shape</span> after being`);
					if (PC.bellySagPreg > 0) {
						r.push(`worked over by pregnancy`);
					} else {
						r.push(`stretched out`);
					}
					r.push(`for so long.`);
					bellySagReduction = 0.5;
				}
			} else if (PC.muscles >= 30) {
				if (random(1, 100) > 20) {
					r.push(`Your sagging muscular belly <span class="change positive">firms up</span> readily`);
					if (PC.bellySagPreg > 0) {
						r.push(`after being stretched out of shape by your pregnancy.`);
					} else {
						r.push(`now that you aren't constantly stretching it out by overinflating.`);
					}
					bellySagReduction = 0.4;
				}
			} else if (PC.muscles >= 5) {
				if (random(1, 100) > 40) {
					r.push(`Your sagging belly <span class="change positive">regains some of its tone</span>`);
					if (PC.bellySagPreg > 0) {
						r.push(`after being stretched out of shape by your pregnancy.`);
					} else {
						r.push(`now that you aren't constantly stretching it out by overinflating.`);
					}
					bellySagReduction = 0.3;
				}
			} else {
				if (random(1, 100) > 60) {
					r.push(`Your sagging belly <span class="change positive">tightens up a little</span>`);
					if (PC.bellySagPreg > 0) {
						r.push(`after your pregnancy.`);
					} else {
						r.push(`now that you aren't constantly stretching it out by overinflating.`);
					}
					bellySagReduction = 0.2;
				}
			}
			PC.bellySag -= bellySagReduction;
			PC.bellySagPreg -= bellySagReduction;
			PC.bellySag = Math.max(0, PC.bellySag);
			PC.bellySagPreg = Math.max(0, PC.bellySagPreg);
		}
	}

	function anaphrodisiacEffects(PC, oldEnergy) {
		const maxEnergyGain = Math.round((75 - oldEnergy) / 9.3);
		if (PC.aphrodisiacs === -1 && PC.energy - oldEnergy > maxEnergyGain) {
			r.push(`Anaphrodisiacs help <span class="libido dec">keep your sex drive under control.</span>`);
			PC.energy = oldEnergy + maxEnergyGain;
		}
	}

	function mainLaborTriggers() {
		if (PC.pregControl !== "labor suppressors") {
			if (WombBirthReady(PC, PC.pregData.normalBirth * 1.075) > 0) {
				// check for really ready fetuses - 43 weeks - max, overdue
				startLabor(PC);
			} else if (WombBirthReady(PC, PC.pregData.normalBirth) > 0 && (random(1, 100) > 50)) {
				// check for really ready fetuses - 40 weeks - normal
				startLabor(PC);
			} else if (WombBirthReady(PC, PC.pregData.normalBirth / 1.1111) > 0 && (random(1, 100) > 90)) {
				// check for really ready fetuses - 36 weeks minimum
				startLabor(PC);
			}
		}
		if (isInLabor(PC)) {
			if (PC.counter.birthsTotal > 0) {
				r.push(`<span class="red">A dull cramp runs down your middle.</span> You'll be giving birth soon.`);
			} else {
				r.push(`You begin to experience <span class="red">odd cramps</span> in your lower body. Contractions, more than likely.`);
			}
		}
		/*
		if (V.dangerousPregnancy === 1 && !isInLabor(PC)) {
			let miscarriage = 0;
			if ((PC.pregAdaptation < 500) || (PC.preg > slave.pregData.normalBirth / 2 && PC.womb.find((ft) => ft.genetics.geneticQuirks.polyhydramnios === 2))) {
				let miscarriageChance = -10;
				miscarriageChance += ((PC.bellyPreg / 1000) - PC.pregAdaptation);
				// this could use to not be linear
				if (PC.inflation > 0) {
					miscarriageChance += 10;
				}
				if (PC.health.health < -20) {
					miscarriageChance -= (PC.health.health);
				} else if (PC.health.health > 80) {
					miscarriageChance -= (PC.health.health / 10);
				}
				if (PC.weight < -50) {
					miscarriageChance -= PC.weight;
				}
				if (onBedRest(PC)) {
					miscarriageChance -= 300;
				}
				if (PC.bellyAccessory === "a support band") {
					miscarriageChance -= 30;
				}
				if (PC.pregControl === "labor suppressors") {
					miscarriageChance -= 10000;
				}
				if (PC.preg > PC.pregData.normalBirth / 2 && PC.womb.find((ft) => ft.genetics.geneticQuirks.polyhydramnios === 2)) {
					if (PC.bellyPreg > 50000) {
						miscarriageChance = 100;
					}
				}
				miscarriageChance = Math.round(miscarriageChance);
				if (miscarriageChance > random(0, 100)) {
					const chance = random(1, 100);
					if (PC.preg >= PC.pregData.normalBirth / 1.33) {
						startLabor(PC);
						miscarriage = 1;
					} else if (PC.preg > PC.pregData.normalBirth / 1.48) {
						PC.prematureBirth = 1;
						startLabor(PC);
						miscarriage = 1;
					} else if (PC.preg > PC.pregData.normalBirth / 1.6 && chance > 10) {
						PC.prematureBirth = 1;
						startLabor(PC);
						miscarriage = 1;
					} else if (PC.preg > PC.pregData.normalBirth / 1.73 && chance > 40) {
						PC.prematureBirth = 1;
						startLabor(PC);
						miscarriage = 1;
					} else if (PC.preg > PC.pregData.normalBirth / 1.81 && chance > 75) {
						PC.prematureBirth = 1;
						startLabor(PC);
						miscarriage = 1;
					} else {
						// this needs to move to birth
						r.push(`Your overwhelmed body has <span class="miscarriage">forced you to miscarry,</span> possibly saving your life.`);
						TerminatePregnancy(PC);
						actX(PC, "abortions");
						if (PC.abortionTat > -1) {
							PC.abortionTat++;
							r.push(`The temporary tattoo of a child has been replaced with your ${ordinalSuffix(PC.abortionTat)} crossed out infant.`);
							cashX(forceNeg(V.modCost), "slaveMod", PC);
						}
						miscarriage = 1;
					}
				}
			}
			if (V.seeExtreme === 1) {
				if (miscarriage !== 1 && PC.bellyPreg >= 100000 && PC.geneMods.rapidCellGrowth !== 1) {
					// If she can't relieve the pressure that way, will she hold?
					if (PC.bellyPreg >= 500000 || PC.wombImplant !== "restraint") {
						if ((PC.belly > (PC.pregAdaptation * 3200)) || PC.bellyPreg >= 500000) {
							let burstChance = -80;
							burstChance += ((PC.belly / 1000) - PC.pregAdaptation);
							// this could use to not be linear
							if (PC.health.health < -20) {
								burstChance -= (PC.health.health);
							} else if (PC.health.health > 80) {
								burstChance -= (PC.health.health / 10);
							}
							if (PC.weight < 0) {
								burstChance -= PC.weight;
							}
							burstChance -= PC.bellySag;
							burstChance -= PC.muscles;
							if (PC.bellyAccessory === "a support band") {
								burstChance -= 10;
							}
							if (onBedRest(PC)) {
								burstChance -= 250;
							}
							burstChance = Math.round(burstChance);
							if (burstChance > random(0, 100)) {
								burst(PC);
							} else {
								r.push(`Constant <span class="health dec">`);
								if (PC.geneticQuirks.uterineHypersensitivity === 2) {
									r.push(`painful orgasms`);
								} else {
									r.push(`sharp pains`);
								}
								r.push(`</span> emanate from your womb; <span class="health dec">it is beginning to break!</span>`);
							}
						}
					}
				}
			}
		}
		*/
	}

	function slaveDeath() {
		/*
		let deathSeed;
		if (PC.health.health <= -90) {
			deathSeed = (PC.health.health - PC.physicalAge - (PC.chem * 2) - (PC.addict * 2));
			if (PC.weight < -50 || PC.weight > 95) {
				deathSeed -= 100;
			}
			if (PC.weight > 190) {
				deathSeed -= 100;
			}
			if (PC.aphrodisiacs > 0) {
				deathSeed -= (75 * PC.aphrodisiacs);
			}
			if (PC.inflationType === "aphrodisiac") {
				deathSeed -= (100 * PC.inflation);
			}
			if (PC.diet === "medicinal") {
				deathSeed += 200;
			}
			if (random(1, 1000) > (600 + deathSeed)) {
				planDeath(PC, "lowHealth");
			}
			if ((PC.aphrodisiacs > 0 || PC.inflationType === "aphrodisiac") && random(1, 1000) > (400 + deathSeed)) {
				planDeath(PC, "overdosed");
			}
		}
		if (V.seeAge === 1) {
			deathSeed = ((PC.health.health * 2) - (PC.physicalAge * 2) - (PC.chem * 4) - (PC.addict * 3));
			if (PC.physicalAge >= Math.max((70 + (PC.health.health / 5) - (PC.addict) - (PC.chem / 20)), 50) && random(1, 1000) > 800 + deathSeed) {
				planDeath(PC, "oldAge");
			}
		}
		*/
	}

	function hairGrowth() {
		if (PC.hLength < 200) {
			PC.hLength += 1;
		}
	}
};