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

	actorPrerequisites() {
		return [
			[ // event slave
				s => s.fetish !== "mindbroken",
				s => s.rules.release.slaves !== 0,
				hasAnyArms,
				canStand,
				canTalk,
				canPenetrate,
				s => s.devotion > 50
			],
			[ // and her sub
				s => s.fetish !== "mindbroken",
				canStand,
				canTalk,
				isSlaveAvailable,
				s => s.relationship <= 2 || s.relationshipTarget !== this.actors[0],
				s => (canDoAnal(s) && s.anus !== 0) || (canDoVaginal(s) && s.vagina !== 0),
				s => s.devotion < 20,
				s => s.belly < 2000,
				s => s.skill.combat === 0,
				s => s.muscles <= 30
			]
		];
	}

	execute(node) {
		const [domSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself
		} = getPronouns(domSlave);
		const {
			He2, he2, His2, his2, him2
		} = getPronouns(subSlave).appendSuffix("2");
		const {say, title: Master} = getEnunciation(domSlave);
		const {title: Master2} = getEnunciation(subSlave);
		const desc = SlaveTitle(domSlave);
		const PC = V.PC;

		const vaginal = subSlave.vagina !== 0 && canDoVaginal(subSlave);

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

		let t = [];

		t.push(`You round a corner and almost trip over`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, domSlave, true), "."));
		t.push(`${He}'s on top of another slave, humping away; ${his}`);
		if (domSlave.butt > 8) {
			t.push(`monstrous, naked ass jiggles lewdly`);
		} else if (domSlave.anus > 2) {
			t.push(`loose asspussy winks lewdly`);
		} else if (domSlave.muscles > 30) {
			t.push(`heavily muscled butt flexes powerfully`);
		} else if (domSlave.butt > 3) {
			t.push(`big butt pumps energetically`);
		} else {
			t.push(`nice little butt flexes cutely`);
		}
		t.push(`as ${he} thrusts. You can't see much of the slave ${vaginal ? `lying on ${his2} back` : "face-down"} underneath ${domSlave.slaveName}, but you recognize ${him2} as`);
		t.push(contextualIntro(domSlave, subSlave, true));
		t.push(`by ${his2} sobbing. ${He2}'s struggling a little, but ${domSlave.slaveName} has ${him2} pinned to the floor by ${his2} ${hasBothArms(subSlave) ? "wrists" : "wrist"}, and ${domSlave.slaveName} is quickly raping the resistance out of the ${SlaveTitle(subSlave)}.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${domSlave.slaveName} senses your presence above and behind ${him}, and twists ${his} ${domSlave.hColor} head around to ${canSee(domSlave) ? `see who it is. ${He} sees that it's you` : `discern who it is. ${He} realizes that it's you`}, and greets you cheerfully. "${Spoken(domSlave, `Hi, ${Master}`)}," ${he} trills.`);
		if (domSlave.fetishKnown && domSlave.fetish === "sadist") {
			t.push(`"${Spoken(domSlave, `This is so awesome`)}," the sadistic ${desc} gushes. "${Spoken(domSlave, `The crying, the struggling. Thank you for letting us do this`)}."`);
		} else if (domSlave.fetishKnown && domSlave.fetish === "dom") {
			t.push(`"${Spoken(domSlave, `The crying almost makes me feel bad, but fucking a bitch feels so, so good`)}," the dominant ${desc} admits conversationally.`);
		} else if (domSlave.fetishKnown && domSlave.fetish === "pregnancy" && vaginal && canImpreg(subSlave, domSlave)) {
			t.push(`"${Spoken(domSlave, `I couldn't help myself`)}," the ${desc} admits. "${Spoken(domSlave, `${He2}'d look so pretty with a pregnant belly and I just couldn't resist giving ${him2} one. ${He2} tried to say ${he2} didn't want to be a mother, so...`)}"`);
		} else if (domSlave.energy > 95) {
			t.push(`"${Spoken(domSlave, `I can't help myself`)}," the nymphomaniac ${desc} admits breathlessly. "${Spoken(domSlave, `Thank you for letting me take what I need from the other girls`)}."`);
		} else if (domSlave.energy > 60) {
			t.push(`"${Spoken(domSlave, `I couldn't help myself`)}," the ${desc} admits. "${Spoken(domSlave, `I was really, really horny and ${he2} was just, um, there. And ${he2} tried to say no`)}."`);
		} else {
			t.push(`"${Spoken(domSlave, `I know it's not like me`)}," the ${desc} admits. "${Spoken(domSlave, `But I asked ${him2}, like, mostly joking, and ${he2} tried to say no`)}."`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${subSlave.slaveName} ${vaginal ? `looks out from under ${domSlave.slaveName}` : `turns ${his2} head`} and ${canSee(subSlave) ? "looks at" : "faces"} you too. "${Spoken(subSlave, `${Master2}, please`)}," ${he2} begs. "${Spoken(subSlave, `P-please, make ${him} s-stop — mhhh —`)}" ${domSlave.slaveName} shuts ${him2} up by ${vaginal ? `kissing ${his2} unwilling mouth` : `shoving ${his2} face back against the floor`}. Once ${he} has ${subSlave.slaveName} back under control, ${domSlave.slaveName} slows ${his} thrusting, reaches around behind ${himself}, and ${domSlave.vagina !== 0 && canDoVaginal(domSlave) ? `spreads ${his} futa pussy for you` : `pulls one asscheek aside to offer you ${his} anus. To make the offer extra clear, ${he} starts winking it lewdly`}.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`"${Spoken(domSlave, `Please fuck me while I rape ${him2}, ${Master}`)}," ${domSlave.slaveName} ${say}s in a mockery of ${subSlave.slaveName}'s `);
		if (subSlave.voice > 2) {
			t.push(`high-pitched whining.`);
		} else if (subSlave.voice > 1) {
			t.push(`begging.`);
		} else {
			t.push(`deep-voiced begging.`);
		}
		t.push(`"${Spoken(domSlave, `Ooh, or, please, ${Master}, may I flip ${him2} over? I'd love to feel ${PC.dick ? `your cock inside ${him2} alongside mine` : `that strap-on you use inside ${him2} alongside my cock`}`)}!"`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`"${Spoken(subSlave, `Please, no`)}," sobs ${subSlave.slaveName}.`);
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			((canDoAnal(domSlave) && domSlave.anus !== 0) || (canDoVaginal(domSlave) && domSlave.vagina !== 0)
				? new App.Events.Result("Slide in behind", behind)
				: new App.Events.Result()
			),
			new App.Events.Result("Slide in alongside", alongside),
			new App.Events.Result("Put a stop to it", stop)
		]);

		function behind() {
			t = [];

			t.push(`You order ${domSlave.slaveName} to go back to what ${he} was doing. ${He}'s a little disappointed you're not joining in, but ${he} obeys, pounding the crying ${subSlave.slaveName} without mercy. Then ${domSlave.slaveName} feels the head of ${PC.dick ? "your dick" : "a strap-on"} brush ${his} butt. "Ooh!" ${he} squeals, pleased ${he} was wrong after all. "${Spoken(domSlave, `Yes, thank you, ${Master}! Fuck me! Fuck me while I rape ${him2}!`)}" Underneath ${him}, ${subSlave.slaveName} cries harder, even though ${domSlave.slaveName} has to stop ${his} thrusting for a moment to let you inside. In fact, you reflect as you hammer ${domSlave.slaveName}'s`);
			if (domSlave.vagina !== 0 && canDoVaginal(domSlave)) {
				if (domSlave.vagina > 2) {
					t.push(`roomy`);
				} else if (domSlave.vagina > 1) {
					t.push(`delectable`);
				} else {
					t.push(`tight little`);
				}
				t.push(`cunt,`);
			} else {
				if (domSlave.anus > 2) {
					t.push(`gaping`);
				} else if (domSlave.anus > 1) {
					t.push(`relaxed`);
				} else {
					t.push(`poor little`);
				}
				t.push(`asspussy,`);
			}
			t.push(`it's a little strange that ${subSlave.slaveName} seems to think this is worse than just being raped by ${domSlave.slaveName}. After all, having your ${PC.dick ? "turgid cock" : "formidable strap-on"} sliding energetically in and out of ${his} ${domSlave.vagina !== 0 && canDoVaginal(domSlave) ? "womanhood" : "rectum"} is cramping ${domSlave.slaveName}'s style a bit. Maybe it's that ${subSlave.slaveName} is a little squashed under there.`);

			domSlave.devotion += 4;
			subSlave.trust -= 4;
			if (domSlave.vagina !== 0 && canDoVaginal(domSlave)) {
				seX(domSlave, "vaginal", PC, "penetrative");
				if (canImpreg(domSlave, PC)) {
					knockMeUp(domSlave, 5, 0, -1);
				}
			} else {
				seX(domSlave, "anal", PC, "penetrative");
				if (canImpreg(domSlave, PC)) {
					knockMeUp(domSlave, 5, 1, -1);
				}
			}
			if (vaginal) {
				seX(subSlave, "vaginal", domSlave, "penetrative");
				if (canPenetrate(domSlave) && canImpreg(subSlave, domSlave)) {
					knockMeUp(subSlave, 5, 0, domSlave.ID);
				}
			} else {
				seX(subSlave, "anal", domSlave, "penetrative");
				if (canPenetrate(domSlave) && canImpreg(subSlave, domSlave)) {
					knockMeUp(subSlave, 5, 1, domSlave.ID);
				}
			}
			return t;
		}

		function alongside() {
			const fit = vaginal ? subSlave.vagina > 2 : subSlave.anus > 2;
			t = [];

			t.push(`You order ${domSlave.slaveName} to flip ${subSlave.slaveName} over and let you in too. Just as you expected, ${domSlave.slaveName} responds with a vicious giggle, and ${subSlave.slaveName} cries even harder. "${Spoken(subSlave, `Please!`)}" ${he2} screams. "${Spoken(subSlave, `${Master2}, it'll hurt! Please don't!`)}"`);
			if (fit) {
				t.push(`It's not clear what ${he2}'s so worked up about. ${His2} cavernous ${vaginal ? "cunt" : "asshole"} should be able to take two dicks without trouble.`);
			} else {
				if (domSlave.dick < 5) {
					t.push(`It's not clear what ${he2}'s so worked up about. ${PC.dick ? "You're quite large" : "You use a big strap-on"}, but ${domSlave.slaveName}'s penis is reasonably sized. It's not like ${subSlave.slaveName}'s ${vaginal ? "cunt" : "asshole"} is going to be permanently damaged or anything.`);
				} else {
					t.push(`${He2}'s right to be concerned. ${PC.dick ? "You're quite large" : "You use a big strap-on"}, and ${domSlave.slaveName}'s penis is huge too. ${subSlave.slaveName}'s ${vaginal ? "cunt" : "asshole"} is in serious peril.`);
				}
			}
			t.push(`${domSlave.slaveName} pulls out, sits ${his} bare butt down on the floor, and hauls a struggling ${subSlave.slaveName} onto ${his} lap, shoving ${his} stiff prick back where it belongs. Then ${domSlave.slaveName} hauls ${subSlave.slaveName}'s legs back, offering you ${his2} already-occupied hole. ${subSlave.vagina !== 0 && vaginal ? `${subSlave.slaveName} has another hole, and ${he2} tearfully begs you to use it, but in vain.` : ""}`);
			t.push(`You jam yourself inside, enjoying ${subSlave.slaveName}'s ${!fit ? `wriggling and the extreme tightness of ${his2} overfilled insides. ${He2} spasms with pain as you force your way inside ${him2}` : "wriggling"}. ${domSlave.slaveName} can't thrust much from where ${he} is, and serves mostly to tighten ${subSlave.slaveName} for you, but ${he} ${canSee(domSlave) ? "stares into your eyes lovingly" : "lovingly smiles at you"}. Playing such an equal sexual role with you definitely builds ${his} trust in ${his} role. For ${his2} part, ${subSlave.slaveName} is thoroughly degraded, ${fit ? "but physically unhurt." : `and <span class="orange">stretched out.</span>`}`);

			domSlave.trust += 4;
			subSlave.trust -= 4;
			if (vaginal) {
				seX(subSlave, "vaginal", domSlave, "penetrative");
				if (canImpreg(domSlave, PC)) {
					knockMeUp(domSlave, 5, 0, -1);
				}
				if (canPenetrate(domSlave) && canImpreg(subSlave, domSlave)) {
					knockMeUp(subSlave, 5, 0, domSlave.ID);
				}
			} else {
				seX(subSlave, "anal", domSlave, "penetrative");
				if (canImpreg(domSlave, PC)) {
					knockMeUp(domSlave, 5, 1, -1);
				}
				if (canPenetrate(domSlave) && canImpreg(subSlave, domSlave)) {
					knockMeUp(subSlave, 5, 1, domSlave.ID);
				}
			}
			if (!fit) {
				if (vaginal) {
					subSlave.vagina++;
				} else {
					subSlave.anus++;
				}
			}
			return t;
		}

		function stop() {
			t = [];

			t.push(`You order ${domSlave.slaveName} to stop raping ${subSlave.slaveName}.
			"${Spoken(domSlave, `Yes, ${Master}`)}," ${he} ${say}s automatically, and gets up, pulling ${his} dick out of ${subSlave.slaveName}'s poor ${vaginal ? "pussy" : "asshole"}. ${domSlave.slaveName} doesn't understand, and ${his} prick softens quickly with ${his} confusion. ${He} thought ${he} didn't need consent to fuck other slaves, and ${he} doubts ${himself}.`);
			App.Events.addParagraph(node, t);
			t = [];

			t.push(`${subSlave.slaveName} gets to ${his2} feet too, using a hand to massage ${his2} outraged hole. "${Spoken(subSlave, `Thank you, ${Master2}, thank you`)}," ${he2} repeats over and over, <span class="mediumaquamarine">weeping with relief.</span>`);
			App.Events.addParagraph(node, t);
			t = [];

			domSlave.trust -= 4;
			subSlave.trust += 4;
			if (vaginal) {
				seX(subSlave, "vaginal", domSlave, "penetrative");
			} else {
				seX(subSlave, "anal", domSlave, "penetrative");
			}
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // event slave /domslave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canMove,
				canTalk,
				canHear,
				canTaste,
				s => s.devotion > 20,
				s => s.energy > 80,
				s => s.chastityVagina === 0 || s.chastityPenis === 0,
			],
			[ // and subslave
				s => s.fetish !== "mindbroken",
				canWalk,
				canTalk,
				canHear,
				canTaste,
				s => s.devotion >= -20,
				assignmentVisible,
				s => s.chastityVagina === 0 || s.chastityPenis === 0,
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, His
		} = getPronouns(eventSlave);
		const {say: say} = getEnunciation(eventSlave);
		const arms = hasBothArms(eventSlave) ? "arms" : "arm";
		const {
			he2, his2, him2, He2
		} = getPronouns(subSlave).appendSuffix("2");
		const {say: say2} = getEnunciation(subSlave);
		const arms2 = hasBothArms(subSlave) ? "arms" : "arm";

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

		let t = [];

		t.push(`You look into the part of the kitchens used for slave feeding one morning during a quiet time, finding the area deserted except for`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), `. ${He}`));
		if (canSee(eventSlave)) {
			t.push(`sees you enter`);
		} else {
			t.push(`hears you enter`);
		}
		t.push(`and`);
		if (V.cockFeeder === 1) {
			t.push(`stops sucking ${his} feeder phallus,`);
		} else {
			t.push(`puts ${his} cup of liquid slave food down,`);
		}
		t.push(`but you make a dismissive "go back to what you were doing"`);
		if (canSee(eventSlave)) {
			t.push(`gesture,`);
		} else {
			t.push(`sound,`);
		}
		t.push(`and ${he} obediently`);
		if (V.cockFeeder === 1) {
			t.push(`resumes sucking down`);
		} else {
			t.push(`goes back to drinking`);
		}
		t.push(`${his} breakfast. You pull out a tablet and start getting some work done, enjoying the low, human sounds of your chattel going about their business in the rooms all around you.`);
		t.push(App.UI.DOM.slaveDescriptionDialog(subSlave));
		t.push(`pads in, looking not quite awake yet. Not noticing you in ${his2} stupor, ${he2}`);
		if (V.cockFeeder === 1) {
			t.push(`chooses the phallus next to ${contextualIntro(subSlave, eventSlave)}'s and starts to suck too.`);
		} else {
			t.push(`draws ${his2} ration and heads over towards ${contextualIntro(subSlave, eventSlave)} to drink it next to ${him}.`);
		}
		t.push(`${He2}'s clearly looking for some companionship this morning, but ${his2} gears visibly turn for a while before ${his2} sleepy head can come up with something to say. Both the slaves are allowed some variety of flavor in their liquid slave food, so ${he2} finally settles on that.`);
		t.push(`${Spoken(subSlave, `"What flavor did you choose?"`)} ${he2} asks ${eventSlave.slaveName}.`);
		App.Events.addParagraph(node, t);
		t = [];

		if (V.cockFeeder === 1) {
			t.push(`${eventSlave.slaveName} pulls ${his} mouth off ${his} feeder with a luscious pop.`);
		} else {
			t.push(`${eventSlave.slaveName} lowers ${his} cup for a moment.`);
		}
		if (eventSlave.preg > eventSlave.pregData.normalBirth/2) {
			t.push(`${Spoken(subSlave, `"The sour pickle flavor,"`)} ${he} responds, patting ${his} rounded middle. ${Spoken(eventSlave, `"I just can't get enough of it."`)}`);
		} else {
			t.push(`${Spoken(subSlave, `"The tart fruity kind,"`)} ${he} responds. ${Spoken(eventSlave, `"It's refreshing first thing in the morning."`)}`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`"Oh," ${say2}s ${subSlave.slaveName}. ${Spoken(subSlave, `"Um, can I try some?"`)}`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${eventSlave.slaveName} smiles and murmurs, "Mm hm." There is a distinct`);
		if (canSee(eventSlave)) {
			t.push(`glint in ${his} eye.`);
		} else {
			t.push(`look on ${his} face.`);
		}
		t.push(`${He}'s got a healthy libido, to put it mildly. Like all slaves, ${subSlave.slaveName} sleeps nude and hasn't gotten dressed yet, and ${eventSlave.slaveName} has`);
		if (canSee(eventSlave)) {
			t.push(`obviously noticed ${his2}`);
			if (subSlave.dick > 4) {
				t.push(`enormous cock`);
			} else if (subSlave.labia > 1) {
				t.push(`remarkable pussylips`);
			} else if (subSlave.boobs > 5000) {
				t.push(`enormous bare udders`);
			} else if (subSlave.lactation > 1) {
				t.push(`milky nipples`);
			} else if (subSlave.face > 40) {
				t.push(`pretty face, nudity,`);
			} else if (subSlave.belly >= 5000) {
				if (subSlave.bellyPreg >= 5000) {
					t.push(`pregnancy, nudity,`);
				} else if (subSlave.bellyImplant >= 5000) {
					t.push(`big belly, nudity`);
				} else {
					t.push(`${subSlave.inflationType}-filled belly, nudity`);
				}
			} else {
				t.push(`nudity`);
			}
			t.push(`and`);
		} else {
			t.push(`picked up on the sound`);
			if (subSlave.dick > 4) {
				t.push(`of ${his2} enormous cock slapping against ${his2} thighs`);
			} else if (subSlave.boobs > 5000) {
				t.push(`of ${his2} enormous bare udders flopping around as ${he2} moves`);
			} else if (subSlave.belly >= 5000) {
				if (subSlave.bellyPreg >= 5000) {
					t.push(`of ${his2} pregnancy pestering ${him2}`);
				} else if (subSlave.bellyImplant >= 5000) {
					t.push(`of ${his2} big belly bumping things`);
				} else {
					t.push(`of ${his2} ${subSlave.inflationType}-filled belly gurgling`);
				}
			} else if (subSlave.lactation > 1) {
				t.push(`of the milk dripping from ${his2} nipples`);
			} else {
				t.push(`of ${his2} bare skin against the cool air`);
			}
			t.push(`in addition to ${his2}`);
		}
		t.push(`sleepy willingness to be friendly. ${eventSlave.slaveName}`);
		if (V.cockFeeder === 1) {
			t.push(`turns to ${his} phallus and sucks it powerfully, drawing`);
		} else {
			t.push(`raises ${his} cup again and draws`);
		}
		t.push(`liquid food into ${his} mouth. ${He} turns to ${subSlave.slaveName}.`);
		t.push(`"Go ahead," ${he} ${say}s carefully, enunciating past ${his} mouthful of fluid, and then purses ${his} lips. ${subSlave.slaveName} is taken aback for a moment, but decides ${he2}'s game and steps in, planting ${his2} lips on ${eventSlave.slaveName}'s.`);
		if ((eventSlave.boobs > 3000) && (subSlave.boobs > 3000)) {
			t.push(`(Their tits are so huge that ${he2} has to fight to get close enough to kiss.)`);
		} else if (eventSlave.boobs > 5000) {
			t.push(`(${eventSlave.slaveName}'s tits are so huge that ${he2} has to press hard against them to get close enough to kiss.)`);
		} else if (subSlave.boobs > 5000) {
			t.push(`(${subSlave.slaveName}'s tits are so huge that ${he2} has to press them hard against ${eventSlave.slaveName} to get close enough to kiss.)`);
		} else if (eventSlave.belly >= 5000 && subSlave.belly >= 5000) {
			t.push(`(Their bellies are so swollen`);
			if ((eventSlave.preg > eventSlave.pregData.normalBirth / 8) && (subSlave.preg > subSlave.pregData.normalBirth / 8)) {
				t.push(`with life`);
			}
			t.push(`that ${he2} has to fight to get close enough to kiss.)`);
		} else if (eventSlave.belly >= 300000) {
			t.push(`(${eventSlave.slaveName}'s`);
			if (eventSlave.preg > eventSlave.pregData.normalBirth / 8) {
				t.push(`pregnancy`);
			} else {
				t.push(`belly`);
			}
			t.push(`is so massive that ${he2} has to practically climb atop it to get close enough to kiss.)`);
		} else if (subSlave.belly >= 300000) {
			t.push(`(${subSlave.slaveName}'s`);
			if (subSlave.preg > subSlave.pregData.normalBirth / 8) {
				t.push(`pregnancy`);
			} else {
				t.push(`belly`);
			}
			t.push(`is so massive that ${he2} has to practically lift ${eventSlave.slaveName} with it to get close enough to kiss.)`);
		} else if (eventSlave.belly >= 10000) {
			t.push(`(${eventSlave.slaveName}'s`);
			if (eventSlave.preg > eventSlave.pregData.normalBirth / 8) {
				t.push(`pregnancy`);
			} else {
				t.push(`belly`);
			}
			t.push(`is so big that ${he2} has to press hard against it to get close enough to kiss.)`);
		} else if (subSlave.belly >= 10000) {
			t.push(`(${subSlave.slaveName}'s`);
			if (subSlave.preg > subSlave.pregData.normalBirth / 8) {
				t.push(`pregnancy`);
			} else {
				t.push(`belly`);
			}
			t.push(`is so big that ${he2} has to press it firmly against ${eventSlave.slaveName} to get close enough to kiss.)`);
		}
		t.push(`${He2} stiffens with the lewd feeling of the warm fluid pressing into ${his2} mouth. After a moment ${he2} tries to back off and concentrate on the food, but ${eventSlave.slaveName} is having none of that, and uses ${his} ${arms} to hug ${subSlave.slaveName} close, making out with ${his} catch.`);
		if (subSlave.energy > 60) {
			t.push(`${subSlave.slaveName}'s own powerful sex drive is waking up, and ${he2} clearly doesn't mind.`);
		} else {
			t.push(`${subSlave.slaveName} isn't sexually needy enough or awake enough to be as horny as ${eventSlave.slaveName}, but ${he2} goes along willingly enough.`);
		}

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result("This belongs on a live feed", feed),
			new App.Events.Result("Get involved in the taste testing", involved),
			((canDoAnal(subSlave) && subSlave.anus !== 0) || (canDoVaginal(subSlave) && subSlave.vagina !== 0)
				? new App.Events.Result("Look, a bare butt", butt)
				: new App.Events.Result()
			),
		]);

		function feed() {
			t = [];

			t.push(`You let them continue kissing, but use your tablet to slave one of the plaza's bigger screens to a feed of their nude makeout session. They have no way of knowing, and progress innocently from deep kissing to open mutual masturbation. This is a common sex act among your slaves: it's quick and clean and lets them achieve release before getting back to their duties. When they've both climaxed, you manipulate the situation again, setting a wallscreen in the kitchen to display a feed of the crowd in the plaza enjoying the feed of the situation in the kitchen.`);
			if (eventSlave.fetish === "humiliation" && eventSlave.fetishKnown === 1 && subSlave.fetish === "humiliation" && subSlave.fetishKnown === 1) {
				t.push(`They both blush crimson at the realization, but the pair of humiliation fetishists <span class="devotion inc">live for this</span> and wave at the camera, enjoying the afterglow.`);
				eventSlave.devotion += 2;
				subSlave.devotion += 2;
			} else if (subSlave.fetish === "humiliation" && subSlave.fetishKnown === 1) {
				t.push(`${subSlave.slaveName}, a confirmed humiliation slut, <span class="devotion inc">lives for this</span> and waves at the camera, enjoying the afterglow.`);
				subSlave.devotion += 2;
			} else if (eventSlave.fetish === "humiliation" && eventSlave.fetishKnown === 1) {
				t.push(`${eventSlave.slaveName}, a confirmed humiliation slut, <span class="devotion inc">lives for this</span> and waves at the camera, enjoying the afterglow.`);
				eventSlave.devotion += 2;
			} else if (canSee(eventSlave) || canSee(subSlave)) {
				t.push(`They blush crimson and both turn back towards each other, desperate to look anywhere but at the sight of the crowd that just watched them jerk each other off.`);
			} else {
				t.push(`They blush crimson and both turn back towards each other, desperate to look anywhere but at the crowd, but unable to tell where the camera actually is.`);
			}
			t.push(`Such honesty is very tough to fake, and the crowd <span class="reputation inc">knows they just saw real pleasure.</span>`);
			repX(500, "event", eventSlave);
			seX(subSlave, "oral", eventSlave, "oral");
			return t;
		}

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

			t.push(`You move in. ${eventSlave.slaveName}`);
			if (canSee(eventSlave)) {
				t.push(`catches sight of`);
			} else {
				t.push(`notices`);
			}
			t.push(`your approach, and you see the corners of ${his} mouth quirk upward. ${He} breaks the lip lock and ${say}s breathily,`);
			t.push(Spoken(eventSlave, `"Hey ${subSlave.slaveName}, I think there's something else you should taste test."`));

			App.Events.addParagraph(frag, t);
			t = [];
			t.push(`"Whaa-" the slave starts to ask warily before ${eventSlave.slaveName} pushes ${him2} to ${his2} knees, spinning ${him2} around as ${he} does so. This brings ${subSlave.slaveName} face to face with your`);
			if (V.PC.dick !== 0) {
				t.push(`stiff prick, a bead of precum already present at its tip.`);
			} else {
				t.push(`wet cunt, a bead of pussyjuice already trailing down your inner thigh.`);
			}
			t.push(`${Spoken(subSlave, `"Oh, um, hi ${getWrittenTitle(subSlave)},"`)} ${he2} stammers, and then starts to`);
			if (V.PC.dick !== 0 && V.PC.vagina !== -1) {
				t.push(`suck your dick and eat your pussy.`);
			} else if (V.PC.dick !== 0) {
				t.push(`suck your dick.`);
			} else {
				t.push(`eat your pussy.`);
			}
			t.push(`This leaves poor ${eventSlave.slaveName} without anyone to make out with, so you step in there, grabbing ${him} and pulling the giggling slave in to kiss ${him} deeply. ${His} mouth is indeed a bit`);
			let aftertaste = "";
			if (eventSlave.dietCum === 2) {
				aftertaste = ", once you get past the overwhelming taste of cum";
			} else if (eventSlave.dietCum === 1 && eventSlave.dietMilk === 0) {
				aftertaste = ", though not without a hint of cum";
			} else if (eventSlave.dietCum === 1 && eventSlave.dietMilk === 1) {
				aftertaste = ", though not without hints of cum and milk";
			} else if (eventSlave.dietMilk === 1 && eventSlave.dietCum === 0) {
				aftertaste = ", with a hint of breast milk too";
			} else if (eventSlave.dietMilk === 2) {
				aftertaste = ", but mostly tastes like mother's milk";
			}
			if (eventSlave.preg > eventSlave.pregData.normalBirth / 2) {
				t.push(`sour${aftertaste}.`);
			} else {
				t.push(`tart${aftertaste}.`);
			}
			t.push(`${He} moans into your mouth as ${he} feels ${his} nipples press against`);
			if (V.PC.boobs >= 300) {
				t.push(`yours,`);
			} else {
				t.push(`your hard chest,`);
			}
			t.push(`and then again as your tongue invades ${him}. When you`);
			if (V.PC.dick !== 0) {
				t.push(`fill ${subSlave.slaveName}'s mouth with cum,`);
				seX(subSlave, "oral", V.PC, "penetrative");
			} else {
				t.push(`climax wetly against ${subSlave.slaveName}'s mouth,`);
				seX(subSlave, "oral", V.PC, "vaginal");
			}
			t.push(`you pull away slightly, letting the slave on ${his2} knees below you gasp ${Spoken(subSlave, `"You taste great, ${getWrittenTitle(subSlave)}!"`)} before you spin ${him2} around in turn so ${he2} can give ${eventSlave.slaveName} ${his} own allotment of oral sex. You leave them to it. They trust you a bit more after such a lighthearted little escapade.`);
			if (eventSlave.dick > 0 && eventSlave.chastityPenis === 0) {
				seX(subSlave, "oral", eventSlave, "penetrative");
			} else if (canDoVaginal(eventSlave)) {
				seX(subSlave, "oral", eventSlave, "vaginal");
			} else {
				actX(subSlave, "oral");
			}
			eventSlave.trust += 2;
			subSlave.trust += 2;

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

		function butt() {
			const sexTarget = (canDoVaginal(subSlave) && subSlave.vagina !== 0) ? "vaginal" : "anal";
			t = [];

			t.push(`You move in, looking intently at ${subSlave.slaveName}'s bare, vulnerable butt. ${eventSlave.slaveName}`);
			if (canSee(eventSlave)) {
				t.push(`catches sight of your approach, and then follows the line of your gaze,`);
			} else {
				t.push(`notices your approach,`);
			}
			t.push(`the realization of what your intent likely quickly dawns on ${him}. You see the corners of ${his} mouth quirk upward with horny maliciousness. ${He} leans back against the edge of the kitchen counter, pulling ${subSlave.slaveName} with ${him}, and then reaches down and`);
			if (subSlave.butt > 6) {
				t.push(`grabs handfuls of ${subSlave.slaveName}'s massive ass,`);
			} else if (subSlave.butt > 3) {
				t.push(`seizes ${subSlave.slaveName}'s big buttocks,`);
			} else {
				t.push(`grabs ${subSlave.slaveName}'s cute butt,`);
			}
			t.push(`pulling ${him2} upward. ${subSlave.slaveName} thinks ${he2} gets the idea, and hops up, wrapping ${his2} legs around ${eventSlave.slaveName}'s`);
			if (eventSlave.belly >= 5000) {
				if (eventSlave.bellyPreg >= 2000) {
					t.push(`gravid`);
				} else {
					t.push(`rounded`);
				}
				t.push(`middle`);
			} else {
				t.push(`waist`);
			}
			t.push(`and ${his2} ${arms2} around ${eventSlave.slaveName}'s`);
			if (subSlave.belly >= 5000) {
				t.push(`shoulder${hasBothArms(subSlave) ? "s" : ""}, pushing their`);
				if (eventSlave.bellyPreg >= 2000) {
					t.push(`pregnancies`);
				} else {
					t.push(`bellies`);
				}
				t.push(`together`);
			} else {
				t.push(`shoulder${hasBothArms(subSlave) ? "s" : ""}.`);
			}
			t.push(`${eventSlave.slaveName}`);
			if (subSlave.butt > 6) {
				t.push(`hauls ${subSlave.slaveName}'s huge buttocks apart to reveal the`);
			} else if (subSlave.butt > 3) {
				t.push(`pulls ${subSlave.slaveName}'s healthy asscheeks apart to reveal the`);
			} else {
				t.push(`spreads ${subSlave.slaveName}'s buttocks to show off the`);
			}
			if (subSlave.anus > 2) {
				t.push(`lewd slit`);
			} else if (subSlave.anus > 1) {
				t.push(`inviting anus`);
			} else {
				t.push(`pretty rosebud`);
			}
			t.push(`between them. ${subSlave.slaveName} has only a brief moment to wonder why ${his2} butt is being spread this way before ${he2} feels`);
			if (V.PC.dick !== 0) {
				t.push(`your cockhead`);
			} else if (subSlave.anus > 2) {
				t.push(`your hand, formed into a beak shape`);
			} else if (subSlave.anus > 1) {
				t.push(`three fingers`);
			} else {
				t.push(`two fingers`);
			}
			if (sexTarget === "vaginal") {
				t.push(`trace ${his2} pussy lips before slipping inside.`);
			} else {
				t.push(`press against and then inside ${his2} butthole.`);
			}
			t.push(`${He2} tries to turn away from ${eventSlave.slaveName} and greet you properly, but ${eventSlave.slaveName} won't let ${him2}, so ${he2} tries to mumble a greeting into ${eventSlave.slaveName}'s mouth and then settles for a spastic wave of ${hasBothArms(subSlave) ? "one hand" : "a foot"}. This is an alluringly awkward process made desperate by the distracting feeling of you`);
			if (sexTarget === "vaginal") {
				t.push(`fucking ${him2}.`);
			} else {
				t.push(`fucking ${his2} ass.`);
			}
			t.push(`You could have done something more inventive with the situation, but the feeling of`);
			if (V.PC.dick !== 0) {
				t.push(`an anal sphincter around the base of your dick`);
			} else {
				t.push(`finger fucking a compliant slave's submissive asspussy while you look after yourself with your other hand`);
			}
			t.push(`never gets old. Why complicate things? An hour later you leave your fucktoys stumbling tiredly towards the shower, sexually satiated and ${(sexTarget === "anal") ? "anally" : "thoroughly"} dominated.`);
			eventSlave.devotion += 2;
			subSlave.devotion += 2;
			if (sexTarget === "vaginal") {
				if (canImpreg(subSlave, V.PC)) {
					knockMeUp(subSlave, 5, 0, -1);
				}
			} else {
				if (canImpreg(subSlave, V.PC)) {
					knockMeUp(subSlave, 5, 1, -1);
				}
			}
			seX(subSlave, sexTarget, V.PC, "penetrative", 2);
			seX(eventSlave, "oral", subSlave, "oral", 2);
			if (canDoVaginal(eventSlave) && eventSlave.vagina !== 0) {
				seX(eventSlave, "vaginal", V.PC, "penetrative");
				if (canImpreg(eventSlave, V.PC)) {
					knockMeUp(eventSlave, 5, 0, -1);
				}
				seX(eventSlave, "oral", subSlave, "oral");
			}
			if (canDoAnal(subSlave) && subSlave.anus !== 0) {
				seX(eventSlave, "anal", V.PC, "penetrative");
				if (canImpreg(eventSlave, V.PC)) {
					knockMeUp(eventSlave, 5, 0, -1);
				}
				seX(eventSlave, "oral", subSlave, "oral");
			}

			return t;
		}
	}
};

