code:
// cSpell:ignore misandristic

/**
 *
 * @param {App.Entity.SlaveState} slave
 * @returns {DocumentFragment}
 */
App.Interact.fBeg = function(slave) {
	const frag = new DocumentFragment();

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

	const {
		hisP,
	} = getPronouns(V.PC).appendSuffix("P");

	const {womenU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
	const hands = hasBothArms(slave) ? "hands" : "hand";
	const knees = hasBothLegs(slave) ? "knees" : "knee";

	const {title: Master, say: say} = getEnunciation(slave);

	const text = new SpacedTextAccumulator(frag);

	// TODO: priority! femPC support!
	// TODO: checks for canWalk() to see how easily she can move, blindness checks, replacement for BoobsDesc, maybe devotion
	// TODO: catches for certain flaws

	text.push(
		intro(),
		setup(),
		consummation(),
	);

	if (random(1, 100) > (100 + slave.devotion)) {
		text.push(slaveGainsFlaw());
	} else if (random(1, 100) > (110 - slave.devotion)) {
		text.push(slaveGainsQuirk());
	}

	text.toParagraph();

	return frag;

	function intro() {
		const text = [];
		// TODO: this part needs expansion
		text.push(`You call ${him} over to you for inspection. ${App.Desc.boobs(slave)}`);

		return text.join(' ');
	}

	function setup() {
		const text = [];

		text.push(`You look at ${him} ${isPlayerLusting() ? "lustfully " : ""} and instruct ${him} to strip.`);

		if (slave.sexualFlaw === "shamefast") {
			text.push(`Tears well up in ${his} eyes at the idea of showing ${his} naked body.`);
		} else if (slave.sexualQuirk === "tease") {
			text.push(`${He} blushes with arousal. ${He} has kept ${his} innate embarrassment at the thought of being naked, but you have infused this with overwhelming arousal. ${His} cheeks are red as ${he} removes ${his} clothes, giving quite a strip tease as ${he} does.`);
		} else if (slave.sexualFlaw === "repressed") {
			text.push(`${He} subconsciously uses ${his} ${hands} to try to cover ${his} body. ${He} is still repressing ${his} own sexuality. That type of behavior may have been allowed in the old world, but it has no place in a Free City.`);
		} else if (slave.sexualFlaw === "idealistic") {
			text.push(`${He} shakes ${his} head pleadingly. ${Spoken(slave, `"But I don't consent,"`)} ${he} responds. You laugh in such a way that tells ${him} that ${his} consent is irrelevant. ${He} is still idealistic, believing that sex should be a consensual expression of love and intimacy. Such ideas were common in the Old World, but they have no place in a Free City. You decide to grab ${him} and forcefully rip ${his} clothes from ${his} body, since obedience could simply be seen as consent. ${He} screams and plead as you`);

			if (hasBothArms(slave)) {
				text.push(`pin ${his} arms,`);
			} else {
				text.push(`hold ${him} in place,`);
			}

			text.push(`ripping and tearing at the cloth that keeps ${his} beauty from sight.`);
		} else if (slave.sexualFlaw === "neglectful") {
			text.push(`${He} replies ${Spoken(slave, `"Yes, ${slave.rudeTitle ? PoliteRudeTitle(slave) : Master},""`)} ${he} replies contritely. ${He} has no sense of self beyond your usefulness of ${him}, and selflessly sacrifices ${his} own comfort for your pleasure.`);
		} else if (slave.sexualFlaw === "attention whore") {
			text.push(`${He} eagerly begins to shirk ${his} wear, drawing as much attention to the process as possible.`);
		} else {
			if (slave.devotion < -20) {
				text.push(`${He} resists, forcing you to undress ${him} yourself.`);
			} else if (slave.devotion >= -20) {
				text.push(`${He} obeys, and moves to the center of your office to disrobe for you.`);
			}
		}

		return text.join(' ');
	}

	function consummation() {
		const text = [];

		if (slave.devotion >= -20) {
			text.push(`${He} begins to undress with`);

			if (slave.skill.entertainment >= 100) {
				text.push(`masterful skill, teasing and taunting all the way down. ${He} rolls ${his} hips and most sexual parts as ${he} removes ${his} clothing.`);
			} else if (slave.skill.entertainment >= 80) {
				text.push(`arousing skill. Even though the goal is just to get ${him} naked, your slave knows that ${his} job is to entertain you with ${his} every move.`);
			} else if (slave.skill.entertainment >= 50) {
				text.push(`notable skill. ${He} takes the opportunity to give you a light strip tease as ${he} undresses.`);
			} else if (slave.skill.entertainment >= 20) {
				text.push(`a decent effort. ${He} isn't your most entertaining slave, but ${he} still makes an effort to arouse you with ${his} undressing.`);
			} else if (slave.skill.entertainment >= 9) {
				text.push(`some effort to be sexy. ${His} moves are less than skillful and the undressing is more pragmatic than arousing.`);
			} else {
				text.push(`no effort to be sexy. ${He} has no entertainment skill, and the only goal of ${his} actions is to go from clothed to naked.`);
			}
		}

		if (slave.fetishStrength > 60) {
			switch (slave.fetish) {
				case "submissive":
					text.push(`As ${he} begins to strip you grab ${him} without warning and begin to tear off ${his} clothes. Your slave expected you to allow ${him} to obey your command, and so ${he} is initially taken aback by the sudden force but ${his} submissive nature keeps ${him} from resisting. ${He} is such a submissive slut that you feel obligation to push ${his} status even further. You bind ${his} arms tightly behind ${his} back in a leather monoglove, lacing it tighter until ${his} elbows are touching. ${He} gives a soft whimper, but you both know that this is for your benefit and not a protest.`);

					if (slave.piercing.nipple.weight >= 1) {
						text.push(`You then retrieve heavy bells and attach them to ${his} nipple rings.`);
					} else {
						text.push(`You reach into your pocket and retrieve two weighted and belled nipple clamps, attaching them tightly to your slave's delicate nipples.`);
					}

					text.push(`You tell ${him} to bounce so that they jingle, reminding ${him} of ${his} status.`);

					break;
				case "masochist":
					text.push(`Once ${he} is fully exposed you give ${him} a firm slap across the tits. ${He}'s a masochist and relishes the pain with sexual arousal. You ask your painslut if ${he} deserves to be punished. ${Spoken(slave, `"Oh yes, ${slave.rudeTitle === 1 ? PoliteRudeTitle(slave) : Master}. Please punish your little slut."`)} Sensing that your slave is getting too much enjoyment from ${his} beating, you cease.`);

					break;
			}
		}

		text.push(`You stare at the naked figure standing before you.`);

		if (canSee(slave)) {
			if (slave.boobsTat === "rude words") {
				text.push(`The words on ${his} chest stand out at you. You ask ${him} what ${his} tits say. ${Spoken(slave, `"Fuckslave,"`)} ${he} replies. You ask if that's what ${he} is.`);

				if (slave.behavioralFlaw === "liberated") {
					text.push(`${Spoken(slave, `"I'm nobody's property. I'm a free ${woman}!"`)} ${he} shoots back. ${Spoken(slave, `"We shall see," you reply.`)}`);
				} else if (slave.devotion < -20) {
					text.push(`${He} does ${his} best to shake ${his} head.`);
				} else {
					text.push(Spoken(slave, `"Yes ${Master}, that's what I am."`));
				}
			} else if (slave.boobsTat === "possessive") {
				text.push(`The words on ${his} chest stand out at you. You ask ${him} what ${his} tits say. ${Spoken(slave, `"It's your personal symbol,"`)} ${he} replies. You ask if that's what ${he} is.`);
				if (slave.behavioralFlaw === "liberated") {
					text.push(Spoken(slave, `"I'm nobody's property. I'm a free ${woman}!" ${he} shoots back. ${Spoken(slave, `"We shall see," you reply.`)}`));
				} else if (slave.devotion < -20) {
					text.push(`${He} does ${his} best to shake ${his} head.`);
				} else {
					text.push(Spoken(slave, `"Yes, ${Master} that's what I am."`));
				}
			} else if (slave.boobsTat === "degradation") {
				text.push(`The words on ${his} chest stand out at you. You ask ${him} what ${his} tits say. " ${Spoken(slave, `${Master}'s Bitch,"`)} ${he} replies. You ask if that's what ${he} is.`);

				if (slave.behavioralFlaw === "liberated") {
					text.push(Spoken(slave, `"I'm nobody's property. I'm a free ${woman}!" ${he} shoots back. ${Spoken(slave, `"We shall see," you reply.`)}`));
				} else if (slave.devotion < -20) {
					text.push(`${He} does ${his} best to shake ${his} head.`);
				} else {
					text.push(Spoken(slave, `"Yes ${Master}, that's what I am."`));
				}
			} else {
				text.push(`${His} body belongs to you, and your slave needs to remember that.`);
			}
		} else {
			text.push(`${His} body belongs to you, and your slave needs to remember that.`);
		}

		text.push(`You then tell your slave to kneel at your feet.`);

		if (slave.behavioralFlaw === "bitchy") {
			text.push(`${He} rolls ${his} eyes at you. ${Spoken(slave, `"Whatever,"`)} ${he} scoffs and`);
		} else if (slave.behavioralFlaw === "arrogant") {
			text.push(`${He} stands up even straighter than before,`);

			if (hasBothArms(slave)) {
				text.push(`crossing ${his} arms and`);
			}

			text.push(`widening ${his} stance. ${His} arrogance makes obeying commands like this difficult, but that is not your concern. You give ${him} a look that tells ${him} that pain will await if ${he} does not obey. ${He}`);
		} else if (slave.behavioralQuirk === "confident") {
			text.push(`${He} confidently moves to obey. ${He}`);
		} else if (slave.behavioralFlaw === "liberated") {
			text.push(`${He} stands up even straighter than before,`);

			if (hasBothArms(slave)) {
				text.push(`crossing ${his} arms and`);
			}

			text.push(`widening ${his} stance. ${Spoken(slave, `"I am not some animal,"`)} ${he} protests, ${Spoken(slave, `"I am a free ${woman}."`)} You laugh at ${his} continued delusions. Liberated ${womenU} have no place in a Free City. You remind ${him} that pain awaits ${him} should ${he} defy you further and ${he}`);
		} else if (slave.behavioralQuirk === "advocate") {
			text.push(`${He} smiles at the demonstration of ${his} rightful place as a lowly slave. ${He}`);
		} else if (slave.behavioralFlaw === "odd") {
			text.push(`${He} sticks ${his} tongue out at you, blowing raspberries in an act of futile defiance. ${He} really is an odd one. ${He}`);
		} else if (slave.behavioralQuirk === "funny") {
			text.push(`${He} smiles and turns ${his} butt to you, swaying it cutely as ${his} silly way of acknowledging your command. ${He}`);
		} else {
			text.push(`${He}`);
		}

		if (slave.devotion < -20) {
			if (slave.trust < -50) {
				text.push(`drops terrified to the ground.`);
			} else {
				if (!canTalk(slave)) {
					text.push(`gestures`);
				} else if (SlaveStatsChecker.checkForLisp(slave)) {
					text.push(`lisps`);
				} else {
					text.push(`declares`);
				}

				text.push(`angrily that slavery is wrong and ${he} will not bow. You look at your assistant who silently summons two other, more obedient slaves from their duties.`);

				if (slave.piercing.nipple.weight > 1) {
					text.push(`You reach out and grab ${him} by ${his} nipple chain, pulling ${him} in harshly. ${He} yelps in pain, but knows better than to pull away.`);
				} else if (slave.piercing.nose.weight > 1) {
					text.push(`You reach out and grab ${him} by ${his} nose ring, pulling ${him} in harshly. ${He} yelps in pain, but knows better than to pull away.`);
				} else {
					text.push(`You reach out and grab ${him} firmly by the collar.`);
				}

				text.push(`"One more chance, slut." By now, the other slaves have arrived and are standing loyally by your side. Your loyal slaves force ${him} to`);

				if (hasAnyLegs(slave)) {
					text.push(`${his} ${knees}.`);
				} else {
					text.push(`the ground.`);
				}
			}

			text.push(`"Head at crotch level," you clarify. "Remember your purpose."`); // TODO: remove player voice
		} else if (slave.devotion < 20) {
			text.push(`is not enthusiastic, but is obedient enough to go down without much threat of discipline.`);
		} else if (slave.devotion > 20) {
			if (slave.fetishKnown === 1) {
				switch (slave.fetish) {
					case "submissive":
						text.push(`bows ${his} head and humbly assumes ${his} rightful position at ${his} ${getWrittenTitle(slave)}'s feet.`);
						break;
					case "dom":
						text.push(`would rather be standing by your side making your other sluts bow, but ${he} still knows that you are ${his} ${getWrittenTitle(slave)}.`);
						break;
					case "sadist":
						text.push(`would rather be pushing one of your other whores painfully to their knees, but ${he} still obeys.`);
						break;
					case "masochist":
						text.push(`waits just long enough to receive a disciplinary slap, making ${him} blush with arousal as ${he} kneels before you.`);
						break;
					case "cumslut":
						text.push(`is excited to be closer to your`);

						if (canTaste(slave)) {
							text.push(`delicious`);
						} else {
							text.push(`heavenly`);
						}

						text.push(`crotch, and hurries to match ${his} eyes to your`);

						if (V.PC.dick > 0) {
							text.push(`package.`);
						} else {
							text.push(`crotch.`);
						}
						break;
					case "humiliation":
						text.push(`makes a big show of it as ${he} lowers ${himself} dramatically before you.`);
						break;
					case "buttslut":
						text.push(`leans heavily forward so that ${his} ass sticks out ridiculously far as ${he}`);

						if (hasAnyLegs(slave)) {
							text.push(`bends ${his} ${knees} and`);
						}

						text.push(`goes to the floor.`);
						break;
					case "pregnancy":
						text.push(`obeys your command and goes to`);

						if (hasBothLegs(slave)) {
							text.push(`${his} knees.`);
						} else {
							text.push(`the floor.`);
						}

						break;
					case "boobs":
						text.push(`pulls ${his} shoulders back strongly while leaning far enough forward to drag ${his}`);

						if (slave.boobs >= 10000) {
							text.push(`weighty mammaries`);
						} else if (slave.boobs >= 2000) {
							text.push(`cumbersome udders`);
						} else if (slave.boobs >= 1000) {
							text.push(`massive slave tits`);
						} else if (slave.boobs >= 800) {
							text.push(`forward-thrust breasts`);
						} else if (slave.boobs >= 500) {
							text.push(`meager chest`);
						} else if (slave.boobs <= 400) {
							text.push(`pathetic slave boobs`);
						} else {
							text.push(`tits`);
						}

						text.push(`across your body as ${he} goes down.`);
						break;
					default:
						text.push(`obeys your command and goes to`);

						if (hasBothLegs(slave)) {
							text.push(`${his} knees.`);
						} else {
							text.push(`the floor.`);
						}
				}
			} else {
				text.push(`obeys your command and goes to`);

				if (hasBothLegs(slave)) {
					text.push(`${his} knees.`);
				} else {
					text.push(`the floor.`);
				}
			}
		}

		if (slave.devotion < -20) {
			text.push(`The other slaves guide ${him} to adjust ${his} posture so ${his} eyes are directly in line with your`);

			if (V.PC.dick > 0) {
				text.push(`package.`);
			} else {
				text.push(`crotch.`);
			}
		} else {
			text.push(`${He} kneels so that ${his} eyes are directly level with your`);

			if (V.PC.dick > 0) {
				text.push(`package.`);
			} else {
				text.push(`crotch.`);
			}
		}

		if (V.PC.dick > 0) {
			if (slave.energy > 50) {
				text.push(`${He} cant help but stare in lust at your`);
				if (V.PC.balls >= 30) {
					text.push(`monstrous, massive pair of watermelon sized balls.`);
				} else if (V.PC.balls >= 14) {
					text.push(`enormous, heavy pair of balls.`);
				} else if (V.PC.balls >= 9) {
					text.push(`huge pair of balls, bulging like softballs from behind your suit.`);
				} else if (V.PC.balls >= 5) {
					text.push(`large pair of balls, swinging heavily as you move.`);
				} else {
					text.push(`manly package.`);
				}
			} else if (V.PC.scrotum > 0) {
				text.push(`Your balls loom directly in front of ${his} face.`);
			}
		}

		text.push(`Now kneeling at your feet naked before you, your slave waits for ${his} ${getWrittenTitle(slave)}'s command. You take some time to survey the slut's properly displayed body.`);

		if (slave.butt > 6) {
			text.push(`${His} massive ass is so huge that ${he} it squishes around ${his} ${hasBothLegs(slave) ? `heels` : `heel`}, almost reaching the floor.`);
		} else if (slave.butt > 4) {
			text.push(`${His} ${either("ass", "rear end")} is so round and large it rolls out from ${his} back in two perfect mounds. The cheeks are so thick it forms a perfect crevice between them, more than a couple`);

			if (V.showInches === 2) {
				text.push(`inches`);
			} else {
				text.push(`centimeters`);
			}

			text.push(`deep.`);
		} else if (slave.butt > 2) {
			text.push(`${His} nice ${either("plump", "thick")} ${either("ass", "butt")} curves out noticeably, even while ${he} sits on ${his} ${knees}.`);
		} else {
			text.push(`${His} cute and tight ass rests gently on ${his} ${hasBothLegs(slave) ? `ankles` : `ankle`}.`);
		}

		if (slave.energy > 95) {
			text.push(`${His} eyes fill with lust at the helplessness of kneeling at your crotch.`);
		}
		if (slave.fetishKnown === 1) {
			if (slave.fetishStrength > 60) {
				switch (slave.fetish) {
					case "submissive":
						text.push(`${He} keeps ${his} eyes down and poises ${his} body to be fully available to ${his} ${getWrittenTitle(slave)}, trying to model for you the image of the perfect submissive.`);
						break;
					case "dom":
						text.push(`Despite ${his} kneeling stature, ${his} back is straight and shoulders back.`);
						break;
					case "masochist":
						text.push(`${He} positions ${himself} uncomfortably, bringing visual pleasure to you and pain to ${himself}. ${He} accentuates ${his} most sensitive parts, inviting you to slap or spank them.`);
						break;
					case "cumslut": {
						text.push(`${he} goes to ${his} ${knees}, all the while staring at your`);

						const pcCrotch = [];

						if (V.PC.dick !== 0) {
							pcCrotch.push(`manly bulge`);
						}
						if (V.PC.vagina !== -1) {
							pcCrotch.push(`feminine mound`);
						}

						text.push(`${toSentence(pcCrotch)}.`);
						break;
					}
					case "humiliation":
						text.push(`${He} eagerly takes to this humiliating position, hoping to demonstrate ${his} willingness to be degraded by ${his} ${getWrittenTitle(slave)}.`);
						break;
					case "buttslut":
						text.push(`${He} positions ${himself}, sticking ${his} butt out as far as ${he} can manage, hoping to draw your attention to ${his} favorite area.`);
						break;
					case "boobs":
						text.push(`${he} kneels with ${his} back strongly arching far back and diligently works to touch ${his} elbows behind ${his} back to best display ${his}`);

						if (slave.boobs >= 10000) {
							text.push(`colossal mammaries`);
						} else if (slave.boobs >= 2000) {
							text.push(`gigantic udders`);
						} else if (slave.boobs >= 1000) {
							text.push(`massive slave tits`);
						} else if (slave.boobs >= 800) {
							text.push(`prominent breasts`);
						} else if (slave.boobs >= 400) {
							text.push(`modest chest`);
						} else if (slave.boobs <= 400) {
							text.push(`pathetic slave boobs`);
						}

						text.push(`for ${his} ${getWrittenTitle(slave)}.`);

						if (slave.lactation > 0) {
							text.push(`Milk dribbles down the soft curves of ${his} chest as a further sign of ${his} arousal.`);
						}

						text.push(`This is, of course, how all slaves are supposed to kneel, but ${he} takes the pose with added dedication.`);
						break;
					default:
						text.push(`${He} positions ${himself} with ${his} ${knees} spread wide, hoping that you will turn your attention to`);

						if (canDoVaginal(slave)) {
							text.push(`${his} wet pussy.`);
						} else if (canAchieveErection(slave)) {
							text.push(`${his} hard cock.`);
						} else {
							text.push(`${him}.`);
						}
				}
			}
		}

		text.push(`You give ${him} permission to speak, and tell ${him} that ${he} may beg ${his} ${getWrittenTitle(slave)}.`);

		if (slave.devotion < -20) {
			if (slave.trust < -50) {
				switch (slave.rules.punishment) {
					case "confinement":
						text.push(`Your slave simply`);

						if (hasAnyArms(slave)) {
							text.push(`presses ${his} ${hands} together and`);
						}

						text.push(`begs you not to lock ${him} up in the bad-${girl} box.`);
						break;
					case "whipping":
						text.push(`Your slave simply`);

						if (hasAnyArms(slave)) {
							text.push(`presses ${his} ${hands} together and`);
						}

						text.push(`begs you not to whip ${him}.`);
						break;
					case "chastity":
						if (slave.energy > 60) {
							text.push(`Your slave simply presses ${his} ${hands} together and begs you not to take away ${his} next orgasm`);
						} else {
							text.push(`Your slave simply asks that you not change ${his} punishment. ${He} fears you, but using chastity as a punishment is not an efficient way to command ${his} obedience, since ${he} has no sexual energy.`);
						}
				}
			} else {
				if (slave.behavioralFlaw === "bitchy") {
					text.push(`${He} turns ${his} nose up in utter disgust. ${Spoken(slave, `"Why, to feed your ${girl === "boy" ? `misandristic` : `misogynistic`} ego? Thanks, but no."`)} ${He} looks at your other slaves holding ${him} down, ${Spoken(slave, `"Why don't you get one of these mindless cunts to do it? Or are they not hot enough?"`)} ${He} is disobedient and bitchy, a bad combo.`);
				} else if (slave.behavioralFlaw === "arrogant") {
					text.push(`${He} tries to cock ${his} shoulders back, giving a death glare to the slaves holding ${him} in place, ${Spoken(slave, `"I don't need anything from you,"`)} ${he} hisses. ${He} is disobedient and arrogant, a bad combo.`);
				} else if (slave.behavioralFlaw === "liberated") {
					text.push(`${He} does ${his} best to spit in your face, but the height difference means ${he} only stains your shirt. ${Spoken(slave, `"I demand you release me!"`)} ${he} scowls, ${Spoken(slave, `"Or I'm going to call the police!"`)} You smile at ${his} pathetically outdated worldview. You tell ${him} that's a good idea, since you know how rebellious slaves fare in jail.`);
				} else if (slave.behavioralFlaw === "odd") {
					text.push(`${He} purses ${his} lips and bounces on ${his} heels in futile rebellion. ${Spoken(slave, `"Nuh-uh."`)} ${he} puffs, shaking ${his} head wildly.`);
				} else {
					text.push(`${He} simply sits there, struggling against the hands holding ${him} down.`);
				}
			}

			text.push(`This is clearly the best you are going to get out of ${him} until ${he} is better trained. You`);

			if (slave.trust >= -50) {
				text.push(`signal your loyal slaves to lift ${him} to ${his} feet, and`);
			}

			text.push(`send ${him} away for now.`);
		} else if (slave.devotion < 20) {
			if (slave.behavioralFlaw === "bitchy") {
				text.push(`${He} turns ${his} nose up in utter disgust. ${Spoken(slave, `"Why, to feed your ${girl === "boy" ? `misandristic` : `misogynistic`} ego? Thanks, but no."`)} ${He} looks at your other slaves holding ${him} down, ${Spoken(slave, `"Why don't you get one of these mindless cunts to do it? Or are they not hot enough?"`)} ${He} is disobedient and bitchy, a bad combo.`);
			} else if (slave.behavioralFlaw === "arrogant") {
				text.push(`${He} tries to cock ${his} shoulders back, giving a death glare to the slaves holding ${him} in place, ${Spoken(slave, `"I don't need anything from you,"`)} ${he} hisses. ${He} is disobedient and arrogant, a bad combo.`);
			} else if (slave.behavioralFlaw === "liberated") {
				text.push(`${He} does ${his} best to spit in your face, but the height difference means ${he} only stains your shirt. ${Spoken(slave, `"I demand you release me!"`)} ${he} scowls, ${Spoken(slave, `"Or I'm going to call the police!"`)} You smile at ${his} pathetically outdated worldview. You tell ${him} that's a good idea, since you know how rebellious slaves fare in jail.`);
			} else if (slave.behavioralFlaw === "odd") {
				text.push(`${He} purses ${his} lips and bounces on ${his} heels in futile rebellion. ${Spoken(slave, `"Nuh-uh."`)} ${he} puffs, shaking ${his} head wildly.`);
			} else if (slave.sexualFlaw === "shamefast") {
				text.push(`${He} tries to cover ${his} naked body from your gaze ${Spoken(slave, `"Please, can I just put some clothes on?"`)}`);
			} else {
				text.push(`${He} looks up at you with a sudden glimpse of hope, and begins to plead, ${Spoken(slave, `"Please, sir, please set me free. I don't want to be here.`)}`);

				if (slave.energy < 50) {
					text.push(Spoken(slave, `I have no desire for sex. I don't want to be your toy! Please let me go."`));
				} else {
					text.push(Spoken(slave, `I might even come back to share consensual love with you. I just don't want to be property. Please, let me go."`));
				}
			}

			text.push(`You tell your slave to rise to ${his} feet. Even though ${he} desired the impossible, it wasn't a total waste. You feel as though you have a pretty good understanding of where your slave stands. You send ${him} away with ${his} request denied, and you resolve to break ${him} more in the coming weeks.`);
		} else if (slave.devotion <= 60) {
			text.push(`Your slave looks at ${his} ${getWrittenTitle(slave)} with obedient eyes.`);
		} else if (slave.devotion <= 100) {
			text.push(`Your devoted slave takes the begging position,`);
			if (slave.fetish !== "submissive") {
				text.push(`${he} even brings ${his} ${hands} up like a dog's paws.`);
			} else {
				if (slave.fetishKnown === 1 && slave.fetishStrength > 60) {
					text.push(`and ${he} bows ${his} head in total submission.`);

					if (slave.piercing.nipple.weight > 0) {
						text.push(`The armbinder thrusts ${his} tits out nicely, and ${his} nipple rings are pulled tight by the weighted bells weighing them down.`);
					} else if (slave.piercing.nipple.weight > 1) {
						text.push(`The armbinder thrusts ${his} tits out nicely, and ensures that ${his} nipple chains are pulled tight by the angle of ${his} shoulders. The bells on ${his} nipple piercings jungle sweetly as ${he} breathes.`);
					} else {
						text.push(`The armbinder thrusts ${his} tits out nicely and ${his} nipples are now red from the clamps pressing down hard on ${his} sensitive flesh. Every painful shudder makes the bells jungle ever so sweetly.`);
					}
				} else {
					text.push(`${he} even brings ${his} ${hands} up like a dog's paws.`);
				}
			}

			text.push(Spoken(slave, `"Yes ${Master}. Thank you, ${Master}." ${He} is fully subservient to you, and would do anything to please you.`));
		}

		if (slave.devotion > 20) {
			// TODO: eventually plan to make a string of Paraphilia text, which will be stronger versions of their fetish counterparts.
			if (slave.fetishKnown === 1) {
				if (slave.fetishStrength > 60) {
					switch (slave.fetish) {
						case "submissive":
							text.push( `${He} adjusts ${his} monoglove behind ${his} back, jingling ${his} nipple bells as ${he} does. ${Spoken(slave, `"Please ${Master},"`)} ${he} begs with genuine humility, ${Spoken(slave, `"please use your slave in whatever way you see fit. This slave has no purpose but to please ${his} ${Master}."`)}`);
							break;
						case "dom":
							text.push( `${He} looks up at you. Even from ${his} kneeling position ${his} eyes carry confident domination. ${Spoken(slave, `"${Master}, I know my place is beneath you. Give me the authority to lord over your other slaves and I will force them to serve you as I do."`)}`);
							break;
						case "masochist":
							text.push (`${Spoken(slave, `"I know I haven't disobeyed,"`)} ${he} begins, ${Spoken(slave, `"but I just need to be punished."`)} You smile down at your little painslut, running your finger along ${his} chin. ${Spoken(slave, `"Please ${Master}, beat me. Beat my ass until it's red and clamp my nipples until they bleed. Please! I need to feel your strength!"`)}`);
							break;
						case "cumslut":
							text.push(`Your little cumslut can't stop staring at your`);

							if (V.PC.balls >= 30) {
								text.push(`monstrous, massive pair of watermelon sized balls.`);
							} else if (V.PC.balls >= 14) {
								text.push(`enormous, heavy pair of balls.`);
							} else if (V.PC.balls >= 9) {
								text.push(`huge pair of balls, bulging like softballs from behind your suit.`);
							} else if (V.PC.balls >= 5) {
								text.push(`large pair of balls, swinging heavily as you move.`);
							} else {
								text.push(`crotch.`);
							}

							text.push( `Drool begins to drip from ${his} lips, and you have to remind your slave that ${he} is here to beg. ${Spoken(slave, `"${Master},"`)} ${he} breathes heavily, ${Spoken(slave, `"Please let me`)}`);

							if (V.PC.dick !== 0) {
								text.push(Spoken(slave, `suck your magnificent`));
								if (V.PC.vagina !== -1) {
									text.push(Spoken(slave, `cock and eat you out,`));
								} else {
									text.push(Spoken(slave, `cock,`));
								}
							} else {
								text.push(Spoken(slave, `eat your delicious pussy,`));
							}

							text.push(Spoken(slave, `please." You smile at the little cocksucker, so eager to please.`));
							break;
						case "humiliation":
							text.push(`${He} sits so that ${his} body is on full display, ${Spoken(slave, `"Please ${Master}, use me and humiliate me. Take me out to the public square so that everyone can see you overpower me."`)}`);
							break;
						case "buttslut":
							text.push(`${He} positions ${his} back so ${his} ass sticks out even further ${Spoken(slave, `"${Master},"`)} ${he} begs, ${Spoken(slave, `"use my ass!${(slave.sexualQuirk === 'painal queen') ? ' Make me squeal!' : ''}${V.PC.dick > 0 ? ' I just need your cock in my most useful fuckhole, please!' : ''}"`)}`);
							break;
						case "boobs":
							text.push(`${He}`);

							if (!hasAnyArms(slave)) {
								text.push(`leans ${his} head back and juts out ${his} tits, raising`);
							} else {
								text.push(`takes ${his} ${hands} and presses ${his} tits together, lifting`);
							}

							text.push(`them to display for you ${his} primary purpose in life.`);

							if (slave.lactation > 0) {
								text.push(`More milk`);

								if (!hasAnyArms(slave)) {
									text.push(`dribbles`);
								} else {
									text.push(`squirts`);
								}

								text.push(`from each teat as ${he} bears them.`);
							}

							text.push(Spoken(slave, `"I beg of you, ${Master}, I need you to use my tits. Suck them, squeeze them, fuck them, I cannot cum without you using my slave tits! I am nothing more than a ${canWalk(slave) ? `walking ` : ``}tit-carrier, and my only purpose is to offer these breasts to you."`));
							break;
						case "pregnancy":
							text.push(`${He} begins to`);

							if (hasAnyArms(slave)) {
								text.push(`caress`);
							} else {
								text.push(`stick out`);
							}

							text.push(`${his} stomach. ${Spoken(slave, `"Use me as your breeder, ${Master}, please! I just want to ${slave.pregSource === -1 ? 'be filled with your seed' : 'bear your children'} forever!"`)}`);
							break;
						default:
							text.push(`${He} kneels`);

							if (hasBothLegs(slave)) {
								text.push(`with ${his} legs far spread.`);
							} else {
								text.push(`on the floor.`);
							}

							text.push(Spoken(slave, `"Use my fuckhole ${Master}, I beg you. Please, I need you to fuck me!"`));
					}
				} else {
					text.push(Spoken(slave, `"${Master}, I exist to serve you." ${He} ${say}s, ${Spoken(slave, `"I have no other purpose in life. I beg of you, please never let me leave your service. Let me wait on you forever. I swear I will always be obedient. Let me cook your meals, clean your penthouse, care for your other slaves, even make me a cow. I don't care, as long as I'm here serving you." ${He} knows that ${his} rightful place is a slave, and ${he} is dedicated to living out that role to the fullest.`)}`));

					if (slave.behavioralQuirk === "advocate") {
						text.push(Spoken(slave, `"I see now," ${he} continues, "that slavery really is a ${woman}'s rightful place. ${He} has no purpose except to serve ${his} ${Master}."`));
					}
				}
			} else {
				text.push(Spoken(slave, `"${Master}, I exist to serve you." ${He} says, ${Spoken(slave, `"I have no other purpose in life. I beg of you, please never let me leave your service. Let me wait on you forever. I swear I will always be obedient. Let me cook your meals, clean your penthouse, care for your other slaves, even make me a cow. I don't care, as long as I'm here serving you."`)} ${He} knows that ${his} rightful place is a slave, and ${he} is dedicated to living out that role to the fullest.`));

				if (slave.behavioralQuirk === "advocate") {
					text.push(Spoken(slave, `"I see now," ${he} continues, ${Spoken(slave, `"that slavery really is a ${woman}'s rightful place. ${He} has no purpose except to serve ${his} ${Master}."`)}`));
				}
			}

			text.push(`You smile at your obedient little slave, and agree to grant ${his} request.`);
		}

		return text.join(' ');
	}

	function slaveGainsFlaw() {
		if (slave.fetish !== "submissive" && slave.energy <= 95 && slave.behavioralFlaw !== "liberated") {
			slave.behavioralFlaw = "liberated";

			return `Seeing the humiliating acts your slaves are expected to perform has made ${him} <span class="flaw gain">determined to be free.</span>`;
		}

		return ``;
	}

	function slaveGainsQuirk() {
		if (slave.fetish === Fetish.NONE && slave.behavioralFlaw !== "liberated") {
			slave.fetish = "submissive";
			slave.fetishKnown = 1;

			return `Feeling the joy of kneeling before such a powerful ${getWrittenTitle(slave)} and begging at ${hisP} feet has <span class="fetish gain">encouraged ${him} to be more submissive.</span>`;
		}

		return ``;
	}
};


code:
/**
 *
 * @param {App.Entity.SlaveState} slave
 * @returns {DocumentFragment}
 */
App.Interact.fBellyFuck = function(slave) {
	const frag = new DocumentFragment();

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

	seX(slave, canDoVaginal(slave) ? "vaginal" : "anal", V.PC);

	const text = new SpacedTextAccumulator(frag);

	text.push(
		intro(),
		setup(),
		consummation(),
	);

	text.toParagraph();

	return frag;

	function intro() {
		const text = [];

		text.push(`You have ${him} brought to you so that you can fuck ${his} hyperpregnant body.`);

		if (tooBigBelly(slave)) {
			text.push(`${He} is pinned to the ground by ${his}`);

			if (slave.bellyPreg >= 1000000) {
				text.push(`impossibly exploded baby bump,`);
			} else if (slave.bellyPreg >= 750000) {
				text.push(`massively swollen baby bump,`);
			} else if (slave.bellyPreg >= 600000) {
				text.push(`titanic baby belly,`);
			} else {
				text.push(`massive belly,`);
			}

			text.push(`and won't be a particularly able lover because of this, but enjoying ${his} immobility is half the point.`);
		} else if (!hasAnyLegs(slave)) {
			text.push(`${He} has no limbs to stand on, so ${he} is left resting atop ${his}`);

			if (slave.bellyPreg >= 1000000) {
				text.push(`impossibly exploded baby bump.`);
			} else if (slave.bellyPreg >= 750000) {
				text.push(`massively swollen baby bump.`);
			} else if (slave.bellyPreg >= 600000) {
				text.push(`titanic baby belly.`);
			} else {
				text.push(`massive belly.`);
			}

			text.push(`${He} won't be a particularly able lover, but enjoying ${his} immobility is half the point.`);
		} else if (!canStand(slave)) {
			text.push(`${He} can't support ${himself}, so ${he} is left leaning against ${his}`);

			if (slave.bellyPreg >= 1000000) {
				text.push(`impossibly exploded baby bump.`);
			} else if (slave.bellyPreg >= 750000) {
				text.push(`massively swollen baby bump.`);
			} else if (slave.bellyPreg >= 600000) {
				text.push(`titanic baby belly.`);
			} else {
				text.push(`massive belly.`);
			}

			text.push(`${He} won't be a particularly able lover, but enjoying ${his} immobility is half the point.`);
		} else {
			text.push(`${He} can still stand despite ${his}`);
			if (slave.bellyPreg >= 1000000) {
				text.push(`impossibly exploded baby bump,`);
			} else if (slave.bellyPreg >= 750000) {
				text.push(`massively swollen baby bump,`);
			} else if (slave.bellyPreg >= 600000) {
				text.push(`titanic baby belly,`);
			} else {
				text.push(`massive belly,`);
			}

			text.push(`though ${he} is still too restricted to be a particularly able lover, but enjoying this obstacle is half the point.`);
		}

		text.push(`Once ${he} is situated in the center of your office, you walk a circle around ${him}, taking special care to`);

		if (slave.bellyTat === "a heart") {
			text.push(`trace a hand over the obliterated heart-shaped tattoo on the front of ${his} immensely stretched belly.`);
		} else if (slave.bellyTat === "a star") {
			text.push(`trace a hand over the obliterated star-shaped tattoo on the front of ${his} immensely stretched belly.`);
		} else if (slave.bellyTat === "a butterfly") {
			text.push(`trace a hand over the obliterated butterfly tattoo on the front of ${his} immensely stretched belly.`);
		} else {
			text.push(`trace a hand over the obliterated, stretched out expanse of slightly darker flesh where ${his} belly button used to be.`);
		}

		return text.join(' ');
	}

	function setup() {
		const text = [];

		if (slave.devotion > 95) {
			text.push(`${He} purrs in response to your touch, leaning forward against ${his} belly, and`);

			if (!hasAnyLegs(slave)) {
				text.push(`wiggles`);
			} else {
				text.push(`lifts ${his} toes off the ground as ${he}`);
				if (hasBothLegs(slave)) {
					text.push(`spreads ${his} legs`);
				} else {
					text.push(`moves ${his} leg`);
				}
			}

			text.push(`in preparation for you.`);
		} else if (slave.trust < -20 && slave.devotion > -10) {
			text.push(`${He} groans at your touch.`);
		} else {
			text.push(`${He} winces at your touch.`);
		}

		text.push(`When you get to ${his} rear, you slap ${his}`);

		if (slave.butt > 11) {
			text.push(`insanely enormous ass,`);
		} else if (slave.butt > 5) {
			text.push(`huge ass,`);
		} else if (Math.floor(slave.buttImplant/slave.butt) > .60) {
			text.push(`jiggly, saline-filled ass,`);
		} else if (slave.butt > 2) {
			text.push(`thick ass,`);
		} else {
			text.push(`pert ass,`);
		}

		text.push(`and then spread ${his} cheeks for easier access to ${his}`);

		if (canDoVaginal(slave)) {
			text.push(
				`cunt.`,
				VCheck.Vaginal(slave, 1),
			);
		} else {
			text.push(
				`asshole.`,
				VCheck.Anal(slave, 1),
			);
		}

		return text.join(' ');
	}

	function consummation() {
		const text = [];

		text.push(`Heaving upward, you push ${him} fully onto ${his} belly, then lean into ${him}, fucking ${him} in a unique spin on the wheelbarrow position`);

		if (V.PC.dick === 0) {
			text.push(`with your strap-on`);
		}

		text.push(`and setting ${his} tightly packed gut to jiggling. ${He} moans in mixed pain and pleasure as you bring ${him} over the edge and, by the time you finish with ${him} and allow ${him} to return to ${his} duties, it's clear`);

		if (slave.belly > slave.pregAdaptation * 2000) {
			text.push(`that your recent escapades <span class="health dec">have done lasting damage to ${his} body.</span>`);
			healthDamage(slave, 10);
		} else {
			text.push(`that you've left ${him} thoroughly exhausted.`);
		}

		return text.join(' ');
	}
};

repo_name: Ducati/fc

license: mit


code:
/**
 *
 * @param {App.Entity.SlaveState} slave
 * @returns {DocumentFragment}
 */
App.Interact.fBoobs = function(slave) {
	const node = new DocumentFragment();
	let r = [];

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

	seX(slave, "mammary", V.PC, "penetrative");

	r.push(`You call ${him} over so you can play with ${his}`);
	if (slave.boobs >= 20000) {
		r.push(`colossal`);
	} else if (slave.boobs >= 10000) {
		r.push(`massive`);
	} else if (slave.boobs >= 5000) {
		r.push(`monster`);
	} else if (slave.boobs >= 1000) {
		r.push(`huge`);
	} else if (slave.boobsImplant > 250) {
		r.push(`fake`);
	} else if (slave.boobs >= 650) {
		r.push(`big`);
	} else if (slave.boobs >= 300) {
		r.push(`small`);
	} else {
		r.push(`flat`);
	}
	r.push(`tits.`);

	if (slave.boobsTat === "tribal patterns") {
		r.push(`The tattoos on ${his} breasts certainly draw attention to ${his} nipples.`);
	} else if (slave.boobsTat === "scenes") {
		r.push(`The tattoos on ${his} abdomen nicely illustrate what you mean to do with ${him}: a titfuck.`);
	} else if (slave.boobsTat === "degradation") {
		r.push(`The tattoos on ${his} chest are asking you to use those breasts, after all.`);
	}

	if (slave.nipples === "huge") {
		r.push(`${His} nipples are so large they give ${his} breasts an unavoidably lewd appeal as they jut outward.`);
	} else if (slave.nipples === "puffy") {
		r.push(`${His} puffy nipples beg to be sucked.`);
	} else if (slave.nipples === "flat") {
		r.push(`${His} nipples are stretched nearly flat by ${his} implants, reducing them to two lewd little buttons.`);
	} else if (slave.nipples === "partially inverted" && slave.piercing.nipple.weight === 0) {
		r.push(`${His} partially inverted nipples should protrude at the slightest stimulation.`);
	} else if (slave.nipples === "inverted" && slave.piercing.nipple.weight === 0) {
		r.push(`${His} inverted nipples form lewd little creases across ${his} areolae.`);
	} else if (slave.nipples === "fuckable") {
		if (slave.lactation) {
			r.push(`${His} nipplecunts are leaking milk and begging to be penetrated.`);
		} else {
			r.push(`${His} nipplecunts form lewd little slits across ${his} areolae.`);
		}
	}

	if (slave.piercing.nipple.weight > 1 && !hasAnyLegs(slave)) {
		r.push(`You carry ${him} over, playing with the chain between ${his} nipples.`);
	} else if (slave.piercing.nipple.weight > 1) {
		r.push(`You pull ${him} over by the chain between ${his} nipples.`);
	} else if (slave.piercing.nipple.weight === 1) {
		r.push(`${His} nipple piercings glint enticingly.`);
	}

	if (V.PC.belly >= 5000) {
		if (V.PC.dick !== 0) {
			r.push(`You lay ${him} down on the couch on ${his} back, lather oil onto ${his} breasts and gingerly straddle ${his} face; your stiff prick between ${his} tits and under your belly, and your needy cunt over ${his} mouth.`);
			if (slave.boobs >= 20000) {
				r.push(`${His} breasts are so colossal you can barely maintain this position. They completely devour your dick and threaten to swallow up your pregnant belly as well. Between ${his} licking, and the fleshy prison surrounding your privates, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`);
			} else if (slave.boobs >= 10000) {
				r.push(`${His} breasts are so massive you can barely maintain this position. They completely devour your dick and swell around the sides of your pregnancy as well. Between ${his} licking, and the fleshy prison surrounding your privates, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`);
			} else if (slave.boobs >= 5000) {
				r.push(`${His} breasts are so monstrous they completely devour your dick and tickle your pregnant belly. Pushing ${his} breasts together under your gravidness, you thrust between them and the underside of your middle, all the while rubbing your pussy into ${his} face. With ${his} licking, and all the flesh against your cock, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`);
			} else if (slave.boobs >= 1000) {
				r.push(`${His} huge breasts fill the area under your pregnancy nicely. Pushing them together under your gravidness, you thrust between them and the underside of your middle, all the while rubbing your pussy into ${his} face. With ${his} licking, and all the flesh against your cock, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`);
			} else if (slave.boobsImplant > 250) {
				r.push(`${His} fake breasts fill the area under your pregnancy nicely. Pushing them together under your gravidness, you thrust between them and the underside of your middle, all the while rubbing your pussy into ${his} face. With ${his} licking, and all the flesh against your cock, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`);
			} else if (slave.boobs >= 650) {
				r.push(`${His} big breasts fill the area under your pregnancy nicely. You thrust between them and the underside of your middle, all the while rubbing your pussy into ${his} face. With ${his} licking, and all the flesh against your cock, it doesn't take long for you to soak ${his} face and plant your seed deep into ${his} cleavage.`);
			} else if (slave.boobs >= 300) {
				r.push(`You have to feel around under your pregnancy to hold your cock against ${his} tiny breasts. You thrust against them and your hand, while the other teases your middle, all the while rubbing your pussy against ${his} face. Between ${his} licking, and your own teasing, it doesn't take long for you to soak ${his} face and splatter your seed across ${his} front.`);
			} else {
				r.push(`You have to lean forward and pin your cock against ${his} flat chest with the underside of your own pregnancy to make any real channel to thrust into. You fondle your belly${(V.PC.boobs >= 300) ? ` and breasts` : ``}, all the while rubbing your pussy against ${his} face. Between ${his} licking, and your own teasing, it doesn't take long for you to soak ${his} face and splatter your seed across your underbelly and ${his} front. You turn around and have ${his} lick you clean before pulling your gravid bulk off of ${him}.`);
			}
		} else {
			r.push(`You lay ${him} down on the couch on ${his} back, lather oil onto ${his} breasts and gingerly straddle ${his} face; your needy cunt over ${his} mouth.`);
			if (slave.boobs >= 20000) {
				r.push(`${His} breasts are so colossal you can barely maintain this position, but they are massively fun to play with as ${he} eats you out. You massage your pregnancy with ${his} acres of breast flesh, teasing your own stretched skin with ${hers}. You can visibly see the vibrations running through ${his} tits as you quiver from the mouth working your pussy. Thoroughly soaking ${him}, you fall into ${his} endless cleavage for a short rest.`);
			} else if (slave.boobs >= 10000) {
				r.push(`${His} breasts are so massive you can barely maintain this position, but they are fun to play with as ${he} eats you out. You massage the edges of your pregnancy with ${his} breast flesh, teasing your own stretched skin with ${hers}. You can visibly see the vibrations running through ${his} tits as you quiver from the mouth working your pussy. Thoroughly soaking ${him}, you fall into ${his} immense cleavage for a short rest.`);
			} else if (slave.boobs >= 5000) {
				r.push(`${His} breasts are so monstrous they make a fabulous rest for your pregnancy as ${he} eats you out. You tease ${his} breasts using your baby bump, rubbing it against them and vice versa. You can visibly see the vibrations running through ${his} tits as you quiver from the mouth working your pussy. Thoroughly soaking ${him}, you dismount and lean against ${his} monster breasts for a quick rest.`);
			} else if (slave.boobs >= 1000) {
				r.push(`${His} breasts are huge enough to support your pregnancy as ${he} eats you out. You press your belly more and more into them as ${his} tongue delves deeper into your folds. You can visibly see the vibrations running through the breast flesh forced to the sides of your middle as you quiver from the mouth working your pussy. Thoroughly soaking ${him}, you dismount and lean against ${his} huge breasts for a quick rest.`);
			} else if (slave.boobs >= 650) {
				r.push(`${His} big breasts fill the area under your pregnancy nicely. You press your belly more and more into them as ${his} tongue delves deeper into your folds. You can visibly see the vibrations running through the breast flesh forced to the sides of your middle as you quiver from the mouth working your pussy. Thoroughly soaking ${him}, you dismount and lean against ${his} big breasts for a quick rest.`);
			} else if (slave.boobs >= 300) {
				r.push(`${His} tiny breasts are completely covered by your pregnancy. You reach under yourself, grabbing what you can of ${his} breasts and pushing them against your crotch. Between rubbing ${his} breasts against your self and ${his} tongue in your pussy, you quickly climax, thoroughly soaking ${him}.`);
			} else {
				r.push(`${His} flat chest is completely covered by your pregnancy. Reach under yourself, you feel around until you find ${his} nipples. You tease ${his} flat chest until you're at you limit, thoroughly soaking ${him}, before dismounting and returning to your desk.`);
			}
		}
	} else if (isAmputee(slave)) {
		if (V.PC.dick !== 0) {
			r.push(`${His} limbless`);
			if (V.seeRace === 1) {
				r.push(slave.race);
			}
			r.push(`torso makes ${him} a unique appliance for mammary intercourse. You lay ${him} down on the ground on ${his} back, lube ${his} cleavage, and straddle ${his} torso. With your cock between ${his} breasts, you`);
			if (slave.boobs >= 650) {
				r.push(`squash ${his} tits together to form a nice lubricated channel,`);
			} else {
				r.push(`hold your cock in place,`);
			}
			r.push(`and ride back and forth on ${him}.`);
			if (V.PC.vagina !== -1) {
				r.push(`Your pussylips rub deliciously across ${his} sternum.`);
			}
			r.push(`${He} has some trouble breathing under the assault, but ${he} manages. And for the finale, ${he}'s totally unable to avoid a perfect cumshot.`);
		} else if (V.PC.boobs >= 300) {
			r.push(`You set ${his} limbless torso upright on your lap, facing you, so that your breasts and ${hers} are resting heavily against one another. ${He} turns ${his} head to avoid getting splashed in the eyes as you add a generous coating of oil to the heaving breastflesh. You reach around to grab ${him} by the hips and slide ${him} up and down, giving you both a wonderful mammary oil massage.`);
		} else {
			r.push(`You set ${his} limbless torso on the floor, and tease ${him} for a while until ${his} nipples are rock hard. This done, you kneel down on ${him} with each of your legs aside ${his} torso, and hump your pussy back and forth on the stiff nub of one nipple. ${He} lies there, unable to do anything but comply, squirming with the stimulation.`);
		}
	} else if (tooBigBelly(slave)) {
		if (V.PC.dick !== 0) {
			r.push(`${His} excessively large belly makes ${him} a unique appliance for mammary intercourse. You lay ${him} down on the ground on ${his} back, lube ${his} cleavage, and gingerly fit yourself between ${his} belly and ${his} breasts. With your cock between ${his} breasts, you`);
			if (slave.boobs >= 650) {
				r.push(`squash ${his} tits together to form a nice lubricated channel,`);
			} else {
				r.push(`hold your cock in place,`);
			}
			r.push(`and ride back and forth on ${him}. You blast ${him} in the face with your cum in no time${(V.PC.vagina !== -1) ? `, leaving your pussyjuice on ${his} belly where you rubbed against ${him}` :``}.`);
		} else if (V.PC.boobs >= 300) {
			r.push(`You lie down on top of ${him}, face to face, forced high into the air by ${his} excessively large belly, so that your breasts press into ${his}`);
			if (slave.boobs >= 20000) {
				r.push(`colossal tits.`);
			} else if (slave.boobs >= 10000) {
				r.push(`massive tits.`);
			} else if (slave.boobs >= 5000) {
				r.push(`monster tits.`);
			} else if (slave.boobs >= 1000) {
				r.push(`huge tits.`);
			} else if (slave.boobsImplant > 250) {
				r.push(`fake tits.`);
			} else if (slave.boobs >= 650) {
				r.push(`big tits.`);
			} else if (slave.boobs >= 300) {
				r.push(`small tits.`);
			} else {
				r.push(`flat chest.`);
			}
			r.push(`Scooting around to stimulate your nipples against ${his} warm breastflesh, you kiss the slave while pushing a hand down between you to schlick yourself against ${him}.`);
		} else {
			r.push(`You set ${his} massively distended body on the floor, and tease ${him} for a while until ${his} nipples are rock hard. This done, you kneel down on ${him} with each of your legs aside ${his} torso, rear against the top of ${his} belly, and hump your pussy back and forth on the stiff nub of one nipple. ${He} lies there, desperately trying to reach around ${his} bulk to ${his} own pussy, but unable to do so, resorts to squirming with the stimulation.`);
		}
	} else if (tooBigBreasts(slave)) {
		if (V.PC.dick !== 0) {
			r.push(`${His} excessive breasts make ${him} a unique appliance for mammary intercourse. You lay ${him} down on the ground on ${his} back, lube ${his} cleavage, and straddle ${his} torso. ${He} holds ${his} udders together, creating a warm, wet channel as fuckable as any hole. You blast ${him} in the face with your cum in no time${(V.PC.vagina !== -1) ? `, leaving your pussyjuice on ${his} chest where you rubbed against ${him}` : ``}.`);
		} else if (V.PC.boobs >= 300) {
			r.push(`You lie down on top of ${him}, face to face, so that your much smaller breasts press into the massive pillows formed by ${his} chest. Scooting around to stimulate your nipples against ${his} warm breastflesh, you kiss the slave while pushing a hand down between you to schlick yourself against ${him}.`);
		} else {
			r.push(`You set ${his} nearly helpless body on the floor and then scoot your hips under the massive weight of ${his} tits. The heft feels nice against you, and you worm a naughty hand under there to play with yourself in the warm cave formed by your pelvis and ${his} udders.`);
		}
	} else if (tooBigButt(slave)) {
		if (V.PC.dick !== 0) {
			r.push(`${His} excessive butt makes ${him} a unique appliance for mammary intercourse. You lay ${him} down on the ground on ${his} back, ${his} butt hoisting ${his} crotch high above ${his} head, lube ${his} cleavage, and straddle ${his} torso. With your cock between ${his} breasts, you`);
			if (slave.boobs >= 650) {
				r.push(`squash ${his} tits together to form a nice lubricated channel,`);
			} else {
				r.push(`hold your cock in place,`);
			}
			r.push(`and ride back and forth on ${him}${(V.PC.vagina !== -1) ? `, leaving your pussyjuice on ${his} chest where you rubbed against ${him}` : ``}. ${He} has some trouble breathing under the assault, but ${he} manages. And for the finale, ${he}'s totally unable to avoid a perfect cumshot.`);
		} else if (V.PC.boobs >= 300) {
			r.push(`You set ${him} upright on your lap, facing you, so that your breasts and ${hers} are resting heavily against one another and ${his} massive ass covers your lap. ${He} turns ${his} head to avoid getting splashed in the eyes as you add a generous coating of oil to the combined breastflesh. You reach around to grab ${his} luxurious ass and jiggle ${him} up and down, giving you both a wonderful mammary oil massage.`);
		} else {
			r.push(`You set ${his} nearly helpless body on the floor and then scoot your hips under the massive weight of ${his} tits. The heft feels nice against you, and you worm a naughty hand under there to play with yourself in the warm cave formed by your pelvis and ${his} udders.`);
		}
	} else if (slave.fetish === "boobs" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && V.PC.dick !== 0) {
		r.push(`${He} comes over hurriedly, already presenting ${his} breasts. ${He} gives you a titjob with ${his} lubricated cleavage while you sit at your desk, playing with ${his} own nipples and moaning with pleasure.`);
		if (V.PC.vagina !== -1) {
			r.push(`${He} does ${his} best to push ${his} sternum hard against you, giving your pussy some stimulation, too.`);
		}
		r.push(`As you get close to orgasm, you push ${his} ${hasBothArms(slave) ? `hands` : `hand`} away and take over,`);
		if (slave.nipples === "fuckable") {
			r.push(`running your fingers around the lip of ${his} ${slave.nipples} nipples. When you finish, you drive them in, hard,`);
		} else {
			r.push(`rolling ${his} ${slave.nipples} nipples between your fingers and thumbs. When you finish, you give them a hard pull,`);
		}
		r.push(`sending ${him} gasping over the edge as well.`);
	} else if (slave.fetish === "cumslut" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && slave.chastityPenis === 1) {
		r.push(`${He} comes over eagerly, with hunger in ${his} eyes. ${He} gives you a titjob with ${his} lubricated cleavage while you sit at your desk. As a cumslut ${he}'s almost desperate to get your cum into ${his}`);
		if (V.seeRace === 1) {
			r.push(slave.race);
		}
		r.push(`mouth and rubs a nipple with one hand and ${his} anal opening with the other, since ${he} can't touch ${his} cock. The situation brings ${him} some pleasure, but the first twitches of ${his} cock against ${his} chastity cage are so uncomfortable that ${he} subsides into busy mechanical dick-sucking. ${He} writhes uncomfortably, frustrated beyond belief.`);
	} else if (slave.fetish === "cumslut" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && slave.dick !== 0 && V.PC.dick !== 0) {
		r.push(`${He} comes over eagerly, with hunger in ${his} eyes. ${He} gives you a titjob with ${his} lubricated cleavage while you sit at your desk. As a cumslut ${he}'s almost desperate to get your cum into ${his}`);
		if (V.seeRace === 1) {
			r.push(slave.race);
		}
		r.push(`mouth and`);
		if (canAchieveErection(slave)) {
			r.push(`jacks ${himself} off`);
		} else {
			r.push(`rubs ${his} sadly limp member`);
		}
		r.push(`in anticipation. When you finish, ${he} sits back with an ecstatic look on ${his} face and lets your cum rest in ${his} mouth as ${he} climaxes into ${his} hand. ${He} pours ${his} own cum from ${his} hand into ${his} mouth so it can mingle with yours.`);
	} else if (slave.fetish === "cumslut" && slave.fetishStrength > 60 && slave.fetishKnown === 1 && V.PC.dick !== 0) {
		r.push(`${He} comes over eagerly, with hunger in ${his} eyes. ${He} gives you a titjob with ${his} lubricated cleavage while you sit at your desk. As a cumslut ${he}'s almost desperate to get your cum into ${his}`);
		if (V.seeRace === 1) {
			r.push(slave.race);
		}
		r.push(`mouth and rubs ${himself} in anticipation. When you finish, ${he}`);
		if (V.PC.vagina !== -1) {
			r.push(`quickly swallows and then runs ${his} hot tongue down to your wet pussy, eagerly licking your juices.`);
		} else {
			r.push(`sits back with an ecstatic look on ${his} face and lets your cum rest in ${his} mouth as ${he} climaxes.`);
		}
	} else if (slave.devotion < -20) {
		r.push(`${He} tries to refuse you, so you throw ${him} down on the couch next to your desk and`);
		if (V.PC.dick !== 0) {
			r.push(`squeeze lubricant between ${his} ${slave.skin} breasts. You straddle ${his} torso, hold ${his} boobs together, and fuck ${his} cleavage${(V.PC.vagina !== -1) ? `, grinding your hips down against ${him} to stimulate your pussy` : ``}. Your cum splashes ${his} crying face.`);
		} else if (V.PC.boobs >= 300) {
			r.push(`squirt lubricant all over ${his} ${slave.skin} breasts. Then, you lie down atop ${him} with your breasts meshing with ${hers} and begin to slide up and down, stimulating your nipples wonderfully. ${He} tries to turn ${his} head away, but you reach up to force ${his} unwilling mouth to accept your insistent tongue.`);
		} else {
			r.push(`straddle ${his} face, grinding your pussy against ${his} unwilling mouth. You begin to grope ${his} breasts and pinch ${his} nipples to hardness, and when ${he}'s slow at eating you out, you twist them cruelly. The pain makes ${him} squeal into your pussy, a lovely sensation, so you manhandle ${him} without mercy until you climax against ${his} gasping face.`);
		}
	} else if (slave.devotion <= 20 && slave.lactation > 0) {
		r.push(`${He} lies on the couch next to your`);
		if (V.PC.dick !== 0) {
			r.push(`desk and rubs lube over ${his} ${slave.skin} chest so you can fuck ${his} tits. You straddle ${his} torso, hold ${his} boobs together, and fuck ${his} cleavage. As you do, the pressure of your grip causes a thin rivulet of milk to run from each of ${his} nipples. Your cum covers ${his} reluctant face; between your semen${(V.PC.vagina !== -1) ? `, the pussyjuice you left on ${his} chest,` : ``}and ${his} milk ${he}'s quite a mess.`);
		} else if (V.PC.boobs >= 300) {
			r.push(`desk and rubs lube over ${his} ${slave.skin} breasts. Then, you lie down atop ${him} with your breasts meshing with ${hers} and begin to slide up and down, titillating your nipples wonderfully. ${He} cannot ignore the slippery stimulation ${his} nipples are receiving, and you find ${his} mouth quite willing to receive your insistent tongue. ${He} begins to leak milk, adding ${his} cream to the lube between your breasts, and by the time you're done there's quite a mess.`);
		} else {
			r.push(`desk, and you've straddled ${his} face before ${he} can do anything more. You begin to grope ${his} breasts and pinch ${his} nipples to hardness as ${he} eats you out, your ministrations producing prompt jets of creamy milk, straight up into the air. You milk ${him} without mercy, shooting some of the stronger streams into your mouth as you ride ${him}, leaving ${him} to massage ${his} breasts gingerly as you get off ${his} face.`);
		}
	} else if (slave.devotion <= 20) {
		r.push(`${He} lies on the couch next to your`);
		if (V.PC.dick !== 0) {
			r.push(`desk and rubs lube over ${his}`);
			if (V.seeRace === 1) {
				r.push(slave.race);
			}
			r.push(`chest so you can fuck ${his} ${slave.skin} tits. You straddle ${his} torso, hold ${his} boobs together, and fuck ${his} cleavage. Your cum covers ${his} reluctant face${(V.PC.vagina !== -1) ? `, and you hike yourself up a little higher to grind your pussy against ${his} mouth` : ``}.`);
		} else if (V.PC.boobs >= 300) {
			r.push(`desk and rubs lube over ${his} ${slave.skin} breasts. Then, you lie down atop ${him} with your breasts meshing with ${hers} and begin to slide up and down, titillating your nipples wonderfully. ${He} cannot ignore the slippery stimulation ${his} nipples are receiving, and you find ${his} mouth quite willing to receive your insistent tongue.`);
		} else {
			r.push(`desk, and you've straddled ${his} face before ${he} can do anything more. You begin to grope ${his} breasts and pinch ${his} nipples to hardness as ${he} eats you out, your ministrations producing moans that feel quite nice against your clit. You maul ${his} boobs without mercy as you reach your climax, leaving ${him} to massage ${his} breasts gingerly as you get off ${him}.`);
		}
	} else if (slave.lactation > 0) {
		r.push(`Since ${he}'s producing milk, ${he} gets an emotional high from breastfeeding, and ${he} sits on the edge of your desk for a while so you can use ${him} as a beverage dispenser while you work. Once ${he}'s empty, ${he} gets down to`);
		if (V.PC.dick === 0) {
			r.push(`eat you out.`);
			if (hasAnyArms(slave)) {
				r.push(`As ${he} buries ${his} face between your legs, ${he} gently rolls ${his} sore nipples around in ${his} fingers, quietly moaning and whining.`);
			}
		} else {
			r.push(`give you a titjob.`);
			if (hasAnyArms(slave)) {
				r.push(`As you titfuck ${him}, ${he} gently rolls ${his} sore nipples around in ${his} fingers, quietly moaning and whining.`);
			}
			r.push(`Your cum covers ${his}`);
			if (V.seeRace === 1) {
				r.push(slave.race);
			}
			r.push(`face in no time, and ${he}'s left with a spectacular mess to clean. ${He} laps it all up.`);
		}
	} else {
		if (V.PC.dick !== 0) {
			r.push(`${He} massages and toys with ${his} chest for your benefit, languidly rubbing lubricant over not only ${his} cleavage but ${his} entire chest, making sure every`);
			if (V.showInches === 2) {
				r.push(`inch`);
			} else {
				r.push(`centimeter`);
			}
			r.push(`of ${his} ${slave.skin} breasts are nice and shiny. ${He} gives you a titjob with ${his} lubricated cleavage while you sit at your desk${(V.PC.vagina !== -1) ? `, doing ${his} best to run ${his} hard nipples between your pussylips whenever ${he} can` : ``}. Your cum covers ${his}`);
			if (V.seeRace === 1) {
				r.push(slave.race);
			}
			r.push(`face, and ${he} carefully licks it all off while continuing to play with ${his} erect nipples.`);
		} else if (V.PC.boobs >= 300) {
			r.push(`${He} rubs lube over ${his} ${slave.skin} breasts, flirting with you and sticking out ${his} chest, before lying down on the couch. You lie down atop ${him} with your breasts meshing with ${hers} and begin to slide up and down, titillating your nipples wonderfully. You find ${his} mouth quite willing to receive your insistent`);
			if (hasAnyArms(slave)) {
				r.push(`tongue, and while you make out, ${he} slips`);
				if (hasBothArms(slave)) {
					r.push(`a`);
				} else {
					r.push(`${his}`);
				}
				r.push(`hand down between your legs to give you a handjob, too.`);
			} else {
				r.push(`tongue.`);
			}
		} else {
			r.push(`${He} flirts with you and sticks out ${his} chest before lying down on the couch. You've straddled ${his} face before ${he} can do anything more, and ${he} begins to eat you out with enthusiasm. You begin to grope ${his} breasts and pinch ${his} nipples to hardness as ${he} gives you oral, your ministrations producing moans that feel quite nice against your clit. You maul ${his} boobs without mercy as you reach your climax, but ${he} loves it all.`);
		}
	}

	if (random(1, 100) > (100+slave.devotion)) {
		if (slave.fetish !== "boobs" && slave.energy <= 95 && slave.behavioralFlaw === "none") {
			if (V.PC.vagina >= 0 && V.PC.dick === 0) {
				r.push(`Being manhandled and used by you has given ${him} a <span class="flaw gain">hatred of women.</span>`);
				slave.behavioralFlaw = "hates women";
			} else {
				r.push(`Being manhandled and used has given ${him} a <span class="flaw gain">hatred of men.</span>`);
				slave.behavioralFlaw = "hates men";
			}
		}
	} else if (random(1, 100) > (110-slave.devotion)) {
		if (slave.fetish === Fetish.NONE &&
		(slave.behavioralFlaw !== "hates men" || V.PC.dick === 0) &&
		(slave.behavioralFlaw !== "hates women" || V.PC.dick > 0)
		) {
			r.push(`Having attention and love lavished on ${his} boobs by ${his} ${getWrittenTitle(slave)} has ${him} thinking of ${his} <span class="fetish gain">breasts as sexual organs.</span>`);
			slave.fetish = "boobs";
			slave.fetishKnown = 1;
		}
	}

	if (slave.lactation > 0) {
		slave.lactationDuration = 2;
		slave.boobs -= slave.boobsMilk;
		slave.boobsMilk = 0;
	} else {
		r.push(induceLactation(slave));
	}

	if (hasAnyLegs(slave)) {
		switch (slave.assignment) {
			case "work in the dairy":
				r.push(`${He} goes off to carefully wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage`);
				} else {
					r.push(`chest`);
				}
				r.push(`to keep production in ${V.dairyName} nice and sanitary.`);
				break;
			case "work as a farmhand":
				r.push(`${He} goes off to carefully wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage`);
				} else {
					r.push(`chest`);
				}
				r.push(`to make sure ${he} doesn't taint the food in ${V.farmyardName}.`);
				break;
			case "whore":
				r.push(`${He} heads off to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage`);
				} else {
					r.push(`chest`);
				}
				r.push(`before ${he} returns to prostituting ${himself}.`);
				break;
			case "work in the brothel":
				r.push(`${He} goes to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage,`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage,`);
				} else {
					r.push(`chest,`);
				}
				r.push(`even though it's likely to be splashed with customers' cum soon after ${he} returns to work.`);
				break;
			case "serve the public":
				r.push(`${He} heads off to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage`);
				} else {
					r.push(`chest`);
				}
				r.push(`before ${he} goes back out to fuck passersby.`);
				break;
			case "serve in the club":
				r.push(`${He} goes to beautify ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage`);
				} else {
					r.push(`chest`);
				}
				r.push(`so it can again serve as an ornament to ${V.clubName}.`);
				break;
			case "work as a servant":
				r.push(`${He} rushes to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage,`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage,`);
				} else {
					r.push(`chest,`);
				}
				r.push(`afraid ${he}'s fallen behind on the chores while you used ${him}.`);
				break;
			case "work as a nanny":
				r.push(`${He} rushes to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage,`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage,`);
				} else {
					r.push(`chest,`);
				}
				r.push(`before hurrying to continue taking care of the children in ${V.nurseryName}.`);
				break;
			case "rest":
				r.push(`${He} stumbles off to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage`);
				} else {
					r.push(`chest`);
				}
				r.push(`before crawling back into bed.`);
				break;
			case "be the Schoolteacher":
				r.push(`${He} heads off to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage`);
				} else {
					r.push(`chest`);
				}
				r.push(`before ${he} returns to ${his} classes.`);
				break;
			case "get milked":
				r.push(`${He} hurries off to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage`);
				} else {
					r.push(`chest`);
				}
				if (slave.lactation > 0) {
					r.push(`before going to get ${his} uncomfortably milk-filled tits drained.`);
				} else {
					r.push(`and then rests until ${his} balls are ready to be drained again.`);
				}
				break;
			case "please you":
				r.push(`${He} hurries off to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage`);
				} else {
					r.push(`chest`);
				}
				r.push(`before returning to await use, as though nothing had happened.`);
				break;
			case "be a subordinate slave":
				r.push(`${He} moves off to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage,`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage,`);
				} else {
					r.push(`chest,`);
				}
				r.push(`though it's only a matter of time before another slave decides to play with ${his} tits.`);
				break;
			case "be a servant":
				r.push(`${He} hurries off to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage,`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage,`);
				} else {
					r.push(`chest,`);
				}
				r.push(`since ${his} chores didn't perform themselves while you titfucked ${him}.`);
				break;
			case "be your Head Girl":
				r.push(`${He} hurries off to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage,`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage,`);
				} else {
					r.push(`chest,`);
				}
				r.push(`worried that ${his} charges got up to trouble while ${he} had ${his} breasts around your cock.`);
				break;
			case "guard you":
				r.push(`${He} hurries off to wash ${his}`);
				if (slave.boobs > 1500) {
					r.push(`acre of cleavage`);
				} else if (slave.boobs > 500) {
					r.push(`generous cleavage`);
				} else {
					r.push(`chest`);
				}
				r.push(`so that you will be unguarded for as little time as possible.`);
		}
	}
	App.Events.addParagraph(node, r);
	return node;
};


code:
// cSpell:ignore frotting

/**
 *
 * @param {App.Entity.SlaveState} slave
 * @returns {DocumentFragment}
 */
App.Interact.fButt = function(slave) {
	const frag = new DocumentFragment();

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

	const text = new SpacedTextAccumulator(frag);

	text.push(
		intro(),
		setup(),
		consummation(),
	);

	if (random(1, 100) > (100 + slave.devotion)) {
		text.push(slaveGainsFlaw());
	} else if (random(1, 100) > (110 - slave.devotion)) {
		text.push(slaveGainsQuirk());
	}

	text.push(cleanup());

	text.toParagraph();

	return frag;

	function intro() {
		const text = [];

		text.push(`You call ${him} over so you can`);
		if (!canDoVaginal(slave)) {
			text.push(`use ${his} sole fuckhole.`);
		} else if (slave.vagina > 3) {
			text.push(`fuck ${his} gaping holes.`);
		} else if (slave.vagina > 2) {
			text.push(`fuck ${his} loose holes.`);
		} else if (slave.vagina === 2) {
			text.push(`use ${his} whorish holes.`);
		} else if (slave.vagina === 1) {
			text.push(`use ${his} tight holes.`);
		} else if (slave.vagina === 0 || slave.anus === 0) {
			text.push(`take ${his} virginity.`);
		}

		return text.join(' ');
	}

	function setup() {
		const text = [];

		if (slave.vagina !== -1) {
			if (slave.vaginaTat === "tribal patterns") {
				text.push(`The tattoos on ${his} abdomen certainly draw attention there.`);
			} else if (slave.vaginaTat === "scenes") {
				text.push(`The tattoos on ${his} abdomen nicely illustrate what you mean to do to ${him}.`);
			} else if (slave.vaginaTat === "degradation") {
				text.push(`The tattoos on ${his} abdomen are asking you to, after all.`);
			} else if (slave.vaginaTat === "lewd crest") {
				text.push(`The crest on ${his} abdomen screams debauchery and implores you to use ${him}.`);
			}
		}

		if (slave.piercing.vagina.weight > 1) {
			text.push(`${His} pierced lips and clit have ${him} nice and wet.`);

			if (slave.dick !== 0) {
				text.push(`Metal glints all up and down ${his} cock.`);
			}
		} else if (slave.piercing.vagina.weight === 1) {
			text.push(`${His} pierced clit has ${his} nice and moist.`);

			if (slave.dick !== 0) {
				text.push(`Metal glints at the head of ${his} cock.`);
			}
		}

		if (slave.piercing.anus.weight > 1) {
			text.push(`The ring of stud piercings around ${his} anus should massage you delightfully as you sodomize ${him}.`);
		} else if (slave.piercing.anus.weight === 1) {
			text.push(`${His} perineum piercing has a big ring in it, which you should be able to feel when you hilt yourself in ${his} ass.`);
		}

		if (slave.anusTat === "bleached") {
			text.push(`${His} anus is invitingly bleached,`);

			if (slave.vagina > -1) {
				text.push(`which is appropriate: rather than looking like ${he} has a hole for fucking and an ass, it looks like ${he} has two fuckholes.`);
			} else {
				text.push(`making ${his} sole fuckable hole look nice and natural.`);
			}
		}

		return text.join(' ');
	}

	function consummation() {
		const text = [];

		if (slave.vagina === 0 && slave.anus === 0 && canDoVaginal(slave)) {
			if (V.PC.dick === 0) {
				text.push(`You step into a strap-on, lubricate it, and break in ${his} holes in quick succession.`);
			} else {
				text.push(`Brooking no resistance, you take ${his} virginity and then break in ${his} virgin butt.`);
			}

			if (slave.devotion > 50) {
				text.push(`You ease yourself into ${his} pussy before gradually working your way into ${his} ass and alternate between the two holes while ${he} begins to moan. In just a few minutes, ${he} has lost ${his} virginity and been assfucked for the first time. ${He} submits utterly to your spoilage of ${his} innocence and thanks you meekly for introducing ${him} to proper sexual slavery. ${His} holes have been broken in.`);

				slave.devotion += 10;
			} else if (slave.devotion > 20) {
				text.push(`You ease yourself into ${his} pussy before gradually working your way into ${his} ass and alternate between the two holes while ${he} begins to moan. In just a few minutes, ${he} has lost ${his} virginity and been assfucked for the first time. ${He}'s so bewildered by the pain and novelty that all ${he} feels is a little fear of further use. ${His} holes have been broken in.`);

				slave.trust -= 5;
			} else {
				text.push(`You force yourself into ${his} pussy before gradually working your way into ${his} ass. ${He} sobs and cries with disgust while you alternate between the two holes. In just a few minutes, ${he} has lost ${his} virginity to rape and ${his} anal virginity to a rough buttfuck. To say ${he} resents you and fears further abuse would be an understatement. ${His} holes have been broken in.`);

				slave.devotion -= 10;
				slave.trust -= 10;
			}

			text.push(VCheck.Both(slave, 1));
		} else if (slave.vagina === 0 && canDoVaginal(slave)) {
			if (slave.devotion > 20) {
				text.push(`${He} accepts your orders without comment and presents ${his} virgin pussy for defloration${(V.PC.dick === 0) ? `, watching with some small trepidation as you don a strap-on` : ``}. You gently ease into ${his} pussy before gradually increasing the intensity of your thrusts into ${him}. Before long, ${he}'s moaning loudly as you pound away. Since ${he} is already well broken, this new connection with ${his} ${getWrittenTitle(slave)} increases ${his} devotion to you. ${His} pussy has been broken in.`);

				slave.devotion += 10;
			} else if (slave.devotion >= -20) {
				text.push(`${He} is clearly unhappy at losing ${his} pearl of great price to you; this probably isn't what ${he} imagined ${his} first real sex would be like.`);

				if (V.PC.dick === 0) {
					text.push(`${His} lower lip quivers with trepidation as ${he} watches you don a strap-on and maneuver to fuck ${his} virgin hole.`);
				}

				text.push(`You gently ease into ${his} pussy before gradually increasing the intensity of your thrusts into ${him}. Before long, ${he}'s moaning as you pound away. Nevertheless, this new connection with ${his} ${getWrittenTitle(slave)} increases ${his} devotion to you. ${His} pussy has been broken in, and ${he} is fearful that sex will continue to be painful.`);

				slave.devotion += 5;
				slave.trust -= 5;
			} else {
				text.push(`As you anticipated, ${he} refuses to give you ${his} virginity. And as you expected, ${he} is unable to resist you. ${He} cries as`);
				if (V.PC.dick === 0) {
					text.push(`your strap-on`);
				} else {
					text.push(`your cock`);
				}

				text.push(`opens ${his} fresh, tight hole. You force your way into ${his} pussy and continue thrusting into ${him}. ${He} sobs and cries with horror as you pound away. The rape decreases ${his} devotion to you. ${His} pussy has been broken in, and ${he} fears further abuse.`);

				slave.devotion -= 10;
				slave.trust -= 15;
			}
			text.push(VCheck.Vaginal(slave, 1));
		} else if (slave.anus === 0) {
			if (slave.devotion > 20) {
				text.push(`${He} accepts your orders without comment and presents ${his} virgin anus for defloration. You`);

				if (V.PC.dick === 0) {
					text.push(`don a strap-on and`);
				}

				text.push(`gently sodomize ${him}. You gently ease yourself into ${his} butthole and gradually speed up your thrusts while ${he} slowly learns to move ${his} hips along with you. Since ${he} is already well broken, this new connection with ${his} ${getWrittenTitle(slave)} increases ${his} devotion to you. ${His} tight little ass has been broken in.`);

				slave.devotion += 4;
			} else if (slave.devotion >= -20) {
				text.push(`${He} is clearly unhappy at the idea of taking a dick up ${his} butt. ${He} obeys orders anyway, and lies there wincing and moaning as you`);

				if (V.PC.dick === 0) {
					text.push(`don a strap-on and`);
				}

				text.push(`fuck ${his} ass. <span class="virginity loss">${His} tight little ass has been broken in,</span> and ${he} <span class="trust dec">fears further anal pain.</span>`);

				slave.trust -= 5;
			} else {
				text.push(`${He} is appalled at the idea of taking it up the ass${(V.PC.dick === 0) ? ` and cries with fear as you don a strap-on` : ``}. ${He} does anyway though, sobbing into the cushions`);

				if (hasAnyArms(slave)) {
					text.push(`while you hold ${his} ${hasBothArms(slave) ? `arms` : `arm`} behind ${him}`);
				}

				text.push(text.pop() + `.`);
				text.push(`You force yourself into ${his} butthole. ${He} sobs and cries with disgust while you continue thrusting into ${his} ass. The painful anal rape decreases ${his} devotion to you. ${His} tight little ass has been broken in, and ${he} is terrified of further anal pain.`);

				slave.devotion -= 5;
				slave.trust -= 5;
			}

			text.push(VCheck.Anal(slave, 1));
		} else if (slave.devotion < -20) {
			if (V.PC.dick === 0) {
				text.push(`You don a cruelly large strap-on, and you do it so ${he} can`);

				if (canSee(slave)) {
					text.push(`see`);
				} else if (canHear(slave)) {
					text.push(`hear`);
				} else {
					text.push(`notice`);
				}

				text.push(`it.`);
			}

			text.push(`${He} tries to refuse you, so you throw ${him} across the back of the couch next to your desk with ${his}`);

			if (V.seeRace === 1) {
				text.push(slave.race);
			}

			text.push(`ass in the air. You finger ${his} anus`);

			if (slave.vagina !== -1) {
				text.push(`while fucking ${his} pussy`);
			} else if (hasBothLegs(slave)) {
				text.push(`while frotting ${his} thighs`);
			}

			text.push(`for a bit and then switch to ${his} now-ready anus. ${He} sobs as you penetrate ${his} rectum.`);

			if (slave.dick !== 0 && canAchieveErection(slave)) {
				if (slave.prostate === 0) {
					text.push(`${He} lacks a prostate, denying ${him} any real pleasure. ${His} dick stays flaccid as you rape ${him}.`);
				} else if (slave.chastityPenis === 1) {
					text.push(`Despite ${his} unwillingness to be sodomized, the prostate stimulation starts to give ${him} an erection, which ${his} dick chastity makes horribly uncomfortable. ${He} bucks with the pain, ${his} asshole spasming delightfully.`);
				} else {
					text.push(`Despite ${his} unwillingness to be sodomized, the prostate stimulation gives ${him} an erection. ${He}'s mortified that ${he} would get hard while being anally raped.`);
				}
			} else if (slave.chastityPenis === 1) {
				text.push(`${His} dick chastity keeps ${his} bitch cock hidden away while you use ${his} anus like a pussy.`);
			} else if (slave.dick !== 0) {
				text.push(`${His} flaccid dick is ground into the back of the couch as you rape ${him}.`);
			}

			text.push(VCheck.Both(slave, 1));
		} else if (slave.devotion <= 50) {
			text.push(`You throw ${him} across the back of the couch next to your desk with ${his} ass in the air${(V.PC.dick === 0) ? `, and don a strap-on` : ``}. You finger ${his}`);

			if (V.seeRace === 1) {
				text.push(slave.race);
			}

			text.push(`ass while`);

			if (slave.vagina !== -1) {
				text.push(`fucking ${his} pussy`);
			} else {
				text.push(`frotting ${his} thighs`);
			}

			text.push(`for a bit and then switch to ${his} now-ready anus.`);

			if (slave.anus === 1) {
				text.push(`${His} ass is so tight that you have to work yourself in.`);
			} else if (slave.anus === 2) {
				text.push(`Your`);
				if (V.PC.dick === 0) {
					text.push(`fake dick`);
				} else {
					text.push(`cock`);
				}
				text.push(`slides easily up ${his} ass.`);
			} else {
				text.push(`You slide into ${his} already-gaping asspussy with ease.`);
			}

			text.push(`${He} gasps as you penetrate ${his} rectum, but you timed the switch so that ${he} was on the verge of orgasm, and ${he} comes immediately.`);

			if (slave.dick !== 0 && canAchieveErection(slave)) {
				if (slave.chastityPenis) {
					text.push(`${He} managed to stay soft within ${his} dick chastity, but ${he} dribbled a lot of precum onto the couch. You make ${his} lick it up, and ${he} obeys, shuddering with unsatisfied arousal.`);
				} else {
					text.push(`${His} cock spatters the couch with cum, and you make ${his} lick it up.`);
				}
			} else if (slave.clit > 2) {
				text.push(`${His} clit is so large that it bobs slightly with each thrust.`);
			}

			text.push(VCheck.Both(slave, 1));
		} else {
			if (hasAnyLegs(slave)) {
				text.push(`${He} kneels on the floor`);
			} else {
				text.push(`You lay ${him} on the floor`);
			}

			text.push(`so you can take ${him} at will${(V.PC.dick === 0) ? `, and don a strap-on` : ``}. You finger ${his}`);

			if (V.seeRace === 1) {
				text.push(slave.race);
			}

			text.push(`ass while`);

			if (canDoVaginal(slave)) {
				text.push(`fucking ${his} pussy`);
			} else {
				text.push(`frotting ${his}`);
			}

			text.push(`for a bit and then switch to ${his} now-ready anus.`);

			if (slave.anus === 1) {
				text.push(`${His} ass is so tight that you have to work yourself in.`);
			} else if (slave.anus === 2) {
				text.push(`Your cock slides easily up ${his} ass.`);
			} else {
				text.push(`You slide into ${his} already-gaping asspussy with ease.`);
			}

			text.push(`You fuck ${him} there for a while before repeatedly pulling out and stuffing yourself back in. ${He} moans each time you fill`);

			if (canDoVaginal(slave)) {
				text.push(`a`);
			} else {
				text.push(his);
			}

			text.push(`waiting hole.`);

			if (slave.dick !== 0 && canAchieveErection(slave)) {
				if (slave.chastityPenis === 1) {
					text.push(`Whenever ${he} starts to get hard, ${his} dick chastity gives ${him} an awful twinge of pain. You do your best to be up ${his} butt when this happens so you can experience the resulting spasm.`);
				} else {
					text.push(`Every time you penetrate, ${his} erect dick jerks up and slaps ${his} stomach.`);
				}
			} else if (slave.dick !== 0) {
				if (slave.chastityPenis === 1) {
					text.push(`${His} dick chastity keeps ${his} girly bitchclit hidden, just like it belongs.`);
				} else {
					text.push(`Every time you penetrate, ${his} limp dick flops around lamely.`);
				}
			} else if (slave.clit > 2) {
				text.push(`${His} clit is so large that it bobs slightly with each thrust.`);
			}

			text.push(VCheck.Both(slave, 1));
		}

		if (slave.bellyPreg >= 1500) {
			text.push(`The poor ${girl}'s pregnant belly makes taking a rough fuck in both ${his} holes uncomfortable for ${him}.`);
		} else if (slave.bellyImplant >= 1500) {
			text.push(`The poor ${girl}'s implant-filled belly makes taking a rough fuck in both ${his} holes uncomfortable for ${him}.`);
		} else if (slave.bellyFluid >= 1500) {
			text.push(`The poor ${girl}'s sloshing belly makes taking a rough fuck in both ${his} holes uncomfortable for ${him}, though the lewd jiggling the pounding sends through it is quite a sight.`);
		}

		if (slave.anusTat === "scenes" && slave.anus === 1) {
			text.push(`As you fucked ${his} butt, the decorative pattern around ${his} ass stretched open. When you pull out, ${his} momentary gape closes the pattern up quickly.`);
		} else if (slave.anusTat === "scenes") {
			text.push(`As you fucked ${his} butt, the decorative pattern around ${his} ass stretched open. When you pull out, ${his} gape leaves the pattern distorted.`);
		} else if (slave.anusTat === "degradation") {
			text.push(`As you fucked ${his} butt, the offensive language around ${his} ass stretched and distorted.`);
		}

		return text.join(' ');
	}

	function slaveGainsFlaw() {
		if (slave.fetish !== "buttslut" && slave.energy <= 95 && slave.sexualFlaw !== "hates penetration") {
			slave.sexualFlaw = "hates penetration";

			return `Being brutally used has given ${him} a <span class="flaw gain">hatred of penetration.</span>`;
		}

		return ``;
	}

	function slaveGainsQuirk() {
		if (slave.fetish === Fetish.NONE && slave.sexualFlaw !== "hates penetration") {
			slave.fetish = "buttslut";
			slave.fetishKnown = 1;

			return `Orgasming to your use of ${his} fuckhole <span class="fetish gain">has ${him} eager for more buttsex.</span>`;
		}

		return ``;
	}

	function cleanup() {
		const text = [];

		if (V.PC.dick !== 0) {
			if (slave.cervixImplant === 2 || slave.cervixImplant === 3) {
				slave.bellyImplant += random(10, 20);
			}

			if (slave.anus > 3) {
				text.push(`${His} gaping hole drips your cum right out again.`);
			} else if (slave.anus > 2) {
				text.push(`Cum drips out of ${his} loose hole.`);
			} else if (slave.anus === 2) {
				text.push(`Cum drips out of ${his} loosened anus.`);
			} else if (slave.anus === 1) {
				text.push(`${His} still-tight ass keeps your load inside ${him}.`);
			}

			if (canMove(slave) && V.postSexCleanUp > 0) {
				switch (slave.assignment) {
					case "whore":
						text.push(`${He} heads to the bathroom to clean ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes before returning to selling them publicly.`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole before returning to selling it publicly.`);
						} else {
							text.push(`face before returning to selling ${his} mouth publicly.`);
						}
						break;
					case "serve the public":
						text.push(`${He} heads to the bathroom to clean ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes before returning to offering it for free.`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole before returning to offering it for free.`);
						} else {
							text.push(`face before returning to offering ${his} mouth for free.`);
						}
						break;
					case "rest":
						text.push(`${He} stumbles to the bathroom to clean ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole`);
						} else {
							text.push(`face`);
						}

						text.push(`before crawling back into bed.`);
						break;
					case "be the Schoolteacher":
						text.push(`${He} heads to the bathroom to clean ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole`);
						} else {
							text.push(`face`);
						}

						text.push(`before ${he} returns to teaching ${his} classes.`);
						break;
					case "get milked":
						text.push(`${He} hurries to the bathroom to clean ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole`);
						} else {
							text.push(`face`);
						}

						if (slave.lactation > 0) {
							text.push(`before going to get ${his} uncomfortably milk-filled tits drained.`);
						} else {
							text.push(`and then rests until ${his} balls are ready to be drained again.`);
						}
						break;
					case "please you":
						text.push(`${He} hurries to the bathroom to clean ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole`);
						} else {
							text.push(`face`);
						}

						text.push(`before returning to await your next use of ${his} body, as though nothing had happened.`);
						break;
					case "be a subordinate slave":
						text.push(`${He} moves to the bathroom to clean ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes,`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole,`);
						} else {
							text.push(`face,`);
						}

						text.push(`though it's only a matter of time before another slave decides to play with ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`pussy or asshole.`);
						} else if (canDoVaginal(slave)) {
							text.push(`pussy.`);
						} else if (canDoAnal(slave)) {
							text.push(`asshole.`);
						} else {
							text.push(`face.`);
						}

						break;
					case "be a servant":
						text.push(`${He} hurries to the bathroom to clean ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes,`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole,`);
						} else {
							text.push(`face,`);
						}

						text.push(`since ${his} chores didn't perform themselves while you used ${him}.`);
						break;
					case "be your Head Girl":
						text.push(`${He} hurries to the bathroom to clean ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes,`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole,`);
						} else {
							text.push(`face,`);
						}

						text.push(`worried that ${his} charges got up to trouble while you had your cock in ${him}.`);
						break;
					case "guard you":
						text.push(`${He} hurries off to wash ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole`);
						} else {
							text.push(`face`);
						}

						text.push(`so you'll be unguarded for as little time as possible.`);
						break;
					case "work in the brothel":
						text.push(`${He} goes to wash ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole`);
						} else {
							text.push(`face`);
						}

						text.push(`so ${his} next customer can have the illusion that he's the first to use it today.`);
						break;
					case "serve in the club":
						text.push(`${He} goes to wash and delicately perfume ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes so they`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole so it`);
						} else {
							text.push(`face so it`);
						}

						text.push(`can gratify the finest citizen.`);
						break;
					case "work in the dairy":
						text.push(`${He} goes off to carefully wash ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole`);
						} else {
							text.push(`face`);
						}

						text.push(`to avoid besmirching the nice clean dairy.`);
						break;
					case "work as a farmhand":
						text.push(`${He} goes off to wash ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole`);
						} else {
							text.push(`face`);
						}

						text.push(`to avoid tainting the food in ${V.farmyardName}.`);
						break;
					case "work as a servant":
						text.push(`${He} rushes to wash ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes,`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole,`);
						} else {
							text.push(`face,`);
						}

						text.push(`impatient to get back to ${his} undiminished chores.`);
						break;
					case "work as a nanny":
						text.push(`${He} rushes to wash ${his}`);

						if (canDoVaginal(slave) && canDoAnal(slave)) {
							text.push(`holes,`);
						} else if (canDoVaginal(slave) || canDoAnal(slave)) {
							text.push(`fuckhole,`);
						} else {
							text.push(`face,`);
						}

						text.push(`before hurrying to continue taking care of the children in ${V.nurseryName}.`);
						break;
				}
			}
		}

		return text.join(' ');
	}
};