code:
App.Events.REStandardPunishment = class REStandardPunishment extends App.Events.BaseEvent {
	eventPrerequisites() {
		return []; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [[
			(s) => s.devotion >= -50,
			(s) => s.devotion <= 50,
			hasAnyArms,
			canMove
		]];
	}

	execute(node) {
		const slave = getSlave(this.actors[0]);
		const {
			He, His,
			he, his, him, himself
		} = getPronouns(slave);
		const {He2} = getPronouns(S.HeadGirl || {pronoun: 0}).appendSuffix("2");
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		/** @type {EventArtObject[]} */
		const artArray = [slave];
		if (V.HeadGirlID !== 0) {
			artArray.push(S.HeadGirl);
		} else {
			artArray.push("assistant");
		}
		App.Events.drawEventArt(node, artArray);

		const desc = SlaveTitle(slave);
		let r = [];

		const sinsArray = [];
		sinsArray.push("dawdling");
		if (canDoAnal(slave)) {
			if (slave.fetish !== "buttslut") {
				if (slave.anus !== 0) {
					sinsArray.push("anal reluctance");
				}
			}
		}
		if (canDoVaginal(slave)) {
			if (slave.vagina !== 0) {
				if (slave.fetish !== "pregnancy") {
					sinsArray.push("vaginal reluctance");
				}
			}
		}
		if (canTalk(slave)) {
			sinsArray.push("chatting");
		}
		if (V.universalRulesConsent === 0) {
			if (slave.energy <= 60) {
				sinsArray.push("slave refusal");
			}
		} else {
			if (slave.energy > 40) {
				if (slave.rules.release.slaves === 1 || App.Utils.hasFamilySex(slave)) {
					sinsArray.push("slave molestation");
				}
			}
		}

		r.push(App.UI.DOM.slaveDescriptionDialog(slave));

		const sin = sinsArray.random();
		switch (sin) {
			case "anal reluctance":
				r.push(`is sometimes punished for reluctance to take it up the ass. You run across the aftermath of one such incident as`);
				break;
			case "vaginal reluctance":
				r.push(`is sometimes punished for reluctance to give up ${his} pussy. You run across the aftermath of one such incident as`);
				break;
			case "chatting":
				r.push(`can be overly chatty with other slaves, and often makes ${himself} late for ${his} next task by losing ${himself} in gossip. You happen to appear after ${he}'s been late as`);
				break;
			case "dawdling":
				r.push(`is sometimes late to ${his} next task. This is probably the most common minor infraction among slaves, especially when they're assigned to do things they don't like. You happen to appear after ${he}'s been late as`);
				break;
			case "slave refusal":
				r.push(`lacks the sexual energy to be at home among your slaves, since ${his} peers can demand sex from ${him} whenever they want it. ${He} sometimes tries to evade them or even outright refuse. You come upon the aftermath of such a scene as`);
				break;
			case "slave molestation":
				r.push(`struggles with the consent you require before sex between slaves. ${His} need for release pushes ${him} to overstep ${his} bounds. You come upon the aftermath of an example of ${his} sexual aggressiveness as`);
				break;
			default:
				r.push(`ERROR: bad sin`);
		}

		if (V.HeadGirlID !== 0) {
			r.push(`${S.HeadGirl.slaveName} is`);
			if (slave.rules.punishment === "situational") {
				r.push(`assessing an appropriate punishment.`);
			} else {
				r.push(`sentencing ${him} to ${his} standard punishment,`);
				switch (slave.rules.punishment) {
					case "confinement":
						r.push(`several hours in confinement.`);
						break;
					case "whipping":
						r.push(`a whipping.`);
						break;
					case "chastity":
						r.push(`several hours in chastity.`);
				}
			}
			r.push(`${He2} immediately defers to you, should you wish to take over.`);
		} else {
			r.push(`${V.assistant.name} is`);
			if (slave.rules.punishment === "situational") {
				r.push(`assessing an appropriate punishment.`);
			} else {
				r.push(`sentencing ${him} to ${his} standard punishment,`);
				switch (slave.rules.punishment) {
					case "confinement":
						r.push(`several hours in confinement.`);
						break;
					case "whipping":
						r.push(`a whipping.`);
						break;
					case "chastity":
						r.push(`several hours in chastity.`);
				}
			}
			r.push(`${HeA} immediately defers to you, should you wish to take over.`);
		}

		App.Events.addParagraph(node, r);

		const choices = [];

		/* STANDARD PUNISHMENTS */
		switch (slave.rules.punishment) {
			case "confinement":
				choices.push(new App.Events.Result(`Confine ${him} firmly but fairly`, confine));
				choices.push(new App.Events.Result(`Confine ${him} cruelly`, confineCruelly));
				break;
			case "whipping":
				choices.push(new App.Events.Result(`Give ${him} a solid whipping`, whip));
				choices.push(new App.Events.Result(`Whip ${him} cruelly`, whipCruelly));
				break;
			case "chastity":
				choices.push(new App.Events.Result(`Restrain ${him} in your office`, chastity));
				choices.push(new App.Events.Result(`Torment ${him} with vibration`, chastityCruelly));
				break;
		}

		/* SITUATIONAL PUNISHMENTS */
		switch (sin) {
			case "anal reluctance":
				choices.push(new App.Events.Result(`Punish ${his} ass`, ass));
				break;
			case "vaginal reluctance":
				choices.push(new App.Events.Result(`Punish ${his} pussy`, pussy));
				break;
			case "chatting":
				choices.push(new App.Events.Result(`Put ${his} mouth to better use`, mouth));
				break;
			case "dawdling":
				choices.push(new App.Events.Result(`Make ${him} run`, run));
				break;
			case "slave refusal":
				choices.push(new App.Events.Result(`Make sure ${he} knows ${he}'s for use`, use));
				break;
			case "slave molestation":
				choices.push(new App.Events.Result(`Make ${him} apologize and then dominate ${him}`, dominate));
				break;
			default:
				r.push(`ERROR: bad sin`);
		}

		App.Events.addResponses(node, choices);

		function confine() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Since you use confinement as a standard slave punishment,`);
			if (V.cellblock !== 0) {
				r.push(`in addition to ${V.cellblockName},`);
			}
			r.push(`you have little cubicles designed for the purpose scattered around the penthouse. You order ${slave.slaveName} into one of these. ${He} obeys,`);
			if (slave.devotion > 20) {
				r.push(`knowing ${he} deserves punishment and eager to get it over with.`);
			} else if (slave.trust < -20) {
				r.push(`if only out of terror, knowing ${he}'ll make ${his} situation far worse if ${he} doesn't.`);
			} else {
				r.push(`warily, willing to go along until something worth real resistance happens.`);
			}
			r.push(`The cell is padded and has leather restraints; you use these to secure ${him} to the wall, preventing ${him} from doing anything to relieve boredom in the tiny space. You restate the rule ${he} broke, state the length of ${his} punishment, and remonstrate firmly with ${him} before closing the door. As it shuts on ${him}, plunging ${him} into darkness, you hear`);
			if (canTalk(slave)) {
				r.push(`${him} try at an apology in a tiny voice`);
			} else if (slave.voice !== 0) {
				r.push(`a tiny apologetic moan.`);
			} else {
				r.push(`a sad little intake of breath.`);
			}
			r.push(`You're there to let ${him} out after a reasonable time, and ${he} exits the soft little cell <span class="trust inc">with relief.</span>`);
			slave.trust += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function confineCruelly() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Since you use confinement as a standard slave punishment,`);
			if (V.cellblock !== 0) {
				r.push(`in addition to ${V.cellblockName},`);
			}
			r.push(`you have several boxes designed for the purpose in convenient areas. You order ${slave.slaveName} to your office, and direct a box to be brought there. ${He} begins to cry when ${he} sees it,`);
			if (slave.devotion > 20) {
				r.push(`but obediently gets inside, not wanting ${his} punishment to be extended. ${His} obedience notwithstanding,`);
			} else if (slave.trust < -20) {
				r.push(`but desperately hurries to get inside, terrified that you might extend ${his} sentence. ${His} obedience notwithstanding,`);
			} else {
				r.push(`making no move towards it. ${He} knows that active resistance will merely extend ${his} sentence, and lets you stuff ${his} sobbing body inside. Once ${he}'s in,`);
			}
			if (canTalk(slave)) {
				r.push(`${he} begs tearfully`);
			} else if (slave.voice !== 0) {
				r.push(`${he} tries frantically to beg`);
			} else if (hasAnyArms(slave)) {
				r.push(`${he} uses ${his} ${hasBothArms(slave) ? "hands" : "hand"} to supplicate you`);
			} else {
				r.push(`${he} attempts to beg in any pitiful way ${he} can muster`);
			}
			r.push(`as you close the lid with exquisite slowness. The harshest thing you do is keep silent, not giving ${him} any indication of when ${he}'s getting out. When you finally let ${him} out, ${he}'s almost crazy with fear of ever going back in the box and, for now, willing to do almost anything to avoid it.`);
			slave.devotion += 4;
			slave.trust -= 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function whip() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Since you use whipping as a standard slave punishment, there are many sets of restraints set high up on the walls for the purpose. You order ${him} to place ${his} ${hasBothArms(slave) ? "hands" : "hand"} in one of them, and ${he}`);
			if (slave.devotion > 20) {
				r.push(`sobs with fear but obeys, obviously hoping you'll be reasonable.`);
			} else if (slave.trust < -20) {
				r.push(`starts to cry but doesn't let that stop ${him} from hurriedly obeying. ${He} knows that resistance will earn ${him} more strokes.`);
			} else {
				r.push(`breaks down and makes no move to obey, but does not resist as you take ${his} ${hasBothArms(slave) ? "wrists" : "wrist"} in your hands and lift them into the restraints.`);
			}
			r.push(`The shackles can be moved up or down, and you move them up, raising the shivering, frightened ${desc} to the tips of ${his} toes. ${He} struggles a little to find ${his} balance, and is distracted when the first stroke lands on ${his} ${slave.skin} buttocks. Your leather instrument is exquisitely designed and balanced to produce pain without breaking the skin or leaving a permanent mark. You tell ${him} to count, and ${he}`);
			if (canTalk(slave)) {
				r.push(`gasps "one" through ${his} agony.`);
			} else if (slave.voice !== 0) {
				r.push(`grunts once, doing ${his} best.`);
			} else {
				r.push(`sticks up one finger despite ${his} restrained ${hasBothArms(slave) ? "hands" : "hand"}.`);
			}
			r.push(`You flog ${his} bottom until it's pleasantly warm to the touch, and then let ${him} down. ${He}'s <span class="trust inc">relieved</span> at your moderation.`);
			slave.trust += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function whipCruelly() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Since you use whipping as a standard slave punishment, there are many sets of restraints set high up on the walls for the purpose. You order ${him} to place ${his} ${hasBothArms(slave) ? "hands" : "hand"} in one of them, and ${he}`);
			if (slave.devotion > 20) {
				r.push(`sobs with fear but obeys, despite something in your tone that makes ${his} knees go weak with terror.`);
			} else if (slave.trust < -20) {
				r.push(`starts to cry but doesn't let that stop ${him} from hurriedly obeying. ${He} stumbles once, something in your tone that making ${his} knees go weak with terror.`);
			} else {
				r.push(`breaks down and makes no move to obey, but does not resist as you take ${his} ${hasBothArms(slave) ? "wrists" : "wrist"} in your hands and hoist ${him} into the restraints.`);
			}
			r.push(`The shackles can be moved up or down, and you move them down, forcing the weeping slave to spread ${his} legs. You let ${him} anticipate the pain for a long time before you start whipping ${his} buttocks. Your leather instrument is exquisitely designed and balanced to produce pain without breaking the skin or leaving a permanent mark, and you make cruel use of it. After a short preliminary asswhipping, you vary your strokes, letting ${him} feel the whip on ${his} ${hasBothLegs(slave) ? "thighs" : "thigh"}, ${hasBothLegs(slave) ? "calves" : "calf"} and ${hasBothLegs(slave) ? "flanks" : "flank"} before placing strokes against ${his}`);
			if (slave.scrotum > 0) {
				r.push(`poor ballsack.`);
			} else if (slave.dick > 0) {
				r.push(`poor penis.`);
			} else {
				r.push(`poor pussy.`);
			}
			r.push(`${He} loses all control,`);
			if (canTalk(slave)) {
				r.push(`shamelessly begging for mercy.`);
			} else if (slave.voice !== 0) {
				r.push(`sobbing and moaning incoherently.`);
			} else {
				r.push(`rasping pathetic little sobs past ${his} mute throat.`);
			}
			r.push(`When you're done, ${he}'s <span class="trust dec">almost crazy with fear</span> of future whippings.`);
			slave.trust -= 6;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function chastity() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Since you use chastity as a punishment, you're accustomed to using your office for supervising sexual denial. You bring ${him} up and restrain ${him} standing, ${hasBothArms(slave) ? "hands" : "hand"} over ${his} head in one of the sets of shackles set high on the walls, facing out so ${he} can`);
			if (canSee(slave)) {
				r.push(`see`);
			} else {
				r.push(`face`);
			}
			r.push(`everything that goes on in your office. You gag ${him} securely,`);
			if (slave.voice === 0) {
				r.push(`despite ${his} muteness, a sad mockery.`);
			} else {
				r.push(`not wanting your work disturbed by unseemly noises.`);
			}
			r.push(`Then you ignore ${him}. Business as usual in your office is profoundly sexual.`);
			if (slave.energy > 60) {
				r.push(`${His} healthy sex drive makes this torture for ${him}; ${he}`);
				if (canSee(slave)) {
					r.push(`watches`);
				} else if (canHear(slave)) {
					r.push(`listens to`);
				} else {
					r.push(`is aware of`);
				}
				r.push(`everything that happens in the office with desperate longing. Before long,`);
			} else if (slave.devotion > 20) {
				r.push(`${He}'s used to the idea of sexual slavery, and inevitably`);
				if (canSee(slave)) {
					r.push(`sees`);
				} else if (canHear(slave)) {
					r.push(`hears`);
				} else {
					r.push(`is surrounded by`);
				}
				r.push(`people ${he} finds attractive doing things ${he} considers sexy in the office. Before long,`);
			} else if (slave.devotion >= -50) {
				r.push(`${He}'s not comfortable with sexual slavery, but the heavily sexual atmosphere of the office affects even ${him}. After a few hours,`);
			} else {
				r.push(`The office being what it is, ${he}`);
				if (canSee(slave)) {
					r.push(`sees`);
				} else if (canHear(slave)) {
					r.push(`hears`);
				} else {
					r.push(`is surrounded by`);
				}
				r.push(`many naked, attractive people doing sexy things over the course of the day. Despite ${his} resistance, after a few hours,`);
			}
			r.push(`${he}'s quite horny. Restrained as ${he} is, ${he}`);
			if (slave.devotion > 20) {
				r.push(`couldn't`);
			} else {
				r.push(`can't`);
			}
			r.push(`hide`);
			if (slave.dick > 0) {
				if (canAchieveErection(slave)) {
					r.push(`${his}`);
					if (slave.dick > 2) {
						r.push(`prominent`);
					} else {
						r.push(`pathetic`);
					}
					r.push(`erection,`);
				} else {
					r.push(`the string of precum hanging off ${his} limp dick,`);
				}
			} else {
				if (slave.vaginaLube > 0) {
					r.push(`the lovely pussyjuice slicking ${his} thighs,`);
				} else {
					r.push(`how flushed and eager ${his} cunt is,`);
				}
			}
			if (slave.devotion > 20) {
				r.push(`even if ${he} wanted to.`);
			} else {
				r.push(`though ${he} seems to want to.`);
			}
			r.push(`Satisfied that ${he}'s been tormented enough for today, you let ${him} down and send ${him} on ${his} way. ${He}'s obviously more willing than usual to apply ${himself} to ${his} next sexual task, whatever it is.`);
			slave.devotion += 4;

			App.Events.addParagraph(frag, r);
			return frag;
		}

		function chastityCruelly() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Since you use chastity as a punishment, you're accustomed to using your office for supervising sexual denial. You order ${him} to place ${his} ${hasBothArms(slave) ? "hands" : "hand"} in one of the many sets of restraints set high up on the office walls for the purpose.`);
			if (!slave.piercing.genitals.smart) {
				r.push(`You equip ${him} with a set of smart vibrators. The first is attached`);
				if (slave.dick > 0) {
					r.push(`to ${his} dickhead,`);
				} else {
					r.push(`against ${his} clit,`);
				}
			} else {
				r.push(`${His} smart piercing makes the next step easy. ${He} gets three vibrators in total:`);
			}
			r.push(`the second`);
			if (slave.vagina > 0) {
				r.push(`comfortably fills ${his} pussy,`);
			} else if (slave.vagina === 0) {
				r.push(`rests against ${his} virgin pussy without breaking ${his} virtue,`);
			} else {
				r.push(`is a nice little bullet vibe for ${his} soft perineum,`);
			}
			r.push(`and the third`);
			if (slave.anus > 0) {
				r.push(`is, of course, a vibrating plug for ${his} asspussy.`);
			} else {
				r.push(`rests against ${his} unfucked rosebud without penetrating it.`);
			}
			r.push(`Then you walk away, setting the vibrators to bring ${him} to the edge of orgasm and keep ${him} there. The effect is almost instant, and as you go ${he} begins to writhe,`);
			if (canTalk(slave)) {
				r.push(`desperately calling after you to beg for mercy`);
			} else if (slave.voice !== 0) {
				r.push(`moaning desperately.`);
			} else {
				r.push(`panting mutely.`);
			}
			r.push(`When you finally come back and let ${him} down, ${he}'s`);
			if (canStand(slave)) {
				r.push(`unsteady on ${his} feet`);
			} else {
				r.push(`unable to right ${himself}`);
			}
			r.push(`and <span class="devotion inc">very submissive,</span> though a bit <span class="libido dec">burned out</span> on stimulation.`);
			slave.devotion += 6;
			slave.energy -= 1;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function ass() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Deciding that the most appropriate punishment is some corrective assrape, you shove the slave to`);
			if (hasBothLegs(slave)) {
				r.push(`${his} knees`);
			} else {
				r.push(`the floor`);
			}
			r.push(`and stuff`);
			if (V.PC.dick !== 0) {
				r.push(`your cock`);
			} else {
				r.push(`a formidable dildo`);
			}
			r.push(`up ${his}`);
			if (slave.anus > 2) {
				r.push(`big butthole. It slides right in, the slave's relaxed sphincter offering no resistance. Announcing that you'll find ${his} limits, wherever they are, you insert fingers until ${he}'s cruelly stretched and you're almost jerking`);
				if (V.PC.dick !== 0) {
					r.push(`yourself`);
				} else {
					r.push(`the phallus`);
				}
				r.push(`off inside ${him}.`);
			} else if (slave.anus > 1) {
				r.push(`defenseless asshole. You meet some delicious resistance and push past it, enjoying the feeling of the slave's sphincter spasming as you do. You pound ${him} hard, much harder than ${he} can comfortably take it up the ass.`);
			} else {
				r.push(`tight hole. ${His} poor little anus doesn't want to let you in, but you force yourself in anyway, making the slave wriggle desperately beneath you as ${he} feels the invading phallus force ${his} anal ring to accommodate its girth.`);
			}
			r.push(`You tell ${him} that many slaves enjoy anal, and that if ${he}'s a good ${desc}, ${he} can too, but that it's against the rules for ${him} to show reluctance to be assfucked. The slave below you is too discomfited by anal pain to respond coherently, but ${he} gets the message. ${He}'ll be better about submitting in the future, but due to the connection between sex and punishment ${he}'ll be a little less eager for sex, especially anal.`);
			r.push(VCheck.Anal(slave, 1));
			slave.devotion += 4;
			slave.energy -= 2;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function pussy() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Deciding that the most appropriate punishment is some corrective rape, you push the slave down on ${his} back and shove`);
			if (V.PC.dick !== 0) {
				r.push(`your cock`);
			} else {
				r.push(`a formidable dildo`);
			}
			r.push(`inside ${his}`);
			if (slave.vagina > 2) {
				r.push(`roomy cunt, which can take it easily. Announcing that you'll find ${his} limits, wherever they are, you insert fingers until ${he}'s cruelly stretched and you're almost jerking`);
				if (V.PC.dick !== 0) {
					r.push(`yourself`);
				} else {
					r.push(`the phallus`);
				}
				r.push(`off inside ${him}.`);
			} else if (slave.vagina > 1) {
				r.push(`poor womanhood. You fuck ${him} mercilessly, intentionally pulling out far enough that you have to spear ${him} again. You use ${his} poor boobs as leverage, pulling against them to batter ${him} harder.`);
			} else {
				r.push(`poor tight pussy. ${He}'s tight, and the initial penetration was uncomfortable for ${him}, but you make it worse by treating ${his} cunt like a veteran whore's. ${He} begins to struggle a little as you hammer ${him}.`);
			}
			r.push(`You tell ${him} that many slaves enjoy getting fucked, and that if ${he}'s a good ${desc}, ${he} can too, but that it's against the rules for ${him} to show reluctance to be penetrated. The slave below you is too discomfited to respond coherently, but ${he} gets the message. ${He}'ll be better about submitting in the future, but due to the connection between sex and punishment ${he}'ll be a little less eager for sex, especially vaginal.`);
			r.push(VCheck.Vaginal(slave, 1));
			slave.devotion += 4;
			slave.energy -= 2;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function mouth() {
			const frag = new DocumentFragment();
			const useDildo = !canPenetrateThroat(V.PC);
			let r = [];
			r.push(`You announce that ${he}'ll have less trouble gossiping instead of being prompt if ${his} mouth is nice and tired. Comprehension and apprehension dawn on ${his} face in the moment before you`);
			if (slave.collar !== "none") {
				r.push(`grab ${him} by the collar and pull`);
			} else {
				r.push(`put a hand on ${his} shoulder and shove`);
			}
			r.push(`${him} to the ground. ${He} goes down without resistance,`);
			if (V.PC.dick !== 0) {
				if (useDildo) {
					r.push(`${his} look of unconcern vanishing when ${he} sees you pulling out a huge dildo. ${He} doesn't get to suck your little prick; today ${he} gets throatfucked.`);
				} else {
					r.push(`already opening wide for your stiff prick.`);
				}
			} else {
				r.push(`${his} look of unconcern vanishing when ${he} sees you pulling out a strap-on. ${He} doesn't get to eat pussy today; today ${he} gets fucked in the face.`);
			}
			r.push(`You shove it down ${his}`);
			if (slave.sexualQuirk === "gagfuck queen") {
				r.push(`spectacularly unresisting throat. The gagfuck queen has no gag reflex to speak of, but even ${he} has ${his} limit. You rape ${his} face without mercy, deliberately ruining ${his} practiced ability to breathe while giving a cock deep oral.`);
			} else if (slave.fetish === "cumslut") {
				r.push(`eager throat. The ${slave.fetishKnown === 1 ? "cumslut" : "bitch"} loves giving oral, but soon realizes that you have no intention of letting ${him} love this. You rape ${his} face without mercy, hilting ${his} lips against`);
				if (V.PC.dick !== 0) {
					if (useDildo) {
						r.push(`your base.`);
					} else {
						r.push(`your hand.`);
					}
				} else {
					r.push(`the harness.`);
				}
			} else {
				r.push(`gagging throat, enjoying the sensations of ${his} lips and tongue writhing against you as ${he} desperately tries to accommodate the intruder.`);
			}
			r.push(`${He} begins to struggle a little, so you snake a hand down behind ${his} head to hold ${him} in place. When you're done, ${he}'s an inelegant mess, coughing and gasping for air.`);
			if (canTalk(slave)) {
				r.push(`Once ${he}'s got ${his} breath back, ${he} tearfully`);
			} else {
				r.push(`Even as ${he} pants, ${he} uses shaky gestures to beg forgiveness, and ${he} even`);
			}
			r.push(`promises to be less chatty. ${He}'ll be more punctual in the future, but due to the connection between sex and punishment ${he}'ll be a little less eager for sex, especially oral.`);
			seX(slave, "oral", V.PC, "penetrative", 1);
			slave.devotion += 4;
			slave.energy -= 2;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function run() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You tell ${him} that ${he} clearly needs practice being prompt.`);
			if (canHear(slave)) {
				r.push(`Your tone is conversational, but ${he} doesn't mistake it for kindness. It's the tone you use with`);
			} else {
				r.push(`Your gestures are soft, but ${he} doesn't mistake that for kindness. It's what you use with deaf`);
			}
			r.push(`slaves when imparting guidance which is to be accepted and followed on pain of terrible punishment. You make ${him} explain where ${he} was and what ${he} was doing previously, and require ${him} to walk you there. ${He} does,`);
			if (slave.trust > 20) {
				r.push(`trustingly`);
			} else if (slave.trust >= -20) {
				r.push(`rather fearfully,`);
			} else {
				r.push(`shaking with fear,`);
			}
			r.push(`and when you get there you tell ${him} to run to ${his} next task. ${He} hesitates for an instant, until you`);
			if (V.PC.title === 1) {
				r.push(`bellow`);
			} else {
				r.push(`shriek`);
			}
			r.push(`at ${him} to <b><i>RUN!</i></b> ${He} takes off,`);
			if (!canWalk(slave)) {
				r.push(`crawling as fast as ${his} body will let ${him}. Sure ${he} isn't running, since ${he} can't, but ${he} is struggling along at an impressive pace.`);
			} else if (shoeHeelCategory(slave) === 3) {
				r.push(`tottering agonizingly along in ${his} extreme heels. ${He} isn't running, not really, but ${his} slutty shoes are so ridiculous that ${he} can't. ${He}'s going as fast as ${he} possibly can.`);
			} else if (shoeHeelCategory(slave) > 1) {
				r.push(`running awkwardly in ${his} ${slave.shoes}.`);
			} else {
				r.push(`running as fast as ${his} legs can carry ${him}.`);
			}
			r.push(`As ${he} goes,`);
			if (slave.dick > 3) {
				r.push(`${his}`);
				if (slave.dick > 5) {
					r.push(`ridiculous penis`);
				} else {
					r.push(`big dick`);
				}
				r.push(`flops around painfully, hitting ${his} thighs, but ${he} tries to ignore it.`);
			} else if (slave.scrotum > 3) {
				r.push(`${his}`);
				if (slave.scrotum > 5) {
					r.push(`huge ballsack`);
				} else {
					r.push(`generous scrotum`);
				}
				r.push(`gets painfully pinched between ${his} thighs, but ${he} tries to ignore it.`);
			} else if (slave.belly >= 10000) {
				r.push(`${his} huge`);
				if (slave.pregKnown === 1) {
					r.push(`pregnancy`);
				} else {
					r.push(`belly`);
				}
				r.push(`impedes ${him} terribly, but ${he} tries to ${canWalk(slave) ? "waddle" : "push"} along as best ${he} can.`);
			} else if (slave.boobsImplant > 600) {
				r.push(`${his} implants bounce around painfully, so ${he} cradles ${his} fake tits in ${his} arm${hasBothArms(slave) ? "s" : ""}, trying to support them as much as possible.`);
			} else if (slave.boobs > 2000) {
				r.push(`${his} huge tits bounce around painfully, so ${he} cradles ${his} udders in ${his} arm${hasBothArms(slave) ? "s" : ""}, trying to support them as much as possible.`);
			} else if (slave.butt > 2) {
				r.push(`${his} big buttocks impede ${him} a bit, but ${he} does ${his} best, making them work around delightfully.`);
			} else {
				r.push(`${his} cute rear makes a pretty picture.`);
			}
			r.push(`You make ${him} repeat the exercise until ${he}'s quite tired, hounding ${him} mercilessly, and then send ${him} off to rinse away the sweat ${he} worked up before getting back to work. ${He}'ll be more punctual in the future.`);
			slave.devotion += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function use() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Deciding to ensure the ${desc} really understands that ${he}'s a sex slave and can be used by anyone, even other slaves, you order ${him} to put ${his} mouth to work on the slave who demanded sex from ${him}.`);
			actX(slave, "oral");
			if (slave.devotion > 20) {
				r.push(`${He} hurries to comply, knowing ${he}'s in trouble and not wanting to make it any worse.`);
			} else if (slave.trust < -20) {
				r.push(`${He} hurries to obey, terrified that resistance will make it worse.`);
			} else {
				r.push(`${He} looks momentarily mutinous, but decides not to resist and gets down to it.`);
			}
			r.push(`Once ${he}'s working away, you pull ${his} hips up and`);
			if (canDoVaginal(slave) && (slave.vagina !== 0)) {
				r.push(`push ${his}`);
				if (hasBothLegs(slave)) {
					r.push(`legs`);
				} else {
					r.push(`cheeks`);
				}
				r.push(`apart, leaving ${his}`);
				if (slave.vagina > 2) {
					r.push(`loose`);
				} else if (slave.vagina > 1) {
					r.push(`poor`);
				} else {
					r.push(`tight little`);
				}
				r.push(`pussy vulnerable. You fuck ${him} hard, making it a punishment.`);
				r.push(VCheck.Vaginal(slave, 1));
			} else if (canDoAnal(slave) && (slave.anus !== 0)) {
				r.push(`paw ${his} butt, using a couple of fingers to tease ${his}`);
				if (slave.anus > 2) {
					r.push(`relaxed`);
				} else if (slave.anus > 1) {
					r.push(`slutty`);
				} else {
					r.push(`tight little`);
				}
				r.push(`asshole before penetration. You fuck ${him} hard, making it a punishment.`);
				r.push(VCheck.Anal(slave, 1));
			} else {
				r.push(`push ${his}`);
				if (hasBothLegs(slave)) {
					r.push(`legs`);
				} else {
					r.push(`cheeks`);
				}
				r.push(`together, settling for some`);
				if (V.PC.dick !== 0) {
					r.push(`frottage`);
					seX(slave, "anal", V.PC, "penetrative", 1);
				} else {
					r.push(`tribbing`);
					seX(slave, "anal", V.PC, "vaginal", 1);
				}
				r.push(`to preserve ${his}`);
				if (slave.vagina === -1) {
					r.push(`virginity.`);
				} else {
					r.push(`virginities.`);
				}
				r.push(`Since you're not fucking ${him}, you spank ${his} ass mercilessly to make it an effective punishment.`);
			}
			r.push(`The horny slave getting oral enjoys the oral attention, especially once ${slave.slaveName} starts to groan with discomfort. You discard ${him} once everyone except ${him} has gotten off. ${He}'ll be more submissive to sexual demands from now on, though ${he}'ll be slightly less interested in sex for ${his} own pleasure.`);
			slave.devotion += 4;
			slave.energy -= 2;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function dominate() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You order the horny ${desc} to apologize to the slave ${he} grabbed, which ${he} does,`);
			if (canTalk(slave)) {
				r.push(`managing to sound authentically sorry.`);
			} else {
				r.push(`gesturing ${his} regret with apparent sincerity.`);
			}
			r.push(`It seems ${he} might feel some actual guilt at molesting a fellow slave, but ${he}'s about to feel much sorrier. Once the other slave has been dismissed, you grab ${him} by the neck and`);
			if (canDoVaginal(slave) && (slave.vagina !== 0)) {
				r.push(`shove ${him} up against the nearest wall, using a bit of warning pressure of your fingers against ${his} throat to warn ${him} to take ${his} punishment. Then you`);
				if (V.PC.dick !== 0) {
					r.push(`jam your cock inside ${him}, making ${him} wriggle from the uncomfortable angle.`);
				} else {
					r.push(`grind your pussy against ${him}, fucking ${him} hard despite the lack of penetration.`);
				}
				r.push(VCheck.Vaginal(slave, 1));
			} else if (canDoAnal(slave) && (slave.anus !== 0)) {
				r.push(`shove ${his} face against the nearest wall, using a bit of warning pressure of your fingers against ${his} throat to warn ${him} to take ${his} punishment. Then you`);
				if (V.PC.dick !== 0) {
					r.push(`jam your cock up ${his} butt, making ${his} sphincter spasm from the rough penetration.`);
				} else {
					r.push(`use one hand to fuck ${his} ass and the other to look after yourself.`);
				}
				r.push(VCheck.Anal(slave, 1));
			} else {
				r.push(`pull ${him} to ${his} ${hasBothLegs(slave) ? "knees" : "knee"},`);
				if (V.PC.dick !== 0) {
					r.push(`shoving your dick ${canPenetrateThroat(V.PC) ? `down ${his} throat` : `into ${his} mouth`}.`);
					seX(slave, "oral", V.PC, "penetrative", 1);
				} else {
					r.push(`straddling ${his} face and grinding yourself against ${his} mouth.`);
					seX(slave, "oral", V.PC, "vaginal", 1);
				}
			}
			r.push(`The slut needs it so badly that ${he} almost climaxes, but you ruin ${his} building orgasms whenever you detect them. When you've gotten yours, you drop ${him} and walk off, leaving ${him} feeling comprehensively fucked, but no less horny. ${He}'ll be very willing to do anything that will earn ${his} release.`);
			slave.devotion += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.RECIAdoptFollowUp = class RECIAdoptFollowUp extends App.Events.BaseEvent {
	eventPrerequisites() {
		return []; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() { // single event slave
		return [
			[
				s => s.fetish !== Fetish.MINDBROKEN,
				s => this.validSlave(s),
				s => s.devotion >= 50,
				s => s.trust >= 50,
			]
		];
	}

	validSlave(slave) {
		return V.RECheckInIDs.some((a) => (a.ID === slave.ID && a.type === "adoptFollowUp"));
	}

	get weight() { return 5; } // given the very restrictive qualifiers, give it a bit more weight.

	execute(node) {
		/** @type {Array<FC.SlaveState>} */
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {title: Master} = getEnunciation(eventSlave);
		const {He, he, His, his, him} = getPronouns(eventSlave);
		V.RECheckInIDs.deleteWith((s) => s.ID === eventSlave.ID && s.type === "adoptFollowUp");
		App.Events.drawEventArt(node, eventSlave);

		App.Events.addNode(node, [
			`While in your office, you receive an unscheduled visit from ${eventSlave.slaveName}.`,
			`${He} seems a bit nervous and before you can ask ${him} what ${he} wants,`,
			`${he} suddenly ${canTalk(eventSlave) ? `blurts out`: `attempts to convey via sign language`} a speech that seems half-prepared and half-rambling.`,
		], "p");

		if (canTalk(eventSlave)) {
			App.Events.addNode(node, [`"${Spoken(eventSlave,
				`Thank you for adopting me, ${Master}!
				I'm so grateful that you took me in!
				Everything was bad before, I could barely get food and didn't know where I was or what to do.
				You have taught me so much!
				At first I thought doing the things you wanted was horrible and disgusting, but you gave me such a good life!
				I don't care if I have to get fucked all the time, it's fun anyway!
				I love being with you ${Master}, you made my life so much better!
				You're... you're everything to me!`
			)}"`], "p");
		} else {
			App.Events.addNode(node, [`Profusely thanking you for adopting ${him} and how ${his} life has improved since then, despite a rocky start.`], "p");
		}

		App.Events.addResponses(node, [
			new App.Events.Result(`Reward ${him} with a loving fuck`, love, (eventSlave.anus === 0 || eventSlave.vagina === 0) ? App.UI.DOM.makeElement("span", `Virginity will be lost`, ["yellow"]) : ``),
			new App.Events.Result(`This slave has forgotten ${his} place`, rape, (eventSlave.anus === 0 || eventSlave.vagina === 0) ? App.UI.DOM.makeElement("span", `Virginity will be lost`, ["yellow"]) : ``),
		]);

		/** @returns {void} */
		function love() {
			SimpleSexAct.Player(eventSlave);
			eventSlave.devotion += 5;
			eventSlave.trust += 5;
			return App.Events.addNode(node, [
				VCheck.Simple(eventSlave),
				`Wordlessly, you move towards ${eventSlave.slaveName}, who flinches slightly at your sudden presence.`,
				`You grip ${his} hips, pulling ${him} in close.`,
				`${His} face is beet red, and you can feel ${his} heart beating against your chest.`,
				`You kiss ${him} deeply before pressing ${his} against a nearby wall and lifting ${him} so you can hilt your ${V.PC.dick > 0 ? 'cock' : 'strap-on'} deep inside.`,
				`You make <span class="trust inc">slow and gentle love</span> to ${him}, savoring every moment.`,
				`When you finally cum inside and gently lower ${him} back down onto the floor, ${he} hugs you and ${canTalk(eventSlave) ? `whispers,`: `stares`}`,
				`"<span class="devotion inc">${canTalk(eventSlave) ? Spoken(eventSlave, `I love you, ${Master}.`) : `into your eyes lovingly.`}</span>"`,
			]);
		}

		/** @returns {void} */
		function rape() {
			SimpleSexAct.Player(eventSlave);
			eventSlave.devotion -= 5;
			eventSlave.trust -= 5;
			return App.Events.addNode(node, [
				VCheck.Simple(eventSlave),
				`You abruptly stand up from your desk and explain to ${eventSlave.slaveName} that you didn't adopt ${him}... You enslaved ${him}, and that ${he} needs to learn ${his} place and the difference.`,
				`You grab ${him} and <span class="trust dec">roughly throw</span> ${him} onto the nearby couch before grabbing ${him} by the neck and shoving ${his} head into the cushions.`,
				`You penetrate ${him} hard, without warning, and proceed to rape ${him} like ${he}'s never been raped before.`,
				`<span class="devotion dec">By the time you are done,</span> ${he} is a whimpering, sobbing mess with a gaped out hole.`,
			]);
		}
	}
};

repo_name: Nithhogg/fc

license: mit


code:
// cSpell:ignore nooo

App.Events.RECIButthole = class RECIButthole extends App.Events.BaseEvent {
	eventPrerequisites() {
		return []; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				s => this.validSlave(s),
				s => s.assignment !== Job.QUARTER,
				s => s.devotion > 50,
				s => s.trust > 50,
				canTalk,
				canWalk,
				canSee,
				canHear,
				s => s.anus.isBetween(1, 4),
				s => s.analArea > 1,
			]
		];
	}

	validSlave(slave) {
		return V.RECheckInIDs.some((a) => (a.ID === slave.ID && a.type === "butthole"));
	}

	execute(node) {
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, himself, girl, woman, loli
		} = getPronouns(eventSlave);
		const {title: Master, say: say} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const hands = hasBothArms(eventSlave) ? "hands" : "hand";
		const skinDesc = (skinToneLevel(eventSlave.skin) < 10)
			? "pink"
			: (skinToneLevel(eventSlave.skin) < 10)
				? "dark brown"
				: "brown";

		V.RECheckInIDs.deleteWith((s) => s.ID === eventSlave.ID && s.type === "butthole");

		let artDiv = document.createElement("div"); // named container so we can replace it later
		App.Events.drawEventArt(artDiv, eventSlave, "no clothing");
		node.appendChild(artDiv);

		let t = [];
		t.push(`The slave bathrooms are designed to completely eliminate privacy. There are few partitions, and those are glass. Your better-behaved slaves have all long since lost any hesitation about performing their ablutions nude. As you pass through the area, you notice`);
		t.push(contextualIntro(V.PC, eventSlave, true));
		t.push(`checking out ${his} own anus in the bathroom mirror.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`There's no other way to describe what ${he}'s doing: the ${SlaveTitle(eventSlave)}`);
		if (eventSlave.belly >= 300000) {
			t.push(`is leaning over ${his} ${belly} belly with ${his} feet planted on the counter,`);
		} else if (eventSlave.height < 140) {
			t.push(`is on a step stool with ${his} back to the mirror,`);
		} else if (eventSlave.height < 160) {
			t.push(`has ${his} back to the mirror and is up on tiptoe to bring ${his} butthole into view,`);
		} else {
			t.push(`has ${his} back to the mirror,`);
		}
		t.push(`and ${he}'s`);
		if (eventSlave.butt > 6) {
			if (hasBothArms(eventSlave)) {
				t.push(`using both hands to`);
			} else if (hasAnyArms(eventSlave)) {
				t.push(`using ${his} hand to`);
			} else if (eventSlave.belly >= 300000) {
				t.push(`letting gravity`);
			} else {
				t.push(`using the edge of the sink to`);
			}
			t.push(`pull ${his} massive buttcheeks apart to`);
		} else if (eventSlave.butt > 3) {
			if (hasAnyArms(eventSlave)) {
				t.push(`using ${his} ${hands} to`);
			} else if (eventSlave.belly >= 300000) {
				t.push(`letting gravity`);
			} else {
				t.push(`using the edge of the sink to`);
			}
			t.push(`spread ${his} healthy buttcheeks to`);
		} else {
			t.push(`got ${his} hips cocked to spread ${his} sleek butt and`);
		}
		t.push(`reveal ${his} backdoor. Your slaves are trained to check themselves daily,`);
		if (eventSlave.chastityAnus) {
			t.push(`including those assigned to wear anal chastity,`);
		}
		t.push(`but ${he} seems fascinated. As you pause to watch, ${he} begins to clench and relax ${his}`);
		if (eventSlave.anus > 2) {
			t.push(`loose`);
		} else {
			t.push(`cute`);
		}
		t.push(`hole,`);
		if ((eventSlave.analArea - eventSlave.anus) > 1) {
			t.push(`lewdly flexing`);
		} else {
			t.push(`alternately puckering and relaxing`);
		}
		t.push(`the ${skinDesc} skin around it. ${He} giggles self-consciously at the sight, and then relaxes all the way, causing ${his} asspussy to open into a`);
		if (eventSlave.anus > 2) {
			if (V.PC.dick !== 0) {
				t.push(`cock-hungry`);
			} else {
				t.push(`dildo-hungry`);
			}
		} else {
			t.push(`slight`);
		}
		t.push(`gape. ${He} notices you out of the corner of ${his} eye and`);
		if (eventSlave.butt > 6) {
			if (eventSlave.belly >= 300000) {
				t.push(`slides back onto ${his} feet`);
			} else if (hasAnyArms(eventSlave)) {
				t.push(`releases ${his} grip on ${his} heavy buttocks`);
			} else {
				t.push(`slides ${his} heavy buttocks off the counter`);
			}
			t.push(`to turn and greet you, letting`);
			if (eventSlave.belly >= 300000) {
				t.push(`${his} heavy buttocks`);
			} else {
				t.push(`them`);
			}
			t.push(`clap gently together and conceal ${his} asshole again.`);
		} else if (eventSlave.butt > 3) {
			if (eventSlave.belly >= 300000) {
				t.push(`slides back onto ${his} feet`);
			} else if (hasAnyArms(eventSlave)) {
				t.push(`lets ${his} butt go`);
			} else {
				t.push(`slides ${his} butt off the counter`);
			}
			t.push(`to turn and greet you, mostly hiding ${his} asshole from the mirror.`);
		} else {
			if (eventSlave.belly >= 300000) {
				t.push(`slides back onto ${his} feet and`);
			}
			t.push(`turns to greet you, ${his} pretty rear only partially concealing ${his} asshole in the mirror.`);
		}
		App.Events.addParagraph(node, t);

		t = [];
		t.push(Spoken(eventSlave, `"Hi ${Master},"`));
		t.push(`${he} ${say}s cheerfully.`);
		t.push(Spoken(eventSlave, `"I was just noticing how much my butt has changed. I check it every day, but I hadn't really looked at it in a while, you know? It used to be so tight, and now`));
		if (eventSlave.anus > 2) {
			t.push(Spoken(eventSlave, `I've got a rear pussy."`));
		} else {
			t.push(Spoken(eventSlave, `it's obviously a fuckhole."`));
		}
		if (eventSlave.belly >= 300000) {
			t.push(`${He} struggles to hike ${his} knee over ${his} extreme gravidity without losing balance.`);
		} else {
			t.push(`${He} turns to face the mirror,`);
			if (eventSlave.belly >= 10000) {
				t.push(`slowly hiking one knee up onto the bathroom counter in front of it while giving ${his}`);
				if (eventSlave.belly >= 10000) {
					if (eventSlave.bellyPreg >= 3000) {
						t.push(`pregnancy`);
					} else {
						t.push(`greatly bloated middle`);
					}
					t.push(`room to hang.`);
				}
			} else {
				t.push(`hiking one knee up onto the bathroom counter in front of it.`);
			}
		}
		t.push(`${He}`);
		if (eventSlave.butt > 6) {
			t.push(`reaches around to pull a buttock aside and starts blatantly winking ${his} anus for`);
			if (hasAnyArms(eventSlave)) {
				t.push(`you, using ${his}`);
				if (hasBothArms(eventSlave)) {
					t.push(`other`);
				}
				t.push(`hand to`);
				if (eventSlave.nipples !== "fuckable") {
					t.push(`tweak`);
				} else {
					t.push(`finger`);
				}
				t.push(`a nipple.`);
			} else {
				t.push(`you.`);
			}
		} else if (eventSlave.butt > 3) {
			t.push(`spreads ${himself} and starts blatantly winking ${his} anus for`);
			if (hasAnyArms(eventSlave)) {
				t.push(`you, using ${his} ${hands} to`);
				if (eventSlave.nipples !== "fuckable") {
					t.push(`tweak`);
				} else {
					t.push(`finger`);
				}
				t.push(`${his} nipples.`);
			} else {
				t.push(`you.`);
			}
		} else {
			t.push(`cocks ${his} hips again and starts blatantly winking ${his} anus for you`);
			if (hasAnyArms(eventSlave)) {
				t.push(`you, using ${his} ${hands} to`);
				if (eventSlave.nipples !== "fuckable") {
					t.push(`tweak`);
				} else {
					t.push(`finger`);
				}
				t.push(`${his} nipples.`);
			} else {
				t.push(`you.`);
			}
		}
		if (eventSlave.analArea > 3) {
			t.push(`The huge area of ${skinDesc} anus around ${his} actual hole certainly draws the eye towards its center, though the way ${he}'s using ${his} sphincter as a come-on does enhance the effect.`);
		}
		t.push(Spoken(eventSlave, `"Please, ${Master},"`));
		if (eventSlave.fetish === "buttslut") {
			t.push(`${he} begins to beg.`);
			t.push(Spoken(eventSlave, `"I can't wait to feel ${V.PC.dick !== 0 ? 'your cock' : 'you'} inside me."`));
		} else {
			t.push(`${he} ${say}s.`);
			t.push(Spoken(eventSlave, `"Use me."`));
		}
		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			(eventSlave.chastityAnus)
				? new App.Events.Result(`Remind ${him} of ${his} chastity`, chaste)
				: new App.Events.Result(),
			(S.HeadGirl && eventSlave.ID !== V.HeadGirlID)
				? new App.Events.Result(`Double anal with the Head Girl`, () => DoubleTeam(S.HeadGirl))
				: new App.Events.Result(),
			(S.Concubine && eventSlave.ID !== V.ConcubineID && hasAnyLegs(S.Concubine) && hasAnyArms(S.Concubine) && S.Concubine.fetish !== Fetish.MINDBROKEN)
				? new App.Events.Result(`Double anal with your Concubine`, () => DoubleTeam(S.Concubine))
				: new App.Events.Result(),
			(S.Bodyguard && eventSlave.ID !== V.BodyguardID)
				? new App.Events.Result(`Double anal with your Body Guard`, () => DoubleTeam(S.Bodyguard))
				: new App.Events.Result(),
			new App.Events.Result(`Chat about ${his} ass`, talk),
			(eventSlave.anus < 3)
				? new App.Events.Result(`Change it some more`, assFuck)
				: new App.Events.Result(),
			new App.Events.Result(`Don't like anal`, wrongHole),
		]);

		function chaste() {
			const totalIntel = eventSlave.intelligence + eventSlave.intelligenceImplant;

			t = [];
			t.push(`You ask if ${he} is forgetting anything.`);
			if (totalIntel > 95) {
				t.push(Spoken(eventSlave, `"Ah! Forgive me ${Master}! I'll put it on right away!"`));
				t.push(`${he} ${say}s, hurrying to fasten ${his} anal chastity, a hint of fear on ${his} face. You tell ${him} it is fine, ${he} was only performing ${his} daily ablutions after all.`);
			} else if (totalIntel > 15) {
				t.push(Spoken(eventSlave, `"Um? No...? I don't think I'm forgetting anything?"`));
				t.push(`${he} states with a look of confusion. You press ${him}, asking if ${he} forgot the rules.`);
				t.push(Spoken(eventSlave, `"Ah! I'm not supposed to be offering my asshole so freely! ${Master}, please forgive me! I'll put it on right away!"`));
				t.push(`${he} shouts, hurrying to fasten ${his} anal chastity, a hint of fear on ${his} face. You tell ${him} it is fine, if you want ${his} ass, you will have it, chastity be damned. ${He} lets out a sigh of relief.`);
				eventSlave.trust -= 2;
			} else if (totalIntel >= -15) {
				t.push(Spoken(eventSlave, `"Um? No...? I don't think I'm forgetting anything?"`));
				t.push(`${he} states with a look of confusion. You press ${him}, asking if ${he} forgot the rules.`);
				t.push(Spoken(eventSlave, `"I need to inspect my anus for damage, elasticity and cleanliness each and every morning."`));
				t.push(`You stare ${him} down, making it clear that was not the right answer.`);
				t.push(Spoken(eventSlave, `"Um, ${Master}, I shouldn't be offering my ass to you, I'm sorry..."`));
				t.push(`${he} limply ${say}s, fear spreading across ${his} face. You tell ${him} it is fine, ${he} did not violate the rules, after all. Though ${he}'d best pay more attention in the future.`);
				eventSlave.trust -= 2;
			} else if (totalIntel >= -95) {
				t.push(Spoken(eventSlave, `"Um? No...? I pretty sure I'm not forgetting anything..."`));
				t.push(`${he} states with a look of confusion. You press ${him}, asking if ${he} forgot the rules.`);
				t.push(Spoken(eventSlave, `"Make sure your asspussy is nice and pretty each and every day!"`));
				t.push(`You stare ${him} down, making it clear that was not the right answer. ${He} wracks ${his} brain, desperately trying to figure out what ${he} could be missing.`);
				t.push(Spoken(eventSlave, `"I offered my ass to you, so that couldn't be it..."`));
				t.push(`${His} cluelessness is starting to get on your nerves. You clear your throat and gesture at the anal chastity left forgotten in the sink.`);
				t.push(Spoken(eventSlave, `"Huh? Is that mine? Wait... Oh, no... I'm sorry ${Master}... Please forgive me..."`));
				t.push(`${he} ${say}s, tears beginning to well up in ${his} eyes. You tell ${him} it is fine, ${he} did not violate the rules, after all. Though ${he}'d best pay more attention in the future. Also not to leave ${his} chastity in the sink, you don't need to be replacing them all the time.`);
				eventSlave.trust -= 2;
			} else {
				t.push(Spoken(eventSlave, `"Um? No?"`));
				t.push(`${he} states with a look of confusion. You press ${him}, asking if ${he} forgot the rules.`);
				t.push(Spoken(eventSlave, `"Look at your butt!"`));
				t.push(`You stare ${him} down, making it clear that was not the right answer. ${He} wracks ${his} brain, desperately trying to figure out what ${he} could be missing.`);
				t.push(Spoken(eventSlave, `"You don't like this position...?"`));
				t.push(`${His} cluelessness is starting to get on your nerves. You clear your throat and gesture at the anal chastity left forgotten on the counter.`);
				t.push(Spoken(eventSlave, `"Huh? You want me to put that away?"`));
				t.push(`You struggle to calmly explain that ${he} is supposed to be wearing anal chastity, not begging for a dick up ${his} ass.`);
				t.push(Spoken(eventSlave, `"So a toy is better?"`));
				t.push(`You fasten the belt around ${his} rear and silently leave the room before you lose it.`);
				t.push(Spoken(eventSlave, `"So you'll fuck my butt later?"`));
				t.push(`${he} shouts after you, still completely oblivious.`);
			}

			return t;
		}

		function DoubleTeam(partner) {
			let container = document.createDocumentFragment();
			const partnerSlave = partner;
			const {He2, he2, his2, him2, himself2} = getPronouns(partnerSlave).appendSuffix('2');
			const {title: Master2} = getEnunciation(partnerSlave);

			// replace slave art
			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, [eventSlave, partnerSlave], "no clothing");

			t = [];
			t.push(`You tell ${him} ${he}'s got a nice asspussy, and grope ${him} thoroughly, cupping ${his} buttocks with one hand and squeezing a breast with the other. ${eventSlave.slaveName} looks`);
			if (eventSlave.fetish === "buttslut") {
				t.push(`desperately eager,`);
			} else {
				t.push(`ready and willing,`);
			}
			t.push(`and angles ${himself} just right, but you administer a light slap to ${his} ${eventSlave.skin} ass and continue, telling ${him} that it's so nice you feel like sharing it. ${He}'s`);
			if (eventSlave.fetish === "buttslut" || eventSlave.energy > 95) {
				t.push(`so ready to fuck ${he} can't quite think of what to say,`);
			} else {
				t.push(`not quite sure how to respond,`);
			}
			t.push(`and before ${he} can figure it out, ${partnerSlave.slaveName} hurries in, responding to your summons. Of course, ${eventSlave.slaveName} is no stranger to ${partnerSlave.slaveName}, who takes in the situation at a glance and`);
			if (canAchieveErection(partnerSlave)) {
				t.push(`instantly achieves a painfully hard erection.`);
			} else {
				t.push(`immediately flushes with arousal.`);
			}
			if (partnerSlave.weight > 160 || partnerSlave.belly >= 10000 || partnerSlave.boobs >= 50000 || partnerSlave.balls >= 50) {
				if (!canPenetrate(partnerSlave)) {
					t.push(`${partnerSlave.slaveName} dons a strap-on before you help ${him2}`);
				} else {
					t.push(`You help support ${partnerSlave.slaveName} as ${he2} struggles`);
				}
			} else {
				t.push(`${partnerSlave.slaveName}`);
				if (!canPenetrate(partnerSlave)) {
					t.push(`dons a strap-on and`);
				}
				t.push(`clambers`);
			}
			t.push(`up onto the (strongly built) bathroom counter. Since saliva is plenty of lube for ${eventSlave.slaveName}'s experienced ass, ${he2} points a meaningful finger at`);
			if (!canPenetrate(partnerSlave)) {
				t.push(`the phallus,`);
			} else {
				t.push(`${his2} cock,`);
			}
			t.push(`and ${eventSlave.slaveName} begins to suck it enthusiastically, trying to get it as wet as possible for the sake of ${his} butt.`);
			seX(eventSlave, "oral", partnerSlave, "penetrative");
			App.Events.addParagraph(container, t);

			t = [];
			t.push(`Since ${eventSlave.slaveName} is being so good, you decide to help get ${him} ready, and push`);
			if (eventSlave.belly < 100000) {
				t.push(`${him} sideways so`);
				if (eventSlave.belly >= 3000) {
					t.push(`${he}'s forced to heft ${his}`);
					if (eventSlave.bellyPreg >= 3000) {
						t.push(`pregnancy`);
					} else {
						t.push(`greatly bloated middle`);
					}
					t.push(`onto the counter.`);
				} else {
					t.push(`${he} straddles the counter's edge.`);
				}
				t.push(`${He} whimpers into the`);
				if (!canPenetrate(partnerSlave)) {
					t.push(`dildo`);
				} else {
					t.push(`dick`);
				}
				t.push(`in ${his} mouth as ${he} feels ${his}`);
				if (eventSlave.dick > 0) {
					if (eventSlave.chastityPenis === 1) {
						t.push(`chastity cage`);
					} else if (eventSlave.hormoneBalance >= 100 || eventSlave.balls === 0 || eventSlave.ballType === "sterile") {
						t.push(`soft dickclit`);
					} else if (!canAchieveErection(eventSlave)) {
						t.push(`oversized cock`);
					} else {
						t.push(`hard cock`);
					}
				} else {
					t.push(`mons`);
				}
				t.push(`graze the hard counter, and then stiffens as you penetrate ${his} bottom.`);
			} else {
				if (eventSlave.bellyPreg >= 3000) {
					t.push(`the obscenely pregnant`);
				} else {
					t.push(`the obscenely swollen`);
				}
				t.push(`${girl} to properly spitroast ${him}. ${He} whimpers into the`);
				if (!canPenetrate(partnerSlave)) {
					t.push(`dildo`);
				} else {
					t.push(`dick`);
				}
				t.push(`in ${his} mouth as ${his} body stiffens from your invading`);
				if (V.PC.dick !== 0) {
					t.push(`cock`);
				} else {
					t.push(`strap-on`);
				}
				t.push(`stretching ${his} anus.`);
			}
			seX(eventSlave, "anal", V.PC, "penetrative");
			t.push(`When you judge that ${partner.slaveName} is wet enough, you nod to ${him2}, and ${he2} takes ${eventSlave.slaveName} by the hand, pulling ${him} up onto ${his2} lap.`);
			if (partnerSlave.belly + eventSlave.belly > 5000 || partnerSlave.weight > 95 || eventSlave.weight > 95) {
				t.push(`There is no chance that the pair of them will manage to stay on that counter without hurting themselves or breaking something, so you quickly help them down onto a bathroom bench before the moment is ruined.`);
			} else if (partnerSlave.boobs > 4000 && eventSlave.boobs > 4000) {
				t.push(`Their tits are so huge that they can't reach each other to kiss, chest-to-chest like that. ${partnerSlave.slaveName} settles for blowing the other slave an exaggerated kiss, which makes ${him} laugh.`);
			} else {
				t.push(`The slaves start making out, showing no signs of breaking their lip lock as they arrange themselves for penetration.`);
			}
			t.push(`${partnerSlave.slaveName} guides ${his2}`);
			if (!canPenetrate(partnerSlave)) {
				t.push(`strap-on`);
			} else {
				t.push(`cock`);
			}
			t.push(`inside the`);
			if (eventSlave.fetish === "buttslut") {
				t.push(`enthusiastic`);
			} else {
				t.push(`compliant`);
			}
			t.push(`${eventSlave.slaveName}, who begins to ride it, enjoying both the`);
			if (eventSlave.prostate > 0) {
				t.push(`prostate`);
			} else {
				t.push(`anal`);
			}
			t.push(`stimulation and the feeling of ${his}`);
			if (eventSlave.dick > 0) {
				if (eventSlave.chastityPenis === 1) {
					t.push(`midsection`);
				} else if (eventSlave.hormoneBalance >= 100 || eventSlave.balls === 0 || eventSlave.ballType === "sterile") {
					t.push(`soft dick`);
				} else if (!canAchieveErection(eventSlave)) {
					t.push(`oversized cock`);
				} else {
					t.push(`erection`);
				}
				t.push(`trapped between ${him} and`);
			} else {
				t.push(`pussy pressed against`);
			}
			t.push(`${partnerSlave.slaveName}.`);
			seX(eventSlave, "anal", partnerSlave, "penetrative");
			t.push(`${partnerSlave.slaveName} smacks the humping`);
			if (eventSlave.physicalAge > 30) {
				t.push(`${woman}'s`);
			} else if (eventSlave.physicalAge > 17) {
				t.push(`${girl}'s`);
			} else if (eventSlave.physicalAge > 12) {
				t.push(`teen's`);
			} else {
				t.push(`${loli}'s`);
			}
			t.push(`butt to get ${him} to stop, and slides an index finger up ${his} ass alongside the`);
			if (!canPenetrate(partnerSlave)) {
				t.push(`phallus.`);
			} else {
				t.push(`cock.`);
			}
			t.push(`${eventSlave.slaveName} shudders, and then begins to whine as ${partnerSlave.slaveName} pulls ${his} sphincter wider.`);
			App.Events.addParagraph(container, t);

			t = [];
			t.push(Spoken(eventSlave, `"Please,"`));
			t.push(`the slave begs incoherently as you press your`);
			if (V.PC.dick !== 0) {
				t.push(`dick`);
			} else {
				t.push(`strap-on`);
			}
			t.push(`against ${partnerSlave.slaveName}'s finger. It's not clear whether ${he}'s begging you to DP ${his} anus, or begging you not to, but whichever it is, ${partnerSlave.slaveName} withdraws ${his2} finger and you shove yourself inside. ${eventSlave.slaveName} jerks with discomfort and gives a gasping "Oh f-fuck-k" that`);
			if (eventSlave.anus > 2) {
				t.push(`${he} repeats over and over`);
			} else {
				t.push(`is followed by some minor struggling`);
			}
			t.push(`as you begin to fuck ${him}.`);
			seX(eventSlave, "anal", V.PC, "penetrative");
			seX(eventSlave, "anal", partnerSlave, "penetrative");
			if (V.PC.belly + eventSlave.belly + partnerSlave.belly >= 7500) {
				t.push(`The only position you can all manage to squeeze in together doesn't quite allow either of you to pound ${eventSlave.slaveName} as hard as you'd like, but you and ${partnerSlave.slaveName} do your best.`);
			} else {
				t.push(`From ${his2} angle, ${partnerSlave.slaveName} can't pound ${eventSlave.slaveName} quite as hard as you can, but ${he2} does ${his2} best.`);
			}
			t.push(`When you've both had your fun, extracted yourselves, and let the exhausted, gaped bitch collapse onto the floor, ${partnerSlave.slaveName} gives you a naughty wink.`);
			t.push(`<span class="devotion inc">`);
			if (canTalk(partnerSlave)) {
				t.push(Spoken(partnerSlave, `"That was fun, ${Master2}!"`));
			} else {
				t.push(`${He2} quite enjoyed ${himself2}`);
			}
			t.push(`</span>`);
			if (canTalk(partnerSlave)) {
				t.push(`${he2} ${say}s.`);
				t.push(Spoken(partnerSlave, `"Shall we flip ${him} over and go again?"`));
			} else {
				t.push(`and would be happy to go for round two.`);
			}
			t.push(`<span class="devotion inc">`);
			t.push(Spoken(eventSlave, `"Please nooo,"`));
			t.push(`</span>`);
			t.push(`comes a quiet wail from the floor.`);
			if (canImpreg(eventSlave, V.PC)) {
				knockMeUp(eventSlave, 10, 1, -1);
			}
			if (canImpreg(eventSlave, partnerSlave)) {
				knockMeUp(eventSlave, 10, 1, partnerSlave.ID);
			}
			App.Events.addParagraph(container, t);

			eventSlave.devotion += 2;
			partnerSlave.devotion += 2;

			return container;
		}

		function talk() {
			let container = document.createDocumentFragment();
			const {heP} = getSpokenPronouns(V.PC, eventSlave).appendSuffix('P');
			t = [];

			t.push(`You head into the bathroom, shedding clothing as you go. ${He} stares at you as you advance, ${his} eyes fixing on your`);
			if (V.PC.boobs >= 1400) {
				t.push(`enormous tits as you reveal them,`);
			} else if (V.PC.boobs >= 1200) {
				t.push(`huge tits as you reveal them,`);
			} else if (V.PC.boobs >= 1000) {
				t.push(`big tits as you reveal them,`);
			} else if (V.PC.boobs >= 300) {
				t.push(`tits as you reveal them,`);
			} else if (V.PC.belly >= 100000) {
				t.push(`massive pregnancy as it becomes visible,`);
			} else if (V.PC.belly >= 60000) {
				t.push(`giant pregnancy as it becomes visible,`);
			} else if (V.PC.belly >= 15000) {
				t.push(`advanced pregnancy as it becomes visible,`);
			} else if (V.PC.belly >= 10000) {
				t.push(`big baby bump as it becomes visible,`);
			} else if (V.PC.belly >= 5000) {
				t.push(`baby bump as it becomes visible,`);
			} else if (V.PC.belly >= 1500) {
				t.push(`rounded middle as it becomes visible,`);
			} else {
				if (V.PC.title === 0) {
					t.push(`flat chest as you reveal it,`);
				} else {
					t.push(`ripped abs as they become visible,`);
				}
			}
			t.push(`and ${his} lips part slightly. ${His} gaze only shifts when you disrobe completely, revealing your`);
			if (V.PC.dick !== 0) {
				t.push(`hardening`);
				if (V.PC.vagina !== -1) {
					t.push(`dick and`);
				} else {
					t.push(`dick;`);
				}
			} else if (V.PC.vagina !== -1) {
				t.push(`flushed womanhood;`);
			}
			t.push(`${he} licks ${his} lips unconsciously. You grab a towel off the counter, spread it on a bathroom bench, and recline on`);
			if (V.PC.belly < 5000) {
				t.push(`it with your back against the wall.`);
			} else {
				t.push(`it.`);
			}
			t.push(`You pat your`);
			// consider muscles and weight here
			if (V.PC.title === 1) {
				t.push(`hard`);
			} else {
				t.push(`pretty`);
			}
			t.push(`thighs, and ${he} hurries over,`);
			if (eventSlave.fetish === "buttslut" || (eventSlave.fetish === "pregnancy" && V.PC.belly >= 5000)) {
				t.push(`eagerly`);
			} else {
				t.push(`carefully`);
			}
			t.push(`swinging ${his} leg over the bench and seating ${himself} in your`);
			if (V.PC.belly >= 60000) {
				t.push(`lap, getting comfortable against your underbelly.`);
			} else {
				t.push(`lap.`);
			}
			if (V.PC.dick !== 0) {
				t.push(`Your cock slides easily up ${his} whorish butt. One of your arms`);
			} else {
				t.push(`You decided not to bother with a strap-on, so you slide a couple of fingers inside ${him}, and ${he} reciprocates by working a hand under ${himself} to attend to your pussy. Your free arm`);
			}
			if (V.PC.belly < 5000) {
				t.push(`wraps around`);
				if (eventSlave.boobs > 4000) {
					t.push(`${him} and under ${his} heavy tits, resting in a cocoon of soft breastflesh.`);
				} else if (eventSlave.boobs > 800) {
					t.push(`${his} heavy breasts, hefting their weight and eliciting a sigh from the slave.`);
				} else if (eventSlave.belly >= 5000) {
					if (eventSlave.bellyPreg > 3000) {
						t.push(`${his} waist to support ${his} pregnancy.`);
					} else if (eventSlave.bellyImplant > 3000) {
						t.push(`${his} waist to support the weight of ${his} belly.`);
					} else {
						t.push(`${his} waist to stabilize ${his} bloated middle.`);
					}
				} else if (eventSlave.weight > 95) {
					t.push(`${his} stomach to better support ${his} weight.`);
				} else if (eventSlave.boobs > 400) {
					t.push(`${him} to support ${his} chest.`);
				} else {
					t.push(`${him} to support ${his} weight.`);
				}
			} else {
				t.push(`grabs as good a hold as you can get in your state on`);
				if (eventSlave.weight > 95) {
					t.push(`${his} love handle.`);
				} else if (eventSlave.hips > 2) {
					t.push(`${his} massive hip.`);
				} else if (eventSlave.hips >= 2) {
					t.push(`${his} wide hip.`);
				} else if (eventSlave.hips >= 1) {
					t.push(`${his} womanly hip.`);
				} else if (eventSlave.hips >= 0) {
					t.push(`${his} hip.`);
				} else if (eventSlave.hips >= -1) {
					t.push(`${his} narrow hip.`);
				} else {
					t.push(`what should be a hip.`);
				}
			}
			t.push(`Being held this way, ${he} can't really`);
			if (V.PC.dick !== 0) {
				t.push(`bounce on your dick, so ${he} just wiggles ${his} butt into you to seat it a bit deeper`);
			} else {
				t.push(`grind against your fingers`);
			}
			t.push(`and sighs contentedly. You instruct ${him} to elaborate on what ${he} said earlier.`);
			App.Events.addParagraph(container, t);

			t = [];
			t.push(Spoken(eventSlave, `"Yes ${Master},"`));
			t.push(`${he} ${say}s automatically, and then pauses.`);
			t.push(Spoken(eventSlave, `"Hmm. I try not to think about back, you know, before."`));
			t.push(`${He} squeezes ${his} buttocks against your`);
			if (V.PC.dick !== 0) {
				t.push(`crotch.`);
			} else {
				t.push(`hand.`);
			}
			t.push(Spoken(eventSlave, `"But I guess back then I didn't really think about my butthole, much? Like, I went to the bathroom, and washed it in the shower, and that was it. But with the liquid slave food, I don't — sorry, ${Master}, I'm being silly. You know all about that."`));
			t.push(`You tell ${him} to explain it anyway. ${He} looks puzzled for a moment, but <span class="trust inc">remembers ${he} can trust you,</span> and twists around to plant an awkward kiss on your`);
			if (V.PC.belly >= 5000) {
				t.push(`navel`);
			} else {
				t.push(`chin`);
			}
			t.push(`before continuing.`);
			t.push(Spoken(eventSlave, `"Well,"`));
			t.push(`${he} ${say}s, with mock seriousness.`);
			t.push(Spoken(eventSlave, `"Here in the arcology, we slaves eat a very special liquid diet that keeps us healthy and fit and ready to fuck. And, it's absorbed completely, so our butts are always nice and clean. That way, ${Master} can –"`));
			t.push(`${he} clenches ${his} sphincter`);
			if (V.PC.dick !== 0) {
				t.push(`around the base of your cock "– fuck`);
			} else {
				t.push(`against your invading fingers "– play with`);
			}
			t.push(
				Spoken(eventSlave, `our asses –"`),
				`<i>clench</i>`,
				Spoken(eventSlave, `"– whenever –"`),
				`<i>clench</i>`,
				Spoken(eventSlave, `"– ${heP} –"`),
				`<i>clench</i>`,
				Spoken(eventSlave, `"– wants!"`),
				`${He} squeals as you use your encircling arm to hoist ${his} torso up a bit higher, and mercilessly`
			);
			if (V.PC.dick !== 0) {
				t.push(`fuck`);
			} else {
				t.push(`fingerfuck`);
			}
			t.push(`${his} ass. Many of your other slaves came and went during this, and none of them saw anything unusual about you molesting ${eventSlave.slaveName}'s bottom in a corner of the restroom.`);
			t.push(VCheck.Anal(eventSlave, 1));
			eventSlave.trust += 4;
			App.Events.addParagraph(container, t);

			return container;
		}

		function assFuck() {
			let container = document.createDocumentFragment();

			t = [];
			t.push(`You tell ${him} that since ${he} appreciates how ${his} ass has changed, ${he} won't be surprised if you treat it like the fuckhole it is. Something in your tone makes ${him} cautious, but ${he}'s a good ${girl} and ${say}s`);
			t.push(Spoken(eventSlave, `"Yes, ${Master},"`));
			t.push(`automatically. You pass ${V.assistant.name} wardrobe orders for the poor`);
			if (eventSlave.physicalAge > 30) {
				t.push(`${woman},`);
			} else if (eventSlave.physicalAge > 17) {
				t.push(`${girl},`);
			} else if (eventSlave.physicalAge > 12) {
				t.push(`teen,`);
			} else {
				t.push(`${loli},`);
			}
			t.push(`and instructions to have ${him} report to your office once ${he}'s dressed. A few minutes later, ${eventSlave.slaveName} walks up to your desk, stark naked except for a buttplug that comfortably fills ${his} rectum and a sturdy leather collar attached to a leash. You snap your fingers, pointing at the ground, and ${he}`);
			if (eventSlave.belly >= 30000) {
				t.push(`struggles`);
			} else {
				t.push(`scrambles`);
			}
			if (hasAllLimbs(eventSlave)) {
				t.push(`to ${his} hands and knees`);
			} else {
				t.push(`downwards`);
			}
			t.push(`and`);
			if (hasAnyArms(eventSlave)) {
				t.push(`removes ${his} plug.`);
			} else {
				t.push(`presents ${his} plug for removal.`);
			}
			t.push(`After ${he}'s taken a harsh buttfuck, you`);
			if (V.PC.dick !== 0) {
				t.push(`push the plug back in without letting any of your cum escape`);
			} else {
				t.push(`plug ${him} up again`);
			}
			t.push(`and attach the leash to your belt. You ignore your anal toy completely, letting ${him} kneel next to you as you work — ${he} doesn't seem to want to sit, for some reason. For the rest of the day, ${his} anus takes the full force of your libido. You fuck nothing else, confining your efforts to ${his} backdoor, keeping ${him} plugged when you aren't penetrating ${him}. When you're bored, you hand ${him} a dildo and tell ${him} to take care of it ${himself}.`);
			App.Events.addParagraph(container, t);

			t = [];
			t.push(`${He}'s quite exhausted by the end of the day,`);
			if (eventSlave.belly >= 10000) {
				t.push(`waddling`);
			} else {
				t.push(`walking`);
			}
			t.push(`dumbly along behind you, leashed to your belt and wondering tiredly when ${his} next reaming is coming. ${He} doesn't notice that you're bringing ${him} back to stand in front of the mirror until ${he}'s there. You push ${his} compliant body into an approximation of ${his} position from the`);
			if (hasAnyArms(eventSlave)) {
				t.push(`morning and tell ${him} to remove ${his} plug and`);
			} else {
				t.push(`morning, pull out ${his} plug, and tell ${him} to`);
			}
			t.push(`look at ${his} asshole.`);
			t.push(Spoken(eventSlave, `"Yes, ${Master},"`));
			t.push(`${he} ${say}s, and obeys.`);
			if (V.PC.dick !== 0 && V.PC.balls > 0) {
				t.push(`This releases`);
				if (V.PC.balls >= 30) {
					t.push(`an obscene amount of ejaculate as ${his} stomach deflates slowly.`);
				} else if (V.PC.balls >= 14) {
					t.push(`a flood of ejaculate.`);
				} else if (V.PC.balls >= 9) {
					t.push(`a torrent of ejaculate.`);
				} else {
					t.push(`quite a rush of ejaculate.`);
				}
			}
			t.push(`${His} anus is very loose, a lewd, gaping fuckhole hungry for toys, fingers, and dick. You tell ${him} that, and ask whether ${he} agrees. `);
			t.push(Spoken(eventSlave, `"Yes, ${Master},"`));
			t.push(`${he} ${say}s.</span>`);
			eventSlave.devotion += 4;
			eventSlave.anus = 3;
			t.push(VCheck.Anal(eventSlave, 2));
			App.Events.addParagraph(container, t);

			return [container];
		}

		function wrongHole() {
			t = [];
			t.push(`You make it abundantly clear that you and you alone choose what hole you fuck and when, and it will not be ${his} loose asshole.`);
			t.push(Spoken(eventSlave, `"Ah! I-I'm sorry ${Master}, I went too far."`));
			t.push(`<span class="devotion dec">${He} looks crestfallen</span> as you take your leave.`);
			eventSlave.devotion -= 2;
			return t;
		}
	}
};


