code:
/**
 * @param {App.Entity.SlaveState} slave
 * @param {"canine"|"hooved"|"feline"} type
 * @returns {DocumentFragment}
 */
App.Interact.fAnimal = function(slave, type) {
	const frag = new DocumentFragment();

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

	/** @enum {string} */
	const Acts = {
		VAGINAL: "vaginal",
		ANAL: "anal",
		ORAL: "oral",
	};

	/** @type {FC.SlaveActs} */
	let act;

	const approvingFetishes = ["masochist", "humiliation", "perverted", "sinful"];	// not strictly fetishes, but approvingFetishesAndBehavioralQuirksAndSexualQuirks doesn't have the same ring to it

	/** @type {App.Entity.Animal} */
	const animal = getAnimal(V.active[type]);

	/** @type {0|1|2} */
	let hole;
	let fetishDesc;
	let orifice;

	const anAnimal = `${animal.articleAn} ${animal.name}`;

	if (slave.assignment === Job.FUCKTOY || slave.assignment === Job.MASTERSUITE) {
		if (slave.toyHole === "pussy") {
			act = "vaginal";
		} else if (slave.toyHole === "ass") {
			act = "anal";
		} else if (slave.toyHole === "mouth") {
			act = "oral";
		} else {
			if (canDoVaginal(slave)) {
				act = "vaginal";
			} else if (canDoAnal(slave)) {
				act = "anal";
			} else {
				act = "oral";
			}
		}
	} else if (canDoVaginal(slave)) {
		act = "vaginal";
	} else if (canDoAnal(slave)) {
		act = "anal";
	} else {
		act = "oral";
	}

	seX(slave, act, "animal");

	const slaveApproves =
		approvingFetishes.includes(slave.fetish) ||
		approvingFetishes.includes(slave.sexualQuirk) ||
		approvingFetishes.includes(slave.behavioralQuirk) ||
		slave.fetish === "buttslut" && act === Acts.ANAL ||
		slave.fetish === "cumslut" && act === Acts.ORAL ||
		slave.sexualQuirk === "gagfuck queen" && act === Acts.ORAL;

	switch (act) {
		case Acts.ORAL:
			orifice = () => either("mouth", "throat");
			break;
		case Acts.VAGINAL:
			orifice = () => either("pussy", "cunt");
			hole = 0;
			break;
		case Acts.ANAL:
			orifice = () => either("asshole", "rectum");
			hole = 1;
			break;
		default:
			throw new Error(`Unexpected act type '${act}' in fAnimal()`);
	}

	if (slave.fetish === "cumslut" && act === Acts.ORAL) {
		fetishDesc = `getting to drink more cum`;
	} else if (slave.fetish === "humiliation") {
		fetishDesc = `committing such a humiliating act`;
	} else if (slave.fetish === "buttslut" && act === Acts.ANAL) {
		fetishDesc = `getting to take a cock up ${his} ass`;
	} else if (slave.fetish === "masochist") {
		fetishDesc = `committing such a painful act`;
	} else if (slave.sexualQuirk === "perverted") {
		fetishDesc = `committing such a perverted act`;
	} else if (slave.sexualQuirk === "gagfuck queen" && act === Acts.ORAL) {
		fetishDesc = `getting to suck more dick`;
	} else if (slave.behavioralQuirk === "sinful") {
		fetishDesc = `committing such a sinful act`;
	}

	const text = new SpacedTextAccumulator(frag);

	if (canWalk(slave)) {
		text.push(`You call ${him} over and`);
	} else {
		text.push(`You order another slave to bring ${slave.slaveName} over. Once ${he} is situated, you`);
	}

	text.push(`tell ${him} you want to watch ${him} ${act === Acts.ORAL
		? `suck off`
		: act === Acts.VAGINAL
			? `get fucked by`
			: `get fucked in the ass by`} ${anAnimal}.`);

	if (slave.fetish === "mindbroken") {
		text.push(`${slave.slaveName} nods ${his} head dumbly, ${his} eyes vacant${!canSee(slave) ? ` as always` : ``}.`);
	}

	if (slave.fetish !== "mindbroken") {
		if (slave.devotion > 50) {
			if (act === Acts.ORAL) {
				if (slaveApproves) {
					text.push(`${slave.slaveName}'s face visibly brightens at the prospect of ${fetishDesc}, even if it's an animal${slave.fetish === "cumslut" ? `'s cum` : ` that ${he} has to suck off`}.`);
				} else {
					text.push(`${slave.slaveName} visibly blanches at the thought of having to suck down an animal's cum, but ${he} is so devoted to you that ${he} reluctantly agrees.`);
				}
			} else {
				if ((act === Acts.VAGINAL && slave.vagina > 0) ||
					(act === Acts.ANAL && slave.anus > 0)) {
					if (slaveApproves) {
						text.push(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, even if the dick is an animal's.`);
					} else {
						text.push(`${slave.slaveName} looks visibly disturbed, but is so attentive to your will that ${he} agrees.`);
					}
				} else {
					if (slaveApproves) {
						text.push(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, although ${he} seems a bit hesitant at the thought of giving ${his} virginity to an animal.`);
					} else {
						text.push(`${slave.slaveName} looks visibly shaken at the thought of having ${his} precious ${!canDoVaginal(slave) ? `anal ` : ``}virginity taken by an animal, but is so attentive to your will that ${he} ultimately agrees.`);
					}
				}
			}
		} else if (slave.devotion > 20) {
			if (act === Acts.ORAL) {
				if (slaveApproves) {
					text.push(`${slave.slaveName} isn't too keen on the idea of sucking off an animal, but the idea of ${fetishDesc} is enough to get ${him} to comply.`);
				} else {
					text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing an animal, but quickly regains ${his} composure.`);
				}
			} else {
				if (
					(act === Acts.VAGINAL && slave.vagina > 0) ||
						(act === Acts.ANAL && slave.anus > 0)
				) {
					if (slaveApproves) {
						text.push(`${slave.slaveName} doesn't seem terribly keen on the idea of fucking an animal, but the thought of ${fetishDesc} seems to be enough to win ${him} over.`);
					} else {
						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of fucking an animal, but quickly regains ${his} composure.`);
					}
				} else {
					if (slaveApproves) {
						text.push(`${slave.slaveName} clearly has some reservations about having ${his} ${act === Acts.ANAL ? `anal ` : ``}virginity taken by ${anAnimal}, but the thought of ${fetishDesc} is enough to make agree to comply.`);
					} else {
						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of having ${his} precious ${act === Acts.ANAL ? `rosebud` : `pearl`} taken by a beast, but quickly regains ${his} composure.`);
					}
				}
			}
		} else if (slave.devotion >= -20) {
			if (act === Acts.ORAL) {
				if (slaveApproves) {
					text.push(`${slave.slaveName} looks disgusted at the thought of sucking off an animal at first, but the thought of the ${fetishDesc} that comes with it seems to spark a small flame of lust in ${him}.`);
				} else {
					text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of blowing an animal${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
				}
			} else {
				if ((act === Acts.VAGINAL && slave.vagina > 0) || (act === Acts.ANAL && slave.anus > 0)) {
					if (slaveApproves) {
						text.push(`${slave.slaveName} looks disgusted at the thought of fucking an animal at first, but the thought of the ${fetishDesc} that comes with it seems to spark a small flame of lust in ${him}.`);
					} else {
						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of fucking an animal${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
					}
				} else {
					if (slaveApproves) {
						text.push(`${slave.slaveName} clearly has some reservations about having ${his} ${act === Acts.ANAL ? `anal ` : ``}virginity taken by ${anAnimal}, but the thought of ${fetishDesc} is enough to make agree to comply.`);
					} else {
						text.push(`${slave.slaveName} tries in vain to conceal ${his} horror at the thought of having ${his} precious ${act === Acts.ANAL ? `rosebud` : `pearl`} taken by a beast${canWalk(slave) ? `, and only the threat of worse punishment keeps ${him} from running away as fast as ${he} can` : ``}.`);
					}
				}
			}
		} else {
			text.push(`${slave.slaveName}'s face contorts into a mixture of ${slave.devotion < -50 ? `hatred, anger, and disgust` : `anger and disgust`}, ${canWalk(slave)
				? `and only the threat of far worse punishment is enough to prevent ${him} from running out of the room`
				: `but ${he} knows ${he} is powerless to stop you`}.`);
		}
	}

	if (slave.devotion > 50) {
		if (act === Acts.ORAL) {
			text.push(`You have ${him} kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} waits, showing little concern when the slave reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, ${slave.slaveName} takes its cock and begins to give it a few tentative licks before finally putting it in ${his} mouth.`);
		} else {
			text.push(`You have ${him} ${App.Data.clothes.get(slave.clothes).exposure <= 3 ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed.`);
		}

		switch (animal.name) {
			case V.active.canine:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`The slave seems to quickly get over the fact that the dick currently in ${his} mouth belongs to a canine as ${his} more carnal desires kick in.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, then gives a groan as the beast thrusts, filling ${his} throat.`);
					}
				} else {
					if (canWalk(slave)) {
						text.push(`The canine clambers up to mount ${slave.slaveName}, eliciting a squeal from the ${girl} as its claws dig into ${his} flesh.`);
					} else {
						text.push(`The canine takes a few curious sniffs, then lines up its large cock with ${slave.slaveName}'s ${orifice()}.`);
					}

					text.push(`It takes a few tries, but the ${animal.name} finally manages to sink its cock into ${his} ${slaveApproves && act === Acts.VAGINAL ? `wet ` : ``}${orifice()}.`);
				}
				break;
			case V.active.hooved:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`The slave seems to quickly get over the fact that dick currently in ${his} mouth is not a human one as ${his} more carnal desires kick in.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, then gives a groan as the beast thrusts, stretching ${his} poor throat to the limit.`);
					}
				} else {
					text.push(`${slave.slaveName} gives a long, drawn-out moan as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
				}
				break;
			case V.active.feline:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`The slave seems to quickly get over the fact that dick currently in ${his} mouth belongs to ${anAnimal} as ${his} more carnal desires kick in.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, then gives a groan as the beast thrusts, the barbs on its cock rubbing the inside of ${his} mouth raw.`);
					}
				} else {
					text.push(`${slave.slaveName} gives a squeal of pain as the barbed cock makes its way into ${his} ${orifice()}.`);
				}
				break;
			default:
				throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
		}

		if (act !== Acts.ORAL) {
			text.push(virginityCheck(act));
		}
	} else if (slave.devotion > 20) {
		if (act === Acts.ORAL) {
			text.push(`You tell ${him} to kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} waits, showing little concern when the slave hesitantly reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, ${slave.slaveName} takes its cock, and, after taking a moment to steel ${his} resolve, begins to give it a few reluctant licks before putting it in ${his} mouth.`);
		} else {
			text.push(`You tell ${him} to ${App.Data.clothes.get(slave.clothes).exposure <= 3 ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few seconds for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed.`);
		}

		switch (animal.name) {
			case V.active.canine:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`Though the slave still seems to have some reservations about sucking off an animal, ${he} seems to forget that the cock in ${his} mouth belongs to ${anAnimal} soon enough, once ${his} carnal desires kick in.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
					}
				} else {
					if (canWalk(slave)) {
						text.push(`The canine clambers up to mount ${slave.slaveName}, eliciting a squeal from the ${girl} as its claws dig into ${his} flesh.`);
					} else {
						text.push(`The canine takes a few curious sniffs, then lines up its large cock with ${slave.slaveName}'s ${orifice()}.`);
					}

					text.push(`It takes a few tries, but the ${animal.name} finally manages to sink its cock into ${his} ${slaveApproves && act === Acts.VAGINAL ? `wet ` : ``}${orifice()}.`);
				}
				break;
			case V.active.hooved:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`Though the slave still seems to have some reservations about sucking off ${anAnimal}, ${he} seems to forget that the cock in ${his} mouth isn't human soon enough, once ${his} carnal desires kick in.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
					}
				} else {
					text.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
				}
				break;
			case V.active.feline:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`Though the slave still seems to have some reservations about sucking off an animal, ${he} seems to forget that the cock in ${his} mouth belongs to a feline soon enough, once ${his} carnal desires kick in.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s barbed dick fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
					}
				} else {
					text.push(`${slave.slaveName} gives a squeal of pain as the barbed cock makes its way into ${his} ${orifice()}.`);
				}
				break;
			default:
				throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
		}

		if (act !== Acts.ORAL) {
			text.push(virginityCheck(act));
		}
	} else if (slave.devotion > -20) {
		if (act === Acts.ORAL) {
			text.push(`You force ${him} to kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} waits, showing little concern when the slave reluctantly reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, ${slave.slaveName} takes its cock and begins to give it a few tentative licks before finally putting it in ${his} mouth.`);
		} else {
			text.push(`You force ${him} to ${App.Data.clothes.get(slave.clothes).exposure <= 3 ? `take off ${his} clothes and ` : ``}get on the floor, ass in the air, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed.`);
		}

		switch (animal.name) {
			case V.active.canine:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`Though the slave still seems to have some reservations about sucking off an animal, ${he} seems to forget that the cock in ${his} mouth belongs to ${anAnimal} soon enough, once ${his} carnal desires kick in.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
					}
				} else {
					if (canWalk(slave)) {
						text.push(`The canine clambers up to mount ${slave.slaveName}, eliciting a squeal from the ${girl} as its claws dig into ${his} flesh.`);
					} else {
						text.push(`The canine takes a few curious sniffs, then lines up its large cock with ${slave.slaveName}'s ${orifice()}.`);
					}

					text.push(`It takes a few tries, but the ${animal.name} finally manages to sink its cock into ${his} ${slaveApproves && act === Acts.VAGINAL ? `wet ` : ``}${orifice()}.`);
				}
				break;
			case V.active.hooved:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`Though the slave still seems to have some reservations about sucking off ${anAnimal}, ${he} seems to forget that the cock in ${his} mouth isn't human soon enough, once ${his} carnal desires kick in.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
					}
				} else {
					text.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
				}
				break;
			case V.active.feline:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`Though the slave still seems to have some reservations about sucking off an animal, ${he} seems to forget that the cock in ${his} mouth belongs to a feline soon enough, once ${his} carnal desires kick in.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s barbed dick fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
					}
				} else {
					text.push(`${slave.slaveName} gives a squeal of pain as the barbed cock makes its way into ${his} ${orifice()}.`);
				}
				break;
			default:
				throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
		}

		if (act !== Acts.ORAL) {
			text.push(virginityCheck(act));
		}
	} else {
		if (act === Acts.ORAL) {
			text.push(`You have to physically force ${him} to kneel on the floor before calling in the ${animal.name}. The beast slowly saunters up to the slave where ${he} is restrained, showing little concern when another slave reaches out and begins masturbating it to begin the process of getting the animal hard. Once the ${animal.name} is hard enough, the slave takes its cock and lines it up with ${slave.slaveName}'s mouth. The animal needs no prompting, and thrusts itself into ${his} ring-gagged mouth.`);
		} else {
			text.push(`You have to physically force ${him} to ${App.Data.clothes.get(slave.clothes).exposure <= 3 ? `take off ${his} clothes and ` : ``} get on the floor, ass in the air and restraints around ${his} wrists and ankles, before calling in the ${animal.name}. The beast slowly saunters up to the slave, where it takes only a few short moments for its animal brain to realize that what it is standing behind is a warm hole that needs to be filled with seed.`);
		}

		switch (animal.name) {
			case V.active.canine:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`The slave glares daggers at you as ${he} takes the full length of the canine's cock in ${his} mouth, but ${slave.dick
							? canAchieveErection(slave)
								? `${his} fully-erect dick`
								: `the precum leaking from ${his} dick`
							: slave.vagina > -1
								? `a slight sheen on ${his} pussylips`
								: `a slight blush to ${his} cheeks`}
								tells you that ${he}'s enjoying this, at least a little.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} would have run away a long time ago if ${he} wasn't a little tied up at the moment.`);
					}
				} else {
					if (canWalk(slave)) {
						text.push(`The canine clambers up to mount ${slave.slaveName}, eliciting a squeal from the ${girl} as its claws dig into ${his} flesh.`);
					} else {
						text.push(`The canine takes a few curious sniffs, then lines up its large cock with ${slave.slaveName}'s ${orifice()}.`);
					}

					text.push(`It takes a few tries, but the ${animal.name} finally manages to sink its cock into ${his} ${slaveApproves && act === Acts.VAGINAL ? `wet ` : ``}${orifice()}.`);
				}
				break;
			case V.active.hooved:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`The slave glares daggers at you as ${he} takes the full length of the ${animal.name}'s cock in ${his} mouth, but ${slave.dick
							? canAchieveErection(slave)
								? `${his} fully-erect dick`
								: `the precum leaking from ${his} dick`
							: slave.vagina > -1
								? `a slight sheen on ${his} pussylips`
								: `a slight blush to ${his} cheeks`}
								tells you that ${he}'s enjoying this, at least a little.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} would have run away a long time ago if ${he} wasn't a little tied up at the moment.`);
					}
				} else {
					text.push(`${slave.slaveName} lets out a blood-curdling scream as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
				}
				break;
			case V.active.feline:
				if (type === Acts.ORAL) {
					if (slaveApproves) {
						text.push(`The slave glares daggers at you as ${he} takes the full length of the feline's cock in ${his} mouth, but ${slave.dick
							? canAchieveErection(slave)
								? `${his} fully-erect dick`
								: `the precum leaking from ${his} dick`
							: slave.vagina > -1
								? `a slight sheen on ${his} pussylips`
								: `a slight blush to ${his} cheeks`}
								tells you that ${he}'s enjoying this, at least a little.`);
					} else {
						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s barbed dick fills it, and you get the feeling ${he} would have run away a long time ago if ${he} wasn't a little tied up at the moment .`);
					}
				} else {
					text.push(`${slave.slaveName} lets out a blood-curdling scream as the barbed cock makes its way into ${his} ${orifice()}.`);
				}
				break;
			default:
				throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
		}

		if (act !== Acts.ORAL) {
			text.push(virginityCheck(act));
		}
	}

	switch (animal.name) {
		case V.active.canine:
			if (act === Acts.ORAL) {
				// TODO: rewrite this so its not so similar
				text.push(`The ${animal.species === "dog" ? `hound` : animal.name} wastes no time in beginning to hammer away at ${his} ${orifice()} in the way only canines can, causing ${slave.slaveName} to moan uncontrollably as its thick, veiny member probes the depths of ${his} ${orifice()}. A few short minutes later, ${he} gives a loud groan ${slaveApproves ? `and shakes in orgasm ` : ``}as the ${animal.name}'s knot begins to swell and its dick begins to erupt a thick stream of jizz down ${his} abused throat. Soon enough, the ${animal.name} finally finishes cumming and its knot is sufficiently small enough to slip out of ${slave.slaveName}'s mouth, causing ${him} to immediately begin coughing and retching uncontrollably. Having finished its business, the ${animal.name} runs off, presumably in search of food.`);
			} else {
				text.push(`The ${animal.species === "dog" ? `hound` : animal.name} wastes no time in beginning to hammer away at ${his} ${orifice()} in the way only canines can, causing ${slave.slaveName} to moan uncontrollably as its thick, veiny member probes the depths of ${his} ${orifice()}. A few short minutes later, ${he} gives a loud groan ${slaveApproves ? `and shakes in orgasm ` : ``}as the ${animal.name}'s knot begins to swell and its dick begins to erupt a thick stream of jizz into ${his} ${orifice()}. Soon enough, the ${animal.name} finally finishes cumming and its knot is sufficiently small enough to slip out of ${slave.slaveName}'s ${act === Acts.VAGINAL && slave.vagina < 3 || act === Acts.ANAL && slave.anus < 2
					? `now-gaping ${orifice()}`
					: orifice()}, causing a thick stream of cum to slide out of it. Having finished its business, the ${animal.name} runs off, presumably in search of food.`);
			}
			break;
		case V.active.hooved:
			if (act === Acts.ORAL) {
				text.push(`The ${animal.species === "horse" ? `stallion` : animal.name} begins to thrust faster and faster, causing ${him} to moan and groan past the huge ${animal.species} cock stretching ${his} poor throat to its limits. Before too long, the ${animal.name}'s movements begin to slow, and you can see its large testicles contract as its begins to erupt and pour its thick semen down ${his} throat and into ${his} stomach, filling it to the brim. After what seems like an impossibly long time, the ${animal.name}'s dick finally begins to soften and pull out, causing ${slave.slaveName} to begin coughing and retching uncontrollably. You have another slave lead the ${animal.name} away, with a fresh apple as a treat for its good performance.`);
			} else {
				text.push(`The ${animal.species === "horse" ? `stallion` : animal.name} begins to thrust faster and faster, causing ${him} to moan and groan as the huge ${animal.species} cock ${act === Acts.VAGINAL ? `batters ${his} cervix` : `fills ${him} completely`}. Before too long, the ${animal.name}'s movements begin to slow, and you can see its large testicles contract as its begins to erupt and fill ${his} ${orifice()} with its thick baby batter. After what seems like an impossibly long time, the ${animal.name}'s dick finally begins to soften and pull out, leaving ${slave.slaveName} panting and covered in sweat. You have another slave lead the ${animal.name} away, with a fresh apple as a treat for its good performance.`);
			}
			break;
		case V.active.feline:
			if (act === Acts.ORAL) {
				text.push(`The ${animal.name} begins to move, thrusting faster and faster. The ${girl} underneath it can't stop a groan of pain from escaping ${his} lips as the ${animal.species}'s barbed dick rubs the inside of ${his} mouth and throat raw. After a few minutes of painful coupling, the ${animal.species}'s thrusts finally slow, then stop completely as its ${animal.species !== "cat" ? `large` : ``} cock erupts down ${slave.slaveName}'s throat. With a ${animal.species !== "cat" ? `deep bellow` : `loud meow`}, he finally dismounts, gives you a long look, then stalks off.`);
			} else {
				text.push(`The ${animal.name} begins to move, thrusting faster and faster. The ${girl} underneath it can't stop a groan of pain from escaping ${his} lips as the ${animal.species}'s barbed dick rubs the inside of ${his} ${orifice()} raw. After a few minutes of painful coupling, the ${animal.species}'s thrusts finally slow, then stop completely as its ${animal.species !== "cat" ? `large` : ``} cock erupts, filling ${slave.slaveName} with its sperm. With a ${animal.species !== "cat" ? `deep bellow` : `loud meow`}, he finally dismounts, gives you a long look, then stalks off.`);
			}

			healthDamage(slave, 1);
			break;
		default:
			throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
	}

	if (act === Acts.VAGINAL) {
		slave.vagina = slave.vagina < animal.dick.size ? animal.dick.size : slave.vagina;
	} else if (act === Acts.ANAL) {
		slave.anus = slave.anus < animal.dick.size ? animal.dick.size : slave.anus;
	}

	if (act !== Acts.ORAL && canGetPregnant(slave) && canBreed(slave, animal)) {
		knockMeUp(slave, 5, hole, -8);
	}

	if (random(1, 100) > 100 + slave.devotion && slave.energy < 95) {
		text.push(slaveGainsFlaw());
	} else if (slave.devotion > 20) {
		text.push(slaveGainsQuirk());
	}

	if (V.postSexCleanUp) {
		if (act !== Acts.ORAL) {
			if (act === Acts.VAGINAL) {
				if (slave.vagina === 3) {
					text.push(`${capFirstChar(animal.name)} cum drips out of ${his} fucked-out hole.`);
				} else if (slave.vagina === 2) {
					text.push(`${capFirstChar(animal.name)} cum drips out of ${his} stretched vagina.`);
				} else if (slave.vagina === 1) {
					text.push(`${His} still-tight pussy keeps the ${animal.name}'s cum inside ${him}.`);
				} else {
					text.push(`${capFirstChar(animal.name)} cum slides right out of ${his} gaping hole.`);
				}
			} else {
				if (slave.anus === 1) {
					text.push(`${His} still-tight asshole keeps the ${animal.name}'s cum inside ${him}.`);
				} else if (slave.anus === 2) {
					text.push(`${capFirstChar(animal.name)} cum drips out of ${his} loosened anus.`);
				} else {
					text.push(`${capFirstChar(animal.name)} cum slides right out of ${his} fucked-out asshole.`);
				}
			}

			if (canWalk(slave)) {
				if (act === "vaginal") {
					text.push(`${He} uses a quick douche to clean ${his} ${slave.vagina < 2 ? `tight` : slave.vagina > 3 ? `loose` : ``} pussy,`);
				} else {
					text.push(`${He} uses an enema to clean ${his} ${slave.anus < 2 ? `tight` : slave.anus < 3 ? `used` : `gaping`} butthole,`);
				}

				switch (slave.assignment) {
					case Job.BROTHEL:
						text.push(`just like ${he} does between each customer.`);
						break;
					case Job.CLUB:
						text.push(`just like ${he} does in the club.`);
						break;
					case Job.DAIRY:
						text.push(`to avoid besmirching the nice clean dairy.`);
						break;
					case Job.FARMYARD:
						text.push(`to avoid tainting the food in ${V.farmyardName}.`);
						break;
					case Job.QUARTER:
						text.push(`mostly to keep everything ${he} has to clean from getting any dirtier.`);
						break;
					case Job.WHORE:
						text.push(`before returning to offering it for sale.`);
						break;
					case Job.PUBLIC:
						text.push(`before returning to offering it for free.`);
						break;
					case Job.REST:
						text.push(`before crawling back into bed.`);
						break;
					case Job.MILKED:
						text.push(`${slave.lactation > 0 ? `before going to get ${his} uncomfortably milk-filled tits drained` : `and then rests until ${his} balls are ready to be drained again`}.`);
						break;
					case Job.HOUSE:
						text.push(`since ${his} chores didn't perform themselves while you used ${his} fuckhole.`);
						break;
					case Job.FUCKTOY:
						text.push(`before returning to await your next use of ${his} fuckhole, as though nothing had happened.`);
						break;
					case Job.SUBORDINATE:
						text.push(`though it's only a matter of time before another slave decides to play with ${his} fuckhole.`);
						break;
					case Job.HEADGIRL:
						text.push(`worried that ${his} charges got up to trouble while ${he} enjoyed ${his} ${properMaster()}'s use.`);
						break;
					case Job.BODYGUARD:
						text.push(`so ${he} can be fresh and ready for more sexual use even as ${he} guards your person.`);
						break;
					case Job.TEACHER:
						text.push(`before ${he} returns to teaching ${his} classes.`);
						break;
					default:
						text.push(`before ${he} returns to ${slave.assignment}.`);
						break;
				}
			}
		}

		text.toParagraph();
	}

	return frag;

	// Text Functions

	function slaveGainsFlaw() {
		switch (act) {
			case Acts.ORAL:
				if (slave.sexualFlaw !== "hates oral") {
					slave.sexualFlaw = "hates oral";

					return `<span class="flaw gain">Having ${anAnimal} fuck ${his} throat by force has given ${him} a hatred of oral sex.</span>`;
				}

				break;
			case Acts.VAGINAL:
				if (slave.sexualFlaw !== "hates penetration") {
					slave.sexualFlaw = "hates penetration";

					return `<span class="flaw gain">Having ${anAnimal} fuck ${his} by force has given ${him} a hatred of penetration.</span>`;
				}

				break;
			case Acts.ANAL:
				if (slave.sexualFlaw !== "hates anal") {
					slave.sexualFlaw = "hates anal";

					return `<span class="flaw gain">Having ${anAnimal} fuck ${his} asshole by force has given ${him} a hatred of anal penetration.</span>`;
				}

				break;
			default:
				throw new Error(`Unexpected act type '${act}' in fAnimal().`);
		}
	}

	function slaveGainsQuirk() {
		if (slave.fetish === "none") {
			if (random(1, 100) > 90) {	// 10% chance of gaining fetish
				/** @type {FC.Fetish[]} */
				const fetishes = [
					"humiliation",
					"masochist",
				];

				if (act === Acts.ANAL) {
					fetishes.push("buttslut");
				}

				const fetish = fetishes.random();

				fetishChange(slave, fetish);

				if (fetish === "buttslut") {
					return `${He} couldn't help but orgasm when the ${animal.name} filled ${him} with its seed, and now the thought of another member in ${his} bottom <span class="fetish gain>turns ${him} on.</span>`;
				}
				if (fetish === "humiliation") {
					return `You can't help but notice that ${he} ${slave.dick > 0 ? `is sporting an erection` : ``}${slave.vagina > -1 ? slave.dick > 0 ? ` and ` : `has a distinct sheen on ${his} pussylips` : `seems distinctly uncomfortable`} after the beast has finished. <span class="fetish gain">It seems ${he} is a bit of a humiliation slut!</span>`;
				}
				if (fetish === "masochist") {
					return `${He} didn't seem to mind the pain – in fact, it seems ${he} got off on it. <span class="fetish gain">${He}'s a masochist!</span>`;
				}
			}
		}
		if (slave.behavioralQuirk === "none") {
			if (random(1, 100) > 90) {	// 10% chance of gaining quirk
				/** @type {FC.BehavioralQuirk[]} */
				const quirks = [];

				if (V.policies.bestialityOpenness === 0) {
					quirks.push("sinful");
				}

				const quirk = quirks.random();

				slave.behavioralQuirk = quirk;

				if (quirk === "sinful") {
					return `The ${girl} seemed to take great pleasure in doing something as taboo as fucking an animal. You might notice ${him} begin to try to break more and more cultural norms in the days to come <span class="fetish gain">as ${his} sinful side begins to come out.</span>`;
				}
			}
		}
		if (slave.sexualQuirk === "none") {
			if (random(1, 100) > 90) {	// 10% chance of gaining quirk
				/** @type {FC.SexualQuirk[]} */
				const quirks = [
					"perverted",
					"unflinching",
				];

				if (act === Acts.ANAL) {
					quirks.push("painal queen");
				}
				if (animal.dick.size > 4) {
					quirks.push("size queen");
				}

				const quirk = quirks.random();

				slave.sexualQuirk = quirk;

				if (quirk === "painal queen") {
					return `${slave.slaveName}'s asshole took quite the pounding during the rutting, and ${he}${slave.dick > 0 ? `'s sporting an erection` : ``}${slave.vagina > -1 ? slave.dick > 0 ? ` and ` : ` has a distinct sheen on ${his} pussylips` : ` seems distinctly uncomfortable`} after the fact. <span class="fetish gain">It seems ${he} got off on the painal.</span`;
				}
				if (quirk === "perverted") {
					return `${He} seems distinctly uncomfortable after the rutting has finished, as though <span class="fetish gain">doing something so perverted had turned ${him} on.</span>`;
				}
				if (quirk === "size queen") {
					return `The ${animal.name} had had a dick large enough to put even well-endowed men to shame, and the orgasm it had given ${him} left ${him} wondering aloud if <span class="fetish gain">normal-sized cocks would ever satisfy ${him} again.</span>`;
				}
				if (quirk === "unflinching") {
					return `Being bred like an animal by an <i>actual</i> animal isn't an easy task, but you can tell it's one ${he} enjoyed. <span class="fetish gain">It seems ${he} is now more receptive to doing more taboo and even downright disturbing acts.</span>`;
				}
			}
		}
	}

	// Virginity Check Functions

	function virginityCheck(type) {
		const text = [];

		switch (type) {
			case Acts.VAGINAL:
				if (act === Acts.VAGINAL && slave.vagina === 0) {
					text.push(`The slave gives a loud ${slave.devotion > 20 ? `moan` : `groan`} as <span class="virginity loss">${his} virginity is taken from ${him}${slave.devotion < -20 ? ` by force` : ``}.</span>`);

					if (slave.devotion >= -20) {
						if (slaveApproves) {
							text.push(`Losing ${his} virginity in such a painful manner has <span class="devotion inc">increased ${his} devotion to you.</span>`);

							slave.devotion += 10;
						} else {
							if (slave.devotion > 50) {
								text.push(`Since ${he} is well broken, losing ${his} virginity in such a manner has <span class="devotion inc">increased ${his} submission to you.</span>`);

								slave.devotion += 5;
							} else if (slave.devotion >= -20) {
								text.push(`Losing ${his} virginity in such a manner has <span class="devotion inc">increased ${his} submission to you,</span> though ${he} is <span class="trust dec">fearful</span> that you'll decide to only use ${him} to sate your animals' lust.`);

								slave.devotion += 5;
								slave.trust -= 5;
							} else {
								text.push(`${He} is clearly <span class="devotion dec">unhappy</span> in the manner in which ${his} virginity has been taken, and ${he} <span class="trust dec">fears</span> you'll decide to only use ${him} to sate your animals' lust.`);

								slave.devotion -= 10;
								slave.trust -= 10;
							}
						}
					} else {
						text.push(`Having ${his} pearl of great price taken by a mere beast has <span class="devotion dec">reinforced the hatred ${he} holds towards you,</span> and ${he} is <span class="trust dec">terrified</span> you'll only use ${him} as a plaything for your animals.`);

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

					text.push(`Having ${his} cherry popped in such a manner was extremely painful and <span class="health dec">slightly damaged ${his} health.</span>`);

					healthDamage(slave, 5);
				}

				break;
			case Acts.ANAL:
				if (act === Acts.ANAL && slave.anus === 0) {
					text.push(`The slave gives a loud ${slave.devotion > 20 ? `moan` : `groan`} as <span class="virginity loss">${his} anal virginity is taken from ${him}${slave.devotion < -20 ? ` by force` : ``}.</span>`);

					if (slave.devotion >= -20) {
						if (slaveApproves) {
							text.push(`Losing ${his} anal virginity in such a painful manner has <span class="devotion inc">increased ${his} devotion to you.</span>`);

							slave.devotion += 10;
						} else {
							if (slave.devotion > 50) {
								text.push(`Since ${he} is well broken, losing ${his} anal virginity in such a manner has <span class="devotion inc">increased ${his} submission to you.</span>`);

								slave.devotion += 5;
							} else if (slave.devotion >= -20) {
								text.push(`Losing ${his} anal virginity in such a manner has <span class="devotion inc">increased ${his} submission to you,</span> though ${he} is <span class="trust dec">fearful</span> that you'll decide to only use ${him} to sate your animals' lust.`);

								slave.devotion += 5;
								slave.trust -= 5;
							} else {
								text.push(`${He} is clearly <span class="devotion dec">unhappy</span> in the manner in which ${his} anal virginity has been taken, and ${he} <span class="trust dec">fears</span> you'll decide to only use ${him} to sate your animals' lust.`);

								slave.devotion -= 10;
								slave.trust -= 10;
							}
						}
					} else {
						text.push(`Having ${his} pearl of great price taken by a mere beast has <span class="devotion dec">reinforced the hatred ${he} holds towards you,</span> and ${he} is <span class="trust dec">terrified</span> you'll only use ${him} as a plaything for your animals.`);

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

					text.push(`Having ${his} rosebud broken in in such a manner was extremely painful and <span class="health dec">slightly damaged ${his} health.</span>`);

					healthDamage(slave, 5);
				}

				break;
		}

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


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

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

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

	r.push(`You call ${him} over so you can`);
	if (slave.anus > 3) {
		r.push(`fuck ${his} gaping anus.`);
	} else if (slave.anus === 3) {
		r.push(`fuck ${his} loose butthole.`);
	} else if (slave.anus === 2) {
		r.push(`use ${his} whorish asshole.`);
	} else if (slave.anus === 1) {
		r.push(`use ${his} tight butt.`);
	} else {
		r.push(`take ${his} anal virginity.`);
	}

	if (slave.fetish === "buttslut" && slave.devotion >= -20) {
		r.push(`${He}'s delighted at the prospect of ${his} favorite activity.`);
	} else if (slave.fetish === "buttslut") {
		r.push(`${He} perks up at the prospect of ${his} favorite activity, but the idea of spending it with you instantly sours ${his} mood.`);
	}

	if (slave.anusTat === "tribal patterns") {
		r.push(`${His} bleached asshole is an inviting sight, after all.`);
	} else if (slave.anusTat === "scenes") {
		r.push(`${His} tattooed asshole invites sodomy, after all.`);
	} else if (slave.anusTat === "degradation") {
		r.push(`The tattoos on ${his} asshole make it clear ${he}'s an anal slut, after all.`);
	}

	if (slave.heels === 1) {
		if (shoeHeelCategory(slave) > 0) {
			r.push(`As ${he} went past your desk, ${his} high heels and surgically altered legs enforced a gait that presented ${his} butt enticingly.`);
		} else {
			r.push(`As ${he} crawls along on`);
			if (hasAllLimbs(slave)) {
				r.push(`all fours,`);
			} else {
				r.push(`the ground,`);
			}
			r.push(`${his} anus is readily available.`);
		}
	}

	if (slave.piercing.anus.weight > 1) {
		r.push(`The ring of stud piercings around ${his} anus should massage you delightfully as you sodomize ${him}.`);
	} else if (slave.piercing.anus.weight === 1) {
		r.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 !== 0 && slave.anusTat !== 4) {
		r.push(`${His} anus is invitingly bleached,`);
		if (slave.vagina > -1) {
			r.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 {
			r.push(`making ${his} sole fuckable hole look nice and natural.`);
		}
	}

	if (slave.anus === 0) {
		if (slave.devotion > 20) {
			r.push(`${He} accepts your orders without comment and presents ${his} virgin anus for defloration. You`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on and`);
			}
			r.push(`gently sodomize ${him}. You gently ease into ${his} butthole and slowly accelerate your thrusting into ${his} ass. 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. ${He} looks forward to having ${his} asshole fucked by you again.`);
			slave.devotion += 4;
		} else if (slave.devotion >= -20) {
			r.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) {
				r.push(`don a strap-on and`);
			}
			r.push(`fuck ${his} ass. You gently ease into ${his} butthole and slowly accelerate your thrusting into ${his} ass. However ${he} still squeals in pain as you continue pounding. ${His} tight little ass has been broken in, and ${he} fears further anal pain.`);
			slave.trust -= 5;
		} else {
			r.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)) {
				r.push(`while you hold ${his} ${hasBothArms(slave) ? `arms` : `arm`} behind ${him}`);
			}
			r.push(r.pop() + `.`);
			r.push(`You force yourself into ${his} butthole and continue thrusting your member into ${his} ass. ${He} sobs and cries with disgust while you pump into ${his} rear. 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 -= 10;
			slave.trust -= 10;
		}
		slave.anus++;
	} else if (slave.fetish === "mindbroken") {
		if (hasAnyArms(slave)) {
			r.push(`You instruct ${him} to present ${his} anus. ${He} dully`);
			if (hasBothLegs(slave)) {
				r.push(`kneels`);
			} else {
				r.push(`bends over`);
			}
			r.push(`and spreads ${his} buttocks${V.PC.dick === 0 ? ` as you don a strap-on` : ``}. You spit on ${his} hole and ram`);
		} else {
			r.push(`Talking to a broken mind is pointless, so you simply set ${him} on the couch, spread ${his} buttocks with one hand, spit on ${his} hole, and ram`);
		}
		if (V.PC.dick === 0) {
			r.push(`it`);
		} else {
			r.push(`your cock`);
		}
		r.push(`up ${his}`);
		if (V.seeRace === 1) {
			r.push(slave.race);
		}
		r.push(`butt. ${His} butthole spasms as you assrape ${him},`);
		if (V.PC.dick === 0) {
			r.push(`an amusing sight.`);
		} else {
			r.push(`squeezing your dick nicely.`);
		}
		if (slave.dick !== 0 && canAchieveErection(slave)) {
			if (slave.chastityPenis === 1) {
				r.push(`Automatic responses give ${him} an erection, which ${his} chastity makes so uncomfortable that ${he} spasms. This cycle continues repeatedly, ${his} rectum squeezing unconsciously each time.`);
			} else if (slave.prostate !== 0) {
				r.push(`Despite ${his} mental deficiency, the prostate stimulation gives ${him} an erection anyway.`);
			} else {
				r.push(`Without a prostate, there's little stimulation to provoke an involuntary response, and ${his} cock stays limp.`);
			}
		} else if (slave.chastityPenis === 1) {
			r.push(`${His} dick chastity keeps ${his} pointless cock hidden away while you use ${his} anus like a pussy.`);
		} else if (slave.dick !== 0) {
			r.push(`${His} cock is totally flaccid throughout.`);
		}
	} else if (slave.devotion < -20) {
		if (!isAmputee(slave)) {
			r.push(`You instruct ${him} to present ${his} anus${V.PC.dick === 0 ? ` as you don a strap-on` : ``}. Horrified, ${he} tries to back away, but you catch ${him} and throw ${him} on the couch next to your desk. ${He} tries to`);
			if (hasAnyArms(slave)) {
				r.push(`shield ${his} asshole,`);
			} else {
				r.push(`back away,`);
			}
			r.push(`but you pin`);
			if (hasAnyArms(slave)) {
				r.push(`${his} ${hasBothArms(slave) ? "hands" : "hand"} behind ${him} with one hand,`);
			} else {
				r.push(`${him} down,`);
			}
			r.push(`spit on ${his} hole, and ram your`);
			if (V.PC.dick === 0) {
				r.push(`fake dick`);
			} else {
				r.push(`cock`);
			}
			r.push(`up ${his} butt with the other hand.`);
		} else {
			r.push(`You tell ${him} it's time for an assfuck. ${He}'s horrified, but as an amputee can do nothing about it. You spit on ${his} hole and ram your`);
			if (V.PC.dick === 0) {
				r.push(`fake dick`);
			} else {
				r.push(`cock`);
			}
			r.push(`up ${his}`);
			if (V.seeRace === 1) {
				r.push(slave.race);
			}
			r.push(`butt.`);
		}
		r.push(`${His} butthole spasms as you assrape ${him},`);
		if (V.PC.dick === 0) {
			r.push(`an amusing sight.`);
		} else {
			r.push(`squeezing your dick nicely.`);
		}
		if (slave.dick !== 0 && canAchieveErection(slave)) {
			if (slave.prostate === 0) {
				r.push(`${He} lacks a prostate, denying ${him} any real pleasure from this. ${His} dick stays flaccid as you rape ${him}.`);
			} else if (slave.chastityPenis === 1) {
				r.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 {
				r.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) {
			r.push(`${His} dick chastity keeps ${his} bitch cock hidden away while you use ${his} anus like a pussy.`);
		} else if (slave.dick !== 0) {
			r.push(`${His} flaccid dick is ground into the back of the couch as you rape ${him}.`);
		}
	} else if (slave.devotion <= 20 && slave.vagina < 0) {
		if (!isAmputee(slave)) {
			r.push(`You instruct ${him} to present ${his} anus${V.PC.dick === 0 ? ` as you don a strap-on` : ``}. ${He} knows a sissy slave takes it up the butt, and lies on the couch next to your desk with ${his}`);
			if (!hasAnyLegs(slave)) {
				r.push(`hips`);
			} else {
				r.push(hasBothLegs(slave) ? `legs` : `leg`);
			}
			r.push(`in the air, spreading ${his} buttocks`);
			if (!hasAnyArms(slave)) {
				r.push(`as best ${he} can.`);
			} else {
				r.push(`with ${his} ${hasBothArms(slave) ? `hands` : `hand`}.`);
			}
		} else {
			r.push(`You tell ${him} it's time for an assfuck. ${He}'s hesitant, but as an amputee can do nothing about it.`);
		}
		r.push(`You take your time and fuck ${his}`);
		if (V.seeRace === 1) {
			r.push(slave.race);
		}
		r.push(`butthole for a good long while`);
		if (slave.chastityPenis !== 1) {
			if (slave.dick !== 0) {
				r.push(`so ${his} limp dick flops around`);
			} else if (slave.balls !== 0) {
				r.push(`as ${his} erect dick waves in the air`);
			}
		}
		r.push(r.pop() + `.`);
		r.push(`This gives you enough time to stroke ${him} until ${he} gets aroused despite ${his} discomfort with anal. ${He} doesn't orgasm, but ${he}'s getting accustomed to ${his} asshole as a sexual organ.`);
	} else if (slave.devotion < 10) {
		if (!isAmputee(slave)) {
			r.push(`You instruct ${him} to present ${his}`);
			if (V.seeRace === 1) {
				r.push(slave.race);
			}
			r.push(`anus${V.PC.dick === 0 ? ` as you don a strap-on` : ``}. ${He} hesitates but eventually lies on the couch next to your desk with ${his}`);
			if (!hasAnyLegs(slave)) {
				r.push(`hips`);
			} else {
				r.push(hasBothLegs(slave) ? `legs` : `leg`);
			}
			r.push(`in the air, spreading ${his} buttocks`);
			if (!hasAnyArms(slave)) {
				r.push(`as best ${he} can.`);
			} else {
				r.push(`with ${his} ${hasBothArms(slave) ? `hands` : `hand`}.`);
			}
		} else {
			r.push(`You tell ${him} it's time for an assfuck. ${He}'s hesitant, but as an amputee can do nothing about it.`);
		}
		r.push(`You take your time and fuck ${his} butthole for a good long while.`);
		if (slave.anus === 1) {
			r.push(`${His} ass is so tight that ${he} winces with anal pain`);
		} else if (slave.anus === 2) {
			r.push(`${His} experienced ass takes your`);
			if (V.PC.dick === 0) {
				r.push(`fake dick`);
			} else {
				r.push(`cock`);
			}
			r.push(`without trouble`);
		} else {
			r.push(`${His} asspussy is so loose you can pound it as hard as you like`);
		}
		if (slave.dick !== 0 && !canAchieveErection(slave)) {
			r.push(`as ${his} limp dick flops around.`);
		} else if (slave.dick !== 0 && canAchieveErection(slave)) {
			r.push(`as ${his} erect dick waves in the air.`);
		} else if (slave.vagina === -1) {
			r.push(`as it does its duty as ${his} sole fuckhole.`);
		} else {
			r.push(`as it substitutes for ${his} pussy.`);
		}
		r.push(`${He} gets aroused despite ${his} discomfort with anal, though ${he} doesn't orgasm.`);
	} else {
		if (hasAnyLegs(slave)) {
			r.push(`${He} kneels on the couch`);
		} else {
			r.push(`You lay ${him} on the couch`);
		}
		r.push(`with ${his}`);
		if (V.seeRace === 1) {
			r.push(slave.race);
		}
		r.push(`butt facing you, back strongly arched to angle ${his} rectum for more comfortable anal coupling.`);
		if (hasAnyArms(slave) && slave.prostate > 1 && slave.dick > 3) {
			if (V.PC.dick === 0) {
				r.push(`While you don a strap-on, ${he}`);
			} else {
				r.push(`${He}`);
			}
			r.push(`shoves ${his} slavering dick down and around towards ${his} ass and squeezes it, pushing a lot of ${his} precum out to lube ${his} own asshole.`);
		} else {
			if (V.PC.dick === 0) {
				r.push(`You don a strap-on and let some saliva fall onto its head`);
			} else {
				r.push(`You let some saliva fall onto your dickhead`);
			}
			r.push(`before penetrating ${him}.`);
		}
		r.push(`You take your time and fuck ${his} butthole for a good long while.`);
		if (slave.anus === 1) {
			r.push(`${His} ass is so tight that ${he} has to concentrate on relaxing for you.`);
		} else if (slave.anus === 2) {
			r.push(`${His} experienced ass feels great.`);
		} else {
			r.push(`${His} asspussy is so loose you can pound it as hard as you like.`);
		}
		r.push(`${He} rubs ${his}`);
		if (!hasAnyArms(slave)) {
			r.push(`body against you as much as ${he} can manage,`);
		} else if (canAchieveErection(slave)) {
			r.push(`hard-on,`);
		} else if (slave.dick !== 0) {
			r.push(`soft dick,`);
		} else if (slave.chastityVagina || slave.clit === 0) {
			r.push(`nipples,`);
		} else if (slave.clit > 2) {
			r.push(`huge, stiff clit,`);
		} else {
			r.push(`clit,`);
		}
		r.push(`and brings ${himself} to orgasm before you.`);
		if (V.PC.dick === 0) {
			r.push(`The sight of ${him} gasping and shaking ${his} way through an anal orgasm brings you to climax yourself, and you shove yourself against the strap-on harness with enough force to give the slave's sensitized hole a final brutal stretching.`);
		} else {
			r.push(`${His} orgasmic rectal spasms squeeze your cock and you blow your load inside ${his} ass.`);
		}
	}

	if (slave.bellyPreg >= 1500) {
		r.push(`The poor slave's pregnant belly causes ${him} some discomfort as you sodomize ${him}.`);
	} else if (slave.bellyImplant >= 1500) {
		r.push(`The poor ${girl}'s implant filled belly causes ${him} some discomfort as you sodomize ${him}.`);
	} else if (slave.bellyFluid >= 1500) {
		r.push(`The poor ${girl}'s sloshing belly causes ${him} some discomfort as you sodomize ${him}, though the lewd jiggling the pounding sends through it is quite a sight.`);
	}

	if (slave.anusTat === "scenes" && slave.anus === 1) {
		r.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") {
		r.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") {
		r.push(`As you fucked ${his} butt, the offensive language around ${his} ass stretched and distorted.`);
	}

	if (random(1, 100) > (100 + slave.devotion)) {
		if (slave.fetish !== "buttslut" && slave.energy <= 95 && slave.sexualFlaw !== "hates anal") {
			r.push(`Being assraped has given ${him} a <span class="flaw gain">hatred of anal sex.</span>`);
			slave.sexualFlaw = "hates anal";
		}
	} else if (random(1, 100) > (110-slave.devotion)) {
		if (slave.fetish === "none" && slave.sexualFlaw !== "hates anal") {
			r.push(`Orgasming to the sensation of your member in ${his} bottom <span class="fetish gain">has ${him} eager for anal.</span>`);
			slave.fetish = "buttslut";
			slave.fetishKnown = 1;
		}
	}

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

		if (slave.anus > 3) {
			r.push(`Your cum falls out of ${his} gaping hole.`);
		} else if (slave.anus > 2) {
			r.push(`Cum flows out of ${his} gaped butthole.`);
		} else if (slave.anus === 2) {
			r.push(`Cum drips out of ${his} newly gaped anus.`);
		} else if (slave.anus === 1) {
			r.push(`${His} still-tight ass keeps your load inside ${him}.`);
		}

		if (canImpreg(slave, V.PC)) {
			r.push(knockMeUp(slave, 5, 1, -1));
		}

		if (V.postSexCleanUp > 0) {
			if (canMove(slave)) {
				let anus;
				if (slave.anus < 2) {
					anus = "tight butt";
				} else if (slave.anus < 3) {
					anus = "used butthole";
				} else if (slave.anus < 4) {
					anus = "gaping butthole";
				} else {
					anus = "anal gape";
				}
				switch (slave.assignment) {
					case "work in the brothel":
						r.push(`${He} goes to wash ${his} ${anus} so ${his} next customer can have the illusion that he's the first to use it today.`);
						break;
					case "serve in the club":
						r.push(`${He} goes to wash and delicately perfume ${his} ${anus} so it can gratify the finest citizen.`);
						break;
					case "work in the dairy":
						r.push(`${He} goes off to carefully wash ${his} ${anus} to avoid besmirching the nice clean dairy.`);
						break;
					case "work as a farmhand":
						r.push(`${He} goes off to wash ${his} ${anus} to avoid tainting the food in ${V.farmyardName}.`);
						break;
					case "work as a servant":
						r.push(`${He} rushes to wash ${his} ${anus}, impatient to get back to ${his} many chores.`);
						break;
					case "work as a nanny":
						r.push(`${He} goes off to wash ${his} ${anus}, before hurrying to continue taking care of the children in ${V.nurseryName}.`);
						break;
					case "whore":
						r.push(`${He} uses an enema to clean ${his} ${anus} before returning to offering it for sale.`);
						break;
					case "serve the public":
						r.push(`${He} uses an enema to clean ${his} ${anus} before returning to offering it for free.`);
						break;
					case "be a servant":
						r.push(`${He} uses an enema to clean ${his} ${anus}, since ${his} chores didn't perform themselves while you used ${his} backdoor.`);
						break;
					case "rest":
						r.push(`${He} uses an enema to clean ${his} ${anus} before crawling back into bed, face-down.`);
						break;
					case "get milked":
						r.push(`${He} uses an enema to clean ${his} ${anus}`);
						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} uses an enema to clean ${his} ${anus} before returning to await your next use of ${his} backdoor, as though nothing had happened.`);
						break;
					case "be a subordinate slave":
						r.push(`${He} uses an enema to clean ${his} ${anus}, though it's only a matter of time before another slave decides to play with ${his} backdoor.`);
						break;
					case "be your Head Girl":
						r.push(`${He} uses an enema to clean ${his} ${anus}, worried that ${his} charges got up to trouble while ${he} enjoyed the buttsex.`);
						break;
					case "guard you":
						r.push(`${He} hurries off to wash ${his} ${anus} so you'll be unguarded for as little time as possible.`);
						break;
					case "be the Schoolteacher":
						r.push(`${He} uses an enema to clean ${his} ${anus} before ${he} returns to teaching ${his} classes, a little bow-legged.`);
						break;
					default:
						r.push(`${He} hurries off to wash ${his} ${anus} before going back to ${slave.assignment}.`);
				}
			}
		}
	}
	App.Events.addParagraph(node, r);
	return node;
};

repo_name: Pecanus/fc

license: mit


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

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

	addPartner(slave, -1);

	r.push(`You order ${his} servants forward so that ${he} can tease you with ${his} enormously swollen body.`);
	if (slave.devotion > 95) {
		r.push(`Smirking, ${he} leans backwards,`);
		if (hasBothArms(slave)) {
			r.push(`raising ${his} hands above ${his} head`);
		} else if (hasAnyArms(slave)) {
			r.push(`raising ${his} hand above ${his} head`);
		} else {
			r.push(`with two slender arms rising upward behind ${him}, making it look like ${he} has limbs once more`);
		}
		r.push(`as a gaggle of ${his} trained menials slide underneath ${his} belly, lifting the monolithic organ off the ground and setting the tightly packed orb to wobbling.`);
	} else if (slave.trust < -20 && slave.devotion > -10) {
		r.push(`Smiling nervously, ${he} leans backwards,`);
		if (hasBothArms(slave)) {
			r.push(`raising ${his} hands above ${his} head`);
		} else if (hasAnyArms(slave)) {
			r.push(`raising ${his} hand above ${his} head`);
		} else {
			r.push(`with two slender arms rising upward behind ${him}, making it look like ${he} has limbs once more`);
		}
		r.push(`as a gaggle of ${his} trained menials slide underneath ${his} belly, lifting the monolithic organ off the ground and setting the tightly packed orb to wobbling.`);
	} else {
		if (hasBothArms(slave)) {
			r.push(`${He} covers ${his}`);
			if (canSee(slave)) {
				r.push(`eyes`);
			} else {
				r.push(`face`);
			}
			r.push(`with ${his} hands,`);
		} else if (hasAnyArms(slave)) {
			r.push(`${He} tries to cover ${his}`);
			if (canSee(slave)) {
				r.push(`eyes`);
			} else {
				r.push(`face`);
			}
			r.push(`with ${his} hand,`);
		} else {
			r.push(`Two slender arms snake around from behind ${him}, almost making it look like ${he} has limbs once more. They cover ${his} quivering`);
			if (canSee(slave)) {
				r.push(`eyes`);
			} else {
				r.push(`expression`);
			}
		}
		r.push(`as a gaggle of ${his} trained menials slide underneath ${his} belly, lifting the monolithic organ off the ground and setting the tightly packed orb to wobbling.`);
		if (hasBothArms(slave)) {
			r.push(`Two more servants take hold of ${his} arms, forcing ${him} to lift them above ${his} head.`);
		} else if (hasAnyArms(slave)) {
			r.push(`Another servant takes hold of ${his} arm, forcing ${him} to lift it above ${his} head.`);
		} else {
			r.push(`The hands covering ${his}`);
			if (canSee(slave)) {
				r.push(`eyes`);
			} else {
				r.push(`head`);
			}
			r.push(`draw away, revealing ${his} crying face, then lift above ${his} head in a deliberately provocative pose.`);
		}
		r.push(`${He} tenses in a moment of instinctive resistance, then surrenders ${his} body to ${his} aids' total control, clearly afraid of punishment.`);
	}
	r.push(`You remove your clothes and lie back on the office couch,`);
	if (V.PC.dick !== 0) {
		r.push(`allowing your exposed, full-mast dick to loll in front of you.`);
	} else {
		r.push(`spreading your exposed, oozing twat.`);
	}
	if (slave.devotion > 95) {
		r.push(`Licking ${his} lips,`);
	} else if (slave.trust < -20 && slave.devotion > -10) {
		r.push(`Breathing heavily,`);
	} else {
		r.push(`Smiling fakely,`);
	}
	r.push(`${he} draws toward you, half-floating on a river of silent, groping hands. When ${he} is mere`);
	if (V.showInches === 2) {
		r.push(`inches`);
	} else {
		r.push(`centimeters`);
	}
	r.push(`away from you, ${his} servants lift ${him} higher, and ${he}`);
	if (V.PC.dick !== 0) {
		r.push(`teases your dick with a series of masterful — and carefully balanced — belly isolations, rubbing the thick nub of ${his} belly button in small semicircles around your oozing cockhead as ${he} does so. Right when you feel ready to explode, ${he} rotates around, bringing`);
		if (slave.butt > 11) {
			r.push(`${his} overgrown, wobbling ass cheeks`);
		} else if (slave.butt > 5) {
			r.push(`${his} huge, wobbling ass cheeks`);
		} else if (Math.floor(slave.buttImplant/slave.butt) > .60) {
			r.push(`${his} saline inflated ass cheeks`);
		} else if (slave.butt > 2) {
			r.push(`${his} wobbling ass cheeks`);
		} else {
			r.push(`the shallow inverted bowls of ${his} petite ass cheeks`);
		}
		r.push(`level with your erection. Two of ${his} servants reach around ${his} inflated profile and push ${his} cheeks together, wrapping your dick in a firm layer of butt cleavage. ${He} lifts ${his} ass, then drops it, again and again, smacking your chest on the downswing as ${his} servants manipulate ${his} hotdogging to maximize your pleasure.`);
		if (canDoVaginal(slave)) {
			r.push(`When you feel the tension within you reaching its apex, you signal to ${his} servants to hold ${him} in place. With ${his} silent menials, still as statues, anchoring ${his} bloated body at the perfect angle for fucking while contorting their anonymous bodies to frame ${him} in a manner that maximizes ${his} visual attractiveness, you grab hold of ${his} flanks and ram into ${his} pregnant pussy, driving ${him} to the first of many orgasms in just a few casual thrusts.`);
			r.push(VCheck.Vaginal(slave, 1));
			r.push(`When you feel your own orgasm approaching, you pull out, ejaculating`);
		} else if (canDoAnal(slave)) {
			r.push(`When you feel the tension within you reaching its apex, you signal to ${his} servants to hold ${him} in place. With ${his} silent menials, still as statues, anchoring ${his} bloated body at the perfect angle for fucking while contorting their anonymous bodies to frame ${him} in a manner that maximizes ${his} visual attractiveness, you grab hold of ${his} flanks and ram into ${his} asshole, driving ${him} to the first of many orgasms with just a few casual thrusts.`);
			r.push(VCheck.Anal(slave, 1));
			r.push(`When you feel your own orgasm approaching, you pull out, ejaculating`);
		} else {
			r.push(`When you feel the tension with your reaching its apex, you signal to ${his} servants and they pull ${him} forward. You ejaculate`);
		}
		r.push(`a thick stream of semen all over ${his} ass and back, ${he} shifts into a kneeling position on the ground in front of you, tilted sideways so that ${his} massive fecundity can pool on the ground beside ${him}, and gently sucks you off, cleaning your dick with ${his} mouth.`);
		slave.counter.oral++;
		V.oralTotal++;
	} else {
		r.push(`Presses the thick nub of ${his} belly button into your pussy, rubbing it back and forth against your engorged clit as ${he} performs a series of masterful — and carefully balanced — belly isolations. After ${he} has you quaking at the edge of release, ${he} rolls forward and buries ${his} head in your lap, plying you with ${his}`);
		if (slave.devotion > 95) {
			r.push(`devoted tongue`);
		} else if (slave.trust < -20 && slave.devotion > -10) {
			r.push(`dedicated tongue`);
		} else {
			r.push(`tongue`);
		}
		r.push(`and driving you into a series of crashing orgasms. When ${his} tongue tires, ${he} tries to draw away, but you grab hold of ${his} head and hold ${him} in place until you are finished.`);
		slave.counter.oral++;
		V.oralTotal++;
	}
	r.push(`Once you are satisfied, you send ${him} away to clean ${himself} up before returning to ${his} duties.`);
	App.Events.addParagraph(node, r);
	return node;
};


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

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

	const {title: Master, say: say} = getEnunciation(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";

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

	r.push(`You call ${him} over to you for inspection. ${App.Desc.boobs(slave)}`);	/* this part needs expansion */
	r.push(`You look at ${him} lustfully and instruct ${him} to strip.`);
	if (slave.sexualFlaw === "shamefast") {
		r.push(`Tears well up in ${his} eyes at the idea of showing ${his} naked body.`);
	} else if (slave.sexualQuirk === "tease") {
		r.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") {
		r.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") {
		r.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 pin ${his} arms, ripping and tearing at the cloth that keeps ${his} beauty from sight.`
		);
	} else if (slave.sexualFlaw === "neglectful") {
		r.push(
			`${He} replies`,
			Spoken(slave, `"Yes, ${slave.rudeTitle === 1 ? 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") {
		r.push(`${He} eagerly begins to shirk ${his} wear, drawing as much attention to the process as possible.`);
	} else {
		if (slave.devotion < -20) {
			r.push(`${He} resists, forcing you to undress ${him} yourself.`);
		} else if (slave.devotion >= -20) {
			r.push(`${He} obeys, and moves to the center of your office to disrobe for you.`);
		}
	}
	if (slave.devotion >= -20) {
		r.push(`${He} begins to undress with`);
		if (slave.skill.entertainment >= 100) {
			r.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) {
			r.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) {
			r.push(`notable skill. ${He} takes the opportunity to give you a light strip tease as ${he} undresses.`);
		} else if (slave.skill.entertainment >= 20) {
			r.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) {
			r.push(`some effort to be sexy. ${His} moves are less than skillful and the undressing is more pragmatic than arousing.`);
		} else {
			r.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":
				r.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) {
					r.push(`You then retrieve heavy bells and attach them to ${his} nipple rings.`);
				} else {
					r.push(`You reach into your pocket and retrieve two weighted and belled nipple clamps, attaching them tightly to your slave's delicate nipples.`);
				}
				r.push(`You tell ${him} to bounce so that they jingle, reminding ${him} of ${his} status.`);
				break;
			case "masochist":
				r.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;
		}
	}

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

	if (canSee(slave)) {
		if (slave.boobsTat === "rude words") {
			r.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") {
				r.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) {
				r.push(`${He} does ${his} best to shake ${his} head.`);
			} else {
				r.push(Spoken(slave, `"Yes ${Master}, that's what I am."`));
			}
		} else if (slave.boobsTat === "possessive") {
			r.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") {
				r.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) {
				r.push(`${He} does ${his} best to shake ${his} head.`);
			} else {
				r.push(Spoken(slave, `"Yes, ${Master} that's what I am."`));
			}
		} else if (slave.boobsTat === "degradation") {
			r.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") {
				r.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) {
				r.push(`${He} does ${his} best to shake ${his} head.`);
			} else {
				r.push(Spoken(slave, `"Yes ${Master}, that's what I am."`));
			}
		} else {
			r.push(`${His} body belongs to you, and your slave needs to remember that.`);
		}
	} else {
		r.push(`${His} body belongs to you, and your slave needs to remember that.`);
	}

	r.push(`You then tell your slave to kneel at your feet.`);
	if (slave.behavioralFlaw === "bitchy") {
		r.push(
			`${He} rolls ${his} eyes sasses you a bit,`,
			Spoken(slave, `"Whatever,"`),
			`${he} scoffs and`
		);
	} else if (slave.behavioralFlaw === "arrogant") {
		r.push(`${He} stands up even straighter than before,`);
		if (hasBothArms(slave)) {
			r.push(`crossing ${his} arms and`);
		}
		r.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") {
		r.push(`${He} confidently moves to obey. ${He}`);
	} else if (slave.behavioralFlaw === "liberated") {
		r.push(`${He} stands up even straighter than before,`);
		if (hasBothArms(slave)) {
			r.push(`crossing ${his} arms and`);
		}
		r.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") {
		r.push(`${He} smiles at the demonstration of ${his} rightful place as a lowly slave. ${He}`);
	} else if (slave.behavioralFlaw === "odd") {
		r.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") {
		r.push(`${He} smiles and turns ${his} butt to you, swaying it cutely as ${his} silly way of acknowledging your command. ${He}`);
	} else {
		r.push(`${He}`);
	}

	if (slave.devotion < -20) {
		if (slave.trust < -50) {
			r.push(`drops terrified to the ground.`);
		} else {
			if (!canTalk(slave)) {
				r.push(`gestures`);
			} else if (SlaveStatsChecker.checkForLisp(slave)) {
				r.push(`lisps`);
			} else {
				r.push(`declares`);
			}
			r.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) {
				r.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) {
				r.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 {
				r.push(`You reach out and grab ${him} firmly by the collar.`);
			}
			r.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)) {
				r.push(`${his} ${knees}.`);
			} else {
				r.push(`the ground.`);
			}
		}
		r.push(`"Head at crotch level," you clarify. "Remember your purpose."`); // Rewrite to remove player voice?
	} else if (slave.devotion < 20) {
		r.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":
					r.push(`bows ${his} head and humbly assumes ${his} rightful position at ${his} ${getWrittenTitle(slave)}'s feet.`);
					break;
				case "dom":
					r.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":
					r.push(`would rather be pushing one of your other whores painfully to their knees, but ${he} still obeys.`);
					break;
				case "masochist":
					r.push(`waits just long enough to receive a disciplinary slap, making ${him} blush with arousal as ${he} kneels before you.`);
					break;
				case "cumslut":
					r.push(`is excited to be closer to your`);
					if (canTaste(slave)) {
						r.push(`delicious`);
					} else {
						r.push(`heavenly`);
					}
					r.push(`crotch, and hurries to match ${his} eyes to your`);
					if (V.PC.dick > 0) {
						r.push(`package.`);
					} else {
						r.push(`crotch.`);
					}
					break;
				case "humiliation":
					r.push(`makes a big show of it as ${he} lowers ${himself} dramatically before you.`);
					break;
				case "buttslut":
					r.push(`leans heavily forward so that ${his} ass sticks out ridiculously far as ${he}`);
					if (hasAnyLegs(slave)) {
						r.push(`bends ${his} ${knees} and`);
					}
					r.push(`goes to the floor.`);
					break;
				case "pregnancy":
					r.push(`obeys your command and goes to`);
					if (hasBothLegs(slave)) {
						r.push(`${his} knees.`);
					} else {
						r.push(`the floor.`);
					}
					break;
				case "boobs":
					r.push(`pulls ${his} shoulders back strongly while leaning far enough forward to drag ${his}`);
					if (slave.boobs >= 10000) {
						r.push(`weighty mammaries`);
					} else if (slave.boobs >= 2000) {
						r.push(`cumbersome udders`);
					} else if (slave.boobs >= 1000) {
						r.push(`massive slave tits`);
					} else if (slave.boobs >= 800) {
						r.push(`forward-thrust breasts`);
					} else if (slave.boobs >= 500) {
						r.push(`meager chest`);
					} else if (slave.boobs <= 400) {
						r.push(`pathetic slave boobs`);
					} else {
						r.push(`tits`);
					}
					r.push(`across your body as ${he} goes down.`);
					break;
				default:
					r.push(`obeys your command and goes to`);
					if (hasBothLegs(slave)) {
						r.push(`${his} knees.`);
					} else {
						r.push(`the floor.`);
					}
			}
		} else {
			r.push(`obeys your command and goes to`);
			if (hasBothLegs(slave)) {
				r.push(`${his} knees.`);
			} else {
				r.push(`the floor.`);
			}
		}
	}
	if (slave.devotion < -20) {
		r.push(`The other slaves guide ${him} to adjust ${his} posture so ${his} eyes are directly in line with your`);
		if (V.PC.dick > 0) {
			r.push(`package.`);
		} else {
			r.push(`crotch.`);
		}
	} else {
		r.push(`${He} kneels so that ${his} eyes are directly level with your`);
		if (V.PC.dick > 0) {
			r.push(`package.`);
		} else {
			r.push(`crotch.`);
		}
	}

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

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

	if (slave.energy > 95) {
		r.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":
					r.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":
					r.push(`Despite ${his} kneeling stature, ${his} back is straight and shoulders back.`);
					break;
				case "masochist":
					r.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": {
					r.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`);
					}
					r.push(`${toSentence(pcCrotch)}.`);
					break;
				}
				case "humiliation":
					r.push(`${He} eagerly takes to this humiliating position, hoping to demonstrate ${his} willingness to be degraded by ${his} ${getWrittenTitle(slave)}.`);
					break;
				case "buttslut":
					r.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":
					r.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) {
						r.push(`colossal mammaries`);
					} else if (slave.boobs >= 2000) {
						r.push(`gigantic udders`);
					} else if (slave.boobs >= 1000) {
						r.push(`massive slave tits`);
					} else if (slave.boobs >= 800) {
						r.push(`prominent breasts`);
					} else if (slave.boobs >= 400) {
						r.push(`modest chest`);
					} else if (slave.boobs <= 400) {
						r.push(`pathetic slave boobs`);
					}
					r.push(`for ${his} ${getWrittenTitle(slave)}.`);
					if (slave.lactation > 0) {
						r.push(`Milk dribbles down the soft curves of ${his} chest as a further sign of ${his} arousal.`);
					}
					r.push(`This is, of course, how all slaves are supposed to kneel, but ${he} takes the pose with added dedication.`);
					break;
				default:
					r.push(`${He} positions ${himself} with ${his} ${knees} spread wide, hoping that you will turn your attention to`);
					if (canDoVaginal(slave)) {
						r.push(`${his} wet pussy.`);
					} else if (canAchieveErection(slave)) {
						r.push(`${his} hard cock.`);
					} else {
						r.push(`${him}.`);
					}
			}
		}
	}
	r.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":
					r.push(`Your slave simply`);
					if (hasAnyArms(slave)) {
						r.push(`presses ${his} ${hands} together and`);
					}
					r.push(`begs you not to lock ${him} up in the bad-${girl} box.`);
					break;
				case "whipping":
					r.push(`Your slave simply`);
					if (hasAnyArms(slave)) {
						r.push(`presses ${his} ${hands} together and`);
					}
					r.push(`begs you not to whip ${him}.`);
					break;
				case "chastity":
					if (slave.energy > 60) {
						r.push(`Your slave simply presses ${his} ${hands} together and begs you not to take away ${his} next orgasm`);
					} else {
						r.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") {
				r.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") {
				r.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") {
				r.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") {
				r.push(
					`${He} purses ${his} lips and bounces on ${his} heels in futile rebellion.`,
					Spoken(slave, `"Nuh-uh."`),
					`${he} puffs, shaking ${his} head wildly.`
				);
			} else {
				r.push(`${He} simply sits there, struggling against the hands holding ${him} down.`);
			}
		}
		r.push(`This is clearly the best you are going to get out of ${him} until ${he} is better trained. You`);
		if (slave.trust >= -50) {
			r.push(`signal your loyal slaves to lift ${him} to ${his} feet, and`);
		}
		r.push(`send ${him} away for now.`);
	} else if (slave.devotion < 20) {
		if (slave.behavioralFlaw === "bitchy") {
			r.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") {
			r.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") {
			r.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 fair in jail.`
			);
		} else if (slave.behavioralFlaw === "odd") {
			r.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") {
			r.push(
				`${He} tries to cover ${his} naked body from your gaze`,
				Spoken(slave, `"Please, can I just put some clothes on?"`)
			);
		} else {
			r.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) {
				r.push(Spoken(slave, `I have no desire for sex. I don't want to be your toy! Please let me go."`));
			} else {
				r.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."`));
			}
		}
		r.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) {
		r.push(`Your slave looks at ${his} ${getWrittenTitle(slave)} with obedient eyes.`);
	} else if (slave.devotion <= 100) {
		r.push(`Your devoted slave takes the begging position,`);
		if (slave.fetish !== "submissive") {
			r.push(`${he} even brings ${his} ${hands} up like a dog's paws.`);
		} else {
			if (slave.fetishKnown === 1 && slave.fetishStrength > 60) {
				r.push(`and ${he} bows ${his} head in total submission.`);
				if (slave.piercing.nipple.weight > 0) {
					r.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) {
					r.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 {
					r.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 {
				r.push(`${he} even brings ${his} ${hands} up like a dog's paws.`);
			}
		}

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

	if (slave.devotion > 20) {
	/* 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":
						r.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":
						r.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":
						r.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":
						r.push(`Your little cumslut can't stop staring at your`);
						if (V.PC.balls >= 30) {
							r.push(`monstrous, massive pair of watermelon sized balls.`);
						} else if (V.PC.balls >= 14) {
							r.push(`enormous, heavy pair of balls.`);
						} else if (V.PC.balls >= 9) {
							r.push(`huge pair of balls, bulging like softballs from behind your suit.`);
						} else if (V.PC.balls >= 5) {
							r.push(`large pair of balls, swinging heavily as you move.`);
						} else {
							r.push(`crotch.`);
						}
						r.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) {
							r.push(Spoken(slave, `suck your magnificent`));
							if (V.PC.vagina !== -1) {
								r.push(Spoken(slave, `cock and eat you out,`));
							} else {
								r.push(Spoken(slave, `cock,`));
							}
						} else {
							r.push(Spoken(slave, `eat your delicious pussy,`));
						}
						r.push(Spoken(slave, `please."`));
						r.push(`You smile at the little cocksucker, so eager to please.`);
						break;
					case "humiliation":
						r.push(`${He} sits so that ${his} body is on full display,`);
						r.push(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":
						r.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! ` : ``}I just need your cock in my most useful fuckhole, please!"`)
						);
						break;
					case "boobs":
						r.push(`${He}`);
						if (!hasAnyArms(slave)) {
							r.push(`leans ${his} head back and juts out ${his} tits, raising`);
						} else {
							r.push(`takes ${his} ${hands} and presses ${his} tits together, lifting`);
						}
						r.push(`them to display for you ${his} primary purpose in life.`);
						if (slave.lactation > 0) {
							r.push(`More milk`);
							if (!hasAnyArms(slave)) {
								r.push(`dribbles`);
							} else {
								r.push(`squirts`);
							}
							r.push(`from each teat as ${he} bears them.`);
						}
						r.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":
						r.push(`${He} begins to`);
						if (hasAnyArms(slave)) {
							r.push(`caress`);
						} else {
							r.push(`stick out`);
						}
						r.push(
							`${his} stomach.`,
							Spoken(slave, `"Use me as your breeder, ${Master}, please! I just want to be filled with your seed forever!"`)
						);
						break;
					default:
						r.push(`${He} kneels`);
						if (hasBothLegs(slave)) {
							r.push(`with ${his} legs far spread.`);
						} else {
							r.push(`on the floor.`);
						}
						r.push(Spoken(slave, `"Use my fuckhole ${Master}, I beg you. Please, I need you to fuck me!"`));
				}
			} else {
				r.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") {
					r.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 {
			r.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") {
				r.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}."`)
				);
			}
		}
		r.push(`You smile at your obedient little slave, and agree to grant ${his} request.`);
	}

	if (random(1, 100) > (100 + slave.devotion)) {
		if (slave.fetish !== "submissive" && slave.energy <= 95 && slave.behavioralFlaw !== "liberated") {
			r.push(`Seeing the humiliating acts your slaves are expected to perform has made ${him} <span class="flaw gain">determined to be free.</span>`);
			slave.behavioralFlaw = "liberated";
		}
	} else if (random(1, 100) > (110 - slave.devotion)) {
		if (slave.fetish === "none" && slave.behavioralFlaw !== "liberated") {
			r.push(`Feeling the joy of kneeling before such a powerful ${getWrittenTitle(slave)}`);

			r.push(`and begging at ${hisP} feet has <span class="fetish gain">encouraged ${him} to be more submissive.</span>`);
			slave.fetish = "submissive";
			slave.fetishKnown = 1;
		}
	}
	App.Events.addParagraph(node, r);
	return node;
};