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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => V.REOrientationCheckinIDs.includes(s.ID),
				s => s.assignment !== Job.QUARTER,
				s => s.attrXY > 50,
				s => s.anus !== 0,
				s => s.vagina !== 0,
				s => (canDoAnal(s) || canDoVaginal(s)),
				s => s.devotion >= 10,
				canStand,
				canTalk,
				canHear,
				hasBothLegs,
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			// eslint-disable-next-line no-unused-vars
			He, he, His, his, hers, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const desc = SlaveTitle(eventSlave);

		V.nextLink = "Next Week";
		V.REOrientationCheckinIDs.deleteWith((s) => s === eventSlave.ID);

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

		let t = [];
		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`is the second slave on the inspection schedule for today. ${He} comes into your office naked, to find that the first inspection is going a little long. The slave before ${him} is obediently riding`);
		if (V.PC.dick === 0) {
			t.push(`one of your larger strap-ons.`);
		} else {
			t.push(`your cock.`);
		}
		t.push(`${He} waits patiently, but does not bother to hide ${his} arousal at the`);
		if (canSee(eventSlave)) {
			t.push(`lewd sight.`);
		} else {
			t.push(`sound of flesh slapping flesh.`);
		}
		t.push(`${He} obviously wants to be next;`);
		if (eventSlave.chastityPenis === 1) {
			t.push(`${his} chastity cage is dribbling precum, and ${he}'s clearly uncomfortable with simultaneous arousal and unwillingness to suffer a hard-on inside it,`);
		} else if (canAchieveErection(eventSlave)) {
			t.push(`${his} cock is painfully erect,`);
		} else if (eventSlave.dick > 6) {
			t.push(`precum is starting to bead at the tip of ${his} inhuman cock,`);
		} else if (eventSlave.dick > 0) {
			t.push(`${his} pathetically limp dick is practically dripping precum,`);
		} else if (eventSlave.clit > 0) {
			t.push(`${his} big clit is visibly erect,`);
		} else {
			t.push(`a sheen is visible on ${his} pussylips,`);
		}
		t.push(`${his} nipples are`);
		if (eventSlave.nipples !== "fuckable") {
			t.push(`stiff,`);
		} else {
			t.push(`swollen tight,`);
		}
		t.push(`and ${he}'s starting to breathe a little hard.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`When you finish and send the slave you were boning on their way with a light slap on the rump, you seat yourself to inspect ${eventSlave.slaveName}. As you do,`);
		if (V.PC.dick === 0) {
			t.push(`your rather realistically modeled phallus dangles`);
		} else {
			t.push(`your half-hard but still quite imposing cock hangs`);
		}
		t.push(`between your legs, still slick from fucking the previous inspectee.`);
		if (canSee(eventSlave)) {
			t.push(`${eventSlave.slaveName}'s`);
			t.push(App.Desc.eyesColor(eventSlave));
			t.push(`focus`);
		} else {
			t.push(`${eventSlave.slaveName} focuses`);
		}
		t.push(`on it with painful intensity,`);
		if (eventSlave.chastityPenis === 1) {
			t.push(`and the ${desc}'s chastity cage begins to bother ${him} even more.`);
		} else if (canAchieveErection(eventSlave)) {
			t.push(`and the ${desc}'s hard dick releases a string of precum.`);
		} else if (eventSlave.dick > 6) {
			t.push(`and the ${desc}'s oversized dick engorges as much as it possibly can.`);
		} else if (eventSlave.dick > 0) {
			t.push(`and the ${desc}'s soft dick twitches weakly.`);
		} else if (eventSlave.clit > 0) {
			t.push(`and the ${desc}'s clit gets, if possible, even more flushed and erect.`);
		} else {
			t.push(`the distinct smell of female arousal in the office intensifying.`);
		}
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`You remember the way ${he} was when ${he} became your slave with sudden clarity. ${He} was not a fan of the dick then, but ${he}'s certainly come around.`);
		if (V.PC.dick === 0) {
			t.push(`Even a realistic strap-on is enough to get ${him} all hot and bothered.`);
		}
		t.push(`On impulse, you ask ${him} if ${he} remembers how ${he} used to feel about cock. ${He} hesitates, wondering how to answer, but decides that honesty is the best policy and giggles,`);
		t.push(Spoken(eventSlave, `"Yes, ${Master}. I do. I mean, not all the time. It's easy to forget that I wasn't always such a cock-hungry slut."`));
		t.push(`${He} laughs, a rueful sound.`);
		if (eventSlave.energy > 95) {
			t.push(Spoken(eventSlave, `"I need it so bad now, I'll let anybody fuck me. I mean, I'd let anybody fuck me, if it wasn't already my job as a slave.`));
		} else if (eventSlave.fetish === "cumslut" && eventSlave.fetishStrength > 60) {
			t.push(Spoken(eventSlave, `"Cocks are so hot. Just thinking about them gets me all horny. How they're all throbbing and warm and then they cum..."`));
			t.push(`${He} trails off.`);
			t.push(Spoken(eventSlave, `"Sorry, got distracted.`));
		} else if (eventSlave.fetish === "buttslut" && eventSlave.fetishStrength > 60) {
			t.push(Spoken(eventSlave, `"I didn't know how much fun getting fucked in the butt was back then.`));
		} else if (eventSlave.fetish === "pregnancy" && eventSlave.fetishStrength > 60) {
			t.push(Spoken(eventSlave, `"I didn't know how good it felt to receive a load of fresh cum back then.`));
		} else {
			t.push(Spoken(eventSlave, `"Guys are just so hot — all big and strong and muscly.`));
		}
		if (V.PC.title === 1) {
			t.push(Spoken(eventSlave, `And being owned by such a handsome man has helped."`));
		} else {
			t.push(Spoken(eventSlave, `Not that I don't love ladies too."`));
		}
		t.push(`${He} arches ${his} back and bats ${his} eyes at you.`);
		t.push(Spoken(eventSlave, `"A lot."`));
		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result(`${He} wants dick. Give ${him} the dick`, dicking),
			new App.Events.Result(`Send ${him} down to a gym to share that attraction around`, gymService),
		]);

		function dicking() {
			const arms = hasBothArms(eventSlave) ? "arms" : "arm";

			t = [];
			t.push(`You`);
			if (V.PC.belly >= 10000) {
				t.push(`push yourself`);
			} else {
				t.push(`rise fluidly`);
			}
			t.push(`out of your chair,`);
			if (canSee(eventSlave)) {
				t.push(`pointing at the floor`);
				if (eventSlave.belly >= 100000 || eventSlave.boobs > 50000) {
					t.push(`at ${his} feet.`);
				} else {
					t.push(`in front of ${him}.`);
				}
			} else {
				t.push(`ordering ${him} to prepare ${himself}.`);
			}
			t.push(`${He} needs no further direction, and hurriedly gets down to place ${his} mouth at dick height. ${He}`);
			if (V.PC.dick === 0) {
				t.push(`gives your strap-on a blowjob`);
			} else {
				t.push(`sucks you off`);
				if (V.PC.vagina !== -1) {
					t.push(`and eats you out`);
				}
			}
			t.push(`with relish,`);
			if (V.PC.belly >= 10000) {
				t.push(`hair tickling the underside of your belly,`);
			} else {
				t.push(`looking adoringly up at you`);
			}
			t.push(`as ${he} rhythmically works ${his} lips up and down`);
			if (V.PC.dick === 0) {
				t.push(`the`);
			} else {
				t.push(`your`);
			}
			t.push(`thick shaft. After a bit of this, you pull`);
			if (V.PC.dick === 0) {
				t.push(`the phallus`);
			} else {
				t.push(`yourself`);
			}
			t.push(`free with a delicious popping noise, and haul the slave`);
			if (canWalk(eventSlave)) {
				t.push(`to ${his} feet`);
			} else {
				t.push(`upright`);
			}
			t.push(`with ${his} back to you. You grab ${his}`);
			if (hasAnyArms(eventSlave)) {
				t.push(`${arms}`);
			} else {
				t.push(`shoulders`);
			}
			t.push(`in a firm hold and`);
			// TODO fucking height
			if (V.PC.belly >= 1000) {
				t.push(`guide ${him} forward`);
				if (eventSlave.belly >= 300000) {
					t.push(`onto ${his} ${belly} belly`);
				}
			} else {
				t.push(`pull ${him} up on tiptoe`);
			}
			t.push(`(at which the horny ${girl} giggles with anticipation), and then thrust into the`);
			if (eventSlave.weight > 10) {
				t.push(`soft crevice between ${his} plush thighs.`);
			} else {
				t.push(`gap between ${his} thighs.`);
			}
			t.push(`This motion slides`);
			if (V.PC.dick === 0) {
				t.push(`the strap-on`);
			} else {
				t.push(`your hard dick`);
			}
			if (eventSlave.vagina > -1) {
				t.push(`against ${his} moist pussylips,`);
			} else if (eventSlave.scrotum > 0) {
				t.push(`against ${his} anus and then past ${his} ballsack,`);
			} else {
				t.push(`along ${his} sensitive perineum,`);
			}
			t.push(`eliciting a shocked gasp and then a prolonged whine of pleasure. ${He} humps ${himself} along`);
			if (V.PC.dick === 0) {
				t.push(`the phallus`);
			} else {
				t.push(`your shaft`);
				if (V.PC.vagina !== -1) {
					t.push(`and mons`);
				}
			}
			t.push(`shamelessly, craning around to rain kisses on your`);
			if (V.PC.belly >= 10000) {
				t.push(`baby bump.`);
			} else {
				t.push(`jawline and neck.`);
			}
			t.push(`When you gently push ${his} face away from you by`);
			if (V.PC.belly >= 10000) {
				t.push(`leaning into ${him},`);
			} else {
				t.push(`tipping ${his} torso forward,`);
			}
			t.push(`${he} moans a little from the loss of closeness, but soon forgets it when you press your`);
			if (V.PC.dick === 0) {
				t.push(`strap-on`);
			} else {
				t.push(`dick`);
			}
			if (canDoVaginal(eventSlave)) {
				t.push(`inside ${him}. ${He} begins to gasp your name, moan adoration, and beg nonsensically, and ${he} orgasms promptly. ${He} groans with`);
				if (canDoAnal(eventSlave)) {
					t.push(`overstimulation as you pull out, and then whines when you redouble it by immediately switching to ${his}`);
					if (eventSlave.anus > 2) {
						t.push(`loose`);
					} else if (eventSlave.anus > 1) {
						t.push(`practiced`);
					} else {
						t.push(`tight`);
					}
					t.push(`ass.`);
				} else {
					t.push(`overstimulation, but you're just getting started; you grab ${his} hips and hoist ${him} up to fuck ${his}`);
					if (eventSlave.vagina > 9) {
						t.push(`abyssal`);
					} else if (eventSlave.vagina > 3) {
						t.push(`gaping`);
					} else if (eventSlave.vagina > 2) {
						t.push(`loose`);
					} else if (eventSlave.vagina > 1) {
						t.push(`practiced`);
					} else {
						t.push(`tight`);
					}
					t.push(`pussy some more.`);
				}
			} else {
				t.push(`against ${his}`);
				if (eventSlave.anus > 2) {
					t.push(`loose`);
				} else if (eventSlave.anus > 1) {
					t.push(`practiced`);
				} else {
					t.push(`tight`);
				}
				t.push(`anus. As you push inside ${him}, ${he} begins to gasp your name, moan adoration, and beg nonsensically, and ${he} orgasms promptly. ${He} groans with overstimulation, but you're just getting started; you grab ${his} hips and hoist ${him} up to fuck ${his} ass some more.`);
			}
			t.push(`You climax there, your tour of ${his} holes completed; ${he} drops down to clean you off again before thanking you earnestly and taking ${his} leave, though not without a final turn in the doorway to`);
			if (canSee(eventSlave)) {
				t.push(`steal a final loving glance at`);
				if (V.PC.dick === 0) {
					t.push(`your strap-on.`);
				} else {
					t.push(`your junk.`);
				}
			} else {
				t.push(`fantasize a little about the next time ${he}'ll be intimate with`);
				if (V.PC.dick === 0) {
					t.push(`your strap-on.`);
				} else {
					t.push(`your junk.`);
				}
			}
			eventSlave.trust += 4;
			seX(eventSlave, "oral", V.PC, "penetrative");
			if (canDoVaginal(eventSlave)) {
				seX(eventSlave, "vaginal", V.PC, "penetrative");
				if (canDoAnal(eventSlave)) {
					seX(eventSlave, "anal", V.PC, "penetrative");
					if (canImpreg(eventSlave, V.PC)) {
						knockMeUp(eventSlave, 10, 2, -1);
					}
				} else {
					seX(eventSlave, "vaginal", V.PC, "penetrative");
					if (canImpreg(eventSlave, V.PC)) {
						knockMeUp(eventSlave, 10, 0, -1);
					}
				}
			} else if (canDoAnal(eventSlave)) {
				seX(eventSlave, "anal", V.PC, "penetrative", 2);
				if (canImpreg(eventSlave, V.PC)) {
					knockMeUp(eventSlave, 10, 1, -1);
				}
			}
			return t;
		}

		function gymService() {
			t = [];
			t.push(`You bring up a schematic of the arcology and`);
			if (canSee(eventSlave)) {
				t.push(`point out a`);
			} else {
				t.push(`detail the path to a nearby`);
			}
			t.push(`public gym to ${him}; you`);
			if (canHold(eventSlave)) {
				t.push(`hand ${him} a day pass,`);
			} else {
				t.push(`fasten a day pass around ${his} neck,`);
			}
			t.push(`tell ${him} to go down there, and let ${him} know ${he}'ll spend the rest of the day there. ${He} looks mystified, and when you do not elaborate further, ${he} asks,`);
			t.push(Spoken(eventSlave, `"What should I do there, ${Master}?"`));
			t.push(`Anything ${he} wants, you tell ${him}. ${He} still looks somewhat puzzled, but ${he}`);
			if (canWalk(eventSlave)) {
				t.push(`heads down`);
			} else {
				t.push(`accepts help down`);
			}
			t.push(`to the gym anyway. When ${he} gets there, ${he}`);
			if (canSee(eventSlave)) {
				t.push(`sees a steady stream of well-muscled male citizens entering the showers,`);
			} else {
				t.push(`hears the well-muscled male citizens working up a sweat before heading to the showers,`);
			}
			t.push(`and gets it. ${He} waves cheerfully to the nearest camera, and blows you a kiss before heading into the locker room. This is the Free Cities, and there isn't much reaction to a naked ${girl} entering a male-dominated gym. That is, until ${he} selects from among the sweaty gentlemen coming in from the weight room, sidles up to one, and says cheerfully,`);
			t.push(Spoken(eventSlave, `"Hi! Do you wanna fuck me?"`));
			t.push(`He does, and <span class="reputation inc">so do many of his friends.</span> So many, in fact, that having the showers right there becomes convenient for ${him} as the day goes on.`);
			repX(1250, "event", eventSlave);
			seX(eventSlave, "oral", "public", "penetrative", 5);
			if (canDoVaginal(eventSlave)) {
				seX(eventSlave, "vaginal", "public", "penetrative", 5);
				if (canDoAnal(eventSlave)) {
					seX(eventSlave, "anal", "public", "penetrative", 5);
					if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
						knockMeUp(eventSlave, 10, 2, -2);
					}
				} else {
					seX(eventSlave, "vaginal", "public", "penetrative", 5);
					if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
						knockMeUp(eventSlave, 10, 0, -2);
					}
				}
			} else {
				seX(eventSlave, "anal", "public", "penetrative", 10);
				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
					knockMeUp(eventSlave, 10, 1, -2);
				}
			}
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => V.REUglyCheckinIDs.includes(s.ID),
				s => s.face >= -10,
				s => (s.assignment === Job.PUBLIC || s.assignment === Job.WHORE),
				s => s.devotion >= 10,
				s => (Beauty(s) >= 50),
				s => s.bodySwap === 0,
				s => s.porn.prestige === 0,
				canSee,
				canStand,
				canTalk,
				canHear,
				hasAnyArms,
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			// eslint-disable-next-line no-unused-vars
			He, he, His, his, hers, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master, say: say} = getEnunciation(eventSlave);
		const freeMovement = (canWalk(eventSlave) || (canMove(eventSlave) && eventSlave.rules.mobility === "permissive"));

		V.nextLink = "Next Week";
		V.REUglyCheckinIDs.deleteWith((s) => s === eventSlave.ID);

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

		let t = [];
		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		if (freeMovement) {
			t.push(`comes`);
		} else {
			t.push(`is walked`);
		}
		t.push(`in for an inspection. You have a relaxed day scheduled, so you take the time to do an unusually thorough job. On a whim, you pull up ${his} complete file, flipping the virtual pages out across your desk. The induction pictures are particularly striking. ${He} doesn't look much like that, anymore, and that's a good thing. ${He} was not a pretty ${girl} when you got ${him}, though ${he}'s pretty enough now. With a desk control gesture you flip a full frontal shot of ${him} on the day of ${his} enslavement up onto a wallscreen.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`${His} ${App.Desc.eyesColor(eventSlave)} track your sudden motion, of course, and ${he} follows it to the screen. Suddenly, the ${SlaveTitle(eventSlave)} is eye to eye with a life-size picture of who ${he} used to be, just a few`);
		if (V.showInches === 2) {
			t.push(`feet`);
		} else {
			t.push(`meters`);
		}
		t.push(`away. ${He} gasps with recognition, and then ${his} face clouds inscrutably. ${He}`);
		if (freeMovement) {
			t.push(`takes a couple of hesitant steps`);
		} else {
			t.push(`hesitates for a moment before struggling`);
		}
		t.push(`forward, and then reaches out to touch the cheek of the ${girl} in the picture.`);
		if (hasBothArms(eventSlave)) {
			t.push(`As ${his} fingertips brush the smooth surface of the wallscreen, ${his} other hand ghosts along ${his} own face.`);
		} else {
			t.push(`${His} fingertips brush the smooth surface of the wallscreen, before ghosting along ${his} own face.`);
		}
		t.push(`${His} expression is not sad, so it's surprising when a single tear rolls down ${his} cheek. You order ${him} to tell you how the picture makes ${him} feel.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`${He} looks pensive, and goes through two false starts before ${he} clears ${his} throat, wrenches ${his} gaze away from ${his} picture, and ${say}s introspectively,`);
		t.push(Spoken(eventSlave, `"${Master}, it's strange. We — we don't have pictures of ourselves, from before we were enslaved. I didn't really realize how much I'd changed. Some days being a slave is hard. But seeing that picture, it makes me feel better about it. You — you're really ${V.PC.title === 1 ? "handsome" : "pretty"}, ${Master}. I bet you always were."`));
		t.push(`${He} inclines ${his} head towards the homely ${girl} on the screen.`);
		t.push(Spoken(eventSlave, `"It's hard to be ugly, ${Master}. Really hard. I feel sorry for that ${girl}, and I'm glad I don't look like ${him} anymore."`));
		t.push(`${He} laughs suddenly, a little self-consciously.`);
		t.push(Spoken(eventSlave, `"The crazy thing is if you'd told that ${girl} that`));
		if (eventSlave.assignment === Job.WHORE) {
			t.push(Spoken(eventSlave, `lots and lots of people would pay to fuck ${him}`));
		} else {
			t.push(Spoken(eventSlave, `all kinds of people would happily fuck ${him}`));
		}
		t.push(Spoken(eventSlave, `someday, ${he} wouldn't have believed you. It's kind of reassuring, actually. Is that weird? That came out weird. Sorry."`));
		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result(`${He}'s pretty enough to decorate your arm for a night out`, nightOut),
			new App.Events.Result(`Show ${him} off online`, livestreaming)
		]);

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

			let frag = document.createDocumentFragment();

			t = [];
			t.push(`You tell ${him} to head down to the wardrobe and put on the outfit that'll be laid out for ${him} there. ${He} obeys promptly, but does not return for some time, having gotten instructions from ${assistant.name} along the way to put extra effort into ${his} grooming. When ${he} finally returns, the effect is striking.`);
			if (eventSlave.face > 10) {
				t.push(`${He}'s a gorgeous ${girl} with or without makeup, dressed up or naked, but ${he}'s especially luscious tonight.`);
			} else {
				t.push(`${His} face is not flawless, but ${he}'s conscious of ${his} transformation, and the new confidence in ${his} beauty adds a special glow that cannot be faked.`);
			}
			t.push(`${His} evening dress is elegant; it's quite slutty by old world standards, but according to Free Cities fashion, it's just about the most conservative gown a slave can be expected to wear, and quite daring in that it isn't immediately obvious whether ${he}'s a slave or not.`);
			if (eventSlave.areolae < 3) {
				t.push(`The tops of ${his} areolae are hardly even visible.`);
			}
			App.Events.addParagraph(frag, t);

			t = [];
			t.push(`You take ${him} out to a nice lounge, with blue-toned light and soft music. ${He} clings to your arm, pressing ${himself} against you just the right amount: not enough to demand sex right now, but enough to raise the anticipation of it later. ${He}'s a slave, so ${he} does not eat or drink the usual fare on offer, but the establishment is used to slaves and offers flavorful variation on liquid slave food. ${He} drinks the translucent fluid out of a tall glass, carefully maintaining ${his} poise. You circulate, leaving ${him} at the bar when acquaintances appear. ${He} perches on a stool, conscious of and pleased by the discreet admiration of ${his} body, delectably outlined by the tight dress. Once a new arrival who did not see you with ${him} introduces himself to ${him}. He's tall and fit and silver-haired, but he picked ${him} out of the room to approach, and it's with polite disappointment that he reacts to ${his} indication of you, across the room:`);
			t.push(Spoken(eventSlave, `"I'm sorry, Sir, that's my ${Master} there."`));
			t.push(`He offers a nonverbal apology without coming over, which you accept with a wave: it's such a common mistake in Free Cities high society that it's universally brushed off without offense. It happens again later in the night, when a slightly tipsy free woman occupies the barstool next to ${eventSlave.slaveName}'s and keeps trying to relax against ${him} until the flattered slave explains ${himself} again. When you bring ${him} home at the end of the night, ${his}`);
			if (hasBothEyes(eventSlave)) {
				t.push(`eyes are`);
			} else {
				t.push(`eye is`);
			}
			t.push(`shining with <span class="trust inc">private assurance,</span> and ${he} presses ${himself} against you more closely than ever.`);
			App.Events.addParagraph(frag, t);

			eventSlave.trust += 4;

			return frag;
		}

		function livestreaming() {
			t = [];
			t.push(`You tell ${him} that ${he}'s become a very pretty sex slave, and to prove it, you`);
			if (eventSlave.porn.feed > 0) {
				t.push(`let ${him} believe you've`);
			}
			t.push(`set up a live feed for ${him} that's available for free in the old world.`);
			if (eventSlave.porn.feed === 0) {
				t.push(`The Free Cities produce an utter torrent of hardcore video, so much that there's never any profit to be made off it anymore, but viewers begin to join the channel anyway and by the end of the week`);
			} else {
				t.push(`${He} already has a growing fanbase, and with the promise of a week of special content, even more join the channel to observe. Before long,`);
			}
			t.push(`${he} has thousands of eyes watching ${him} as ${he}`);
			if (eventSlave.assignment === Job.WHORE) {
				t.push(`sells ${his} body`);
			} else {
				t.push(`has sex with random citizens`);
			}
			t.push(`in the hallways of ${V.arcologies[0].name}. ${capFirstChar(V.assistant.name)} keeps ${him} constantly informed of how many people are watching ${him} get fucked, how many of them are likely masturbating to ${his} body, and how many inquiries about ${him} ${V.assistant.name} is culling out of your inbox. ${He} slowly gets used to ${his} starring role in an impromptu free hardcore stream, but never quite stops stealing wondering glances at the nearest camera, as though ${he} cannot believe that so many people would sexualize ${him}. This lends ${him} a naughtiness that cannot be faked, garnering ${him} much attention by the end of the week.`);
			if (eventSlave.fetish === "humiliation" && eventSlave.fetishStrength > 60) {
				if (eventSlave.fetishKnown === 1) {
					t.push(`Of course, since ${he}'s a humiliation fetishist, this experience is like sexual candy for ${him}. ${He} <span class="devotion inc">can't get enough.</span>`);
				} else {
					t.push(`Oddly enough, <span class="devotion inc">${he} seems to enjoy it far more than anticipated.</span>`);
				}
				eventSlave.devotion += 4;
			}
			if (eventSlave.porn.feed === 0) {
				repX(1250, "event", eventSlave);
			} else {
				repX(500, "event", eventSlave);
				eventSlave.porn.viewerCount += 7000;
			}
			return t;
		}
	}
};

