code:
/**
 * @param {FC.GingeredSlave} slave
 * @returns {string}
 */
App.Desc.vagina = function(slave) {
	const r = [];
	const {
		he, him, his, himself, He, His
	} = getPronouns(slave);

	if (slave.dick > 0) {
		if (slave.vagina > -1) {
			r.push(`${His}`);
			if (slave.genes === "XX") {
				r.push(`beautifully natural`);
			} else if (slave.ovaries === 1) {
				r.push(`finely crafted`);
			} else {
				r.push(`artificial`);
			}
			r.push(`vagina is located beneath the base of ${his} penis,`);
			if (slave.fuckdoll > 0) {
				r.push(`just after the suit's material stops to bare ${his} front hole.`);
			} else if ((slave.scrotum > 3) && (slave.balls <= slave.scrotum)) {
				r.push(`though it is almost completely hidden by ${his} hanging ballsack.`);
			} else if ((slave.scrotum > 1) && (slave.balls > 0)) {
				r.push(`its upper part concealed by ${his} balls.`);
			} else if (canAchieveErection(slave)) {
				r.push(`and merges seamlessly into ${his} shaft.`);
			} else {
				if (slave.dick > 3) {
					r.push(`though it is almost completely hidden by ${his} soft cockmeat.`);
				} else {
					r.push(`which acts as a soft little dickclit for it.`);
				}
			}
			if (slave.clit === 0) {
				r.push(`The base of ${his} cock is located where the clitoris would be on a normal woman.`);
			}
		}
	}

	if (slave.vagina > -1) {
		if (slave.vagina === 0) {
			r.push(`${He} is a <span class="lime">virgin.</span> ${His} pussy is fresh,`);
		} else if (slave.vagina === 1) {
			r.push(`${His} pussy is tight and appealing,`);
		} else if (slave.vagina === 2) {
			r.push(`${His} pussy is reasonably tight,`);
		} else if (slave.vagina === 3) {
			r.push(`${His} pussy is loose,`);
		} else if (slave.vagina >= 10) {
			r.push(`${His} pussy has been completely ruined from hundreds of births. One could fit their arm into it with minimal effort and ${he} can barely get off from vaginal sex now. ${His} pussy is abyssal,`);
		} else if (slave.vagina > 3) {
			r.push(`${His} pussy is utterly cavernous,`);
		}

		if (slave.labia === 0) {
			r.push(`with minimal`);
		} else if (slave.labia === 1) {
			r.push(`with big puffy`);
		} else if (slave.labia === 2) {
			r.push(`with huge`);
		} else {
			r.push(`with huge dangling`);
		}

		if (V.seeRace === 1) {
			if (slave.race === "white") {
				r.push(`pink pussylips.`);
			} else if (slave.race === "asian") {
				r.push(`dark ${slave.race} pussylips.`);
			} else if (slave.race === "middle eastern") {
				r.push(`dark ${slave.race} pussylips.`);
			} else if (slave.race === "latina") {
				r.push(`dark ${slave.race} pussylips.`);
			} else if (slave.race === "black") {
				r.push(`dark ${slave.race} pussylips.`);
			} else {
				r.push(`${slave.skin} pussylips.`);
			}
		} else {
			r.push(`${slave.skin} pussylips.`);
		}

		if (slave.vagina > -1) {
			if (slave.vaginaLube === 0) {
				if (slave.vagina > 0 && !(slave.chastityVagina)) {
					r.push(`${He} produces very little natural wetness, so ${he} is`);
					if (slave.fuckdoll === 0) {
						r.push(`required to keep ${himself}`);
					} else {
						r.push(`is kept`);
					}
					r.push(`artificially lubricated for anyone who wishes to use ${his} cunt.`);
				} else {
					r.push(`${He} produces very little natural wetness.`);
				}
				if (slave.prostate !== 0) {
					if (slave.dick === 0) {
						r.push(`In stark contrast, however, ${he}'s been given a functional prostate gland. It's attached to ${his} urethra, of course, so despite ${his} dryness, ${he} squirts`);
						if (slave.balls > 0) {
							r.push(`semen`);
						} else {
							r.push(`fluid`);
						}
						r.push(`when ${he} orgasms.`);
						if (slave.prostate > 2) {
							r.push(`With the implant embedded in it, that squirt is more like a blast; ${he} will soak ${himself} and anyone near ${him}.`);
						}
					}
				}
			} else if (slave.vaginaLube < 2) {
				if (slave.assignment === "work in the dairy" && V.dairyPregSetting > 1) {
					r.push(`The dildo's ejaculate includes a drug that causes copious, constant vaginal lubrication, allowing it to fuck ${him} despite its giant size. The excess female fluid drips off ${him} and into a catch basin.`);
				} else if ((slave.aphrodisiacs > 0) || (slave.inflationType === "aphrodisiac")) {
					r.push(`The aphrodisiacs have them`);
					if (slave.aphrodisiacs > 1 || (slave.inflationType === "aphrodisiac" && slave.inflation >= 2)) {
						r.push(`sopping`);
					}
					r.push(`wet.`);
				} else if (slave.energy > 95) {
					r.push(`As a nympho, ${he}'s almost constantly wet.`);
				} else if ((slave.fetishStrength > 60) && (slave.fetishKnown === 1)) {
					r.push(`Judging by how wet ${he} is, ${he}'s probably fantasizing about`);
					switch (slave.fetish) {
						case "buttslut":
							r.push(`being buttfucked.`);
							break;
						case "cumslut":
							r.push(`being facefucked.`);
							break;
						case "humiliation":
							r.push(`being humiliated.`);
							break;
						case "submissive":
							r.push(`submission.`);
							break;
						case "dom":
							r.push(`dominating someone.`);
							break;
						case "sadist":
							r.push(`hurting someone.`);
							break;
						case "masochist":
							r.push(`pain.`);
							break;
						case "pregnancy":
							if (slave.pregKnown) {
								r.push(`having another`);
								if (slave.pregType > 1) {
									r.push(`brood`);
								} else {
									r.push(`child`);
								}
								r.push(`after this one.`);
							} else {
								r.push(`getting pregnant.`);
							}
							break;
						case "boobs":
							r.push(`boobs.`);
							break;
						default:
							r.push(`getting fucked.`);
							break;
					}
				} else if (slave.devotion > 50) {
					r.push(`As a devoted sex slave, ${he} has no trouble keeping ${himself} wet for ${his} ${getWrittenTitle(slave)}.`);
				} else if (slave.devotion > 20) {
					r.push(`As an obedient sex slave, ${he} does ${his} best to keep ${himself} wet for ${his} ${getWrittenTitle(slave)}.`);
				}
				if (slave.prostate !== 0) {
					if (slave.dick === 0) {
						r.push(`Bizarrely, ${he}'s been given a functional prostate gland. It's attached to ${his} urethra, of course,`);
						if (slave.balls > 0) {
							r.push(`which in combination with ${his} testicles make ${his} squirt copious amounts of fluids and semen with each orgasm.`);
						} else {
							r.push(`so ${he} squirts copiously when ${he} orgasms.`);
						}
						if (slave.prostate > 2) {
							r.push(`With the implant embedded in it; that gush is more like a flood. Changes of clothes are a must with ${him}, as ${he} can and will soak both you, ${himself} and what ${he} is getting fucked over.`);
						}
					}
				}
			} else {
				if (slave.assignment === "work in the dairy" && V.dairyPregSetting > 1) {
					r.push(`The dildo's ejaculate includes a drug that encourages vaginal lubrication, which is having a drastic effect on ${him}, since ${he}'s already very gifted in that regard. The dildo makes a wet noise every time it thrusts into ${him}, and femcum streams into a catch basin beneath ${him}. The smell of pussy is overwhelming.`);
				} else if ((slave.aphrodisiacs > 0) || (slave.gingering && slave.gingering.type === "vasodilator") || (slave.inflationType === "aphrodisiac")) {
					r.push(`The combination of the aphrodisiacs and ${his} natural tendency to produce a lot of female lubricant is having a drastic effect. ${His} cunt is absolutely beribboned with femcum, and ${he} smells strongly of wet, clean pussy.`);
				} else if (slave.energy > 95) {
					r.push(`${He} has a naturally wet cunt, and in combination with ${his} nymphomania, it's soaking. ${He} smells of good clean female arousal.`);
				} else if ((slave.fetishStrength > 60) && (slave.fetishKnown === 1)) {
					r.push(`${His} naturally wet cunt is almost dripping female lubricant, and ${he} smells of good clean female arousal. ${He}'s probably fantasizing about`);
					switch (slave.fetish) {
						case "buttslut":
							r.push(`being buttfucked.`);
							break;
						case "cumslut":
							r.push(`being facefucked.`);
							break;
						case "humiliation":
							r.push(`being humiliated.`);
							break;
						case "submissive":
							r.push(`submission.`);
							break;
						case "dom":
							r.push(`dominating someone.`);
							break;
						case "sadist":
							r.push(`hurting someone.`);
							break;
						case "masochist":
							r.push(`pain.`);
							break;
						case "pregnancy":
							if (slave.pregKnown === 1) {
								r.push(`growing rounder.`);
							} else {
								r.push(`getting pregnant.`);
							}
							break;
						case "boobs":
							r.push(`boobs.`);
							break;
						default:
							r.push(`getting fucked.`);
					}
				} else if (slave.devotion > 50) {
					r.push(`${His} cunt is almost always soaking wet, but being near you has ${his} almost dripping.`);
				} else if (slave.devotion > 20) {
					r.push(`${His} cunt is almost always soaking wet, and being near you isn't affecting that.`);
				} else {
					r.push(`${His} cunt is almost always soaking wet, regardless of ${his} feelings.`);
				}
				if (slave.prostate !== 0) {
					if (slave.dick === 0) {
						r.push(`Bizarrely, ${he}'s been given a functional prostate gland. It's attached to ${his} urethra, of course,`);
						if (slave.balls > 0) {
							r.push(`which in combination with ${his} testicles make ${his} squirt unreasonable volume of fluids and semen with each orgasm.`);
						} else {
							r.push(`meaning that when ${he} orgasms, ${he} squirts an unreasonable volume of fluid.`);
						}
						if (slave.prostate > 2) {
							r.push(`With the implant embedded in it, that gush is insane. Everything around ${him} is at risk of being splashed. Changes of clothes are a must with ${him}, as are supplies to mop up afterwards.`);
						}
					}
				}
			}
		}
		if (slave.vaginalAccessory !== "none") {
			r.push(App.Desc.vaginalAccessory(slave));
		}
	}

	if (slave.ovaImplant !== 0) {
		switch (slave.ovaImplant) {
			case "fertility":
				r.push(`${His} ovaries have a pair of implants attached to them to encourage`);
				if (slave.preg < -1) {
					r.push(`ovulation, not that it does ${him} any good`);
				} else {
					r.push(`ovulation.`);
				}
				break;
			case "sympathy":
				r.push(`${His} ovaries have a pair of linked implants attached to them so that when one releases an egg the other does so as well.`);
				break;
			case "asexual":
				r.push(`One of ${his} ovaries has been replaced with a fabricated sperm sack designed to fertilize any eggs ${he} makes.`);
				break;
		}
	}

	if (slave.dick === 0 && slave.balls === 0 && slave.vagina < 0 && V.arcologies[0].FSRestart > 60) {
		r.push(`Society looks fondly on ${his} complete inability to reproduce.`);
	}

	if (slave.dick === 0) {
		if (slave.clit > 0) {
			if (slave.foreskin === 0) {
				if (slave.clit === 1) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is quite large and visibly hard.`);
					} else {
						r.push(`${His} clit is quite large.`);
					}
					r.push(`${His} lack of hood makes it even more prominent.`);
				} else if (slave.clit === 2) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is huge and visibly erect.`);
					} else {
						r.push(`${His} clit is huge.`);
					}
					r.push(`${His} lack of hood, combined with its size, means ${he} can't wear any clothes without being constantly stimulated.`);
				} else if (slave.clit === 3) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
					} else {
						r.push(`${His} clit is enormous, almost a pseudophallus.`);
					}
				} else if (slave.clit === 4) {
					if (slave.devotion > 50) {
						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
					} else {
						r.push(`${His} clit has reached the size of an average penis.`);
					}
				} else {
					if (slave.devotion > 50) {
						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
					} else {
						r.push(`${His} clit is massive, having reached the size of a large penis.`);
					}
				}
			} else if (slave.foreskin === 1) {
				if (slave.clit === 1) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is quite large and visibly hard.`);
					} else {
						r.push(`${His} clit is quite large.`);
					}
					r.push(`${His} clitoral hood is stretched thin trying to cover it.`);
				} else if (slave.clit === 2) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is huge and visibly erect.`);
					} else {
						r.push(`${His} clit is huge.`);
					}
					r.push(`${His} small hood is no longer able to cover it completely, and a large part of ${his} clitoris is always exposed.`);
				} else if (slave.clit === 3) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
					} else {
						r.push(`${His} clit is enormous, almost a pseudophallus.`);
					}
					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
				} else if (slave.clit === 4) {
					if (slave.devotion > 50) {
						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
					} else {
						r.push(`${His} clit has reached the size of an average penis.`);
					}
					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
				} else {
					if (slave.devotion > 50) {
						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
					} else {
						r.push(`${His} clit is massive, having reached the size of a large penis.`);
					}
					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
				}
			} else if (slave.foreskin === 2) {
				if (slave.clit === 1) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is quite large and visibly hard.`);
					} else {
						r.push(`${His} clit is quite large.`);
					}
					r.push(`It is completely covered by its hood.`);
				} else if (slave.clit === 2) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is huge and visibly erect.`);
					} else {
						r.push(`${His} clit is huge.`);
					}
					r.push(`Its hood is stretched thin trying to cover it.`);
				} else if (slave.clit === 3) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
					} else {
						r.push(`${His} clit is enormous, almost a pseudophallus.`);
					}
					r.push(`It's large enough that the hood can cover only half of it.`);
				} else if (slave.clit === 4) {
					if (slave.devotion > 50) {
						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
					} else {
						r.push(`${His} clit has reached the size of an average penis.`);
					}
					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
				} else {
					if (slave.devotion > 50) {
						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
					} else {
						r.push(`${His} clit is massive, having reached the size of a large penis.`);
					}
					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
				}
			} else if (slave.foreskin === 3) {
				if (slave.clit === 1) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is quite large and visibly hard.`);
					} else {
						r.push(`${His} clit is quite large.`);
					}
					r.push(`However, the hood covering it is also quite large, making stimulation difficult.`);
				} else if (slave.clit === 2) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is huge and visibly erect.`);
					} else {
						r.push(`${His} clit is huge.`);
					}
					r.push(`${His} large hood completely covers it.`);
				} else if (slave.clit === 3) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
					} else {
						r.push(`${His} clit is enormous, almost a pseudophallus.`);
					}
					r.push(`${His} large hood covers all but the tip of ${his} clit, even when aroused.`);
				} else if (slave.clit === 4) {
					if (slave.devotion > 50) {
						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
					} else {
						r.push(`${His} clit has reached the size of an average penis.`);
					}
					r.push(`Even ${his} large hood can't cover it, leaving over half of the clit exposed.`);
				} else {
					if (slave.devotion > 50) {
						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
					} else {
						r.push(`${His} clit is massive, having reached the size of a large penis.`);
					}
					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
				}
			} else {
				if (slave.clit === 1) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is quite large and visibly hard.`);
					} else {
						r.push(`${His} clit is quite large.`);
					}
					r.push(`However, the large, thick hood covering it makes any stimulation difficult.`);
				} else if (slave.clit === 2) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is huge and visibly erect.`);
					} else {
						r.push(`${His} clit is huge.`);
					}
					r.push(`However, the large, thick hood covering it makes any stimulation difficult.`);
				} else if (slave.clit === 3) {
					if (slave.devotion > 50) {
						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
					} else {
						r.push(`${His} clit is enormous, almost a pseudophallus.`);
					}
					r.push(`Matching its size is the thick hood covering it.`);
				} else if (slave.clit === 4) {
					if (slave.devotion > 50) {
						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
					} else {
						r.push(`${His} clit has reached the size of an average penis.`);
					}
					r.push(`${His} large hood covering over half of it adds to its penis-like appearance.`);
				} else {
					if (slave.devotion > 50) {
						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never reach full erection.`);
					} else {
						r.push(`${His} clit is massive, having reached the size of a large penis.`);
					}
					r.push(`Not even its large hood can contain it, leaving over half of it exposed.`);
				}
			}
		}
	}

	r.push(App.Desc.mods(slave, "vagina"));
	r.push(App.Desc.mods(slave, "clit"));

	if (slave.fuckdoll === 0) {
		if (slave.rules.release.masturbation === 1) {
			if ((slave.aphrodisiacs > 0 || slave.inflationType === "aphrodisiac") && slave.drugs !== "priapism agents") {
				if ((slave.aphrodisiacs > 1) || (slave.inflationType === "aphrodisiac" && slave.inflation > 1)) {
					if (slave.dick !== 0 && slave.hormoneBalance >= 100 && (!hasAnyArms(slave))) {
						r.push(`The extreme dose of aphrodisiacs combined with the hormones that keep ${him} flaccid have ${him} in a state of extreme sexual frustration; ${he}'s`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`unconsciously humping ${his} ass against whatever's next to ${him} for anal stimulation and`);
						}
						r.push(`humping ${his} dick against whatever ${he} can manage to mount without limbs.`);
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					} else if ((slave.dick !== 0) && (slave.balls > 0) && slave.ballType === "sterile" && (!hasAnyArms(slave))) {
						r.push(`The extreme dose of aphrodisiacs combined with the chemical castration that keeps ${him} flaccid have ${him} in a state of extreme sexual frustration; ${he}'s`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`unconsciously humping ${his} ass against whatever's next to ${him} for anal stimulation and`);
						}
						r.push(`humping ${his} limp dick against whatever ${he} can manage to mount without limbs.`);
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					} else if ((slave.dick !== 0) && (slave.balls === 0) && (!hasAnyArms(slave))) {
						r.push(`The extreme dose of aphrodisiacs combined with the lack of balls that keeps ${him} flaccid have ${him} in a state of extreme sexual frustration; ${he}'s`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`unconsciously humping ${his} ass against whatever's next to ${him} for anal stimulation and`);
						}
						r.push(`humping ${his} limp dick against whatever ${he} can manage to mount without limbs.`);
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					} else if ((slave.dick !== 0) && (slave.hormoneBalance >= 100)) {
						r.push(`The extreme dose of aphrodisiacs combined with the hormones that keep ${him} flaccid have ${him} in a state of extreme sexual frustration; ${he}'s rubbing ${his} limp dick`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`distractedly and unconsciously humping ${his} ass against whatever's next to ${him} for anal stimulation.`);
						} else {
							r.push(`distractedly.`);
						}
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					} else if ((slave.dick !== 0) && (slave.balls === 0)) {
						r.push(`The extreme dose of aphrodisiacs combined with the lack of balls that keeps ${him} flaccid have ${him} in a state of extreme sexual frustration; ${he}'s rubbing ${his} limp dick distractedly`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`distractedly and unconsciously humping ${his} ass against whatever's next to ${him} for anal stimulation.`);
						} else {
							r.push(`distractedly.`);
						}
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					} else if ((slave.dick !== 0) && !canAchieveErection(slave)) {
						r.push(`The extreme dose of aphrodisiacs combined with ${his} inability to become erect have ${him} in a state of extreme sexual frustration; ${he}'s rubbing ${his} limp dick distractedly`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`distractedly and unconsciously humping ${his} ass against whatever's next to ${him} for anal stimulation.`);
						} else {
							r.push(`distractedly.`);
						}
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					} else if (slave.dick !== 0) {
						r.push(`The extreme dose of aphrodisiacs has ${his} cock painfully erect and leaves precum dripping from its head.`);
					}
				} else {
					if (slave.dick !== 0 && slave.hormoneBalance >= 100 && (!hasAnyArms(slave))) {
						r.push(`The aphrodisiacs combined with the hormones that keep ${him} flaccid have ${him} sexually frustrated; ${he}'s`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`unconsciously rubbing ${his} ass against whatever's next to ${him}, and`);
						}
						r.push(`humping ${his} dick against whatever ${he} can manage to mount without limbs.`);
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					} else if ((slave.dick !== 0) && (slave.balls > 0) && slave.ballType === "sterile" && (!hasAnyArms(slave))) {
						r.push(`The aphrodisiacs combined with the chemical castration that keeps ${him} flaccid have ${him} sexually frustrated; ${he}'s`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`unconsciously rubbing ${his} ass against whatever's next to ${him}, and`);
						}
						r.push(`humping ${his} dick against whatever ${he} can manage to mount without limbs.`);
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					} else if ((slave.dick !== 0) && (slave.balls === 0) && (!hasAnyArms(slave))) {
						r.push(`The aphrodisiacs combined with the lack of balls that keeps ${him} flaccid have ${him} sexually frustrated; ${he}'s`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`unconsciously rubbing ${his} ass against whatever's next to ${him}, and`);
						}
						r.push(`humping ${his} dick against whatever ${he} can manage to mount without limbs.`);
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					} else if ((slave.dick !== 0) && (slave.hormoneBalance >= 100)) {
						r.push(`The aphrodisiacs combined with the hormones that keep ${him} flaccid have ${him} sexually frustrated; ${he}'s touching ${his} limp dick distractedly`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`distractedly and unconsciously rubbing ${his} ass against whatever's next to ${him}.`);
						} else {
							r.push(`distractedly.`);
						}
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					} else if ((slave.dick !== 0) && (slave.balls === 0)) {
						r.push(`The aphrodisiacs combined with the lack of balls that keeps ${him} flaccid have ${him} sexually frustrated; ${he}'s touching ${his} limp dick distractedly`);
						if ((slave.fetish === "buttslut") || ((slave.sexualFlaw !== "hates anal") && (slave.counter.anal > 9))) {
							r.push(`distractedly and unconsciously rubbing ${his} ass against whatever's next to ${him}.`);
						} else {
							r.push(`distractedly.`);
						}
						if (slave.inflationType === "aphrodisiac") {
							r.push(`${His} efforts force ${his} distended middle to jiggle around, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more.`);
						}
					}
				}
			}
		}
	}

	if (slave.fuckdoll > 0) {
		if (slave.vagina > 0) {
			r.push(`${His} front hole`);
			if (slave.fuckdoll <= 45) {
				r.push(`is mostly useful when ${he}'s restrained for rape.`);
			} else {
				r.push(`will massage`);
				if (V.PC.dick !== 0) {
					r.push(`cocks`);
				} else {
					r.push(`anything`);
				}
				r.push(`placed inside it on command.`);
				if (slave.fuckdoll <= 85) {
					r.push(`${He} is even capable of riding`);
					if (V.PC.dick !== 0) {
						r.push(`dick.`);
					} else {
						r.push(`a strap-on.`);
					}
				}
			}
		}
	} else {
		if (slave.vagina === -1) {
			if (V.seeDicks < 100 && slave.anus !== 0) {
				r.push(`Since ${he} lacks a vagina, ${he} takes it up`);
				if (V.seeRace === 1) {
					r.push(`${his} ${slave.race}`);
				} else {
					r.push(`the`);
				}
				r.push(`ass instead.`);
			}
		} else if (slave.skill.vaginal >= 100) {
			r.push(`${He} is a <span class="skill">vanilla sex master.</span>`);
		} else if (slave.skill.vaginal > 60) {
			r.push(`${He} is a <span class="skill">vanilla sex expert.</span>`);
		} else if (slave.skill.vaginal > 30) {
			r.push(`${He} is <span class="skill">skilled at vanilla sex.</span>`);
		} else if (slave.skill.vaginal > 10) {
			r.push(`${He} has <span class="skill">basic knowledge about vanilla sex.</span>`);
		} else {
			r.push(`${He} is unskilled at vaginal sex.`);
		}
	}

	r.push(App.Desc.mods(slave, "pubic mound"));

	const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);

	if (slave.race === "catgirl") {
		if (slave.pubicHStyle === "hairless" || slave.pubicHStyle === "bald" || slave.pubicHStyle === "waxed" || slave.pubicHStyle === "shaved") {
			r.push(`${His} ${slave.skin} pubic fur is silky and indistinguishable from the rest of ${his} fur.`);
		} else if (slave.pubicHStyle === "in a strip") {
			r.push(`${He} has a cute line of ${slave.pubicHColor} fur just above ${his} crotch.`);
		} else if (slave.pubicHStyle === "neat") {
			r.push(`${He} has a neat patch of ${slave.pubicHColor} fur above ${his} crotch.`);
		} else if (slave.pubicHStyle === "bushy" || slave.pubicHStyle === "bushy in the front and neat in the back") {
			r.push(`${His} ${slave.pubicHColor} fur is particularly bushy around ${his} crotch.`);
		} else if (slave.pubicHStyle === "very bushy") {
			r.push(`${He} has a veritable bush of ${slave.pubicHColor} fur around ${his} crotch that flares out to ${his} thighs.`);
		}
	} else if (slave.physicalAge < pubertyAge - 2) {
		r.push(`${He} is too sexually immature to have pubic hair.`);
	} else if (slave.pubicHStyle === "hairless") {
		r.push(`${He}'s naturally smooth and hairless.`);
	} else if (slave.pubicHStyle === "bald") {
		r.push(`${He} is no longer able to grow pubic hair, leaving ${him} hairless and smooth.`);
	} else if (slave.pubicHStyle === "waxed") {
		if (slave.fuckdoll > 0) {
			r.push(`${His} pubic hair has been removed to prevent chafing.`);
		} else if ((slave.assignment === "work in the dairy") && (V.dairyRestraintsSetting > 1)) {
			r.push(`${His} pubic hair has been removed to prevent chafing.`);
		} else {
			r.push(`${He}'s waxed and smooth.`);
		}
	} else if (slave.physicalAge < pubertyAge - 1) {
		r.push(`${He} has a few wisps of pubic hair.`);
	} else if (slave.physicalAge < pubertyAge) {
		r.push(`${He} is on the verge of puberty and has a small patch of ${slave.pubicHColor} pubic hair above ${his}`);
		if (slave.dick > 0) {
			r.push(`cock.`);
		} else if (slave.vagina === -1) {
			r.push(`smoothness.`);
		} else {
			r.push(`pussy.`);
		}
	} else if (slave.pubicHStyle === "in a strip") {
		r.push(`${His} ${slave.pubicHColor} pubic hair is waxed into a narrow strip above ${his}`);
		if (slave.dick > 0) {
			r.push(`cock.`);
		} else if (slave.vagina === -1) {
			r.push(`smoothness.`);
		} else {
			r.push(`pussy.`);
		}
	} else if (slave.pubicHStyle === "neat") {
		r.push(`${His} ${slave.pubicHColor} pubic hair is waxed into a neat patch above ${his}`);
		if (slave.dick > 0) {
			r.push(`cock.`);
		} else if (slave.vagina === -1) {
			r.push(`smoothness.`);
		} else {
			r.push(`pussy.`);
		}
	} else if (slave.pubicHStyle === "bushy in the front and neat in the rear") {
		r.push(`${His} ${slave.pubicHColor} pubic hair forms a natural bush above ${his}`);
		if (slave.dick > 0) {
			r.push(`cock.`);
		} else if (slave.vagina === -1) {
			r.push(`smoothness.`);
		} else {
			r.push(`pussy.`);
		}
	} else if (slave.pubicHStyle === "bushy") {
		r.push(`${His} ${slave.pubicHColor} pubic hair forms a natural bush above ${his}`);
		if (slave.dick > 0) {
			r.push(`cock.`);
		} else if (slave.vagina === -1) {
			r.push(`smoothness.`);
		} else {
			r.push(`pussy.`);
		}
	} else if (slave.pubicHStyle === "very bushy") {
		r.push(`${His} ${slave.pubicHColor} pubic hair forms a dense bush above ${his}`);
		if (slave.dick > 0) {
			r.push(`cock`);
		} else if (slave.vagina === -1) {
			r.push(`smoothness`);
		} else {
			r.push(`pussy`);
		}
		r.push(`that trails up to ${his} navel.`);
	}

	return r.join(" ");
};


