code:
{
	class MilkingResults {
		constructor() {
			/** full description of milking */
			this.text = ``;
			/** cum collected in deciliters */
			this.cum = 0;
			/** cash expected from sale of cum */
			this.cumSale = 0;
			/** girlcum collected in deciliters */
			this.fluid = 0;
			/** cash expected from sale of girlcum */
			this.fluidSale = 0;
			/** milk collected in gallons */
			this.milk = 0;
			/** cash expected from sale of milk */
			this.milkSale = 0;
		}

		/** total cash collected by this milking */
		get cash() {
			return this.cumSale + this.fluidSale + this.milkSale;
		}
	}

	/**
	 * @param {FC.ReportSlave} slave
	 * @param {number} [multiplier=1.0]
	 * @param {boolean} [preview=false] are we trying to preview milking income, or may we make changes to the slave?
	 * @returns {MilkingResults}
	 */
	App.SlaveAssignment.getMilked = function saGetMilked(slave, multiplier = 1.0, preview = false) {
		const r = new MilkingResults();
		const arcology = V.arcologies[0];
		const {
			he, him, his, He, His
		} = getPronouns(slave);

		// could probably move these back or something
		let implantEffect;

		let vignetteCash = 0;
		let vignetteRep = 0;

		if (!preview) {
			jobPreface(slave);
		}

		if (slave.lactation > 0) {
			harvestMilk(slave, multiplier, preview);
			if (!preview) {
				milkingEffects(slave);
			}
		}
		// Limits penthouse milkers to milk only.
		if ([Job.ARCADE, Job.MILKED, Job.DAIRY].includes(slave.assignment) || preview) {
			if (slave.balls > 0) {
				harvestCum(slave, multiplier);
				if (!preview) {
					cumEffects(slave);
				}
			}
			if (slave.genes === "XX" && slave.prostate > 0 && slave.balls === 0) {
				harvestGirlCum(slave, multiplier);
			}
		}
		if (!preview) {
			recordTotals(slave);
			physicalEffects(slave);
			mentalEffects(slave);
			if (V.showVignettes === 1 && (slave.assignment === window.Job.MILKED || slave.assignment === window.Job.DAIRY)) {
				assignmentVignette(slave);
			}
			if (slave.assignment === window.Job.MILKED) {
				cashX(r.cash, "slaveAssignmentMilked", slave);
			} else if (slave.assignment === window.Job.DAIRY) {
				recordFacilityStatistics(getSlaveStatisticData(slave, V.facility.dairy));
				applyFSDecoration();
				cashX(r.cash, "slaveAssignmentDairy", slave);
			} else {
				cashX(r.cash, "slaveAssignmentExtraMilk", slave);
			}
		}
		return r;

		/**
		 * @param {App.Entity.SlaveState} slave
		 */
		function recordTotals(slave) {
			actX(slave, "milk", r.milk);
			actX(slave, "cum", r.cum);
		}

		/**
		 * @param {FC.SlaveStatisticData} incomeStats
		 */
		function recordFacilityStatistics(incomeStats) {
			incomeStats.milk = r.milk;
			incomeStats.cum = r.cum;
			incomeStats.fluid = r.fluid;
			incomeStats.income = r.cash + vignetteCash;
			incomeStats.rep = vignetteRep;
		}

		/**
		 * @param {App.Entity.SlaveState} slave
		 */
		function jobPreface(slave) {
			r.text += `gets milked this week.`;
			if (V.dairy > 0 && V.dairyRestraintsSetting < 2) {
				if ((V.universalRulesFacilityWork === 1 && slave.assignment === window.Job.MILKED && V.dairySpots > 0) || (slave.assignment === window.Job.DAIRY)) {
					if (slave.assignment === window.Job.MILKED) {
						r.text += ` Since there's extra space in ${V.dairyName}, ${he} spends most of ${his} milkings there.`;
						V.dairySpots -= 1; // Would this need to be pulled for statistics gathering?
					}
					if (V.MilkmaidID !== 0) {
						r.text += ` While there, ${he} gets the benefit of ${S.Milkmaid.slaveName}'s `;
						if (S.Milkmaid.physicalAge < 21) {
							r.text += `youthful energy`;
						} else {
							r.text += `care`;
						}
						if (S.Milkmaid.skill.oral >= 100) {
							r.text += ` and talented tongue`;
						}
						r.text += `.`;
						if (slave.devotion < V.milkmaidDevotionThreshold) {
							slave.devotion += V.milkmaidDevotionBonus;
						}
						if (slave.trust < V.milkmaidTrustThreshold) {
							slave.trust += V.milkmaidTrustBonus;
						}
						if (slave.health.condition < 100) {
							improveCondition(slave, V.milkmaidHealthBonus);
						}
					}
				}
			}
		}

		/**
		 * @param {App.Entity.SlaveState} slave
		 * @param {number} multiplier
		 * @param {boolean} preview
		 */
		function harvestMilk(slave, multiplier, preview) {
			r.milk = milkAmount(slave);

			r.text += ` ${He} produces from ${his} ${jsEither(["boobs", "breasts", "mammaries", "tits", "udders"])}, which have a combined volume of ${(slave.boobs * 2)} CCs; `;
			if (slave.lactation === 1) {
				r.text += `${he} is lactating naturally and produces `;
				if (implantEffect >= 0.90) {
					r.text += `a weak trickle of milk.`;
				} else if (implantEffect >= 0.75) {
					r.text += `a weak stream of milk.`;
				} else {
					r.text += `a healthy stream of milk.`;
				}
				// I want to increase lactationAdaptation for normal milk too. Since it is locked to integers, I would need something like .ageAdjust it seems.
			} else if (slave.lactation === 2) {
				r.text += `${he} is on lactation drugs and produces `;
				if (implantEffect >= 0.90) {
					r.text += `a steady flow of milk.`;
				} else if (implantEffect >= 0.75) {
					r.text += `strong bursts of milk.`;
				} else {
					r.text += `a river of milk.`;
				}
				if (!preview) {
					if (slave.lactationAdaptation < 100) {
						r.text += ` ${His} udders are forced to adapt to this unnatural productivity.`;
						slave.lactationAdaptation += 1;
					}
					if (slave.curatives === 0 && slave.inflationType !== "curative") {
						r.text += ` The stress of extreme milk production <span class="health dec">damages ${his} health.</span>`;
						healthDamage(slave, 3);
					}
				}
			}

			if (slave.boobsMilk > 0) {
				r.text += ` ${He} was in need of a good milking, too.`;
			}

			if (slave.devotion > 50) {
				r.text += ` ${He}'s such a happy cow that ${his} mental state has a positive impact on ${his} production.`;
			} else if (slave.devotion < -50) {
				r.text += ` ${He}'s such an unhappy cow that ${his} mental state has a negative impact on ${his} production.`;
			}

			if (slave.boobsImplant > 0) {
				implantEffect = (slave.boobsImplant / slave.boobs);
			}
			if (slave.boobsImplant > 0) {
				r.text += ` However, ${his} `;
				if (implantEffect >= 0.90) {
					r.text += `breast implants are ill-suited for`;
				} else if (implantEffect >= 0.75) {
					r.text += `breasts are almost entirely implant, greatly restricting ${his}`;
				} else if (implantEffect >= 0.60) {
					r.text += `breasts are mostly implant, restricting ${his}`;
				} else if (implantEffect >= 0.45) {
					r.text += `implants make up a considerable amount of ${his} breasts and greatly impede`;
				} else if (implantEffect >= 0.30) {
					r.text += `breast implants take up enough space to impede`;
				} else if (implantEffect >= 0.10) {
					r.text += `breast implants slightly impede`;
				} else {
					r.text += `breast implants cause a minor decrease in`;
				}
				r.text += ` milk production`;
				if (implantEffect >= 0.90) {
					r.text += `, given the lack of actual breast flesh`;
				}
				r.text += `.`;
			}

			let hormones = (slave.hormoneBalance / 100);
			if (slave.balls !== 0) {
				hormones -= 1;
			}
			if (slave.ovaries !== 0 || slave.mpreg !== 0) {
				hormones += 1;
			}
			if (hormones > 1) {
				r.text += ` ${His} internal chemistry is perfectly suited to milk production.`;
			} else if (hormones > 0) {
				r.text += ` ${His} hormonal balance favors milk production.`;
			} else if (hormones < 0) {
				r.text += ` ${His} hormonal balance impedes milk production.`;
			} else if (hormones < -1) {
				r.text += ` ${His} internal chemistry is poorly suited to milk production.`;
			}

			if (!preview && slave.lactationAdaptation < 100 && slave.assignment === Job.MILKED || slave.assignment === Job.DAIRY) {
				r.text += ` Living as a cow helps ${his} body and mind adapt to producing milk.`;
				slave.lactationAdaptation += 1;
			}

			if (!preview && slave.preg > (slave.pregData.normalBirth / 8) && slave.pregKnown === 1) {
				r.text += ` ${His} pregnancy helps ${his} body produce more milk naturally`;
				if (slave.lactationAdaptation < 100) {
					r.text += `, and also helps it adapt to milk production`;
					slave.lactationAdaptation += 1;
				}
				r.text += `.`;
			}

			if (slave.health.condition > 50) {
				r.text += ` ${His} shining health helps ${him} really produce.`;
			} else if (slave.health.condition < -50) {
				r.text += ` ${His} poor health impedes milk production.`;
			}

			if (slave.weight > 10) {
				r.text += ` ${His} extra weight supports ${his} productivity.`;
			} else if (slave.weight < -10) {
				r.text += ` ${His} thinness hinders ${his} productivity.`;
			}

			if (slave.lactationAdaptation > 10) {
				if (slave.lactationAdaptation > 50) {
					r.text += ` ${His} body has adapted heavily to milk production, making ${him} extremely productive.`;
				} else {
					r.text += ` ${His} body has gotten used to producing milk, making ${him} very productive.`;
				}
			}

			if (V.dairySlimMaintainUpgrade === 1) {
				if (V.dairySlimMaintain === 1) {
					if (slave.boobs <= 700) {
						if (arcology.FSSlimnessEnthusiast > 80) {
							r.text += ` Your arcology's milkers are optimized to extract maximum output from small breasted slaves, which substantially increases ${his} otherwise modest productivity.`;
							r.milk *= 1.5;
						} else if (arcology.FSSlimnessEnthusiast > 20) {
							r.text += ` Your arcology's milkers have been carefully modified to more readily accommodate slaves with tiny breasts, which slightly mitigates ${his} less than ideal physiology for milk production.`;
							r.milk *= 1.1;
						}
					}
				}
			}

			if (slave.assignment === Job.DAIRY) { // FIXME: no text for this block???
				if (V.dairyFeedersUpgrade === 1) {
					if (V.dairyFeedersSetting > 0) {
						r.milk += (r.milk * (0.1 * (V.dairyFeedersUpgrade + V.dairyRestraintsSetting + ((50 - slave.physicalAge) / 20))));
						if (slave.chem > 360) {
							r.milk *= 0.6;
						} else if (slave.chem > 100) {
							r.milk *= ((600 - slave.chem) / 600);
						}
					}
				}
			}

			r.milk *= multiplier;
			r.milk = Math.max(Math.trunc(r.milk), 1);

			r.text += ` As a result, ${he} produces ${numberWithPluralOne(r.milk, "liter")} of milk over the week.`;

			// make sure milkSale is set here
			if (arcology.FSPastoralistLaw === 1) {
				r.milkSale = (r.milk * (8 + Math.trunc(arcology.FSPastoralist / 30)));
				r.text += ` Since breast milk is ${arcology.name}'s only legal dairy product, ${he} can scarcely be milked fast enough, and ${he} makes <span class="cash inc">${cashFormat(r.milkSale)}.</span>`;
			} else if (arcology.FSPastoralist !== "unset") {
				r.milkSale = (r.milk * (6 + Math.trunc(arcology.FSPastoralist / 30)));
				r.text += ` Since milk is fast becoming a major part of ${arcology.name}'s dietary culture, ${his} milk is in demand, and ${he} makes <span class="cash inc">${cashFormat(r.milkSale)}.</span>`;
			} else if (arcology.FSRepopulationFocusLaw === 1) {
				r.milkSale = (r.milk * (6 + Math.trunc(arcology.FSRepopulationFocus / 50)));
				r.text += ` Since the number of hungry babies outweighs the supply of available breasts in ${arcology.name}, ${his} milk is in demand, and ${he} makes <span class="cash inc">${cashFormat(r.milkSale)}.</span>`;
			} else {
				r.milkSale = (r.milk * 6);
				r.text += ` ${His} milk is sold for <span class="cash inc">${cashFormat(r.milkSale)}.</span>`;
			}
		}

		/**
		 * @param {App.Entity.SlaveState} slave
		 */
		function milkingEffects(slave) {
			if (slave.fetishKnown) {
				if (slave.fetish === "boobs" || slave.energy > 95) {
					r.text += ` Getting constantly milked is as good as sex, as far as ${he}'s concerned. <span class="devotion inc">${He} is happy</span> to have ${his} breasts receive so much attention.`;
					slave.devotion += 1;
					if (slave.need > 0) {
						slave.need = 0;
					}
				}
			}

			if (slave.career === "a dairy cow" && slave.fetish !== "mindbroken" && slave.fuckdoll === 0) {
				r.text += ` ${He} feels like <span class="devotion inc">${he} was made to be milked,</span> <span class="trust inc">not that ${he}'d complain about such a good feeling.</span>`;
				slave.devotion++;
				slave.trust++;
				if (slave.need > 0) {
					slave.need = 0;
				}
			}

			if (slave.nipples !== "huge") {
				if (slave.nipples === "inverted") {
					if (slave.fetish === "masochist" && slave.fetishKnown === 1) {
						r.text += ` Having the milkers constantly haul ${his} inverted nipples out is <span class="devotion inc">extremely uncomfortable; ${he} loves it.</span>`;
						slave.devotion += 3;
					} else {
						r.text += ` Having the milkers constantly haul ${his} inverted nipples out is <span class="devotion dec">extremely uncomfortable.</span>`;
						slave.devotion -= 3;
					}
					if (jsRandom(1, 100) > 50) {
						r.text += ` The constant suction <span class="change positive">permanently protrudes them,</span> and `;
						if (jsRandom(1, 2) === 1) {
							r.text += `it turns out they're absolutely massive.`;
							slave.nipples = "huge";
						} else {
							r.text += `it turns out they're nice and puffy.`;
							slave.nipples = "puffy";
						}
					}
				} else if (slave.nipples === "partially inverted") {
					if (slave.fetish === "masochist" && slave.fetishKnown === 1) {
						r.text += ` Having the milkers constantly haul ${his} inverted nipples out is <span class="devotion inc">quite uncomfortable; ${he} loves it.</span>`;
						slave.devotion += 1;
					} else {
						r.text += ` Having the milkers constantly haul ${his} inverted nipples out is <span class="devotion dec">quite uncomfortable.</span>`;
						slave.devotion -= 1;
					}
					if (jsRandom(1, 100) > 30) {
						r.text += ` The constant suction <span class="change positive">permanently protrudes them,</span> and `;
						if (jsRandom(1, 2) === 1) {
							r.text += `it turns out they're pretty cute.`;
							slave.nipples = "cute";
						} else {
							r.text += `it turns out they're nice and puffy.`;
							slave.nipples = "puffy";
						}
					}
				} else if (slave.nipples === "puffy" && jsRandom(1, 100) > 90) {
					r.text += ` Producing this river of milk <span class="change positive">enlarges ${his} nipples:</span> they're now enormous.`;
					slave.nipples = "huge";
				} else if (slave.nipples === "cute" && jsRandom(1, 100) > 80) {
					r.text += ` Producing this river of milk <span class="change positive">makes ${his} nipples nice and puffy.</span>`;
					slave.nipples = "puffy";
				} else if (slave.nipples === "tiny") {
					r.text += ` Producing this river of milk <span class="change positive">makes ${his} nipples grow to a nice size.</span>`;
					slave.nipples = "cute";
				} else if (slave.nipples === "flat") {
					r.text += ` Producing this river of milk <span class="change positive">forces ${his} nipples to grow to a more suitable size.</span>`;
					slave.nipples = "huge";
				} else if (slave.areolae < 4 && jsRandom(1, 100) > (30 + (slave.areolae * 20))) {
					if (slave.nipples === "fuckable") {
						r.text += ` The constant suction around of ${his} nipples as their depths are drained of milk`;
					} else {
						r.text += ` Producing this river of milk`;
					}
					r.text += ` <span class="change positive">broadens ${his} areolae.</span>`;
					slave.areolae += 1;
				}
			}
			slave.lactationDuration = 2;
			if (slave.boobsMilk > 0) {
				slave.boobs -= slave.boobsMilk;
				slave.boobsMilk = 0;
			}
		}

		/**
		 * @param {App.Entity.SlaveState} slave
		 * @param {number} multiplier
		 */
		function harvestCum(slave, multiplier) {
			let qualityMultiplier = 1.0;
			r.cum = cumAmount(slave);

			if (slave.lactation > 0) {
				r.text += ` ${His} `;
			} else {
				r.text += ` ${slave.slaveName}'s `;
			}

			if (slave.dick > 0) {
				if (slave.dick > 6) {
					r.text += `inhuman`;
				} else if (slave.dick > 5) {
					r.text += `massive`;
				} else if (slave.dick > 4) {
					r.text += `big`;
				} else if (slave.dick > 3) {
					r.text += `sizable`;
				} else if (slave.dick > 2) {
					r.text += `moderate`;
				} else if (slave.dick > 1) {
					r.text += `little`;
				} else {
					r.text += `tiny`;
				}
				r.text += ` prick is`;
				if (slave.lactation > 0) {
					r.text += ` also`;
				}
				r.text += ` machine-milked`;
			} else {
				r.text += `butt is machine-fucked`;
			}
			r.text += ` to extract the cum from ${his} `;
			if (slave.scrotum === 0) {
				r.text += `invisible`;
			} else {
				if (slave.balls > 10) {
					r.text += `hypertrophied`;
				} else if (slave.balls >= 10) {
					r.text += `inhuman`;
				} else if (slave.balls >= 9) {
					r.text += `titanic`;
				} else if (slave.balls >= 8) {
					r.text += `gigantic`;
				} else if (slave.balls >= 7) {
					r.text += `monstrous`;
				} else if (slave.balls >= 6) {
					r.text += `pendulous`;
				} else if (slave.balls >= 5) {
					r.text += `huge`;
				} else if (slave.balls >= 4) {
					r.text += `big`;
				} else if (slave.balls >= 3) {
					r.text += `average`;
				} else {
					r.text += `pathetic`;
				}
			}
			if (slave.drugs === "testicle enhancement") {
				r.text += ` balls, relieving them of the excessive cum production caused by the testicle enhancement drugs.`;
			} else if (slave.drugs === "hyper testicle enhancement") {
				r.text += ` balls, relieving them of the excessive cum production caused by the hyper testicle enhancement drugs.`;
			} else {
				r.text += ` balls.`;
			}

			if (slave.diet === "cum production") {
				r.text += ` ${His} diet is designed for cum production.`;
			}

			const cumHormones = (slave.hormoneBalance / 50);
			if (cumHormones < -1) {
				r.text += ` ${His} internal chemistry is perfectly suited to cum production.`;
			} else if (cumHormones < 0) {
				r.text += ` ${His} hormonal balance favors cum production.`;
			} else if (cumHormones > 0) {
				r.text += ` ${His} hormonal balance impedes cum production.`;
			} else if (cumHormones > 1) {
				r.text += ` ${His} internal chemistry is poorly suited to cum production.`;
			}

			if (slave.scrotum === 0) {
				r.text += ` ${He} does produce cum despite ${his} apparent ballslessness, but less than ${he} would if they weren't hidden inside ${him}.`;
			}

			if (slave.prostate > 0) {
				if (slave.prostate > 2) {
					r.text += ` ${His} heavily altered prostate greatly increases the volume of ${his} ejaculations and promotes excessive, watery semen production. This dilute ejaculate sells poorly compared to normal cum.`;
				} else if (slave.prostate > 1) {
					r.text += ` ${His} hyperactive prostate increases the volume of ${his} ejaculations and promotes good semen production.`;
				}
			} else {
				r.text += ` ${His} lack of a prostate reduces the health and volume of ${his} ejaculations.`;
				qualityMultiplier *= 0.5;
			}

			if (slave.devotion > 50) {
				r.text += ` ${He}'s so happy that ${his} mental state has a positive impact on ${his} semen production.`;
			} else if (slave.devotion < -50) {
				r.text += ` ${He}'s so unhappy that ${his} mental state has a negative impact on ${his} semen production.`;
			}

			if (slave.health.condition > 50) {
				r.text += ` ${His} shining health helps ${him} really produce.`;
			} else if (slave.health.condition < -50) {
				r.text += ` ${His} poor health impedes semen production.`;
			}

			if (slave.vasectomy === 1) {
				r.text += ` ${His} cum lacks the primary ingredient, sperm, thanks to ${his} vasectomy, <span class="cash dec">considerably lowering the value</span> of ${his} ejaculate.`;
				qualityMultiplier *= 0.2;
			} else if (slave.ballType === "sterile") {
				r.text += ` ${His} cum lacks vigor entirely, thanks to ${his} chemical castration, <span class="cash dec">considerably lowering the value</span> of ${his} ejaculate.`;
				qualityMultiplier *= 0.2;
			}

			if (slave.assignment === Job.DAIRY) {
				if (V.dairyStimulatorsUpgrade === 1) { // FIXME: no text for this block?
					if (V.dairyStimulatorsSetting > 0) {
						r.cum += (r.cum * (0.2 * (V.dairyStimulatorsSetting + V.dairyRestraintsSetting + Math.trunc((50 - slave.physicalAge) / 20))));
					}
					if (slave.chem > 360) {
						r.cum *= 0.6;
					} else if (slave.chem > 100) {
						r.cum *= ((600 - slave.chem) / 600);
					}
				} else if (V.MilkmaidID !== 0) {
					if (S.Milkmaid.dick > 4 && canAchieveErection(S.Milkmaid)) {
						const milkmaidPronouns = getPronouns(S.Milkmaid);
						r.text += ` ${S.Milkmaid.slaveName} sometimes stands in for the machines, which is a polite way of saying ${milkmaidPronouns.he} sometimes fucks ${slave.slaveName}'s ass to help ${him} cum.`;
						r.cum *= 1.2;
					}
				}
			}

			r.cum *= multiplier;
			r.cum = Math.max(Math.trunc(r.cum), 1);
			r.text += ` ${He} produces ${numberWithPluralOne(r.cum, "deciliter")} of cum over the week;`;

			if (arcology.FSPastoralist === "unset") {
				r.cumSale = Math.max(Math.trunc((r.cum * jsRandom(15, 25) * qualityMultiplier)), 1);
				r.text += ` the fresh ejaculate is sold for <span class="cash inc">${cashFormat(r.cumSale)}.</span>`;
			} else if (arcology.FSPastoralistLaw === 1) {
				r.cumSale = Math.max(Math.trunc((r.cum * (jsRandom(20, 40)) * qualityMultiplier)), 1);
				r.text += ` the fresh ejaculate, which is in extremely high demand as one of ${arcology.name}'s few legal sources of animal protein, is sold for <span class="cash inc">${cashFormat(r.cumSale)}.</span>`;
			} else {
				r.cumSale = Math.max(Math.trunc((r.cum * (jsRandom(10, 20) + Math.trunc(arcology.FSPastoralist / 10)) * qualityMultiplier)), 1);
				r.text += ` the fresh ejaculate, which is in high demand given the new cultural preference for slave products, is sold for <span class="cash inc">${cashFormat(r.cumSale)}.</span>`;
			}
		}

		/**
		 * @param {App.Entity.SlaveState} slave
		 */
		function cumEffects(slave) {
			if (slave.energy > 95) {
				r.text += ` Getting ${his} dick constantly milked is almost as good as getting constant blowjobs as far as ${he}'s concerned. ${He} is happy to have ${his} member receive so much attention.`;
				slave.devotion += 1;
			}

			if (slave.need > 0) {
				r.text += ` ${His} cock and balls are milked so thoroughly that ${he}'s involuntarily sexually sated, regardless of ${his} feelings and tastes.`;
				slave.need = 0;
			}

			if (!canAchieveErection(slave)) {
				r.text += ` Since ${he} cannot maintain an erection, ${he} requires <span class="trust dec">painful</span> and <span class="devotion dec">degrading</span> anal electrostimulation to produce.`;
				slave.devotion -= 2;
				slave.trust -= 2;
				if (slave.anus === 0) {
					r.text += ` The electrostimulator <span class="virginity loss">breaks in ${his} virgin asshole.</span>`;
					slave.anus = 1;
				}
			} else if (slave.devotion <= 20) {
				r.text += ` Since ${he}'s unaroused by ${his} situation, ${he} requires <span class="trust dec">painful</span> and <span class="devotion dec">degrading</span> anal electrostimulation to produce.`;
				slave.devotion -= 2;
				slave.trust -= 2;
				if (slave.anus === 0) {
					r.text += ` The electrostimulator <span class="virginity loss">breaks in ${his} virgin asshole.</span>`;
					slave.anus = 1;
				}
			}

			if (slave.balls < 3 && slave.ballType !== "sterile") {
				if (slave.balls < 2) {
					if (jsRandom(1, 100) > (70 + (slave.geneMods.NCS * 15))) {
						r.text += ` Constant semen production and continual emptying and refilling <span class="change positive">increases the size of ${his} tiny testicles.</span>`;
						slave.balls += 1;
					}
				} else if (jsRandom(1, 100) > (90 + (slave.geneMods.NCS * 5))) {
					r.text += ` Constant semen production and continual emptying and refilling <span class="change positive">increases the size of ${his} small testicles.</span>`;
					slave.balls += 1;
				}
			}
		}

		/**
		 * @param {App.Entity.SlaveState} slave
		 * @param {number} multiplier
		 */
		function harvestGirlCum(slave, multiplier) {
			r.fluid = girlCumAmount(slave) * multiplier;
			r.text += ` ${His} female prostate fluid is considered an exotic delicacy.`;
			if (slave.vagina >= 0) {
				if (slave.vaginaLube === 2) {
					r.text += ` ${His} excessive vaginal secretions bolster the mix.`;
				} else if (slave.vaginaLube === 1) {
					r.text += ` ${His} natural vaginal secretions add to the mix.`;
				}
			}
			if (slave.energy > 10) {
				if (slave.health.condition > 50) {
					if (slave.energy > 90) {
						r.text += ` As a nympho, ${he} has no trouble orgasming almost constantly.`;
					}
					r.text += ` ${His} shining health keeps ${his} juices flowing.`;
				} else if (slave.health.condition < -50) {
					r.text += ` ${He} is so unwell, ${he} produces less than normal.`;
				}
			} else {
				/* slave.energy <= 10 */
				r.text += ` Unfortunately, ${he} is frigid and rarely reaches orgasm in spite of the intense automatic stimulation.`;
			}

			r.fluidSale = (r.fluid * jsRandom(40, 50));
			r.text += ` ${capFirstChar(numberWithPluralOne(r.fluid, "deciliter"))} of uncommon ejaculate is gathered during ${his} milkings.`;
			if (arcology.FSPastoralist !== "unset" && arcology.FSPastoralist > 30) {
				r.fluidSale = (Math.trunc(r.fluidSale * (1 + (arcology.FSPastoralist - 30) / 140))); /* fully accepted pastoralism gives +50% on the price*/
				r.text += ` Because of your arcology's cultural preferences, it comes with extra value.`;
			}
			r.text += ` It is sold for <span class="cash inc">${cashFormat(r.fluidSale)}.</span>`;
		}

		/**
		 * @param {FC.ReportSlave} slave
		 */
		function physicalEffects(slave) {
			if (r.milk + r.cum + r.fluid > 0) {
				if (slave.health.illness > 0 || slave.health.tired > 60) {
					r.text += ` ${His} production was reduced this week due to<span class="cash dec">`;
					if (slave.health.illness === 1) {
						r.text += ` malaise`;
					} else if (slave.health.illness === 2) {
						r.text += ` minor illness`;
					} else if (slave.health.illness === 3) {
						r.text += ` sickness`;
					} else if (slave.health.illness === 4) {
						r.text += ` severe sickness`;
					} else if (slave.health.illness === 5) {
						r.text += ` terrible illness`;
					}
					if (slave.health.illness > 0 && slave.health.tired > 60) {
						r.text += ` and`;
					}
					if (slave.health.tired > 90) {
						r.text += ` exhaustion`;
					} else if (slave.health.tired > 60) {
						r.text += ` fatigue`;
					}
					r.text += `.</span>`;
				}
				if (slave.assignment === Job.DAIRY) {
					if (V.dairyRestraintsSetting > 1) {
						r.text += ` The milking machine is merciless in its extraction of fluids from ${him}, but ${his} body is supplied with chemical stimulants to keep fatigue from setting in.`;
					} else if (V.dairyRestraintsSetting > 0) {
						if (slaveResting(slave)) {
							r.text += ` Resting doesn't stop ${him} from being thoroughly milked, but it does free ${him} from some of the associated chores, allowing ${him} time to snooze in ${his} harness post harvesting.`;
						} else if (slave.health.tired + 9 >= 90 && !willWorkToDeath(slave)) {
							r.text += ` ${He} attempts to skip out on milkings due to ${his} exhaustion, but can do little to avoid being dragged and strapped in to the milkers by `;
							if (V.MilkmaidID !== 0) {
								r.text += `${S.Milkmaid.slaveName}.`;
							} else {
								r.text += `force.`;
							}
							r.text += ` ${He} quickly learns <span class="devotion inc">submission is the only choice</span> lest ${he} remain locked to the machine.`;
							slave.devotion += 2;
						} else {
							if (slave.devotion > 20) {
								r.text += ` All that is expected from ${him} is to submit to the machine's manipulations. It can get a little tiring by the end of the day, `;
								if (V.dairyFeedersSetting + V.dairyStimulatorsSetting + V.dairyPregSetting > 0) {
									r.text += `<span class="red">moreso given the dairy's settings,</span> `;
								}
								r.text += `but it is mostly manageable.`;
							} else {
								r.text += ` Spending so much time strapped to a machine and being forcibly drained is not only <span class="red">exhausting, `;
								if (V.dairyFeedersSetting + V.dairyStimulatorsSetting + V.dairyPregSetting > 0) {
									r.text += `especially given the dairy's settings, `;
								}
								r.text += `</span> but also haunts ${him} even after ${he} is released from the session.`;
							}
						}
					} else {
						if (slaveResting(slave)) {
							r.text += ` Resting doesn't stop ${him} from being thoroughly milked, but it does free ${him} from some of the associated chores, allowing ${him} time to catch some extra sleep in ${his} stall.`;
						} else if (slave.health.tired + 9 >= 90 && !willWorkToDeath(slave)) {
							r.text += ` ${He} attempts to skip out on milkings due to ${his} exhaustion, but can do little to avoid being dragged and hooked up to the milkers by `;
							if (V.MilkmaidID !== 0) {
								r.text += `${S.Milkmaid.slaveName}.`;
							} else {
								r.text += `force.`;
							}
							r.text += ` ${He} quickly learns <span class="devotion inc">submitting to such a carefree life</span> is much easier than rebelling against it.`;
							slave.devotion += 2;
						} else {
							if (slave.devotion > 20) {
								r.text += ` Being a free range cow is one of <span class="health inc">the most laid-back assignments</span> available. All that is required of ${him} is that ${he} lie back and get milked.`;
							} else {
								r.text += ` Being a free range cow can be one of the most laid-back assignments available, but ${he} fails to realize that and instead chooses to waste energy struggling against the inevitable.`;
							}
						}
					}
					tired(slave);
				} else if (slave.assignment === Job.MILKED) {
					if (slaveResting(slave)) {
						r.text += ` While less is required of ${him} during ${his} mandatory rest periods, ${he} still needs to frequently visit the milkers, reducing the overall effectiveness of ${his} breaks.`;
					} else if (slave.health.tired + 8 >= 90 && !willWorkToDeath(slave)) {
						r.text += ` ${He} attempts to skip out on milkings due to ${his} exhaustion, but can do little to avoid being dragged and hooked up to the milkers by `;
						if (V.dairy > 0 && V.universalRulesFacilityWork === 1 && V.dairySpots > 0 && V.MilkmaidID !== 0 && V.dairyRestraintsSetting < 2) {
							r.text += `${S.Milkmaid.slaveName}.`;
						} else {
							r.text += `force.`;
						}
						r.text += ` ${His} <span class="devotion dec">protests</span> quickly fall silent as ${he} realizes struggling takes more energy than letting it happen.`;
						slave.devotion -= 2;
					} else {
						r.text += ` ${His} assignment doesn't expect much from ${him}, `;
						if (slave.devotion > 20) {
							r.text += `giving ${him} plenty of time to relax throughout the day.`;
						} else {
							r.text += `but ${he} complicates things, <span Class="red">wasting energy</span> ${he} should be conserving for ${his} other responsibilities.`;
						}
					}
					tired(slave);
				} else {
					r.text += ` Having to visit the milkers and cleaning up afterwards takes some time out of ${his} breaks.`;
					slave.health.tired += 2;
				}
			}
		}

		/**
		 * @param {App.Entity.SlaveState} slave
		 */
		function mentalEffects(slave) {
			if (slave.assignment === window.Job.MILKED || (slave.assignment === window.Job.DAIRY && V.dairyRestraintsSetting < 2)) {
				if (slave.behavioralQuirk === "fitness") {
					r.text += ` ${slave.slaveName} <span class="devotion inc">privately enjoys</span> the focus on ${his} health and fitness that comes with being a cow.`;
					slave.devotion += 1;
				}
			}
		}

		/**
		 * @param {App.Entity.SlaveState} slave
		 */
		function assignmentVignette(slave) {
			const vignette = GetVignette(slave);
			const FuckResult = FResult(slave); // Got to be something better than this
			r.text += ` <span class="story-label">This week</span> ${vignette.text} `;
			if (vignette.type === "cash") {
				const cashVign = Math.trunc(FuckResult * vignette.effect);
				if (vignette.effect > 0) {
					r.text += `<span class="cash inc">making you an extra ${cashFormat(cashVign)}.</span>`;
				} else if (vignette.effect < 0) {
					r.text += `<span class="cash dec">losing you ${cashFormat(Math.abs(cashVign))}.</span>`;
				} else {
					r.text += `an incident without lasting effect.`;
				}
				if (slave.assignment === window.Job.MILKED) {
					if (vignette.effect > 0) {
						cashX(cashVign, "slaveAssignmentMilkedVign", slave);
					} else if (vignette.effect < 0) {
						cashX(forceNeg(cashVign), "slaveAssignmentMilkedVign", slave);
					}
				} else if (slave.assignment === window.Job.DAIRY) {
					if (vignette.effect > 0) {
						cashX(cashVign, "slaveAssignmentDairyVign", slave);
					} else if (vignette.effect < 0) {
						cashX(forceNeg(cashVign), "slaveAssignmentDairyVign", slave);
					}
				} else {
					cashX(cashVign, "slaveAssignmentExtraMilkVign", slave);
				}
				vignetteCash += cashVign;
			} else if (vignette.type === "devotion") {
				if (vignette.effect > 0) {
					if (slave.devotion > 50) {
						r.text += `<span class="devotion inc">increasing ${his} devotion to you.</span>`;
					} else if (slave.devotion >= -20) {
						r.text += `<span class="devotion inc">increasing ${his} acceptance of you.</span>`;
					} else if (slave.devotion >= -50) {
						r.text += `<span class="devotion inc">reducing ${his} dislike of you.</span>`;
					} else {
						r.text += `<span class="devotion inc">reducing ${his} hatred of you.</span>`;
					}
				} else if (vignette.effect < 0) {
					if (slave.devotion > 50) {
						r.text += `<span class="devotion dec">reducing ${his} devotion to you.</span>`;
					} else if (slave.devotion >= -20) {
						r.text += `<span class="devotion dec">reducing ${his} acceptance of you.</span>`;
					} else if (slave.devotion >= -50) {
						r.text += `<span class="devotion dec">increasing ${his} dislike of you.</span>`;
					} else {
						r.text += `<span class="devotion dec">increasing ${his} hatred of you.</span>`;
					}
				} else {
					r.text += `an incident without lasting effect.`;
				}
				slave.devotion += vignette.effect;
			} else if (vignette.type === "trust") {
				if (vignette.effect > 0) {
					if (slave.trust > 20) {
						r.text += `<span class="trust inc">increasing ${his} trust in you.</span>`;
					} else if (slave.trust >= -50) {
						r.text += `<span class="trust inc">reducing ${his} fear of you.</span>`;
					} else {
						r.text += `<span class="trust inc">reducing ${his} terror of you.</span>`;
					}
				} else if (vignette.effect < 0) {
					if (slave.trust > 20) {
						r.text += `<span class="trust dec">reducing ${his} trust in you.</span>`;
					} else if (slave.trust >= -20) {
						r.text += `<span class="trust dec">increasing ${his} fear of you.</span>`;
					} else {
						r.text += `<span class="trust dec">increasing ${his} terror of you.</span>`;
					}
				} else {
					r.text += `an incident without lasting effect.`;
				}
				slave.trust += vignette.effect;
			} else if (vignette.type === "health") {
				if (vignette.effect > 0) {
					r.text += `<span class="health inc">improving ${his} health.</span>`;
				} else if (vignette.effect < 0) {
					r.text += `<span class="health dec">affecting ${his} health.</span>`;
				} else {
					r.text += `an incident without lasting effect.`;
				}
				improveCondition(slave, 2 * vignette.effect);
			} else {
				if (vignette.effect > 0) {
					r.text += `<span class="reputation inc">gaining you a bit of reputation.</span>`;
				} else if (vignette.effect < 0) {
					r.text += `<span class="reputation dec">losing you a bit of reputation.</span>`;
				} else {
					r.text += `an incident without lasting effect.`;
				}
				repX(Math.trunc(FuckResult * vignette.effect * 0.1), "vignette", slave);
				vignetteRep += Math.trunc(FuckResult * vignette.effect * 0.1);
			}
		}

		// FACILITY DECORATION IMPACTS
		function applyFSDecoration() {
			const fsGain = 0.0001 * (r.milk + (5 * r.cum));
			FutureSocieties.DecorationBonus(V.dairyDecoration, fsGain);
		}
	};
}


