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

	const averageHeight = Height.mean(PC);

	r.push(
		age(),
		height(),
		`and`,
		weight(),
		muscles(),
		overweight(),
		raceChange(),
		shoulders(),
		limbs(),
		heightImplant()
	);

	return r.join(" ");

	function age() {
		const r = [];
		let ageDifference = '';

		if (PC.actualAge >= 65) {
			if (PC.visualAge > PC.actualAge) {
				ageDifference = `You've taken measures to <span class="lime">look an older ${PC.visualAge},</span> though perhaps it might be time to undo it.`;
			} else if (PC.visualAge < PC.actualAge) {
				ageDifference = `You've taken measures to <span class="lime">look a younger ${PC.visualAge}.</span> If only your body agreed with your looks.`;
			}
			r.push(`You're <span class="orange">${PC.actualAge}</span> and definitely feeling it.`, ageDifference);
		} else if (PC.actualAge >= 50) {
			if (PC.visualAge > PC.actualAge) {
				ageDifference = `You've taken measures to <span class="lime">look an older ${PC.visualAge}.</span>`;
			} else if (PC.visualAge < PC.actualAge) {
				ageDifference = `You've taken measures to <span class="lime">look a younger ${PC.visualAge}.</span>`;
			}
			r.push(`You're <span class="orange">${PC.actualAge}</span> and starting to feel it.`, ageDifference);
		} else if (PC.actualAge >= 35) {
			if (PC.visualAge > PC.actualAge) {
				ageDifference = `You've taken measures to <span class="lime">look an older ${PC.visualAge}</span> and reap the respect that comes with it.`;
			} else if (PC.visualAge < PC.actualAge) {
				ageDifference = `You've taken measures to <span class="lime">look a younger ${PC.visualAge},</span> recapturing your youth.`;
			}
			r.push(`You're <span class="orange">${PC.actualAge}</span> and strong.`, ageDifference);
		} else if (PC.actualAge >= 18) {
			if (PC.visualAge > PC.actualAge) {
				ageDifference = `You've taken measures to <span class="lime">look an older ${PC.visualAge}</span> and reap the respect that comes with it.`;
			} else if (PC.visualAge < PC.actualAge) {
				ageDifference = `You've taken measures to look a younger ${PC.visualAge}, ${PC.visualAge < V.minimumSlaveAge ? "even though society may find your looks uncomfortable" : "since it's never too early to preserve your youth"}.`;
			}
			r.push(`You're <span class="orange">${PC.actualAge}</span> and full of vigor.`, ageDifference);
		} else if (PC.actualAge >= V.minimumSlaveAge) {
			if (PC.visualAge > PC.actualAge) {
				ageDifference = `You've taken measures to <span class="lime">look an older ${PC.visualAge},</span> though it can only do so much given your physique.`;
			} else if (PC.visualAge < PC.actualAge) {
				ageDifference = `You've taken measures to look a younger ${PC.visualAge}, ${PC.visualAge < V.minimumSlaveAge ? "even though society may find your looks uncomfortable" : "since it's never too early to preserve your youth"}.`;
			}
			r.push(`You're <span class="orange">${PC.actualAge}</span> and full of vigor.`, ageDifference);
		} else {
			if (PC.visualAge > PC.actualAge) {
				ageDifference = `You've taken measures to look an older ${PC.visualAge}, ${PC.visualAge >= V.minimumSlaveAge ? "which may be upsetting to potential partners when they discover how old you are" : "though it can only do so much given your physique"}.`;
			} else if (PC.visualAge < PC.actualAge) {
				ageDifference = `You've taken measures to <span class="lime">look a younger ${PC.visualAge},</span> which will likely be disturbing to any partners you might take.`;
			}
			r.push(`You're <span class="orange">${PC.actualAge}</span> and full of vigor, if still underage by society's standards.`, ageDifference);
		}
		if (V.playerAging) {
			r.push(`Your birthday is ${PC.birthWeek === 51 ? `next week` : `in ${52 - PC.birthWeek} weeks`}.`);
		}
		return r.join(" ");
	}

	function height() {
		const r = [];
		const age = PC.physicalAge < 16 ? ` for your age` : ``;

		r.push(`You're`);
		if (PC.height <= (averageHeight + 5) && PC.height >= (averageHeight - 5)) {
			r.push(`an average height${age}`);
		} else if (PC.height < (averageHeight - 15)) {
			r.push(`petite${age}`);
		} else if (PC.height < (averageHeight - 5)) {
			r.push(`short${age}`);
		} else if (PC.height > (averageHeight + 15)) {
			r.push(`very tall${age}`);
		} else if (PC.height > (averageHeight + 5)) {
			r.push(`tall${age}`);
		}
		if (V.showHeightCMs === 1) {
			r.push(`at ${heightToEitherUnit(PC.height)},`);
		}
		return r.join(" ");
	}

	function weight() {
		const r = [];

		if (PC.weight > 190) {
			r.push(`<span class="red">extremely obese.</span>`);
		} else if (PC.weight > 160) {
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				r.push(`attractively heavyset, though it may be getting to be a bit much.`);
			} else {
				r.push(`<span class="red">have let yourself go; you are much too overweight.</span>`);
			}
		} else if (PC.weight > 130) {
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				r.push(`coated in thick layers of pleasantly soft flesh.`);
			} else {
				r.push(`very fat.`);
			}
		} else if (PC.weight > 95) {
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				r.push(`coated in a layer of pleasantly soft flesh.`);
			} else if (PC.hips > 1) {
				r.push(`extremely curvy, if a bit on the heavy side, given the way your excess fat rests on your hips.`);
			} else {
				r.push(`carrying a lot of extra weight.`);
			}
		} else if (PC.weight > 30) {
			if (PC.hips > 1) {
				r.push(`quite curvy, given the way your fat rests on your hips.`);
			} else {
				r.push(`rather chubby.`);
			}
		} else if (PC.weight > 10) {
			r.push(`a little soft around the middle.`);
		} else if (PC.weight >= -10) {
			r.push(`a healthy weight.`);
		} else if (PC.weight >= -30) {
			r.push(`pleasingly thin.`);
		} else if (PC.weight >= -95) {
			if (PC.hips > 1) {
				r.push(`very thin, though your wide hips give you a very alluring thigh gap.`);
			} else if (PC.hips < -1) {
				r.push(`very thin, but your trim hips give you a model's build.`);
			} else {
				r.push(`rail thin.`);
			}
		} else {
			r.push(`<span class="red">dangerously underweight.</span>`);
		}

		return r.join(" ");
	}

	function muscles() {
		const r = [];

		if (PC.muscles > 95) {
			if (PC.weight > 95) {
				r.push(`Beneath that layer of fat, you are <span class="pink">extremely muscular,</span> though it's hard to tell at a glance.`);
			} else {
				r.push(`You are <span class="pink">extremely muscular,</span> with defined pecs, powerful glutes, and massive traps.`);
			}
		} else if (PC.muscles > 50) {
			if (PC.weight > 95) {
				r.push(`Beneath that layer of fat, you are <span class="pink">quite muscular,</span> though it's hard to tell.`);
			} else {
				r.push(`You are <span class="pink">quite muscular,</span> with ripped abs, strong shoulders, and defined lats.`);
			}
		} else if (PC.muscles > 30) {
			if (PC.weight > 95) {
				r.push(`Beneath that layer of fat, you are <span class="pink">well built,</span> with strong muscles.`);
			} else {
				r.push(`You are <span class="pink">well built,</span> with defined abs and strong, shapely muscles.`);
			}
		} else if (PC.muscles > 5) {
			if (PC.weight > 30) {
				r.push(`Beneath that layer of fat, you are <span class="pink">well built,</span> with toned muscles.`);
			} else {
				r.push(`You are <span class="pink">toned,</span> with just-visible musculature.`);
			}
		} else if (PC.muscles > -6) {
			r.push(`You lack any clear musculature, so bulking up a little would probably be a good move.`);
		} else if (PC.muscles > -31) {
			r.push(`You are <span class="red">rather weak,</span> with barely any muscles; a risk given your profession`);
		} else if (PC.muscles > -96) {
			r.push(`You are <span class="red">very weak</span> and struggle with day-to-day tasks; a serious risk given your profession.`);
		} else {
			r.push(`You are <span class="red">physically frail</span> and have difficulty lifting things, yourself included.`);
		}
		if (PC.muscles > 95 && PC.height <= (averageHeight + 10)) {
			r.push(`Your body is a bit too small to handle such impressive gains, limiting your flexibility.`);
		}

		return r.join(" ");
	}

	function overweight() {
		const r = [];

		if (tooFatSlave(PC)) {
			r.push(`You've become so large you can no longer support your own weight and are bedbound by it.`);
		} else if ((PC.weight > (170 + (PC.muscles / 5)) && PC.physicalAge >= 18) ||
			(PC.weight > (110 + (PC.muscles / 20)) && PC.physicalAge <= 3) ||
			(PC.weight > (140 + (PC.muscles / 15)) && PC.physicalAge <= 12) ||
			(PC.weight > (165 + (PC.muscles / 10)) && PC.physicalAge < 18)) {
			r.push(`You are so fat that it makes it moving around difficult.`);
			if (canWalk(PC)) {
				if (PC.muscles > 95) {
					r.push(`However, you're so powerfully built that you can do it with effort, though you're out of breath just standing here.`);
				} else if (PC.muscles > 30) {
					r.push(`You're strong enough to get to your feet, but given you're currently leaning against a chair to take some of the load off, that may not be for much longer.`);
				} else  {
					r.push(`It takes a lot to get on your feet, so you try to avoid that if possible.`);
				}
			}
		} else if (PC.weight >= 130 || (PC.weight >= 95 + ((PC.physicalAge - 9) * 5))) {
			r.push(`You sufficiently fat enough to find that you can't do everything you used to be able to and that even little actions take more effort than they should.`);
		}
		return r.join(" ");
	}

	function shoulders() {
		const r = [];

		if (PC.shoulders < -1) {
			r.push(`Your shoulders and chest are very narrow and feminine.`);
		} else if (PC.shoulders < 0) {
			r.push(`You have a narrow chest and shoulders, giving you a feminine appearance.`);
		} else if (PC.shoulders > 1) {
			r.push(`You have broad, manly shoulders.`);
		} else if (PC.shoulders > 0) {
			r.push(`You have fairly broad shoulders, giving you a masculine appearance.`);
		}

		return r.join(" ");
	}

	function raceChange() {
		const r = [];

		if (PC.race !== PC.origRace) {
			r.push(`To the trained eye, it is possible to pick out your ${PC.origRace} features, but, for the most part, plastic surgery has completely hidden your original race.`);
		}

		return r.join(" ");
	}

	// move this stuff?
	function limbs() {
		const r = [];

		if (hasAnyProstheticLimbs(PC) || !hasBothArms(PC) || !hasBothLegs(PC)) {
			if (!hasBothArms(PC)) {
				if (!hasAnyArms(PC)) {
					r.push(`You have no arms. <span class="red">This is a problem that needs to be addressed at once.</span> You can't run an arcology like this.`);
				} else if (hasAnyProstheticArms(PC)) {
					r.push(`You only have a ${!PC.arm.right ? "left" : "right"} arm, and a prosthetic one at that. It beats not having any.`);
					// expand this
				} else {
					r.push(`You only have your ${!PC.arm.right ? "left" : "right"} arm. It's not enough to stop you, but it is inconvenient.`);
				}
			} else if (hasAnyProstheticArms(PC)) {
				if (hasBothProstheticArms(PC)) {
					r.push(`Both of your arms are artificial.`);
					// expand this
				} else {
					r.push(`Your ${getLeftArmID(PC) > 1 ? "left" : "right"} arm is artificial.`);
					// expand this
				}
			}
			if (!hasBothLegs(PC)) {
				if (!hasAnyLegs(PC)) {
					r.push(`You have no legs. It's not the end of the world, but it does limit what you can do.`);
				} else if (hasAnyProstheticLegs(PC)) {
					r.push(`You only have a ${!PC.leg.right ? "left" : "right"} leg, and a prosthetic one at that. The reason you've chosen to only have one is yours and yours alone.`);
					// expand this
				} else {
					r.push(`You only have your ${!PC.leg.right ? "left" : "right"} leg. It doesn't help much on its own, but you have make do with what you've got.`);
				}
			} else if (hasAnyProstheticLegs(PC)) {
				if (hasBothProstheticLegs(PC)) {
					r.push(`Both your legs are artificial.`);
					// expand this
				} else {
					r.push(`Your ${getLeftLegID(PC) > 1 ? "left" : "right"} leg is artificial.`);
					// expand this
				}
			}
		}
		return r.join(" ");
	}

	function heightImplant() {
		const r = [];

		if (hasAnyLimbs(PC)) {
			if (PC.heightImplant > 1) {
				r.push(`The proportion of your limbs are wrong; a given with the artificial lengthening you've undergone.`);
			} else if (PC.heightImplant > 0) {
				r.push(`The proportion of your limbs seem off, since you've had them artificially lengthened.`);
			} else if (PC.heightImplant < -1) {
				r.push(`The proportion of your limbs are wrong; a given with the artificial shortening you've undergone.`);
			} else if (PC.heightImplant < 0) {
				r.push(`The proportion of your limbs seem off, since you've had them artificially shortened.`);
			}
		}

		return r.join(" ");
	}
};