code:
/**
 * @param {App.Entity.SlaveState} slave
 * @returns {string}
 */
App.Desc.vaginalAccessory = function(slave) {
	if (slave.vaginalAccessory === "none") {
		return "";
	}
	const r = [];
	const {
		he, his, He, His
	} = getPronouns(slave);
	let held;
	if (slave.chastityVagina) {
		held = "held in place by a chastity belt";
	} else if (dildoWidth(slave) === 0) {
		held = "held in place by a strap";
	} else {
		held = `held in place by a strap, which ${he} can remove for vaginal intercourse`;
	}
	const dildo = App.Data.vaginalAccessory.get(slave.vaginalAccessory) || V.customItem.vaginalAccessory.get(slave.vaginalAccessory);
	switch (dildo.width) {
		case 0:
			r.push(`A ${slave.vaginalAccessory} is attached on ${his} clit, ${held}.`);	// FIXME: not super happy with this
			break;
		case 1:
			r.push(`${His} pussy is filled by a ${slave.vaginalAccessory} ${held}.`);/* TODO: these may need to be updated for slaves with gaping+ vaginas */
			if (dildo.length > 1) {
				r.push(`It noticeably bulges ${his} stomach.`);
			}
			break;
		case 2:
			r.push(`${His} pussy is`);
			if (slave.vagina < 2) {
				r.push(`painfully stretched`);
			} else if (slave.vagina < 3) {
				r.push(`uncomfortably filled`);
			} else {
				r.push(`comfortably filled`);
			}
			r.push(`by a large ${slave.vaginalAccessory} ${held}.`);
			if (dildo.length > 1) {
				r.push(`It noticeably bulges ${his} stomach.`);
			}
			break;
		case 3:
			if (slave.vagina < 4) {
				r.push(`${His} pussy is filled to the breaking point by an enormous ${slave.vaginalAccessory}.`);
				if (dildo.length > 1) {
					r.push(`It noticeably bulges ${his} stomach.`);
				}
				if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
					r.push(`${He} can barely move with the discomfort, but ${he} frequently climaxes with agony.`);
				} else {
					r.push(`${He} can barely move with the discomfort, and ${he} sometimes breaks down in tears at having ${his} cunt permanently stretched.`);
				}
			} else {
				r.push(`${His} cavernous pussy is comfortably filled by a huge ${slave.vaginalAccessory}.`);
				if (dildo.length > 1) {
					r.push(`It noticeably bulges ${his} stomach.`);
				}
			}
			if (slave.chastityVagina) {
				r.push(`A chastity belt locks it securely in place.`);
			}
			break;
		default:
			if (slave.chastityVagina) {
				r.push(`${His} pussy is protected by a chastity`);
				if (App.Data.clothes.get(slave.clothes).exposure <= 3) {
					r.push(`belt worn under ${his} clothing.`);
				} else {
					r.push(`belt.`);
				}
			}
			break;
	}
	r.push(App.Desc.vaginalAttachment(slave));
	if (slave.chastityVagina && V.arcologies[0].FSRestart !== "unset") {
		r.push(`This pleases the Societal Elite.`);
	}

	return r.join(" ");
};

