code:
App.Events.RETSInterslaveBegging = class RETSInterslaveBegging extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.universalRulesConsent === 1,
		];
	}

	actorPrerequisites() {
		return [
			[ // event slave /domslave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canStand,
				canTalk,
				canHear,
				canSee,
				s => s.devotion > 20,
				s => s.energy > 40,
				s => ((canDoVaginal(s) && s.vagina !== 0) || (canDoAnal(s) && s.anus !== 0)),
				canPenetrate,
				canSee,
				s => s.rules.release.slaves === 1,
			],
			[ // and subslave
				s => s.fetish !== "mindbroken",
				canWalk,
				canTalk,
				canHear,
				isSlaveAvailable,
				s => s.devotion > 20,
				s => s.energy > 40,
				s => ((canDoVaginal(s) && s.vagina !== 0) || (canDoAnal(s) && s.anus !== 0)),
				s => s.rules.release.slaves === 1,
				s => s.assignment !== Job.CONCUBINE,
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {say} = getEnunciation(eventSlave);
		const {
			He2, he2, His2, his2, him2, girl2, himself2
		} = getPronouns(subSlave).appendSuffix("2");
		const {say: say2} = getEnunciation(subSlave);
		const {
			girlP
		} = getPronouns(V.PC).appendSuffix("P");

		App.Events.drawEventArt(node, [eventSlave, subSlave], "no clothing");
		const vaginal = canDoVaginal(subSlave) && subSlave.vagina > 0;

		let t = [];

		t.push(`Passing the slave quarters late at night, you hear`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), "'s"));
		if (eventSlave.voice > 2) {
			t.push(`girly voice raised in`);
		} else if (eventSlave.voice > 1) {
			t.push(`feminine voice raised in`);
		} else {
			t.push(`deep voice raised in`);
		}
		if (eventSlave.trust <= 20 || (eventSlave.fetish === "submissive" && eventSlave.fetishKnown)) {
			t.push(`${his} usual begging tones. ${He}'s`);
			if (eventSlave.fetish === "submissive" && eventSlave.fetishKnown) {
				t.push(`a shameless little slut of a sub, and`);
			} else {
				t.push(`got a lot to be afraid of, as a sex slave, so`);
			}
			t.push(`getting down on ${his} metaphorical knees is an hourly occurrence for ${him}.`);
			if (hasAnyLegs(eventSlave)) {
				t.push(`(Not that ${he} doesn't get down on ${his} actual`);
				if (hasBothLegs(eventSlave)) {
					t.push(`knees, too.)`);
				} else {
					t.push("knee, too.)");
				}
			}
		} else {
			t.push(`begging tones that are unusual for ${him}.`);
		}
		t.push(Spoken(eventSlave, `"Pleeease let me fuck ${vaginal ? "you," : "your butt,"}"`));
		t.push(`${he} whines.`);

		App.Events.addParagraph(node, t);
		t = [];

		t.push(Spoken(subSlave, `"I'm tired,"`));
		t.push(`says`);
		if (eventSlave.voice > subSlave.voice) {
			t.push(`another, lower,`);
		} else if (eventSlave.voice < subSlave.voice) {
			t.push(`another, higher,`);
		} else {
			if (subSlave.voice > 2) {
				t.push(`a high-pitched`);
			} else if (subSlave.voice > 1) {
				t.push(`a soft`);
			} else {
				t.push(`a harsh`);
			}
		}
		t.push(`voice. It's`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(eventSlave, subSlave, true), `.`));
		if (subSlave.belly >= 120000 && eventSlave.dick > 3) {
			if (subSlave.bellyPreg >= 2000) {
				t.push(Spoken(subSlave, `"I'm way too pregnant; there's just no room for a big cock like yours inside me anymore. Plus you'll wake them up and they'll be kicking all night again."`));
			} else if (subSlave.bellyImplant >= 2000) {
				t.push(Spoken(subSlave, `"My belly's so filled by my implant that there's just no room for a big cock like yours inside me anymore."`));
			}
		} else if (subSlave.bellyFluid >= 10000 && eventSlave.dick > 3) {
			t.push(Spoken(subSlave, `"I'm really full of ${subSlave.inflationType}. I don't know what will happen if you fuck me."`));
		} else if (subSlave.preg > subSlave.pregData.normalBirth/1.33 && eventSlave.dick > 3) {
			t.push(Spoken(subSlave, `"I'm really pregnant, and it's getting uncomfortable to take a big cock like yours."`));
		} else if (subSlave.assignment === Job.BROTHEL || subSlave.assignment === Job.WHORE) {
			t.push(Spoken(subSlave, `"And my ${vaginal ? "pussy" : "ass"} is sore. Customers ${vaginal ? "fucked me" : "pounded it"} all day."`));
		} else if (subSlave.assignment === Job.CLUB || subSlave.assignment === Job.PUBLIC) {
			t.push(Spoken(subSlave, `"And my ${vaginal ? "pussy" : "ass"} is sore. Citizens ${vaginal ? "fucked me" : "pounded it"} all day."`));
		} else {
			t.push(Spoken(subSlave, `"I'm tired, and I have to ${subSlave.assignment !== Job.CHOICE ? subSlave.assignment : "work"} tomorrow. I just want to go to sleep."`));
		}
		t.push(`${His2} objections sound a bit feigned, and ${he2}'s obviously in no hurry to put an end to`);
		if (areRelated(eventSlave, subSlave)) {
			t.push(`the unmatched perversion of having ${his2} own ${relativeTerm(subSlave, eventSlave)} beg ${him2} for sex.`);
		} else if (eventSlave.assignment === Job.HEADGIRL) {
			t.push(`listening to the Head Girl beg to be allowed to put ${his} cock inside ${him2}. Usually, it's ${eventSlave.slaveName} giving the orders.`);
		} else if (eventSlave.fetishKnown && (eventSlave.fetish === "dom" || eventSlave.fetish === "sadist")) {
			t.push(`having a dominant ${SlaveTitle(eventSlave)} like ${eventSlave.slaveName} beg ${him2} for sex.`);
		} else if (eventSlave.face > 40) {
			t.push(`having a`);
			if (eventSlave.face > 95) {
				t.push(`perfect`);
			} else {
				t.push(`really very pretty`);
			}
			t.push(`${SlaveTitle(eventSlave)} beg ${him2} for sex.`);
		} else {
			t.push(`having somebody beg ${him2} for sex. ${He2}'s a sex slave, and ${he2} doesn't always have the luxury of feeling so wanted.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		const subBelly = bellyAdjective(subSlave);
		t.push(`The slaves are about to go to bed; they're naked, and the horny ${eventSlave.slaveName}'s`);
		if (eventSlave.dick > 5) {
			t.push(`enormous erection is pointed threateningly`);
		} else if (eventSlave.dick > 2) {
			t.push(`stiff dick is pointed straight`);
		} else {
			t.push(`pathetic dick is pointed right`);
		}
		t.push(`at ${subSlave.slaveName}'s ${subBelly} midsection. Desperate, ${eventSlave.slaveName} decides to try praise instead.`);
		let lewd = false;
		if (vaginal && subSlave.labia > 0) {
			t.push(Spoken(eventSlave, `"You've got such a beautiful pussy though,"`));
			t.push(`${he} wheedles.`);
			t.push(Spoken(eventSlave, `"It's gorgeous. Those lips look so soft and inviting!"`));
			t.push(`It's true; ${subSlave.slaveName}'s generous petals are a bit engorged.`);
			lewd = true;
		} else if (vaginal && subSlave.vaginaLube > 0) {
			t.push(Spoken(eventSlave, `"You've got such a naughty pussy though,"`));
			t.push(`${he} wheedles.`);
			t.push(Spoken(eventSlave, `"It's so hot. Look, it's all wet and ready!"`));
			t.push(`It's true; ${subSlave.slaveName}'s invariably moist pussy is visibly glistening.`);
			lewd = true;
		} else if (!vaginal && subSlave.analArea > 2) {
			t.push(Spoken(eventSlave, `"You've got such an asspussy though,"`));
			t.push(`${he} wheedles.`);
			t.push(Spoken(eventSlave, `"That naughty hole is calling to me!"`));
			t.push(`It's true; ${subSlave.slaveName}'s asshole is surrounded by a nice wide area of crinkled skin. ${He2} obviously takes it up the butt.`);
			lewd = true;
		} else if (eventSlave.fetishKnown && eventSlave.fetish === "pregnancy" && subSlave.bellyPreg >= 5000) {
			t.push(Spoken(eventSlave, `"You're so hot with that belly,"`));
			t.push(`${he} wheedles.`);
			t.push(Spoken(eventSlave, `"It's just so big, and round, and, um, out there."`));
			t.push(`${He} swallows, getting distracted.`);
		} else if (subSlave.face > 95) {
			t.push(Spoken(eventSlave, `"You're the prettiest ${SlaveTitle(subSlave)} in the whole arcology,"`));
			t.push(`${he} wheedles.`);
			t.push(Spoken(eventSlave, `"I can't look at your perfect ${subSlave.faceShape} face and not want to make love to ${!vaginal ? "your butt": "you"}!"`));
		} else if (!vaginal && subSlave.butt > 3) {
			t.push(Spoken(eventSlave, `"You've got such a nice ass,"`));
			t.push(`${he} wheedles.`);
			t.push(Spoken(eventSlave, `It's just so big, and round, and, um, out there."`));
			t.push(`${He} swallows, getting distracted.`);
		} else if (subSlave.boobShape === "perky") {
			t.push(Spoken(eventSlave, `"Your tits are incredible,"`));
			t.push(`${he} wheedles.`);
			if (subSlave.boobs > 800) {
				t.push(Spoken(eventSlave, `"They're magical. There's no other explanation for them being so huge and still perky."`));
			} else if (subSlave.boobs > 400) {
				t.push(Spoken(eventSlave, `"They're so perky and perfect."`));
			} else {
				t.push(Spoken(eventSlave, `"They're so tiny and cute!"`));
			}
			t.push(Spoken(eventSlave, `"I want ${!vaginal ? "your ass" : "you"} so much!"`));
		} else if (subSlave.boobShape === "torpedo-shaped") {
			t.push(Spoken(eventSlave, `"Your torpedoes are incredible,"`));
			t.push(`${he} wheedles.`);
			if (subSlave.boobs > 400) {
				t.push(Spoken(eventSlave, `"The way they sway when you move should be against the rules."`));
			} else {
				t.push(Spoken(eventSlave, `"They're so tiny and cute!"`));
			}
			t.push(Spoken(eventSlave, `"I want ${!vaginal ? "your ass" : "you"} so much!"`));
		} else if (subSlave.muscles > 30) {
			t.push(Spoken(eventSlave, `"You're so jacked,"`));
			t.push(`${he} wheedles.`);
			t.push(Spoken(eventSlave, `"I just want to`));
			if (vaginal) {
				t.push(Spoken(eventSlave, `feel those huge thighs wrap around me as I fuck you!"`));
			} else {
				t.push(Spoken(eventSlave, `feel that muscular booty flex under me as I fuck your butt!"`));
			}
		} else if (subSlave.skill.entertainment > 95) {
			t.push(Spoken(eventSlave, `You're so beautiful and graceful,"`));
			t.push(`${he} wheedles.`);
			t.push(Spoken(eventSlave, `"I love watching you walk. Look at you, just standing there you're so perfectly feminine. I want to make love to ${!vaginal ? "your ass" : "you"}!"`));
		} else {
			t.push(Spoken(eventSlave, `"You're so, um, cute,"`));
			t.push(`${he} wheedles, trying to come up with something to say.`);
			t.push(Spoken(eventSlave, `"And you have a, very, er, pretty ${vaginal ? "vagina" : "anus"}?"`));
			lewd = true;
		}
		App.Events.addParagraph(node, t);
		t = [];

		t.push(subSlave.slaveName);
		if (lewd) {
			t.push(`blushes at the lewd`);
		} else {
			t.push(`smiles at the`);
		}
		t.push(`flattery, but after a moment's hesitation ${he2} maintains ${his2} reluctance.`);
		if (eventSlave.rules.release.masturbation === 1) {
			t.push(Spoken(subSlave, `"Why don't you just jerk off,"`));
			t.push(`${he2} asks dismissively.`);
			t.push(Spoken(subSlave, `"Seriously, you're allowed to."`));
		} else {
			t.push(Spoken(subSlave, `"Go find someone else,"`));
			t.push(`${he2} asks dismissively.`);
			if (vaginal) {
				t.push(Spoken(subSlave, `"There are plenty of other pussies around for you to play with."`));
			} else {
				t.push(Spoken(subSlave, `"I'm sure you can find some other ${girl2} who wouldn't mind late night anal."`));
			}
		}
		t.push(`${He2} turns away.`);
		App.Events.addParagraph(node, t);
		t = [];
		const holeSize = vaginal ? subSlave.vagina : subSlave.anus;

		t.push(`${eventSlave.slaveName} is almost in tears.`);
		if (eventSlave.rules.release.masturbation === 1) {
			t.push(Spoken(eventSlave, `"I have,"`));
			t.push(`${he} moans, blue balled.`);
			if (eventSlave.aphrodisiacs > 0 || eventSlave.inflationType === "aphrodisiac") {
				t.push(Spoken(eventSlave, `"It's these fucking aphrodisiacs. I can't help it. Please, please let me try cumming inside you. I won't be able to sleep."`));
			} else {
				t.push(Spoken(eventSlave, `"It's not the same. I need to stick my dick in something so bad. Please."`));
			}
		} else {
			t.push(Spoken(eventSlave, `"But I want you,"`));
			t.push(`${he} moans, blue balled.`);
			if (eventSlave.dick > 4) {
				if (holeSize > 2) {
					t.push(Spoken(eventSlave, `"I'm t-too big,"`));
					t.push(`${he} adds sadly, gesturing to ${his} massive erection.`);
					t.push(Spoken(eventSlave, `"Some of the other girls can't take me, and I have to be gentle. Please, let me use you. I need to fuck so bad."`));
				} else {
					t.push(Spoken(eventSlave, `"Your ${vaginal ? "beautiful cunt" : "sphincter"} will make me explode. I haven't gotten to fuck anything today and I need it so bad. Please."`));
				}
			} else if (eventSlave.dick > holeSize+1) {
				t.push(Spoken(eventSlave, `"I've been dreaming about your tight ${vaginal ? "cunt" : "ass"} all day. My dick is a perfect fit for it, it'll make me feel so good. I want to fuck it so bad. Please."`));
			} else {
				t.push(Spoken(eventSlave, `"I don't see what the problem is. I'm really horny. I want to f-fuck so bad. Please, just let me use you to get off. I need your hole."`));
			}
		}

		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result(`Give the poor slave what ${he}'s asking for`, giveAsked),
			new App.Events.Result("Effect a trade", effectTrade),
			new App.Events.Result("Assert your dominance", assertDominance),
			new App.Events.Result("Rescind the rule against rape", rescindRapeRule, "This option WILL rescind the universal rule against interslave rape."),
		]);

		function giveAsked() {
			const frag = document.createDocumentFragment();
			t = [];

			t.push(`You resolve to give the poor slave what ${he}'s asking for: ${subSlave.slaveName}${!vaginal ? "'s ass." : "."}`);
			t.push(`Your slaves might have the right to refuse each other, but they have to obey you. You clear your throat, getting both slaves' attention, and then fix your gaze on ${subSlave.slaveName}.`);
			if (canSee(subSlave)) {
				t.push(`You tilt your head ever so slightly`);
			} else {
				t.push(`You make a subtle, yet clearly sexual sound`);
			}
			t.push(`in ${eventSlave.slaveName}'s direction. That's all that's necessary.`);
			t.push(Spoken(subSlave, `"Yes, ${getWrittenTitle(subSlave)}!"`));
			t.push(`${say2}s ${subSlave.slaveName} obediently, and`);
			if (vaginal) {
				t.push(`gets right down at ${eventSlave.slaveName}'s feet, lying on ${his2} back, legs`);
				if (subSlave.belly >= 5000) {
					t.push(`spread to either side of ${his2}`);
					if (subSlave.bellyPreg >= 3000) {
						t.push(`${subBelly} pregnancy,`);
					} else {
						t.push(`${subBelly} rounded belly,`);
					}
				} else {
					t.push(`spread,`);
				}
				t.push(`compliantly offering up ${his2} pussy.`);
			} else {
				t.push(`turns ${his2} back to ${eventSlave.slaveName}, bends a little, cocks ${his2} hips, and spreads ${his2} buttocks, compliantly offering ${his2} asspussy.`);
			}
			t.push(`${He2}'s yours to do with as you please, and you've decided to give ${him2} to ${eventSlave.slaveName}, at least for right now.`);
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(Spoken(eventSlave, `"Thank you, ${getWrittenTitle(subSlave)},"`));
			t.push(`says ${eventSlave.slaveName} <span class="hotpink">devotedly.</span>`);
			if (!vaginal || subSlave.vaginaLube > 1) {
				t.push(`${He} lets a gob of ${his} saliva fall onto ${his} cockhead,`);
				if (!vaginal) {
					t.push(`out of politeness to ${subSlave.slaveName}'s asshole.`);
				} else if (subSlave.vaginaLube > 0) {
					t.push(`out of politeness, since ${he} knows ${subSlave.slaveName} might not be really wet for ${him}.`);
				} else {
					t.push(`since ${he} knows that ${subSlave.slaveName} has a chronically dry cunt.`);
				}
			}
			t.push(`Then ${he}`);
			if (vaginal) {
				t.push(`gets down between ${subSlave.slaveName}'s legs, guiding ${himself} inside the ${SlaveTitle(subSlave)}'s womanhood. ${subSlave.slaveName} kisses ${eventSlave.slaveName} on the lips,`);
				t.push(`wordlessly encouraging ${him}, and the randy ${SlaveTitle(eventSlave)} starts fucking ${him2} harder, moaning with satisfaction.`);
			} else {
				t.push(`turns to ${subSlave.slaveName}, shoving ${his} dick up the ${SlaveTitle(subSlave)}'s butt. ${subSlave.slaveName} gasps, wriggles ${himself2} into a more comfortable position, and then flexes ${his2} ass a little, letting the`);
				t.push(`${SlaveTitle(subSlave)} whose cock is inside ${his2} anus know that ${he} can go for it. ${eventSlave.slaveName} does, thrusting happily.`);
			}
			eventSlave.devotion += 5;
			if (vaginal) {
				seX(subSlave, "vaginal", eventSlave, "penetrative");
				if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) {
					knockMeUp(subSlave, 5, 0, eventSlave.ID);
				}
			} else {
				seX(subSlave, "anal", eventSlave, "penetrative");
				if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) {
					knockMeUp(subSlave, 5, 1, eventSlave.ID);
				}
			}
			App.Events.addParagraph(frag, t);
			return frag;
		}

		function effectTrade() {
			const frag = document.createDocumentFragment();
			t = [];

			t.push(`${subSlave.slaveName} has a perfectly healthy libido; there has to be something ${he2}'d like getting from ${eventSlave.slaveName} in turn. You clear your throat, getting the slaves' attention, and ask ${subSlave.slaveName} if there's anything ${he2}'d like ${eventSlave.slaveName} to do for ${him2} in return for sex. ${eventSlave.slaveName} is so desperate that ${he} makes a suggestion before ${subSlave.slaveName} can open ${his2} mouth. Everyone knows ${subSlave.slaveName}`);
			switch (subSlave.fetish) {
				case "submissive":
					t.push(`is a shameless submissive and loves to be fucked. ${eventSlave.slaveName} must know ${he}'s being had, at least a little. "${subSlave.slaveName}," ${he} purrs,`);
					t.push(Spoken(subSlave, `"I'll fuck you ${hasAnyLegs(subSlave) ? "until your toes curl" : "senseless"}."`));
					break;
				case "cumslut":
					t.push(`loves ${canTaste(subSlave) ? "the taste of" : "swallowing"} cum.`);
					t.push(Spoken(eventSlave, `"I promise to pull out and let you drink my cum, straight from my cock,"`));
					t.push(`${he} purrs.`);
					seX(subSlave, "oral", eventSlave, "penetrative");
					break;
				case "humiliation":
					t.push(`loves to be humiliated.`);
					t.push(Spoken(eventSlave, `"Let's go down to the dormitory, and I'll slide your ${vaginal ? "pussy" : "butthole"} down on top of my cock right there, in the middle of the doorway, so everyone has to step over you as you ride my dick."`));
					break;
				case "buttslut":
					t.push(`loves anal.`);
					if (canDoAnal(subSlave)) {
						t.push(`${eventSlave.slaveName}`);
						if (eventSlave.dick > 3) {
							t.push(`strokes ${himself} a couple of times, showing off ${his}`);
							if (eventSlave.dick > 5) {
								t.push(`monstrous penis.`);
							} else {
								t.push(`big dick.`);
							}
							t.push(Spoken(eventSlave, `"Come on, don't you want this thing up your ass?"`));
							t.push(`${he} asks.`);
						} else {
							t.push(`gestures to ${his} `);
							if (eventSlave.dick > 1) {
								t.push(`modest penis.`);
							} else {
								t.push(`pathetic penis.`);
							}
							t.push(Spoken(eventSlave, `"I know it's really small,"`));
							t.push(`${he} ${say}s.`);
							t.push(Spoken(eventSlave, `"But I'll use fingers, too. I'll make sure you get off."`));
						}
					} else {
						t.push(Spoken(eventSlave, `"I know you can't take it up your ass right now,"`));
						t.push(`${say}s ${eventSlave.slaveName},`);
						t.push(Spoken(eventSlave, `"but can't I rim you for a while first?"`));
						seX(subSlave, "oral", eventSlave, "penetrative");
					}
					break;
				case "boobs":
					if (subSlave.lactation) {
						t.push(`loves nothing more than to have ${his2} udders lovingly sucked dry. "I'll drain you," says ${eventSlave.slaveName}, sticking ${his} tongue out to make ${his} meaning lewdly clear. ${Spoken(eventSlave, `"I'll nurse from you until you come."`)}`);
					} else {
						t.push(`can't resist having ${his2} breasts pampered. ${Spoken(eventSlave, `"I'll give you a boob massage,"`)} ${say}s ${eventSlave.slaveName}, and puts up ${his} ${hasBothArms(eventSlave) ? "arms" : "arm"}, flexing ${his} fingers lewdly. "A really good one. I'll be thorough!"`);
					}
					break;
				case "pregnancy":
					t.push(`loves to be inseminated,`);
					if (subSlave.pregKnown === 1) {
						t.push(`even though ${he2}'s already pregnant. ${Spoken(eventSlave, `"Come on, you know you want my semen,"`)} ${say}s ${eventSlave.slaveName}, idly toying with the precum gathering at ${his} tip.`);
						if (vaginal) {
							t.push(Spoken(eventSlave, `"I'll do my best to shoot it all the way up into your womb. I might even make you pregnant twice, I'll cum in you so hard."`));
						} else {
							t.push(Spoken(eventSlave, `"I'll fill your ass up."`));
						}
						subSlave.lactationDuration = 2;
						subSlave.boobs -= subSlave.boobsMilk;
						subSlave.boobsMilk = 0;
					} else {
						t.push(`regardless of whether ${he2} can actually get pregnant`);
						if (vaginal) {
							t.push(`right this second.`);
						} else {
							t.push(`in ${his2} anus.`);
						}
						t.push(`${Spoken(eventSlave, `"Come on, you know you want my semen,"`)} ${say}s ${eventSlave.slaveName}, idly toying with the precum gathering at ${his} tip. "I'll fill you up."`);
					}
					break;
				case "dom":
					t.push(`prefers to be on top. ${Spoken(eventSlave, `"Of course you can fuck me too,"`)} ${eventSlave.slaveName} hurries to add.`);
					if (canDoVaginal(eventSlave)) {
						t.push(`${He} reaches down and spreads ${his}`);
						if (subSlave.labia > 0) {
							t.push(`ample`);
						}
						t.push(`labia, showing off ${his} pink channel.`);
					} else if (canDoAnal(eventSlave)) {
						t.push(`${He} spins, cocks ${his} hips, spreads ${his} asscheeks, and winks ${his} anus invitingly.`);
					} else {
						t.push(`${He} gets right down on ${his} knees and uses ${his} hands to spread ${his} lips as wide as they'll go. "'ou can 'ace 'uck me," ${he} intones with difficulty.`);
					}
					t.push(Spoken(eventSlave, `"You can go first! ${canAchieveErection(subSlave) ? "Get your cock out" : "Grab a strap-on"}, let's trade holes!"`));
					break;
				case "sadist":
					t.push(`is a sexual sadist. ${eventSlave.slaveName} swallows nervously, visibly weighing whether ${he} wants to offer what ${he}'ll need to offer, and then takes the plunge. ${Spoken(eventSlave, `"You can hurt me,"`)} ${he} says in a small voice.`);
					break;
				case "masochist":
					t.push(`is a slut for pain. "I'll hurt you," says ${eventSlave.slaveName} hesitantly. Seeing that this is well received, ${he} plunges on. ${Spoken(eventSlave, `"I'll rape you. Come on, I'm going to pound you so hard and twist your nipples until you don't know what hurts worst, your tits or your ${vaginal ? "cunt" : "butthole"}."`)}`);
					break;
				default:
					t.push(`is pretty vanilla in bed. "Come on," says ${eventSlave.slaveName} reassuringly. ${Spoken(eventSlave, `"You'll come more than I do, I promise. First I'll ${subSlave.dick > 0 ? "blow you" : "eat you out"}. Then we'll make love.`)}`);
					if (eventSlave.dick > 2) {
						t.push(Spoken(eventSlave, `This dick will make you shudder."`));
					} else {
						t.push(Spoken(eventSlave, `I'm kind of small down there, but I'll use my hands too."`));
					}
					seX(subSlave, "oral", eventSlave, "oral");
			}
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`${subSlave.slaveName} is a seasoned sex slave but that doesn't stop ${him2} from blushing a little at such a blunt suggestion. "Okay," ${he2} says, biting ${his2}`);
			if (eventSlave.lips > 40) {
				t.push(`absurdly generous`);
			} else if (eventSlave.lips > 10) {
				t.push(`full`);
			} else {
				t.push(`thin`);
			}
			t.push(`lower lip cutely.`);
			t.push(Spoken(subSlave, `"I was actually going to say yes anyway, but it's really nice to have someone like you ask me for it like that. I'm sorry I made you beg."`));
			t.push(Spoken(eventSlave, `"Don't care!"`));
			t.push(`says ${eventSlave.slaveName} exultantly, and grabs ${his} conquest, planting a lusty kiss on ${subSlave.slaveName}'s giggling mouth and`);
			if (vaginal) {
				t.push(`rubbing ${his} erection against ${subSlave.slaveName}'s`);
				if (subSlave.labia > 0) {
					t.push(`puffy`);
				}
				t.push(`pussylips.`);
			} else {
				t.push(`reaching around ${subSlave.slaveName} to start teasing ${his2} asshole.`);
			}
			t.push(Spoken(eventSlave, `"Don't care, as long as I get to fuck your ${vaginal ? "hot cunt" : "beautiful ass"}!"`));
			t.push(`Your work here is done, and once ${he}'s done blowing ${his} load inside ${subSlave.slaveName}${!vaginal ? "'s anus" : ""},`);
			t.push(`${eventSlave.slaveName} should remember to be <span class="mediumaquamarine">grateful</span> to you for the reminder on how to seduce`);
			switch (subSlave.fetish) {
				case "submissive":
					t.push(`coquettish subs.`);
					break;
				case "cumslut":
					t.push(`tired cumsluts.`);
					break;
				case "humiliation":
					t.push(`reluctant exhibitionists.`);
					break;
				case "buttslut":
					t.push(`tired anal whores.`);
					break;
				case "boobs":
					t.push(`coquettish mammary sluts.`);
					break;
				case "pregnancy":
					t.push(`reluctant pregsluts.`);
					break;
				case "dom":
					t.push(`tired doms.`);
					break;
				case "sadist":
					t.push(`tired sadists.`);
					break;
				case "masochist":
					t.push(`silly masochists.`);
					break;
				default:
					t.push(`vanilla`);
					t.push(`${girl2}s.`);
			}
			eventSlave.trust += 5;
			if (vaginal) {
				seX(subSlave, "vaginal", eventSlave, "penetrative");
				if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) {
					knockMeUp(subSlave, 5, 0, eventSlave.ID);
				}
			} else {
				seX(subSlave, "anal", eventSlave, "penetrative");
				if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) {
					knockMeUp(subSlave, 5, 1, eventSlave.ID);
				}
			}
			App.Events.addParagraph(frag, t);
			return frag;
		}

		function assertDominance() {
			const frag = document.createDocumentFragment();
			t = [];

			const domBelly = bellyAdjective(eventSlave);
			t.push(`You brush past ${eventSlave.slaveName} without a word. ${Spoken(eventSlave, `"Um, ${getWrittenTitle(eventSlave)},"`)} ${he} starts to greet you, and then loses track of the greeting as ${he} sees what you're doing. You stride forward, grab ${subSlave.slaveName} by ${his2}`);
			if (subSlave.hips > 2) {
				t.push(`door-jamming hips`);
			} else if (subSlave.belly >= 100000) {
				t.push(`expansive middle`);
			} else if (subSlave.butt > 12) {
				t.push(`gloriously immense ass`);
			} else if (subSlave.hips > 1) {
				t.push(`gloriously broad hips`);
			} else if (subSlave.butt > 8) {
				t.push(`monstrous ass`);
			} else if (subSlave.hips > 0) {
				t.push(`womanly hips`);
			} else if (subSlave.bellyPreg >= 5000) {
				t.push(`gravid middle`);
			} else if (subSlave.belly >= 5000) {
				t.push(`rounded middle`);
			} else if (subSlave.weight > 95) {
				t.push(`fat middle`);
			} else if (subSlave.butt > 5) {
				t.push(`huge ass`);
			} else if (subSlave.weight > 30) {
				t.push(`chubby middle`);
			} else if (subSlave.weight > 10) {
				t.push(`plush middle`);
			} else {
				t.push(`hips`);
			}
			t.push(`and set ${him2} on the nearest convenient waist-high object. Then you`);
			if (vaginal) {
				t.push(`pound ${his2} pussy.`);
			} else {
				t.push(`fuck ${his2} butt.`);
			}
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`Poor ${eventSlave.slaveName} can do nothing but stand there and watch. You haven't dismissed ${him}, so ${he}'s forced to helplessly spectate as you do exactly what ${he} so desperately wants to do. You can't see ${his} face, but you don't have to. ${subSlave.slaveName}`);
			if (vaginal) {
				if (subSlave.vagina === 1) {
					t.push(`has a tight pussy, and`);
				} else if (subSlave.vagina === 2) {
					t.push(`isn't tight, but`);
				} else {
					t.push(`has a loose pussy, but`);
				}
			} else {
				if (subSlave.anus === 1) {
					t.push(`has a tight little ass, and`);
				} else if (subSlave.anus === 2) {
					t.push(`is no anal virgin, but`);
				} else {
					t.push(`has a very experienced asshole, but`);
				}
			}
			if (V.PC.dick) {
				t.push(`you have a big dick`);
			} else {
				t.push(`you use a formidable strap-on`);
			}
			t.push(`and are ramming it into ${subSlave.slaveName}'s fuckhole industriously. ${He2} moans and writhes, being a good sex slave with your`);
			if (V.PC.dick) {
				t.push(`hard shaft`);
			} else {
				t.push(`instrument`);
			}
			t.push(`sliding in and out of ${him2}, in and out of ${him2}. You plunder ${him2} without restraint, bending to plant dominant kisses on ${him2} panting mouth while you fuck ${him2}, and then straightening up again to grab and maul ${his2}`);
			if (subSlave.boobsImplant / subSlave.boobs >= 0.60) {
				t.push(`fake tits`);
			} else {
				if (subSlave.boobShape !== "normal") {
					t.push(`${subSlave.boobShape}`);
				}
				t.push(`boobs`);
			}
			t.push(`with both hands.`);
			if (V.PC.dick) {
				t.push(`When you're through, you thrust deep inside, blasting ${his2}`);
				if (vaginal) {
					t.push(`cervix`);
				} else {
					t.push(`bowels`);
				}
				t.push(`with a hot torrent of your`);
				if (V.PC.balls >= 30) {
					t.push(`semen until ${his2} belly begins to visibly swell from your load.`);
				} else if (V.PC.balls >= 14) {
					t.push(`semen, thoroughly filling ${him2} with your massive load.`);
				} else {
					t.push(`semen.`);
				}
			} else {
				t.push(`Finally you orgasm, thrusting yourself hard against your strap-on harness, driving it as far inside your fucktoy as it'll go and holding it there as you shudder with climax.`);
			}
			t.push(`Then you pull out and shove the <span class="hotpink">dominated,</span> sweaty, fucked-out${V.PC.dick ? ", cum-dripping" : ""} ${subSlave.slaveName} towards the showers, giving ${him2} a swat on the butt when ${he2}'s slow to get moving. Then you turn to ${eventSlave.slaveName}.`);
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`${He}'s painfully aroused, of course. ${He} just got to watch a`);
			if (V.PC.title) {
				t.push(`handsome guy fuck a`);
			} else {
				t.push(`hot ${girlP} fuck another`);
			}
			if (!vaginal) {
				t.push(`hot ${girl2}'s ass,`);
			} else {
				t.push(`hot ${girl2},`);
			}
			t.push(`right in front of ${him}. And this while already laboring under a severe case of blue balls. ${Spoken(eventSlave, `"${getWrittenTitle(eventSlave)},"`)} ${he} ${say}s unspecifically. ${He} knows you did that in front of ${him} for ${his} benefit, at least partly, and ${he} wouldn't know what to make of it or how to respond, even if ${he} were in possession of ${his} faculties. Which ${he} isn't. All ${his} blood is very obviously located in`);
			if (eventSlave.vagina > -1) {
				t.push(`${his} lovely futanari hard-on.`);
			} else {
				t.push(`${his} desperately erect penis.`);
			}
			t.push(`You point to where ${subSlave.slaveName} just got fucked, and announce that ${eventSlave.slaveName} can get off if ${he} wants, but not by fucking ${subSlave.slaveName}. ${He} gets to come with`);
			if (V.PC.dick) {
				t.push(`your cock`);
			} else {
				t.push(`a strap-on`);
			}
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				t.push(`fucking ${him}.`);
			} else {
				t.push(`up ${his} ass.`);
			}
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`${eventSlave.slaveName} is familiar with your libido, but even so, ${he}'s impressed. ${He}'s also in dire need of relief, and at this point, ${he}'s so horny that the prospect of any sex is attractive, even if it isn't the kind of sex ${he} was originally planning. So ${he} hops up eagerly enough and opens ${hasBothLegs(eventSlave) ? `${his} legs` : `${himself}`} for you, ${his} erect member`);
			if (eventSlave.belly >= 10000) {
				t.push(`uncomfortably trapped by ${his}`);
				if (eventSlave.bellyPreg >= 8000) {
					t.push(`${domBelly} pregnancy`);
				} else {
					t.push(`${domBelly} belly`);
				}
			} else {
				t.push(`sticking out forgotten`);
			}
			t.push(`as ${he}`);
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				t.push(`spreads ${his} pussy.`);
			} else {
				t.push(`offers you ${his} asshole.`);
			}
			t.push(`You fuck it, even more roughly than you fucked ${subSlave.slaveName}'s`);
			if (vaginal) {
				t.push(`cunt,`);
			} else {
				t.push(`anus,`);
			}
			t.push(`and since you've just climaxed recently, it's a while before you orgasm again. ${eventSlave.slaveName} cums long before you, spattering ${himself} messily, moaning ${Spoken(eventSlave, `"Oh, ${getWrittenTitle(eventSlave)}, yes, oh fuck yes, my ${canDoVaginal(eventSlave) ? "pussy, my fucking pussy" : "ass, my fucking asshole"}"`)}`);
			t.push(`so <span class="hotpink">whorishly</span> that there's no indication ${he} was ever even considering fucking anyone.`);
			eventSlave.devotion += 3;
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				seX(eventSlave, "vaginal", V.PC, "penetrative");
				if (canImpreg(eventSlave, V.PC)) {
					knockMeUp(eventSlave, 5, 0, -1);
				}
			} else {
				seX(eventSlave, "anal", V.PC, "penetrative");
				if (canImpreg(eventSlave, V.PC)) {
					knockMeUp(eventSlave, 5, 1, -1);
				}
			}
			if (vaginal) {
				subSlave.devotion += 3;
				seX(subSlave, "vaginal", V.PC, "penetrative");
				if (canImpreg(subSlave, V.PC)) {
					knockMeUp(subSlave, 15, 0, -1);
				}
			} else {
				subSlave.devotion += 3;
				seX(subSlave, "vaginal", V.PC, "penetrative");
				if (canImpreg(subSlave, V.PC)) {
					knockMeUp(subSlave, 15, 1, -1);
				}
			}

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

		function rescindRapeRule() {
			const frag = document.createDocumentFragment();
			t = [];

			V.universalRulesConsent = 0;
			const {HisA, heA} = getPronouns(assistant.pronouns().main).appendSuffix("A");

			t.push(`You clear your throat for the slaves' attention and verbally order ${V.assistant.name} to rescind the penthouse rule against interslave rape. ${HisA} avatar pops up nearby and confirms the rules change.`);
			if (V.assistant.personality > 0) {
				t.push(`"Done," ${heA} says. "And I approve. Poor ${girl}s like ${eventSlave.slaveName} should be able to take what they need."`);
			} else {
				t.push(`"Done," ${heA} says.`);
			}
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`You give no explicit command to the pair of slaves in front of you, but they understand you perfectly. ${subSlave.slaveName} pales;`);
			if (subSlave.fetishKnown && subSlave.fetish === "submissive") {
				t.push(`${he2} likes getting fucked, but having someone ordered to rape ${him2} is a bit much.`);
			} else if (subSlave.fetishKnown && subSlave.fetish === "masochist") {
				t.push(`${he2} likes being hurt, but having the flirty interchange converted instantly into a situation in which ${he2} has no control at all kills ${his2} mood.`);
			} else {
				t.push(`${he2} wasn't seriously adverse to having sex, but being laid open to rape isn't ${his2} idea of a good time.`);
			}
			t.push(`${eventSlave.slaveName}, meanwhile, looks`);
			if (subSlave.fetishKnown && subSlave.fetish === "dom") {
				t.push(`rather pleased. ${He} likes being on top enough that ${he}'s willing to use force if necessary.`);
			} else if (subSlave.fetishKnown && subSlave.fetish === "sadist") {
				t.push(`positively predatory. The sadistic bitch actually prefers it this way.`);
			} else {
				t.push(`rather conflicted. ${He}'s obviously relieved ${he}'ll be getting relief, but obviously has some mixed feelings about using force to get what ${he} wants.`);
			}
			App.Events.addParagraph(frag, t);
			t = [];

			if (eventSlave.fetishKnown && (eventSlave.fetish === "dom" || eventSlave.fetish === "sadist")) {
				t.push(`${subSlave.slaveName} tries to get down on`);
				if (vaginal) {
					t.push(`the floor and offer ${his2} pussy`);
				} else {
					t.push(`${his2} knees and offer ${his2} asspussy`);
				}
				t.push(`without resistance, but ${eventSlave.slaveName} has other ideas, and shoves the poor slave down hard. ${subSlave.slaveName}'s`);
				if (vaginal) {
					t.push(`butt hits the floor with a smack`);
				} else {
					t.push(`knees hit the floor painfully`);
				}
				t.push(`and ${he2} moans unhappily as ${eventSlave.slaveName} penetrates ${him2}.`);
			} else {
				t.push(`${eventSlave.slaveName} clears ${his} throat uncomfortably, not really sure what to do, and obviously reluctant to grab ${subSlave.slaveName} and rape ${him}. ${subSlave.slaveName} resolves ${his} dilemma for ${him}, and`);
				if (vaginal) {
					t.push(`gets down on the ground, spreading ${his2} legs`);
					if (subSlave.belly >= 5000) {
						t.push(`to either side of ${his2} ${subBelly}`);
						if (subSlave.bellyPreg >= 3000) {
							t.push("pregnancy");
						} else {
							t.push("rounded belly");
						}
					}
					t.push(`and offering ${his2} pussy`);
				} else {
					t.push(`gets down on ${his2} knees, arching ${his2} back and presenting ${his2} asspussy`);
				}
				t.push(`without resistance. Relieved, ${eventSlave.slaveName} gets`);
				if (vaginal) {
					t.push(`on top of ${him2}`);
				} else {
					t.push(`behind ${him2}`);
				}
				t.push(`and starts to fuck.`);
			}
			t.push(Spoken(eventSlave, `"Thanks, ${getWrittenTitle(eventSlave)},"`));
			t.push(`pants ${eventSlave.slaveName} as ${he} humps away.`);
			t.push(Spoken(eventSlave, `"I'm <span class="mediumaquamarine">looking forward</span> to being able to do this whenever I want."`));
			t.push(`${subSlave.slaveName} gasps, from`);
			if (vaginal) {
				t.push(`down under ${eventSlave.slaveName}.`);
			} else {
				t.push(`where ${eventSlave.slaveName} has ${his2} face ground against the floor.`);
			}
			t.push(`Apparently, ${he2} hadn't realized that this wasn't a one-time thing, and is <span class="gold">none too pleased</span> by having to give ${eventSlave.slaveName} ${his2}`);
			if (vaginal) {
				t.push(`pussy`);
			} else {
				t.push(`ass`);
			}
			t.push(`whenever ${he} wants it.`);
			eventSlave.trust += 3;
			if (vaginal) {
				subSlave.trust -= 3;
				seX(subSlave, "vaginal", eventSlave, "penetrative");
				if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) {
					knockMeUp(subSlave, 5, 0, eventSlave.ID);
				}
			} else {
				subSlave.trust -= 3;
				seX(subSlave, "vaginal", eventSlave, "penetrative");
				if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) {
					knockMeUp(subSlave, 5, 1, eventSlave.ID);
				}
			}

			App.Events.addParagraph(frag, t);

			return frag;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // event slave /domslave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canWalk,
				canTalk,
				s => s.assignment !== Job.QUARTER,
				canDoAnal,
				canHear,
				s => s.anus === 0,
				s => s.devotion >= -50,
				s => s.trust >= -50,
				s => s.sexualFlaw === "repressed",
				s => s.fetish !== "buttslut",
			],
			[ // and subslave
				s => s.fetish !== "mindbroken",
				canWalk,
				canTalk,
				isSlaveAvailable,
				s => s.devotion > 50,
				s => (canDoAnal(s) && s.anus !== 0),
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, himself, girl, Girl
		} = getPronouns(eventSlave);
		const {
			he2, his2, him2, girl2, himself2
		} = getPronouns(subSlave).appendSuffix("2");
		const pDick = V.PC.dick !== 0;

		App.Events.drawEventArt(node, [eventSlave, subSlave]);

		let t = [];
		t.push(contextualIntro(V.PC, subSlave, true));
		t.push(`has been a very good ${girl2} this week, so when ${his2}`);
		if (subSlave.anus > 2) {
			t.push(`loose asshole`);
		} else if (subSlave.anus > 1) {
			t.push(`big butthole`);
		} else {
			t.push(`tight anus`);
		}
		t.push(`catches your eye near the start of a long inspection, you decide to be kind to ${him2} as you conduct the rest of your inspection with ${pDick ? "your cock" : "a strap-on"}.`);
		t.push(contextualIntro(V.PC, eventSlave, true));
		t.push(`is next on the inspection schedule, and when ${he} comes into your office, it's to the`);
		if (canSee(eventSlave)) {
			t.push(`sight of`);
			t.push(App.UI.DOM.combineNodes(contextualIntro(eventSlave, subSlave), "'s back and rear"));
		} else {
			t.push(`sound of ${subSlave.slaveName}`);
		}
		t.push(`as ${he2} lazily rides ${his2} ${getWrittenTitle(subSlave)}. You've been sitting on the couch, making out with the compliant ${girl2} as ${he2} rides you, for a good half hour. Poor ${subSlave.slaveName} was pent up when you started, and ${he2}'s climaxed already; ${he2}'s feeling very devoted and relaxed at the moment, and is doing ${his2} best to get you off, too. When you finally come, ${he2} moans ${his2} thanks into your mouth nonverbally, breaks your lip lock, gives you a peck on the nose, and climbs off you. As ${he2} does, ${he2} lifts ${his2} ass off your ${pDick ? "cock" : "strap-on"}, ${his2}`);
		if (subSlave.anus > 2) {
			t.push(`gaping anus dripping ${pDick ? "cum" : "lube"} all over ${his2} ${subSlave.skin} legs.`);
		} else if (subSlave.anus > 1) {
			t.push(`well-fucked backdoor taking a few seconds to recover from its gape, dripping a little ${pDick ? "cum" : "lube"} down ${his2} ${subSlave.skin} legs.`);
		} else {
			t.push(`still-tight backdoor sliding quickly off you, visibly slick with ${pDick ? `cum` : `lube`}.`);
		}
		t.push(`You didn't fuck ${him2} too hard, but`);
		if (pDick) {
			t.push(`you're`);
		} else {
			t.push(`your strap-ons are`);
		}
		t.push(`not small, and ${he2} walks a little gingerly as ${he2} heads for the bathroom. ${eventSlave.slaveName}, standing there nude for inspection, stares openmouthed at ${subSlave.slaveName} as ${he2} goes. ${He}'s obviously unfamiliar with anal sex.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${eventSlave.slaveName} coughs and looks doubtful, like ${he}'s mulling over a question. You let the poor repressed ${girl} chew on it for a while, and eventually ${he} bursts out,`);
		t.push(Spoken(eventSlave, `"${getWrittenTitle(eventSlave)}, what were you doing with ${subSlave.slaveName}?"`));
		t.push(`The absurdity gives you a moment's pause, but you answer gamely that you were fucking ${his2} ass. ${eventSlave.slaveName} blushes furiously but plunges on,`);
		t.push(Spoken(eventSlave, `"I'm s-sorry, ${getWrittenTitle(eventSlave)}, but I still don't understand. I thought sex happened in a v-vagina. I d-didn't think b-butts were — were for, you know, that."`));
		seX(subSlave, "anal", V.PC, "penetrative");
		if (canImpreg(subSlave, V.PC)) {
			knockMeUp(subSlave, 5, 1, -1);
		}

		App.Events.addResponses(node, [
			new App.Events.Result(`${Girl}s' butts are for loving`, loving, "This option will take anal virginity"),
			new App.Events.Result(`${Girl}s' butts are for pounding`, pounding, "This option will take anal virginity"),
			new App.Events.Result(`${His} butt is being saved for later`, later),
			new App.Events.Result(`${His} butt is being sold today`, sold, "This option will take anal virginity"),
		]);

		function loving() {
			const frag = document.createDocumentFragment();
			t = [];

			t.push(`You tell ${him} that ${his} butt is for lovemaking, just like ${subSlave.slaveName}'s. ${He} looks horrified. You clear ${his} schedule and sit ${him} down on the couch (${he} carefully avoids the spot where you and ${subSlave.slaveName} embraced) before continuing with your day. ${subSlave.slaveName} was your first inspection of the day, so ${eventSlave.slaveName} has nothing to do for hours and hours other than sit there and`);
			if (canSee(eventSlave)) {
				t.push(`watch you.`);
			} else {
				t.push(`listen to your actions.`);
			}
			t.push(`${He}'s a healthy ${girl}, ${(eventSlave.preg > eventSlave.pregData.normalBirth/2) ? `ripe with pregnancy,` : ""} and ${his} food is laced with mild aphrodisiacs. The boredom and ${his} building arousal begin to torture ${him}, until finally ${he} grinds out a hesitant`);
			t.push(Spoken(eventSlave, `"P-please fuck me, ${getWrittenTitle(eventSlave)}."`));
			t.push(`You glance at ${him} and ${he} quickly looks down, blushing. You go back to your work, and an hour later ${he} manages a more confident`);
			t.push(Spoken(eventSlave, `"Please fuck me, ${getWrittenTitle(eventSlave)}."`));
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`Judging ${him} ready, you tell ${him} to ${hasAnyLegs(eventSlave) ? "kneel" : "get"} on the couch. ${He} does, trembling with fear and arousal;`);
			if (eventSlave.chastityPenis === 1) {
				t.push(`${his} caged cock does not show it, but ${he}'s flushed and willing.`);
			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				t.push(`as ${he}`);
				if (eventSlave.belly >= 100000) {
					t.push(`struggles to pull ${his} gravid body`);
				} else if (eventSlave.belly >= 10000) {
					t.push(`hefts ${his} gravid body`);
				} else if (eventSlave.belly >= 5000) {
					t.push(`cradles ${his} belly and carefully climbs`);
				} else {
					t.push(`clambers`);
				}
				t.push(`up onto the couch, ${he} dribbles precum across the leather.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${he} has a painful hard-on.`);
			} else if (eventSlave.clit > 0) {
				t.push(`${his} big clit is visibly erect.`);
			} else if (eventSlave.chastityVagina === 1) {
				t.push(`${his} pussy may be locked in chastity, but it doesn't hide the moisture forming under it.`);
			} else if (eventSlave.vagina === -1) {
				t.push(`and is unconsciously presenting ${his} ass.`);
			} else {
				t.push(`${his} pussylips are flushed and moist.`);
			}
			t.push(`You tell ${him} to relax, and push a single lubed finger into ${his} anus. ${He} gasps, but does not resist, burrowing ${his} face down into the couch and doing ${his} best to calm ${himself}. After a few minutes, you withdraw your finger and press the slick tip of your ${pDick ? "cock" : "strap-on"}`);
			t.push(`against ${his} virgin rosebud. ${He} starts in spite of ${himself}, but breathes out obediently, relaxing ${his} butthole enough to let you in. ${He} squeals at the sudden invasion, but you hold ${him} and let ${him} get used to you gradually. After a few minutes you encourage ${him} to`);
			if (eventSlave.chastityPenis === 1) {
				t.push(`stimulate ${his} own nipples,`);
			} else if ((eventSlave.dick > 0) && !canAchieveErection(eventSlave)) {
				t.push(`play with ${his} soft cock,`);
			} else if (eventSlave.dick > 0) {
				t.push(`jack off,`);
			} else if (eventSlave.clit > 0) {
				t.push(`rub ${his} clit,`);
			} else if (eventSlave.vagina === -1) {
				t.push(`frantically rub ${his} perineum,`);
			} else if (eventSlave.chastityVagina === 1) {
				t.push(`play with ${his} ${eventSlave.boobs > 300 ? "boobs" : "nipples"},`);
			} else {
				t.push(`play with ${his} pussy,`);
			}
			t.push(`and ${he} almost sobs with relief. After ${he}'s almost forgotten the phallus in ${his} ass, you begin to fuck ${him} gradually. ${He} climaxes before too long, ${his} tight sphincter`);
			if (pDick) {
				t.push(`hugging your shaft wonderfully. `);
			} else {
				t.push(`visibly compressing the strap-on. `);
			}
			t.push(`Confused, ${he} mumbles into the couch,`);
			t.push(Spoken(eventSlave, `"${getWrittenTitle(eventSlave)}, I c-came. I came to your thing in my butt. A-am I — does that make me a slut?"`));
			t.push(`You assure ${him} that it does. Surprisingly, ${he} does not break down, but exhales slowly and squares ${his} shoulders, visibly resolving to be a slut if ${he} has to. ${He} even takes a bit longer than strictly necessary giving ${himself} ${his} first post-sex enema.`);
			eventSlave.devotion += 5;
			eventSlave.anus += 1;
			seX(eventSlave, "anal", V.PC, "penetrative");
			if (canImpreg(eventSlave, V.PC)) {
				knockMeUp(eventSlave, 5, 1, -1);
			}
			App.Events.addParagraph(frag, t);
			return frag;
		}

		function pounding() {
			t = [];
			t.push(`You tell ${him} that ${his} butt is your property, just like ${subSlave.slaveName}'s. ${He} looks terrified. You continue, telling ${him} to bring your property over to you. ${He} stumbles over, begging,`);
			t.push(Spoken(eventSlave, `"P-please, fuck me ${getWrittenTitle(eventSlave)}, please don't do stuff to my butt. It's going t-to h-hurt.`));
			if (eventSlave.preg > eventSlave.pregData.normalBirth/2) {
				t.push(`And I-I'm r-really pregnant.`);
			} else if (eventSlave.pregKnown === 1) {
				t.push(`And I-I'm p-pregnant.`);
			}
			t.push(t.pop() + `"`);
			t.push(`You push ${him} down across your desk, giving ${him} a swat across the rump to warn ${him} to shut up. ${He} does, though ${he} makes a little squealing noise when you begin to grope ${his} ass, working your way in towards ${his} virgin backdoor. When ${he} feels`);
			if (pDick) {
				t.push(`your lubed cockhead`);
			} else {
				t.push(`a lubed strap-on`);
			}
			t.push(`sliding between ${his} buttocks and then pressing against ${his} anus, ${he} bursts out,`);
			t.push(Spoken(eventSlave, `"Please no, ${getWrittenTitle(eventSlave)}! Please not my — AAAH! OW!"`));
			t.push(`and bursts into tears. You give ${him} a few seconds to get used to your girth and then begin to fuck ${his} delicious little virgin behind. Despite the pain, the`);
			if (eventSlave.vagina !== -1) {
				t.push(`stimulation gets ${him} wet,`);
			} else if (eventSlave.prostate !== 0) {
				t.push(`prostate stimulation gets ${him} hard,`);
			} else {
				t.push(`stimulation brings a little fluid out of ${him},`);
			}
			t.push(`and you tell ${him} that ${he} clearly wants it. ${He} doesn't know what to say in response, so ${he} just cries harder as`);
			if (canDoVaginal(eventSlave)) {
				t.push(`you reach around to cup ${his} soaking cunt possessively.`);
			} else if (eventSlave.prostate === 0 && eventSlave.vagina === -1 && eventSlave.dick === 0) {
				t.push(`${he} starts to quiver despite ${his} displeasure.`);
			} else {
				t.push(`${he} starts to leak despite ${his} displeasure.`);
			}
			t.push(`${His} butthole is so wonderfully tight that you orgasm quickly, throwing ${his} unresisting butt over onto the couch for another round. ${He}'s no longer repressed, but ${he} now hates having ${his} newly loosened butt fucked.`);
			eventSlave.behavioralFlaw = "none";
			eventSlave.sexualFlaw = "hates anal";
			eventSlave.trust -= 5;
			eventSlave.anus += 1;
			seX(eventSlave, "anal", V.PC, "penetrative");
			if (canImpreg(eventSlave, V.PC)) {
				knockMeUp(eventSlave, 5, 1, -1);
			}
			return t;
		}

		function later() {
			const {say} = getEnunciation(eventSlave);
			t = [];

			t.push(`You tell ${him} to sit down on the couch and listen. ${He} obeys, carefully avoiding the spot where you and ${subSlave.slaveName} embraced. You explain that ${subSlave.slaveName} is an experienced anal slave, and that you enjoy having sex with ${him2} there. You point out how much ${subSlave.slaveName} enjoyed ${himself2} (${eventSlave.slaveName} studiously avoids`);
			if (canSee(eventSlave)) {
				t.push(`looking at`);
			} else {
				t.push(`facing`);
			}
			t.push(`the moist spot on the couch that evidences this), and tell ${him} that anal sex can be very enjoyable. ${He}`);
			if (canSee(eventSlave)) {
				t.push(`looks at`);
			} else {
				t.push(`listens to`);
			}
			t.push(`you uncomprehendingly,`);
			if (eventSlave.belly >= 5000) {
				t.push(`${his} hand resting on ${his} rounded middle,`);
			}
			t.push(`so you try a different tack. You tell ${him} that ${his} anal virginity has a price: it makes ${him} a more valuable slave. ${He}'ll probably be fucked back there someday soon, but it's not something you plan to do lightly. And in any case, ${he}'ll be trained to enjoy the experience when it happens. Hesitantly, ${he} ${say}s`);
			t.push(Spoken(eventSlave, `"I understand, ${getWrittenTitle(eventSlave)}. I <span class="trust inc">trust you.</span>"`));
			t.push(`${He} seems more confident for the rest of the inspection, and when it's done, ${he} leaves with less worry on ${his} face.`);
			eventSlave.trust += 5;
			return t;
		}

		function sold() {
			t = [];
			t.push(`You tell ${him} that ${his} butt is your property, just like ${subSlave.slaveName}'s. ${He} looks terrified, but this is nothing to ${his} reaction when another slave arrives to bring ${him} out for an auction of ${his} virgin anus. ${He}'s dragged out, whining,`);
			t.push(Spoken(eventSlave, `"P-please, ${getWrittenTitle(eventSlave)}, please don't sell my butthole! I'll do anything! Please!"`));
			t.push(`${His} pleas are unavailing.`);
			t.push(`${V.assistant.name} conducts a brisk streetside auction of the weeping slave${girl}, using compliance systems to force ${him} to spread ${his} quivering buttocks for the crowd. The winning bidder uses a public stall to do the deed; its thin walls are nowhere near enough to disguise ${his} whining and sobbing as he takes ${his} anal virginity. ${He} now hates anal.`);
			cashX(500, "event", eventSlave);
			eventSlave.sexualFlaw = "hates anal";
			eventSlave.trust -= 5;
			eventSlave.anus += 1;
			seX(eventSlave, "anal", "public", "penetrative");
			if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
				knockMeUp(eventSlave, 5, 1, -2);
			}
			return t;
		}
	}
};