code:
/**
 * @param {FC.ReportSlave} slave
 * @returns {string}
 */
App.SlaveAssignment.guardYou = function saGuardYou(slave) {
	/** @type {string[]} */
	const r = [];

	const {
		he, him, his, He, His
	} = getPronouns(slave);

	updateBGState(slave);
	jobPreface(slave);
	publicImpression(slave);
	jobEffects(slave);
	if (V.bodyguardTrains === 1) {
		trainReplacements(slave);
	}

	return r.join(" ");

	/**
	 * @param {App.Entity.SlaveState} slave
	 *
	 */
	function jobPreface(slave) {
		r.push(`carries arms in your defense.`);
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 *
	 */
	function updateBGState(slave) {
		if (V.dojo > 1) {
			slave.rules.living = "luxurious";
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 *
	 */
	function publicImpression(slave) {
		if (slave.skill.combat > 0) {
			r.push(`${His} combat skills greatly increase ${his} deadliness.`);
		}

		if (App.Data.Careers.Leader.bodyguard.includes(slave.career)) {
			r.push(`${He} has experience in personal defense from before ${he} was a slave.`);
		} else if (slave.skill.bodyguard >= V.masteredXP) {
			r.push(`${He} has experience in personal defense from working for you.`);
		} else {
			const skillIncrease = jsRandom(1, Math.ceil((slave.intelligence + slave.intelligenceImplant) / 15) + 8);
			r.push(slaveSkillIncrease('bodyguard', slave, skillIncrease));
		}

		if (V.AgePenalty !== 0) {
			if (slave.physicalAge >= 100) {
				r.push(`${His} absurd age ravages ${him}, leaving ${him} toothless in more ways than one.`);
			} else if (slave.physicalAge >= 85) {
				r.push(`${His} extreme age binds ${him}, limiting what ${he} can do and take.`);
			} else if (slave.physicalAge >= 70) {
				r.push(`${His} advanced age frequently leaves ${him} winded.`);
			}
		}

		if (slave.muscles > 30 && slave.muscles <= 95) {
			r.push(`${He} is strong and powerful, yet quick and flexible.`);
		} else if (slave.muscles > 95 && slave.height >= 185) {
			r.push(`${His} huge muscles are an intimidating sight and, despite their massive size, ${he} is tall enough to use them effectively.`);
		} else if (slave.muscles > 95) {
			r.push(`${His} huge muscles are an intimidating sight, but are so big that they actually detract from ${his} combat effectiveness.`);
		} else if (slave.muscles > 5) {
			r.push(`${He} is reasonably fit, but not enough to significantly affect ${his} combat effectiveness.`);
		} else if (slave.muscles < -95) {
			r.push(`${He} can barely stand, let alone fight. A single shot from ${his} own weapon is liable to incapacitate ${him}, making ${him} an absolute travesty of a bodyguard.`);
		} else if (slave.muscles < -30) {
			r.push(`${He} tires from just standing, rendering ${him} both ineffective and embarrassing to have as your guard.`);
		} else if (slave.muscles < -5) {
			r.push(`${He} is rather unfit, enough to negatively impact ${his} combat effectiveness.`);
		}

		if (getLimbCount(slave, 6) > 1) {
			r.push(`The artificial muscles of ${his} cybernetic limbs increase ${his} strength and flexibility to enhance ${his} combat abilities and give ${him} the intimidating appearance of a super-soldier.`);
		} else if (getLimbCount(slave, 105) > 1) {
			r.push(`${His} tough combat limbs make ${him} an intimidating sight to behold.`);
		}

		if (slave.height >= 170) {
			r.push(`${His} height gives ${him} a reach advantage with ${his} sword.`);
		}

		if (slave.health.condition > 50) {
			r.push(`${His} shining health makes ${him} a better combatant.`);
		}

		if (slave.boobs > 4000) {
			r.push(`${His} titanic tits are a terrible hindrance in actual fighting.`);
		} else if (slave.boobs > 2000) {
			r.push(`${His} big breasts get in ${his} way and reduce ${his} efficiency.`);
		}

		if (slave.dick >= 10) {
			r.push(`${His} massive dick gets in ${his} way and reduces ${his} efficiency.`);
		}

		if (slave.balls >= 15) {
			r.push(`${His} massive balls slow ${him} down and limit ${his} range of motion.`);
		}

		if (slave.butt > 6) {
			r.push(`${His} massive ass slows ${him} down and limits ${his} range of motion.`);
		}

		if (slave.hips > 2) {
			r.push(`${He} struggles to move with ${his} inhumanly wide hips and frequently gets caught between things trying to follow you.`);
		}

		if (slave.weight > 190) {
			r.push(`${His} extreme weight nearly immobilizes ${him}. ${He} struggles to move let alone protect you. At least ${his} bloated body will likely stop bullets and block doorways when needed.`);
		} else if (slave.weight > 160) {
			r.push(`${His} extreme weight limits ${his} mobility and range of motion, making ${him} a poor bodyguard but decent meatshield.`);
		} else if (slave.weight > 130) {
			r.push(`${His} extreme weight is an impediment as a bodyguard.`);
		} else if (slave.weight > 30) {
			r.push(`${His} heavy weight is an impediment as a bodyguard.`);
		} else if (slave.weight < -10) {
			r.push(`${His} light weight is an impediment as a bodyguard.`);
		}

		if (slave.health.condition < -50) {
			r.push(`${His} poor health makes ${him} a weaker combatant.`);
		}

		if (slave.health.tired > 90) {
			r.push(`${He} is exhausted and can barely stay awake, let alone ready a weapon.`);
		} else if (slave.health.tired > 60) {
			r.push(`${He} is fatigued, making ${his} situational awareness and reaction time suffer.`);
		} else if (slave.health.tired > 30) {
			r.push(`${He} is tired, slightly lowering ${his} reaction time.`);
		}

		if (slave.pregKnown === 1 || slave.bellyPreg >= 1500) {
			if (slave.bellyPreg >= 750000) {
				r.push(`${His} monolithic pregnancy greatly restricts ${his} movement and renders ${him} nearly useless in combat. ${He} can barely waddle after you, and when ${he} does, finds doors and small passages don't agree with ${his} bloated figure.`);
			} else if (slave.bellyPreg >= 450000) {
				r.push(`${His} gigantic pregnancy greatly hinders ${his} movement and terribly reduces ${his} effectiveness in combat. It also limits where ${he} can follow you, as doors and small passages don't agree with ${his} bloated figure.`);
			} else if (slave.bellyPreg >= 300000) {
				r.push(`${His} massive pregnancy obstructs ${his} movement and greatly hinders ${his} ability to protect you. It also limits where ${he} can follow you, as doors and small passages don't agree with ${his} bloated figure.`);
			} else if (slave.bellyPreg >= 150000) {
				r.push(`${His} giant pregnancy obstructs ${his} movement and greatly slows ${him} down. It also limits where ${he} can follow you, as ${he} has trouble waddling through crowds.`);
			} else if (slave.bellyPreg >= 100000) {
				r.push(`${His} giant belly gets in ${his} way and weighs ${him} down.`);
			} else if (slave.bellyPreg >= 10000) {
				r.push(`${His} huge belly is unwieldy and hinders ${him}.`);
			} else if (slave.bellyPreg >= 5000) {
				r.push(`${His} advanced pregnancy limits ${his} effectiveness.`);
			} else if (slave.bellyPreg >= 1500) {
				r.push(`${His} growing pregnancy occasionally distracts ${him} from ${his} job.`);
			} else {
				r.push(`The life just beginning to grow inside ${him} occasionally distracts ${him} from ${his} job.`);
			}
		} else if (slave.bellyImplant >= 1500) {
			if (slave.bellyImplant >= 750000) {
				r.push(`${His} monolithic, ${slave.bellyImplant}cc implant filled belly greatly restricts ${his} movement and renders ${him} nearly useless in combat. ${He} can barely waddle after you, and when ${he} does, finds doors and small passages don't agree with ${his} bloated figure.`);
			} else if (slave.bellyImplant >= 450000) {
				r.push(`${His} gigantic, ${slave.bellyImplant}cc implant filled belly greatly hinders ${his} movement and terribly reduces ${his} effectiveness in combat. It also limits where ${he} can follow you, as doors and small passages don't agree with ${his} bloated figure.`);
			} else if (slave.bellyImplant >= 300000) {
				r.push(`${His} massive, ${slave.bellyImplant}cc implant filled belly obstructs ${his} movement and greatly hinders ${his} ability to protect you. It also limits where ${he} can follow you, as doors and small passages don't agree with ${his} bloated figure.`);
			} else if (slave.bellyImplant >= 150000) {
				r.push(`${His} giant, ${slave.bellyImplant}cc implant filled belly obstructs ${his} movement and greatly slows ${him} down. It also limits where ${he} can follow you, as ${he} has trouble waddling through crowds.`);
			} else if (slave.bellyImplant >= 100000) {
				r.push(`${His} giant, ${slave.bellyImplant}cc implant filled belly is very heavy and unwieldy, frequently getting in the way of ${his} job.`);
			} else if (slave.bellyImplant >= 10000) {
				r.push(`${His} huge, ${slave.bellyImplant}cc implant filled belly is very heavy and unwieldy, throwing off ${his} weight and making ${him} far less effective.`);
			} else if (slave.bellyImplant >= 5000) {
				r.push(`${His} large, ${slave.bellyImplant}cc implant filled belly is heavy and unwieldy, limiting ${his} effectiveness.`);
			} else if (slave.bellyImplant >= 1500) {
				r.push(`${His} swollen, ${slave.bellyImplant}cc implant filled belly is heavy and occasionally distracts ${him}.`);
			}
		}
		if (isInLabor(slave)) {
			r.push(`${He}'s feeling labor pains, greatly detracting from ${his} ability to protect you.`);
		} else if (slave.preg >= slave.pregData.normalBirth && slave.pregControl !== "labor suppressors") {
			r.push(`${He}'ll be going into labor any time now, detracting from ${his} ability to protect you.`);
		}

		if (slave.bellyFluid >= 10000) {
			r.push(`${His} hugely bloated, ${slave.inflationType}-filled belly is taut and painful, hindering ${his} ability to guard you.`);
		} else if (slave.bellyFluid >= 5000) {
			r.push(`${His} bloated, ${slave.inflationType}-stuffed belly is constantly jiggling and moving, distracting ${him} and throwing off ${his} weight.`);
		} else if (slave.bellyFluid >= 2000) {
			r.push(`${His} distended, ${slave.inflationType}-belly is uncomfortable and heavy, distracting ${him}.`);
		}

		if (slave.teeth === "pointy") {
			r.push(`${His} sharp teeth add nothing to ${his} actual effectiveness, but they're certainly intimidating.`);
		}

		if ((slave.skill.combat < 1) && (jsRandom(-100, 150) <= (slave.intelligence + slave.intelligenceImplant))) {
			r.push(`After some experience guarding you, and diligent practice in the armory, <span class="green">${his} combat skills increase.</span>`);
			slave.skill.combat += 1;
		} else if (slave.skill.combat >= 1) {
			r.push(`${He} maintains ${his} combat skill with practice in the armory.`);
		} else {
			r.push(`Though ${he} practices diligently, ${his} basic combat skills do not impress.`);
		}

		r.push(`${His} constant presence is`);
		const impressiveness = deadliness(slave);
		if (impressiveness > 6) {
			r.push(`extremely intimidating, <span class="green">adding much to your reputation.</span>`);
			if (slave.career === "an arcology owner") {
				r.push(`You've made a one-time rival arcology owner into a deadly and loyal protector, a feat of slaveownership that's <span class="green">internationally famous.</span>`);
				repX(impressiveness * 50, "bodyguard", slave);
			}
		} else if (impressiveness > 3) {
			r.push(`intimidating, <span class="green">adding to your reputation.</span>`);
		} else {
			r.push(`hardly intimidating, <span class="yellow">barely adding to your reputation.</span>`);
		}

		repX(impressiveness * 50, "bodyguard", slave);
	}

	/**
	 * @param {FC.ReportSlave} slave
	 *
	 */
	function jobEffects(slave) {
		r.push(`Being continually trusted with your life <span class="hotpink">increases ${his} devotion to you</span> and encourages ${him} to <span class="mediumaquamarine">trust you in turn.</span>`);
		slave.devotion += 2;
		slave.trust += 4;

		if (V.dojo > 1) {
			r.push(`${He} appreciates how special it is that ${he} has a nice room off the armory to rest in. ${He} can finally rest easy while still keeping tabs on your safety.`);
			slave.devotion += 1;
		} else {
			r.push(`Between protecting you, training, and keeping vigil while you sleep, ${he} lives a <span class="health dec">very tiring</span> life.`);
		}
		tired(slave);
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 *
	 */
	function trainReplacements(slave) {
		if (slave.devotion > 95 && slave.trust > 50 && slave.skill.combat > 0 && slave.intelligence + slave.intelligenceImplant > 15) {
			const successorCandidates = V.slaves.filter(function(s) { return (assignmentVisible(s) || s.assignment === Job.CONCUBINE || s.assignment === Job.WARDEN || s.assignment === Job.HEADGIRL || s.assignment === Job.QUARTER || s.assignment === Job.MASTERSUITE) && bodyguardSuccessorEligible(s); });
			const combatSkilled = successorCandidates.filter(function(s) { return s.skill.combat > 0; });

			r.push(`${He}'s confident in ${his} martial skills, but smart enough to know that${slave.geneMods.immortality > 0 ? `, while technically immortal, ${he} isn't invincible` : ` ${he} isn't immortal`}, and devoted enough to worry about who will protect you should ${he} die.`);
			if (combatSkilled.length < 2) {
				let candidate = null;
				let flawedTrainee = 0;
				if (slave.relationship > 1) {
					candidate = getSlave(slave.relationshipTarget);
					if (candidate !== undefined && candidate.skill.combat === 0 && bodyguardSuccessorEligible(candidate)) {
						const candidatePronouns = getPronouns(candidate);
						r.push(`${He} does ${his} best to train ${candidate.slaveName} whenever ${he} can, hoping that ${his}`);
						if (slave.relationship > 4) {
							r.push(`${candidatePronouns.wife}`);
						} else if (slave.relationship === 4) {
							r.push(`lover`);
						} else if (slave.relationship === 3) {
							r.push(`${candidatePronouns.girl} friend`);
						} else {
							r.push(`best friend`);
						}
						r.push(`can be made capable of stepping into ${his} place.`);
					}
				}
				if (!candidate) {
					if (V.HeadGirlID !== 0 && S.HeadGirl.skill.combat === 0 && bodyguardSuccessorEligible(S.HeadGirl)) {
						r.push(`${He} does ${his} best to train ${S.HeadGirl.slaveName} whenever ${he} can, hoping that your Head Girl can be made capable of stepping into ${his} place.`);
						candidate = S.HeadGirl;
					}
				}
				if (!candidate) {
					if (V.ConcubineID !== 0 && S.Concubine.skill.combat === 0 && S.Concubine.devotion > 50 && S.Concubine.muscles >= -30 && S.Concubine.weight < 160 && S.Concubine.butt < 10 && S.Concubine.boobs < 25000 && S.Concubine.belly < 5000 && S.Concubine.balls < 20 && S.Concubine.dick < 15 && S.Concubine.fuckdoll === 0 && S.Concubine.fetish !== "mindbroken" && canWalk(S.Concubine)) {
						r.push(`${He} does ${his} best to train ${S.Concubine.slaveName} whenever ${he} can, hoping that your Concubine can be made capable of stepping into ${his} place.`);
						if (S.Concubine.boobs >= 8000 || S.Concubine.butt >= 10 || S.Concubine.belly >= 5000 || S.Concubine.balls >= 10 || S.Concubine.dick >= 10 || S.Concubine.muscles < 0 || S.Concubine.weight >= 130) {
							r.push(`${His} body is poorly suited for combat, but ${he} can learn to work around it with enough effort.`);
							flawedTrainee = jsRandom(0, 50);
						}
						candidate = S.Concubine;
					}
				}
				if (!candidate) {
					if (V.WardenessID !== 0 && S.Wardeness.skill.combat === 0 && bodyguardSuccessorEligible(S.Wardeness)) {
						r.push(`${He} does ${his} best to train ${S.Wardeness.slaveName} whenever ${he} can, hoping that your Wardeness can be made capable of stepping into ${his} place.`);
						candidate = S.Wardeness;
					}
				}
				if (!candidate) {
					candidate = successorCandidates.find(function(s) { return s.skill.combat === 0; });
					if (candidate) {
						r.push(`${He} does ${his} best to train ${candidate.slaveName} whenever ${he} can, hoping that ${his} subordinate can be made capable of stepping into ${his} place.`);
					}
				}
				if (candidate) {
					if ((slave.intelligence + slave.intelligenceImplant - flawedTrainee) > jsRandom(1, 500)) {
						r.push(`By the end of the week, ${he} is satisfied that ${candidate.slaveName} <span class="green">has the combat skill</span> to contribute to your defense.`);
						candidate.skill.combat = 1;
					} else {
						r.push(`Unfortunately, ${candidate.slaveName} wasn't able to pass the rigorous combat tests to ${his} satisfaction this week.`);
					}
				} else {
					r.push(`${He} finds no suitable candidates to serve as ${his} replacement, leaving ${him} stressed over your future safety. The worry is exhausting and bad for ${his} health.`);
					healthDamage(slave, 3);
					slave.health.tired += 15;
				}
			} else {
				r.push(`${He} takes care to look after the skills of your other defensively capable slaves, satisfied that there are enough of them living in your penthouse.`);
			}
		}
	}
};

repo_name: Fekenol/fc

license: mit


code:
/**
 * @param {App.Entity.SlaveState} slave
 * @returns {string}
 */
App.SlaveAssignment.hormonesEffects = function saHormonesEffects(slave) {
	/** @type {string[]} */
	const r = [];
	const gigantomastiaMod = slave.geneticQuirks.gigantomastia === 2 ? (slave.geneticQuirks.macromastia === 2 ? 3 : 2) : 1;
	const rearLipedemaMod = slave.geneticQuirks.rearLipedema === 2 ? 1 : 0;
	const boobSize = slave.boobs - slave.boobsImplant - slave.boobsMilk;
	const buttSize = slave.butt - slave.buttImplant;
	const faceValue = slave.face - slave.faceImplant;

	const {
		he, him, his, He, His,
	} = getPronouns(slave);

	hormoneBalance(slave);
	if (V.hormoneUpgradeMood === 0) {
		moodConflict(slave);
	}
	if (slave.physicalAge >= 18 || V.loliGrow === 0 || slave.geneMods.NCS === 1) {
		hormonesEffects(slave);
	}
	if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) {
		hormoneReactions(slave);
	}

	return r.join(" ");

	/**
	 * @param {App.Entity.SlaveState} slave
	 *
	 */
	function hormoneBalance(slave) {
		if (slave.hormoneBalance <= -400) {
			r.push(`${His} hormone balance is overwhelmingly masculine.`);
		} else if (slave.hormoneBalance <= -300) {
			r.push(`${His} hormone balance is extremely masculine.`);
		} else if (slave.hormoneBalance <= -200) {
			r.push(`${His} hormone balance is heavily masculine.`);
		} else if (slave.hormoneBalance <= -100) {
			r.push(`${His} hormone balance is very masculine.`);
		} else if (slave.hormoneBalance < -20) {
			r.push(`${His} hormone balance is masculine.`);
		} else if (slave.hormoneBalance >= 400) {
			r.push(`${His} hormone balance is overwhelmingly feminine.`);
		} else if (slave.hormoneBalance >= 300) {
			r.push(`${His} hormone balance is extremely feminine.`);
		} else if (slave.hormoneBalance >= 200) {
			r.push(`${His} hormone balance is heavily feminine.`);
		} else if (slave.hormoneBalance >= 100) {
			r.push(`${His} hormone balance is very feminine.`);
		} else if (slave.hormoneBalance > 20) {
			r.push(`${His} hormone balance is feminine.`);
		} else {
			r.push(`${He} has a neutral hormone balance.`);
		}
		if (Math.abs(slave.hormones) > 1) {
			slave.chem += 0.5;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 */
	function moodConflict(slave) {
		let conflict = false;
		if (slave.hormoneBalance > 20 && slave.genes === "XY" && slave.balls !== 0 && slave.ballType !== "sterile") {
			r.push(`${His} feminine hormonal balance conflicts with ${his} natural hormones,`);
			conflict = true;
		} else if (slave.hormoneBalance < -20 && slave.genes === "XX" && (slave.ovaries !== 0 || slave.mpreg !== 0)) {
			r.push(`${His} masculine hormonal balance conflicts with ${his} natural hormones,`);
			conflict = true;
		}

		if (conflict) {
			if (slave.devotion > 50) {
				r.push(`but ${he}'s a good enough slave to suppress the occasional moodiness.`);
			} else {
				r.push(`causing <span class="mediumorchid">occasional moodiness.</span>`);
				slave.devotion -= 1;
			}
			if (slave.energy > 10) {
				r.push(`It also has the unfortunate consequence of <span class="libido dec">damaging ${his} libido.</span>`);
				slave.energy--;
			}
			if (slave.attrXX > 50 || slave.attrXY > 50) {
				r.push(`Even more troubling, ${his} sexual confusion <span class="red">leaves ${him} finding others less attractive.</span>`);
				if (slave.attrXX > 50) {
					slave.attrXX--;
				}
				if (slave.attrXY > 50) {
					slave.attrXY--;
				}
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 */
	function softenFaceShape(slave) {
		if (slave.faceImplant < 5) {
			if (slave.faceShape === "masculine") {
				r.push(`Hormonal effects cause <span class="orange">${his} face to soften into`);
				if (slave.geneMods.NCS === 1) {
					r.push(`childlike`);
				}
				r.push(`androgyny.</span>`);
				slave.faceShape = "androgynous";
			} else if (slave.faceShape === "androgynous" && slave.geneticQuirks.androgyny !== 2) {
				r.push(`Hormonal effects cause <span class="lime">${his} face to soften into`);
				if (slave.geneMods.NCS === 1) {
					r.push(`childlike normalcy.</span>`);
				} else {
					r.push(`femininity.</span>`);
				}
				slave.faceShape = "normal";
			} else if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50 && slave.faceShape === "normal") {
				r.push(`Hormonal effects cause <span class="lime">${his} face to soften into childlike cuteness.</span>`);
				slave.faceShape = "cute";
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 */
	function softenFace(slave) {
		r.push(`Hormonal effects cause <span class="lime">${his} facial structure to soften and become ${slave.face >= 0 ? "more attractive" : "less unattractive"}.</span>`);
		let faceInc = 1 + V.hormoneUpgradePower;
		if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
			faceInc *= 2;
		}
		faceIncrease(slave, faceInc);
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {number} maxVoice
	 */
	function raiseVoice(slave, maxVoice) {
		if (slave.voice < maxVoice && slave.voice > 0) {
			r.push(`Hormonal effects cause <span class="lime">${his} voice to become higher and more`);
			if (slave.geneMods.NCS === 1) {
				r.push(`childlike.</span>`);
			} else {
				r.push(`feminine.</span>`);
			}
			slave.voice++;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {number} minimumMuscles
	 */
	function softenMuscles(slave, minimumMuscles) {
		if (slave.muscles > minimumMuscles && slave.diet !== "muscle building" && slave.drugs !== "steroids" && (slave.geneticQuirks.mGain !== 2 || slave.geneticQuirks.mLoss === 2)) {
			r.push(`Hormonal effects <span class="orange">reduce ${his} musculature.</span>`);
			slave.muscles -= 2 + V.hormoneUpgradePower + slave.geneticQuirks.mLoss;
			if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
				slave.muscles -= 2 + V.hormoneUpgradePower + slave.geneticQuirks.mLoss;
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {number} maxWetness
	 */
	function increaseWetness(slave, maxWetness) {
		if (slave.vagina > -1 && slave.ovaries !== 0 && slave.vaginaLube < maxWetness) {
			r.push(`Hormonal effects cause <span class="lime">${his} vagina to produce more copious natural lubricant.</span>`);
			slave.vaginaLube++;
		}
	}

	/**
	 * Atrophy genitals because of too much female hormones
	 * @param {App.Entity.SlaveState} slave
	 */
	function atrophyGenitals(slave) {
		if (V.hormoneUpgradeShrinkage === 0) {
			if (slave.dick > 1) {
				if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50 && slave.dick > 2) {
					r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} dick to atrophy a lot.</span>`);
					slave.dick--;
				} else {
					r.push(`Hormonal effects cause <span class="orange">${his} dick to atrophy.</span>`);
				}
				slave.dick--;
			}
			if (slave.balls > 1) {
				if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50 && slave.balls > 2) {
					r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} testicles to atrophy a lot.</span>`);
					slave.balls--;
				} else {
					r.push(`Hormonal effects cause <span class="orange">${his} testicles to atrophy.</span>`);
				}
				slave.balls--;
			}
			if (slave.clit > 0) {
				if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50 && slave.clit > 1) {
					r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} clit to shrink down greatly.</span>`);
					slave.clit--;
				} else {
					r.push(`Hormonal effects cause <span class="orange">${his} clit to shrink significantly.</span>`);
				}
				slave.clit--;
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 */
	function mentalEffectsFemale(slave) {
		if (slave.devotion <= 20) {
			r.push(`Hormonal effects make ${him} a bit more <span class="hotpink">docile.</span>`);
			slave.devotion++;
		}
		if (slave.trust <= 20) {
			r.push(`Hormonal effects make ${him} a bit more <span class="mediumaquamarine">trusting.</span>`);
			slave.trust++;
		}
		if (slave.attrXY < 100) {
			r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to men.</span>`);
			slave.attrXY += 2 + V.hormoneUpgradePower;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 */
	function hardenFaceShape(slave) {
		if (slave.faceImplant < 5) {
			if (slave.geneticQuirks.androgyny !== 2) {
				if (slave.faceShape === "androgynous") {
					r.push(`Hormonal effects cause <span class="orange">${his} face to harden into masculinity.</span>`);
					slave.faceShape = "masculine";
				} else if (slave.faceShape !== "masculine") {
					r.push(`Hormonal effects cause <span class="orange">${his} face to harden into androgyny.</span>`);
					slave.faceShape = "androgynous";
				}
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 */
	function hardenFace(slave) {
		if (faceValue.isBetween(0, 100)) {
			r.push(`Hormonal effects cause <span class="orange">${his} facial structure to harden and become less attractive.</span>`);
			const faceDec = 1 + V.hormoneUpgradePower;
			slave.face = Math.clamp(slave.face - faceDec, -100, 100);
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {number} minVoice
	 */
	function lowerVoice(slave, minVoice) {
		if (slave.voice > minVoice) {
			r.push(`Hormonal effects cause <span class="orange">${his} voice to become deeper and less feminine.</span>`);
			slave.voice--;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 */
	function shrinkButt(slave) {
		if (buttSize > 1 && rearLipedemaMod === 0) {
			if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50 && buttSize > 2) {
				r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} butt to decrease a lot.</span>`);
				slave.butt -= 1;
			} else {
				r.push(`Hormonal effects cause <span class="orange">the natural size of ${his} butt to decrease.</span>`);
			}
			slave.butt--;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 */
	function shrinkBoobs(slave) {
		if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
			r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} tits to shrink a lot.</span>`);
			slave.boobs -= 10 + (15 * V.hormoneUpgradePower);
		} else {
			r.push(`Hormonal effects cause <span class="orange">the natural size of ${his} tits to shrink.</span>`);
		}
		slave.boobs -= 10 + (15 * V.hormoneUpgradePower);
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 * @param {number} minWetness
	 */
	function lowerWetness(slave, minWetness) {
		if (slave.vagina > -1 && slave.vaginaLube > 0) {
			r.push(`Hormonal effects cause <span class="orange">${his} vagina to produce less natural lubricant.</span>`);
			slave.vaginaLube--;
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 */
	function hormonesEffects(slave) {
		if (Math.abs(slave.hormoneBalance) >= 50) {
			let normBreasts = 0;
			let normButt = 0;
			if (slave.hormoneBalance > 30 && slave.geneMods.NCS !== 1) {
				/* 'Expected' breast size based on weight for feminine-bodied slaves */
				normBreasts = Math.trunc((100 + (slave.weight + 100) * 5 + 2 * slave.lactationAdaptation) * (0.85 + slave.hormoneBalance / 400) * gigantomastiaMod);
				normButt = ((slave.weight + 100) * 0.025 * (0.9 + slave.hormoneBalance / 600) * (rearLipedemaMod / 2 + 1));
			}

			if (slave.hormoneBalance >= 350) {
				if (slave.geneMods.NCS === 1) {
					if ((slave.shoulders + Math.abs(slave.shouldersImplant)) > -1 && slave.shoulders > -2 && jsRandom(1, 100) < (40 + (20 * V.hormoneUpgradePower))) {
						r.push(`Feminine hormones team up with ${his} <span class="orange">NCS</span> to cause <span class="lime">${his} shoulders to shrink into a more childlike narrowness</span> than before.`);
						slave.shoulders--;
					}
				} else if (slave.physicalAge < 25) {
					if (slave.shoulders + Math.abs(slave.shouldersImplant) > -1 && slave.shoulders > -2 && jsRandom(1, 100) < 20 + (10 * V.hormoneUpgradePower)) {
						r.push(`${His} body has not yet found its final bone structure, which typically happens in the mid-twenties. Hormonal effects cause ${his} shoulders to develop into a more feminine narrowness than they would have done naturally.`);
						slave.shoulders--;
					}
					if (slave.geneMods.NCS === 0 && slave.hips - (Math.abs(slave.hipsImplant)) < 1 && slave.hips < 2 && jsRandom(1, 100) <= 20 + (10 * V.hormoneUpgradePower)) {
						r.push(`${His} body has not yet found its final bone structure, which typically happens in the mid-twenties. Hormonal effects cause ${his} hips to develop more broadly than they would have done naturally.`);
						slave.hips++;
					}
				}

				softenFaceShape(slave);
				if (faceValue < 50 && slave.face < 75) {
					softenFace(slave);
					if (faceValue >= 50 || slave.face >= 75) {
						r.push(`${His} face is now quite beautiful; hormonal treatments alone <span class="yellow">cannot improve it further.</span>`);
					}
				}

				raiseVoice(slave, 3);
				softenMuscles(slave, 10);

				if (slave.waist > -30) {
					r.push(`Hormonal effects cause ${his} <span class="lime">waist to narrow.</span>`);
					slave.waist = Math.clamp(slave.waist - (2 + V.hormoneUpgradePower), -30, 100);
				}

				if (slave.geneMods.NCS === 0) {
					if (boobSize < 0.9 * normBreasts) {
						/* Grow to 90% of normBreasts */
						r.push(`Hormonal effects cause <span class="lime">a small amount of natural breast growth.</span>`);
						slave.boobs += 25;
					}
					if (slave.nipples === "tiny") {
						r.push(`Hormonal effects cause ${his} tiny <span class="lime">nipples to grow to a more normal size.</span>`);
						slave.nipples = "cute";
					}
					if (buttSize < Math.trunc(4.5 * normButt) / 5) {
						/* 90% of normButt, rounded down to the next increment of .2 */
						r.push(`Hormonal effects cause <span class="lime">the natural size of ${his} butt to increase.</span>`);
						slave.butt += 0.2;
					}
				} else {
					r.push(`${His} <span class="orange">NCS</span> blocks asset growth despite the fact that ${his} body is swimming in hormones.`);
				}
				increaseWetness(slave, 2);

				atrophyGenitals(slave);

				mentalEffectsFemale(slave);
			} else if (slave.hormoneBalance >= 300) {
				softenFaceShape(slave);
				if (faceValue < 30 && slave.face < 60) {
					softenFace(slave);
				}

				raiseVoice(slave, 3);
				softenMuscles(slave, 30);

				if (slave.waist > -10) {
					r.push(`Hormonal effects cause ${his} <span class="lime">waist to narrow.</span>`);
					slave.waist = Math.clamp(slave.waist - (2 + V.hormoneUpgradePower), -10, 100);
				}

				if (slave.geneMods.NCS === 0) {
					if (boobSize < 0.8 * normBreasts) {
						/* Grow to 80% of expected */
						r.push(`Hormonal effects cause <span class="lime">a small amount of natural breast growth.</span>`);
						slave.boobs += 25;
					}
					if (slave.nipples === "tiny") {
						r.push(`Hormonal effects cause ${his} tiny <span class="lime">nipples to grow to a more normal size.</span>`);
						slave.nipples = "cute";
					}
					if (buttSize < Math.trunc(4 * normButt) / 5) {
						/* 80% of normButt, rounded down to the next increment of .2 */
						r.push(`Hormonal effects cause <span class="lime">the natural size of ${his} butt to increase.</span>`);
						slave.butt += 0.2;
					}
				}
				increaseWetness(slave, 2);

				atrophyGenitals(slave);

				mentalEffectsFemale(slave);
			} else if (slave.hormoneBalance >= 250) {
				softenFaceShape(slave);
				if (faceValue < 10 && slave.face < 30) {
					softenFace(slave);
				}

				raiseVoice(slave, 2);
				softenMuscles(slave, 30);

				if (slave.waist > 0) {
					r.push(`Hormonal effects cause ${his} <span class="lime">waist to narrow.</span>`);
					slave.waist = Math.clamp(slave.waist - (2 + V.hormoneUpgradePower), 0, 100);
				}

				if (slave.geneMods.NCS === 0) {
					if (boobSize < 0.7 * normBreasts) {
						/* Grow to 70% of expected */
						r.push(`Hormonal effects cause <span class="lime">a small amount of natural breast growth.</span>`);
						slave.boobs += 25;
					}
					if (slave.nipples === "tiny") {
						r.push(`Hormonal effects cause ${his} tiny <span class="lime">nipples to grow to a more normal size.</span>`);
						slave.nipples = "cute";
					}
					if (buttSize < Math.trunc(3.5 * normButt) / 5) {
						/* 70% of normButt, rounded down to the next increment of .2 */
						r.push(`Hormonal effects cause <span class="lime">the natural size of ${his} butt to increase.</span>`);
						slave.butt += 0.2;
					}
				}
				increaseWetness(slave, 1);

				if (V.hormoneUpgradeShrinkage === 0) {
					if (slave.dick > 2) {
						if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
							r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} dick to atrophy a lot.</span>`);
							slave.dick -= 1;
						} else {
							r.push(`Hormonal effects cause <span class="orange">${his} dick to atrophy.</span>`);
						}
						slave.dick--;
					}
					if (slave.balls > 2) {
						if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
							r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} testicles to atrophy a lot.</span>`);
							slave.balls -= 1;
						} else {
							r.push(`Hormonal effects cause <span class="orange">${his} testicles to atrophy.</span>`);
						}
						slave.balls--;
					}
					if (slave.clit > 1) {
						if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
							r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} clit to shrink down greatly.</span>`);
							slave.clit -= 1;
						} else {
							r.push(`Hormonal effects cause <span class="orange">${his} clit to shrink significantly.</span>`);
						}
						slave.clit--;
					}
				}

				if (slave.devotion <= 20) {
					r.push(`Hormonal effects make ${him} a bit more <span class="hotpink">docile.</span>`);
					slave.devotion++;
				}
				if (slave.trust <= 20) {
					r.push(`Hormonal effects make ${him} a bit more <span class="mediumaquamarine">trusting.</span>`);
					slave.trust++;
				}
				if (slave.attrXY < 95) {
					r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to men.</span>`);
					slave.attrXY += 2 + V.hormoneUpgradePower;
				}
			} else if (slave.hormoneBalance >= 200) {
				if (slave.faceImplant < 5) {
					if (slave.faceShape === "masculine") {
						r.push(`Hormonal effects cause <span class="orange">${his} face to soften into`);
						if (slave.geneMods.NCS === 1) {
							r.push(`childlike`);
						}
						r.push(`androgyny.</span>`);
						slave.faceShape = "androgynous";
					} else if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50 && slave.faceShape === "androgynous" && slave.geneticQuirks.androgyny !== 2) {
						r.push(`Hormonal effects cause <span class="lime">${his} face to soften into`);
						if (slave.geneMods.NCS === 1) {
							r.push(`childlike normalcy.</span>`);
						} else {
							r.push(`femininity.</span>`);
						}
						slave.faceShape = "normal";
					}
				}
				if (faceValue < 0 && slave.face < 0) {
					r.push(`Hormonal effects cause <span class="lime">${his} facial structure to soften and become less unattractive.</span>`);
					let faceInc = 1 + V.hormoneUpgradePower;
					if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
						faceInc *= 2;
					}
					faceIncrease(slave, faceInc);
				}

				raiseVoice(slave, 2);
				softenMuscles(slave, 30);

				if (slave.waist > 10) {
					r.push(`Hormonal effects cause ${his} <span class="lime">waist to narrow.</span>`);
					slave.waist = Math.clamp(slave.waist - (2 + V.hormoneUpgradePower), 10, 100);
				}

				if (slave.geneMods.NCS === 0) {
					if (boobSize < 0.6 * normBreasts) {
						/* Grow to 60% of expected */
						r.push(`Hormonal effects cause <span class="lime">a small amount of natural breast growth.</span>`);
						slave.boobs += 25;
					}
					if (slave.nipples === "tiny") {
						r.push(`Hormonal effects cause ${his} tiny <span class="lime">nipples to grow to a more normal size.</span>`);
						slave.nipples = "cute";
					}
					if (buttSize < Math.trunc(3 * normButt) / 5) {
						/* 60% of normButt, rounded down to the next increment of .2 */
						r.push(`Hormonal effects cause <span class="lime">the natural size of ${his} butt to increase.</span>`);
						slave.butt += 0.2;
					}
				}
				increaseWetness(slave, 1);

				if (V.hormoneUpgradeShrinkage === 0) {
					if (slave.dick > 3) {
						if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
							r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} dick to atrophy a lot.</span>`);
							slave.dick -= 1;
						} else {
							r.push(`Hormonal effects cause <span class="orange">${his} dick to atrophy.</span>`);
							slave.dick--;
						}
					}
					if (slave.balls > 3) {
						if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
							r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} testicles to atrophy a lot.</span>`);
							slave.balls -= 1;
						} else {
							r.push(`Hormonal effects cause <span class="orange">${his} testicles to atrophy.</span>`);
						}
						slave.balls--;
					}
					if (slave.clit > 2) {
						if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
							r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} clit to shrink down greatly.</span>`);
							slave.clit -= 1;
						} else {
							r.push(`Hormonal effects cause <span class="orange">${his} clit to shrink significantly.</span>`);
						}
						slave.clit--;
					}
				}

				if (slave.devotion <= 20) {
					r.push(`Hormonal effects make ${him} a bit more <span class="hotpink">docile.</span>`);
					slave.devotion++;
				}
				if (slave.trust <= 20) {
					r.push(`Hormonal effects make ${him} a bit more <span class="mediumaquamarine">trusting.</span>`);
					slave.trust++;
				}
				if (slave.attrXY < 90) {
					r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to men.</span>`);
					slave.attrXY += 2 + V.hormoneUpgradePower;
				}
			} else if (slave.hormoneBalance >= 100) {
				if (slave.faceImplant < 5) {
					if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50 && slave.faceShape === "masculine") {
						r.push(`Hormonal effects cause <span class="orange">${his} face to soften into`);
						if (slave.geneMods.NCS === 1) {
							r.push(`childlike`);
						}
						r.push(`androgyny.</span>`);
						slave.faceShape = "androgynous";
					}
				}

				if (slave.geneMods.NCS === 0) {
					if (boobSize < 0.5 * normBreasts) {
						/* Grow to 50% of expected */
						r.push(`Hormonal effects cause <span class="lime">a small amount of natural breast growth.</span>`);
						slave.boobs += 25;
					}
				}

				if (slave.devotion <= 20) {
					r.push(`Hormonal effects make ${him} a bit more <span class="hotpink">docile.</span>`);
					slave.devotion++;
				}
				if (slave.trust <= 20) {
					r.push(`Hormonal effects make ${him} a bit more <span class="mediumaquamarine">trusting.</span>`);
					slave.trust++;
				}
				if (slave.attrXY < 80) {
					r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to men.</span>`);
					slave.attrXY += 2 + V.hormoneUpgradePower;
				}
			} else if (slave.hormoneBalance >= 50) {
				if (slave.attrXY < 70) {
					r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to men.</span>`);
					slave.attrXY += 2 + V.hormoneUpgradePower;
				}
			} else if (slave.hormoneBalance <= -350) {
				if (slave.geneMods.NCS === 1) {
					if (slave.hips + Math.abs(slave.hipsImplant) > -1 && slave.hips > -2 && (jsRandom(1, 100) <= 20 + (10 * V.hormoneUpgradePower))) {
						r.push(`Masculine hormones team up with ${his} <span class="orange">NCS</span> to cause <span class="lime">${his} hips to shrink into a more childlike narrowness</span> than before.`);
						slave.hips -= 1;
					}
				} else if (slave.physicalAge < 25) {
					if ((slave.shoulders - (Math.abs(slave.shouldersImplant)) < 1) && (slave.shoulders < 2) && (jsRandom(1, 100) < 20 + (10 * V.hormoneUpgradePower))) {
						r.push(`${His} body has not yet found its final bone structure, which typically happens in the mid-twenties. Hormonal effects cause ${his} shoulders to develop a more masculine wideness than they would have done naturally.`);
						slave.shoulders += 1;
					}
					if ((slave.hips + (Math.abs(slave.hipsImplant)) > -1) && (slave.hips > -2) && (jsRandom(1, 100) <= 20 + (10 * V.hormoneUpgradePower))) {
						r.push(`${His} body has not yet found its final bone structure, which typically happens in the mid-twenties. Hormonal effects cause ${his} hips to develop more narrowly than they would have done naturally.`);
						slave.hips -= 1;
					}
				}

				if (slave.geneMods.NCS === 0) {
					hardenFaceShape(slave);
					hardenFace(slave);
					lowerVoice(slave, 1);
				}

				if (V.hormoneUpgradeShrinkage === 0) {
					shrinkButt(slave);
					if (boobSize > 100 * gigantomastiaMod && gigantomastiaMod !== 3) {
						if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50 && boobSize > 200) {
							r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} tits to shrink a lot.</span>`);
							slave.boobs -= 10 + (15 * V.hormoneUpgradePower);
						} else {
							r.push(`Hormonal effects cause <span class="orange">the natural size of ${his} tits to shrink.</span>`);
						}
						slave.boobs -= 10 + (15 * V.hormoneUpgradePower);
					}
				}
				if (slave.geneMods.NCS === 1 && slave.nipples === "tiny") {
					/* nothing, just don't advance to cute */
				} else if (slave.nipples !== "cute" && slave.nipples !== "fuckable" && slave.nipples !== "flat") {
					r.push(`Hormonal effects cause ${his} <span class="orange">nipples to shrink to a more masculine size.</span>`);
					slave.nipples = "cute";
				}

				if (slave.geneMods.NCS === 0) {
					if (slave.dick.isBetween(0, 5)) {
						r.push(`Hormonal effects add <span class="lime">a bit more heft to ${his} penis.</span>`);
						slave.dick++;
					}
					if (slave.balls.isBetween(0, 5)) {
						r.push(`Hormonal effects cause <span class="lime">${his} balls to hang a little heavier.</span>`);
						slave.balls++;
					}

					if (slave.clit < 5 && slave.dick === 0) {
						r.push(`Hormonal effects cause <span class="lime">${his} clit to grow significantly.</span>`);
						slave.clit++;
					}
					lowerWetness(slave, 0);

					if (slave.muscles <= 50 && slave.diet !== "slimming") {
						r.push(`Hormonal effects <span class="lime">build up ${his} musculature.</span>`);
						slave.muscles += 2 + V.hormoneUpgradePower + slave.geneticQuirks.mGain;
					}
					if (slave.waist < 80) {
						r.push(`Hormonal effects cause ${his} <span class="orange">waist to broaden.</span>`);
						slave.waist = Math.clamp(slave.waist + 2 + V.hormoneUpgradePower, -100, 80);
					}
				}

				if (slave.attrXX < 100) {
					r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to women.</span>`);
					slave.attrXX += 2 + V.hormoneUpgradePower;
				}

				if (slave.devotion > 20 && slave.trust <= 20) {
					r.push(`Hormonal effects <span class="mediumorchid">make ${him} a bit less docile.</span>`);
					slave.devotion -= 1;
				}
			} else if (slave.hormoneBalance <= -300) {
				if (slave.geneMods.NCS === 0) {
					hardenFaceShape(slave);
					hardenFace(slave);
					lowerVoice(slave, 1);
				}

				if (V.hormoneUpgradeShrinkage === 0) {
					shrinkButt(slave);
					if (boobSize > 300 * gigantomastiaMod && gigantomastiaMod !== 3) {
						shrinkBoobs(slave);
					}
				}
				if (slave.geneMods.NCS === 1 && slave.nipples === "tiny") {
					/* nothing, just don't advance to cute */
				} else if (slave.nipples !== "cute" && slave.nipples !== "fuckable" && slave.nipples !== "flat") {
					r.push(`Hormonal effects cause ${his} <span class="orange">nipples to shrink to a more masculine size.</span>`);
					slave.nipples = "cute";
				}

				if (slave.geneMods.NCS === 0) {
					if (slave.dick.isBetween(0, 5)) {
						r.push(`Hormonal effects add <span class="lime">a bit more heft to ${his} penis.</span>`);
						slave.dick++;
					}
					if (slave.balls.isBetween(0, 5) && slave.ballType !== "sterile") {
						r.push(`Hormonal effects cause <span class="lime">${his} balls to hang a little heavier.</span>`);
						slave.balls++;
					}

					if (slave.clit < 4 && slave.dick === 0) {
						r.push(`Hormonal effects cause <span class="lime">${his} clit to grow significantly.</span>`);
						slave.clit++;
					}
					lowerWetness(slave, 0);

					if (slave.muscles <= 50 && slave.diet !== "slimming") {
						r.push(`Hormonal effects <span class="lime">build up ${his} musculature.</span>`);
						slave.muscles += 2 + V.hormoneUpgradePower + slave.geneticQuirks.mGain;
					}
					if (slave.waist < 40) {
						r.push(`Hormonal effects cause ${his} <span class="orange">waist to broaden.</span>`);
						slave.waist = Math.clamp(slave.waist + 2 + V.hormoneUpgradePower, -100, 40);
					}
				}

				if (slave.attrXX < 100) {
					r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to women.</span>`);
					slave.attrXX += 2 + V.hormoneUpgradePower;
				}

				if (slave.devotion > 20 && slave.trust <= 20) {
					r.push(`Hormonal effects <span class="mediumorchid">make ${him} a bit less docile.</span>`);
					slave.devotion -= 1;
				}
			} else if (slave.hormoneBalance <= -250) {
				if (slave.geneMods.NCS === 0) {
					if (slave.faceImplant < 5) {
						if (slave.faceShape !== "masculine" && slave.faceShape !== "androgynous") {
							r.push(`Hormonal effects cause <span class="orange">${his} face to harden into androgyny.</span>`);
							slave.faceShape = "androgynous";
						}
					}
					if (faceValue.isBetween(20, 100)) {
						r.push(`Hormonal effects cause <span class="orange">${his} facial structure to harden and become less attractive.</span>`);
						const faceDec = 1 + V.hormoneUpgradePower;
						slave.face = Math.clamp(slave.face - faceDec, -100, 100);
					}

					lowerVoice(slave, 1);
				}

				if (V.hormoneUpgradeShrinkage === 0) {
					if (buttSize > 2 && rearLipedemaMod === 0) {
						if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
							r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} butt to decrease a lot.</span>`);
							slave.butt -= 1;
						} else {
							r.push(`Hormonal effects cause <span class="orange">the natural size of ${his} butt to decrease.</span>`);
						}
						slave.butt--;
					}
					if (boobSize > 400 * gigantomastiaMod && gigantomastiaMod !== 3) {
						shrinkBoobs(slave);
					}
				}
				if (slave.geneMods.NCS === 1 && slave.nipples === "tiny") {
					/* nothing, just don't advance to cute */
				} else if (slave.nipples !== "cute" && slave.nipples !== "fuckable" && slave.nipples !== "flat") {
					r.push(`Hormonal effects cause ${his} <span class="orange">nipples to shrink to a more masculine size.</span>`);
					slave.nipples = "cute";
				}

				if (slave.geneMods.NCS === 0) {
					if (slave.dick.isBetween(0, 4)) {
						r.push(`Hormonal effects add <span class="lime">a bit more heft to ${his} penis.</span>`);
						slave.dick++;
					}
					if (slave.balls.isBetween(0, 4) && slave.ballType !== "sterile") {
						r.push(`Hormonal effects cause <span class="lime">${his} balls to hang a little heavier.</span>`);
						slave.balls++;
					}

					if (slave.clit < 3 && slave.dick === 0) {
						r.push(`Hormonal effects cause <span class="lime">${his} clit to grow significantly.</span>`);
						slave.clit++;
					}
					lowerWetness(slave, 0);

					if (slave.muscles <= 35 && slave.diet !== "slimming") {
						r.push(`Hormonal effects <span class="lime">build up ${his} musculature.</span>`);
						slave.muscles += 2 + V.hormoneUpgradePower + slave.geneticQuirks.mGain;
					}
					if (slave.waist < 25) {
						r.push(`Hormonal effects cause ${his} <span class="orange">waist to broaden.</span>`);
						slave.waist = Math.clamp(slave.waist + 2 + V.hormoneUpgradePower, -100, 25);
					}
				}

				if (slave.attrXX < 95) {
					r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to women.</span>`);
					slave.attrXX += 2 + V.hormoneUpgradePower;
				}

				if (slave.devotion > 20 && slave.trust <= 20) {
					r.push(`Hormonal effects <span class="mediumorchid">make ${him} a bit less docile.</span>`);
					slave.devotion -= 1;
				}
			} else if (slave.hormoneBalance <= -200) {
				if (slave.geneMods.NCS === 0) {
					if (slave.faceImplant < 5) {
						if (slave.faceShape !== "masculine" && slave.faceShape !== "androgynous") {
							r.push(`Hormonal effects cause <span class="orange">${his} face to harden into androgyny.</span>`);
							slave.faceShape = "androgynous";
						}
					}
					if (faceValue.isBetween(40, 100)) {
						r.push(`Hormonal effects cause <span class="orange">${his} facial structure to harden and become less attractive.</span>`);
						const faceDec = 1 + V.hormoneUpgradePower;
						slave.face = Math.clamp(slave.face - faceDec, -100, 100);
					}

					lowerVoice(slave, 2);
				}

				if (V.hormoneUpgradeShrinkage === 0) {
					if (buttSize > 3 && rearLipedemaMod === 0) {
						if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
							r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} butt to decrease a lot.</span>`);
							slave.butt -= 1;
						} else {
							r.push(`Hormonal effects cause <span class="orange">the natural size of ${his} butt to decrease.</span>`);
						}
						slave.butt--;
					}
					if (boobSize > 600 * gigantomastiaMod && gigantomastiaMod !== 3) {
						shrinkBoobs(slave);
					}
				}
				if (slave.nipples === "huge" || slave.nipples === "puffy") {
					r.push(`Hormonal effects cause ${his} big <span class="orange">nipples to shrink to a more reasonable size.</span>`);
					slave.nipples = "cute";
				}

				if (slave.geneMods.NCS === 0) {
					if (slave.dick.isBetween(0, 3)) {
						r.push(`Hormonal effects add <span class="lime">a bit more heft to ${his} penis.</span>`);
						slave.dick++;
					}
					if (slave.balls.isBetween(0, 3) && slave.ballType !== "sterile") {
						r.push(`Hormonal effects cause <span class="lime">${his} balls to hang a little heavier.</span>`);
						slave.balls++;
					}

					if (slave.clit < 2 && slave.dick === 0) {
						r.push(`Hormonal effects cause <span class="lime">${his} clit to grow significantly.</span>`);
						slave.clit++;
					}
					lowerWetness(slave, 0);

					if (slave.muscles <= 15 && slave.diet !== "slimming") {
						r.push(`Hormonal effects <span class="lime">build up ${his} musculature.</span>`);
						slave.muscles += 2 + V.hormoneUpgradePower + slave.geneticQuirks.mGain;
					}
					if (slave.waist < 9) {
						r.push(`Hormonal effects cause ${his} <span class="orange">waist to broaden.</span>`);
						slave.waist = Math.clamp(slave.waist + 2 + V.hormoneUpgradePower, -100, 9);
					}
				}

				if (slave.attrXX < 90) {
					r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to women.</span>`);
					slave.attrXX += 2 + V.hormoneUpgradePower;
				}

				if (slave.devotion > 20 && slave.trust <= 20) {
					r.push(`Hormonal effects <span class="mediumorchid">make ${him} a bit less docile.</span>`);
					slave.devotion -= 1;
				}
			} else if (slave.hormoneBalance <= -100) {
				if (slave.geneMods.NCS === 0) {
					if (faceValue.isBetween(60, 100)) {
						r.push(`Hormonal effects cause <span class="orange">${his} facial structure to harden and become less attractive.</span>`);
						const faceDec = 1 + V.hormoneUpgradePower;
						slave.face = Math.clamp(slave.face - faceDec, -100, 100);
					}

					lowerVoice(slave, 2);
				}

				if (V.hormoneUpgradeShrinkage === 0) {
					if (buttSize > 4 && rearLipedemaMod === 0) {
						if (slave.geneMods.NCS === 1 && jsRandom(1, 100) > 50) {
							r.push(`Hormonal effects work with ${his} <span class="orange">NCS</span> and cause <span class="orange">${his} butt to decrease a lot.</span>`);
							slave.butt -= 1;
						} else {
							r.push(`Hormonal effects cause <span class="orange">the natural size of ${his} butt to decrease.</span>`);
						}
						slave.butt--;
					}
					if (boobSize > 800 * gigantomastiaMod && gigantomastiaMod !== 3) {
						shrinkBoobs(slave);
					}
				}

				if (slave.geneMods.NCS === 0) {
					if (slave.muscles < 0 && slave.diet !== "slimming") {
						r.push(`Hormonal effects <span class="lime">build up ${his} musculature.</span>`);
						slave.muscles += 2 + V.hormoneUpgradePower + slave.geneticQuirks.mGain;
					}

					if (slave.waist < 0) {
						r.push(`Hormonal effects cause ${his} <span class="orange">waist to broaden.</span>`);
						slave.waist = Math.clamp(slave.waist + 2 + V.hormoneUpgradePower, -100, 0);
					}

					if (slave.dick.isBetween(0, 2)) {
						r.push(`Hormonal effects cause <span class="lime">${his} micropenis to return to a more normal size.</span>`);
						slave.dick++;
					}
					if (slave.balls.isBetween(0, 2)) {
						r.push(`Hormonal effects cause <span class="lime">${his} balls to drop.</span>`);
						slave.balls++;
					}

					if (slave.clit < 1 && slave.dick === 0) {
						r.push(`Hormonal effects cause <span class="lime">${his} clit to grow significantly.</span>`);
						slave.clit++;
					}
					lowerWetness(slave, 1);
				}

				if (slave.attrXX < 80) {
					r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to women.</span>`);
					slave.attrXX += 2 + V.hormoneUpgradePower;
				}

				if (slave.devotion > 20 && slave.trust <= 20) {
					r.push(`Hormonal effects <span class="mediumorchid">make ${him} a bit less docile.</span>`);
					slave.devotion -= 1;
				}
			} else if (slave.hormoneBalance <= -50) {
				if (slave.attrXX < 70) {
					r.push(`Hormonal effects cause ${him} to become <span class="green">more attracted to women.</span>`);
					slave.attrXX += 2 + V.hormoneUpgradePower;
				}
			}
		}
	}

	/**
	 * @param {App.Entity.SlaveState} slave
	 *
	 */
	function hormoneReactions(slave) {
		if (slave.hormoneBalance <= 20 && slave.hormones < 1) {
			if (slave.dick > 0) {
				if (slave.devotion > 20) {
					if ((slave.boobs < 800 && slave.butt < 3) || (slave.faceShape === "masculine") || (slave.shoulders > slave.hips) || (slave.balls > 4)) {
						if (slave.career === "a Futanari Sister") {
							r.push(`${He} wishes ${he} were more feminine, but isn't unhappy to be off hormones, since ${he} likes being a stiff dicked futa.`);
						} else if (slave.fetish === "buttslut" && slave.fetishStrength > 60 && slave.fetishKnown === 1) {
							r.push(`${He} wishes ${he} were more feminine, but ${he} loves getting fucked in the butt so much that it doesn't much bother ${him}.`);
						} else if (slave.fetish === "sadist" && slave.fetishStrength > 60 && slave.fetishKnown === 1) {
							r.push(`Life is easier for effeminate slaves, but ${he} loves abusing other slaves so much that ${he} likes being able to get hard.`);
						} else if (slave.fetish === "dom" && slave.fetishStrength > 60 && slave.fetishKnown === 1) {
							r.push(`Life is easier for effeminate slaves, but ${he} loves dominating other girls so much that ${he} likes being able to get hard.`);
						} else if (slave.energy > 95) {
							r.push(`${He} wishes ${he} were more feminine, but ${he} loves getting fucked like a good little sex slave so much that ${he} doesn't think about it much.`);
						} else if (slave.devotion <= 30) {
							r.push(`Life is easier for effeminate slaves, so <span class="mediumorchid">${he}'s a little unhappy</span> that ${he} isn't getting hormones to make ${him} more feminine.`);
							slave.devotion -= 2;
						} else if (slave.devotion <= 50) {
							r.push(`${He} wants to be a good slave girl, so <span class="mediumorchid">${he}'s a little unhappy</span> that ${he} isn't getting hormones to make ${him} look more feminine.`);
							slave.devotion -= 2;
						} else {
							r.push(`${He} wishes ${he} were more feminine, but ${he} accepts your judgment in not giving ${him} hormones to make that happen.`);
						}
					}
				}
			}
		}
	}
};