/**
 * @param {App.Entity.SlaveState} slave
 * @returns {string}
 */
App.Desc.vaginalAttachment = function(slave) {
	const r = [];
	const {
		his, He, His
	} = getPronouns(slave);
	switch (dildoVibeLevel(slave)) {
		case 2:
			// TODO: not sure about this description
			r.push(`${His} ${slave.vaginalAccessory} buzzes every so often, when prompted by the arcology's systems to train ${his} sexuality.`);
			if (slave.chastityVagina) {
				r.push(`The chastity belt locking it in place means there is no escape.`);
			}
			// TODO: add descriptions for slaves with gaping+ vaginas
			break;
		case 1:
			// TODO: not sure about this description
			r.push(`${He} looks distinctly uncomfortable as ${his} ${slave.vaginalAccessory} buzzes every so often.`);
			if (slave.chastityVagina) {
				r.push(`The chastity belt locking it in place means there is no escape.`);
			}
			// TODO: add descriptions for slaves with gaping+ vaginas
			break;
		case 0:
			r.push(`${His} current accessory is silent.`);
	}
	return r.join(" ");
};

repo_name: Pecanus/fc

license: mit


code:
/**
 * @param {App.Entity.SlaveState} slave
 * @param {string} surface
 * @returns {string} Slave's brand. Slave is the slave in question, but call the body part without modifiers. Rather than using "left breast" and "right breast" just use "breast". The function will then describe any brands on the breasts, if present, in natural language.
 */