repo_name: Fekenol/fc

license: mit


code:
App.Events.RETSSadisticDescription = class RETSSadisticDescription extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.universalRulesConsent === 0,
		];
	}

	actorPrerequisites() {
		return [
			[ // event slave /domslave
				s => s.fetish !== "mindbroken",
				s => s.anus > 0,
				canTalk,
				canWalk,
				canHear,
				hasAnyArms,
				s => s.devotion > 50,
				s => s.fetish === "sadist" || s.fetish === "dom" || s.energy > 95,
			],
			[ // and subslave
				s => s.fetish !== "mindbroken",
				canWalk,
				canTalk,
				canSee,
				canHear,
				isSlaveAvailable,
				s => s.devotion <= 20,
				s => (s.fetish !== "buttslut" || s.fetishKnown === 0),
				s => s.anus === 0,
				canDoAnal,
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, himself
		} = getPronouns(eventSlave);
		const arms = hasBothArms(eventSlave) ? "arms" : "arm";
		const {
			He2, he2, his2, him2, hers2, girl2, himself2
		} = getPronouns(subSlave).appendSuffix("2");
		const {
			HeP, heP, hisP
		} = getPronouns(V.PC).appendSuffix("P");

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

		seX(subSlave, "anal", eventSlave, "penetrative");

		let t = [];

		t.push(`You look in on your slaves as a group of them heads for bed.`);
		t.push(App.UI.DOM.slaveDescriptionDialog(subSlave));
		t.push(`finds`);
		t.push(contextualIntro(subSlave, eventSlave, true));
		t.push(`blocking the way to ${hers2}. Poor ${subSlave.slaveName} cringes at ${eventSlave.slaveName}'s predatory expression, but the horny slave doesn't pounce at once. Instead, ${he} starts to walk around ${subSlave.slaveName}, whose ${subSlave.skin} body is nude for bed, groping and prodding ${him2} as ${subSlave.slaveName} shivers with fear. Finally ${eventSlave.slaveName} sidles up behind ${subSlave.slaveName},`);
		if (eventSlave.belly >= 5000) {
			t.push(`until ${his} bulging belly pushes into ${his2} back, before`);
		}
		t.push(`snaking ${his} ${arms} around ${subSlave.slaveName}'s`);
		if (subSlave.bellyPreg >= 10000) {
			t.push(`pregnant`);
		} else if (subSlave.weight > 95) {
			t.push(`fat`);
		} else if (subSlave.bellyPreg >= 1500) {
			t.push(`pregnant`);
		} else if (subSlave.weight > 10) {
			t.push(`chubby`);
		} else if (subSlave.muscles > 60) {
			t.push(`ripped`);
		} else if (subSlave.muscles > 5) {
			t.push(`toned`);
		} else if (subSlave.weight >= -10) {
			t.push(`trim`);
		} else {
			t.push(`skinny`);
		}
		t.push(`waist to cup ${his2}`);
		if (subSlave.dick > 0) {
			t.push(`cock`);
		} else if (subSlave.vagina === -1) {
			t.push(`asshole`);
		} else {
			t.push(`pussy`);
		}
		t.push(`possessively with ${hasBothArms(eventSlave) ? `one` : `${his}`} hand.`);
		if (hasAnyEyes(subSlave)) {
			t.push(`${subSlave.slaveName} closes ${his2} ${App.Desc.eyesColor(subSlave)}.`);
		}

		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${eventSlave.slaveName} chuckles into ${subSlave.slaveName}'s ear, crooning,`);
		if (subSlave.bellyPreg >= 120000) {
			t.push(Spoken(eventSlave, `"You little preggo slut. Look at how many babies you've gotten fucked into you; guess that's why you're a slave. You're good for nothing but being a breeding bitch."`));
		} else if (subSlave.dick > 0) {
			if (subSlave.dick < 3) {
				t.push(Spoken(eventSlave, `"You useless little bitch. Your pathetic cock is so small, no wonder you're a slave."`));
			} else if (subSlave.balls === 0) {
				t.push(Spoken(eventSlave, `"You sorry little bitch. Your cock isn't so hard now, is it? You're never going to fuck anyone ever again, bitch."`));
			} else {
				t.push(Spoken(eventSlave, `"You big sad bitch. You've got a nice cock, haven't you? Too bad you're only good for taking dick now."`));
			}
		} else if (subSlave.belly >= 5000) {
			if (subSlave.bellyPreg >= 3000) {
				t.push(Spoken(eventSlave, `"You pregnant slut. You think I'll show mercy since you're pregnant? Think again."`));
			} else if (subSlave.bellyImplant >= 3000) {
				t.push(Spoken(eventSlave, `"You blow-up whore. You think I'm dumb enough to be fooled by a fake pregnancy? Not a chance."`));
			} else {
				t.push(Spoken(eventSlave, `"You bloated slut. We're going to find out just how much raping it takes to make you leak."`));
			}
		} else if (subSlave.bellyPreg >= 1500) {
			t.push(Spoken(eventSlave, `"You fat slut. You think your growing pregnancy is going to keep you from getting raped?"`));
		} else if (subSlave.skill.vaginal > 30) {
			t.push(Spoken(eventSlave, `"You poor, sorry slut. You think you're pretty good in bed, don't you? You have no fucking idea."`));
		} else if (subSlave.vagina > 2) {
			t.push(Spoken(eventSlave, `"You poor, gaping slut. You think you know what it's like to take a pounding, don't you? You have no fucking idea."`));
		} else if (subSlave.weight > 130) {
			t.push(Spoken(eventSlave, `"You fat slut. You've got a huge belly, don't you? Being fat and ugly won't save you. You're gonna get raped."`));
		} else if (subSlave.muscles > 30) {
			t.push(Spoken(eventSlave, `"You poor, big bitch. You think all these muscles can save you? You're gonna get raped."`));
		} else if (subSlave.weight > 10) {
			t.push(Spoken(eventSlave, `"You fat slut. You've got a chubby belly, haven't you? Being fat and ugly won't save you. You're gonna get raped."`));
		} else if (subSlave.intelligenceImplant >= 15) {
			t.push(Spoken(eventSlave, `"You book-smart slut. You think any of the classes you passed is going to save you from getting raped?"`));
		} else {
			t.push(Spoken(eventSlave, `"You stupid slut. Too bad you never went to school, maybe you could have learned something and not ended up as a fuck slave."`));
		}

		t.push(`${He} grinds against the wilting ${subSlave.slaveName}, and then continues, "I felt your`);
		if (subSlave.butt > 4) {
			t.push(`fat`);
		} else if (subSlave.butt > 2) {
			t.push(`big`);
		} else {
			t.push(`tiny little`);
		}
		t.push(`butt clench just now." ${He} gives ${subSlave.slaveName}'s`);
		if (subSlave.balls > 0 && subSlave.scrotum > 0) {
			t.push(`balls a gentle squeeze.`);
		} else if (subSlave.dick > 0) {
			t.push(`dick a gentle tug.`);
		} else if (subSlave.vagina === -1) {
			t.push(`butthole a gentle massage.`);
		} else {
			t.push(`pussylips a gentle massage.`);
		}
		t.push(Spoken(eventSlave, `"${HeP} hasn't fucked you back there yet, has ${heP}? It's going to hurt, you little bitch. ${HeP}'s going to hold you down and shove ${hisP}"`));
		t.push(Spoken(eventSlave, (V.PC.dick !== 0) ? "huge cockhead" : "biggest strap-on"));
		t.push(Spoken(eventSlave, `right up against this tight little hole."`));
		t.push(`${He} gropes the quivering slave's virgin anus, careful not to penetrate it.`);
		t.push(Spoken(eventSlave, `"You're going to do your best to relax like a good little ${girl2}. But it's going to be so big. It's going to burn. And then you're going to panic, and struggle, and ${heP}'s going to hold you down and rape your butt while you scream and cry."`));

		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${subSlave.slaveName} keeps ${his2}`);
		if (hasBothEyes(subSlave)) {
			t.push(`eyes clamped shut and ${his2}`);
		} else if (hasAnyEyes(subSlave)) {
			t.push(`eye clamped shut and ${his2}`);
		}
		if (hasBothArms(subSlave)) {
			t.push(`hands down at ${his2} sides, balled into fists,`);
		} else {
			t.push(`hand down at ${his2} side, balled into a fist,`);
		}
		t.push(`but ${his2} self-control finally cracks and ${he2} lets out a great gasping sob before bursting into tears.`);

		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result(`${He}'s not wrong`, analFuck, virginityWarning()),
			new App.Events.Result("That sounds like the voice of experience", turntables),
		]);

		function virginityWarning() {
			if (subSlave.anus === 0) {
				return `This option will take ${his} anal virginity`;
			}
			return null;
		}

		function analFuck() {
			t = [];

			t.push(`You ask ${eventSlave.slaveName} what ${he} said in a neutral tone. ${He} gives you a quick glance, not sure whether to be aroused or afraid, but takes a breath to steady ${himself} and begins. For ${his2} part, ${subSlave.slaveName} vainly tries to stop crying in front of you. When ${eventSlave.slaveName} reaches`);
			t.push(Spoken(eventSlave, `"${HeP}'s going to hold you down and shove ${hisP} ${V.PC.dick !== 0 ? "huge cockhead" : "biggest strap-on"} right up against this tight little hole,"`));
			t.push(`you hold up a hand to get ${him} to pause. ${He} does, and you suddenly shove ${subSlave.slaveName} towards the couch. ${He2} crashes face-down into the cushions, already sobbing in terror. You place a hand on ${his2} ${subSlave.skin} back to hold ${him2} down and then use the other to apply some lube to your ${V.PC.dick !== 0 ? "penis" : "strap-on"} before pressing it against the quivering slave's virgin anus. ${He2} shakes with anguish, causing`);
			if (V.PC.dick !== 0) {
				t.push(`your cock to rub deliciously`);
			} else {
				t.push(`the strap-on to slide amusingly`);
			}
			t.push(`up and down ${his2} asscrack. You make a come-on gesture to ${eventSlave.slaveName}, and ${he} continues,`);
			t.push(Spoken(eventSlave, `"You're going to do your best to relax like a good little ${girl2}."`));
			t.push(`${subSlave.slaveName} desperately takes in a huge breath. ${eventSlave.slaveName}, who has gotten the idea (and to go by ${his} furious masturbation, clearly likes it), gasps out,`);
			t.push(Spoken(eventSlave, `"But it's going to be so big! It's going to burn!"`));
			t.push(`Here you begin to apply inexorable pressure. ${subSlave.slaveName} manages one more deep breath, but it becomes a squeal of anguish and ${he2} tries frantically to burrow into the couch, away from the penetrating`);
			if (V.PC.dick !== 0) {
				t.push(`cock.`);
			} else {
				t.push(`strap-on.`);
			}
			t.push(Spoken(eventSlave, `"You're going to panic, and struggle, and ${heP}'s going to hold you down and rape your butt while you scream and cry..."`));
			t.push(`${eventSlave.slaveName} trails off as ${he} shakes with orgasm; ${he} doesn't say any more, but the <span class="hotpink">wild satisfaction</span>`);
			if (canSee(eventSlave)) {
				t.push(`in ${his} ${App.Desc.eyesColor(subSlave)}`);
			} else {
				t.push(`on ${his} face`);
			}
			t.push(`says it for ${him}. ${subSlave.slaveName}, meanwhile, is a mess, but hurries fearfully to obey your instructions to go clean ${himself2}, and hides ${his2} hatred as ${he2} gingerly applies an enema to ${his2} loosened butt.`);
			eventSlave.devotion += 5;
			subSlave.trust -= 10;
			subSlave.devotion -= 5;
			seX(subSlave, "anal", V.PC, "penetrative");
			if (canImpreg(subSlave, V.PC)) {
				knockMeUp(subSlave, 5, 1, -1);
			}

			return t;
		}

		function turntables() {
			// replace slave art
			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, [eventSlave, subSlave], ["no clothing", "no clothing"]);
			t = [];

			t.push(`You approach and observe to ${eventSlave.slaveName} that it sounds like ${he}'s speaking from experience. ${He} glances at you nervously, but agrees. You tell ${him} to go on, so ${he} turns to the mystified ${subSlave.slaveName} and mumbles,`);
			t.push(Spoken(eventSlave, `"It wasn't easy for me the first time either."`));
			t.push(`${He} gasps as you slide around behind ${him}, your hands snaking around ${his}`);
			if (eventSlave.boobs > 2000) {
				t.push(`massive tits`);
			} else if (eventSlave.boobs > 1000) {
				t.push(`big boobs`);
			} else if (eventSlave.boobs > 400) {
				t.push(`prominent breasts`);
			} else {
				t.push(`chest`);
			}
			t.push(`to pinch ${his} ${eventSlave.nipples} nipples. You whisper into ${his} ear, ordering ${him} to tell ${his} little story again, slowly.`);
			t.push(Spoken(eventSlave, `"${HeP}'s going to hold you down and shove ${hisP} ${(V.PC.dick !== 0) ? "huge cockhead" : "biggest strap-on"} right up against this tight little hole,"`));
			t.push(`${he} tells ${subSlave.slaveName}. The poor ${girl2} doesn't know what to do, so ${he2} just stands`);
			if (canHear(subSlave)) {
				t.push(`and listens,`);
			} else {
				t.push(`still,`);
			}
			if (canSee(subSlave)) {
				t.push(`watching`);
			} else {
				t.push(`staring`);
			}
			t.push(`dumbly as ${eventSlave.slaveName} talks. ${He}'s a lot less intimidating this time around, gasping out the words as you maneuver your`);
			if (V.PC.dick !== 0) {
				t.push(`cock`);
			} else {
				t.push(`strap-on`);
			}
			t.push(`against ${his}`);
			if (eventSlave.anus > 2) {
				t.push(`loose butthole`);
			} else if (eventSlave.anus > 1) {
				t.push(`experienced ass`);
			} else {
				t.push(`tight butthole`);
			}
			t.push(`for some standing anal.`);
			t.push(Spoken(eventSlave, `"You're going to do your best to relax like a good little ${girl2},"`));
			t.push(`${he} moans.`);
			if ((eventSlave.dick > 0) && !canAchieveErection(eventSlave)) {
				t.push(`${His} limp dick hangs lamely as you press against ${his} backdoor, but it's dripping precum.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${He} has a throbbing erection.`);
			} else if (eventSlave.clit > 0) {
				t.push(`As you shove ${him} into place, your hand brushes against ${his} enormously erect clit.`);
			} else {
				t.push(`As you shove ${him} into place, your hand brushes against moisture coating ${his} inner thighs.`);
			}
			t.push(`The bitch is getting off on this.`);
			t.push(Spoken(eventSlave, `"But it's going to be so big — it's going to bu-hu-hur-hurn... oh..."`));
			t.push(`You're up ${his} ass and pounding away,`);
			if (subSlave.belly >= 5000) {
				t.push(`with one hand on ${his} hips and the other around ${his} gravid belly`);
			} else {
				t.push(`holding ${his} hips with both hands and`);
			}
			t.push(`bouncing ${his} butt against your crotch as your`);
			if (V.PC.dick !== 0) {
				t.push(`cock`);
			} else {
				t.push(`strap-on`);
			}
			t.push(`slides in and out of ${him}. You administer a hard slap to ${his} ass and tell ${him} to keep going. ${He} shakes ${his} head and manages to get back on track, grunting out,`);
			t.push(Spoken(eventSlave, `"You're going to panic — and — and — oh — s-struggle, and ${heP}'s going t-to h-ho-oh-old you d-down, oh, ow, and r-ra-rape your b-butt while, oh p-please ${getWrittenTitle(eventSlave)}, you scream, ooh, and c-cry... o-oh... ah."`));
			t.push(`${He} feels your`);
			if (V.PC.dick !== 0) {
				t.push(`hot seed jet into ${his} asshole`);
			} else {
				t.push(`own orgasm`);
			}
			t.push(`and your hands release their grip, and slides wetly off you,`);
			if ((eventSlave.dick > 0) && !canAchieveErection(eventSlave)) {
				t.push(`${his} own messy little orgasm running down ${his} legs to join the cum dripping out of ${his} ass.`);
			} else if (eventSlave.dick > 0) {
				t.push(`stepping around the mess ${he} shot onto the floor and trying to keep your load inside ${his} ass.`);
			} else {
				t.push(`${his} feminine juices running down ${his} legs to join the cum dripping out of ${his} ass.`);
			}
			t.push(`${He} walks gingerly to the bathroom for a cleanup, looking a lot more <span class="hotpink">submissive</span> than when you walked in. ${subSlave.slaveName} is still staring`);
			if (canSee(subSlave)) {
				t.push(`at you.`);
			} else {
				t.push(`towards you.`);
			}
			t.push(`There's a little <span class="gold">fear</span> there, but some <span class="hotpink">awe,</span> too.`);
			eventSlave.devotion += 5;
			seX(eventSlave, "anal", V.PC, "penetrative");
			if (canImpreg(eventSlave, V.PC)) {
				knockMeUp(eventSlave, 5, 1, -1);
			}
			subSlave.trust -= 5;
			subSlave.devotion += 5;
			return t;
		}
	}
};