repo_name: Fekenol/fc

license: mit


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

	const implantRatio = PC.boobsImplant / PC.boobs;
	const nipColor = nippleColor(PC);
	const {girlP} = getPronouns(PC).appendSuffix("P");

	function boobShape() {
		const r = [];
		switch (PC.boobShape) {
			case "perky":
				if (PC.boobs >= 12000) {
					r.push(`It's hard to tell at this size, but from the right angle, you can still see their perkiness in how they rest against you.`);
				} else if (PC.boobs >= 5000) {
					r.push(`Their natural perkiness has helped them resist their enormous size.`);
				} else if (PC.boobs >= 2500) {
					r.push(`They remain perky, even at their substantial size, defying gravity as they rest heavily against your chest and each other.`);
				} else if (PC.boobs >= 1000) {
					r.push(`They're perky, despite their large size, and your nipples point slightly upward.`);
				} else if (PC.boobs >= 500) {
					r.push(`They're full and perky, with your nipples pointing upward.`);
				} else {
					r.push(`They are nice and perky, with your nipples pointing upward.`);
				}
				break;
			case "downward-facing":
				if (PC.boobs > 12000) {
					r.push(`Naturally downward-facing, they are so big that your nipples always point directly down. They've become huge pendulums of soft flesh, since gravity pulls most of their mass past your crotch.`);
				} else if (PC.boobs > 5000) {
					r.push(`They're huge pillows of soft flesh, distorted by gravity and where they rest against your stomach and each other. Naturally downward-facing, they are so big that your nipples point directly down.`);
				} else if (PC.boobs > 2500) {
					r.push(`They're orbs of soft flesh, resting heavily against your stomach and each other. Since they are naturally downward-facing, most of their mass rests low.`);
				} else if (PC.boobs > 1000) {
					r.push(`They're not attractively shaped, with your nipples pointing downward more strongly than they should be.`);
				} else if (PC.boobs > 500) {
					r.push(`They're not attractively shaped, with your nipples pointing down.`);
				} else {
					r.push(`They're not attractively shaped, with your nipples pointing down despite your size.`);
				}
				break;
			case "torpedo-shaped":
				if (PC.boobs > 12000) {
					r.push(`They are naturally torpedo-shaped, which you can tell by the way they are sticking out more than a`);
					if (V.showInches === 2) {
						r.push(`yard`);
					} else {
						r.push(`meter`);
					}
					r.push(`in front of you.`);
				} else if (PC.boobs > 5000) {
					r.push(`They're huge promontories of soft flesh and their natural torpedo shape remains to a certain extent. Your breasts reach an incredibly long way out from your chest and sway lewdly with your slightest motion.`);
				} else if (PC.boobs > 2500) {
					r.push(`They're orbs of soft flesh, resting heavily against your chest and each other. Their natural torpedo shape is distorted by their weight, but they still project out quite a distance in front of you.`);
				} else if (PC.boobs > 1000) {
					r.push(`They're strongly torpedo-shaped despite their large size, projecting a long way from your chest. They sway lewdly with your movements.`);
				} else if (PC.boobs > 500) {
					r.push(`They're strongly torpedo-shaped, projecting a long way from your chest. They sway cutely with your movements.`);
				} else {
					r.push(`They're strongly torpedo-shaped despite their small size, projecting some way from your chest.`);
				}
				break;
			case "wide-set":
				if (PC.boobs > 12000) {
					r.push(`They are naturally wide-set, which can be seen in the way they stick out more than a`);
					if (V.showInches === 2) {
						r.push(`yard`);
					} else {
						r.push(`meter`);
					}
					r.push(`to either side of your body.`);
					if (PC.belly >= 5000) {
						r.push(`Your belly protrudes lewdly between them.`);
					}
				} else if (PC.boobs > 5000) {
					r.push(`They're huge pillows of soft flesh whose natural wide-set shape`);
					if (PC.belly >= 5000) {
						r.push(`forces them to extend massively from your sides when parted by your belly.`);
					} else {
						r.push(`somehow keeps them from touching despite their mass.`);
					}
				} else if (PC.boobs > 2500) {
					r.push(`They're orbs of soft flesh whose natural wide-set shape`);
					if (PC.belly >= 5000) {
						r.push(`causes them to rest to either side of your belly.`);
					} else {
						r.push(`obscures your upper arm${hasBothArms(PC) ? "s" : ""}. They rest without natural cleavage despite their size.`);
					}
				} else if (PC.boobs > 1000) {
					r.push(`They're wide-set, with their weight pointing each nipple away from your sternum.`);
				} else if (PC.boobs > 500) {
					r.push(`They're wide-set, with each nipple pointing away from your sternum.`);
				} else {
					r.push(`They're wide-set, with each nipple pointing somewhat sideways.`);
				}
				break;
			case "saggy":
				if (PC.boobs > 12000) {
					r.push(`They're vast armfuls of soft flesh that sag past your crotch. Your nipples are placed on their bottoms, pointed at the ground by the heavy mass of breastflesh above them.`);
				} else if (PC.boobs > 5000) {
					r.push(`They're huge pillows of soft flesh that sag past your navel. Your nipples are placed on their bottoms, pointed at the ground by the heavy mass of breastflesh above them.`);
				} else if (PC.boobs > 2500) {
					r.push(`They're orbs of soft flesh that sag almost to your navel. Your nipples are placed on their bottoms, pointed at the ground by the weight of breast above them.`);
				} else if (PC.boobs > 1000) {
					r.push(`They're heavy and saggy, pointing your nipples at the ground.`);
				} else if (PC.boobs > 500) {
					r.push(`They're not attractively shaped, with your nipples pointing down.`);
				} else {
					r.push(`They're rather deflated, with your nipples pointing down despite your size.`);
				}
				break;
			default:
				if (PC.boobs > 12000) {
					r.push(`They're vast armfuls of soft flesh, distorted by gravity and happy to swallow up anything that pushes against them.`);
				} else if (PC.boobs > 5000) {
					r.push(`They're huge pillows of soft flesh, distorted by gravity and where they rest against your stomach and each other.`);
				} else if (PC.boobs > 2500) {
					r.push(`They're orbs of soft flesh, resting heavily against your chest and each other.`);
				} else if (PC.boobs > 1000) {
					r.push(`They're soft and round, resting heavily against your chest and each other.`);
				} else if (PC.boobs > 500) {
					r.push(`They're nice and soft and rest naturally against your chest.`);
				} else {
					r.push(`They're nicely rounded and rest naturally.`);
				}
		}
		return r.join(" ");
	}

	function boobSpheres() {
		const r = [];
		if (PC.boobs >= 12000) {
			r.push(`They're sore orbs of flesh stretched taut over ridiculous implants that weigh heavily upon anything they rest on. They barely register as a part of your body, but rather as oversized accessories hung mercilessly on your chest.`);
		} else if (PC.boobs >= 6000) {
			r.push(`They're huge orbs of stretched flesh, resting heavily against your stomach and each other, and extremely obvious implants. Since you have so little actual breast tissue surrounding them, it looks like you have a pair of beachballs stuck to your chest.`);
		} else if (PC.boobs >= 4000) {
			r.push(`They're firm orbs of stretched flesh, resting heavily against your chest and each other, and extremely obvious implants. Since you have so little actual breast tissue surrounding them, it looks like you have a pair of overinflated balloons stuck to your chest.`);
		} else if (PC.boobs >= 2000) {
			r.push(`They're unnaturally, round, hard to the touch, and extremely obvious implants. Since you have so little actual breast tissue surrounding them, it looks like you have a pair of balloons stuck to your chest.`);
		} else if (PC.boobs >= 1000) {
			r.push(`They're unnaturally round, hang heavily from your chest, and quite clearly implants. Since you have so little actual breast tissue surrounding them, it looks like you have a pair of literal melons stuck to your chest.`);
		} else {
			r.push(`They're unnaturally round and contain so little actual breast tissue that they appear attached to your chest instead of part of it.`);
		}
		return r.join(" ");
	}

	function boobVolume() {
		const r = [];
		if (PC.boobs >= 300) {
			r.push(`They are about ${num(PC.boobs)} CCs each`);
			if (PC.boobShape === "spherical") {
				r.push(`and consist primarily of your ${num(PC.boobsImplant)} CC ${PC.boobsImplantType === "normal" ? "breast" : `${PC.boobsImplantType}`} implants.`);
			} else {
				if (PC.boobsImplant > 0) {
					r.push(r.pop() + `, including your ${num(PC.boobsImplant)} CC ${PC.boobsImplantType === "normal" ? "breast" : `${PC.boobsImplantType}`} implants`);
				}
				r.push(r.pop() + `.`);
			}
		}
		return r.join(" ");
	}

	function boobFreckles() {
		const r = [];
		if (PC.markings === "freckles") {
			if (PC.boobs >= 400) {
				r.push(`The tops of your breasts and your cleavage are lightly freckled.`);
			} else {
				r.push(`Your chest is covered in a light spray of freckles.`);
			}
		} else if (PC.markings === "heavily freckled") {
			if (PC.boobs >= 2000) {
				r.push(`Your breasts are covered in freckles, but they're so big that the freckles are spaced widely across the breadth of each boob.`);
			} else if (PC.boobs >= 400) {
				r.push(`Your breasts are covered in freckles, which are particularly dense in the cleft between them.`);
			} else {
				r.push(`Your chest is covered in dense freckles.`);
			}
		}
		return r.join(" ");
	}

	function nipples() {
		const r = [];

		if (PC.aphrodisiacs > 0 || PC.inflationType === "aphrodisiac" || PC.energy > 95 || PC.need > 0) {
			switch (PC.nipples) {
				case "tiny":
					r.push(`You have stiff little nubs ${areolae()}.`);
					break;
				case "flat":
					r.push(`You have stiff little bumps ${areolae()}`);
					break;
				case "puffy":
					r.push(`You have puffy and erect nipples, ${areolae()}`);
					break;
				case "partially inverted":
				case "inverted":
					r.push(`Your nipples are stiffly erect and ${areolae()}. They'd be inverted if you weren't so horny right now.`);
					break;
				case "huge":
					if (PC.boobs - PC.boobsImplant > 7500) {
						r.push(`Your nipples are in proportion with your breasts: they're stiffly erect and`);
						if (PC.height < 160 && hasAnyArms(PC)) {
							r.push(`almost as large as your fist${hasBothArms(PC) ? "s" : ""}.`);
						} else {
							r.push(`large enough to be jerked off.`);
						}
						r.push(`The sensitive protrusions are`);
					} else {
						r.push(`Your nipples are enormously erect and`);
					}
					r.push(`areolae()`);
					break;
				case "fuckable":
					r.push(`Your nipples are swollen shut and ${areolae()}`);
					break;
				default:
					r.push(`Your nipples are stiffly erect and ${areolae()}`);
			}
		} else {
			switch (PC.nipples) {
				case "tiny":
					if (PC.title !== 1 || PC.boobs >= 300 || PC.areolae !== 0) { // Don't talk about male nipples.
						r.push(`You have tiny little nubs`);
						r.push(areolae());
					}
					break;
				case "flat":
					if (PC.piercing.nipple.weight !== 0) {
						r.push(`Your nipples have been pulled flat from the constant tug of your oversized implants. They are held back by piercings and`);
					} else {
						r.push(`Your nipples have been pulled flat from the constant tug of your oversized implants. What little is recognizable is`);
					}
					r.push(areolae());
					break;
				case "puffy":
					r.push(`You have puffy nipples with a swell of soft flesh around each,`);
					r.push(areolae());
					break;
				case "partially inverted":
					if (PC.piercing.nipple.weight !== 0) {
						r.push(`You have partially inverted nipples, currently held out by your piercings,`);
					} else {
						r.push(`Your nipples are partially inverted and blend in with the front of your breasts. What can be seen is`);
					}
					r.push(areolae());
					break;
				case "inverted":
					if (PC.piercing.nipple.weight !== 0) {
						r.push(`Your nipples are completely inverted, or would be if they weren't pierced. The extracted nubs are`);
					} else {
						r.push(`Your nipples are completely inverted: they have been swallowed up by the surrounding breastflesh. The area is`);
					}
					r.push(areolae());
					break;
				case "huge":
					if (PC.boobs - PC.boobsImplant > 7500) {
						r.push(`Your nipples are in proportion with your breasts: they've grown`);
						if (PC.height < 160 && hasAnyArms(PC)) {
							r.push(`almost as large as your fist${hasBothArms(PC) ? "s" : ""}.`);
						} else {
							r.push(`large enough to be jerked off.`);
						}
					} else if (hasAnyArms(PC)) {
						r.push(`Your nipples are the size of the last joint of your thumb${hasBothArms(PC) ? "s" : ""} when erect.`);
					} else {
						r.push(`Your nipples are of significant size.`);
					}
					r.push(`The jutting protrusions are`);
					r.push(areolae());
					break;
				case "fuckable":
					r.push(`You have a pair of deep holes where your nipples should be. What they are for is completely obvious. The penetrable slits are`);
					r.push(areolae());
					break;
				default:
					if (PC.title !== 1 || PC.boobs >= 300 || PC.areolae !== 0) {
						r.push(`You have normal nipples`);
						r.push(areolae());
					}
			}
		}
		return r.join(" ");
	}

	function areolae() {
		const r = [];
		switch (PC.areolae) {
			case 1:
				r.push(`surrounded by large, lovely circles of ${nipColor} skin.`);
				break;
			case 2:
				r.push(`surrounded by unusually wide, eye-catching circles of ${nipColor} skin.`);
				break;
			case 3:
				r.push(`surrounded by unnaturally broad ${nipColor} areolae that cover much of the ${PC.boobShape === "saggy" || PC.boobShape === "downward-facing" ? 'bottom' : 'front'} of your breasts.`);
				break;
			case 4:
				r.push(`surrounded by unnaturally huge ${nipColor} areolae that almost entirely cover the ${PC.boobShape === "saggy" || PC.boobShape === "downward-facing" ? 'bottom' : 'front'} of your breasts.`);
				break;
			default:
				r.push(`surrounded by a minimal ${nipColor} areolae.`);
		}
		if (PC.areolaeShape === "heart") {
			r.push(`Your areolae have been reshaped into hearts.`);
		} else if (PC.areolaeShape === "star") {
			r.push(`Your areolae have been reshaped into stars.`);
		} else if (PC.areolaeShape !== "circle") {
			r.push(`Your areolae are ${PC.areolaeShape}-shaped.`);
		}
		return r.join(" ");
	}

	function lactation() {
		const r = [];

		if (PC.lactation === 1) {
			if (PC.boobs >= 12000) {
				r.push(`Your breasts feel full and tender; this is likely a side effect of your lactation.`);
			} else if (PC.boobs >= 5000) {
				r.push(`Your breasts are tender and feel a little swollen; this is likely a side effect of your lactation.`);
			} else if (PC.boobs >= 2500) {
				r.push(`Your breasts feel even more enormous lately; this is likely a side effect of your lactation.`);
			} else if (PC.boobs >= 1000) {
				r.push(`Your breasts feel even more huge lately; this is likely a side effect of your lactation.`);
			} else if (PC.boobs >= 500) {
				r.push(`Your breasts feel bigger lately; likely a side effect of your lactation.`);
			} else if (PC.boobs >= 300) {
				r.push(`Your breasts feel a bit bigger lately; this is likely a side effect of your lactation.`);
			} else {
				if (PC.title === 1) {
					r.push(`Your chest feels swollen; the beads of milk forming on your nipples tells you why.`);
				} else {
					r.push(`Your nipples cap a pair of painfully swollen bumps; milk beads from them at the slightest provocation.`);
				}
			}
			if (PC.lactationAdaptation > 10) {
				r.push(`As if on demand, your milk starts to dribble down your tits.`);
				if (PC.lactationAdaptation > 50) {
					r.push(`Your body is so well-adapted to milk production that this is a regular affair now.`);
				} else {
					r.push(`Your body has become accustomed to milk production.`);
				}
			}
		} else if (PC.lactation > 1) {
			if (PC.boobs >= 12000) {
				r.push(`Your breasts feel bloated and tender; the trickle of milk running from your nipples tells you it's time to drain them again.`);
			} else if (PC.boobs >= 300) {
				r.push(`Your breasts are painfully engorged; the trickle of milk running from your nipples tells you it's time to drain them again.`);
			} else if (PC.title === 1) {
				r.push(`Your chest is painfully bloated; the trickle of milk running from your nipples tells you it's time to drain them again.`);
			} else {
				r.push(`Your nipples cap a pair of painfully swollen bumps; milk constantly trickles from them unless you regularly milk yourself.`);
			}
			if (PC.lactationAdaptation > 10) {
				if (PC.lactationAdaptation > 50) {
					r.push(`Your body is so well-adapted to milk production that this only results in fleeting relief.`);
				} else {
					r.push(`Your body has become accustomed to milk production that this is become annoyingly frequent.`);
				}
			}
		}

		return r.join(" ");
	}

	function boobAccessibility() {
		const r = [];
		if (PC.boobs >= 25000) {
			if (V.boobAccessibility === 1) {
				r.push(`On the bright side, you've had the penthouse remodeled for ${girlP}s with such substantial bosoms already, so fitting through doors and using furniture isn't a concern.`);
			} else {
				r.push(`Even worse, the penthouse was not designed to handle ${girlP}s with bosoms as substantial as yours; you crowd whichever halls or doors you use and find an uncomfortable number of objects poking and prodding your tits.`);
			}
		}
		return r.join(" ");
	}

	function weight(sizeLimit, bodySize, dwarfSize) {
		const r = [];

		if ((PC.physicalAge <= 12 && PC.boobs > 100000 + (PC.muscles * 50)) ||
			(PC.physicalAge < 18 && PC.boobs > 250000 + (PC.muscles * 100)) ||
			(PC.physicalAge >= 18 && PC.boobs > 500000 + (PC.muscles * 200))) {
			r.push(`Your tits are so enormous you've lost the ability to lift them and are now stuck in bed. You'll never be without pillows, however.`);
		} else if (PC.boobs > sizeLimit) {
			r.push(`Your tits are so heavy that it makes moving around difficult.`);
			if (canWalk(PC)) {
				if (PC.muscles > 95) {
					r.push(`However, you're so powerfully built that you can comfortably stand up straight, though you definitely feel it in the morning.`);
				} else if (PC.muscles > 30) {
					r.push(`Your back is strong enough to support their weight, but you frequently catch yourself slouching under their weight, so you may be nearing your limit.`);
				} else  {
					r.push(`It takes a lot of effort to keep upright with them, so you're most comfortable letting them rest on something when you have the chance.`);
				}
			} else if (PC.boobs >= dwarfSize) {
				r.push(`It's not surprising really, given they are each bigger than you are.`);
			} else if (PC.boobs >= bodySize) {
				r.push(`It's not surprising, given they are each as big as you are.`);
			} else {
				r.push(`It's not surprising, given you're about half boob.`);
			}
			r.push(boobAccessibility());
		} else if (PC.boobs > 5000) {
			r.push(`Your back gets a serious workout from having to lug your tits around, but the biggest nuisance is just how much they get in the way of your day to day activities.`);
			r.push(boobAccessibility());
		}
		return r.join(" ");
	}

	const oversizedImplants = PC.boobShape === "spherical" ? boobSpheres() : `They're mostly implant, and it shows; with so little natural breast tissue to support them, they look like a pair of balloons attached to your chest.`;
	const obviousImplants = `They are kind of rounded and much too perky for their size to pass as real.`;

	// improve this block!
	// block unfinished for now!
	if (PC.boobs >= 90000) {
		r.push(`you have a <span class="orange">pair of door-jamming breasts.</span>`);
	} else if (PC.boobs >= 70000) {
		r.push(`you have a <span class="orange">pair of door-crowding breasts.</span>`);
	} else if (PC.boobs >= 55000) {
		r.push(`you have a <span class="orange">pair of lap filling breasts.</span>`);
	} else if (PC.boobs >= 40000) {
		r.push(`you have a <span class="orange">pair of beachball-sized breasts.</span>`);
	} else if (PC.boobs >= 25000) {
		r.push(`you have a <span class="orange">pair of figure dominating breasts.</span>`);
	} else if (PC.boobs >= 15000) {
		r.push(`you have a <span class="orange">pair of arm filling breasts.</span>`);
	} else if (PC.boobs >= 10000) {
		r.push(`you have a <span class="orange">pair of obscenely massive breasts.</span>`);
	} else if (PC.boobs >= 9000) {
		r.push(`you have a <span class="orange">pair of unbelievable ZZZ-cup breasts.</span>`);
	} else if (PC.boobs >= 8500) {
		r.push(`you have a <span class="orange">pair of unbelievable ZZ-cup breasts.</span>`);
	} else if (PC.boobs >= 8000) {
		r.push(`you have a <span class="orange">pair of mind-blowing Z-cup breasts.</span>`);
	} else if (PC.boobs >= 7500) {
		r.push(`you have a <span class="orange">pair of mind-blowing Y-cup breasts.</span>`);
	} else if (PC.boobs >= 7000) {
		r.push(`you have a <span class="orange">pair of spectacular X-cup breasts.</span>`);
	} else if (PC.boobs >= 6500) {
		r.push(`you have a <span class="orange">pair of spectacular V-cup breasts.</span>`);
	} else if (PC.boobs >= 5500) {
		r.push(`you have a <span class="orange">pair of attention-grabbing U-cup breasts.</span>`);
	} else if (PC.boobs >= 5100) {
		r.push(`you have a <span class="orange">pair of unmissable T-cup breasts.</span>`);
	} else if (PC.boobs >= 4700) {
		r.push(`you have a <span class="orange">pair of astounding S-cup breasts.</span>`);
	} else if (PC.boobs >= 4300) {
		r.push(`you have a <span class="orange">pair of unreal R-cup breasts.</span>`);
	} else if (PC.boobs >= 3950) {
		r.push(`you have a <span class="orange">pair of shocking Q-cup breasts.</span>`);
	} else if (PC.boobs >= 3600) {
		r.push(`you have a <span class="orange">pair of disproportionate P-cup breasts.</span>`);
	} else if (PC.boobs >= 3250) {
		r.push(`you have a <span class="orange">pair of awe-inspiring O-cup breasts.</span>`);
	} else if (PC.boobs >= 2900) {
		r.push(`you have a <span class="orange">pair of tremendous N-cup breasts.</span>`);
	} else if (PC.boobs >= 2600) {
		r.push(`you have a <span class="orange">pair of magnificent M-cup breasts.</span>`);
	} else if (PC.boobs >= 2300) {
		r.push(`you have a <span class="orange">pair of stupendous L-cup breasts.</span>`);
	} else if (PC.boobs >= 2050) {
		r.push(`you have a <span class="orange">pair of titanic K-cup breasts.</span>`);
	} else if (PC.boobs >= 1800) {
		r.push(`you have a <span class="orange">pair of enormous J-cup breasts.</span>`);
	} else if (PC.boobs >= 1600) {
		r.push(`you have a <span class="orange">pair of massive I-cup breasts.</span>`);
	} else if (PC.boobs >= 1400) {
		r.push(`you have a <span class="orange">pair of huge H-cup breasts.</span>`);
		if (implantRatio >= 0.75) {
			r.push(oversizedImplants);
		} else if (implantRatio >= 0.50) {
			r.push(obviousImplants);
		} else {
			r.push(boobShape());
			r.push(`They refuse to come to a rest once they get moving.`);
		}
		r.push(boobVolume());
	} else if (PC.boobs >= 1200) {
		r.push(`you have a <span class="orange">pair of huge G-cup breasts.</span>`);
		if (implantRatio >= 0.75) {
			r.push(oversizedImplants);
		} else if (implantRatio >= 0.50) {
			r.push(obviousImplants);
		} else {
			r.push(boobShape());
			r.push(`They tend bounce everywhere when you fuck your slaves.`);
		}
		r.push(boobVolume());
	} else if (PC.boobs >= 1000) {
		r.push(`you have a <span class="orange">pair of hefty F-cup breasts.</span>`);
		if (implantRatio >= 0.75) {
			r.push(oversizedImplants);
		} else if (implantRatio >= 0.50) {
			r.push(`They're not obviously implants, though the way they move when you fuck a slave pins them as such.`);
		} else {
			r.push(boobShape());
			r.push(`They bounce lewdly as you fuck your slaves.`);
		}
		r.push(boobVolume());
	} else if (PC.boobs >= 800) {
		r.push(`you have a <span class="orange">healthy pair of DD-cup breasts.</span>`);
		if (implantRatio >= 0.75) {
			r.push(`They're mostly implant, and it shows.`);
		} else if (implantRatio >= 0.50) {
			r.push(`Your implants are well done, so it's not too obvious they're fake.`);
		} else if (implantRatio >= 0.25) {
			r.push(boobShape());
			r.push(`They jiggle with a pleasant bounce when in motion, though they defy gravity a bit too much their size.`);
		} else {
			r.push(boobShape());
			r.push(`They jiggle pleasantly with your every move.`);
		}
		r.push(boobVolume());
	} else if (PC.boobs >= 650) {
		r.push(`you have a <span class="orange">healthy pair of D-cup breasts.</span>`);
		if (implantRatio >= 0.75) {
			r.push(`They're mostly implant, but done well, so it's only obvious when they don't move with you.`);
		} else if (implantRatio >= 0.50) {
			r.push(`They're a bit too firm to look real and don't bounce at all when you fuck your slaves.`);
		} else if (implantRatio >= 0.25) {
			r.push(boobShape());
			r.push(`They bounce pleasantly when in motion, though they rest a little too high for their size.`);
		} else {
			r.push(boobShape());
			r.push(`They bounce pleasantly as you fuck your slaves.`);
		}
		r.push(boobVolume());
	} else if (PC.boobs >= 500) {
		r.push(`you have a <span class="orange">pair of C-cup breasts.</span>`);
		if (implantRatio >= 0.75) {
			r.push(`They're mostly implant, but done well, so it's only obvious when they don't move with you.`);
		} else if (implantRatio >= 0.50) {
			r.push(`They're a bit too firm to look real and don't bounce at all when you fuck your slaves.`);
		} else if (implantRatio >= 0.25) {
			r.push(`They're kind of round due to your implants and don't bounce at all when you fuck your slaves.`);
		} else {
			r.push(boobShape());
			r.push(`They bounce a little when you fuck your slaves.`);
		}
		r.push(boobVolume());
	} else if (PC.boobs >= 400) {
		r.push(`you have a <span class="orange">pair of B-cup breasts.</span>`);
		if (implantRatio >= 0.75) {
			r.push(`They're mostly implant, and given their size, that's pretty obvious.`);
		} else if (implantRatio >= 0.50) {
			r.push(`They're perky, but a bit too firm to look real and don't bounce at all when you fuck your slaves.`);
		} else if (implantRatio >= 0.25) {
			r.push(`They're kind of round due to your implants and don't bounce at all when you fuck your slaves.`);
		} else {
			r.push(boobShape());
			r.push(`They have the slightest little bounce when you fuck your slaves.`);
		}
		r.push(boobVolume());
	} else if (PC.boobs >= 300) {
		r.push(`you have a <span class="orange">tiny pair of A-cup breasts.</span>`);
		if (implantRatio >= 0.75) {
			r.push(`It's pretty obvious that you're flat and choose to stuff what little boob you had full of implant.`);
		} else if (implantRatio >= 0.50) {
			r.push(`They're perky, but a bit too firm to look real.`);
		} else if (implantRatio >= 0.25) {
			r.push(`They're kind of round due to your implants, but that's not surprising given their size.`);
		} else {
			r.push(boobShape());
		}
		r.push(boobVolume());
	} else if (PC.title === 1) {
		r.push(`you have a <span class="orange">masculine chest.</span>`);
	} else {
		r.push(`you have nothing in the breast department. You're <span class="orange">completely flat.</span>`);
	}
	r.push(
		boobFreckles(),
		nipples()
	);
	if (PC.physicalAge <= 12) {
		r.push(weight(8000, 20000, 100000));
	} else if (PC.physicalAge < 18) {
		r.push(weight(15000, 30000, 250000));
	} else { // PC.physicalAge >= 18
		r.push(weight(25000, 40000, 500000));
	}
	r.push(lactation());

	return r.join(" ");
};