App.Desc.brand = function(slave, surface) {
	"use strict";
	let r = ``;
	const {
		his, He, His
	} = getPronouns(slave);
	if (V.showBodyMods === 1) {
		if (surface === "extra") { // Make a sentence that describes all body parts that aren't explicitly described elsewhere in longSlave. If you brand a slave on her thumb, for instance. But why.
			const array = [];
			for (const bodyPart of Object.keys(App.Desc.extraMarks(slave, "brand"))) {
				const description = desc(bodyPart);
				if (description) {
					array.push(description);
				}
			}
			if (array.length === 0) {
				return r;
			} else if (array.length === 1) {
				r += `${He} also has a single unusual brand: `;
			} else {
				r += `${He} also has several unusual brands: `;
			}
			r += `${toSentence(array)}. `;
		} else if (surface) { /* describes a single branded body part */
			if (surface === "belly" && App.Data.misc.fakeBellies.includes(slave.bellyAccessory) && slave.brand.belly) {
				r += `${His} fake belly has the same brand, ${slave.brand.belly}, as ${his} real one. `;
			} else {
				const description = desc(surface);
				if (description !== "") {
					r += `${He} has ${description}. `;
				}
			}
		}
	}
	return r;

	/**
	 * @param {string} part
	 * @returns {string}
	 */
	function desc(part) {
		const surface = App.Desc.oppositeSides(part);
		const centerBrand = slave.brand[surface.center] ? pronounsForSlaveProp(slave, slave.brand[surface.center]) : undefined;
		const leftBrand = slave.brand[surface.left] ? pronounsForSlaveProp(slave, slave.brand[surface.left]) : undefined;
		const rightBrand = slave.brand[surface.right] ? pronounsForSlaveProp(slave, slave.brand[surface.right]) : undefined;
		if (centerBrand) { // center defined, body part has no mirror.
			return `${centerBrand} branded into the flesh of ${his} ${surface.center}`;
		} else { // Center not defined, body part has a mirror.
			if (!leftBrand && !rightBrand) {
				return ""; // no marks
			} else if (part.startsWith("right ") && leftBrand) {
				return ""; // we already described it on the left
			} else if (leftBrand === rightBrand) {
				// matching places and marks
				// note that the slave.brand object won't have slave.brand["upper armS"] with an S defined, just the left and right, so we just use the left since we know they match.
				return `${leftBrand} branded into the flesh of both ${his} ${surface.both}`;
			} else if (leftBrand && rightBrand) {
				// matching places but different marks
				return `both ${leftBrand} branded into the flesh of ${his} ${surface.left}, and ${rightBrand} branded into ${his} ${surface.right}`;
			} else if (leftBrand) {
				// left
				return `${leftBrand} branded into the flesh of ${his} ${surface.left}`;
			} else if (rightBrand) {
				// right
				return `${rightBrand} branded into the flesh of ${his} ${surface.right}`;
			}
		}
	}
};


code:
/**
 * @param {App.Entity.SlaveState} slave
 * @param {string} surface
 * @returns {string} Relevant slave tattoo, if present
 */