code:
App.Events.RETSShowerForce = class RETSShowerForce extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.universalRulesConsent === 0
		];
	}

	actorPrerequisites() {
		return [
			[ // event slave /domslave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canWalk,
				canTalk,
				canSee,
				s => s.devotion > 50,
				s => s.trust <= 75,
				s => (["sadist", "dom"].includes(s.fetish) || s.energy > 95),
			],
			[ // and subslave
				s => s.fetish !== "mindbroken",
				canStand,
				canTalk,
				canHear,
				isSlaveAvailable,
				s => s.devotion <= 20,
				s => (s.fetish !== "buttslut"),
				s => (canDoAnal(s) && s.anus !== 0),
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself
		} = getPronouns(eventSlave);
		const {
			he2, His2, his2, him2
		} = getPronouns(subSlave).appendSuffix("2");

		let facialAttractiveness = "homely";
		if (subSlave.face > 95) {
			facialAttractiveness = "gorgeous";
		} else if (subSlave.face > 40) {
			facialAttractiveness = "beautiful";
		} else if (subSlave.face > 10) {
			facialAttractiveness = "pretty";
		} else if (subSlave.face >= -10) {
			facialAttractiveness = "attractive";
		}
		let numLegs = "two";
		if (hasBothLegs(eventSlave) && hasBothLegs(subSlave)) {
			numLegs = "four";
		} else if (hasBothLegs(eventSlave) || hasBothLegs(subSlave)) {
			numLegs = "three";
		}

		App.Events.drawEventArt(node, [eventSlave, subSlave], "no clothing");

		seX(subSlave, "anal", eventSlave, "penetrative");
		let bellyDesc = bellyAdjective(subSlave);

		let t = [];
		t.push(`As you pass the showers, you hear what sounds like a muffled altercation over the noise of the showers running. You look in to see ${subSlave.slaveName}'s ${subSlave.skin} body facing you, pressed hard up against the glass wall of one of the showers. ${His2} ${facialAttractiveness} face`);
		if (subSlave.belly >= 5000) {
			t.push(`and ${subSlave.bellyPreg >= 5000 ? `pregnant` : bellyDesc} belly are`);
		} else {
			t.push("is");
		}
		t.push(`smashed against the glass,`);
		if (subSlave.belly >= 5000) {
			t.push(`${his2} face`);
		}
		t.push(`contorted in pain and fear. The apparent mystery is solved when you notice that there are ${numLegs} legs visible: there's a ${hasBothLegs(eventSlave) ? `pair of` : ""}`);
		if (eventSlave.muscles > 95) {
			t.push(`ripped`);
		} else if (eventSlave.muscles > 30) {
			t.push(`muscular`);
		} else if (eventSlave.muscles > 5) {
			t.push(`toned`);
		} else {
			t.push(`soft`);
		}
		t.push(`${eventSlave.skin} ${hasBothLegs(eventSlave) ? "calves" : "calf"} behind ${subSlave.slaveName}'s.`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), "'s' face appears at"));
		t.push(App.UI.DOM.combineNodes(contextualIntro(eventSlave, subSlave, true), `'s ear, and though you can't hear exactly what ${he} says, it's something along the lines of "Take it, you whiny little bitch." ${He}'s clearly got ${canPenetrate(eventSlave) ? `${his} cock` : `a couple of fingers`} up ${subSlave.slaveName}'s asshole.`));
		App.Events.addParagraph(node, t);
		t = [];
		t.push(`Both slaves notice you at the same time. ${subSlave.slaveName}'s ${canSee(subSlave)? `${App.Desc.eyesColor(subSlave)} widen` : "face lights up"}, but ${his2} momentary look of hope is snuffed out when ${he2} remembers who you are. ${eventSlave.slaveName}, on the other hand, looks a little doubtful. The rules allow ${him} to fuck your other slaves, but ${he} isn't quite sure what the right thing to do is, since ${he} isn't the most dominant force in the showers any more.`);
		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Instruct ${him} to be a little nicer`, nicer),
			new App.Events.Result("Double anal", double),
		]);

		function nicer() {
			t = [];
			t.push(`Even though you already have everyone's rapt attention, you rap on the glass for`);
			if (canSee(eventSlave) && canSee(subSlave)) {
				t.push(`emphasis, watched closely by four huge eyes.`);
			} else {
				t.push("emphasis.");
			}
			t.push(`You politely admonish ${eventSlave.slaveName}, and tell ${him} to do a better job of looking after ${his} anal bottom's pleasure. ${He} nods vigorously and snakes a hand around ${subSlave.slaveName}, to where`);
			if (subSlave.chastityPenis) {
				t.push(`${his2} caged dick is scraping against the glass.`);
			} else if (canAchieveErection(subSlave)) {
				t.push(`${his2} dick, shamefully half-hard despite ${his2} unwillingness, is smashed against the glass.`);
			} else if (subSlave.dick > 0) {
				t.push(`${his2} limp dick is smashed against the glass.`);
			} else if (subSlave.vagina > -1) {
				t.push(`${his2} neglected pussy is hidden between ${his2} forced-together legs.`);
			} else {
				t.push(`${his2} featureless groin is hidden between ${his2} forced-together legs.`);
			}
			t.push(`${eventSlave.slaveName} goes back to the anal, but gives ${subSlave.slaveName} a serviceable reach around as ${he} does. ${subSlave.slaveName} does not orgasm, but ${he2} looks a little less unhappy and thanks you for your intervention after ${eventSlave.slaveName}`);
			if (canPenetrate(eventSlave)) {
				t.push(`grunts, fills ${his2} asshole with cum, and pulls ${himself} out.`);
			} else {
				t.push(`shakes with orgasm and removes ${his} fingers.`);
			}
			seX(subSlave, "anal", eventSlave, "penetrative");
			subSlave.trust += 4;
			if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) {
				knockMeUp(subSlave, 5, 1, eventSlave.ID);
			}
			return t;
		}

		function double(){
			t = [];
			t.push(`You tell ${eventSlave.slaveName} to get out of the shower. ${He} looks crushed, and ${subSlave.slaveName} looks hopeful, until you tell ${him} to bring the bitch. ${eventSlave.slaveName} grabs ${subSlave.slaveName} by the wrist and drags ${his} protesting victim along. You sit on the counter and tell ${eventSlave.slaveName} to pass you the anal slave. ${He} does, giggling maliciously, openly masturbating as you pull the recalcitrant ${subSlave.slaveName} up onto your lap, seat`);
			if (V.PC.dick === 0) {
				t.push(`a strap-on`);
			} else {
				t.push(`your cock`);
			}
			t.push(`firmly up ${his2} already-fucked`);
			if (subSlave.anus > 2) {
				t.push(`anal slit,`);
			} else if (subSlave.anus > 1) {
				t.push(`asshole,`);
			} else {
				t.push(`anus,`);
			}
			t.push(`seize the backs of ${his2} knees, and pull ${him2} up into a crouching position atop you. You lift ${him2} up and down on`);
			if (V.PC.dick === 0) {
				t.push(`the strap-on`);
			} else {
				t.push(`your dick`);
			}
			t.push(`for a while, letting ${eventSlave.slaveName} continue ${his}`);
			if (canPenetrate(eventSlave)) {
				t.push(`jerking,`);
			} else {
				t.push(`rubbing,`);
			}
			t.push(`before telling ${him} to join you. ${He} hesitates for a moment before you explain that ${he} should join you up ${subSlave.slaveName}'s butthole. Your victim begins to cry openly but knows better than to beg. ${eventSlave.slaveName}`);
			if (canPenetrate(eventSlave)) {
				t.push(`pushes ${his} iron-hard prick up alongside yours,`);
			} else {
				t.push(`shoves first one and then two fingers up alongside your prick,`);
			}
			t.push(`eliciting a long wail from`);
			if (subSlave.belly >= 10000) {
				t.push(`the overfilled`);
			}
			t.push(`${subSlave.slaveName}. The position isn't the best for pounding's sake, but the sadistic thrill of ${subSlave.slaveName}'s anguish is plenty to bring both you and ${eventSlave.slaveName} to prompt orgasm. ${subSlave.slaveName} stumbles painfully back to the shower with ill-concealed terror, while ${eventSlave.slaveName} impulsively gives you a quick hug.`);
			eventSlave.devotion += 4;
			subSlave.trust -= 5;
			seX(subSlave, "anal", eventSlave, "penetrative");
			seX(subSlave, "anal", V.PC, "penetrative");
			if (canImpreg(subSlave, V.PC)) {
				knockMeUp(subSlave, 5, 1, -1);
			}
			if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) {
				knockMeUp(subSlave, 5, 1, eventSlave.ID);
			}
			return t;
		}
	}
};