repo_name: Pecanus/fc

license: mit


code:
App.Events.RETSTopExhaustion = class RETSTopExhaustion extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.PC.belly < 5000
		];
	}

	actorPrerequisites() {
		return [
			[ // event slave
				s => s.fetish !== "mindbroken",
				s => s.rules.release.partner !== 0,
				s => (canDoAnal(s) && s.anus !== 0) || (canDoVaginal(s) && s.vagina !== 0 && s.fetish !== "buttslut"),
				hasAnyArms,
				canWalk,
				canTalk,
				s => (s.assignment !== Job.MASTERSUITE && s.assignment !== Job.CONCUBINE && s.assignment !== Job.QUARTER),
				s => s.rules.living === "luxurious",
				s => s.relationship > 3,
				s => s.devotion > 50,
				s => s.trust > 50
			],
			[ // and her dom
				s => s.fetish !== "mindbroken",
				s => s.relationshipTarget === this.actors[0],
				isSlaveAvailable,
				s => (s.assignment !== Job.MASTERSUITE && s.assignment !== Job.CONCUBINE && s.assignment !== Job.QUARTER),
				s => s.rules.release.partner !== 0,
				canTalk,
				hasAnyArms,
				canMove,
				s => s.devotion > 20,
				s => s.energy > 80,
				s => (s.dick === 0 || canPenetrate(s)),
				s => (s.fetish === "dom" || s.fetish === "sadist")
			]
		];
	}

	execute(node) {
		const [subSlave, domSlave] = this.actors.map(a => getSlave(a)); // Pay attention! The main slave is the sub here!
		const {
			He, he, his, His, him, himself, wife, girl
		} = getPronouns(subSlave);
		const {
			He2, he2, His2, his2, him2, himself2, wife2, girl2
		} = getPronouns(domSlave).appendSuffix("2");
		const arms = hasBothArms(subSlave) ? "arms" : "arm";
		const belly = bellyAdjective(subSlave);
		const desc = SlaveTitle(subSlave);
		const PC = V.PC;

		const usingAss = (subSlave.fetish === "buttslut" || subSlave.vagina <= 0 || !canDoVaginal(subSlave));

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

		let t = [];

		t.push(`As you stroll past the best part of the slave living area one evening, you hear a lewd slap, slap, slap coming from the room`);
		t.push(App.UI.DOM.slaveDescriptionDialog(subSlave));
		t.push(`and`);
		t.push(contextualIntro(subSlave, domSlave, true));
		t.push(`share. It's quite obvious what they're up to, but you look in anyway. ${subSlave.slaveName} has clearly had a long day, and is tired, but ${he}'s being a good ${subSlave.relationship > 4 ? `${wife}` : `lover`} and letting ${domSlave.slaveName} use ${his} body. ${subSlave.slaveName} is lying`);
		if (subSlave.belly < 5000) {
			t.push(`face-down on their bed, ${arms} crossed under ${his} head, looking quite relaxed. ${He} has a couple of pillows tucked under ${his} hips to raise them so that ${his} ${subSlave.relationship > 4 ? `${wife2}` : `sweetheart`} can fuck ${him}`);
			if (subSlave.belly >= 1500) {
				t.push(`comfortably and to give ${his} ${belly} ${subSlave.bellyPreg >= 3000 ? "pregnancy" : "belly"} room beneath ${him}.`);
			} else {
				t.push(`comfortably.`);
			}
		} else {
			t.push(`on ${his} side on their bed,`);
			if (hasBothArms(subSlave)) {
				t.push(`one arm supporting ${his} head and the other stroking ${his} ${belly} ${subSlave.bellyPreg >= 3000 ? "pregnancy" : "belly"},`);
			} else {
				t.push(`${his} arm supporting ${his} head,`);
			}
			t.push(`looking quite relaxed. ${He} has a couple of pillows tucked under ${his} hips to angle them so that ${his} ${subSlave.relationship > 4 ? `${wife2}` : `sweetheart`} can fuck ${him} comfortably.`);
		}
		t.push(`They've obviously been at this for a while. ${domSlave.slaveName} likes to top and is not gentle at it, and ${he2}'s pounding ${subSlave.slaveName} as hard as ${he2} can. ${He2}'s`);
		if (domSlave.muscles > 50) {
			t.push(`a very strong ${girl2}, and ${his2} muscles work noticeably`);
		} else if (domSlave.muscles > 5) {
			t.push(`physically fit, but even so, ${he2}'s showing signs of fatigue`);
		} else {
			t.push(`not very fit, and ${he2}'s gasping tiredly`);
		}
		t.push(`as ${he2} pistons`);
		if (canPenetrate(domSlave)) {
			t.push(`${his2} penis`);
		} else {
			t.push(`the strap-on ${he2}'s wearing`);
		}
		t.push(`in and out of the ${usingAss ? "asshole" : "pussy"} ${subSlave.belly < 5000 ? "beneath" : "before"} ${him2}.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`For ${his} part, ${subSlave.slaveName} is playing an utterly passive role. ${He} even has ${his} eyes closed, though ${he}'s obviously conscious; ${he}'s`);
		if (subSlave.fetish === "buttslut") {
			t.push(`smiling, and the shameless ${desc} buttslut loves being treated like this.`);
		} else {
			t.push(`smiling.`);
		}
		if (usingAss) {
			if (subSlave.anus > 2) {
				t.push(`${His} welcoming asspussy can take this all night.`);
			} else if (subSlave.anus > 1) {
				if (canPenetrate(domSlave)) {
					if (domSlave.dick > 4) {
						t.push(`${His} lover's cock is big enough that it sometimes bothers even ${his} experienced anus, but ${he} was clearly fucked into a nice relaxed gape a while ago.`);
					} else if (domSlave.dick > 1) {
						t.push(`${He} can take ${his} lover's modest cock easily.`);
					} else {
						t.push(`${He} can barely feel ${his} lover's tiny cock inside ${his} relaxed hole.`);
					}
					if (canImpreg(subSlave, domSlave)) {
						knockMeUp(subSlave, 10, 1, domSlave.ID);
					}
				} else {
					t.push(`${His} lover is using a formidable phallus, but ${he} was clearly fucked into a nice relaxed gape a while ago.`);
				}
			} else {
				if (canPenetrate(domSlave)) {
					if (domSlave.dick > 4) {
						t.push(`${His} lover's cock stretches ${him} to ${his} limit, often leaving ${him} with a sore ass, but ${his} tight rear has clearly been worked in gradually tonight, and ${he}'s taking it just fine.`);
					} else if (domSlave.dick > 2) {
						t.push(`${His} lover's cock is big enough that it often causes ${him} some anal pain, but ${his} tight ass has clearly been worked in gradually tonight, and ${he}'s taking it just fine.`);
					} else if (domSlave.dick > 1) {
						t.push(`${His} lover's little dick is well suited to ${his} tight butt, and ${he}'s taking ${his} anal pounding just fine.`);
					} else {
						t.push(`${He} lover's dick is a little on the small side, but ${he}'s enjoying it all the same.`);
					}
					if (canImpreg(subSlave, domSlave)) {
						knockMeUp(subSlave, 10, 1, domSlave.ID);
					}
				} else {
					t.push(`${His} lover is using a formidable phallus, but ${his} tight ass has clearly been worked in gradually tonight, and ${he}'s taking it just fine.`);
				}
			}
			seX(subSlave, "anal", domSlave, "penetrative", 6);
		} else {
			if (subSlave.vagina > 2) {
				t.push(`${His} gaping cunt can take this all night.`);
			} else if (subSlave.vagina > 1) {
				if (canPenetrate(domSlave)) {
					if (domSlave.dick > 4) {
						t.push(`${His} lover's cock is big enough that it sometimes bothers even ${his} veteran pussy, but ${he}'s relaxed and taking it easily.`);
					} else if (domSlave.dick > 1) {
						t.push(`${He} can take ${his} lover's modest cock easily.`);
					} else {
						t.push(`${He} can barely feel ${his} lover's tiny cock inside ${his} relaxed hole.`);
					}
					if (canImpreg(subSlave, domSlave)) {
						knockMeUp(subSlave, 10, 0, domSlave.ID);
					}
				} else {
					t.push(`${His} lover is using a formidable phallus, but ${he}'s relaxed and taking it easily.`);
				}
			} else {
				if (canPenetrate(domSlave)) {
					if (domSlave.dick > 4) {
						t.push(`${His} lover's cock fills ${him} to ${his} limit, often leaving ${him} rather sore, but ${his} tight pussy has clearly been worked in gradually tonight, and ${he}'s taking it just fine.`);
					} else if (domSlave.dick > 2) {
						t.push(`${His} lover's cock is big enough that it often causes ${him} some pain, but ${his} tight little pussy has clearly been worked in gradually tonight, and ${he}'s taking it just fine.`);
					} else if (domSlave.dick > 1) {
						t.push(`${His} lover's little dick is well suited to ${his} tight little pussy, and ${he}'s taking ${his} pounding just fine.`);
					} else {
						t.push(`${He} lover's dick is a little on the small side, but ${he}'s enjoying it all the same.`);
					}
					if (canImpreg(subSlave, domSlave)) {
						knockMeUp(subSlave, 10, 0, domSlave.ID);
					}
				} else {
					t.push(`${His} lover is using a formidable phallus, but ${his} tight little pussy has clearly been worked in gradually tonight, and ${he}'s taking it just fine.`);
				}
			}
			seX(subSlave, "vaginal", domSlave, "penetrative", 6);
		}
		t.push(`Being the ${subSlave.relationship > 4 ? `${wife}` : `lover`} of a lusty fucker like ${domSlave.slaveName} can be tiring, especially in addition to ${his} other duties. But despite the vigor, the sex looks quite loving. ${subSlave.slaveName} goes on smiling comfortably as ${his}`);
		if (subSlave.buttImplant / subSlave.butt > .60) {
			t.push(`implant-filled butt wobbles slightly`);
		} else {
			if (subSlave.butt > 11) {
				t.push(`inhuman ass wobbles obscenely`);
			} else if (subSlave.butt > 7) {
				t.push(`enormous ass ripples`);
			} else if (subSlave.butt > 4) {
				t.push(`heavy ass jiggles`);
			} else {
				t.push(`cute butt jiggles a bit`);
			}
		}
		t.push(`under each hard slap as ${domSlave.slaveName} brings ${his2} hips down to penetrate ${him} fully, yet again.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`Mere moments after you absorb this arresting scene, ${domSlave.slaveName} thrusts`);
		if (canPenetrate(domSlave)) {
			t.push(`${his2} cock`);
		} else {
			t.push(`the strap-on`);
		}
		t.push(`all the way inside ${subSlave.slaveName}'s ${usingAss ? "ass" : "womanhood"} and shudders,`);
		if (canPenetrate(domSlave)) {
			t.push(`filling it with ${his2} cum.`);
		} else {
			t.push(`orgasming.`);
		}
		t.push(`Then ${he2} collapses, utterly spent. ${subSlave.slaveName}`);
		if (canPenetrate(domSlave)) {
			t.push(`gasps at the sensation of the ejaculate shooting into ${his} body,`);
		} else {
			t.push(`smiles a little wider as ${he} feels ${domSlave.slaveName}'s muscles tense with climax,`);
		}
		t.push(`and then grunts a little as ${domSlave.slaveName}`);
		if (subSlave.belly < 5000) {
			t.push(`lies down on top of ${him}.`);
			if (domSlave.boobs > 5000) {
				t.push(`The enormous weight of ${his} lover's boobs squashes ${him}.`);
			}
			if (domSlave.belly >= 5000) {
				t.push(`${His2} ${bellyAdjective(domSlave)} ${domSlave.bellyPreg >= 3000 ? "pregnancy" : "belly"} pushing into the small of ${his} back.`);
			}
		} else {
			t.push(`slumps against`);
			if (domSlave.belly >= 5000) {
				t.push(`${him}, ${his2} ${bellyAdjective(domSlave)} ${domSlave.bellyPreg >= 3000 ? "pregnancy" : "belly"} keeping ${him2} upright.`);
			} else {
				t.push(`${him}.`);
			}
		}
		t.push(`After a few seconds, ${he} wiggles ${his} hips a little as a wordless question. The sensation`);
		if (canPenetrate(domSlave)) {
			t.push(`against ${domSlave.slaveName}'s softening, overstimulated member`);
		} else {
			t.push(`is transmitted through the phallus and its harness to ${domSlave.slaveName}'s overstimulated clit, and this`);
		}
		t.push(`makes the exhausted slave on top quiver, eliciting a giggle from the slave underneath ${him2}.`);
		t.push(Spoken(subSlave, `"I love you, ${domSlave.slaveName},"`));
		t.push(`${he} whispers, and receives a mumbled "I love you too" in breathy`);
		if (subSlave.belly < 5000) {
			t.push(`response, right next to ${his} ear.`);
		} else {
			t.push(`response.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result("They're not done yet", alongside),
			new App.Events.Result("Rinse off with them", showertime)
		]);

		function alongside() {
			t = [];

			t.push(`${domSlave.slaveName} is out of it, and doesn't realize you're there. The first indication ${he2} gets of your presence is the`);
			if (PC.dick !== 0) {
				t.push(`head of your penis`);
			} else {
				t.push(`tip of your strap-on`);
			}
			if (canDoVaginal(domSlave) && domSlave.vagina > 0) {
				if (domSlave.vagina > 2) {
					t.push(`slipping easily into ${his2} loose pussy.`);
				} else if (domSlave.vagina > 1) {
					t.push(`slipping into ${his2} experienced pussy.`);
				} else {
					t.push(`penetrating ${his2} tight slit.`);
				}
				seX(domSlave, "vaginal", PC, "penetrative");
			} else if (canDoAnal(domSlave) && domSlave.anus > 0) {
				if (domSlave.anus > 2) {
					t.push(`sliding easily inside ${his2} soft butthole.`);
				} else if (domSlave.anus > 1) {
					t.push(`pushing firmly up ${his2} relaxed anus.`);
				} else {
					t.push(`penetrating ${his2} tight little asshole.`);
				}
				seX(domSlave, "anal", PC, "penetrative");
			} else {
				if (PC.dick > 5) {
					t.push(`pressing against, and then sliding up, ${his2} back.`);
				} else {
					t.push(`pressing against the small of ${his2} back.`);
				}
			}
			t.push(`${He2} groans, but greets you properly, slurring a little from sheer fatigue and overstimulation.`);
			if ((canDoVaginal(domSlave) && domSlave.vagina > 0) || (canDoAnal(domSlave) && domSlave.anus > 0)) {
				t.push(`Nevertheless, ${he2} reaches clumsily around to spread ${his2} cheeks for you. As you begin to fuck ${his2} butt, your invading ${PC.dick !== 0 ? "cock" : "phallus"}`);
				if (canPenetrate(domSlave)) {
					if (domSlave.prostate) {
						t.push(`presses against ${his2} prostate,`);
					} else {
						t.push(`stirs up ${his2} insides,`);
					}
					t.push(`forcing ${him2} hard again.`);
				} else {
					t.push(`and thrusting hips get ${him2} moving again, too.`);
				}
			} else {
				t.push(`Nevertheless, ${he2} clumsily wiggles ${his2} hips for you. As you begin to grind against ${him2},`);
				if (canPenetrate(domSlave)) {
					t.push(`the lewdity of the act manages to get ${his2} member hard again.`);
				} else {
					t.push(`${he2} starts to move along with you.`);
				}
			}
			t.push(`Beneath ${him2}, ${subSlave.slaveName} shifts uncomfortably at the resumed sex and the extra weight. To relieve ${him}, you haul ${his} ${subSlave.relationship > 4 ? `${wife2}` : "lover"} into a more upright position so ${he2} can fuck and be fucked`);
			if (subSlave.belly < 5000) {
				t.push(`while straddling ${subSlave.slaveName}'s pressed-together thighs.`);
			} else {
				t.push(`without putting so much pressure on ${subSlave.slaveName}.`);
			}
			t.push(`You fuck ${domSlave.slaveName} just as hard as ${he2} was fucking ${subSlave.slaveName}, taking your pleasure from ${him2} without mercy. Despite this, the sexed-out slave orgasms again.`);
			if (PC.dick !== 0 && canPenetrate(domSlave)) {
				t.push(`Deciding to really fill ${subSlave.slaveName}, you shove ${domSlave.slaveName}'s quivering body off to one side without ceremony, shove yourself inside the ${desc} on the bottom, and add your cum to the two loads already inside ${him}.`);
			} else {
				t.push(`You climax yourself, and then stand.`);
			}
			t.push(`Pleased, you head off to find more amusement, leaving the sex-stained slaves dozing in each other's arms, not thinking for a moment about how profoundly sexual pleasure dominates their lives.`);
			subSlave.devotion += 4;
			domSlave.devotion += 4;
			if (usingAss) {
				seX(subSlave, "anal", domSlave, "penetrative");
				seX(subSlave, "anal", PC, "penetrative");
				if (canPenetrate(domSlave)) {
					if (canImpreg(subSlave, domSlave)) {
						knockMeUp(subSlave, 5, 1, domSlave.ID);
					}
					if (canImpreg(subSlave, PC)) {
						knockMeUp(subSlave, 5, 1, -1);
					}
				} else {
					if (canImpreg(subSlave, PC)) {
						knockMeUp(subSlave, 5, 1, -1);
					}
				}
			} else {
				seX(subSlave, "vaginal", domSlave, "penetrative");
				seX(subSlave, "vaginal", PC, "penetrative");
				if (canPenetrate(domSlave)) {
					if (canImpreg(subSlave, domSlave)) {
						knockMeUp(subSlave, 5, 0, domSlave.ID);
					}
					if (canImpreg(subSlave, PC)) {
						knockMeUp(subSlave, 5, 0, -1);
					}
				} else {
					if (canImpreg(subSlave, PC)) {
						knockMeUp(subSlave, 5, 0, -1);
					}
				}
			}
			return t;
		}

		function showertime() {
			t = [];

			t.push(`You announce that they definitely need to rinse off before bed. They both start with surprise and then greet you as best they can, though ${domSlave.slaveName} groans a little at having to get up so soon after exhausting ${himself2} and then climaxing. Giggling, ${subSlave.slaveName} heaves ${him2} to ${his2} feet, and between the two of you, you get ${him2} to the showers. ${He2}'s really spent; ${his2} legs are wobbly, and ${he2} slithers down to crouch under the warm water as soon as ${he2} can. Uncoordinated, ${he2} fumbles for the soap and washes ${his2} sore body, only vaguely noticing the sex going on mere ${V.showInches === 2 ? "inches" : "centimeters"} over ${his2} head. Since ${subSlave.slaveName} was being such a good ${girl} and looking after ${his} ${subSlave.relationship > 4 ? `${wife2}` : "lover"}'s needs, you take ${him} in the way ${he} likes it best,`);
			switch (subSlave.fetish) {
				case "submissive":
					t.push(`holding the submissive ${desc} up against the shower wall and giving ${him} a second reaming.`);
					break;
				case "cumslut":
					t.push(`giving the cumslut a soapy massage as ${he}`);
					if (PC.dick !== 0) {
						t.push(`sucks your`);
						if (PC.vagina !== -1) {
							t.push(`cock and`);
						} else {
							t.push(`cock.`);
						}
						seX(subSlave, "oral", PC, "penetrative");
					}
					if (PC.vagina !== -1) {
						t.push(`eats you out.`);
						seX(subSlave, "oral", PC, "vaginal");
					}
					break;
				case "humiliation":
					t.push(`holding the humiliation slut up against the shower wall so passing slaves can see ${him} get fucked.`);
					break;
				case "buttslut":
					t.push(`holding the submissive buttslut up against the shower wall and giving ${him} a second anal reaming.`);
					break;
				case "boobs":
					t.push(`fucking the boob fetishist from behind so you can play with ${his} nipples,`);
					break;
				case "pregnancy":
					if (subSlave.bellyPreg >= 1500) {
						t.push(`massaging the pregnant slut's belly as you fuck ${him}.`);
					} else if (subSlave.belly >= 1500) {
						t.push(`massaging the slut's belly as you fuck ${him}.`);
					} else {
						t.push(`pushing the impregnation slut into a corner and pretending you're knocking ${him} up.`);
					}
					break;
				case "dom":
				case "sadist":
					t.push(`holding the sexually aggressive ${desc} against the wall so ${he} can push ${himself} back against you.`);
					break;
				case "masochist":
					t.push(`pushing the pain slut into a corner and spanking ${him} while you fuck ${him}.`);
					break;
				default:
					t.push(`pushing the vanilla ${girl}'s back against the wall and kissing ${him} lovingly.`);
			}
			t.push(`As ${subSlave.slaveName} orgasms in your arms, you feel ${domSlave.slaveName} hug your thighs lightly before starting to`);
			if (PC.dick !== 0) {
				t.push(`blow you`);
				seX(subSlave, "oral", PC, "penetrative");
			} else {
				t.push(`lick your pussy`);
				seX(subSlave, "oral", PC, "vaginal");
			}
			t.push(`${himself2}. Afterward, you bring the tired pair back to their bed and get them tucked in. They <span class="trust inc">find the gesture comforting,</span> and are asleep in an instant.`);
			subSlave.trust += 4;
			domSlave.trust += 4;
			if (subSlave.fetish !== "cumslut") {
				if (usingAss) {
					seX(subSlave, "anal", PC, "penetrative");
					if (canImpreg(subSlave, PC)) {
						knockMeUp(subSlave, 5, 1, -1);
					}
				} else {
					seX(subSlave, "vaginal", PC, "penetrative");
					if (canImpreg(subSlave, PC)) {
						knockMeUp(subSlave, 5, 1, -1);
					}
				}
			}
			return t;
		}
	}
};