App.Desc.piercing = function(slave, surface) {
	"use strict";
	let r = [];
	const {
		he, him, his, himself, girl, He, His
	} = getPronouns(slave);
	if (V.showBodyMods !== 1) {
		return;
	} else if (slave.piercing[surface] && slave.piercing[surface].desc) {
		return `${pronounsForSlaveProp(slave, slave.piercing[surface].desc)}.`;
	}
	switch (surface) {
		case "ear": {
			if (slave.piercing.ear.weight > 0) {
				const clothing = App.Data.clothes.get(slave.clothes);
				if (slave.piercing.ear.weight === 1) {
					r.push(`${His} earlobes are conventionally pierced.`);
				} else {
					r.push(`${His} ears are heavily pierced, with multiple lobe piercings and a row of helix piercings.`);
				}
				if (slave.assignment === "get milked" || slave.assignment === "work in the dairy") {
					r.push(`${He} has a plastic livestock tag in one ear to help identify ${him} for milking.`);
				} else if (clothing && clothing.desc && "earPiercing" in clothing.desc) {
					r.push(clothing.desc.earPiercing(slave));
				} else {
					switch (slave.clothes) {
						case "attractive lingerie":
						case "attractive lingerie for a pregnant woman":
							r.push(`${He}'s wearing pretty, womanly earrings.`);
							break;
						case "a bra":
						case "a button-up shirt":
						case "a button-up shirt and panties":
						case "a sweater":
						case "a sweater and panties":
						case "a t-shirt":
						case "a t-shirt and jeans":
						case "a t-shirt and thong":
						case "a tank-top":
						case "a tank-top and panties":
						case "a thong":
						case "a tube top and thong":
						case "an oversized t-shirt":
						case "an oversized t-shirt and boyshorts":
						case "boyshorts":
						case "cutoffs":
						case "panties":
							r.push(`${He}'s wearing plain but pretty earrings.`);
							break;
						case "a nice pony outfit":
						case "a slutty pony outfit":
							r.push(`${He}'s wearing horseshoe shaped earrings.`);
							break;
						case "leather pants and pasties":
						case "leather pants":
						case "leather pants and a tube top":
						case "a tube top":
							r.push(`${He}'s wearing large hoop earrings.`);
							break;
						case "a gothic lolita dress":
							r.push(`${He}'s wearing black earrings.`);
							break;
						case "a sports bra":
						case "a one-piece swimsuit":
						case "sport shorts and a t-shirt":
						case "sport shorts and a sports bra":
						case "sport shorts":
							r.push(`${He}'s wearing cute, simple earrings.`);
							break;
						case "a skimpy loincloth":
							r.push(`${He}'s wearing a pair of bone earrings.`);
							break;
						case "a police uniform":
							r.push(`${He}'s wearing nightstick-shaped earrings.`);
							break;
						case "a succubus outfit":
							r.push(`${He}'s wearing pentagram earrings.`);
							break;
						case "a fallen nuns habit":
						case "a penitent nuns habit":
							r.push(`${His} earrings mimic tiny crowns of thorns.`);
							break;
						case "a chattel habit":
							r.push(`${He}'s wearing golden earrings in the shape of saintly nudes.`);
							break;
						case "a hijab and abaya":
						case "a niqab and abaya":
							r.push(`${He}'s wearing bronze earrings shaped like crescent moons.`);
							break;
						case "a klan robe":
						case "a slutty klan robe":
							r.push(`${He}'s wearing bronze earrings shaped like crucifixes.`);
							break;
						case "a long qipao":
						case "a slutty qipao":
							r.push(`${His} golden earrings resemble Eastern-style dragons.`);
							break;
						case "a string bikini":
						case "cutoffs and a t-shirt":
						case "a t-shirt and panties":
						case "panties and pasties":
						case "pasties":
						case "jeans":
						case "a sweater and cutoffs":
							r.push(`${He}'s wearing girly earrings.`);
							break;
						case "a schoolgirl outfit":
							r.push(`${He}'s wearing small girlish earrings.`);
							break;
						case "striped panties":
						case "a striped bra":
						case "striped underwear":
							r.push(`${He}'s wearing big girlish earrings.`);
							break;
						case "a burkini":
						case "a monokini":
							r.push(`${He}'s wearing unobtrusive little stud earrings.`);
							break;
						case "a Santa dress":
							r.push(`${His} earrings resemble little green pine trees.`);
							break;
						case "a mini dress":
						case "an apron":
						case "a hanbok":
							r.push(`${He}'s wearing shiny pearl earrings.`);
							break;
						case "a hijab and blouse":
						case "conservative clothing":
							r.push(`${He}'s wearing small unobtrusive hoop earrings.`);
							break;
						case "a cybersuit":
						case "a tight Imperial bodysuit":
						case "a scalemail bikini":
							r.push(`${He}'s wearing sharp and brutal-looking earrings.`);
							break;
						case "a kimono":
							r.push(`${He}'s wearing gorgeous enameled earrings made to look like tiny koi.`);
							break;
						case "a burqa":
							r.push(`${He}'s wearing cheap metal earrings with fake gems.`);
							break;
						case "a halter top dress":
						case "a ball gown":
						case "a maternity dress":
							r.push(`${He}'s wearing lovely diamond earrings; the stones are cut in an alluring, feminine style.`);
							break;
						case "slutty business attire":
							r.push(`${He}'s wearing lovely diamond earrings; the stones are cut in a gaudy, nouveau riche style.`);
							break;
						case "nice business attire":
							r.push(`${He}'s wearing lovely diamond earrings; the stones are cut in an assertive, unsubtle style.`);
							break;
						case "a slutty maid outfit":
							r.push(`${He}'s wearing big hoop earrings inappropriate for a real maid.`);
							break;
						case "a nice maid outfit":
							r.push(`${He}'s wearing conservative earrings like those a free maid could afford.`);
							break;
						case "harem gauze":
							r.push(`${He}'s wearing broad gold earrings in faux-Arabian style.`);
							break;
						case "overalls":
						case "Western clothing":
							r.push(`${He}'s wearing earrings in the shape of a sheriff's star.`);
							break;
						case "a huipil":
							r.push(`${He}'s wearing earrings in the shape of a stylized jaguar's head.`);
							break;
						case "a bunny outfit":
							r.push(`${He}'s wearing earrings in the shape of a stylized rabbit's head.`);
							break;
						case "kitty lingerie":
							r.push(`${He}'s wearing earrings in the shape of a stylized cat's head.`);
							break;
						case "a bimbo outfit":
							r.push(`${He}'s wearing large, heart-shaped earrings.`);
							break;
						case "a courtesan dress":
							r.push(`${He}'s wearing hanging earrings that accentuate each movement of ${his} head.`);
							break;
						case "slutty jewelry":
							r.push(`${He}'s wearing gold earrings in the shape of a pair of`);
							if (slave.dick > 0 && slave.balls === 0) {
								r.push(`limp dicks.`);
							} else if (slave.dick > 0) {
								r.push(`erect cocks.`);
							} else if (slave.skill.oral >= 100) {
								r.push(`tongues.`);
							} else if (slave.boobs > 1000) {
								r.push(`heavy breasts.`);
							} else {
								r.push(`female bottoms.`);
							}
							break;
					}
				}
			}
			break;
		}
		case "nose": {
			if (slave.piercing.nose.weight === 1) {
				r.push(`${He} has simple studs in ${his} nose.`);
			} else if (slave.piercing.nose.weight === 2) {
				r.push(`${He} has nasal studs and a large septum ring.`);
				if (slave.clothes === "slutty jewelry" && slave.piercing.ear.weight > 0) {
					r.push(`${His} bangles include a light chain from ${his} nose ring to ${his} ear piercings on one side.`);
				}
			}
			break;
		}
		case "eyebrow": {
			if (slave.piercing.eyebrow.weight === 1) {
				r.push(`${He} has a simple stud in one eyebrow.`);
			} else if (slave.piercing.eyebrow.weight === 2) {
				r.push(`${He} has multiple eyebrow rings.`);
			}
			break;
		}
		case "lips": {
			if (slave.piercing.lips.weight === 1) {
				r.push(`${He} has a simple lip piercing.`);
			} else if (slave.piercing.lips.weight === 2) {
				r.push(`${His} lips are heavily pierced.`);
			}
			break;
		}
		case "tongue": {
			if (slave.piercing.tongue.weight === 1) {
				r.push(`${His} tongue bears a single stud, so oral sex with ${him} is a bit more fun.`);
			} else if (slave.piercing.tongue.weight === 2) {
				r.push(`${His} tongue bears a row of studs, offering thorough stimulation to anyone ${he} blows.`);
			}
			if (slave.piercing.tongue.weight && SlaveStatsChecker.checkForLisp(slave)) {
				r.push(`The piercings make ${his} lisp more pronounced.`);
			}
			break;
		}
		case "nipple": {
			if (slave.piercing.nipple.weight > 0) {
				if (slave.fuckdoll > 0) {
					r.push(`${His} nipple piercings help secure the suit material to ${his} breasts.`);
				} else {
					if (slave.piercing.nipple.weight === 1) {
						r.push(`${His} ${nippleColor(slave)} nipples have a simple piercing, which keeps them a little harder than they would normally be.`);
					} else if (slave.piercing.nipple.weight === 2) {
						r.push(`${His} ${nippleColor(slave)} nipples are heavily pierced with several rings and studs, and there is a chain between them.`);
						if (slave.boobShape === "saggy" && slave.boobs > 2500) {
							r.push(`It's been shortened to take advantage of the way ${his} tits sag, and holds ${his} ${nippleColor(slave)} nipples almost together, producing cleavage that runs from ${his} ${nippleColor(slave)} nipples all the way up to ${his} sternum.`);
						} else {
							r.push(`The constant tugging keeps ${his} ${nippleColor(slave)} nipples erect.`);
						}
					}
					switch (slave.clothes) {
						case "kitty lingerie":
							r.push(`The piercings slightly distort the shape of ${his} lacy bra's cleavage window.`);
							break;
						case "attractive lingerie":
							r.push(`The piercings are a girly color, to complement ${his} lingerie.`);
							break;
						case "a succubus outfit":
							r.push(`The piercings are severe steel, as befits a sex demon.`);
							break;
						case "uncomfortable straps":
							r.push(`Each nipple bears a horizontal bar that is held forward of the steel ring that's part of ${his} outfit, constantly tugging them outward.`);
							break;
						case "restrictive latex":
							r.push(`The piercings are tantalizingly visible under the latex.`);
							break;
						case "a fallen nuns habit":
							r.push(`A tiny ebon cross on a short chain dangles from each piercing.`);
							break;
						case "a chattel habit":
							r.push(`A tiny golden cock and balls dangles from each piercing.`);
							break;
						case "a monokini":
							r.push(`Due to ${his} toplessness, the piercings are plainly visible.`);
							break;
						case "a cybersuit":
							r.push(`The piercings are tantalizingly visible under the bodysuit.`);
							break;
						case "a string bikini":
							r.push(`The piercings are a pastel color, to complement ${his} bikini.`);
							break;
						case "striped panties":
							r.push(`The piercings are a pastel color, to complement ${his} panties.`);
							break;
						case "a scalemail bikini":
							r.push(`The piercings are severe steel, as befits a hardened warrior.`);
							break;
						case "a schoolgirl outfit":
							if (slave.boobs <= 2000) {
								r.push(`The piercings are tantalizingly visible under the thin material.`);
							}
							break;
						case "battledress":
							r.push(`The piercings are tantalizingly visible under ${his} tank top.`);
							break;
						case "nice business attire":
							r.push(`One side of each piercing peeks over the edge of ${his} blouse.`);
							break;
						case "a comfortable bodysuit":
							r.push(`The piercings are tantalizingly visible under the tight bodysuit.`);
							break;
						case "a latex catsuit":
							r.push(`The piercings are tantalizingly visible under the tight latex catsuit.`);
							break;
						case "a mini dress":
							r.push(`The piercings are tantalizingly visible under the tight mini dress.`);
							break;
						case "a courtesan dress":
							r.push(`The piercings are tantalizingly visible through ${his} thin dress.`);
							break;
						case "a bimbo outfit":
							r.push(`They can't be seen, but one can clearly feel the piercings are in the shape of hearts.`);
							break;
						case "a slutty maid outfit":
							r.push(`One side of each piercing peeks over the edge of ${his} lacy top.`);
							break;
						case "harem gauze":
							r.push(`The piercings are tantalizingly visible under the gauze.`);
							break;
						case "attractive lingerie for a pregnant woman":
							r.push(`The piercings are tantalizingly visible under the thin silk.`);
							break;
						case "a maternity dress":
							r.push(`The piercings are tantalizingly visible under the dress's tight top.`);
							break;
						case "stretch pants and a crop-top":
							r.push(`The piercings are tantalizingly visible under ${his} crop-top.`);
							break;
					}
				}
			}

			break;
		}
		case "areola": {
			r.push(App.Desc.areolaPiercing(slave));
			break;
		}
		case "navel": {
			if (slave.fuckdoll === 0) {
				if (App.Data.misc.fakeBellies.includes(slave.bellyAccessory)) {
					if (slave.piercing.navel.weight === 1) {
						r.push(`${His} fake navel bears a simple stud.`);
					} else if (slave.piercing.navel.weight === 2) {
						r.push(`${His} fake navel is pierced with a big ring.`);
						if (slave.clothes === "slutty jewelry") {
							r.push(`It has a length of gilded chain dangling from it.`);
						} else {
							r.push(`It has a short length of chain dangling from it.`);
						}
					}
				} else {
					if (slave.piercing.navel.weight === 1) {
						r.push(`${His} navel bears a simple stud.`);
					} else if (slave.piercing.navel.weight === 2) {
						r.push(`${His} navel is pierced with a big ring.`);
						if (slave.clothes === "slutty jewelry") {
							r.push(`It has a length of gilded chain dangling from it.`);
						} else {
							r.push(`It has a short length of chain dangling from it.`);
						}
					}
				}
			} else {
				if (slave.piercing.navel.weight > 0) {
					if (slave.belly >= 10000) {
						if (slave.piercing.navel.weight === 1) {
							r.push(`${His} popped navel bears a simple stud.`);
						} else if (slave.piercing.navel.weight === 2) {
							r.push(`${His} popped navel is pierced with a big ring.`);
						}
						r.push(`It's eye-catching, since most of ${his} piercings are hidden by the suit.`);
					} else {
						r.push(`${His} navel piercing runs through the suit's material.`);
					}
				}
			}
			break;
		}
		case "clit":
		case "genitals": {
			if (slave.dick > 0) {
				if (slave.piercing.genitals.weight === 1) {
					r.push(`${He} has a simple dickhead stud.`);
				} else if (slave.piercing.genitals.weight === 2) {
					r.push(`${He} has a big ring in ${his} dickhead.`);
					if (slave.clothes === "slutty jewelry") {
						r.push(`Since ${he}'s wearing slutty bangles ${he} has a short length of light chain dangling from ${his} dickhead piercing; as ${he} moves it tugs lightly at ${his} cock.`);
					}
				}
			} else if (slave.vagina === -1) { // God help us, nulls.
				if (slave.piercing.genitals.weight === 1) {
					r.push(`${He} has a simple stud in the smooth ${slave.skin} skin above ${his} urethra.`);
				} else if (slave.piercing.genitals.weight === 2) {
					r.push(`${He} has a big ring in the smooth ${slave.skin} skin above ${his} urethra.`);
					if (slave.clothes === "slutty jewelry") {
						r.push(`Since ${he}'s wearing slutty bangles ${he} has a short length of light chain dangling from the ring; it constantly stimulates what remains of ${his} sexual nerves.`);
					}
				}
			} else {
				if (slave.piercing.genitals.weight === 1) {
					r.push(`${He} has a simple clitoral stud.`);
				} else if (slave.piercing.genitals.weight === 2) {
					r.push(`${He} has a big ring in ${his} clit.`);
					if (slave.clothes === "slutty jewelry") {
						r.push(`Since ${he}'s wearing slutty bangles ${he} has a short length of light chain dangling from ${his} clit ring; it constantly stimulates ${his} pussylips.`);
					}
				}
			}

			if (slave.piercing.genitals.smart) {
				r.push(`It is upgraded with smart vibe technology.`);
			}

			if (slave.fuckdoll > 0) {
				r.push(`It anchors the suit's material.`);
			}
			break;
		}
		case "vagina": {
			if (slave.piercing.vagina.weight > 0) {
				r.push(`${He} has a`);
				if (slave.piercing.vagina.weight === 1) {
					r.push(`simple row of studs`);
				} else {
					r.push(`row of big rings`);
				}
				r.push(`down ${his}`);
				if (slave.fuckdoll > 0) {
					r.push(`labia, which are looped into the edge of the suit's material as it stops around ${his} vulva.`);
				} else {
					r.push(`labia.`);
				}
			}
			break;
		}
		case "dick": {
			if (slave.piercing.dick.weight === 1) {
				r.push(`${He} has a row of studs down ${his} shaft.`);
			} else if (slave.piercing.dick.weight === 2) {
				r.push(`${He} has a row of heavy rings down ${his} shaft.`);
			}
			if (slave.scrotum !== 0) {
				if (slave.piercing.dick.weight === 1) {
					r.push(`${He} has a couple of studs in ${his} ballsack.`);
				} else if (slave.piercing.dick.weight === 2) {
					r.push(`${He} has a row of rings down the center of ${his} ballsack, all the way from the base of ${his} shaft to ${his} perineum.`);
				}
			} else {
				if (slave.piercing.dick.weight === 1) {
					r.push(`${He} has a couple of studs beneath the base of ${his} dick.`);
				} else if (slave.piercing.dick.weight === 2) {
					r.push(`${He} has a row of rings all the way from the base of ${his} shaft to ${his} perineum.`);
				}
			}
			if (slave.fuckdoll > 0) {
				if (slave.piercing.dick.weight > 0) {
					r.push(`Every one of them runs through the suit's material, securing it to the Fuckdoll's member.`);
				}
			}
			break;
		}
		case "anus": {
			if (slave.vagina > -1) {
				if (slave.piercing.anus.weight === 1) {
					r.push(`${He} has a simple piercing between ${his} pussy and ${his}`);
					if (slave.fuckdoll > 0) {
						r.push(`asshole which helps keep the strip of material`);
						if (slave.vagina > -1) {
							r.push(`between ${his} holes`);
						} else {
							r.push(`below ${his} rear hole`);
						}
						r.push(`in place.`);
					} else {
						r.push(`asshole.`);
					}
				} else if (slave.piercing.anus.weight === 2) {
					r.push(`${He} has a big ring between ${his} pussy and ${his} asshole,`);
					if (slave.fuckdoll > 0) {
						r.push(`which helps keep the strip of material`);
						if (slave.vagina > -1) {
							r.push(`between ${his} holes`);
						} else {
							r.push(`below ${his} rear hole`);
						}
						r.push(`in place,`);
					}
					r.push(`and studs all around ${his} anus.`);
				}
			} else {
				if (slave.piercing.anus.weight === 1) {
					r.push(`${He} has a simple perianal piercing between the base of ${his} dick and ${his} girly`);
					if (slave.fuckdoll > 0) {
						r.push(`butthole which helps keep the strip of material`);
						if (slave.vagina > -1) {
							r.push(`between ${his} holes`);
						} else {
							r.push(`below ${his} rear hole`);
						}
						r.push(`in place.`);
					} else {
						r.push(`butthole.`);
					}
				} else if (slave.piercing.anus.weight === 2) {
					r.push(`${He} has a big ring between the base of ${his} dick and ${his} girly butthole, which has studs all around it.`);
				}
			}
			break;
		}
		case "corset": { // non anatomical
			if (slave.piercing.corset.weight > 0) {
				if (slave.fuckdoll === 0) {
					r.push(`${He} has a corset piercing, a ladder of steel rings running up each side of ${his} back:`);
					if (slave.bellyAccessory === "a corset" || slave.bellyAccessory === "an extreme corset") {
						r.push(`these are looped through special lugs in the back of ${his} actual corset, making it almost a part of ${his} body.`);
						if (slave.devotion > 50) {
							r.push(`${He} couldn't remove it, even if ${he} wanted to.`);
						} else if (slave.devotion >= -20) {
							r.push(`${He} couldn't remove it, even if ${he} were inclined to try.`);
						} else {
							r.push(`Any attempt to remove it will cause intense pain.`);
						}
					} else {
						const clothing = App.Data.clothes.get(slave.clothes);
						if (clothing && clothing.desc && "corsetPiercing" in clothing.desc) {
							r.push(clothing.desc.corsetPiercing(slave));
						} else {
							switch (slave.clothes) {
								case "a hijab and blouse":
								case "a schoolgirl outfit":
								case "conservative clothing":
								case "nice business attire":
								case "slutty business attire":
									r.push(`${his} blouse hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "chains":
									r.push(`they're laced together with steel cable, tightly enough that they're tugging at ${his} skin.`);
									break;
								case "Western clothing":
									r.push(`${his} shirt hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a toga":
									r.push(`${his} toga hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a huipil":
									r.push(`${his} huipil hides them partially, so the leather straps that pull on ${his} skin are clearly evident.`);
									break;
								case "a long qipao":
								case "a slutty qipao":
									r.push(`${his} qipao hides them completely, but they're laced tightly with silk cord, so ${he}'s aware they're there.`);
									break;
								case "uncomfortable straps":
									r.push(`they're laced together with a leather cord, tightly enough that they're tugging at ${his} skin.`);
									break;
								case "shibari ropes":
									r.push(`they're laced together as part of ${his} bindings.`);
									break;
								case "a latex catsuit":
								case "restrictive latex":
									r.push(`these are clipped into the latex covering them, making it almost a part of ${his} body.`);
									if (slave.devotion > 50) {
										r.push(`${He} couldn't remove it, even if ${he} wanted to.`);
									} else if (slave.devotion >= -20) {
										r.push(`${He} couldn't remove it, even if ${he} were inclined to try.`);
									} else {
										r.push(`Any attempt to remove it will cause intense pain.`);
									}
									break;
								case "a military uniform":
									r.push(`${his} tunic hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a schutzstaffel uniform":
									r.push(`${his} tunic hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a slutty schutzstaffel uniform":
									r.push(`${his} tunic hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a red army uniform":
									r.push(`${his} tunic hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "battlearmor":
									r.push(`${his} armor hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "Imperial Plate":
									r.push(`${his} ultra-heavy armor hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a dirndl":
									r.push(`${his} dress hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "lederhosen":
									r.push(`${his} tunic hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a mounty outfit":
									r.push(`${his} tunic hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a biyelgee costume":
									r.push(`${his} dress hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a nice nurse outfit":
									r.push(`${his} scrubs hide them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a mini dress":
									r.push(`these are clipped into the mini dress covering them, making it almost a part of ${his} body.`);
									if (slave.devotion > 50) {
										r.push(`${He} couldn't remove it, even if ${he} wanted to.`);
									} else if (slave.devotion >= -20) {
										r.push(`${He} couldn't remove it, even if ${he} were inclined to try.`);
									} else {
										r.push(`Any attempt to remove it will cause intense pain.`);
									}
									break;
								case "attractive lingerie":
								case "attractive lingerie for a pregnant woman":
								case "kitty lingerie":
									r.push(`they're laced together with a lacy ribbon finished off with a bow.`);
									break;
								case "a succubus outfit":
									r.push(`they're laced into ${his} succubus corset, making it a part of ${him}.`);
									break;
								case "a fallen nuns habit":
									r.push(`they're laced together with cord, tightly enough that ${he} is forced to arch ${his} back or suffer. ${He} spends most of ${his} time involuntarily presenting ${his} bottom to relieve the tugging.`);
									break;
								case "a chattel habit":
									r.push(`${his} white habit hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a penitent nuns habit":
									r.push(`${his} habit hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a gothic lolita dress":
								case "a hanbok":
								case "a Santa dress":
									r.push(`${his} dress hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a burkini":
								case "a one-piece swimsuit":
									r.push(`${his} swimsuit hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a monokini":
									r.push(`the straps of ${his} swimsuit run on each side of these loops.`);
									break;
								case "an apron":
									r.push(`the straps of ${his} apron run on each side of these loops.`);
									break;
								case "overalls":
									r.push(`the straps of ${his} overalls run on each side of these loops.`);
									break;
								case "a bra":
								case "a skimpy loincloth":
								case "a striped bra":
								case "a thong":
								case "boyshorts":
								case "cutoffs":
								case "jeans":
								case "leather pants":
								case "leather pants and pasties":
								case "panties":
								case "panties and pasties":
								case "pasties":
								case "sport shorts":
								case "striped panties":
								case "striped underwear":
									r.push(`the piercings are plainly visible on ${his} bare back.`);
									break;
								case "a slutty klan robe":
								case "a slutty pony outfit":
								case "a sports bra":
								case "a tank-top and panties":
								case "a tube top":
								case "a tube top and thong":
								case "leather pants and a tube top":
									r.push(`the piercings are only partly visible on ${his} back.`);
									break;
								case "a button-up shirt":
								case "a button-up shirt and panties":
								case "a police uniform":
								case "a t-shirt and jeans":
								case "a t-shirt and panties":
								case "a t-shirt and thong":
								case "a t-shirt":
								case "a tank-top":
								case "an oversized t-shirt and boyshorts":
								case "an oversized t-shirt":
								case "sport shorts and a sports bra":
								case "sport shorts and a t-shirt":
									r.push(`${his} shirt hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a sweater":
								case "a sweater and cutoffs":
								case "a sweater and panties":
									r.push(`${his} sweater hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a nice pony outfit":
									r.push(`${his} outfit hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a string bikini":
									r.push(`the back of ${his} string top loops into them and runs down through them to become ${his} bottom, such as it is.`);
									break;
								case "a scalemail bikini":
									r.push(`they're laced together with a steel chain.`);
									break;
								case "a cheerleader outfit":
									r.push(`they're laced together with a simple ribbon, but the effect makes it clear that this is one kinky cheerleader.`);
									break;
								case "clubslut netting":
									r.push(`these are clipped into the netting covering them, making it almost a part of ${his} body.`);
									if (slave.devotion > 50) {
										r.push(`${He} couldn't remove it, even if ${he} wanted to.`);
									} else if (slave.devotion >= -20) {
										r.push(`${He} couldn't remove it, even if ${he} were inclined to try.`);
									} else {
										r.push(`Any attempt to remove it will cause intense pain.`);
									}
									break;
								case "cutoffs and a t-shirt":
									r.push(`they're laced together with a simple ribbon, but the effect makes it clear that this is one kinky ${girl}.`);
									break;
								case "a slutty outfit":
									r.push(`they're laced together with a simple ribbon, tightly enough that ${he}'s aware they're there.`);
									break;
								case "a comfortable bodysuit":
									r.push(`these are clipped into the bodysuit covering them, making it almost a part of ${his} body.`);
									if (slave.devotion > 50) {
										r.push(`${He} couldn't remove it, even if ${he} wanted to.`);
									} else if (slave.devotion >= -20) {
										r.push(`${He} couldn't remove it, even if ${he} were inclined to try.`);
									} else {
										r.push(`Any attempt to remove it will cause intense pain.`);
									}
									break;
								case "a leotard":
									r.push(`these are clipped into the leotard covering them, making it almost a part of ${his} body.`);
									if (slave.devotion > 50) {
										r.push(`${He} couldn't remove it, even if ${he} wanted to.`);
									} else if (slave.devotion >= -20) {
										r.push(`${He} couldn't remove it, even if ${he} were inclined to try.`);
									} else {
										r.push(`Any attempt to remove it will cause intense pain.`);
									}
									break;
								case "a bunny outfit":
									r.push(`${his} teddy hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a slutty maid outfit":
									r.push(`${his} dress has an open back to reveal them and the black ribbon that laces them tightly together.`);
									break;
								case "a nice maid outfit":
									r.push(`${his} dress hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a slutty nurse outfit":
									r.push(`${his} jacket hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a kimono":
									r.push(`${his} kimono hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a hijab and abaya":
								case "a niqab and abaya":
									r.push(`${his} abaya hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a klan robe":
									r.push(`${his} robe hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "a burqa":
									r.push(`${his} burqa hides them completely, but they're laced tightly, so ${he}'s aware they're there.`);
									break;
								case "battledress":
									r.push(`they're laced together with paracord.`);
									break;
								case "harem gauze":
									r.push(`they're laced up with a light golden chain that glints through ${his} filmy clothing.`);
									break;
								case "slutty jewelry":
									r.push(`they're laced up with a light golden chain that begins and ends in other parts of ${his} glinting bonds.`);
									break;
								case "a courtesan dress":
									r.push(`they're laced into ${his} dress's corset, binding the material even closer to ${him}.`);
									break;
								case "a bimbo outfit":
									r.push(`they're laced together with a bright pink ribbon.`);
									break;
								default:
									r.push(`they're laced up with a ribbon, tightly enough to keep ${him} aware they're there.`);
							}
						}
					}
				}
			}
			break;
		}
		case "chastity": { // non anatomical
			if (slave.piercing.genitals.weight > 0
				&& slave.piercing.nipple.weight > 0
				&& !(slave.chastityPenis)
				&& slave.dick > 4
				&& slave.boobs > 1000
				&& canAchieveErection(slave)
				&& slave.balls > 0
				&& slave.devotion > 20
				&& slave.energy > 90) {
				r.push(`${His} very special body allows ${him} to wear an incredibly lewd piece of jewelry: a thin golden chain that runs from nipple to nipple, through ${his} pierced cockhead. The chain is short, and any motion at all tugs at ${his} nipples and penis.`);
				if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive" && hasBothLegs(slave))) {
					r.push(`The stimulation is almost unbearable, and the mere act of walking sometimes causes ${him} to cum.`);
				} else if (canMove(slave)) {
					r.push(`The stimulation is almost unbearable, as any effort to move ${himself} starts building up an orgasm.`);
				}
			}
			break;
		}
	}
	return r.join(" ");
};


code:
/**
 * @param {App.Entity.SlaveState} slave
 * @param {string|object} surface
 * @returns {string} Slave's scar. Slave is the slave in question, but call the body part without modifiers. Rather than using "left breast" and "right breast" just use "breast". The function will then describe any scars on the breasts, if present, in natural language.
 */
App.Desc.scar = function(slave, surface) {
	"use strict";
	let r = [];
	const bellyAccessory = slave.bellyAccessory;
	const {
		him, his, He, His
	} = getPronouns(slave);
	if (V.showBodyMods === 1) {
		if (surface === "extra") { // Make a sentence that describes all body parts that aren't explicitly described elsewhere in longSlave. If you scar a slave on her thumb, for instance. But why.
			let extraMarks = App.Desc.extraMarks(slave, "scar");
			extraMarks = Object.keys(extraMarks);
			let length = extraMarks.length;
			if (length === 0) {
				return "";
			} else if (length === 1) {
				r.push(`${He} also has a single unusual scar:`);
			} else {
				r.push(`${He} also has several unusual scars:`);
			}
			const scarPhrases = [];
			for (const bodyPart of extraMarks) {
				const t = [];
				surface = App.Desc.oppositeSides(bodyPart);
				if (slave.scar[surface.center]) { // center defined, body part has no mirror.
					t.push(`${App.Desc.expandScarString(slave, surface.center)} on ${his} ${surface.center}`);
				} else { // Center not defined, body part has a mirror.
					let left = App.Desc.expandScarString(slave, surface.left);
					let right = App.Desc.expandScarString(slave, surface.right);
					if (!slave.scar[surface.left] && !slave.scar[surface.right]) {
						// no marks
					} else if (bodyPart.startsWith("right ") && slave.scar[surface.left]) {
						// we already described it on the left
					} else if (left === right) {
						// matching places and marks
						// note that the slave.scar object won't have slave.scar["upper armS"] with an S defined, just the left and right, so we just use the left since we know they match.
						t.push(`${left} on both ${his} ${surface.both}`);
					} else if (slave.scar[surface.left] && slave.scar[surface.right]) {
						// matching places but different marks
						t.push(`both ${left} on ${his} ${surface.left}, and ${right} scared into ${his} ${surface.right}`);
					} else if (slave.scar[surface.left]) {
						// left
						t.push(`${left} on ${his} ${surface.left}`);
					} else if (slave.scar[surface.right]) {
						// right
						t.push(`${right} on ${his} ${surface.right}`);
					}
				}
				scarPhrases.push(t.join(" "));
			}
			if (scarPhrases.length > 0) {
				r.push(`${toSentence(scarPhrases)}.`);
			}
		} else if (surface) { /* describes a single scarred body part */
			surface = App.Desc.oppositeSides(surface);
			if (surface.center === "belly" && App.Data.misc.fakeBellies.includes(bellyAccessory) && slave.scar.hasOwnProperty("belly")) {
				r.push(`${His} fake belly has the same scar, ${App.Desc.expandScarString(slave, surface.center)}, as ${his} real one.`);
			} else {
				if (slave.scar[surface.center]) { // center defined, body part has no mirror.
					r.push(`${He} has ${App.Desc.expandScarString(slave, surface.center)} on ${his} ${surface.center}.`);
				} else { // Center not defined, body part has a mirror.
					let left = App.Desc.expandScarString(slave, surface.left);
					let right = App.Desc.expandScarString(slave, surface.right);
					if (!slave.scar[surface.left] && !slave.scar[surface.right]) {
						// no marks
					} else if (left === right) {
						// matching places and marks
						// note that the slave.scar object won't have slave.scar["upper armS"] with an S defined, just the left and right, so we just use the left since we know they match.
						r.push(`${He} has ${left} on both ${his} ${surface.both}.`);
					} else if (slave.scar[surface.left] && slave.scar[surface.right]) {
						// matching places but different marks
						r.push(`${He} has both ${left} on ${his} ${surface.left}, and ${right} scared into ${his} ${surface.right}.`);
					} else if (slave.scar[surface.left]) {
						// left
						r.push(`${He} has ${left} on ${his} ${surface.left}.`);
					} else if (right) {
						// right
						r.push(`${He} has ${right} on ${his} ${surface.right}.`);
					}
				}
			}
		} else { /* describes all scarred body parts */
			for (let [key, value] of Object.entries(slave.scar)) {
				if (r.length === 0) {
					r.push(`${He} has`);
				}
				if (key === "belly" && App.Data.misc.fakeBellies.includes(bellyAccessory) && slave.scar.hasOwnProperty("belly")) {
					r.push(`${value} scared on both ${his} real belly and ${his} fake one,`);
				} else {
					r.push(`${value} on ${his} ${key},`);
				}
			}
			if (r.length !== 0) {
				r.push(`marking ${him} as yours.`);
			} else {
				r.push(`${His} body is unmarked by scars.`);
			}
		}
	}
	return r.join(" ");
};

/**
 * @param {App.Entity.SlaveState} slave
 * @param {string} surface
 * @returns {string} Slave's scar. Slave is the slave in question, but call the body part without modifiers. Rather than using "left breast" and "right breast" just use "breast". The function will then describe any scars on the breasts, if present, in natural language.
 */
App.Desc.expandScarString = function(slave, surface) { // scars can sometimes be an int. This function generates a reasonable description. It can later be expanded to apply to different body parts, or include features of the slave such as skin tone or weight
	if (!slave.scar[surface]) {
		return "";
	}
	let r;
	const {he, his} = getPronouns(slave);
	const bodypart = Object.keys(slave.scar[surface]);
	const scarPhrases = [];
	for (const kind of bodypart) {
		let scar = slave.scar[surface][kind];
		r = [];
		if (scar === 0) {
			continue;
		}
		switch (kind) {
			case "generic":
				r.push("a generic scar");
				break;
			case "whip":
				if (["back"].includes(surface)) {
					r.push("a");
					if (scar > 2) {
						r.push("deeply scored");
					}
					if (scar > 1) {
						r.push("network of welts like a map of hell");
					} else {
						r.push("record of being beaten");
					}
				} else if (["left breast", "right breast", "left buttock", "right buttock"].includes(surface)) {
					if (scar > 2) {
						r.push("thick");
					} else {
						r.push("thin");
					}
					r.push("raised lines from a whip tracing the curves");
				} else if (["left upper arm", "right upper arm"].includes(surface)) {
					r.push(`rough edges where a whip abused ${his} skin`);
				} else {
					if (scar > 2) {
						r.push("frightening");
					} else if (scar > 1) {
						r.push("serious");
					}
					r.push("whip scars");
				}
				break;
			case "chain":
				if (["left wrist", "right wrist", "left ankle", "right ankle"].includes(surface)) {
					if (scar > 1) {
						r.push("scars from heavy manacles");
					} else {
						r.push("scars from manacles");
					}
				} else {
					if (scar > 1) {
						r.push("scars from heavy chains");
					} else {
						r.push("scars from chains");
					}
				}
				break;
			case "burn":
				if (scar > 2) {
					r.push("frightening");
				} else if (scar > 1) {
					r.push("serious");
				}
				r.push("burn scars");
				break;
			case "menacing":
				r.push("a menacing scar");
				break;
			case "exotic":
				r.push("an exotic scar");
				break;
			case "surgical":
				if (surface === "left breast" || surface === "right breast") {
					implantScars(slave.boobsImplant === 0, scar);
				} else if (surface === "left buttock" || surface === "right buttock") {
					implantScars(slave.buttImplant === 0, scar);
				} else if (surface === "belly") {
					r.push("scars from");
					if (scar > 1) {
						r.push("a crazy network of scars, as though a hack had tried internal surgery");
					} else {
						r.push("some faint scarring as though from internal surgery");
					}
				} else {
					r.push("a");
					if (scar > 1) {
						r.push("pronounced");
					} else {
						r.push("faint");
					}
					r.push("surgical scar");
				}
				break;
			case "c-section":
				r.push("an");
				if (scar > 1) {
					r.push("especially");
				}
				r.push("unsightly c-section scar");
				break;
			case "cutting":
				if (["left wrist", "right wrist", "neck"].includes(surface)) {
					r.push(`some scars as though ${he} attempted self harm`);
				} else {
					r.push("some cuts as though from a razor");
				}
				break;
			default:
				if (scar > 2) {
					r.push(`serious ${kind}`);
				} else if (scar) {
					r.push(kind);
				}
				break;
		}
		scarPhrases.push(r.join(" "));
	}
	return toSentence(scarPhrases);

	/**
	 * @param {boolean} removed if true, scars come from removal, otherwise from implantation
	 * @param {number} scar
	 */
	function implantScars(removed, scar) {
		if (removed) {
			r.push("scars from");
			if (scar > 3) {
				r.push("horribly botched");
			} else if (scar > 2) {
				r.push("sloppily done");
			} else if (scar > 1) {
				r.push("carelessly done");
			}
			r.push("surgery to remove implants");
		} else {
			r.push("scars from");
			if (scar > 3) {
				r.push("horribly botched");
			} else if (scar > 2) {
				r.push("sloppily inserted");
			} else if (scar > 1) {
				r.push("carelessly inserted");
			}
			r.push("implants");
		}
	}
};