code:
App.Events.RETSSiblingTussle = class RETSSiblingTussle extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.minimumSlaveAge < 18
		];
	}

	actorPrerequisites() {
		return [
			[ // event slave
				s => s.fetish !== "mindbroken",
				canStand,
				hasAnyArms,
				hasBothLegs,
				s => s.actualAge < 18,
				s => s.sisters > 0
			],
			[ // and her sibling
				s => s.fetish !== "mindbroken",
				canStand,
				hasAnyArms,
				hasBothLegs,
				isSlaveAvailable,
				s => s.actualAge < 18,
				s => areSisters(getSlave(this.actors[0]), s) > 0, // sibling check
				s => App.Utils.jobForAssignment(getSlave(this.actors[0]).assignment).facility.employeesIDs().has(s.ID), // lives in the same facility
			]
		];
	}

	execute(node) {
		const [sib1, sib2] = this.actors.map(a => getSlave(a));
		const {
			he, his, him
		} = getPronouns(sib1);
		const {
			He2, he2, his2, him2
		} = getPronouns(sib2).appendSuffix("2");
		const hostFacility = App.Utils.jobForAssignment(getSlave(this.actors[0]).assignment).facility;

		App.Events.drawEventArt(node, [sib1, sib2], "no clothing");

		let t = [];
		t.push(`As you're conducting your morning rounds, you hear a commotion coming from the shower and dressing area of ${hostFacility.name}.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`Like most siblings who haven't yet developed mature conflict-resolution skills,`);
		t.push(App.UI.DOM.slaveDescriptionDialog(sib1));
		t.push(`and`);
		t.push(contextualIntro(sib1, sib2, true));
		t.push(`sometimes get physical when they annoy one another. Today a tussle has broken out over some minor slight.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`The other slaves around them are mostly ignoring them in their haste to prepare for their workday, but the still wet and naked ${sib1.slaveName} and ${sib2.slaveName} sure manage to get your attention as they hit, kick, and wrestle with each other. You doubt they'll do any lasting damage, and maybe getting some of that hostile energy out will make them more compliant as the day goes on, but you also consider whether imposing some discipline might be a good idea.`);
		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result("Make them kiss and make up", kissAndMakeUp), // don't think there's a need for an incest guard here, they'll break off early if necessary
			new App.Events.Result("Punish them together", punish),
			new App.Events.Result("Just watch and see what happens", watch)
		]);

		function kissAndMakeUp() {
			const frag = document.createDocumentFragment();

			t = [];
			t.push(`You walk into the dressing area and clear your throat loudly. The other slaves pause what they're doing and turn to look at you, either from devotion or fear.`);
			t.push(`After a few seconds, ${sib2.slaveName} ${canHear(sib2) ? "realizes" : "manages to realize"} that things have gone strangely quiet and scrambles to stand and pay attention to you, and ${sib1.slaveName} follows suit when ${he} realizes that the nature of their fight has changed.`);
			App.Events.addParagraph(frag, t);

			t = [];
			t.push(`You tell the rest of the slaves to go back to what they were doing while you talk to ${sib1.slaveName} and ${sib2.slaveName}. You explain to the two of them that they have responsibilities to attend to, and that doesn't include fighting with each other, and order them to apologize to one another and kiss. When ${sib2.slaveName} tries to pin the blame for the fight on ${sib1.slaveName}, you cut ${him2} off and tell ${him2} that you're not interested in who started it, just how they're going to resolve it, and that ${he2} won't like what happens if you think ${he2}'s backtalking you.`);
			App.Events.addParagraph(frag, t);

			t = [];
			t.push(`${He2} gets the idea, and apologizes (with somewhat questionable sincerity) to ${sib1.slaveName} for ${his2} part in things. You turn to ${sib1.slaveName} expectantly, and ${he} also apologizes to ${his} ${siblingTerm(sib1, sib2)}, and then leans in for a ${V.seeIncest === 0 ? "chaste" : ""} kiss, as directed.`);
			App.Events.addParagraph(frag, t);

			if (V.seeIncest > 0 && (sib1.energy > 60 || sib2.energy > 60)) {
				if (App.Utils.sexAllowed(sib1, sib2)) {
					t = [];
					t.push(`The kiss begins to get a little more heated and they glance at you for permission to continue instead of getting back to work immediately. While you know you should really tell them to get back to work, the rules you've set allow them to go further, and they're at least getting along. And it's pretty hot, so you're keen to watch.`);
					App.Events.addParagraph(frag, t);

					t = [];
					t.push(`As soon as they realize you aren't going to stop them, the kiss gets deeper and the groping starts in earnest.`);
					if (sib1.dick > 0) {
						t.push(`${sib2.slaveName} immediately reaches for ${his2} ${siblingTerm(sib2, sib1)}'s dick, fondling and tugging on it to make sure it's ${canAchieveErection(sib1) ? `hard` : `as half-hard as it can be`} for what they're about to do.`);
					} else if (sib1.vagina >= 0) {
						t.push(`${sib2.slaveName} immediately reaches for ${his2} ${siblingTerm(sib2, sib1)}'s soft slit, rubbing and massaging it to make sure ${he}'s good and wet.`);
					} else if (sib1.boobs >= 300) {
						t.push(`${sib2.slaveName} moves ${his2}'s hands to ${his2} ${siblingTerm(sib2, sib1)}'s tits, pawing at them and playing with ${his} ${sib1.nipples} nipples.`);
					} else { // null with no tits? c'mon...
						t.push(`${sib2.slaveName} slides ${his2} hand between ${his2} ${siblingTerm(sib2, sib1)}'s thighs, massaging the soft sensitive skin of ${his} crotch.`);
					}
					// reverse order and add a couple extra options to try to avoid similar text
					t.push(`${sib1.slaveName}, meanwhile,`);
					if (sib2.boobs >= 300) {
						t.push(`moves ${his}'s hands to ${his} ${siblingTerm(sib1, sib2)}'s tits, pawing at them and playing with ${his2} ${sib1.nipples} nipples.`);
					} else if (sib2.balls > 0 && sib1.dick > 0) { // avoid double dick groping by going for the balls
						t.push(`grabs ${his} ${siblingTerm(sib1, sib2)}'s balls, fondling them to make sure ${he2}'s going to make plenty of cum.`);
					} else if (sib2.dick > 0) {
						t.push(`grabs ${his} ${siblingTerm(sib1, sib2)}'s dick, fondling and tugging on it to make sure it's ${canAchieveErection(sib2) ? `hard` : `at least semi-hard`} for what they're about to do.`);
					} else if (sib2.clit > 0 && sib1.vagina >= 0) { // avoid double vagina groping by going for the clit
						t.push(`reaches for ${his} ${siblingTerm(sib1, sib2)}'s clit, rubbing and flicking it to make sure ${he2}'s ready for action.`);
					} else if (sib2.vagina >= 0) {
						t.push(`reaches for ${his} ${siblingTerm(sib1, sib2)}'s soft slit, rubbing and massaging it to make sure ${he2}'s good and wet.`);
					} else {
						t.push(`slides ${his} hand between ${his} ${siblingTerm(sib1, sib2)}'s thighs, massaging the soft sensitive skin of ${his2} crotch.`);
					}
					t.push(`Once they're both good and ready, they get on a dressing bench in a classic 69 position, eagerly bringing each other to orgasm orally while you watch.`);
					seX(sib1, "oral", sib2, "oral");
					App.Events.addParagraph(frag, t);
				} else {
					t = [];
					t.push(`The kiss begins to get a little more heated and you clearly see the lust growing in ${sib1.energy > sib2.energy ? sib1.slaveName : sib2.slaveName}'s eyes, but they know the rules and pull apart before they go too far.`);
					App.Events.addParagraph(frag, t);
				}
			}

			t = [];
			t.push(`They feel better, and they've both learned to <span class="trust inc">trust</span> and <span class="devotion inc">rely on</span> your judgement.`);
			App.Events.addParagraph(frag, t);

			sib1.trust += 2;
			sib1.devotion += 2;
			sib2.trust += 2;
			sib2.devotion += 2;

			return frag;
		}

		function punish() {
			const frag = document.createDocumentFragment();

			t = [];
			t.push(`You step between the two siblings and take a few weak blows before they realize you're there; you see the fear grow on their faces immediately when they realize how much trouble they're in.`);
			t.push(`You grab ${sib2.slaveName} by the throat and throw ${him2} to the ground, ordering ${him2} to stay there until you're ready for ${him2}.`);
			t.push(`Then you push ${sib1.slaveName} into a kneeling position and force your ${V.PC.dick > 0 ? "dick" : "strap-on"} down ${his} throat, facefucking ${him} brutally as you explain that both of them are your property and that every time they fight, they are risking damage to your property.`);
			App.Events.addParagraph(frag, t);

			t = [];
			t.push(`Once you think your message has gotten through, you pull ${sib1.slaveName} off your ${V.PC.dick > 0 ? "dick" : "strap-on"} with a pop, pull ${sib2.slaveName} to ${his2} knees and repeat your chosen punishment on ${him2}.`);
			t.push(`${sib1.slaveName} kneels obediently, crying quietly as you abuse ${his} ${siblingTerm(sib1, sib2)}.`);
			t.push(`When you've finished, you're sure both siblings are more likely to <span class="trust dec">respect the rules,</span> out of fear if nothing else.`);
			App.Events.addParagraph(frag, t);

			sib1.trust -= 5;
			sib2.trust -= 5;

			return frag;
		}

		function watch() {
			const dead1 = deadliness(sib1);
			const dead2 = deadliness(sib2);
			if (Math.abs(dead1 - dead2) <= 1) {
				// fight between equals
				t = [];
				t.push(`The two siblings are fairly closely matched in size and skill, and the nude brawl carries on for a few minutes as the other slaves finish preparing for their day. Eventually, ${sib1.slaveName} notices that they're going to be late to work, and they agree to a truce.`);
				t.push(`As they dress quickly, they see you standing at the door, and a quick flash of <span class="trust dec">fear</span> passes over their faces as they realize you've probably just seen the whole thing.`);
				t.push(`The fear is replaced with relief when they realize that if you'd wanted to punish them, you probably would have done so already, but they'll leave with the lasting impression that you're always watching.`);

				sib1.trust -= 2;
				sib2.trust -= 2;

				return t;
			} else {
				// there's a clear winner
				const winner = dead1 > dead2 ? sib1 : sib2;
				const loser = dead1 > dead2 ? sib2 : sib1;
				const {
					HeW, HisW, heW, himW, hisW, himselfW
				} = getPronouns(winner).appendSuffix("W");
				const {
					heL, himL, hisL
				} = getPronouns(loser).appendSuffix("L");

				t = [];
				t.push(`${winner.slaveName} has a clear advantage over ${hisW} ${siblingTerm(winner, loser)} and quickly subdues ${himL}.`);
				if (V.seeIncest && App.Utils.sexAllowed(winner, loser) && (winner.energy > 40 || winner.fetish === "dom")) {
					t.push(`Excited by ${hisW} dominance of ${hisW} weaker ${siblingTerm(winner, loser)}, ${heW} quickly begins to take advantage of ${himL}.`);
					/** @type {FC.SlaveActs} */
					let sexType = "oral";
					if (canPenetrate(winner)) {
						// no taking of virginities here
						if (canDoVaginal(loser) && loser.vagina > 0) {
							t.push(`${HeW} flips ${himL} onto ${hisL} back, spreads ${hisL} legs and positions ${himselfW} to penetrate ${himL}.`);
							sexType = "vaginal";
						} else if (canDoAnal(loser) && loser.anus > 0) {
							t.push(`${HeW} flips ${himL} onto ${hisL} belly, spreads ${hisL} buttocks and positions ${himselfW} to penetrate ${hisL} ass.`);
							sexType = "anal";
						}
					}
					if (sexType === "oral") {
						t.push(`${HeW} moves over ${loser.slaveName}'s prone body until ${heW}'s above ${hisL} mouth, and orders ${hisW} ${siblingTerm(winner, loser)} to orally service ${himW}.`);
					}
					if (loser.fetish === "submissive") {
						t.push(`${loser.slaveName} enjoys being dominated anyway, so this situation is good for ${himL} too.`);
					} else if (V.universalRulesConsent === 1) {
						t.push(`${loser.slaveName} knows he's lost; technically ${heL} could reject ${winner.slaveName}'s advances, but ${heL} isn't exactly opposed to this anyway.`);
					} else {
						t.push(`Whether ${loser.slaveName} is OK with this or just accepts that it's happening to ${himL} is unclear, but it doesn't really matter.`);
					}
					seX(winner, "penetrative", loser, sexType);
					if (sexType === "vaginal") {
						t.push(`${winner.slaveName} slides ${hisW} ${winner.dick > 3 ? "stiff prick" : "hard little dick"} into ${hisW} ${siblingTerm(winner, loser)}'s ${loser.vagina < 2 ? "tight slit" : "cunt"} and starts pounding away.`);
						if (canImpreg(loser, winner)) {
							knockMeUp(loser, 10, 0, winner.ID);
						}
					} else if (sexType === "anal") {
						t.push(`${winner.slaveName} slides ${hisW} ${winner.dick > 3 ? "stiff prick" : "hard little dick"} into ${hisW} ${siblingTerm(winner, loser)}'s ${loser.anus < 2 ? "tight ass" : "well-used ass"} and starts pounding away.`);
						if (canImpreg(loser, winner)) {
							knockMeUp(loser, 10, 1, winner.ID);
						}
					} else {
						t.push(`${winner.slaveName} encourages ${loser.slaveName} to ${winner.dick > 0 ? `suck ${himW} off` : `eat ${himW} out`} quickly, knowing that they both still have to get to work.`);
					}
					if (loser.fetish !== "submissive") {
						t.push(`It's not long before ${heW} comes, and the two slaves separate to finish getting ready for work. ${winner.slaveName} had fun this morning, but is still clearly up for more.`);
						if (fetishChangeChance(loser) > jsRandom(0, 100)) {
							loser.fetishKnown = 1;
							loser.fetish = "submissive";
							loser.fetishStrength = 20;
							t.push(`${loser.slaveName}, meanwhile, really enjoyed the feeling of being dominated by ${hisL} ${siblingTerm(loser, winner)}, and has become <span class="fetish gain">submissive.</span>`);
						}
						winner.energy += 4;
					} else {
						t.push(`${HisW} ${siblingTerm(winner, loser)} really gets off on ${hisL} submissive position and comes before ${heW} does, and when they're finished they both leave satisfied, heightening their sex drives.`);
						sib1.energy += 4;
						sib2.energy += 4;
					}
				} else {
					t.push(`${HeW} quickly extracts a promise from ${loser.slaveName} to help ${himW} with ${hisW} work before letting him up, and they resume dressing for work without further incident.`);
					// no stat changes
				}
				return t;
			}
		}
	}
};