repo_name: Welptard/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canStand,
				hasAnyArms,
				canSee,
				s => s.trust > 20,
				s => s.devotion > 20,
				s => s.energy > 40,
				s => s.belly < 300000
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {s, say, title: Master} = getEnunciation(eventSlave);
		const desc = SlaveTitle(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const dickSize = eventSlave.dick > 4 ? "big" : (eventSlave.dick > 2 ? "" : "tiny");

		/** @type {App.Entity.PlayerState} */
		let PC = V.PC;

		V.nextLink = "Next Week";

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		t.push("There are sturdy leather seats placed strategically throughout your penthouse. They offer something convenient to bend your slaves over, wherever you happen to encounter them, and they're comfortable, too. At the moment, you're sitting on one, using a tablet to take care of some business that caught you away from your office, but isn't worth heading back to your desk for. Slaves move by your impromptu throne as you work, mostly");
		if (V.averageTrust > 50) {
			t.push("greeting you cheerfully");
		} else if (V.averageTrust > 20) {
			t.push("greeting you properly");
		} else if (V.averageTrust > -20) {
			t.push("doing their best to greet you properly");
		} else if (V.averageTrust > -50) {
			t.push("greeting you fearfully");
		} else {
			t.push("struggling to greet you through their terror");
		}
		t.push("as they pass. Busy, you spare few of them more than a glance.");
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`One of them slows as ${he} goes by, however. Looking up, you see that it's`);
		t.push(App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(eventSlave), "."));
		if (canTalk(eventSlave)) {
			if (eventSlave.belly >= 1500) {
				t.push(`"Hi ${Master}," ${he} ${say}s flirtatiously rubbing a hand across ${his} ${belly} ${eventSlave.bellyPreg > 0 ? "pregnancy" : "belly"}.`);
			} else {
				t.push(`"Hi ${Master}," ${he} ${say}s flirtatiously.`);
			}
			t.push(Spoken(eventSlave, `"That looks like a really comfortable seat. Can I sit down and rest ${eventSlave.belly >= 10000 ? "my tired legs" : ""} for a little while?"`));
		} else {
			t.push(`${He} greets you properly, but adds a flirtiness to ${his} gestures, and asks if ${he} can sit down and rest`);
			if (eventSlave.belly >= 10000) {
				t.push(`${his} ${eventSlave.bellyPreg > 0 ? "gravid" : belly} bulk`);
			}
			t.push("on the comfortable seat for a little while.");
		}
		t.push(`${He} is not pointing at the soft leather cushion next to you: ${he}'s pointing at your crotch.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`You're nude, a consequence of ${V.ConcubineID !== 0 && V.ConcubineID !== eventSlave.ID ? `recent activities involving ${S.Concubine.slaveName}` : "recent unrelated activities"}. ${PC.dick !== 0 ? "Your formidable dick is three quarters hard," : "Nude, that is, all except for the strap-on you were just using and haven't taken off yet,"} and ${eventSlave.slaveName} is pointing right at it. ${He} knows exactly what ${he}'s asking for and gives ${his}`);
		if (eventSlave.hips > 0) {
			t.push("broad");
		} else if (eventSlave.hips > -1) {
			t.push("trim");
		} else {
			t.push("narrow");
		}
		t.push("hips a little wiggle to make it even more abundantly clear.");
		if (eventSlave.chastityPenis === 1) {
			t.push(`${His} poor dick is visibly straining against the restrictive chastity belt ${he}'s wearing.`);
		} else if (canAchieveErection(eventSlave)) {
			t.push(`${His} ${dickSize} dick is jutting out stiffly and there's a bead of precum ${eventSlave.foreskin === 0 ? "forming at its smooth tip" : `escaping from ${his} foreskin`}.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${His} ${dickSize} dick is as soft as ever, but there's a string of precum running between ${eventSlave.foreskin === 0 ? "its smooth tip" : "the soft foreskin that completely covers its tip"} and ${his} inner thigh.`);
		} else if (eventSlave.clit > 0) {
			t.push(`${His} ${eventSlave.clit > 1 ? "formidable" : "big"} clit is visibly erect. ${eventSlave.clitPiercing > 1 ? `${His} sizable clit piercing never lets its hood completely cover hide ${his} bitch button, but it's completely retracted now,` : `${His} delicate clitoral hood has been pushed back by ${his} female erection,`} leaving ${him} proudly aroused.`);
		} else if (eventSlave.labia > 0) {
			t.push(`${His} ${eventSlave.labia > 1 ? "dangling" : "thick"} labia are visibly swollen, flushing and growing prouder as the blood rushes to ${his} womanhood.`);
		} else if (eventSlave.vagina === -1) {
			t.push(`Since ${he}'s featureless in front, ${he} makes a little half turn to the side, making it very clear that ${his} asspussy needs fucking.`);
		} else {
			t.push(`${He} has a shapely womanhood, with trim labia and a demure clit, but it's a little flushed.`);
		}
		t.push(`${eventSlave.vaginaLube > 0 ? `${His} wet cunt is already lubricating itself generously for you, slicking ${his} labia with female arousal.` : ""} The slutty ${desc} wants it badly.`);

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

		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} do what ${he} wants`, permit),
			new App.Events.Result(`Have ${him} service you while you work`, service),
			new App.Events.Result(`Drive ${him} off for breaking in on your work`, spank)
		]);

		function permit() {
			t = [];

			t.push(`You tell ${him} to sit down if ${he}'d like to. ${He} looks at you quizzically, ${eventSlave.intelligence + eventSlave.intelligenceImplant < -15 ? `${his} dim mind slowly` : ""} realizing that you're letting ${him} choose what to do. ${canTalk(eventSlave) ? `"Oh, thank you, ${Master}," ${he} ${say}s,` : `${He} gestures ${his} thanks,`} and then makes a show of deciding. ${He} ${eventSlave.intelligence + eventSlave.intelligenceImplant < -15 ? "doesn't have to pretend" : "cheekily pretends"} to be an airheaded bimbo puzzling over how ${he} wants to approach a fuck, bouncing`);
			if ((eventSlave.boobsImplant / eventSlave.boobs) >= 0.60) {
				t.push(`${his} fake tits a little,`);
			} else if (eventSlave.boobs > 4000) {
				t.push(`${his} monstrous udders heavily,`);
			} else if (eventSlave.boobs > 1000) {
				t.push(`${his} heavy breasts a little,`);
			} else if (eventSlave.boobs > 300) {
				t.push(`${his} boobs a little,`);
			} else {
				t.push(`on ${his} heels,`);
			}
			if (eventSlave.belly >= 5000) {
				t.push(`rocking ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					t.push("baby bump");
				} else if (eventSlave.bellyImplant >= 3000) {
					t.push("implant-filled belly");
				} else {
					t.push(`${eventSlave.inflationType}-filled belly`);
				}
				t.push("side to side seductively");
			} else {
				t.push(`wiggling ${his} rear side to side alluringly`);
			}
			t.push(`and putting a finger to ${his} slightly parted lips as ${he} stares down at your ${PC.dick !== 0 ? "stiff prick" : "strap-on"}.`);
			App.Events.addParagraph(node, t);
			t = [];

			if (eventSlave.fetishKnown === 1 && eventSlave.fetish !== "none") {
				t.push(`Finally making ${his} decision, ${he}`);
				switch (eventSlave.fetish) {
					case "submissive":
						t.push(`turns around and carefully perches ${himself} on ${PC.dick !== 0 ? "your cock" : "the phallus"},`);
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`letting ${his} weight slide it inside ${his} wet pussy.`);
							t.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`letting ${his} weight push it up ${his} asshole.`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`putting it between ${his} thighs.`);
						}
						t.push(`${He}'s not used to being on top, but ${he} uses ${himself} to service you as submissively as ${he} can. ${He} pays ${his} own pleasure no attention at all,`);
						break;
					case "cumslut":
						t.push(`squats down, coming face to face with ${PC.dick !== 0 ? "your cock" : "the phallus"}. ${canTalk(eventSlave) ? `"${Master}, I changed my mind about ${s}itting," ${he} ${say}s` : `${He} gestures that ${he} changed ${his} mind about sitting`}, and licks ${his} lips sluttily. Then ${he} gives ${PC.dick !== 0 ? "you" : "the phallus"} a lusty blowjob, humming and licking happily. ${He} ${PC.dick !== 0 ? "swallows your load hungrily" : "helps you out of the harness with your permission and eats you out too"},`);
						seX(eventSlave, "oral", PC, "penetrative");
						break;
					case "humiliation":
						t.push(`turns around and sits on ${PC.dick !== 0 ? "your cock" : "the phallus"}, leaning back against you and making sure all the other slaves who pass by can see`);
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`where it penetrates ${his} cunt.`);
							t.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`where it's lodged up ${his} butt.`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`where it's rubbing ${him} intimately between ${his} thighs.`);
						}
						t.push(`${He} gets off on their looks,`);
						break;
					case "buttslut":
						if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`turns around and shivers with pleasure as ${he} hilts ${his} anal sphincter around the base of ${PC.dick !== 0 ? "your cock" : "the phallus"}. ${He} bounces on it happily, reaming ${his} own ass,`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`turns around and shivers with pleasure as ${he} feels ${PC.dick !== 0 ? "your cock" : "the phallus"} slip between ${his} buttcheeks. ${He} rubs against it, happy to share ${his} butt with you,`);
						}
						break;
					case "boobs":
						t.push(`squats down, placing ${PC.dick !== 0 ? "your cock" : "the phallus"}`);
						if (eventSlave.boobs > 4000) {
							t.push(`in the virtual hole formed in the place between ${his} breasts, which are so massive they rest together.`);
						} else if (eventSlave.boobs > 1000) {
							t.push(`in the valley between ${his} tits.`);
						} else if (eventSlave.boobs > 300) {
							t.push(`between ${his} breasts.`);
						} else {
							t.push(`against one of ${his} nipples.`);
						}
						t.push(`${canTalk(eventSlave) ? `"${Master}, I changed my mind about ${s}itting," ${he} ${say}s` : `${He} gestures that ${he} changed ${his} mind about sitting`}, and starts giving you a boob job. ${He} enjoys the breast play,`);

						seX(eventSlave, "mammary", PC, "penetrative");
						break;
					case "pregnancy":
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`turns around and lovingly lowers ${his} pussy onto you.`);
							if (PC.dick !== 0) {
								if (eventSlave.pregKnown === 1) {
									t.push(`${He}'s already pregnant, so this isn't a direct satisfaction of ${his} impregnation fetish, but being fucked while pregnant is almost as good as far as ${he}'s concerned.`);
								} else if (canGetPregnant(eventSlave)) {
									t.push(`This might be the moment ${he} gets pregnant, and ${he}'s quivering with anticipations.`);
								} else {
									t.push(`${He} knows ${he} isn't fertile, but ${he}'s good at fantasizing.`);
								}
							} else {
								t.push(`Your strap-on might not be able to impregnate anyone, but ${he}'s good at fantasizing.`);
							}
							t.push(`${He} rides you hungrily,`);

							t.push(VCheck.Vaginal(eventSlave, 1));
							if (canImpreg(eventSlave, PC)) {
								knockMeUp(eventSlave, 40, 0, -1);
							}
						} else {
							t.push(`turns around and carefully perches ${himself} on ${PC.dick !== 0 ? "your cock" : "the phallus"}, putting it between ${his} thighs. ${He} rides you caringly,`);
						}
						break;
					case "dom":
						t.push(`turns around and sits right down on ${PC.dick !== 0 ? "your cock" : "the phallus"}, eagerly`);
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`taking it into ${his} cunt.`);
							t.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`getting it shoved up ${his} butt.`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`squeezing it between ${his} thighs.`);
						}
						t.push(`${He} loves being on top, even if ${he}'s the one who's getting fucked. ${He} rides you happily,`);
						break;
					case "sadist":
						t.push(`turns around and hesitantly sits on ${PC.dick !== 0 ? "your cock" : "the phallus"}, letting`);
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`it slide into ${his} cunt.`);
							t.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`it slide up ${his} butt.`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`it slide between ${his} thighs.`);
						}
						t.push(`${He} prefers to be rough, but settles for just directing how ${he} gets used. ${He} rides you cautiously,`);
						break;
					case "masochist":
						t.push(`turns around and carefully perches ${himself} on ${PC.dick !== 0 ? "your cock" : "the phallus"},`);
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`letting ${his} weight slide it inside ${his} wet pussy at an uncomfortable angle.`);
							t.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`letting ${his} weight push it up ${his} asshole at an uncomfortable angle.`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`putting it between ${his} thighs at an uncomfortable angle.`);
						}
						t.push(`${He} does ${his} best to please you while making sex as unpleasant as ${he} can for ${himself}. ${He} pays close attention to your comfort versus ${his} own,`);
						break;
				}
				t.push(`and after you've ${PC.dick !== 0 ? "cum" : "climaxed"}, ${he} <span class="mediumaquamarine">thanks you trustingly,</span> happy ${he}'s still allowed a sexy choice with you now and then.`);
			} else {
				t.push(`${eventSlave.fetishKnown === 1 ? `${He} can't really think of how to accommodate the situation to ${his} own preferred approach to sex` : `${He} isn't well versed in how ${his} own sexual needs might fit into the situation`}, so ${he} just services you like a good ${girl}. ${He} turns around and sits on ${PC.dick !== 0 ? "your cock" : "the phallus"},`);
				if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					t.push(`squatting to bounce ${his} cunt up and down on it.`);
					t.push(VCheck.Vaginal(eventSlave, 1));
				} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
					t.push(`squatting to bounce ${his} butthole up and down on it.`);
					t.push(VCheck.Anal(eventSlave, 1));
				} else {
					t.push(`putting it between ${his} thighs for some intercrural sex, since ${his} ${eventSlave.vagina > -1 ? "holes aren't" : "hole isn't"} appropriate.`);
				}
				t.push(`When ${he}'s gotten you off, ${he} thanks you trustingly. Even though ${he} wasn't able to figure out how to seat ${himself} in a really satisfactorily sexy way, ${he}'s glad you gave ${him} some agency.`);
			}
			App.Events.addParagraph(node, t);

			eventSlave.trust += 5;

			t = []; /* need to clear the array before returning in this case because otherwise weird things happen */
			return t;
		}

		function service() {
			t = [];

			t.push(`You order ${him} to sit on your ${PC.dick !== 0 ? "dick" : "strap-on"} and get you off like a good ${girl}, but not to disturb you while you're working. ${He}`);
			if (canTalk(eventSlave)) {
				t.push(`shuts up immediately,`);
			} else {
				t.push(`obediently drops ${his} ${hasBothArms(eventSlave) ? `hands to ${his} sides and stops communicating with them` : `hand to ${his} side and stops communicating with it`},`);
			}
			t.push(`and approaches you carefully. Meanwhile, you go back to your tablet, ignoring ${him} completely. ${He} gingerly straddles your legs, positioning ${his} intimate areas directly over the pointing head of`);
			if (eventSlave.belly >= 5000) {
				t.push(`${PC.dick !== 0 ? "your erection" : "the phallus"}, all while delicately trying to not bump into you with ${his} ${eventSlave.bellyPreg >= 3000 ? "pregnancy" : "belly"}.`);
			} else {
				t.push(`${PC.dick !== 0 ? "your erection" : "the phallus"}.`);
			}
			t.push(`Deciding that ${he} shouldn't use ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} to guide it, ${he} lowers ${himself} slowly,`);
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				t.push(`breathing a little harder as ${he} feels its head spread ${his} pussylips and then slide inside ${him}.`);
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
				t.push(`letting out a breath and relaxing as ${he} feels its head press past ${his} sphincter and then all the way up ${his} butt.`);
				t.push(VCheck.Anal(eventSlave, 1));
			} else {
				t.push(`getting it situated between ${his} thighs, since that's the best option ${he} has available.`);
			}
			t.push(`${eventSlave.belly >= 5000 ? `Before starting to pleasure you, ${he} notices there is no way ${he} can move with ${his} rounded middle sticking out as far as it does. ${He} carefully turns around, feeling your glare on ${his} back at ${his} mistake.` : ""} Still crouched over you, ${he} begins to move up and down, milking ${PC.dick !== 0 ? "your penis" : "the strap-on"}. As ${he} works into it, ${he} lets ${his} butt touch you, just once, but you make a nonverbal sound of disapproval, letting ${him} know not to disturb your work like that. Realizing that ${he} needs to play the human sex toy, ${he}`);
			if (eventSlave.butt > 12) {
				t.push(`grabs ${his} massive buttocks and finds that there is no way ${he} can keep the expanses of flesh from enveloping your lap.`);
			} else if (eventSlave.butt > 5) {
				t.push(`grabs ${his} huge buttocks and holds them apart, doing ${his} best to keep them out of the way.`);
			} else if (eventSlave.butt > 2) {
				t.push(`takes hold of ${his} healthy asscheeks and spreads them as far as they'll go, doing ${his} best to keep them out of the way.`);
			} else {
				t.push(`uses ${his} arms for balance, since ${his} cute butt can stay out of the way on its own and doesn't need to be spread by hand.`);
			}
			if (eventSlave.belly >= 10000) {
				t.push(`You spread your legs as you shift into a more comfortable position, stealthily showing mercy since ${he} can't possibly keep ${his} ${eventSlave.bellyPreg >= 3000 ? "full-term" : belly} belly off you otherwise.`);
			}
			t.push(`${He} bobs up and down, getting you off without ever touching you${PC.dick !== 0 ? `, other than the contact between your penis and the inside of ${his} body, of course` : ""}.`);
			if (eventSlave.energy > 80) {
				t.push(`${He} has such a powerful sex drive that even this sterile intercourse brings ${him} to orgasm.`);
			} else if (!App.Utils.hasNonassignmentSex(eventSlave)) {
				t.push(`${He} obeys the rules about orgasm and hasn't gotten off as part of ${his} assignment recently, so ${he} orgasms despite the sterility of the intercourse.`);
			} else {
				t.push(`${He} does not orgasm, serving you properly and showing appropriate disregard for ${his} own pleasure.`);
			}
			t.push(`When ${he}'s done, ${he} makes the perfect exit, <span class="hotpink">silently padding away like the passive sex object ${he} is.</span>`);

			eventSlave.devotion += 5;
			return t;
		}

		function spank() {
			t = [];

			t.push(`You command ${him} to turn around and show you ${his} ass. ${He} obeys eagerly, spinning and bringing you face to face with ${his}`);
			if (eventSlave.butt > 12) {
				t.push("view filling rear.");
			} else if (eventSlave.butt > 5) {
				t.push("monstrous bottom.");
			} else if (eventSlave.butt > 2) {
				t.push("womanly butt.");
			} else {
				t.push("cute little rear end.");
			}
			t.push(`${He}'s expecting something sexy, and ${he}'s wrong. You give ${his} right asscheek a stinging, open-handed slap. It's so unexpected that ${he} jumps with surprise, takes a step forward, and instantly bursts into tears. Knowing that ${he} has to accept whatever you think ${he} deserves, ${he} takes a step back towards you to come back within range. ${canTalk(eventSlave) ? `${Master}, I'm ${s}-${s}orry," ${he} sobs. "I d-don't under${s}tand. What did I d-do?"` : `${He} shakily gestures a question, begging to know what ${he} did.`} You tell ${him} not to disturb you when you're working, tanning ${his} ass viciously, first one buttock and then the other. ${He} stands there and takes ${his} beating, weeping, more from the bitter disappointment that ${he}'s not allowed to approach you like that.`);

			eventSlave.trust -= 5;
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => (canWalk(s) || (canMove(s) && s.rules.mobility === "permissive")),
				hasAnyArms,
				canTalk,
				s => s.devotion > 50,
				s => s.intelligence + s.intelligenceImplant > 50,
				s => s.intelligenceImplant >= 15,
				s => s.accent < 4
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself
		} = getPronouns(eventSlave);
		const {say, title: Master} = getEnunciation(eventSlave);
		const desc = SlaveTitle(eventSlave);

		/** @type {App.Entity.PlayerState} */
		let PC = V.PC;

		V.nextLink = "Next Week";

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

		let t = [];

		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`comes before you for a routine inspection. The ${desc} is a well-educated and obedient slave. Though ${he} performs ${his} duties devotedly and to the best of ${his} abilities, slave life is not particularly conducive to straining an individual's brainpower. You happen to run into ${eventSlave.slaveName} in the hallways of the penthouse, where ${he} takes the opportunity to wordlessly signal ${he} wishes to gain your attention.`);
		if (canTalk(eventSlave)) {
			t.push(`"${Master}," ${he} ${say}s. "${Spoken(eventSlave, `I really enjoy my role as your slave, but I just don't feel like my new life stimulates me.`)}" ${He} blushes prettily at ${his} choice of words before continuing, "${Spoken(eventSlave, `Stimulate my mind, I mean.`)}"`);
		} else {
			t.push(`${He} uses gestures to beg your pardon and explains that while ${he} enjoys life as your slave, ${he} doesn't feel like ${his} new role in your arcology allows ${him} to stimulate ${his} mind as often as it does ${his} body.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Have a conversation with ${him}`, conversation),
			canDoAnal(eventSlave) || canDoVaginal(eventSlave)
				? new App.Events.Result(`Stimulate ${his} mind and body`, stimulate, virginityCheck())
				: new App.Events.Result(),
			V.arcologies[0].FSDegradationist !== "unset"
				? new App.Events.Result(`A public blowbang will show ${him} what a Degradationist arcology thinks about 'educated' slaves`, blowbang)
				: new App.Events.Result(),
			V.arcologies[0].FSPaternalist !== "unset"
				? new App.Events.Result(`Allow ${him} to audit some advanced classes at Paternalist slave schools`, schooling)
				: new App.Events.Result()
		]);

		function conversation() {
			t = [];

			t.push(`You linger in the hallway a while with ${eventSlave.slaveName} and enjoy a brief but verbose discussion. It's clear ${he} hasn't had the chance to engage in any meaningful conversations in a while, so ${he} relishes the opportunity energetically.`);
			App.Events.addParagraph(node, t);
			t = [];

			t.push(`Though the two of you only touch upon a handful of sophisticated topics, by the time you leave ${him} to tend to other matters, ${eventSlave.slaveName} is beaming happily as ${he} continues on to ${his} duties for the day. ${He} trusts you more for taking the time to engage with ${him} intellectually.`);
			App.Events.addParagraph(node, t);
			t = [];

			eventSlave.trust += 4;
			return t;
		}

		function stimulate() {
			t = [];

			t.push(`You find a comfortable seat to sit on ${PC.dick === 0 ? "and don a strap-on" : ""} as ${he} seats ${his}`);
			if (eventSlave.butt < 2) {
				t.push(`narrow`);
			} else if (eventSlave.butt < 5) {
				t.push(`average`);
			} else if (eventSlave.butt < 8) {
				t.push(`plump`);
			} else if (eventSlave.butt < 12) {
				t.push(`impressive`);
			} else {
				t.push(`mind-blowing`);
			}
			t.push(`ass on your ${PC.dick === 0 ? "strap-on" : "dick"} and rides you. While your cock plumbs the depths of ${his} ${canDoVaginal(eventSlave) ? "pussy" : "butt"}, the two of you engage in a casual debate over a number of topics of sophistry.`);
			App.Events.addParagraph(node, t);
			t = [];

			t.push(`At the crux of one of ${his} concluding arguments, the intense pleasure from the prolonged ${canDoVaginal(eventSlave) ? "fucking" : "buttfucking"} pushes ${him} over the edge into orgasm, robbing the thrust of ${his} defense of any gravitas it once had. ${He} doesn't seem to mind however, choosing to instead wrap up ${his} remarks by blowing you a kiss.`);
			if (canDoVaginal(eventSlave)) {
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				t.push(VCheck.Anal(eventSlave, 1));
			}
			App.Events.addParagraph(node, t);
			t = [];

			eventSlave.devotion += 4;
			return t;
		}

		function blowbang() {
			t = [];

			t.push(`You tell ${him} ${he}'ll get fucked in the mouth until ${he} either gets over the idea of being special for ${his} education or until all ${his} learning is fucked out of ${his} head. You drag the protesting ${eventSlave.slaveName} out into a public plaza, restrain ${him} in stocks so that ${his} mouth is available, and inform the gathering crowd of citizens that this particular slave thinks ${himself} more than a fuckhole because of some fancy 'education'.`);
			App.Events.addParagraph(node, t);
			t = [];

			t.push(`When you return later in the evening, it becomes abundantly clear that your citizenry taught ${eventSlave.slaveName} a harsh lesson about a slave's place in ${V.arcologies[0].name}. ${eventSlave.slaveName} has certainly learned to keep any pretentious thoughts about ${his} education in ${his} head. ${He} did, however, have quite a rough time sucking all those dicks${eventSlave.skill.oral <= 30 ? `, though ${he} did learn about sucking dick, so ${he} can't claim enslavement isn't educational. ${slaveSkillIncrease('oral', eventSlave, 10)}` : "."} And last of all, you and ${eventSlave.slaveName} did make quite a good impression today, though for widely differing reasons.`);
			App.Events.addParagraph(node, t);
			t = [];

			seX(eventSlave, "oral", "public", "penetrative", jsRandom(65, 80));
			repX(500, "event", eventSlave);
			healthDamage(eventSlave, 10);
			return t;
		}

		function schooling() {
			t = [];

			t.push(`You tell ${him} to take the day off for a trip to audit classes at ${V.arcologies[0].name}'s most renowned Paternalist slave schools. ${eventSlave.slaveName} is shocked into a reverie by your words before running to wrap ${his} ${hasBothArms(eventSlave) ? "arms" : "arm"} around you in a tight hug. When ${he} eventually untangles ${himself} from you, ${he} races off to get ready for ${his} day of intellectualism while you direct ${V.assistant.name} to make the necessary arrangements.`);
			App.Events.addParagraph(node, t);
			t = [];

			t.push(`When ${eventSlave.slaveName} returns, ${he} looks exhausted but happier than you've ever seen ${him}. It seems ${he} benefited greatly from ${V.arcologies[0].name}'s Paternalist institutions, and has grown to trust you more while also deepening ${his} acceptance of slavery.`);
			App.Events.addParagraph(node, t);
			t = [];

			eventSlave.trust += 4;
			eventSlave.devotion += 4;
			return t;
		}

		function virginityCheck() {
			if (canDoVaginal(eventSlave) && eventSlave.vagina === 0) {
				return `This option will take ${his} virginity`;
			} else if (canDoAnal(eventSlave) && eventSlave.anus === 0) {
				return `This option will take ${his} anal virginity`;
			}
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canStand,
				s => s.waist < -95,
				s => s.weight <= 95,
				s => s.trust >= -20,
				s => s.devotion > 20,
				s => s.belly < 30000
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, himself, woman
		} = getPronouns(eventSlave);
		const belly = bellyAdjective(eventSlave);

		/** @type {App.Entity.PlayerState} */
		let PC = V.PC;

		V.nextLink = "Next Week";

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

		let t = [];

		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`is a real work of surgical art. As ${he} showers, carefully soaping and then moisturizing every ${V.showInches === 2 ? "inch" : "centimeter"} of ${his} ${eventSlave.skin} skin, you notice the undeniable eroticism created by the unnatural narrowness of`);
		if (eventSlave.belly >= 5000) {
			t.push(`${his} middle, especially given how much ${his} ${belly} ${eventSlave.bellyPreg >= 3000 ? "pregnancy" : "belly"} extends past ${his} sides.`);
		} else {
			t.push(`${his} middle.`);
		}
		t.push(`Though ${his} hands are by no means large, when ${he} washes ${his} sides, ${his} hands span almost the entire circumference of ${his} waist.`);
		if (eventSlave.dick > 0) {
			t.push(`Though ${he}'s not sexually aroused, ${his} cock is visible as ${he} bathes ${himself}; ${his} member and ${his} narrow waist work together to create a real mélange of gender traits.`);
		} else if (eventSlave.boobs > 800 && eventSlave.butt > 4) {
			t.push(`${His} massive bust and hips work together to create a spectacular hourglass effect; ${he}'s a fantasy ${woman} made flesh.`);
		} else {
			t.push(`The narrowness of ${his} waist accentuates ${his} feminine features.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Join ${him} and see if your hands can span ${his} waist`, grab, virginityWarning()),
			new App.Events.Result("Such a lovely work of art must be displayed", display, virginityWarning()),
		]);

		function grab() {
			t = [];

			t.push(`By the time you reach the shower, ${eventSlave.slaveName} is toweling ${himself}. ${He} notices your approach and folds the towel neatly before performing a little naked pirouette that shows off ${his} artificial`);
			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				t.push(`curviness while displaying each of ${his} delectable holes.`);
			} else if (canDoVaginal(eventSlave)) {
				t.push(`curviness while displaying ${his}`);
				if (eventSlave.vagina > 3) {
					t.push("gaping cunt.");
				} else if (eventSlave.vagina > 2) {
					t.push("loose cunt.");
				} else if (eventSlave.vagina > 1) {
					t.push("slutty pussy.");
				} else if (eventSlave.vagina > 0) {
					t.push("tight pussy.");
				} else {
					t.push("virgin pussy.");
				}
			} else if (canDoAnal(eventSlave)) {
				t.push(`curviness while displaying ${his}`);
				if (eventSlave.anus > 2) {
					t.push("gaping asshole.");
				} else if (eventSlave.anus > 1) {
					t.push("slutty asshole.");
				} else if (eventSlave.anus > 0) {
					t.push("tight asshole.");
				} else {
					t.push("virgin asshole.");
				}
			} else {
				t.push("curviness.");
			}
			if (eventSlave.belly >= 500 || eventSlave.weight > 30) {
				t.push(`You take ${him} about the middle and, with a little imagination, find that, indeed, you could make your thumbs and fingertips meet around it if you were to press.`);
			} else {
				t.push(`You take ${him} about the waist and find that, indeed, you can make your thumbs and fingertips meet around it if you press, which elicits a squeak.`);
			}
			if (!canDoVaginal(eventSlave) && !canDoAnal(eventSlave)) {
				t.push(`There are many ways you could apply this during sex, but since ${he} is fully locked in chastity, you can only explain, in detail, the ways you would fuck ${him} if you could. By the end ${he}'s blushing vibrantly, but more confident in ${his} sexual uniqueness.`);
			} else {
				t.push(`This can be applied during sex many ways. First, ${he} sits on the bathroom counter and bends ${himself} almost double for`);
				if (canDoAnal(eventSlave)) {
					t.push(`anal. Your control over the pace is perfected by your grip around ${his} tiny middle.`);
					t.push(VCheck.Anal(eventSlave, 1));
				} else {
					t.push(`vaginal. Your control over the pace is perfected by your grip around ${his} tiny middle.`);
					t.push(VCheck.Vaginal(eventSlave, 1));
				}
				t.push(`Finally, ${he} goes down on ${hasAllLimbs(eventSlave) ? "all fours" : "the floor"} for a hard`);
				if (canDoVaginal(eventSlave)) {
					t.push(`pounding, doggy style, losing ${himself} in the intense penetration as you use your hold around ${him} to give it to ${him} even harder.`);
					t.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					t.push(`buttfuck, doggy style, losing ${himself} in the intense anal as you use your hold around ${him} to give it to ${him} even harder.`);
					t.push(VCheck.Anal(eventSlave, 1));
				}
				t.push(`By the end ${he}'s tired but <span class="mediumaquamarine">confident in ${his} sexual uniqueness.</span>`);
			}

			eventSlave.trust += 4;
			return t;
		}

		function display() {
			t = [];

			t.push(`There is a polite soirée tonight at one of ${V.arcologies[0].name}'s more upscale eating establishments. Many couples are there to enjoy themselves and preen, but even so, you make a stir as you enter wearing`);
			if (PC.title === 1) {
				t.push(`the latest in men's eveningwear${PC.boobs >= 300 || PC.belly >= 1500 || PC.butt >= 3 || PC.balls >= 9 ? ", tastefully tailored to accommodate your unusual build" : ""}.`);
			} else {
				t.push(`the latest dress from one of your arcology's leading tailors${PC.boobs >= 300 || PC.belly >= 1500 || PC.butt >= 3 || PC.balls >= 9 ? ", carefully tailored to accentuate your splendid curves" : ""}.`);
			}
			t.push(`${eventSlave.slaveName} is a confection on your arm, displayed in a silk gown of strips and cuts that accentuates ${his} artificial figure while leaving ${his} breasts,`);
			if (eventSlave.dick > 0) {
				t.push(`${eventSlave.chastityPenis === 1 ? "caged" : ""} cock,`);
			} else if (eventSlave.vagina > -1) {
				t.push(`${eventSlave.chastityPenis === 1 ? "chaste" : ""} pussy,`);
			} else if (eventSlave.balls > 1 && eventSlave.scrotum > 0) {
				t.push("dangling balls,");
			} else {
				t.push("featureless groin,");
			}
			t.push(`and ${eventSlave.chastityAnus ? "off-limits rear" : "butt"} lusciously bare. Your appearance together with your living accessory increases your reputation. After a refined meal and some sedate dancing, the maître d' announces that the establishment has become (the Free Cities definition of) a salon for the evening. After the more prudish couples file out, those who remain engage in public sexual congress;`);
			if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
				t.push(`${eventSlave.slaveName}'s gown allows you to take ${him} in a ${eventSlave.belly >= 5000 ? "tight" : "close"} lotus position on the cleared table, face to face.`);
				if (canDoVaginal(eventSlave)) {
					t.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					t.push(VCheck.Anal(eventSlave, 1));
				}
			} else {
				t.push(`you and ${eventSlave.slaveName} enjoy the ${canSee(eventSlave) ? "sights" : "atmosphere"} while fooling around. While you'd love to use ${him}, ${his} chastity keeps you at bay.`);
			}
			t.push(`<span class="hotpink">${He} has become more devoted to you.</span>`);

			eventSlave.devotion += 4;
			repX(500, "event", eventSlave);
			return t;
		}

		function virginityWarning() {
			if (eventSlave.anus === 0 && canDoAnal(eventSlave)) {
				if (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) {
					return `This option will take ${his} anal and vaginal virginity`;
				} else {
					return `This option will take ${his} anal virginity`;
				}
			} else if (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) {
				return `This option will take ${his} vaginal virginity`;
			}
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canWalk,
				s => s.devotion < -50,
				s => s.trust >= -50,
				s => s.assignment !== Job.CONFINEMENT
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him
		} = getPronouns(eventSlave);

		V.nextLink = "Next Week";

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		t.push("An escape attempt occurs and is stopped almost before you are informed of it.");
		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`made a rash attempt to leave the penthouse, but ${V.assistant.name} monitors everyone constantly and was able to enclose ${him} before ${he} got very far.`);
		if (V.assistant.personality === 0) {
			t.push("It reports impersonally that the would-be escapee is locked in the entryway awaiting your judgment.");
		} else {
			t.push(`${He} reports suggestively that the would-be escapee is locked in the entryway awaiting your pleasure.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		if (V.arcologyUpgrade.drones === 1) {
			t.push(`Your advanced security systems are able to stop ${him} promptly, and there is no indication to the public that any escape attempt was made.`);
		} else {
			t.push(`Your basic security systems are only able to stop ${him} by briefly locking down your penthouse, exciting <span class="red">some adverse public comment.</span>`);
			repX(-100, "event", eventSlave);
		}
		App.Events.addParagraph(node, t);
		t = [];

		if (eventSlave.indentureRestrictions > 0) {
			t.push(`This behavior has violated ${his} indenture contract, allowing you to apply more severe punishments that might otherwise breach it.`);
			App.Events.addParagraph(node, t);
			t = [];
		}

		App.Events.addResponses(node, [
			new App.Events.Result("Do nothing", nothing),
			new App.Events.Result("Just confine the would-be escapee to prevent future attempts", confine),
			new App.Events.Result("Flog the would-be escapee", flog),
			...(V.seeExtreme === 1 ? [
				(hasAnyNaturalLegs(eventSlave) && eventSlave.heels === 0
					? new App.Events.Result("Clip the would-be escapee's tendons", clip)
					: new App.Events.Result()
				),
				(hasAnyNaturalLimbs(eventSlave)
					? new App.Events.Result("Amputate the would-be escapee's limbs", amputate)
					: new App.Events.Result()
				),
				(canSee(eventSlave)
					? new App.Events.Result("Blind the would-be escapee", blind)
					: new App.Events.Result()
				),
				(canTalk(eventSlave)
					? new App.Events.Result("Mute the would-be escapee", mute)
					: new App.Events.Result()
				)
			] : []
			)
		]);

		function nothing() {
			t = [];

			t.push(`Considering how easily this attempt was thwarted, you don't see much of a point in wasting your valuable time on punishing ${eventSlave.slaveName} in the hopes that ${he}'ll learn ${his} lesson. You send ${him} back to ${his} assigned duties, warning ${him} that you may not be so lenient in the future. ${eventSlave.slaveName} proclaims ${his} obedience, but, privately, it's clear that ${he} views your decision as an act of weakness rather than kindness. In addition, every single one of your other slaves not already obedient to you is encouraged in their trust that you won't hurt them by this minuscule punishment of an escape attempt.`);

			eventSlave.devotion -= 10;
			eventSlave.trust += 2;
			V.slaves.forEach(function(s) { if (s.devotion <= 20) { s.trust += 8; } });

			return t;
		}

		function confine() {
			t = [];

			t.push(`You order ${eventSlave.slaveName} confined until further notice. ${eventSlave.slaveName} is a little crushed by ${his} failure to escape. However, every single one of your other slaves not already obedient to you is slightly encouraged in their trust that you won't hurt them by this moderate punishment of an escape attempt.`);

			eventSlave.devotion += 4;
			assignJob(eventSlave, "stay confined");
			V.slaves.forEach(function(s) { if (s.devotion <= 20) { s.trust += 4; } });

			return t;
		}

		function flog() {
			t = [];

			t.push(`Lesser whippings are usually performed by binding a slave's hands and then securing them to the ceiling so that ${he} will dance titillatingly when struck. This is not such a beating. You tie ${eventSlave.slaveName} to a wall by ${his} wrists and ankles and flog ${him} with workmanlike thoroughness${eventSlave.pregKnown === 1 ? `, making sure to avoid accidentally ending ${his} pregnancy` : ""}. ${He} passes from angry struggles to agonized sobbing and finally to bloody, exhausted weeping before you untie ${his} now-limp form and apply first aid. ${eventSlave.slaveName}'s rebelliousness is dulled by the experience, and ${his} health is damaged. Furthermore, every single one of your other slaves not already obedient to you is frightened by the example set.`);

			eventSlave.trust -= 5;
			healthDamage(eventSlave, 40);
			V.slaves.forEach(function(s) { if (s.devotion <= 20) { s.trust -= 5; } });

			return t;
		}

		function clip() {
			t = [];

			t.push(`The simple thing to do would be to sedate ${eventSlave.slaveName} and haul ${him} to the remote surgery for ${his} punishment. That would deny ${him} the added weight of terror, however, and would stop your other slaves from learning by the sight of it. So, you restrain ${him}, pronounce judgment, and drag ${his} struggling, weeping form through the penthouse to the surgery. ${eventSlave.slaveName} is saddened and frightened by this punishment, and ${his} health is damaged by the surgery. Every single one of your other slaves with any resistance left in them is sensibly restrained from trying such rash acts.`);

			eventSlave.devotion -= 5;
			eventSlave.trust -= 5;
			eventSlave.heels = 1;
			surgeryDamage(eventSlave, 10);
			V.slaves.forEach(function(s) { if (s.devotion <= 20) { s.trust -= 5; } });

			return t;
		}

		function amputate() {
			t = [];

			t.push(`The simple thing to do would be to sedate ${eventSlave.slaveName} and haul ${him} to the remote surgery for ${his} punishment. That would deny ${him} the added weight of terror, however, and would stop your other slaves from learning by the sight of it. So, you restrain ${him}, pronounce judgment, and drag ${his} struggling, weeping form through the penthouse to the surgery. ${eventSlave.slaveName} is filled with implacable hatred by this terrible punishment, and ${his} health is damaged by the major surgery. However, every single one of your other slaves not already obedient to you is utterly terrified by the example set.`);

			eventSlave.devotion -= 50;
			eventSlave.trust -= 50;
			eventSlave.diet = "healthy";
			removeLimbs(eventSlave, "all");
			surgeryDamage(eventSlave, 40);
			V.slaves.forEach(function(s) { if (s.devotion <= 20) { s.trust -= 10; } });

			return t;
		}

		function blind() {
			t = [];

			t.push(`The simple thing to do would be to sedate ${eventSlave.slaveName} and haul ${him} to the remote surgery for ${his} punishment. That would deny ${him} the added weight of terror, however, and would stop your other slaves from learning by the sight of it. So, you restrain ${him}, pronounce judgment, and drag ${his} struggling, weeping form through the penthouse to the surgery. You make sure to point out all the things ${he}'ll never get to see again. ${eventSlave.slaveName} is filled with implacable hatred by this terrible punishment, and ${his} health is slightly damaged by the surgery. However, every single one of your other slaves not already obedient to you is utterly terrified by the example set.`);

			eventSlave.devotion -= 50;
			eventSlave.trust -= 50;
			eyeSurgery(eventSlave, "both", "blind");
			surgeryDamage(eventSlave, 20);
			V.slaves.forEach(function(s) { if (s.devotion <= 20) { s.trust -= 10; } });

			return t;
		}

		function mute() {
			t = [];

			t.push(`The simple thing to do would be to sedate ${eventSlave.slaveName} and haul ${him} to the remote surgery for ${his} punishment. That would deny ${him} the added weight of terror, however, and would stop your other slaves from learning by the sight of it. So, you restrain ${him}, pronounce judgment, and drag ${his} struggling, protesting form through the penthouse to the surgery. ${He} is allowed one last chance to verbally resist you, plead with you, and finally to beg with you, all in vain. ${eventSlave.slaveName} is filled with hatred and terror by this harsh punishment, and ${his} health is slightly damaged by the surgery. However, every single one of your other slaves not already obedient to you is terrified by the example set.`);

			eventSlave.devotion -= 5;
			eventSlave.trust -= 25;
			eventSlave.voice = 0;
			surgeryDamage(eventSlave, 10);
			V.slaves.forEach(function(s) { if (s.devotion <= 20) { s.trust -= 5; } });

			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.energy > 40,
				s => s.devotion > 0 && s.devotion <= 50,
				s => s.trust >= -50,
				canMove,
				canSee,
				hasAnyArms,
				s =>
					(s.attrXX >= 50 && V.PC.belly < 5000 && (V.PC.boobs >= 300 || V.PC.title === 0)) ||
					(s.attrXY >= 50 && V.PC.dick > 0 && V.PC.boobs < 300 && V.PC.belly < 1500) ||
					(s.fetish === "pregnancy" && V.PC.belly >= 5000) ||
					(s.fetish === "boobs" && V.PC.belly < 5000 && V.PC.boobs >= 1000),
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, himself
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);

		/** @type {App.Entity.PlayerState} */
		let PC = V.PC;

		V.nextLink = "Next Week";

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
			t.push(`You maintain a tremendous workout routine: the leader of a society that worships physical perfection can afford nothing less. Working out maintains your appearance, keeps you sharp, and makes you the exemplar of the physical ideal that you have to be for your vision for the future to be realized. So, you pay the iron price for your ${PC.title === 1 ? "muscles" : "toned body"}. Like most of the arcology's prominent citizens, you often lift publicly and take part in other amateur sports, but you also have your own private weight room in your penthouse, and you spend a lot of time there.`);
		} else if (PC.physicalAge >= 50) {
			t.push(`You take care of yourself. You're no longer as young as you once were, making it almost a requirement that you work out, hard and regularly. The fact is, the overwhelming majority of arcology owners who maintain their positions for more than a short time are physically fit. The Free Cities have a reputation for destroying old world wastrels who inherit wealth and think that makes them able to survive in an anarcho-capitalist world. Sloth and an inability to self-govern are not qualities common among your successful peers. Not to mention, it's useful to look good, and it may well prove essential to be physically capable in the near future.`);
		} else {
			t.push(`You take care of yourself. It would be absurd to think that there's any explicit requirement that you work out, hard and regularly, but the fact remains that the overwhelming majority of arcology owners who maintain their positions for more than a short time are physically fit. The Free Cities have a reputation for destroying old world wastrels who inherit wealth and think that makes them able to survive in an anarcho-capitalist world. Sloth and an inability to self-govern are not qualities common among your successful peers. Not to mention, it's useful to look good, and it may well prove essential to be physically capable in the near future.`);
		}

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

		t.push(`You complete the final rep of your first workout of the day, rack the bar, and jump to your feet to shower, change, and see to your empire. The motion brings your field of view up, and you notice for the first time that`);
		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`is frozen in the open doorway, having seen something in the workout room that caught ${his} attention as ${he} passed by. ${His} eyes are fixed on your`);
		if (PC.belly >= 120000) {
			t.push(`massive pregnancy with almost painful intensity. You can't really blame ${him}; you're the perfect image of a fertile goddess and your overfilled belly is coated in sweat. Even though you can't work your core any longer, you still take your workouts seriously, something most pregnant women would shy away from. You flush a little at what must ${he} must have thought; with all the grunting and effort, ${he} likely thought you were giving birth.`);
		} else if (PC.belly >= 100000) {
			t.push(`massive pregnancy with almost painful intensity. You can't really blame ${him}; you're eye-catchingly gravid and your full belly is coated in a thin sheen of sweat. Even though you can't work your core any longer, you still take your workouts seriously, something most pregnant women would shy away from.`);
		} else if (PC.belly >= 60000) {
			t.push(`giant pregnancy with almost painful intensity. You can't really blame ${him}; you're eye-catchingly massive and your heavy belly is coated in a thin sheen of sweat.`);
		} else if (PC.belly >= 15000) {
			t.push(`advanced pregnancy with almost painful intensity. You can't really blame ${him}; you're the perfect image of a mother-to-be and your heavy belly is coated in a thin sheen of sweat.`);
		} else if (PC.belly >= 10000) {
			t.push(`heavily pregnant middle and the last remnants of your abs with almost painful intensity. You can't really blame ${him}; you're the perfect image of a mother-to-be and your heavy belly is coated in a thin sheen of sweat.`);
		} else if (PC.belly >= 5000) {
			t.push(`greatly swollen middle and its stretched abdominal muscles with almost painful intensity. You can't really blame ${him}; despite how big you've gotten, you still have some abs left.`);
		} else if (PC.boobs >= 1400) {
			t.push(`sports bra clad boobs with almost painful intensity. You can't really blame ${him}; the bra is three sizes too small, forcing your enormous ${PC.boobsImplant > 0 ? "fake breasts to balloon around the strained material" : "breasts to lewdly bulge around the strained material"}, soaked in your sweat${PC.lactation > 0 ? " and breast milk" : ""}, and your nipples are clearly defined through the stretched thin fabric.`);
		} else if (PC.boobs >= 1200) {
			t.push(`sports bra clad boobs with almost painful intensity. You can't really blame ${him}; the bra is two sizes too small, allowing your huge ${PC.boobsImplant > 0 ? "fake" : ""} breasts to lewdly bulge out of them, soaked in your sweat${PC.lactation > 0 ? " and breast milk" : ""}, and your nipples are clearly visible as bumps in the strained material.`);
		} else if (PC.boobs >= 1000) {
			t.push(`sports bra clad boobs with almost painful intensity. You can't really blame ${him}; the bra is one size too small, allowing your big ${PC.boobsImplant > 0 ? "fake" : ""} breasts to bulge out of them, soaked in your sweat${PC.lactation > 0 ? " and breast milk" : ""}, and your nipples are clearly visible as bumps in the taut material.`);
		} else if (PC.boobs >= 300) {
			t.push(`sports bra clad boobs with almost painful intensity. You can't really blame ${him}; the bra is soaked in your sweat ${PC.lactation > 0 ? "and breast milk" : ""} and your nipples are clearly visible as bumps in the tight material.`);
		} else if (PC.belly >= 1500) {
			t.push(`swollen middle and its abdominal muscles with almost painful intensity. You can't really blame ${him}; despite your growing child${PC.pregType > 1 ? "ren" : ""}, they're still pretty cut.`);
		} else if (PC.belly >= 100) {
			if (PC.title === 0) {
				t.push(`slightly distended abdominal muscles and flat chest with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your sports bra's soaked in your sweat ${PC.lactation > 0 ? "and breast milk" : ""} and your nipples are clearly visible as bumps in the tight material.`);
			} else {
				t.push(`slightly distended abdominal muscles with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your bare chest is coated in a light sheen of glistening sweat.`);
			}
			if (PC.pregKnown === 1) {
				t.push(`You doubt ${he} realizes that the slight swell to your middle is a child.`);
			}
		} else {
			if (PC.title === 0) {
				t.push(`abdominal muscles and flat chest with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your sports bra's soaked in your sweat${PC.lactation > 0 ? "and breast milk" : ""} and your nipples are clearly visible as bumps in the tight material.`);
			} else {
				t.push(`abdominal muscles with almost painful intensity. You can't really blame ${him}; they're pretty cut, and your bare chest is coated in a light sheen of glistening sweat.`);
			}
		}

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

		t.push(`${His} ${App.Desc.eyesColor(eventSlave)} track up your torso comically until ${he}'s looking into your eyes. ${He} stares dumbly at you for a moment before realizing what ${he}'s doing and blushes with embarrassment. ${He}'s reasonably well broken, but is still coming to terms with ${his} sexual place as a ${SlaveTitle(eventSlave)}.`);
		t.push(`In particular, ${he} hasn't gotten used to the effects of ${his} training, the slave food, and the atmosphere in the penthouse, all of which are serving to fuel an acceleration of ${his} sex drive.`);
		if (!canTalk(eventSlave)) {
			t.push(`${He} uses shaky ${hasBothArms(eventSlave) ? "hands" : "gestures"} to ask you to fuck ${him},`);
		} else {
			t.push(Spoken(eventSlave, `"Sorry, ${Master}, I was just, um, passing by and I thought, um, I saw, um, sorry ${Master}, I'm going now,"`));
			t.push("he babbles,");
		}
		t.push("and turns to flee.");

		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result("Not so fast", caught),
			new App.Events.Result(`Let ${him} go`, released),
		]);

		function caught() {
			const belly = bellyAdjective(eventSlave);
			t = [];
			t.push(`As ${he} goes, ${he} follows the natural human impulse when embarrassed, and turns ${his} head resolutely away from you, trying very hard to forget making such a fool of ${himself}. This means that ${he} does not see your rapid, predatory pursuit of ${him}, nor does ${he} ${canHear(eventSlave) ? "hear" : "notice"} your careful stride across the flooring. ${His} first indication that ${he}'s prey is when your hands grab ${him} around ${his}`);
			if (eventSlave.bellyPreg >= 5000) {
				t.push(`pregnant belly`);
			} else if (eventSlave.belly >= 5000) {
				t.push(`${belly} belly`);
			} else if (eventSlave.weight > 130) {
				t.push("gut");
			} else if (eventSlave.weight > 95) {
				t.push("fat belly");
			} else if (eventSlave.muscles > 30) {
				t.push("own well-muscled middle");
			} else if (eventSlave.weight > 10) {
				t.push("plush belly");
			} else {
				t.push("middle");
			}
			t.push(`and hug ${him} hard against your`);
			if (PC.belly >= 100000) {
				t.push("massive sweaty pregnancy.");
			} else if (PC.belly >= 60000) {
				t.push("giant sweaty pregnancy.");
			} else if (PC.belly >= 15000) {
				t.push("huge sweaty pregnancy.");
			} else if (PC.belly >= 5000) {
				t.push("sweaty pregnancy.");
			} else if (PC.boobs >= 1400) {
				t.push("enormous sweaty boobs.");
			} else if (PC.boobs >= 1200) {
				t.push("huge sweaty boobs.");
			} else if (PC.boobs >= 1000) {
				t.push("big sweaty boobs.");
			} else if (PC.boobs >= 300) {
				t.push("sweaty boobs.");
			} else {
				t.push(PC.title === 0 ? "sweaty, flat chest." : "sweaty, bare chest.");
			}
			t.push(`${He} stiffens ${eventSlave.voice !== 0 ? "and shrieks" : ""} with surprise, but relaxes obediently within your embrace. Your warm, animal presence has an immediate effect. You hear ${him} suck in ${his} breath and then feel ${him} begin to breathe increasingly hard as your ${canSmell(eventSlave) ? "scent" : "body heat"} sinks into ${him} and ${his} embarrassment fades.`);

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

			App.Events.addResponses(node, [
				((canDoVaginal(eventSlave) || canDoAnal(eventSlave)))
					? new App.Events.Result(`Fuck ${him} right here`, fuck, virginityWarning())
					: new App.Events.Result(virginityWarning()),
				new App.Events.Result(`Have ${him} lick you clean`, lick),
			], "result2");

			function fuck() {
				t = [];

				if (PC.title === 0 || PC.boobs >= 300 || PC.belly >= 1500) {
					t.push("Despite your feminine appearance, you have capable hands.");
				} else {
					t.push("You have strong hands to go with your masculine appeal.");
				}
				t.push(`They rove across ${his} front, hugging ${him} hard against you as you massage and grope.`);
				if (eventSlave.boobs > 4000) {
					t.push(`${His} tits are so big that hefting them creates a bit of a burn in your biceps, in addition to making ${him} writhe against you.`);
				} else if (eventSlave.belly >= 10000) {
					t.push(`The skin that covers ${his} swollen belly is erotically taught, and you run your fingers across it possessively.`);
				} else if (eventSlave.nipples === "inverted") {
					t.push(`You wrap your hands around the bases of ${his} inverted nipples, and use your strong grip to stimulate and squeeze them until they protrude, much to the writhing slave's anguish.`);
				} else if (eventSlave.nipples === "fuckable") {
					t.push(`You slip your fingers into ${his} nipples and spread them wide, making the slave writhe and buck against you.`);
				} else {
					t.push(`You pinch ${his} nipples and tug them hard, making the slave writhe and buck against you.`);
				}
				if (PC.dick === 0) {
					if (hasBothArms(eventSlave)) {
						t.push(`You grab one of ${his} hands and guide it down to ${his}`);
					} else if (hasAnyArms(eventSlave)) {
						t.push(`You grab ${his} hand and guide it down to ${his}`);
					} else {
						t.push(`You `);
					}
					if (eventSlave.dick > 0 && !(eventSlave.chastityPenis)) {
						t.push("cock,");
					} else if (canDoVaginal(eventSlave)) {
						t.push("pussy,");
					} else if (eventSlave.scrotum > 0 && eventSlave.balls > 1) {
						t.push("testicles,");
					} else if (eventSlave.chastityPenis === 1) {
						t.push("caged dick,");
					} else if (eventSlave.chastityVagina) {
						t.push("chastity belt,");
					} else if (eventSlave.vagina === -1) {
						t.push("perineum,");
					}
					t.push(`making ${him} play with ${himself}. Meanwhile, you look after your womanhood with your other hand, schlicking expertly while holding ${him} close, ensuring that ${he} feels every motion of what you're doing. When your fingers are thoroughly coated with pussyjuice, you drop ${his} hand, letting ${him} continue masturbating on ${his} own, and then use the freed hand to replace the one you're using to touch yourself. Then, you take the wet fingers and push them into ${his} mouth; ${he} willingly sucks them clean, using ${his} tongue to gather every trace of your secretions. You gather sweat from between your breasts, and make ${him} suck that off ${his} fingers too. When ${he} orgasms, you shove ${him} against the wall and hump against ${him} and your hand both, climaxing yourself.`);
				} else {
					t.push(`You pull ${him} up ${hasAnyLegs(eventSlave) ? `onto ${his} toes` : "to face you"} and slide yourself inside ${him}, the slave gasping when ${he} feels your hot dick enter ${his}`);
					t.push(canDoVaginal(eventSlave) ? "cunt." : "anus.");
					if (PC.belly >= 5000 && eventSlave.belly >= 10000) {
						t.push(`You'd like to lift ${him} up into a standing fuck, but there is so much distended stomach between the both of you that it's impossible so you opt for a position where you can both penetrate ${him} and continue your work out.`);
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							t.push(`After a while, you shift positions, freeing your member, and force yourself up ${his} butt despite the slave's anxious begging.`);
							t.push(VCheck.Both(eventSlave, 1, 1));
							t.push(`It doesn't take long before you fill ${his} ass with cum.`);
						} else {
							t.push((canDoVaginal(eventSlave)) ? fuckVagina() : fuckAss());
						}
					} else if (PC.belly >= 5000) {
						t.push(`You'd like to lift ${him} up into a standing fuck, but you are far too pregnant to manage. Instead, you lie on your back and have ${him} work your legs as you fuck ${him}.`);
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							t.push(`After a while, you lift ${him} up as high as you can, freeing your member, and then lower ${him} back down again, forcing yourself up ${his} butt instead despite the slave's anxious begging.`);
							t.push(VCheck.Both(eventSlave, 1, 1));
							t.push(`It doesn't take long before you fill ${his} ass with cum.`);
						} else {
							t.push((canDoVaginal(eventSlave)) ? fuckVagina() : fuckAss());
						}
					} else if (eventSlave.belly >= 300000) {
						t.push(`You'd like to lift ${him} up into a standing fuck, but even you aren't strong enough to lift ${his} extreme weight. Instead, you choose to have ${him} ride you; supporting ${his} ${belly} middle is a workout in its own right.`);
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							t.push(`After a while, you push ${him} up as high as you can, freeing your member, and then lower ${him} back down again, forcing yourself up ${his} butt instead despite the slave's anxious begging.`);
							t.push(VCheck.Both(eventSlave, 1, 1));
							t.push(`It doesn't take long before you fill ${his} ass with cum.`);
						} else {
							t.push((canDoVaginal(eventSlave)) ? fuckVagina() : fuckAss());
						}
					} else if (eventSlave.belly >= 100000) {
						t.push(`Once you're hilted, you hoist ${him} up by the underarms, shifting your stance to handle ${his} ${belly} stomach's weight, and hold ${him} in midair, impaled on your dick. You can't pound ${him} all that hard in this challenging position, but the effort of holding ${him} this way forces you to work out hard, producing an excellent sensation. ${PC.vagina !== -1 ? `The position angles your dick upward, producing a lovely massaging sensation in your pussy as you slide in and out of ${him}.` : ""}`);
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							t.push(`After a while, you lift ${him} up as high as you can, freeing your member, and then lower ${him} back down again, forcing yourself up ${his} butt instead despite the slave's anxious begging.`);
							VCheck.Both(eventSlave, 1, 1);
							t.push(`It doesn't take long before you fill ${his} ass with cum.`);
						} else {
							t.push((canDoVaginal(eventSlave)) ? fuckVagina() : fuckAss());
						}
						t.push("You're going to be feeling this tomorrow.");
					} else {
						t.push(`Once you're hilted, you bring ${his} hands up on either side of ${his} head to grasp your shoulders behind ${him}, and then scoop ${his} legs up and hoist ${him} to rest against your chest, held in midair and impaled on your dick. You can't pound ${him} all that hard in this challenging position, but the effort of holding ${himself} this way forces ${him} to tighten ${his} muscles down hard, producing an excellent sensation. ${PC.vagina !== -1 ? `The position angles your dick upward, producing a lovely massaging sensation in your pussy as you slide in and out of ${him}` : ""}.`);
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							t.push(`After a while, you lift ${him} up as high as you can, freeing your member, and then lower ${him} back down again, forcing yourself up ${his} butt instead despite the slave's anxious begging.`);
							t.push(VCheck.Both(eventSlave, 1, 1));
							t.push(`It doesn't take long before you fill ${his} ass with cum.`);
						} else {
							t.push((canDoVaginal(eventSlave)) ? fuckVagina() : fuckAss());
						}
					}
				}

				function fuckVagina() {
					return `${VCheck.Vaginal(eventSlave, 1)} It doesn't take long before you fill ${his} pussy with cum.`;
				}

				function fuckAss() {
					return `${VCheck.Anal(eventSlave, 1)} It doesn't take long before you fill ${his} ass with cum.`;
				}

				t.push(`You tell your quivering sex toy that ${he} doesn't have to be embarrassed about ${his} needs. ${He} seems relieved that the sexual being ${he}'s becoming is acceptable, at least to you.`);
				eventSlave.trust += 4;
				return t;
			}

			function lick() {
				t = [];

				t.push(`You take ${him} by the hand and ${PC.belly >= 10000 ? "waddle" : "walk"} towards the shower. The sudden loss of your closeness jerks ${him} rudely out of ${his} sexual reverie, but ${he} follows willingly, perhaps distracted by the view as you shed your workout clothes on the way. When you get there, you pull ${him} in with you, but you do not turn on the water. Instead, you tell ${him} to wash you. Not understanding, ${he} turns to switch on the shower, but you catch ${him}, and insert two sweaty fingers into the slave's compliant mouth. ${He} sucks on them, taking refuge in the simple task, and then understands what you mean. ${He} runs ${his} tongue up your arm, sucking the salty sweat off you as best ${he} can. Soon, ${he} bends down and heads for your`);
				if (PC.dick !== 0 && PC.vagina !== -1) {
					t.push("cock and cunt");
				} else if (PC.dick !== 0) {
					t.push("cock");
				} else if (PC.vagina !== -1) {
					t.push("cunt");
				}
				t.push(`but you pull ${him} up again and tell ${him} to do that last.`);
				if (PC.belly >= 60000) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up your linea nigra. When ${he} reaches your ${PC.preg >= 22 ? "popped" : "flattened"} navel, you hold ${his} head there for a while, savoring the erotic sensation before pushing ${him} along to the rest of your expansive midriff.`);
				} else if (PC.belly >= 5000) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up your linea nigra. When ${he} reaches your ${PC.preg >= 22 ? "popped" : "flattened"} navel, you hold ${his} head there for a while, savoring the erotic sensation.`);
				} else if (PC.boobs >= 1400) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up the sweaty crevice between your enormous breasts. When ${he} reaches your nipples, you hold ${his} head there for a while, enjoying ${his} tongue.`);
				} else if (PC.boobs >= 1200) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up the sweaty crevice between your huge breasts. When ${he} reaches your nipples, you hold ${his} head there for a while, enjoying ${his} tongue.`);
				} else if (PC.boobs >= 1000) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up the sweaty crevice between your big breasts. When ${he} reaches your nipples, you hold ${his} head there for a while, enjoying ${his} tongue.`);
				} else if (PC.boobs >= 300) {
					t.push(`${He} quickly finds something almost as good by licking and sucking ${his} way up the sweaty crevice between your breasts. When ${he} reaches your nipples, you hold ${his} head there for a while, enjoying ${his} tongue.`);
				} else {
					t.push(`${He} settles for kissing and licking ${his} way up your abs, pecs, and`);
					if (PC.title === 0) {
						t.push(`non-existent tits. When ${he} reaches your nipples, you hold ${his} head there for a while, enjoying ${his} tongue.`);
					} else {
						t.push(`collarbone, before shyly sucking the line of sweat that runs down each of your temples when you perspire heavily off of you.`);
					}
				}
				t.push(`When you've enjoyed the tongue bath enough, you reach over and activate the shower, the warm water producing a hum from the slave. You coach ${him} towards your`);
				if (PC.dick === 0) {
					t.push(`cunt, and ${he} eats you out with enthusiasm`);
				} else {
					t.push(`stiff prick, and ${he} gives you an enthusiastic blowjob ${PC.vagina !== -1 ? `before turning ${his} oral attentions to your pussy` : ""}`);
				}
				t.push(`as the water plays over you both. After looking up and letting the water cascade down your face for a long moment, you quietly tell ${him} to masturbate before opening your mouth to drink from the downpour. With your eyes closed against the stream, your only indications that ${he}'s obeying the command is a slight increase in the force with which ${he} sucks, and a faint`);
				if (canDoVaginal(eventSlave)) {
					t.push("schlicking");
				} else if (eventSlave.dick > 0 && canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					t.push("wanking");
				} else {
					t.push("rubbing");
				}
				t.push(`noise as ${he} jerks off. ${He} must find you quite attractive, since giving you oral in the shower while playing with ${himself} brings ${him} to orgasm with almost indecent speed.`);
				eventSlave.devotion += 4;
				seX(eventSlave, "oral", PC, "penetrative");
				return t;
			}
			return t;
		}

		function released() {
			t = [];
			t.push(`You let ${him} go, and ${he} hurries off to go on with ${his} day. But ${his} attraction to you does not go away, and neither does the embarrassment of having made a fool of ${himself} in front of you. The experience leaves ${him} a bit worried about how life as your slave is affecting ${him}, but increasingly infatuated with you. Before long, love will conquer doubt.`);
			eventSlave.devotion += 4;
			eventSlave.trust -= 2;
			return t;
		}

		function virginityWarning() {
			if (V.PC.dick > 0) {
				if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
					return `This option will take ${his} virginity`;
				} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave) && (eventSlave.anus === 0)) {
					return `This option will take ${his} anal virginity`;
				}
			}
			return null;
		}
	}
};