code:
App.Events.RECIFeminization = class RECIFeminization extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				s => this.validSlave(s),
				s => s.assignment !== Job.QUARTER,
				s => s.devotion >= 10,
				s => s.dick > 0,
				s => s.vagina < 0,
				s => s.attrXY > 65,
				s => s.energy > 60,
				s => s.faceShape !== "masculine",
				s => s.belly <= 0,
				s => s.bodySwap === 0,
				s => s.anus > 0,
				s => s.sexualFlaw !== "hates anal",
				s => s.butt > 0,
				canStand,
				canDoAnal,
				canTalk,
				canHear,
				hasAnyArms,
			]
		];
	}

	validSlave(slave) {
		return V.RECheckInIDs.some((a) => (a.ID === slave.ID && a.type === "feminization"));
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {He, he, His, his, him, himself, girl} = getPronouns(eventSlave);
		const {title: Master, say: say} = getEnunciation(eventSlave);
		const desc = SlaveTitle(eventSlave);
		const legs = hasBothLegs(eventSlave) ? "legs" : "leg";

		V.RECheckInIDs.deleteWith((s) => s.ID === eventSlave.ID && s.type === "feminization");

		let artDiv = document.createElement("div"); // named container so we can replace it later
		App.Events.drawEventArt(artDiv, eventSlave, "no clothing");
		node.appendChild(artDiv);

		let t = [];
		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`is standing before your desk for an inspection. The ${desc} is naked, of course, and is devoted enough to find the situation arousing: ${he}'s being inspected by ${his} ${getWrittenTitle(eventSlave)} in the nude, which is sexual enough, and past inspections have often led to a quick fuck. The horny bitch obviously wants it;`);
		if (eventSlave.chastityPenis === 1) {
			t.push(`${his} chastity cage is dribbling precum, and ${he}'s clearly uncomfortable with simultaneous arousal and unwillingness to suffer a hard-on inside it.`);
		} else if (canAchieveErection(eventSlave)) {
			t.push(`${his} cock is painfully erect.`);
		} else if (eventSlave.dick > 6) {
			t.push(`${his} inhuman cock is swollen and leaking precum.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${his} pathetically limp dick is practically dripping precum.`);
		}
		t.push(`Your inspections require the slave to offer each of ${his} body parts to your view, and when the routine reaches ${his} anus, the slut obediently turns ${his} back to you, bends at the waist, and`);
		if (eventSlave.butt > 10) {
			t.push(`struggles to spread ${his} immense asscheeks far enough apart to even give you a view of`);
		} else if (eventSlave.butt > 5) {
			t.push(`prises ${his} massive buttocks apart to reveal`);
		} else if (eventSlave.butt > 2) {
			t.push(`pulls ${his} buttocks apart to show off`);
		} else {
			t.push(`spreads ${his} cute buttocks to show off`);
		}
		t.push(`${his}`);
		if (eventSlave.anus > 2) {
			t.push(`asshole, which is so relaxed it's begging for cock.`);
		} else if (eventSlave.anus > 1) {
			t.push(`butthole, which ${he} winks invitingly at you.`);
		} else {
			t.push(`tight anus, which ${he} winks invitingly at you.`);
		}
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`You often pepper slaves with questions during this inspection; it helps you gauge their mental state, and it's just as important to verbally inspect slaves' minds as it is to visually inspect their backdoors. You remember with sudden clarity what ${eventSlave.slaveName} was like when you acquired ${him}. ${He} wasn't as enthusiastic then. The first time you inspected ${him}, ${he} certainly wasn't so excited about getting buttfucked. You ask ${him} if ${he} remembers that too. ${He} hesitates, wondering how to answer, but decides that honesty is the best policy and ${say}s,`);
		t.push(Spoken(eventSlave, `"I remember, ${Master}. It was hard for me, becoming a girl.`));
		if (eventSlave.fetish === "buttslut" || eventSlave.energy > 95) {
			t.push(Spoken(eventSlave, `But, ${Master}, girls get fucked. And I love getting fucked in the butt so much. If that makes me a girl then I'm happy being a girl.`));
		} else if (eventSlave.fetish === "cumslut" && eventSlave.fetishStrength > 60) {
			t.push(Spoken(eventSlave, `But, ${Master}, girls suck cock. And I love sucking cock so much. If that makes me a girl then I'm happy being a girl.`));
		} else if (eventSlave.fetish === "pregnancy" && eventSlave.fetishStrength > 60) {
			t.push(Spoken(eventSlave, `But, ${Master}, girls get bred. And I love being held down and bred. If that makes me a girl then I'm happy being a girl.`));
		} else if ((eventSlave.fetish === Fetish.SUBMISSIVE || eventSlave.fetish === "masochist") && eventSlave.fetishStrength > 60) {
			t.push(Spoken(eventSlave, `But, ${Master}, girls get held down and fucked. And I love being used so much. If that makes me a girl then I'm happy being a girl.`));
		} else if (eventSlave.boobs > 400) {
			t.push(Spoken(eventSlave, `Getting a girl's body made it easier for me, though. When I`));
			if (canSee(eventSlave)) {
				t.push(Spoken(eventSlave, `see myself in the mirror, I see`));
			} else {
				t.push(Spoken(eventSlave, `feel myself up, I feel`));
			}
			t.push(Spoken(eventSlave, `a girl with a body made for getting fucked.`));
		} else if (eventSlave.balls === 0) {
			t.push(Spoken(eventSlave, `Not having balls makes it easier for me, though. The only way my soft girldick will come is when I take cock.`));
		} else {
			t.push(Spoken(eventSlave, `But the training and the rules pushed me through it.`));
		}
		t.push(Spoken(eventSlave, `I try to be a good slave girl for you, ${Master}. Can I — can I be a good slave girl for you? Right now? Please?"`));
		t.push(`${He} twists ${his} ${eventSlave.skin} body suggestively,`);
		if (eventSlave.chastityPenis === 1) {
			t.push(`offering you ${his} rear hole, the only hope the chastity caged ${girl} has of release.`);
		} else if (canAchieveErection(eventSlave)) {
			t.push(`hard dick wagging with the motion, offering you ${his} rear.`);
		} else if (eventSlave.dick > 6) {
			t.push(`engorged dick wobbling with the motion, offering you ${his} rear.`);
		} else if (eventSlave.dick > 0) {
			t.push(`soft dick flopping with the motion, offering you ${his} rear.`);
		}
		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result(`Yes ${he} can`, gentleSex),
			new App.Events.Result(`${He}'s a good slave girl all the time, not just right now`, poundingSex),
			(canImpreg(eventSlave, V.PC))
				? new App.Events.Result(`Girls should be naked, barefoot and pregnant`, breedingSex)
				: new App.Events.Result(),
			new App.Events.Result(`Good slave girls earn money`, partyGirl),
		]);

		function gentleSex() {
			t = [];
			t.push(`When ${he}`);
			if (canSee(eventSlave)) {
				t.push(`sees`);
			} else {
				t.push(`hears`);
			}
			t.push(`you stand up from behind your`);
			if (V.PC.dick === 0) {
				t.push(`desk and pull on a strap-on,`);
			} else {
				t.push(`desk,`);
			}
			t.push(`${he} turns fully away from you, cocking ${his}`);
			if (eventSlave.hips > 0) {
				t.push(`womanly`);
			}
			t.push(`hips at just the right angle to offer you ${his} anus, without any preamble or foreplay. But you come up behind ${him} and encircle ${his}`);
			if (eventSlave.weight > 95) {
				t.push(`bountiful belly`);
			} else if (eventSlave.weight > 30) {
				t.push(`soft stomach`);
			} else if (eventSlave.muscles > 95) {
				t.push(`ripped abs`);
			} else if (eventSlave.weight > 10) {
				t.push(`plush belly`);
			} else if (eventSlave.muscles > 30) {
				t.push(`muscular waist`);
			} else if (eventSlave.muscles > 5) {
				t.push(`firm stomach`);
			} else {
				t.push(`trim waist`);
			}
			t.push(`with your capable hands, your lips nibbling along the line of ${his}`);
			if (eventSlave.weight > 95) {
				t.push(`soft`);
			} else if (eventSlave.muscles > 30) {
				t.push(`strong`);
			} else if (eventSlave.muscles > 5) {
				t.push(`toned`);
			} else {
				t.push(`soft`);
			}
			t.push(`shoulders and neck. ${He} shudders as the embrace brings your`);
			if (V.PC.dick === 0) {
				t.push(`strap-on`);
			} else {
				t.push(`dick`);
			}
			if (eventSlave.height >= V.PC.height + 15) {
				if (hasBothLegs(eventSlave)) {
					t.push(`slipping between ${his} thighs,`);
				} else {
					t.push(`slapping against ${his} thigh,`);
				}
				t.push(`since ${he}'s taller than you.`);
			} else if (eventSlave.height >= V.PC.height) {
				t.push(`up between ${his} buttocks, since ${he}'s as tall as you.`);
			} else if (eventSlave.height >= V.PC.height - 15) {
				t.push(`pressing into ${his} asscrack, since ${he}'s shorter than you.`);
			} else if (eventSlave.height >= V.PC.height - 30) {
				t.push(`nestling down into ${his} asscrack, since ${he}'s so much shorter than you.`);
			} else {
				t.push(`sliding down ${his} back, since there is a considerable size difference between you.`);
			}
			t.push(`You whisper that a good slave girl doesn't have to touch ${himself} to come when ${his} ${getWrittenTitle(eventSlave)} fucks ${his} butt, and ask whether ${he}'s a good slave girl. ${He} shivers and promises that ${he} is, rubbing ${his} asshole against your`);
			if (V.PC.dick === 0) {
				t.push(`phallus.`);
			} else {
				t.push(`cockhead.`);
			}
			t.push(`${He} gives a`);
			if (eventSlave.voice > 1) {
				t.push(`feminine`);
			} else {
				t.push(`unbecomingly deep`);
			}
			t.push(`sigh as it slides into ${him}, and moves softly within your embrace, doing ${his} best to pleasure you with ${his} girly ass. ${He} was already very close, and your loving touch so aroused ${him} that ${he} gasps and stiffens after only a few thrusts,`);
			if (eventSlave.chastityPenis === 1) {
				t.push(`shuddering`);
			} else if (canAchieveErection(eventSlave)) {
				t.push(`${his} dick twitching`);
			} else if (eventSlave.dick > 6) {
				t.push(`${his} fat dick twitching slightly.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${his} soft dick twitching softly`);
			}
			t.push(`with a weak orgasm. ${He} giggles self-consciously and keeps humping back into you. ${He} is a good slave girl once more before going to rinse ${himself} off in the shower, so much so that you follow ${him} so ${he} can be a good slave girl in the shower, too.`);
			eventSlave.devotion += 4;
			seX(eventSlave, "anal", V.PC, "penetrative", 3);
			if (canImpreg(eventSlave, V.PC)) {
				knockMeUp(eventSlave, 15, 1, -1);
			}
			return t;
		}

		function poundingSex() {
			t = [];
			t.push(`You tell ${him} that ${he} doesn't have to prove anything to you right now; ${he}'s shown that ${he}'s a good slave girl already. ${He} looks shocked for a moment before blushing and turning ${his} gaze down at ${his} feet.`);
			t.push(Spoken(eventSlave, `"T-thanks ${Master},"`));
			t.push(`${he} stammers. Since ${he} asked so nicely, though, you continue; you will fuck ${his} butt. ${He} giggles and`);
			if (canWalk(eventSlave)) {
				t.push(`hurries`);
			} else {
				t.push(`crawls`);
			}
			t.push(`over to you in response to a crooked finger, curling up in your lap for a nice makeout session. When the next slave scheduled for an examination comes through the door, it's to the sight of ${eventSlave.slaveName} holding ${his} body sideways in the air over the`);
			if (hasBothLegs(eventSlave)) {
				t.push(`couch: ${he} has one knee down on the cushions, and is doing the splits with the other leg running up`);
				if (V.PC.boobs >= 300) {
					t.push(`between your breasts.`);
				} else if (V.PC.title === 0) {
					t.push(`your flat chest.`);
				} else {
					t.push(`your muscular chest.`);
				}
			} else {
				t.push(`couch.`);
			}
			t.push(`Your`);
			if (V.PC.dick === 0) {
				t.push(`strap-on`);
			} else {
				t.push(`dick`);
			}
			t.push(`is up ${his} ass, and you're giving it to ${him} hard.`);
			if (eventSlave.boobs > 25000) {
				t.push(`${His} immense breasts wobble beside ${him}, absorbing the impact of each thrust.`);
			} else if (eventSlave.boobs > 1000) {
				t.push(`${His} huge breasts are bouncing back and forth with the motion, almost hitting ${himself} in the face.`);
			} else if (eventSlave.weight > 10) {
				t.push(`${His} generous curves lend the motion weight, and each thrust reams ${his} ass hard.`);
			} else if (eventSlave.hLength >= 60) {
				t.push(`${His} long hair flies around ${his} face in a maelstrom of sexual energy.`);
			} else {
				t.push(`The leather couch creaks with an obscurely sexual rhythm.`);
			}
			t.push(`${He}'s being fucked so hard that ${his}`);
			if (eventSlave.chastityPenis === 1) {
				t.push(`cock is being forced to half-hardness inside its chastity cage, making ${him} writhe with mixed anal pleasure and dick pain.`);
			} else if (canAchieveErection(eventSlave)) {
				if (eventSlave.dick > 3) {
					t.push(`massive erection is slapping wetly against ${his} stomach, spattering ejaculate from a previous orgasm everywhere,`);
				} else if (eventSlave.dick > 1) {
					t.push(`hard-on is helicoptering around wildly, spattering ejaculate from a previous orgasm everywhere`);
				} else {
					t.push(`tiny erection is scattering ejaculate from a previous orgasm everywhere.`);
				}
			} else if (eventSlave.dick > 6) {
				t.push(`${his} swollen cock is swaying along to the pounding, slapping heavily against anything it hits.`);
			} else if (eventSlave.dick > 3) {
				t.push(`huge soft cock is flopping at random, slapping against ${his} stomach and ${his} ${legs}.`);
			} else if (eventSlave.dick > 1) {
				t.push(`${his} impotent dick has been forced to a state of half-hardness.`);
			} else {
				t.push(`${his} pathetic little dick has been forced into a state of half-hardness.`);
			}
			t.push(`${He}'s so far gone into a state of`);
			if (eventSlave.prostate > 0) {
				t.push(`prostate stimulation induced bliss`);
			} else {
				t.push(`bliss from having ${his} insides stirred up`);
			}
			t.push(`that ${he}'s drooling a little.`);
			eventSlave.trust += 4;
			seX(eventSlave, "anal", V.PC, "penetrative");
			if (canImpreg(eventSlave, V.PC)) {
				knockMeUp(eventSlave, 10, 1, -1);
			}
			return t;
		}

		function breedingSex() {
			t = [];
			t.push(`You tell ${him} that a proper girl should be naked, barefoot, and pregnant. ${He} thinks for a moment and ${say}s,`);
			t.push(Spoken(eventSlave, `"Well I'm already naked... And I'm not wearing any shoes... So that just leaves getting knocked up..."`));
			t.push(`${He} giggles, lowers ${himself} to the ground and`);
			if (eventSlave.butt > 10) {
				t.push(`bounces ${his} ridiculous ass at you,`);
			} else if (eventSlave.butt > 3) {
				t.push(`jiggles ${his} huge butt at you,`);
			} else {
				t.push(`wiggles ${his} butt at you,`);
			}
			t.push(`inviting you to mount ${him}.`);
			t.push(Spoken(eventSlave, `"Which won't be a problem at a—!"`));
			t.push(`${He} is cut short as you hilt your dick in ${his} ass, push ${his} face to the floor, and being pounding ${his}`);
			if (eventSlave.anus > 2) {
				t.push(`slutty asspussy.`);
			} else if (eventSlave.anus > 1) {
				t.push(`loose hole.`);
			} else {
				t.push(`tight hole.`);
			}
			t.push(`${He} bucks against you like a bitch in heat,`);
			if (eventSlave.chastityPenis === 1) {
				t.push(`despite the pain caused by ${his} chastity bound hardness,`);
			} else if (canAchieveErection(eventSlave)) {
				t.push(`${his} throbbing erection smearing precum across ${his} belly,`);
			} else if (eventSlave.dick > 6) {
				t.push(`${his} swollen cock wobbling with your thrusts,`);
			} else if (eventSlave.dick > 1) {
				t.push(`${his} soft cock flopping against ${his} belly to your thrusts,`);
			} else {
				t.push(`${his} pathetic little dick flopping around forgotten beneath ${him},`);
			}
			t.push(`until ${he} feels the warmth of your fresh load deposited in the depths of ${his} rear. You help ${him} onto the couch, where ${he} gently massages ${his} lower belly, marveling at what it means to be your girl.`);
			t.push(Spoken(eventSlave, `"I'm going to have ${Master}'s babies... It's like a dream,"`));
			t.push(`${he} babbles incoherently. This is just the first of many breedings ${he}'ll undergo this week as you finish ${his} transformation into the perfect slave girl; it will be a surprise if ${he} doesn't come out of this pregnant.`);
			eventSlave.devotion += 2;
			seX(eventSlave, "anal", V.PC, "penetrative", 10);
			if (canImpreg(eventSlave, V.PC)) {
				knockMeUp(eventSlave, 95, 1, -1);
			}
			return t;
		}

		function partyGirl() {
			// replace slave art
			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, eventSlave, "a mini dress");

			t = [];
			t.push(`You tell ${him} that you've hired ${him} out for a party a prominent citizen is throwing, and that ${he} should be a good slave girl by saving ${himself} for that. ${He} trips all over ${himself} promising that ${he} will. You check in on ${him} later, using the video feeds, and are treated to the sight of ${him} wearing a slinky cocktail dress, although wearing is perhaps the wrong term. ${He}'s bent over a barstool with the top of the dress pulled down`);
			if (eventSlave.boobs > 10000) {
				t.push(`to let ${his} massive chest wobble freely`);
			} else if (eventSlave.boobs > 1000) {
				t.push(`over ${his} huge tits`);
			} else if (eventSlave.boobs > 300) {
				t.push(`to bare ${his} boobs`);
			} else {
				t.push(`to reveal ${his} sissy chest`);
			}
			t.push(`and the bottom of ${his} dress hiked up so a guest can fuck ${his} ass. ${He}'s obviously enjoying ${himself}, happy to be getting some at last. ${His} fee for the night is substantial, and the host attaches a note to the payment, complimenting ${his} eagerness to get assfucked and ${his} willingness to suck cock, and asking when ${he}'ll be available next.`);
			cashX(500, "event", eventSlave);
			seX(eventSlave, "anal", "public", "penetrative", 5);
			seX(eventSlave, "oral", "public", "penetrative", 5);
			if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
				knockMeUp(eventSlave, 10, 1, -2);
			}
			return t;
		}
	}
};