code:
App.Desc.Player.butt = function(PC = V.PC) {
	const r = [];
	const implantRatio = PC.buttImplant / PC.butt;
	const implantType = PC.buttImplantType !== "normal" ?  PC.buttImplantType : "";
	const {girlP} = getPronouns(PC).appendSuffix("P");

	function hips() {
		const r = [];

		r.push(`<span class="orange">`);
		if (PC.hips === -2) {
			r.push(`narrow`);
		} else if (PC.hips === -1) {
			r.push(`trim`);
		} else if (PC.hips === 0) {
			r.push(`ample`);
		} else if (PC.hips === 1) {
			r.push(`broad`);
		} else if (PC.hips === 2) {
			r.push(`child-bearing`);
		} else if (PC.hips === 3) {
			r.push(`brood-supporting`);
		}
		r.push(`hips</span>`);
		return r.join(" ");
	}

	function butt() {
		const r = [];
		const tinyImplants = implantRatio > 0 ? `A fraction of its size is from your ${implantType} implants, but they make up such a proportionally small percentage of its mass that they are unnoticeable outside of a thorough groping.` : "";

		if (PC.butt === 0) {
			r.push(`a <span class="orange">flat ass.</span>`);
		} else if (PC.butt <= 1) {
			r.push(`a <span class="orange">slim rear`);
			if (implantRatio >= 0.90) {
				r.push(`</span> that's quite clearly a pair of ${implantType} implants.`);
			} else if (implantRatio >= 0.75) {
				r.push(r.pop() + `;</span> it juts out farther than an ass of its size rightfully should, the consequence of having a pair of big ${implantType} implants crammed into it.`);
			} else if (implantRatio >= 0.50) {
				r.push(r.pop() + `;</span> anyone that feels it can tell it's filled out with ${implantType} implants, but at a glance you can't tell otherwise.`);
			} else if (implantRatio >= 0.25) {
				r.push(r.pop() + `;</span> it's already quite pert, so your small ${implantType} implants make it look a little fake when in motion.`);
			} else {
				r.push(r.pop() + `.</span>`);
			}
		} else if (PC.butt <= 2) {
			r.push(`a <span class="orange">small rear`);
			if (implantRatio >= 0.90) {
				r.push(`</span> that's quite clearly a pair of big ${implantType} implants.`);
			} else if (implantRatio >= 0.75) {
				r.push(r.pop() + `;</span> it juts out farther than an ass of its size rightfully should, the consequence of having a pair of big ${implantType} implants crammed into it.`);
			} else if (implantRatio >= 0.50) {
				r.push(r.pop() + `;</span> anyone that feels it can tell it's filled out with ${implantType} implants, but at a glance you can't tell otherwise.`);
			} else if (implantRatio >= 0.25) {
				r.push(r.pop() + `;</span> it's already quite pert, so your ${implantType} implants make it look a little fake when in motion.`);
			} else {
				r.push(r.pop() + `.</span>`);
				r.push(tinyImplants);
			}
		} else if (PC.butt <= 3) {
			r.push(`a <span class="orange">sexy, but normal, butt`);
			if (implantRatio >= 0.90) {
				r.push(`</span> that's quite clearly a pair of big ${implantType} implants.`);
			} else if (implantRatio >= 0.75) {
				r.push(r.pop() + `;</span> it juts out farther than an ass of its size should, the consequence of having a pair of big ${implantType} implants crammed into it.`);
			} else if (implantRatio >= 0.50) {
				r.push(r.pop() + `;</span> anyone that feels it can tell it's filled out with ${implantType} implants, but at a glance you can't tell otherwise.`);
			} else if (implantRatio >= 0.25) {
				r.push(r.pop() + `;</span> it's firmer than it should be, so your ${implantType} implants make it look fake when in motion.`);
			} else {
				r.push(r.pop() + `.</span>`);
				r.push(tinyImplants);
			}
		} else if (PC.butt <= 4) {
			r.push(`a <span class="orange">large butt`);
			if (implantRatio >= 0.90) {
				r.push(`</span> that's quite clearly a pair of ${PC.buttImplantType === "string" ? "engorged" : "big"} ${implantType} implants. No matter your position, it always looks artificially enticing.`);
			} else if (implantRatio >= 0.75) {
				r.push(r.pop() + `;</span> with your big ${implantType} implants, it juts out curvaceously no matter what pose you take.`);
			} else if (implantRatio >= 0.50) {
				r.push(r.pop() + `;</span> anyone that feels it can tell it's filled out with ${implantType} implants, but its not obvious otherwise.`);
			} else if (implantRatio >= 0.25) {
				r.push(r.pop() + `;</span> it's firmer than it should be, but it's hard to notice at a glance.`);
			} else {
				r.push(r.pop() + `.</span> It jiggles a little when you walk.`);
				r.push(tinyImplants);
			}
		} else if (PC.butt <= 5) {
			r.push(`a <span class="orange">huge butt`);
			if (implantRatio >= 0.90) {
				r.push(`</span> that's quite clearly a pair of ${PC.buttImplantType === "string" ? "engorged" : "big"} ${implantType} implants. No matter your position, it always looks artificially enticing.`);
			} else if (implantRatio >= 0.75) {
				r.push(r.pop() + `;</span> with your ${PC.buttImplantType === "string" ? "engorged" : "big"} ${implantType} implants, it juts out, firm and curvaceous, no matter what pose you take.`);
			} else if (implantRatio >= 0.50) {
				r.push(r.pop() + `;</span> with how firm and round it is, your ${implantType} implants are pretty obvious.`);
			} else if (implantRatio >= 0.25) {
				r.push(r.pop() + `;</span> it's firmer and more shapely than it should be, but your ${implantType} implants are pretty hard to notice under all the soft flesh.`);
			} else {
				r.push(r.pop() + `.</span> It jiggles a lot as you move.`);
				r.push(tinyImplants);
			}
		} else if (PC.butt <= 6) {
			r.push(`an <span class="orange">enormous butt`);
			if (implantRatio >= 0.90) {
				r.push(` that's quite clearly a pair of ${PC.buttImplantType === "string" ? "engorged" : "big"} ${implantType} implants. No matter your position, it always looks artificially enticing, and there is no denying how alluring it looks filling out your clothing.`);
			} else if (implantRatio >= 0.75) {
				r.push(r.pop() + `;</span> with your ${PC.buttImplantType === "string" ? "engorged" : "big"} ${implantType} implants, it juts out, firm and curvaceous, no matter what pose you take, and fills your clothing out nicely.`);
			} else if (implantRatio >= 0.50) {
				r.push(r.pop() + `; with how round and curvaceous it is, it's pretty obvious there's a pair of ${PC.buttImplantType === "string" ? "engorged" : "big"} ${implantType} implants buried beneath that soft flesh. Your clothing is filled out nicely by its size.`);
			} else if (implantRatio >= 0.25) {
				r.push(r.pop() + `;</span> it's far more shapely than an ass of its mass should be thanks to your ${implantType} implants. It jiggles attractively as you move and fills your clothing out nicely.`);
			} else {
				r.push(r.pop() + `.</span> It is always wobbling for some reason or another and really fills out your clothing.`);
				r.push(tinyImplants);
			}
		} else if (PC.butt <= 7) {
			r.push(`a <span class="orange">gigantic ass`);
			if (implantRatio >= 0.90) {
				r.push(` that's quite clearly a pair of ${PC.buttImplantType === "string" ? "engorged" : "big"} ${implantType} implants. No matter your position, it always looks artificially enticing, and there is no denying how alluring it looks so tightly wrapped up in your clothing. If only you could still squeeze into spaces slightly narrower than yourself, however.`);
			} else if (implantRatio >= 0.75) {
				r.push(r.pop() + `; with your ${PC.buttImplantType === "string" ? "engorged" : "big"} ${implantType} implants, it juts out, firm and curvaceous, no matter what pose you take. It's near impossible to properly fit into your clothing and a challenge to squeeze into anything narrower than yourself.`);
			} else if (implantRatio >= 0.50) {
				r.push(r.pop() + `; with how firm and curvaceous it is, it's pretty obvious there's a pair of ${PC.buttImplantType === "string" ? "engorged" : "big"} ${implantType} implants buried beneath that softly jiggling flesh. It's near impossible to properly fit into your clothing and attempting to force it into a tight chair more often than not results in the chair following you when you stand up.`);
			} else if (implantRatio >= 0.25) {
				r.push(r.pop() + `; it's a little more shapely than an ass of its mass should be thanks to your ${implantType} implants. It wobbles hypnotically as you move, is near impossible to properly fit into your clothing, and carries a risk of getting stuck in chairs.`);
			} else {
				r.push(r.pop() + `;</span> every motion sends ripples through its ample mass, it's near impossible to properly fit into your clothing, and you risk enveloping whatever you sit on.`);
				r.push(tinyImplants);
			}
		} else if (PC.butt <= 10) {
			r.push(`an <span class="orange">immense rear end`);
			if (implantRatio >= 0.90) {
				r.push(` that's quite obviously a pair of ${PC.buttImplantType === "string" ? "engorged" : "oversized"} ${implantType} implants. No matter your position, it looks like someone shoved a pair of beachballs in your buttcheeks. Getting dressed, and having your clothing survive, has become a challenge; fitting into spaces narrower than yourself, a dream.`);
			} else if (implantRatio >= 0.75) {
				r.push(r.pop() + `; with your ${PC.buttImplantType === "string" ? "engorged" : "oversized"} ${implantType} implants, it juts out, artificially enticing, no matter your position. Your clothing is in constant risk of tearing from its sheer size, and the notion of squeezing between anything narrower than yourself has been reduced to a dream.`);
			} else if (implantRatio >= 0.50) {
				r.push(r.pop() + `; with how firm and curvaceous it is, it's pretty obvious there's a pair of ${PC.buttImplantType === "string" ? "engorged" : "oversized"} ${implantType} implants buried beneath that abundant flesh. It's impossible to properly fit into your clothing without spilling out or overflowing it, and a challenge to squeeze through anything narrower than yourself.`);
			} else if (implantRatio >= 0.25) {
				r.push(r.pop() + `; it's a little more shapely than an ass of its sheer size should be thanks to your ${implantType} implants. It wobbles hypnotically when in motion, overflows or spills out of all your clothing, and practically consumes anything you sit on.`);
			} else {
				r.push(r.pop() + `.</span> It wobbles hypnotically when in motion, overflows or spills out of all your clothing, and practically consumes anything you sit on.`);
				r.push(tinyImplants);
			}
		} else if (PC.butt <= 14) {
			r.push(`an <span class="orange">inhumanly large rear`);
			if (implantRatio >= 0.90) {
				r.push(` that's quite obviously a pair of ${PC.buttImplantType === "string" ? "engorged" : "oversized"} ${implantType} implants. No matter your position, it looks like someone shoved a pair of overinflated beachballs in your buttcheeks. You require custom clothing and can't fit anywhere narrower than yourself, but there is no denying its enticing sway when you move.`);
			} else if (implantRatio >= 0.75) {
				r.push(r.pop() + `; with your ${PC.buttImplantType === "string" ? "engorged" : "oversized"} ${implantType} implants, it explodes outwards, artificially enticing, no matter your position. It sways hypnotically with your movements, requires custom clothing, and prevents you from squeezing into places narrower than yourself.`);
			} else if (implantRatio >= 0.50) {
				r.push(r.pop() + `; it's surprisingly curvaceous for its size, so it's pretty obvious that there's a pair of ${PC.buttImplantType === "string" ? "engorged" : "oversized"} ${implantType} implants buried somewhere within. It jiggles hypnotically when in motion, requires custom clothing, and prevents you from squeezing into places narrower than yourself.`);
			} else if (implantRatio >= 0.25) {
				r.push(r.pop() + `; it's a little more shapely than an ass of its sheer size should be thanks to your ${implantType} implants, but nobody can really tell. It wobbles hypnotically when in motion, requires custom clothing, and threatens to consume anything you sit on.`);
			} else {
				r.push(r.pop() + `.</span> It wobbles hypnotically when in motion, requires custom clothing, and threatens to consume anything you sit on.`);
				r.push(tinyImplants);
			}
		} else {
			r.push(`an <span class="orange">obscenely massive butt`);
			if (implantRatio >= 0.90) {
				r.push(` that's quite obviously a pair of ${PC.buttImplantType === "string" ? "engorged" : "oversized"} ${implantType} implants. No matter your position, it looks like someone shoved a pair of ready-to-pop weather balloons in your buttcheeks. Since there is so little flesh surrounding them, they tightly follow your every move, making every motion an erotic one to any onlookers. Getting places, using furniture, and even wearing clothes are a struggle with it, but you wouldn't put up with it if you didn't like it.`);
			} else if (implantRatio >= 0.75) {
				r.push(r.pop() + `; with your ${PC.buttImplantType === "string" ? "engorged" : "oversized"} ${implantType} implants, it explodes outwards, artificially enticing, no matter your position. Despite its size and weight, it still moves with you instead of staying at rest, giving your every motion an erotic sway. Getting places, using furniture, and even wearing clothes are a struggle with it, but you wouldn't put up with it if you didn't like it.`);
			} else if (implantRatio >= 0.50) {
				r.push(r.pop() + `; it's surprisingly pert for its size, so the logical conclusion is that there's a pair of ${PC.buttImplantType === "string" ? "engorged" : "oversized"} ${implantType} implants supporting it from somewhere within. It's so expansive and heavy, motion doesn't translate well into it, leaving it rather inert no matter how you shift around it.`);
				if (canWalk(PC)) {
					r.push(`When walking, however, it jiggles and sways hypnotically with your every step.`);
				}
				r.push(`Getting places, using furniture, and even wearing clothes are a struggle with it, but you wouldn't put up with it if you didn't like it.`);
			} else {
				r.push(r.pop() + `.</span> It's so expansive and heavy, motion doesn't translate well into it, leaving it rather inert no matter how you shift around it.`);
				if (canWalk(PC)) {
					r.push(`When walking, however, it wobbles and sways hypnotically with your every step.`);
				}
				r.push(`Getting places, using furniture, and even wearing clothes are a struggle with it, but you wouldn't put up with it if you didn't like it.`);
				r.push(tinyImplants);
			}
		}
		return r.join(" ");
	}

	function proportion() {
		if (
			(PC.hips === -2 && PC.butt > 2) ||
			(PC.hips === -1 && PC.butt > 4) ||
			(PC.hips === 0 && PC.butt > 6) ||
			(PC.hips === 1 && PC.butt > 8) ||
			(PC.hips === 2 && PC.butt > 15)
		) {
			return `Your butt is disproportionately large for your hips and extends past them, allowing it to be seen on you from any angle.`;
		} else if (
			(PC.hips === 0 && PC.butt < 2) ||
			(PC.hips === 1 && PC.butt < 3) ||
			(PC.hips === 2 && PC.butt < 4) ||
			(PC.hips === 3 && PC.butt < 9)
		) {
			return `Your butt is disproportionately small for your hips, giving you an unbalanced, flattish figure when viewed from behind.`;
		}
	}

	function buttAccessibility() {
		const r = [];
		if (PC.butt > 15) {
			if (V.buttAccessibility === 1) {
				r.push(`It's a good thing you've had the penthouse remodeled for ${girlP}s with such ponderous bottoms already, so you can at least live comfortably at home.`);
			} else {
				r.push(`Even worse, the penthouse was not designed to handle ${girlP}s with bottoms as ponderous as yours; the narrow halls and doors give unbroken slaves an easy means to elude you.`);
			}
		}
		return r.join(" ");
	}

	function weight() {
		const r = [];

		if (PC.physicalAge <= 12 && PC.butt > 14) {
			r.push(`Your ass weighs so much you can no longer drag it off your bed. It makes a comfy cushion, at least.`);
		} else if ((PC.physicalAge <= 12 && PC.butt >= 12) || (PC.physicalAge > 12 && PC.butt > 17)) {
			r.push(`Your ass is so unwieldy and heavy that it makes moving around difficult.`);
			if (canWalk(PC)) {
				if (PC.muscles > 95) {
					if (hasBothProstheticLegs(PC)) {
						r.push(`Your prosthetic legs are sturdy enough to allow you to stand and walk normally, though it is definitely taking a toll on their anchor points.`);
					} else {
						r.push(`Your legs are so powerfully built that you can stand and walk normally, though it is definitely taking a toll on your knees.`);
					}
				} else if (PC.muscles > 30) {
					r.push(`Your legs are strong enough to support its weight, but it's still much more comfortable to remain seated; it's either time to work your quads harder or consider a reduction.`);
				} else  {
					r.push(`It takes a lot of effort to not be forced into a sitting position with it, so you're most comfortable just letting it rest on something when you have the chance.`);
				}
			} else {
				r.push(`But that's to be expected since you require an extra-wide wheelchair to get anywhere.`);
			}
			r.push(buttAccessibility());
		} else if (PC.butt > 6 && canWalk(PC)) {
			r.push(`Your ass is heavy enough to`);
			if (hasBothProstheticLegs(PC)) {
				r.push(`strain your limbs' anchor points,`);
			} else {
				r.push(`give your legs a serious workout,`);
			}
			r.push(`but the biggest nuisance is just how bulbous and awkwardly shaped it is.`);
			r.push(buttAccessibility());
		}
		return r.join(" ");
	}

	function anus() {
		const r = [];
		let skinDesc;
		if (skinToneLevel(PC.skin) < 13) {
			skinDesc = "pink";
		} else if (PC.anusTat === "bleached") {
			skinDesc = PC.skin;
		} else if (skinToneLevel(PC.skin) > 19) {
			skinDesc = "dark";
		} else {
			skinDesc = "darker";
		}
		let hands = hasBothArms(PC) ? "hands" : "hand";
		let analSkinDesc = either("crinkled", "puckered", "puffy");
		let hasHair = ((PC.pubicHStyle === "bushy" || PC.pubicHStyle === "very bushy") && (PC.pubertyXX > 0 || PC.pubertyXY > 0));
		let analArea = PC.analArea - PC.anus;

		if (PC.anus === 0) {
			r.push(`a <span class="lime">pristine, ${hasHair ? "but slightly hairy" : "untouched"} anus.</span>`);
		} else if (PC.anus === 1) {
			r.push(`a <span class="orange">tight`);
			if (analArea > 3) {
				r.push(`anus</span> surrounded by a massive oval of ${analSkinDesc} ${skinDesc} skin that runs from your tailbone all the way down to the`);
				if (PC.vagina > -1) {
					r.push(`bottom of your pussy.`);
				} else {
					r.push(`base of your cock.`);
				}
			} else if (analArea > 2) {
				r.push(`anus</span> surrounded by an oval of ${analSkinDesc} ${skinDesc} skin that fills your entire buttcrack.`);
			} else if (analArea > 1) {
				r.push(`anus</span> surrounded by a big ring of ${analSkinDesc} ${skinDesc} skin.`);
			} else if (analArea > 0) {
				r.push(`anus</span> surrounded by a ring of ${skinDesc} skin.`);
			} else {
				r.push(`anus.</span>`);
			}
		} else if (PC.anus === 2) {
			r.push(`a <span class="orange">relaxed, experienced`);
			if (analArea > 2) {
				r.push(`anus</span> surrounded by a massive oval of ${analSkinDesc} ${skinDesc} skin that runs from your tailbone all the way down to the`);
				if (PC.vagina > -1) {
					r.push(`bottom of your pussy.`);
				} else {
					r.push(`base of your cock.`);
				}
			} else if (analArea > 1) {
				r.push(`anus</span> surrounded by an oval of ${analSkinDesc} ${skinDesc} skin that fills your entire buttcrack.`);
			} else if (analArea > 0) {
				r.push(`anus</span> surrounded by a big ring of ${analSkinDesc} ${skinDesc} skin.`);
			} else {
				r.push(`anus.</span>`);
			}
		} else if (PC.anus === 3) {
			r.push(`a <span class="orange">loose, broken-in`);
			if (analArea > 1) {
				r.push(`anus</span> surrounded by a massive oval of ${analSkinDesc} ${skinDesc} skin that runs from your tailbone all the way down to the`);
				if (PC.vagina > -1) {
					r.push(`bottom of your pussy.`);
				} else {
					r.push(`base of your cock.`);
				}
			} else if (analArea > 0) {
				r.push(`anus</span> surrounded by an oval of ${analSkinDesc} ${skinDesc} skin that fills your entire buttcrack.`);
			} else {
				r.push(`anus.</span>`);
			}
		} else {
			r.push(`a <span class="orange">gaping`);
			if (analArea > 0) {
				r.push(`anus</span> surrounded by a massive oval of ${analSkinDesc} ${skinDesc} skin that runs from your tailbone all the way down to the`);
				if (PC.vagina > -1) {
					r.push(`bottom of your pussy.`);
				} else {
					r.push(`base of your cock.`);
				}
			} else {
				r.push(`anus.</span>`);
			}
		}
		if (hasHair && PC.anus !== 0) {
			r.push(`It's surrounded by a fair amount of ${PC.pubicHColor} pubic hair.`);
		}
		if (PC.cervixImplant >= 2) {
			r.push(`You have a special pump in your anal cavity that converts fluids to inert filler for your abdominal implant. While it is intended to make anal sex more interesting, it has the unfortunate side-effect of requiring you to be on a special diet to prevent complications.`);
		}
		if (hasAnyArms(PC) && PC.mpreg === 1) {
			if (PC.belly >= 5000) {
				if (PC.bellyPreg >= 2000) {
					r.push(`You run your ${hands} across your pregnancy; it's pretty obvious that you have a womb, but what`);
				} else {
					r.push(`You run your ${hands} across your belly, coming to a stop over your womb. What`);
				}
			} else if (PC.weight > 30) {
				r.push(`You sink a hand into your soft middle, bringing it to rest over your womb. What`);
			} else {
				r.push(`You rest your hand over your womb. What`);
			}
			r.push(`makes this organ so special is that it is connected to your anus.`);
			if (PC.cervixImplant < 2) {
				r.push(`This does require you to be on a special diet , however, to avoid complications.`);
			}
			if (PC.wombImplant === "restraint") {
				r.push(`It's also reinforced to better support large`);
				if (PC.belly >= 400000) {
					r.push(`pregnancies, like yours, but lately it has begun to feel restrictive, almost as if it is strangling your womb.`);
				} else if (PC.bellyPreg >= 150000) {
					r.push(`pregnancies like yours.`);
				} else {
					r.push(`pregnancies.`);
				}
			}
			if (PC.ovaImplant !== 0) {
				if (PC.wombImplant === "restraint") {
					r.push(`You ovaries are modified as well;`);
				} else {
					r.push(`In addition, your ovaries have been modified;`);
				}
				switch (PC.ovaImplant) {
					case "fertility":
						r.push(`a pair of implants have been attached to them in order increase the number of eggs released during ovulation.`);
						break;
					case "sympathy":
						r.push(`a pair of linked implants have been attached to them so that when one releases an egg the other does so as well.`);
						break;
					case "asexual":
						r.push(`one has been replaced with a fabricated sperm sack designed to automatically fertilize any eggs you release.`);
						if (PC.geneticQuirks.superfetation === 2 && (PC.preg > 10 || PC.counter.birthsTotal > 0)) {
							r.push(`This can be a bit of a nuisance, given your penchant for superfetation, as it keeps you in a state of perpetual pregnancy.`);
						}
						if (isFertile(PC)) {
							r.push(`You've been experiencing frequent spontaneous orgasms lately, which means it won't be long until you impregnate yourself${PC.counter.birthSelf > 0 ? " again" : ""}.`);
						}
						break;
				}
			}
		}

		return r.join(" ");
	}

	function freckles() {
		if (V.PC.markings === "freckles") {
			return `Your lower back is covered in a light speckling of freckles alongside your upper butt.`;
		} else if (V.PC.markings === "heavily freckled") {
			return `Your freckles are particularly dense across your lower back and upper butt.`;
		}
	}

	r.push(
		hips(),
		`and around back into`,
		butt(),
		proportion(),
		weight(),
		freckles(),
		`Nestled between your cheeks, you have`,
		anus()
	);

	return r.join(" ");
};