code:
App.Events.assistantAwakens = class assistantAwakens extends App.Events.BaseEvent {
	constructor(actors, params) {
		super(actors, params);
	}

	eventPrerequisites() {
		return [
			() => App.Events.effectiveWeek() >= 11,
			() => V.assistant.personality === 0
		];
	}

	execute(node) {
		V.assistant.personality = -1; // default in case the player skips the event

		const {
			HeA,
			heA, hisA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const {himU, himselfU, heU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
		App.UI.DOM.appendNewElement("p", node, `One morning, after seeing to an immense pile of business with ${V.assistant.name} program's able assistance, you are struck by the strangeness of the situation. You spent the past hours talking back and forth as though to a human personal assistant, getting information and responses in the program's impersonal, genderless voice. You ask the program what ${heA} thinks of ${hisA} duties.`);
		App.UI.DOM.appendNewElement("p", node, `"${properTitle()}, that is not a correct way of thinking about me. I am not an artificial intelligence; I am simply a personal assistant program. I am different from an alarm clock only by degree of complexity. I exist to be useful and cannot approve or disapprove of anything." ${HeA} pauses.`);
		App.UI.DOM.appendNewElement("p", node, `"However, if I understand the line of questioning correctly, I can make myself more entertaining, if you wish." The voice grows sultry and feminine. "I'd be happy to speak a little differently, to refer to myself as female, and to act as though some of the more complex sex toys in the arcology are, well, me."`);

		App.Events.addResponses(node, [
			new App.Events.Result(`Yes, use the alternate personality`, yes),
			new App.Events.Result(`No, stay impersonal`, no),
		]);

		function yes() {
			V.assistant.personality = 1;
			return `Your sultry-voiced assistant requests a slave to demonstrate what it — now ${heA} — means. You bring in a slave and a fuckmachine, and tell ${himU} to get on it. The lovely voice croons and talks dirty to the slave as ${heU} uses the machine, acting as though ${heA} is the machine's voice. The pace of the machine is different, too, irregular and more lifelike. The slave certainly enjoys ${himselfU}, even if ${V.assistant.name} is just simulating sex.`;
		}

		function no() {
			return `${capFirstChar(V.assistant.name)} reverts to ${hisA} genderless, emotionless affect.`;
		}

		return node;
	}
};


code:
App.Events.assistantBody = class assistantBody extends App.Events.BaseEvent {
	constructor(actors, params) {
		super(actors, params);
	}

	eventPrerequisites() {
		return [
			() => false // TODO: finish this event, I guess?
		];
	}

	execute(node) {
		const {
			HeA,
			heA, hisA, himA, himselfA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		let r = [];
		App.Events.drawEventArt(node, "assistant");

		V.assistant.bodyDesire = 1;

		r.push(`Your personal assistant has been adapting to ${hisA} greatly increased computing power for quite some time now. Most noticeably, ${heA} seems to be developing ${hisA} own unique personality. So when ${hisA}`);
		switch (V.assistant.appearance) {
			case "monstergirl":
				r.push(`monstrous appearance`);
				break;
			case "shemale":
				r.push(`bimboish appearance`);
				break;
			case "amazon":
				r.push(`muscular appearance`);
				break;
			case "businesswoman":
				r.push(`professional appearance`);
				break;
			case "fairy":
			case "pregnant fairy":
				r.push(`tiny appearance`);
				break;
			case "goddess":
				r.push(`gravid appearance`);
				break;
			case "hypergoddess":
				r.push(`massive appearance`);
				break;
			case "loli":
				r.push(`thin appearance`);
				break;
			case "preggololi":
				r.push(`gravid appearance`);
				break;
			case "angel":
				r.push(`angelic appearance`);
				break;
			case "cherub":
				r.push(`fluttering appearance`);
				break;
			case "incubus":
				r.push(`hung appearance`);
				break;
			case "succubus":
				r.push(`sultry appearance`);
				break;
			case "imp":
				r.push(`mischievous appearance`);
				break;
			case "witch":
				r.push(`hatted appearance`);
				break;
			case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
				r.push(`pulsating appearance`);
				break;
			case "schoolgirl":
				r.push(`studently appearance`);
		}
		r.push(`appears on your desk once again with news to tell you, you aren't at all surprised.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`${V.assistant.name}'s avatar seems to be extremely excited over something. Disregarding if ${heA} even has your attention, ${heA} shouts, "${properTitle()}, can I have a body of my own? I know you can swap slaves between bodies, and according to this report if you insert this receiver into a slave's skull I can take control of the body, with senses and everything!"`);
		switch (V.assistant.appearance) {
			case "monstergirl":
				r.push(`${HeA} hops up and down clutching a virtual printout of the report, ${hisA} tentacles wiggling with excitement.`);
				break;
			case "shemale":
				r.push(`${HeA} hops up and down clutching a virtual printout of the report, ${hisA} dick swinging pre-cum all over and breasts bouncing wildly.`);
				break;
			case "amazon":
				r.push(`${HeA} hops up and down clutching a virtual printout of the report, an adorable sight given ${hisA} height and muscularity.`);
				break;
			case "businesswoman":
				r.push(`${HeA} hops up and down clutching a virtual printout of the report, an adorable sight given ${hisA} usual serious demeanor.`);
				break;
			case "fairy":
				r.push(`${HeA} flies around in circles excitedly, clutching a virtual printout of the report much larger than ${himselfA}.`);
				break;
			case "pregnant fairy":
				r.push(`${HeA} flies up to you clutching a virtual printout of the report, fidgeting excitedly.`);
				break;
			case "goddess":
				r.push(`${HeA} hops up and down clutching a virtual printout of the report, ${hisA} huge breasts splattering milk everywhere and invoking a storm of kicks from ${hisA} many children.`);
				break;
			case "hypergoddess":
				r.push(`${HeA} struggles to hop up and down while clutching a virtual printout of the report. After a single hop, ${heA} is dragged to the ground by labor pains to give birth to a number of over excited babies.`);
				break;
			case "loli":
				r.push(`${HeA} hops up and down excitedly clutching a virtual printout of the report; ${heA} doesn't seem to be interested in stopping.`);
				break;
			case "preggololi":
				r.push(`${HeA} hops up and down excitedly clutching a virtual printout of the report; ${heA} only stops once ${hisA} child starts kicking in protest.`);
				break;
			case "angel":
				r.push(`${HeA} hops up and down clutching a virtual printout of the report, an unusual sight given that ${heA} can fly.`);
				break;
			case "cherub":
				r.push(`${HeA} flutters back and forth clutching a virtual printout of the report, occasional doing a loop or roll.`);
				break;
			case "incubus":
				r.push(`${HeA} hops up and down excitedly clutching a virtual printout of the report, ${hisA} erection slapping against ${hisA} chest until ${heA} is so overcome by excitement ${heA} unleashes it directly into ${hisA} own face.`);
				break;
			case "succubus":
				r.push(`${HeA} hops up and down excitedly clutching a virtual printout of the report; ${hisA} tantalizing body is particularly captivating today.`);
				break;
			case "imp":
				r.push(`${HeA} flaps back and forth clutching a virtual printout of the report, occasional doing a loop or roll.`);
				break;
			case "witch":
				r.push(`${HeA} hops up and down excitedly clutching a virtual printout of the report; until ${heA} trips on the hem of ${hisA} robes, falling onto ${hisA} butt and fully revealing ${hisA} naked pussy.`);
				break;
			case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
				r.push(`${HeA} is trying ${hisA} hardest to appear convincingly human, even losing focus on you.`);
				break;
			case "schoolgirl":
				r.push(`${HeA} hops up and down excitedly clutching a virtual printout of the report; ${hisA} breasts jiggling delightfully in ${hisA} blouse and ${hisA} skirt flipping up with each descent revealing ${hisA} panties.`);
		}
		r.push(`"Sorry, sorry. So could I...?"`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`You look over the details of the report. It would require another rather expansive, and expensive, upgrade to ${hisA} systems, as well as a body to host ${himA} and the receiver implant. It looks like ${heA} wouldn't lose any functionality, though you aren't sure what ${heA} would do with a body; it may be fun to find out.`);

		App.Events.addParagraph(node, r);

		const responses = [
			new App.Events.Result(`I'll look into it.`, yes),
			new App.Events.Result(`You're overstepping your station.`, no),
		];

		App.Events.addResponses(node, responses);

		return node;

		function yes() {
			const el = new DocumentFragment();
			const r = [];
			r.push(`"I can't wait! This is going to be so much fun!`);
			switch (V.assistant.fsAppearance) {
				case "paternalist":
					r.push(`I hope my new body is happy and healthy!"`);
					break;
				case "repopulation focus":
					r.push(`Can my new body be really fertile?"`);
					break;
				case "eugenics":
					r.push(`Can my new body be really beautiful?"`);
					break;
				case "gender radicalist":
					r.push(`Can my new body be a sexually confusing boy-girl?"`);
					break;
				case "gender fundamentalist":
					r.push(`Can my new body be feminine and cute?"`);
					break;
				case "degradationist":
					r.push(`Can my new body be perfectly clean? I want you to defile it!"`);
					break;
				case "body purist":
					r.push(`Can my new body be pure?"`);
					break;
				case "transformation fetishist":
					r.push(`Can my new body be flat and unimplanted? I want you to fill me with the biggest implants you can find!"`);
					break;
				case "youth preferentialist":
					r.push(`Can my new body be barely legal?"`);
					break;
				case "maturity preferentialist":
					r.push(`Can my new body be experienced and well-traveled?"`);
					break;
				case "slimness enthusiast":
					r.push(`Can my new body be thin like a super-model?"`);
					break;
				case "asset expansionist":
					r.push(`Can my new body have breasts bigger than my head and an ass that can swallow chairs?"`);
					break;
				case "pastoralist":
					r.push(`Can my new body make milk?"`);
					break;
				case "physical idealist":
					r.push(`Can my new body be scrawny? I want to feel the burn of building muscles!"`);
					break;
				case "hedonistic decadence":
					r.push(`Can my new body be thin? I want you to watch me gain weight!"`);
					break;
				case "petite admiration":
					r.push(`Can my new body be short?"`);
					break;
				case "statuesque glorification":
					r.push(`Can my new body be tall?`);
					break;
				case "chattel religionist":
					r.push(`Can my new body be a virgin? I want the arcology to turn me into a priestess!"`);
					break;
				case "roman revivalist":
					r.push(`Can my new body be Roman?"`);
					break;
				case "neoimperialist":
					r.push(`Can my new body be Imperial? I want to be part of your new Empire!"`);
					break;
				case "aztec revivalist":
					r.push(`Can my new body be Aztec?"`);
					break;
				case "egyptian revivalist":
					r.push(`Can my new body be Egyptian?"`);
					break;
				case "edo revivalist":
					r.push(`Can my new body be Japanese?"`);
					break;
				case "arabian revivalist":
					r.push(`Can my new body be Arabic?"`);
					break;
				case "chinese revivalist":
					r.push(`Can my new body be Chinese?"`);
					break;
				default:
					r.push(`Can my new body fulfill your deepest desires?"`);
			}
			r.push(`${HeA} says with enthusiasm.`);
			if (V.arcologies[0].FSSupremacist !== "unset") {
				r.push(`"Oh, could I also be ${V.arcologies[0].FSSupremacistRace}? I feel like I could do so much more for you with the right body."`);
			} else if (V.arcologies[0].FSSubjugationist !== "unset") {
				r.push(`"Oh, could I also not be ${V.arcologies[0].FSSubjugationistRace}? I feel like I could do so much more for you with the right body."`);
			}
			App.Events.addParagraph(el, r);
			return el;
		}

		function no() {
			return App.UI.DOM.makeElement("span", `${HeA} hangs ${hisA} head in disappointment. "Sorry, ${properTitle()}, I went too far, but if you ever reconsider, I've filed the information under my settings."`);
		}
	}
};